]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - utils/mountd/cache.c
remove extraneous mountlist_add/del calls and change remaining ones to use IP addresses
[nfs-utils.git] / utils / mountd / cache.c
index 77029f446bff8fd33957613bbe116869148583a4..726b98fc9b2a35681e7a4c07d2c2412b068ca33b 100644 (file)
@@ -6,7 +6,10 @@
  * and listen for requests (using my_svc_run)
  * 
  */
-#include "config.h"
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
 
 #include <sys/types.h>
 #include <sys/select.h>
@@ -80,9 +83,6 @@ 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);
        
 }
@@ -119,7 +119,7 @@ void nfsd_fh(FILE *f)
                goto out;
        if (qword_get_int(&cp, &fsidtype) != 0)
                goto out;
-       if (fsidtype < 0 || fsidtype > 1)
+       if (fsidtype < 0 || fsidtype > 3)
                goto out; /* unknown type */
        if ((fsidlen = qword_get(&cp, fsid, 32)) <= 0)
                goto out;
@@ -138,6 +138,30 @@ void nfsd_fh(FILE *f)
                        goto out;
                memcpy(&fsidnum, fsid, 4);
                break;
+
+       case 2: /* 12 bytes: 4 major, 4 minor, 4 inode 
+                * This format is never actually used but was
+                * an historical accident
+                */
+               if (fsidlen != 12)
+                       goto out;
+               memcpy(&dev, fsid, 4); major = ntohl(dev);
+               memcpy(&dev, fsid+4, 4); minor = ntohl(dev);
+               memcpy(&inode, fsid+8, 4);
+               break;
+
+       case 3: /* 8 bytes: 4 byte packed device number, 4 inode */
+               /* This is *host* endian, not net-byte-order, because
+                * no-one outside this host has any business interpreting it
+                */
+               if (fsidlen != 8)
+                       goto out;
+               memcpy(&dev, fsid, 4);
+               memcpy(&inode, fsid+4, 4);
+               major = (dev & 0xfff00) >> 8;
+               minor = (dev & 0xff) | ((dev >> 12) & 0xfff00);
+               break;
+
        }
 
        auth_reload();
@@ -145,21 +169,22 @@ void nfsd_fh(FILE *f)
        /* 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 (fsidtype != 1) {
                                if (stb.st_ino != inode)
                                        continue;
                                if (major != major(stb.st_dev) ||
@@ -267,7 +292,6 @@ 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:
@@ -345,8 +369,6 @@ 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)
@@ -365,9 +387,6 @@ 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);
 }
 
@@ -401,7 +420,7 @@ cache_get_filehandle(nfs_export *exp, int len, char *p)
        if (failed)
                return NULL;
        memset(fh.fh_handle, 0, sizeof(fh.fh_handle));
-       fh.fh_size = qword_get(&bp, fh.fh_handle, NFS3_FHSIZE);
+       fh.fh_size = qword_get(&bp, (char *)fh.fh_handle, NFS3_FHSIZE);
        return &fh;
 }