windows-fs-wscell-20050112
authorJeffrey Altman <jaltman@secure-endpoints.com>
Thu, 13 Jan 2005 04:47:37 +0000 (04:47 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Thu, 13 Jan 2005 04:47:37 +0000 (04:47 +0000)
when freelance mode is in use, "fs wscell" will now return
"Freelance.Local.Root"

src/WINNT/afsd/cm_ioctl.c
src/WINNT/afsd/fs.c

index b4d145f..b3c47b0 100644 (file)
@@ -89,8 +89,8 @@ void cm_ResetACLCache(cm_user_t *userp)
     int hash;
 
     lock_ObtainWrite(&cm_scacheLock);
-    for (hash=0; hash < cm_hashTableSize; hash++) {
-        for (scp=cm_hashTablep[hash]; scp; scp=scp->nextp) {
+    for (hash=0; hash < cm_data.hashTableSize; hash++) {
+        for (scp=cm_data.hashTablep[hash]; scp; scp=scp->nextp) {
             cm_HoldSCacheNoLock(scp);
             lock_ReleaseWrite(&cm_scacheLock);
             lock_ObtainMutex(&scp->mx);
@@ -179,7 +179,7 @@ long cm_ParseIoctlPath(smb_ioctl_t *ioctlp, cm_user_t *userp, cm_req_t *reqp,
         shareFound = smb_FindShare(ioctlp->fidp->vcp, ioctlp->uidp, shareName, &sharePath);
         if ( shareFound ) {
             /* we found a sharename, therefore use the resulting path */
-            code = cm_NameI(cm_rootSCachep, ioctlp->prefix->data,
+            code = cm_NameI(cm_data.rootSCachep, ioctlp->prefix->data,
                              CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW,
                              userp, sharePath, reqp, &substRootp);
             free(sharePath);
@@ -208,7 +208,7 @@ long cm_ParseIoctlPath(smb_ioctl_t *ioctlp, cm_user_t *userp, cm_req_t *reqp,
             shareName[i] = 0;       /* terminate string */
 
 
-            code = cm_NameI(cm_rootSCachep, ioctlp->prefix->data,
+            code = cm_NameI(cm_data.rootSCachep, ioctlp->prefix->data,
                              CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW,
                              userp, shareName, reqp, &substRootp);
             if (code) 
@@ -220,7 +220,7 @@ long cm_ParseIoctlPath(smb_ioctl_t *ioctlp, cm_user_t *userp, cm_req_t *reqp,
                 return code;
         }
     } else {
-        code = cm_NameI(cm_rootSCachep, ioctlp->prefix->data,
+        code = cm_NameI(cm_data.rootSCachep, ioctlp->prefix->data,
                          CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW,
                          userp, ioctlp->tidPathp, reqp, &substRootp);
         if (code) 
@@ -347,7 +347,7 @@ long cm_ParseIoctlParent(smb_ioctl_t *ioctlp, cm_user_t *userp, cm_req_t *reqp,
         shareFound = smb_FindShare(ioctlp->fidp->vcp, ioctlp->uidp, shareName, &sharePath);
         if ( shareFound ) {
             /* we found a sharename, therefore use the resulting path */
-            code = cm_NameI(cm_rootSCachep, ioctlp->prefix->data,
+            code = cm_NameI(cm_data.rootSCachep, ioctlp->prefix->data,
                              CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW,
                              userp, sharePath, reqp, &substRootp);
             free(sharePath);
@@ -373,7 +373,7 @@ long cm_ParseIoctlParent(smb_ioctl_t *ioctlp, cm_user_t *userp, cm_req_t *reqp,
             shareName[i++] = '/';      /* add trailing slash */
             shareName[i] = 0;       /* terminate string */
 
-            code = cm_NameI(cm_rootSCachep, ioctlp->prefix->data,
+            code = cm_NameI(cm_data.rootSCachep, ioctlp->prefix->data,
                              CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW,
                              userp, shareName, reqp, &substRootp);
             if (code) return code;
@@ -383,7 +383,7 @@ long cm_ParseIoctlParent(smb_ioctl_t *ioctlp, cm_user_t *userp, cm_req_t *reqp,
             if (code) return code;
         }
     } else {
-        code = cm_NameI(cm_rootSCachep, ioctlp->prefix->data,
+        code = cm_NameI(cm_data.rootSCachep, ioctlp->prefix->data,
                         CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW,
                         userp, ioctlp->tidPathp, reqp, &substRootp);
         if (code) return code;
@@ -472,7 +472,7 @@ long cm_IoctlGetFileCellName(struct smb_ioctl *ioctlp, struct cm_user *userp)
     {
         cellp = cm_FindCellByID(scp->fid.cell);
         if (cellp) {
-            StringCbCopyA(ioctlp->outDatap, 999999, cellp->namep);
+            StringCbCopyA(ioctlp->outDatap, 999999, cellp->name);
             ioctlp->outDatap += strlen(ioctlp->outDatap) + 1;
             code = 0;
         }
@@ -545,8 +545,8 @@ long cm_IoctlFlushVolume(struct smb_ioctl *ioctlp, struct cm_user *userp)
     cm_ReleaseSCache(scp);
 
     lock_ObtainWrite(&cm_scacheLock);
-    for (i=0; i<cm_hashTableSize; i++) {
-        for (scp = cm_hashTablep[i]; scp; scp = scp->nextp) {
+    for (i=0; i<cm_data.hashTableSize; i++) {
+        for (scp = cm_data.hashTablep[i]; scp; scp = scp->nextp) {
             if (scp->fid.volume == volume) {
                 cm_HoldSCacheNoLock(scp);
                 lock_ReleaseWrite(&cm_scacheLock);
@@ -974,10 +974,10 @@ long cm_IoctlSetCacheSize(struct smb_ioctl *ioctlp, struct cm_user *userp)
 
     memcpy(&temp, ioctlp->inDatap, sizeof(temp));
     if (temp == 0) 
-        temp = buf_nOrigBuffers;
+        temp = cm_data.buf_nOrigBuffers;
     else {
         /* temp is in 1K units, convert to # of buffers */
-        temp = temp / (buf_bufferSize / 1024);
+        temp = temp / (cm_data.buf_blockSize / 1024);
     }       
 
     /* now adjust the cache size */
@@ -1031,12 +1031,12 @@ long cm_IoctlGetCacheParms(struct smb_ioctl *ioctlp, struct cm_user *userp)
     memset(&parms, 0, sizeof(parms));
 
     /* first we get, in 1K units, the cache size */
-    parms.parms[0] = buf_nbuffers * (buf_bufferSize / 1024);
+    parms.parms[0] = cm_data.buf_nbuffers * (cm_data.buf_blockSize / 1024);
 
     /* and then the actual # of buffers in use (not in the free list, I guess,
      * will be what we do).
      */
-    parms.parms[1] = (buf_nbuffers - buf_CountFreeList()) * (buf_bufferSize / 1024);
+    parms.parms[1] = (cm_data.buf_nbuffers - buf_CountFreeList()) * (cm_data.buf_blockSize / 1024);
 
     memcpy(ioctlp->outDatap, &parms, sizeof(parms));
     ioctlp->outDatap += sizeof(parms);
@@ -1069,7 +1069,7 @@ long cm_IoctlGetCell(struct smb_ioctl *ioctlp, struct cm_user *userp)
     }
 
     lock_ObtainRead(&cm_cellLock);
-    for (tcellp = cm_allCellsp; tcellp; tcellp = tcellp->nextp) {
+    for (tcellp = cm_data.allCellsp; tcellp; tcellp = tcellp->nextp) {
         if (whichCell == 0) break;
         whichCell--;
     }
@@ -1097,8 +1097,8 @@ long cm_IoctlGetCell(struct smb_ioctl *ioctlp, struct cm_user *userp)
         }
         lock_ReleaseRead(&cm_serverLock);
         cp = basep + max * sizeof(afs_int32);
-        StringCbCopyA(cp, 999999, tcellp->namep);
-        cp += strlen(tcellp->namep)+1;
+        StringCbCopyA(cp, 999999, tcellp->name);
+        cp += strlen(tcellp->name)+1;
         ioctlp->outDatap = cp;
     }
 
@@ -1126,18 +1126,18 @@ long cm_IoctlNewCell(struct smb_ioctl *ioctlp, struct cm_user *userp)
     cm_SkipIoctlPath(ioctlp);
     lock_ObtainWrite(&cm_cellLock);
   
-    for (cp = cm_allCellsp; cp; cp=cp->nextp) 
+    for (cp = cm_data.allCellsp; cp; cp=cp->nextp) 
     {
         long code;
         /* delete all previous server lists - cm_FreeServerList will ask for write on cm_ServerLock*/
         cm_FreeServerList(&cp->vlServersp);
         cp->vlServersp = NULL;
-        code = cm_SearchCellFile(cp->namep, cp->namep, cm_AddCellProc, cp);
+        code = cm_SearchCellFile(cp->name, cp->name, cm_AddCellProc, cp);
 #ifdef AFS_AFSDB_ENV
         if (code) {
             if (cm_dnsEnabled) {
                 int ttl;
-                code = cm_SearchCellByDNS(cp->namep, cp->namep, &ttl, cm_AddCellProc, cp);
+                code = cm_SearchCellByDNS(cp->name, cp->name, &ttl, cm_AddCellProc, cp);
                 if ( code == 0 ) { /* got cell from DNS */
                     cp->flags |= CM_CELLFLAG_DNS;
                     cp->flags &= ~CM_CELLFLAG_VLSERVER_INVALID;
@@ -1164,17 +1164,21 @@ long cm_IoctlNewCell(struct smb_ioctl *ioctlp, struct cm_user *userp)
 
 long cm_IoctlGetWsCell(smb_ioctl_t *ioctlp, cm_user_t *userp)
 {
-    /* if we don't know our default cell, return failure */
-    if (cm_rootCellp == NULL) {
-        return CM_ERROR_NOSUCHCELL;
+       long code = 0;
+
+       if (cm_freelanceEnabled) {
+           StringCbCopyA(ioctlp->outDatap, 999999, "Freelance.Local.Root");
+               ioctlp->outDatap += strlen(ioctlp->outDatap) +1;
+       } else if (cm_data.rootCellp) {
+           /* return the default cellname to the caller */
+           StringCbCopyA(ioctlp->outDatap, 999999, cm_data.rootCellp->name);
+           ioctlp->outDatap += strlen(ioctlp->outDatap) +1;
+       } else {
+           /* if we don't know our default cell, return failure */
+               code = CM_ERROR_NOSUCHCELL;
     }
 
-    /* return the default cellname to the caller */
-    StringCbCopyA(ioctlp->outDatap, 999999, cm_rootCellp->namep);
-    ioctlp->outDatap += strlen(ioctlp->outDatap) +1;
-
-    /* done: success */
-    return 0;
+    return code;
 }
 
 long cm_IoctlSysName(struct smb_ioctl *ioctlp, struct cm_user *userp)
@@ -1477,7 +1481,7 @@ long cm_IoctlCreateMountPoint(struct smb_ioctl *ioctlp, struct cm_user *userp)
     }
 
 #ifdef AFS_FREELANCE_CLIENT
-    if (cm_freelanceEnabled && dscp == cm_rootSCachep) {
+    if (cm_freelanceEnabled && dscp == cm_data.rootSCachep) {
         /* we are adding the mount point to the root dir., so call
          * the freelance code to do the add. */
         osi_Log0(afsd_logp,"IoctlCreateMountPoint within Freelance root dir");
@@ -1526,7 +1530,7 @@ long cm_IoctlSymlink(struct smb_ioctl *ioctlp, struct cm_user *userp)
     cp = ioctlp->inDatap;              /* contents of link */
 
 #ifdef AFS_FREELANCE_CLIENT
-    if (cm_freelanceEnabled && dscp == cm_rootSCachep) {
+    if (cm_freelanceEnabled && dscp == cm_data.rootSCachep) {
         /* we are adding the symlink to the root dir., so call
          * the freelance code to do the add. */
         if (cp[0] == cp[1] && cp[1] == '\\' && 
@@ -1561,9 +1565,6 @@ long cm_IoctlSymlink(struct smb_ioctl *ioctlp, struct cm_user *userp)
     return code;
 }
 
-extern long cm_AssembleLink(cm_scache_t *linkScp, char *pathSuffixp,
-                            cm_scache_t **newRootScpp, cm_space_t **newSpaceBufferp,
-                            cm_user_t *userp, cm_req_t *reqp);
 
 long cm_IoctlListlink(struct smb_ioctl *ioctlp, struct cm_user *userp)
 {
@@ -1594,7 +1595,7 @@ long cm_IoctlListlink(struct smb_ioctl *ioctlp, struct cm_user *userp)
 
     code = cm_AssembleLink(scp, "", &newRootScp, &spacep, userp, &req);
     cm_ReleaseSCache(scp);
-    if (code == 0) {
+    if (code == 0 || code == CM_ERROR_PATH_NOT_COVERED) {
         cp = ioctlp->outDatap;
         if (newRootScp != NULL) {
             StringCbCopyA(cp, 999999, cm_mountRoot);
@@ -1607,6 +1608,7 @@ long cm_IoctlListlink(struct smb_ioctl *ioctlp, struct cm_user *userp)
         cm_FreeSpace(spacep);
         if (newRootScp != NULL)
             cm_ReleaseSCache(newRootScp);
+        code = 0;
     }       
 
     return code;
@@ -1655,7 +1657,7 @@ long cm_IoctlDeletelink(struct smb_ioctl *ioctlp, struct cm_user *userp)
     cp = ioctlp->inDatap;
 
 #ifdef AFS_FREELANCE_CLIENT
-    if (cm_freelanceEnabled && dscp == cm_rootSCachep) {
+    if (cm_freelanceEnabled && dscp == cm_data.rootSCachep) {
         /* we are adding the mount point to the root dir., so call
          * the freelance code to do the add. */
         osi_Log0(afsd_logp,"IoctlDeletelink from Freelance root dir");
@@ -1783,7 +1785,7 @@ long cm_IoctlSetToken(struct smb_ioctl *ioctlp, struct cm_user *userp)
             return CM_ERROR_INVAL;
 #endif /* !DJGPP */
     } else {
-        cellp = cm_rootCellp;
+        cellp = cm_data.rootCellp;
         osi_Log0(smb_logp,"cm_IoctlSetToken - no name specified");
     }
 
@@ -1902,7 +1904,7 @@ long cm_IoctlGetTokenIter(struct smb_ioctl *ioctlp, struct cm_user *userp)
     cp += sizeof(temp);
 
     /* cell name */
-    StringCbCopyA(cp, 999999, ucellp->cellp->namep);
+    StringCbCopyA(cp, 999999, ucellp->cellp->name);
     cp += strlen(cp) + 1;
 
     /* user name */
@@ -1936,7 +1938,8 @@ long cm_IoctlGetToken(struct smb_ioctl *ioctlp, struct cm_user *userp)
 
     /* cell name is right here */
     cellp = cm_GetCell(tp, 0);
-    if (!cellp) return CM_ERROR_NOSUCHCELL;
+    if (!cellp) 
+        return CM_ERROR_NOSUCHCELL;
     tp += strlen(tp) + 1;
 
 #ifndef DJGPP
@@ -1990,7 +1993,7 @@ long cm_IoctlGetToken(struct smb_ioctl *ioctlp, struct cm_user *userp)
     cp += sizeof(temp);
 
     /* cell name */
-    StringCbCopyA(cp, 999999, ucellp->cellp->namep);
+    StringCbCopyA(cp, 999999, ucellp->cellp->name);
     cp += strlen(cp) + 1;
 
     /* user name */
index f33ffb9..b2d7e4f 100644 (file)
@@ -2420,7 +2420,7 @@ WhichCellCmd(struct cmd_syndesc *as, char *arock)
     afs_int32 code;
     struct cmd_item *ti;
     int error = 0;
-    char cell[MAXCELLCHARS];
+    char cell[MAXCELLCHARS]="";
     
     SetDotDefault(&as->parms[0].items);
     for(ti=as->parms[0].items; ti; ti=ti->next) {