From ed405f1b72e85d072a8bd3a4c60169f96dc16576 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Sat, 1 Oct 2005 13:11:57 +0000 Subject: [PATCH] STABLE14-windows-fs-exa-20051001 Add reporting of the FID, cell, owner and group to the output of "fs exa" (on Windows only). There is no other means to obtain this data from a Windows client. (cherry picked from commit 2b1604240e664da572df922aa84b15b717fcd8ec) --- src/WINNT/afsd/cm_ioctl.c | 59 ++++++++++++++++++++++++++++++++++++- src/WINNT/afsd/cm_ioctl.h | 4 +++ src/WINNT/afsd/fs.c | 45 ++++++++++++++++++++-------- src/WINNT/afsd/smb_iocons.h | 2 ++ src/WINNT/afsd/smb_ioctl.c | 2 ++ 5 files changed, 98 insertions(+), 14 deletions(-) diff --git a/src/WINNT/afsd/cm_ioctl.c b/src/WINNT/afsd/cm_ioctl.c index c7d829d39..8f0ed439a 100644 --- a/src/WINNT/afsd/cm_ioctl.c +++ b/src/WINNT/afsd/cm_ioctl.c @@ -564,7 +564,6 @@ long cm_IoctlFlushVolume(struct smb_ioctl *ioctlp, struct cm_user *userp) { long code; cm_scache_t *scp; - unsigned long volume; int i; cm_req_t req; @@ -760,6 +759,64 @@ long cm_IoctlGetVolumeStatus(struct smb_ioctl *ioctlp, struct cm_user *userp) return 0; } +long cm_IoctlGetFid(struct smb_ioctl *ioctlp, struct cm_user *userp) +{ + cm_scache_t *scp; + register long code; + register char *cp; + cm_fid_t fid; + cm_req_t req; + + cm_InitReq(&req); + + code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp); + if (code) return code; + + memset(&fid, 0, sizeof(cm_fid_t)); + fid.volume = scp->fid.volume; + fid.vnode = scp->fid.vnode; + fid.unique = scp->fid.unique; + + cm_ReleaseSCache(scp); + + /* Copy all this junk into msg->im_data, keeping track of the lengths. */ + cp = ioctlp->outDatap; + memcpy(cp, (char *)&fid, sizeof(cm_fid_t)); + cp += sizeof(cm_fid_t); + + /* return new size */ + ioctlp->outDatap = cp; + + return 0; +} + +long cm_IoctlGetOwner(struct smb_ioctl *ioctlp, struct cm_user *userp) +{ + cm_scache_t *scp; + register long code; + register char *cp; + cm_req_t req; + + cm_InitReq(&req); + + code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp); + if (code) return code; + + /* Copy all this junk into msg->im_data, keeping track of the lengths. */ + cp = ioctlp->outDatap; + memcpy(cp, (char *)&scp->owner, sizeof(afs_uint32)); + cp += sizeof(afs_uint32); + memcpy(cp, (char *)&scp->group, sizeof(afs_uint32)); + cp += sizeof(afs_uint32); + + /* return new size */ + ioctlp->outDatap = cp; + + cm_ReleaseSCache(scp); + + return 0; +} + long cm_IoctlWhereIs(struct smb_ioctl *ioctlp, struct cm_user *userp) { long code; diff --git a/src/WINNT/afsd/cm_ioctl.h b/src/WINNT/afsd/cm_ioctl.h index 016f02b60..e958bfbbb 100644 --- a/src/WINNT/afsd/cm_ioctl.h +++ b/src/WINNT/afsd/cm_ioctl.h @@ -69,6 +69,10 @@ extern long cm_IoctlSetVolumeStatus(smb_ioctl_t *ioctlp, cm_user_t *userp); extern long cm_IoctlGetVolumeStatus(smb_ioctl_t *ioctlp, cm_user_t *userp); +extern long cm_IoctlGetFid(smb_ioctl_t *ioctlp, cm_user_t *userp); + +extern long cm_IoctlGetOwner(smb_ioctl_t *ioctlp, cm_user_t *userp); + extern long cm_IoctlWhereIs(smb_ioctl_t *ioctlp, cm_user_t *userp); extern long cm_IoctlStatMountPoint(smb_ioctl_t *ioctlp, cm_user_t *userp); diff --git a/src/WINNT/afsd/fs.c b/src/WINNT/afsd/fs.c index f20a24f83..6516b4779 100644 --- a/src/WINNT/afsd/fs.c +++ b/src/WINNT/afsd/fs.c @@ -1504,13 +1504,41 @@ ExamineCmd(struct cmd_syndesc *as, char *arock) SetDotDefault(&as->parms[0].items); for(ti=as->parms[0].items; ti; ti=ti->next) { -#ifndef WIN32 - struct VenusFid vfid; -#endif /* WIN32 */ + cm_fid_t fid; + afs_uint32 owner[2]; + char cell[MAXCELLCHARS]; + + code = GetCell(ti->data, cell); + if (code) { + Die(errno, ti->data); + error = 1; + continue; + } + /* once per file */ - blob.out_size = MAXSIZE; blob.in_size = 0; + + blob.out_size = sizeof(cm_fid_t); + blob.out = (char *) &fid; + if (0 == pioctl(ti->data, VIOCGETFID, &blob, 1)) { + printf("File %s (%u.%u.%u) contained in cell %s\n", + ti->data, fid.volume, fid.vnode, fid.unique, + cell); + } + + blob.out_size = 2 * sizeof(afs_uint32); + blob.out = (char *) &owner; + if (0 == pioctl(ti->data, VIOCGETOWNER, &blob, 1)) { + char oname[PR_MAXNAMELEN] = "(unknown)"; + + /* Go to the PRDB and see if this all number username is valid */ + pr_Initialize(1, AFSDIR_CLIENT_ETC_DIRPATH, cell); + pr_SIdToName(owner[0], oname); + printf("Owner %s (%u) Group %u\n", oname, owner[0], owner[1]); + } + blob.out = space; + blob.out_size = MAXSIZE; code = pioctl(ti->data, VIOCGETVOLSTAT, &blob, 1); if (code) { Die(errno, ti->data); @@ -1522,15 +1550,6 @@ ExamineCmd(struct cmd_syndesc *as, char *arock) offmsg = name + strlen(name) + 1; motd = offmsg + strlen(offmsg) + 1; -#ifndef WIN32 - blob.out_size = sizeof(struct VenusFid); - blob.out = (char *) &vfid; - if (0 == pioctl(ti->data, VIOCGETFID, &blob, 1)) { - printf("File %s (%u.%u.%u) contained in volume %u\n", - ti->data, vfid.Fid.Volume, vfid.Fid.Vnode, vfid.Fid.Unique, - vfid.Fid.Volume); - } -#endif /* WIN32 */ PrintStatus(status, name, motd, offmsg); } return error; diff --git a/src/WINNT/afsd/smb_iocons.h b/src/WINNT/afsd/smb_iocons.h index 41b2b5894..92ea42f9b 100644 --- a/src/WINNT/afsd/smb_iocons.h +++ b/src/WINNT/afsd/smb_iocons.h @@ -92,4 +92,6 @@ typedef struct cm_cacheParms { #define VIOC_TRACEMEMDUMP 0x29 #define VIOC_SHUTDOWN 0x2a #define VIOC_FLUSHALL 0x2b +#define VIOCGETFID 0x2c +#define VIOCGETOWNER 0x2d #endif /* __SMB_IOCONS_H_ENV_ */ diff --git a/src/WINNT/afsd/smb_ioctl.c b/src/WINNT/afsd/smb_ioctl.c index 739774f1e..0f217baf4 100644 --- a/src/WINNT/afsd/smb_ioctl.c +++ b/src/WINNT/afsd/smb_ioctl.c @@ -79,6 +79,8 @@ void smb_InitIoctl(void) smb_ioctlProcsp[VIOC_TRACEMEMDUMP] = cm_IoctlMemoryDump; smb_ioctlProcsp[VIOC_ISSYMLINK] = cm_IoctlIslink; smb_ioctlProcsp[VIOC_FLUSHALL] = cm_IoctlFlushAllVolumes; + smb_ioctlProcsp[VIOCGETFID] = cm_IoctlGetFid; + smb_ioctlProcsp[VIOCGETOWNER] = cm_IoctlGetOwner; } /* called to make a fid structure into an IOCTL fid structure */ -- 2.39.5