]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - utils/mountd/cache.c
2005-08-26 Kevin Coffman <kwc@citi.umich.edu>
[nfs-utils.git] / utils / mountd / cache.c
index 2e35b17417173914899234d4cfe28f6ff9aa42a4..e8bb99106e2872ef23ded11a05f6ff41e3e0a1e7 100644 (file)
@@ -67,6 +67,8 @@ void auth_unix_ip(FILE *f)
        if (inet_aton(ipaddr, &addr)==0)
                return;
 
+       auth_reload();
+
        /* addr is a valid, interesting address, find the domain name... */
        client = client_compose(addr);
 
@@ -138,24 +140,27 @@ void nfsd_fh(FILE *f)
                break;
        }
 
+       auth_reload();
+
        /* Now determine export point for this fsid/domain */
        for (i=0 ; i < MCL_MAXTYPES; i++) {
                for (exp = exportlist[i]; exp; exp = exp->m_next) {
+                       struct stat stb;
+
                        if (!client_member(dom, exp->m_client->m_hostname))
                                continue;
+                       if (exp->m_export.e_mountpoint &&
+                           !is_mountpoint(exp->m_export.e_mountpoint[0]?
+                                          exp->m_export.e_mountpoint:
+                                          exp->m_export.e_path))
+                               dev_missing ++;
+                       if (stat(exp->m_export.e_path, &stb) != 0)
+                               continue;
                        if (fsidtype == 1 &&
                            ((exp->m_export.e_flags & NFSEXP_FSID) == 0 ||
                             exp->m_export.e_fsid != fsidnum))
                                continue;
                        if (fsidtype == 0) {
-                               struct stat stb;
-                               if (exp->m_export.e_mountpoint &&
-                                   !is_mountpoint(exp->m_export.e_mountpoint[0]?
-                                                  exp->m_export.e_mountpoint:
-                                                  exp->m_export.e_path))
-                                       dev_missing ++;
-                               if (stat(exp->m_export.e_path, &stb) != 0)
-                                       continue;
                                if (stb.st_ino != inode)
                                        continue;
                                if (major != major(stb.st_dev) ||
@@ -236,6 +241,8 @@ void nfsd_export(FILE *f)
        if (qword_get(&cp, path, strlen(lbuf)) <= 0)
                goto out;
 
+       auth_reload();
+
        /* now find flags for this export point in this domain */
        for (i=0 ; i < MCL_MAXTYPES; i++) {
                for (exp = exportlist[i]; exp; exp = exp->m_next) {
@@ -309,6 +316,7 @@ int cache_process_req(fd_set *readfds)
                    FD_ISSET(fileno(cachelist[i].f), readfds)) {
                        cnt++;
                        cachelist[i].cache_handle(cachelist[i].f);
+                       FD_CLR(fileno(cachelist[i].f), readfds);
                }
        }
        return cnt;
@@ -368,15 +376,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;
 
@@ -385,7 +397,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);