]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
STABLE14-windows-fs-exa-20051001
authorJeffrey Altman <jaltman@secure-endpoints.com>
Sat, 1 Oct 2005 13:11:57 +0000 (13:11 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Sat, 1 Oct 2005 13:11:57 +0000 (13:11 +0000)
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
src/WINNT/afsd/cm_ioctl.h
src/WINNT/afsd/fs.c
src/WINNT/afsd/smb_iocons.h
src/WINNT/afsd/smb_ioctl.c

index c7d829d39f177096dee0aeaa6ace5c3d4e69eaed..8f0ed439a42b99363c6a22491872d18096f22da4 100644 (file)
@@ -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;
index 016f02b607c8b503e81d66e855cbf1fddc45e895..e958bfbbba372035b1e417995d08ef7dc9574e85 100644 (file)
@@ -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);
index f20a24f834209e493d62aa54046b67366f890d42..6516b4779fbb6aecd502faf497ecf14342258630 100644 (file)
@@ -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;
index 41b2b589486f37bb557acd260e7ee0905a53292a..92ea42f9b45d0fe580bacfbf4b7d0460667e39ec 100644 (file)
@@ -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_ */
index 739774f1e72e3df1545935581093abd078ae4986..0f217baf47d3688b0ac65b48f68e106864d4b871 100644 (file)
@@ -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 */