X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=utils%2Fmountd%2Fcache.c;h=726b98fc9b2a35681e7a4c07d2c2412b068ca33b;hp=e8bb99106e2872ef23ded11a05f6ff41e3e0a1e7;hb=9e1aa7b9a04776bd43eb75bef50a53f41e17b813;hpb=53c5bd65c74e032947d8fb5b140024be008aaa6b diff --git a/utils/mountd/cache.c b/utils/mountd/cache.c index e8bb991..726b98f 100644 --- a/utils/mountd/cache.c +++ b/utils/mountd/cache.c @@ -6,7 +6,10 @@ * and listen for requests (using my_svc_run) * */ -#include "config.h" + +#ifdef HAVE_CONFIG_H +#include +#endif #include #include @@ -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(); @@ -160,7 +184,7 @@ void nfsd_fh(FILE *f) ((exp->m_export.e_flags & NFSEXP_FSID) == 0 || exp->m_export.e_fsid != fsidnum)) continue; - if (fsidtype == 0) { + if (fsidtype != 1) { if (stb.st_ino != inode) continue; if (major != major(stb.st_dev) || @@ -268,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: @@ -346,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) @@ -366,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); } @@ -402,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; }