&& p1[l2] == '/';
}
+struct parsed_fsid {
+ int fsidtype;
+ /* We could use a union for this, but it would be more
+ * complicated; why bother? */
+ unsigned int inode;
+ unsigned int minor;
+ unsigned int major;
+ unsigned int fsidnum;
+ int uuidlen;
+ char *fhuuid;
+};
+
static void nfsd_fh(FILE *f)
{
/* request are:
char *dom;
int fsidtype;
int fsidlen;
- unsigned int dev, major=0, minor=0;
- unsigned int inode=0;
unsigned long long inode64;
- unsigned int fsidnum=0;
+ unsigned int dev;
char fsid[32];
+ struct parsed_fsid parsed;
struct exportent *found = NULL;
struct addrinfo *ai = NULL;
char *found_path = NULL;
nfs_export *exp;
int i;
int dev_missing = 0;
- int uuidlen = 0;
- char *fhuuid = NULL;
if (readline(fileno(f), &lbuf, &lbuflen) != 1)
return;
if (fsidlen != 8)
goto out;
memcpy(&dev, fsid, 4);
- memcpy(&inode, fsid+4, 4);
- major = ntohl(dev)>>16;
- minor = ntohl(dev) & 0xFFFF;
+ memcpy(&parsed.inode, fsid+4, 4);
+ parsed.major = ntohl(dev)>>16;
+ parsed.minor = ntohl(dev) & 0xFFFF;
break;
case FSID_NUM: /* 4 bytes - fsid */
if (fsidlen != 4)
goto out;
- memcpy(&fsidnum, fsid, 4);
+ memcpy(&parsed.fsidnum, fsid, 4);
break;
case FSID_MAJOR_MINOR: /* 12 bytes: 4 major, 4 minor, 4 inode
*/
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);
+ memcpy(&dev, fsid, 4);
+ parsed.major = ntohl(dev);
+ memcpy(&dev, fsid+4, 4);
+ parsed.minor = ntohl(dev);
+ memcpy(&parsed.inode, fsid+8, 4);
break;
case FSID_ENCODE_DEV: /* 8 bytes: 4 byte packed device number, 4 inode */
if (fsidlen != 8)
goto out;
memcpy(&dev, fsid, 4);
- memcpy(&inode, fsid+4, 4);
- major = (dev & 0xfff00) >> 8;
- minor = (dev & 0xff) | ((dev >> 12) & 0xfff00);
+ memcpy(&parsed.inode, fsid+4, 4);
+ parsed.major = (dev & 0xfff00) >> 8;
+ parsed.minor = (dev & 0xff) | ((dev >> 12) & 0xfff00);
break;
case FSID_UUID4_INUM: /* 4 byte inode number and 4 byte uuid */
if (fsidlen != 8)
goto out;
- memcpy(&inode, fsid, 4);
- uuidlen = 4;
- fhuuid = fsid+4;
+ memcpy(&parsed.inode, fsid, 4);
+ parsed.uuidlen = 4;
+ parsed.fhuuid = fsid+4;
break;
case FSID_UUID8: /* 8 byte uuid */
if (fsidlen != 8)
goto out;
- uuidlen = 8;
- fhuuid = fsid;
+ parsed.uuidlen = 8;
+ parsed.fhuuid = fsid;
break;
case FSID_UUID16: /* 16 byte uuid */
if (fsidlen != 16)
goto out;
- uuidlen = 16;
- fhuuid = fsid;
+ parsed.uuidlen = 16;
+ parsed.fhuuid = fsid;
break;
case FSID_UUID16_INUM: /* 8 byte inode number and 16 byte uuid */
if (fsidlen != 24)
goto out;
memcpy(&inode64, fsid, 8);
- inode = inode64;
- uuidlen = 16;
- fhuuid = fsid+8;
+ parsed.inode = inode64;
+ parsed.uuidlen = 16;
+ parsed.fhuuid = fsid+8;
break;
}
case FSID_DEV:
case FSID_MAJOR_MINOR:
case FSID_ENCODE_DEV:
- if (stb.st_ino != inode)
+ if (stb.st_ino != parsed.inode)
continue;
- if (major != major(stb.st_dev) ||
- minor != minor(stb.st_dev))
+ if (parsed.major != major(stb.st_dev) ||
+ parsed.minor != minor(stb.st_dev))
continue;
break;
case FSID_NUM:
if (((exp->m_export.e_flags & NFSEXP_FSID) == 0 ||
- exp->m_export.e_fsid != fsidnum))
+ exp->m_export.e_fsid != parsed.fsidnum))
continue;
break;
case FSID_UUID4_INUM:
case FSID_UUID16_INUM:
- if (stb.st_ino != inode)
+ if (stb.st_ino != parsed.inode)
continue;
goto check_uuid;
case FSID_UUID8:
check_uuid:
if (exp->m_export.e_uuid)
get_uuid(exp->m_export.e_uuid,
- uuidlen, u);
+ parsed.uuidlen, u);
else
for (type = 0;
- uuid_by_path(path, type, uuidlen, u);
+ uuid_by_path(path, type, parsed.uuidlen, u);
type++)
- if (memcmp(u, fhuuid, uuidlen) == 0)
+ if (memcmp(u, parsed.fhuuid, parsed.uuidlen) == 0)
break;
- if (memcmp(u, fhuuid, uuidlen) != 0)
+ if (memcmp(u, parsed.fhuuid, parsed.uuidlen) != 0)
continue;
break;
}