]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - utils/mountd/cache.c
close a filehandle before opening.
[nfs-utils.git] / utils / mountd / cache.c
index 9d7d20d99e9c1a4cc651d7256fcde109f759210a..a265ecda9f6412fefa457b79a915f32cfa0506c9 100644 (file)
@@ -78,6 +78,9 @@ void auth_unix_ip(FILE *f)
                qword_print(f, *client?client:"DEFAULT");
        qword_eol(f);
 
+       if (client && strcmp(ipaddr, client))
+               mountlist_add(ipaddr, *client?client:"DEFAULT");
+
        if (client) free(client);
        
 }
@@ -189,7 +192,8 @@ void nfsd_fh(FILE *f)
                goto out;
        }
 
-       cache_export_ent(dom, found);
+       if (found)
+               cache_export_ent(dom, found);
 
        qword_print(f, dom);
        qword_printint(f, fsidtype);
@@ -257,6 +261,7 @@ void nfsd_export(FILE *f)
                qword_printint(f, found->m_export.e_anonuid);
                qword_printint(f, found->m_export.e_anongid);
                qword_printint(f, found->m_export.e_fsid);
+               mountlist_add(dom, path);
        }
        qword_eol(f);
  out:
@@ -319,7 +324,7 @@ int cache_process_req(fd_set *readfds)
 void cache_export_ent(char *domain, struct exportent *exp)
 {
 
-       FILE *f = fopen("/proc/net/rpc/nfsd.export/channel", "r+");
+       FILE *f = fopen("/proc/net/rpc/nfsd.export/channel", "w");
        if (!f)
                return;
 
@@ -333,13 +338,15 @@ void cache_export_ent(char *domain, struct exportent *exp)
        qword_eol(f);
 
        fclose(f);
+
+       mountlist_add(domain, exp->e_path);
 }
 
 void cache_export(nfs_export *exp)
 {
        FILE *f;
 
-       f = fopen("/proc/net/rpc/auth.unix.ip/channel", "r+");
+       f = fopen("/proc/net/rpc/auth.unix.ip/channel", "w");
        if (!f)
                return;
 
@@ -351,6 +358,9 @@ void cache_export(nfs_export *exp)
        
        fclose(f);
 
+       if (strcmp(inet_ntoa(exp->m_client->m_addrlist[0]), exp->m_client->m_hostname))
+               mountlist_add(inet_ntoa(exp->m_client->m_addrlist[0]), exp->m_client->m_hostname);
+
        cache_export_ent(exp->m_client->m_hostname, &exp->m_export);
 }
 
@@ -358,15 +368,19 @@ void cache_export(nfs_export *exp)
  * { 
  *   echo $domain $path $length 
  *   read filehandle <&0
- * } <> /proc/fs/nfs/filehandle
+ * } <> /proc/fs/nfsd/filehandle
  */
 struct nfs_fh_len *
 cache_get_filehandle(nfs_export *exp, int len, char *p)
 {
-       FILE *f = fopen("/proc/fs/nfs/filehandle", "r+");
+       FILE *f = fopen("/proc/fs/nfsd/filehandle", "r+");
        char buf[200];
        char *bp = buf;
+       int failed;
        static struct nfs_fh_len fh;
+
+       if (!f)
+               f = fopen("/proc/fs/nfs/filehandle", "r+");
        if (!f)
                return NULL;
 
@@ -375,7 +389,9 @@ cache_get_filehandle(nfs_export *exp, int len, char *p)
        qword_printint(f, len); 
        qword_eol(f);
        
-       if (fgets(buf, sizeof(buf), f) == NULL)
+       failed = (fgets(buf, sizeof(buf), f) == NULL);
+       fclose(f);
+       if (failed)
                return NULL;
        memset(fh.fh_handle, 0, sizeof(fh.fh_handle));
        fh.fh_size = qword_get(&bp, fh.fh_handle, NFS3_FHSIZE);