windows-misc-20041122
authorJeffrey Altman <jaltman@mit.edu>
Tue, 23 Nov 2004 03:49:05 +0000 (03:49 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Tue, 23 Nov 2004 03:49:05 +0000 (03:49 +0000)
the VC++ 2003 Toolkit is missing some important libraries.
remove it from the README-NT file

====================
This delta was composed from multiple commits as part of the CVS->Git migration.
The checkin message with each commit was inconsistent.
The following are the additional commit messages.
====================

update docs

====================

simplify the freelance import from afs_freelance.ini code.  don't generate
an new file if the old one does not exist.

begin conversion from old string functions to new strsafe functions.
this will need to be done for all of the afsd_service.exe source
modules before we can regularly use VS .NET 2005

Add support for VL_GetEntryByNameN.  Still need to figure out what needs
to be done for VL_GetEntryByNameU.  (multi-homed support)

====================

fix a deadlock situation if an Obtain Tokens dialog is produced
by an expiration event and the user chooses to cancel instead of
obtain new credentials.

13 files changed:
README-NT
doc/txt/winnotes/afs-changes-since-1.2.txt
doc/txt/winnotes/afs-issues.txt
src/WINNT/afsd/afsd_init.c
src/WINNT/afsd/afsicf.cpp
src/WINNT/afsd/cm_buf.c
src/WINNT/afsd/cm_freelance.c
src/WINNT/afsd/cm_ioctl.c
src/WINNT/afsd/cm_scache.c
src/WINNT/afsd/cm_volume.c
src/WINNT/afsd/smb3.c
src/WINNT/client_creds/creds.cpp
src/WINNT/client_creds/credstab.cpp

index 40e4103..7507062 100644 (file)
--- a/README-NT
+++ b/README-NT
@@ -42,14 +42,14 @@ The Microsoft development tools require anywhere from 660 MB to 1.8GB
 of storage depending on which compilers are selected.  The following 
 versions are supported:
 
-    Microsoft Visual .NET 
+    Microsoft Visual Studio .NET 
       available via a MSDN subscription
 
-    Microsoft Visual .NET 2003 (recommended)
+    Microsoft Visual Studio .NET 2003 (recommended)
       available via a MSDN subscription
 
-    Microsoft Visual C++ Toolkit 2003 (same as .NET 2003)
-      http://msdn.microsoft.com/visualc/vctoolkit2003/
+    Microsoft Visual Studio .NET 2005 (do not use for production)
+      available via a MSDN subscription
 
 The following Microsoft SDK is required:
 
@@ -129,8 +129,8 @@ The AFS base directory should look something like the following:
 
 STEP B. Install compiler and development tools.
 
-Install a copy of Microsoft Visual .NET, Visual .NET 2003, Visual C++
-Toolkit 2003.  The "Typical" install setting is sufficient.
+Install a copy of Microsoft Visual Studio .NET, Visual Studio .NET 2003, 
+or Visual Studio .NET 2005.  The "Typical" install setting is sufficient.
 
 (1) You can reduce the installation size by selecting "Custom" install
 and remove all but the following Options:
@@ -176,9 +176,9 @@ customized for use on your development system.  The following variables
 must be defined to match your configuration:
 
   AFSVER_CL: Set to 1200 if using MS Visual C++ 6.0
-             Set to 1300 if using MS Visual .NET
-             Set to 1310 if using MS Visual .NET 2003
-             Set to 1400 if using MS Visual .NET 2005
+             Set to 1300 if using MS Visual Studio .NET
+             Set to 1310 if using MS Visual Studio .NET 2003
+             Set to 1400 if using MS Visual Studio .NET 2005
 
   MSVCDIR: Set to the short name version of the directory into which
            the visual C++ compiler was installed regardless of version
index 6f10f59..6378242 100644 (file)
@@ -1,3 +1,10 @@
+Since 1.3.74:
+  * Added support for VL_GetEntryByNameN().  Still need to add
+    support for VL_GetEntryByNameU() for multi-homed support.
+
+  * Fix a deadlock situation in afscreds.exe when canceling an
+    auto-generated Obtain Tokens dialog
+
 Since 1.3.72/73:
   * Fix the locking of objects during Directory Searches in the
     SMB/CIFS server.  The failure to properly lock the reference 
index 55b8a9b..8bf80df 100644 (file)
@@ -142,6 +142,9 @@ directories.
      or by the new AFS Client Service Administration tool when executed 
      by an authorized user.
 
+(31) Add support for multi-homed servers
+
+
 -------------------------------------------------------------------------
 List of unfunded projects:
 
@@ -220,3 +223,5 @@ List of unfunded projects:
   24. Add support for storing Extended Attributes on files
   25. Add support for storing Windows ACLs on files
   26. Remove submount creation as a side effect of drive creation
+  27. Finish conversion from string.h to strsafe.h
+  28. Add support for multi-homed servers
index 8c34568..e7911fa 100644 (file)
@@ -250,7 +250,7 @@ configureBackConnectionHostNames(void)
     DWORD dwType;
     DWORD dwSize;
     DWORD dwValue;
-    PBYTE pHostNames = NULL, pName;
+    PBYTE pHostNames = NULL, pName = NULL;
     BOOL  bNameFound = FALSE;   
 
     if ( RegOpenKeyEx( HKEY_LOCAL_MACHINE, 
@@ -273,12 +273,14 @@ configureBackConnectionHostNames(void)
         }
              
         if ( !bNameFound ) {
+            int size = strlen(cm_NetbiosName) + 2;
             if ( !pHostNames ) {
-                pName = pHostNames = malloc(strlen(cm_NetbiosName) + 2);
+                pHostNames = malloc(size);
                 dwSize = 1;
             }
-            strcpy(pName, cm_NetbiosName);
-            pName += strlen(cm_NetbiosName) + 1;
+            pName = pHostNames;
+            StringCbCopyA(pName, size, strlen(cm_NetbiosName));
+            pName += size - 1;
             *pName = '\0';  /* add a second nul terminator */
 
             dwType = REG_MULTI_SZ;
index 08ebec6..5aec746 100644 (file)
@@ -135,6 +135,7 @@ HRESULT icf_CheckAndAddPorts(INetFwProfile * fwProfile, global_afs_port_t * port
        INetFwOpenPort * fwPort = NULL;
        HRESULT hr;
        HRESULT rhr = S_OK; /* return value */
+        int i = 0;
 
        hr = fwProfile->get_GloballyOpenPorts(&fwPorts);
        if (FAILED(hr)) {
@@ -145,7 +146,7 @@ HRESULT icf_CheckAndAddPorts(INetFwProfile * fwProfile, global_afs_port_t * port
        }
 
        // go through the supplied ports
-       for (int i=0; i<nPorts; i++) {
+       for (i=0; i<nPorts; i++) {
                VARIANT_BOOL vbEnabled;
                BSTR bstName = NULL;
                BOOL bCreate = FALSE;
index 06c9cc1..5f4ac80 100644 (file)
@@ -1464,17 +1464,16 @@ int cm_DumpBufHashTable(FILE *outputFile, char *cookie)
 
     lock_ObtainRead(&buf_globalLock);
   
-    sprintf(output, "%s - dumping buf_HashTable - buf_hashSize=%d\n", cookie, buf_hashSize);
+    StringCbPrintfA(output, sizeof(output), "%s - dumping buf_HashTable - buf_hashSize=%d\n", cookie, buf_hashSize);
     WriteFile(outputFile, output, strlen(output), &zilch, NULL);
   
     for (i = 0; i < buf_hashSize; i++)
     {
-        for(bp = buf_hashTablepp[i]; bp; bp=bp->hashp) 
+        for (bp = buf_hashTablepp[i]; bp; bp=bp->hashp) 
         {
             if (bp->refCount)
             {
-                sprintf(output, "%s bp=0x%08X, hash=%d, fid (cell=%d, volume=%d,"
-                        "vnode=%d, unique=%d), size=%d refCount=%d\n", 
+                StringCbPrintfA(output, sizeof(output), "vnode=%d, unique=%d), size=%d refCount=%d\n", 
                         cookie, (void *)bp, i, bp->fid.cell, bp->fid.volume, 
                         bp->fid.vnode, bp->fid.unique, bp->size, bp->refCount);
                 WriteFile(outputFile, output, strlen(output), &zilch, NULL);
@@ -1482,7 +1481,7 @@ int cm_DumpBufHashTable(FILE *outputFile, char *cookie)
         }
     }
   
-    sprintf(output, "%s - Done dumping buf_HashTable.\n", cookie);
+    StringCbPrintfA(output, sizeof(output), "%s - Done dumping buf_HashTable.\n", cookie);
     WriteFile(outputFile, output, strlen(output), &zilch, NULL);
 
     lock_ReleaseRead(&buf_globalLock);
index 0894791..6ea9360 100644 (file)
@@ -619,26 +619,6 @@ long cm_InitLocalMountPoints() {
     // open the ini file for reading
     fp = fopen(hdir, "r");
 
-    // if we fail to open the file, create an empty one
-    if (!fp) {
-        fp = fopen(hdir, "w");
-       code = cm_GetRootCellName(rootCellName);
-        if (code == 0) {
-            fputs("1\n", fp);
-            fprintf(fp,"%s#%s:root.cell.\n",rootCellName,rootCellName);
-            fprintf(fp,".%s%%%s:root.cell.\n",rootCellName,rootCellName);
-            fclose(fp);
-            fp = fopen(hdir, "r");
-        } else {
-            fputs("0\n", fp);
-            fclose(fp);
-            return 0;  /* success */
-        }
-    }
-
-    // we successfully opened the file
-    osi_Log0(afsd_logp,"opened afs_freelance.ini");
-       
 #if !defined(DJGPP)
     RegCreateKeyEx( HKEY_LOCAL_MACHINE, 
                     "SOFTWARE\\OpenAFS\\Client\\Freelance",
@@ -652,6 +632,22 @@ long cm_InitLocalMountPoints() {
     dwIndex = 0;
 #endif
 
+    if (!fp) {
+#if !defined(DJGPP);
+        RegCloseKey(hkFreelance);
+#endif
+        rootCellName[0] = '.';
+       code = cm_GetRootCellName(&rootCellName[1]);
+        if (code == 0) {
+            cm_FreelanceAddMount(&rootCellName[1], &rootCellName[1], "root.cell", 0, NULL);
+            cm_FreelanceAddMount(rootCellName, &rootCellName[1], "root.cell", 1, NULL);
+        }
+        return 0;
+    }
+
+    // we successfully opened the file
+    osi_Log0(afsd_logp,"opened afs_freelance.ini");
+       
     // now we read the first line to see how many entries
     // there are
     fgets(line, sizeof(line), fp);
@@ -668,9 +664,11 @@ long cm_InitLocalMountPoints() {
     // that we read
     cm_noLocalMountPoints = atoi(line);
 
-    // create space to store the local mount points
-    cm_localMountPoints = malloc(sizeof(cm_localMountPoint_t) * cm_noLocalMountPoints);
-    aLocalMountPoint = cm_localMountPoints;
+    if (cm_noLocalMountPoints > 0) {
+        // create space to store the local mount points
+        cm_localMountPoints = malloc(sizeof(cm_localMountPoint_t) * cm_noLocalMountPoints);
+        aLocalMountPoint = cm_localMountPoints;
+    }
 
     // now we read n lines and parse them into local mount points
     // where n is the number of local mount points there are, as
@@ -688,6 +686,11 @@ long cm_InitLocalMountPoints() {
             return -1;
         }
 
+        /* find the trailing dot; null terminate after it */
+        t2 = strrchr(line, '.');
+        if (t2)
+            *(t2+1) = '\0';
+
 #if !defined(DJGPP)
         if ( hkFreelance ) {
             char szIndex[16];
@@ -714,8 +717,8 @@ long cm_InitLocalMountPoints() {
         *(aLocalMountPoint->namep + (t-line)) = 0;
 
         aLocalMountPoint->mountPointStringp=malloc(strlen(line) - (t-line) + 1);
-        memcpy(aLocalMountPoint->mountPointStringp, t, strlen(line)-(t-line)-2);
-        *(aLocalMountPoint->mountPointStringp + (strlen(line)-(t-line)-2)) = 0;
+        memcpy(aLocalMountPoint->mountPointStringp, t, strlen(line)-(t-line)-1);
+        *(aLocalMountPoint->mountPointStringp + (strlen(line)-(t-line)-1)) = 0;
 
         osi_Log2(afsd_logp,"found mount point: name %s, string %s",
                   aLocalMountPoint->namep,
@@ -816,9 +819,9 @@ long cm_FreelanceAddMount(char *filename, char *cellname, char *volume, int rw,
                 RegSetValueEx( hkFreelance, szIndex, 0, dwType, line, dwSize);
                 break;
             } else {
-                               int len = strlen(filename);
-                               if ( dwType == REG_SZ && !strncmp(filename, szMount, len) && 
-                                       (szMount[len] == '%' || szMount[len] == '#')) {
+                int len = strlen(filename);
+                if ( dwType == REG_SZ && !strncmp(filename, szMount, len) && 
+                     (szMount[len] == '%' || szMount[len] == '#')) {
                     /* Replace the existing value */
                     dwType = REG_SZ;
                     dwSize = strlen(line) + 1;
index bb60b77..b502052 100644 (file)
@@ -259,7 +259,7 @@ void cm_SkipIoctlPath(smb_ioctl_t *ioctlp)
  * easier (because we can always jump past the initial "/afs" to find
  * the AFS path that should be written into afsdsbmt.ini).
  */
-void cm_NormalizeAfsPath (char *outpathp, char *inpathp)
+void cm_NormalizeAfsPath(char *outpathp, long outlen, char *inpathp)
 {
     char *cp;
     char bslash_mountRoot[256];
@@ -268,13 +268,13 @@ void cm_NormalizeAfsPath (char *outpathp, char *inpathp)
     bslash_mountRoot[0] = '\\';
        
     if (!strnicmp (inpathp, cm_mountRoot, strlen(cm_mountRoot)))
-        lstrcpy (outpathp, inpathp);
+        StringCbCopy(outpathp, outlen, inpathp);
     else if (!strnicmp (inpathp, bslash_mountRoot, strlen(bslash_mountRoot)))
-        lstrcpy (outpathp, inpathp);
+        StringCbCopy(outpathp, outlen, inpathp);
     else if ((inpathp[0] == '/') || (inpathp[0] == '\\'))
-        sprintf (outpathp, "%s%s", cm_mountRoot, inpathp);
+        StringCbPrintfA(outpathp, outlen, "%s%s", cm_mountRoot, inpathp);
     else // inpathp looks like "<cell>/usr"
-        sprintf (outpathp, "%s/%s", cm_mountRoot, inpathp);
+        StringCbPrintfA(outpathp, outlen, "%s/%s", cm_mountRoot, inpathp);
 
     for (cp = outpathp; *cp != 0; ++cp) {
         if (*cp == '\\')
@@ -286,10 +286,11 @@ void cm_NormalizeAfsPath (char *outpathp, char *inpathp)
     }
 
     if (!strcmpi (outpathp, cm_mountRoot)) {
-        strcpy (outpathp, cm_mountRoot);
+        StringCbCopy(outpathp, outlen, cm_mountRoot);
     }
 }
 
+#define LEAF_SIZE 256
 /* parse the passed-in file name and do a namei on its parent.  If we fail,
  * return an error code, otherwise return the vnode located in *scpp.
  */
@@ -301,7 +302,7 @@ long cm_ParseIoctlParent(smb_ioctl_t *ioctlp, cm_user_t *userp, cm_req_t *reqp,
     char *tp, *jp;
     cm_scache_t *substRootp;
 
-    strcpy(tbuffer, ioctlp->inDatap);
+    StringCbCopyA(tbuffer, sizeof(tbuffer), ioctlp->inDatap);
     tp = strrchr(tbuffer, '\\');
     jp = strrchr(tbuffer, '/');
     if (!tp)
@@ -309,14 +310,14 @@ long cm_ParseIoctlParent(smb_ioctl_t *ioctlp, cm_user_t *userp, cm_req_t *reqp,
     else if (jp && (tp - tbuffer) < (jp - tbuffer))
         tp = jp;
     if (!tp) {
-        strcpy(tbuffer, "\\");
+        StringCbCopyA(tbuffer, sizeof(tbuffer), "\\");
         if (leafp) 
-            strcpy(leafp, ioctlp->inDatap);
+            StringCbCopyA(leafp, LEAF_SIZE, ioctlp->inDatap);
     }
     else {
         *tp = 0;
         if (leafp) 
-            strcpy(leafp, tp+1);
+            StringCbCopyA(leafp, LEAF_SIZE, tp+1);
     }   
 
     if (tbuffer[0] == tbuffer[1] &&
@@ -463,7 +464,7 @@ long cm_IoctlGetFileCellName(struct smb_ioctl *ioctlp, struct cm_user *userp)
          scp->fid.cell==AFS_FAKE_ROOT_CELL_ID &&
          scp->fid.volume==AFS_FAKE_ROOT_VOL_ID &&
          scp->fid.vnode==0x1 && scp->fid.unique==0x1 ) {
-        strcpy(ioctlp->outDatap, "Freelance.Local.Root");
+        StringCbCopyA(ioctlp->outDatap, 999999, "Freelance.Local.Root");
         ioctlp->outDatap += strlen(ioctlp->outDatap) + 1;
         code = 0;
     } else 
@@ -471,7 +472,7 @@ long cm_IoctlGetFileCellName(struct smb_ioctl *ioctlp, struct cm_user *userp)
     {
         cellp = cm_FindCellByID(scp->fid.cell);
         if (cellp) {
-            strcpy(ioctlp->outDatap, cellp->namep);
+            StringCbCopyA(ioctlp->outDatap, 999999, cellp->namep);
             ioctlp->outDatap += strlen(ioctlp->outDatap) + 1;
             code = 0;
         }
@@ -620,11 +621,11 @@ long cm_IoctlSetVolumeStatus(struct smb_ioctl *ioctlp, struct cm_user *userp)
     cp = ioctlp->inDatap;
     memcpy((char *)&volStat, cp, sizeof(AFSFetchVolumeStatus));
     cp += sizeof(AFSFetchVolumeStatus);
-    strcpy(volName, cp);
+    StringCbCopyA(volName, sizeof(volName), cp);
     cp += strlen(volName)+1;
-    strcpy(offLineMsg, cp);
+    StringCbCopyA(offLineMsg, sizeof(offLineMsg), cp);
     cp +=  strlen(offLineMsg)+1;
-    strcpy(motd, cp);
+    StringCbCopyA(motd, sizeof(motd), cp);
     storeStat.Mask = 0;
     if (volStat.MinQuota != -1) {
         storeStat.MinQuota = volStat.MinQuota;
@@ -660,11 +661,11 @@ long cm_IoctlSetVolumeStatus(struct smb_ioctl *ioctlp, struct cm_user *userp)
     cp = ioctlp->outDatap;
     memcpy(cp, (char *)&volStat, sizeof(VolumeStatus));
     cp += sizeof(VolumeStatus);
-    strcpy(cp, volName);
+    StringCbCopyA(cp, 999999, volName);
     cp += strlen(volName)+1;
-    strcpy(cp, offLineMsg);
+    StringCbCopyA(cp, 999999, offLineMsg);
     cp += strlen(offLineMsg)+1;
-    strcpy(cp, motd);
+    StringCbCopyA(cp, 999999, motd);
     cp += strlen(motd)+1;
 
     /* now return updated return data pointer */
@@ -716,11 +717,11 @@ long cm_IoctlGetVolumeStatus(struct smb_ioctl *ioctlp, struct cm_user *userp)
     cp = ioctlp->outDatap;
     memcpy(cp, (char *)&volStat, sizeof(AFSFetchVolumeStatus));
     cp += sizeof(AFSFetchVolumeStatus);
-    strcpy(cp, volName);
+    StringCbCopyA(cp, 999999, volName);
     cp += strlen(volName)+1;
-    strcpy(cp, offLineMsg);
+    StringCbCopyA(cp, 999999, offLineMsg);
     cp += strlen(offLineMsg)+1;
-    strcpy(cp, motd);
+    StringCbCopyA(cp, 999999, motd);
     cp += strlen(motd)+1;
 
     /* return new size */
@@ -811,7 +812,7 @@ long cm_IoctlStatMountPoint(struct smb_ioctl *ioctlp, struct cm_user *userp)
     code = cm_ReadMountPoint(scp, userp, &req);
     if (code == 0) {
         cp = ioctlp->outDatap;
-        strcpy(cp, scp->mountPointStringp);
+        StringCbCopyA(cp, 999999, scp->mountPointStringp);
         cp += strlen(cp) + 1;
         ioctlp->outDatap = cp;
     }
@@ -1096,7 +1097,7 @@ long cm_IoctlGetCell(struct smb_ioctl *ioctlp, struct cm_user *userp)
         }
         lock_ReleaseRead(&cm_serverLock);
         cp = basep + max * sizeof(afs_int32);
-        strcpy(cp, tcellp->namep);
+        StringCbCopyA(cp, 999999, tcellp->namep);
         cp += strlen(tcellp->namep)+1;
         ioctlp->outDatap = cp;
     }
@@ -1169,7 +1170,7 @@ long cm_IoctlGetWsCell(smb_ioctl_t *ioctlp, cm_user_t *userp)
     }
 
     /* return the default cellname to the caller */
-    strcpy(ioctlp->outDatap, cm_rootCellp->namep);
+    StringCbCopyA(ioctlp->outDatap, 999999, cm_rootCellp->namep);
     ioctlp->outDatap += strlen(ioctlp->outDatap) +1;
 
     /* done: success */
@@ -1218,7 +1219,7 @@ long cm_IoctlSysName(struct smb_ioctl *ioctlp, struct cm_user *userp)
         osi_panic("cm_IoctlSysName: !cm_sysName\n", __FILE__, __LINE__);
 
     if (!setSysName) {      /* user just wants the info */
-        strcpy(outname, cm_sysName);
+        StringCbCopyA(outname, sizeof(outname), cm_sysName);
         foundname = cm_sysNameCount;
         *sysnamelist = cm_sysNameList;
     } else {        
@@ -1226,8 +1227,8 @@ long cm_IoctlSysName(struct smb_ioctl *ioctlp, struct cm_user *userp)
         /* clear @sys entries from the dnlc, once afs_lookup can
          * do lookups of @sys entries and thinks it can trust them */
         /* privs ok, store the entry, ... */
-        strcpy(cm_sysName, inname);
-               strcpy(cm_sysNameList[0], inname);
+        StringCbCopyA(cm_sysName, sizeof(cm_sysName), inname);
+        StringCbCopyA(cm_sysNameList[0], MAXSYSNAME, inname);
         if (setSysName > 1) {       /* ... or list */
             cp = ioctlp->inDatap;
             for (count = 1; count < setSysName; ++count) {
@@ -1235,7 +1236,7 @@ long cm_IoctlSysName(struct smb_ioctl *ioctlp, struct cm_user *userp)
                     osi_panic("cm_IoctlSysName: no cm_sysNameList entry to write\n",
                                __FILE__, __LINE__);
                 t = strlen(cp);
-                strcpy(cm_sysNameList[count], cp);
+                StringCbCopyA(cm_sysNameList[count], MAXSYSNAME, cp);
                 cp += t + 1;
             }
         }
@@ -1248,7 +1249,7 @@ long cm_IoctlSysName(struct smb_ioctl *ioctlp, struct cm_user *userp)
         memcpy(cp, (char *)&foundname, sizeof(afs_int32));
         cp += sizeof(afs_int32);       /* skip found flag */
         if (foundname) {
-            strcpy(cp, outname);
+            StringCbCopyA(cp, 999999, outname);
             cp += strlen(outname) + 1; /* skip name and terminating null char */
             for ( count=1; count < foundname ; ++count) {   /* ... or list */
                 if ( !(*sysnamelist)[count] )
@@ -1258,7 +1259,7 @@ long cm_IoctlSysName(struct smb_ioctl *ioctlp, struct cm_user *userp)
                 if (t >= MAXSYSNAME)
                     osi_panic("cm_IoctlSysName: sysname entry garbled\n", 
                                __FILE__, __LINE__);
-                strcpy(cp, (*sysnamelist)[count]);
+                StringCbCopyA(cp, 999999, (*sysnamelist)[count]);
                 cp += t + 1;
             }
         }
@@ -1426,7 +1427,7 @@ long cm_IoctlStoreBehind(struct smb_ioctl *ioctlp, struct cm_user *userp)
 
 long cm_IoctlCreateMountPoint(struct smb_ioctl *ioctlp, struct cm_user *userp)
 {
-    char leaf[256];
+    char leaf[LEAF_SIZE];
     long code;
     cm_scache_t *dscp;
     cm_attr_t tattr;
@@ -1453,12 +1454,12 @@ long cm_IoctlCreateMountPoint(struct smb_ioctl *ioctlp, struct cm_user *userp)
      */
 
     /* Extract the possibly partial cell name */
-    strcpy(cell, ioctlp->inDatap + 1);      /* Skip the mp type character */
+    StringCbCopyA(cell, sizeof(cell), ioctlp->inDatap + 1);      /* Skip the mp type character */
         
     if (cp = strchr(cell, ':')) {
         /* Extract the volume name */
         *cp = 0;
-        strcpy(volume,  cp + 1);
+        StringCbCopyA(volume,  sizeof(volume), cp + 1);
        
         /* Get the full name for this cell */
         code = cm_SearchCellFile(cell, fullCell, 0, 0);
@@ -1469,10 +1470,10 @@ long cm_IoctlCreateMountPoint(struct smb_ioctl *ioctlp, struct cm_user *userp)
         if (code)
             return CM_ERROR_NOSUCHCELL;
        
-        sprintf(mpInfo, "%c%s:%s", *ioctlp->inDatap, fullCell, volume);
+        StringCbPrintfA(mpInfo, sizeof(mpInfo), "%c%s:%s", *ioctlp->inDatap, fullCell, volume);
     } else {
         /* No cell name specified */
-        strcpy(mpInfo, ioctlp->inDatap);
+        StringCbCopyA(mpInfo, sizeof(mpInfo), ioctlp->inDatap);
     }
 
 #ifdef AFS_FREELANCE_CLIENT
@@ -1504,7 +1505,7 @@ long cm_IoctlCreateMountPoint(struct smb_ioctl *ioctlp, struct cm_user *userp)
 
 long cm_IoctlSymlink(struct smb_ioctl *ioctlp, struct cm_user *userp)
 {
-    char leaf[256];
+    char leaf[LEAF_SIZE];
     long code;
     cm_scache_t *dscp;
     cm_attr_t tattr;
@@ -1596,11 +1597,11 @@ long cm_IoctlListlink(struct smb_ioctl *ioctlp, struct cm_user *userp)
     if (code == 0) {
         cp = ioctlp->outDatap;
         if (newRootScp != NULL) {
-            strcpy(cp, cm_mountRoot);
-            strcat(cp, "/");
+            StringCbCopyA(cp, 999999, cm_mountRoot);
+            StringCbCatA(cp, 999999, "/");
             cp += strlen(cp);
         }
-        strcpy(cp, spacep->data);
+        StringCbCopyA(cp, 999999, spacep->data);
         cp += strlen(cp) + 1;
         ioctlp->outDatap = cp;
         cm_FreeSpace(spacep);
@@ -1814,7 +1815,8 @@ long cm_IoctlSetToken(struct smb_ioctl *ioctlp, struct cm_user *userp)
     ucellp->kvno = ct.AuthHandle;
     ucellp->expirationTime = ct.EndTimestamp;
     ucellp->gen++;
-    if (uname) strcpy(ucellp->userName, uname);
+    if (uname) 
+        StringCbCopyA(ucellp->userName, MAXKTCNAMELEN, uname);
     ucellp->flags |= CM_UCELLFLAG_RXKAD;
     lock_ReleaseMutex(&userp->mx);
 
@@ -1900,11 +1902,11 @@ long cm_IoctlGetTokenIter(struct smb_ioctl *ioctlp, struct cm_user *userp)
     cp += sizeof(temp);
 
     /* cell name */
-    strcpy(cp, ucellp->cellp->namep);
+    StringCbCopyA(cp, 999999, ucellp->cellp->namep);
     cp += strlen(cp) + 1;
 
     /* user name */
-    strcpy(cp, ucellp->userName);
+    StringCbCopyA(cp, 999999, ucellp->userName);
     cp += strlen(cp) + 1;
 
     ioctlp->outDatap = cp;
@@ -1988,11 +1990,11 @@ long cm_IoctlGetToken(struct smb_ioctl *ioctlp, struct cm_user *userp)
     cp += sizeof(temp);
 
     /* cell name */
-    strcpy(cp, ucellp->cellp->namep);
+    StringCbCopyA(cp, 999999, ucellp->cellp->namep);
     cp += strlen(cp) + 1;
 
     /* user name */
-    strcpy(cp, ucellp->userName);
+    StringCbCopyA(cp, 999999, ucellp->userName);
     cp += strlen(cp) + 1;
 
     ioctlp->outDatap = cp;
@@ -2084,7 +2086,7 @@ long cm_IoctlMakeSubmount(smb_ioctl_t *ioctlp, cm_user_t *userp)
     /* Parse the input parameters--first the required afs path,
      * then the requested submount name (which may be "").
      */
-    cm_NormalizeAfsPath (afspath, ioctlp->inDatap);
+    cm_NormalizeAfsPath (afspath, sizeof(afspath), ioctlp->inDatap);
     submountreqp = ioctlp->inDatap + (strlen(ioctlp->inDatap)+1);
 
     /* If the caller supplied a suggested submount name, see if
@@ -2125,9 +2127,9 @@ long cm_IoctlMakeSubmount(smb_ioctl_t *ioctlp, cm_user_t *userp)
                            strlen(&afspath[strlen(cm_mountRoot)])+1:2);
 
             RegCloseKey( hkSubmounts );
-                       strcpy(ioctlp->outDatap, submountreqp);
-                       ioctlp->outDatap += strlen(ioctlp->outDatap) +1;
-                       lock_ReleaseMutex(&cm_Afsdsbmt_Lock);
+            StringCbCopyA(ioctlp->outDatap, 999999, submountreqp);
+            ioctlp->outDatap += strlen(ioctlp->outDatap) +1;
+            lock_ReleaseMutex(&cm_Afsdsbmt_Lock);
             return 0;
         }
 
@@ -2135,9 +2137,9 @@ long cm_IoctlMakeSubmount(smb_ioctl_t *ioctlp, cm_user_t *userp)
          * supplied path matches the submount's path, we can still
          * use the suggested submount name.
          */
-        cm_NormalizeAfsPath (submountPathNormalized, submountPath);
+        cm_NormalizeAfsPath (submountPathNormalized, sizeof(submountPathNormalized), submountPath);
         if (!strcmp (submountPathNormalized, afspath)) {
-            strcpy(ioctlp->outDatap, submountreqp);
+            StringCbCopyA(ioctlp->outDatap, 999999, submountreqp);
             ioctlp->outDatap += strlen(ioctlp->outDatap) +1;
             RegCloseKey( hkSubmounts );
             lock_ReleaseMutex(&cm_Afsdsbmt_Lock);
@@ -2204,9 +2206,9 @@ long cm_IoctlMakeSubmount(smb_ioctl_t *ioctlp, cm_user_t *userp)
          * that our caller specified. If so, we can return
          * this submount.
          */
-        cm_NormalizeAfsPath (submountPathNormalized, submountPath);
+        cm_NormalizeAfsPath (submountPathNormalized, sizeof(submountPathNormalized), submountPath);
         if (!strcmp (submountPathNormalized, afspath)) {
-            strcpy(ioctlp->outDatap, submountName);
+            StringCbCopyA(ioctlp->outDatap, 999999, submountName);
             ioctlp->outDatap += strlen(ioctlp->outDatap) +1;
             RegCloseKey(hkSubmounts);
             lock_ReleaseMutex(&cm_Afsdsbmt_Lock);
@@ -2221,7 +2223,7 @@ long cm_IoctlMakeSubmount(smb_ioctl_t *ioctlp, cm_user_t *userp)
      * when writing out the submount.
      */
 
-    sprintf(ioctlp->outDatap, "auto%ld", nextAutoSubmount);
+    StringCbPrintfA(ioctlp->outDatap, 999999, "auto%ld", nextAutoSubmount);
 
     RegSetValueEx( hkSubmounts, 
                    ioctlp->outDatap,
index cfd3c38..b5e2a76 100644 (file)
@@ -1007,8 +1007,6 @@ int cm_FindFileType(cm_fid_t *fidp)
     lock_ObtainWrite(&cm_scacheLock);
     for (scp=cm_hashTablep[hash]; scp; scp=scp->nextp) {
         if (cm_FidCmp(fidp, &scp->fid) == 0) {
-            /*scp->refCount++;*/
-            /*cm_AdjustLRU(scp);*/
             lock_ReleaseWrite(&cm_scacheLock);
             return scp->fileType;
         }
index c784a35..932b9b8 100644 (file)
@@ -39,123 +39,212 @@ void cm_InitVolume(void)
 
 /*
  * Update a volume.  Caller holds volume's lock (volp->mx).
+ *
+ *
+ *  shadow / openafs / jhutz@CS.CMU.EDU {ANDREW.CMU.EDU}  01:38    (JHutz)
+ *    Yes, we support multihomed fileservers.
+ *    Since before we got the code from IBM.
+ *    But to find out about multiple addresses on a multihomed server, you need
+ *    to use VL_GetEntryByNameU and VL_GetAddrsU.  If you use
+ *    VL_GetEntryByNameO or VL_GetEntryByNameN, the vlserver just gives you one
+ *    address per server.
+ *  shadow / openafs / jhutz@CS.CMU.EDU {ANDREW.CMU.EDU}  01:39    (JHutz)
+ *    see src/afs/afs_volume.c, paying particular attention to
+ *    afs_NewVolumeByName, afs_SetupVolume, and InstallUVolumeEntry
+ *  shadow / openafs / jaltman {ANDREW.CMU.EDU}  01:40    (Jeffrey Altman)
+ *    thanks.  The windows client calls the 0 versions.
+ *  shadow / openafs / jhutz@CS.CMU.EDU {ANDREW.CMU.EDU}  01:51    (JHutz)
+ *    Oh.  Ew.
+ *    By not using the N versions, you only get up to 8 sites instead of 13.
+ *    By not using the U versions, you don't get to know about multihomed serve
+ *  shadow / openafs / jhutz@CS.CMU.EDU {ANDREW.CMU.EDU}  01:52    (JHutz)
+ *    Of course, you probably want to support the older versions for backward
+ *    compatibility.  If you do that, you need to call the newest interface
+ *    first, and fall back to successively older versions if you get
+ *    RXGEN_OPCODE.
  */
 long cm_UpdateVolume(struct cm_cell *cellp, cm_user_t *userp, cm_req_t *reqp,
        cm_volume_t *volp)
 {
     cm_conn_t *connp;
     int i;
-       cm_serverRef_t *tsrp;
+    cm_serverRef_t *tsrp;
     cm_server_t *tsp;
     struct sockaddr_in tsockAddr;
     long tflags;
     u_long tempAddr;
-    struct vldbentry vldbEntry;        /* don't use NVLDB yet; they're not common */
-       int ROcount = 0;
-       long code;
+    struct vldbentry vldbEntry;
+    struct nvldbentry nvldbEntry;
+#ifdef MULTIHOMED
+    struct uvldbentry uvldbEntry;
+#endif
+    int type = -1;
+    int ROcount = 0;
+    long code;
 
-       /* clear out old bindings */
+    /* clear out old bindings */
     cm_FreeServerList(&volp->rwServersp);
     cm_FreeServerList(&volp->roServersp);
     cm_FreeServerList(&volp->bkServersp);
 
     /* now we have volume structure locked and held; make RPC to fill it */
     do {
-               code = cm_ConnByMServers(cellp->vlServersp, userp, reqp,
-                                  &connp);
-        if (code) continue;
-               osi_Log1(afsd_logp, "CALL VL_GetEntryByNameO name %s",
-                  volp->namep);
-        code = VL_GetEntryByNameO(connp->callp, volp->namep, &vldbEntry);
-       } while (cm_Analyze(connp, userp, reqp, NULL, NULL, cellp->vlServersp, NULL, code));
+        code = cm_ConnByMServers(cellp->vlServersp, userp, reqp, &connp);
+        if (code) 
+            continue;
+        osi_Log1(afsd_logp, "CALL VL_GetEntryByName{UNO} name %s", volp->namep);
+#ifdef MULTIHOMED
+        code = VL_GetEntryByNameU(connp->callp, volp->namep, &uvldbEntry);
+        if ( code == RXGEN_OPCODE ) 
+#endif
+        {
+            code = VL_GetEntryByNameN(connp->callp, volp->namep, &nvldbEntry);
+            type = 1;
+        }
+        if ( code == RXGEN_OPCODE ) {
+            code = VL_GetEntryByNameO(connp->callp, volp->namep, &vldbEntry);
+            type = 0;
+        }
+    } while (cm_Analyze(connp, userp, reqp, NULL, NULL, cellp->vlServersp, NULL, code));
     code = cm_MapVLRPCError(code, reqp);
 
     if (code == 0) {
-               /* decode the response */
-               lock_ObtainWrite(&cm_volumeLock);
-        if (vldbEntry.flags & VLF_RWEXISTS)
-            volp->rwID = vldbEntry.volumeId[0];
-               else
+        afs_int32 flags;
+        afs_int32 nServers;
+        afs_int32 rwID;
+        afs_int32 roID;
+        afs_int32 bkID;
+        afs_int32 serverNumber[NMAXNSERVERS];
+        afs_int32 serverFlags[NMAXNSERVERS];
+
+        switch ( type ) {
+        case 0:
+            flags = vldbEntry.flags;
+            nServers = vldbEntry.nServers;
+            rwID = vldbEntry.volumeId[0];
+            roID = vldbEntry.volumeId[1];
+            bkID = vldbEntry.volumeId[2];
+            for ( i=0; i<nServers; i++ ) {
+                serverFlags[i] = vldbEntry.serverFlags[i];
+                serverNumber[i] = vldbEntry.serverNumber[i];
+            }
+            break;
+        case 1:
+            flags = nvldbEntry.flags;
+            nServers = nvldbEntry.nServers;
+            rwID = nvldbEntry.volumeId[0];
+            roID = nvldbEntry.volumeId[1];
+            bkID = nvldbEntry.volumeId[2];
+            for ( i=0; i<nServers; i++ ) {
+                serverFlags[i] = nvldbEntry.serverFlags[i];
+                serverNumber[i] = nvldbEntry.serverNumber[i];
+            }
+            break;
+#ifdef MULTIHOMED
+        case 2:
+            flags = uvldbEntry.flags;
+            nServers = uvldbEntry.nServers;
+            rwID = uvldbEntry.volumeId[0];
+            roID = uvldbEntry.volumeId[1];
+            bkID = uvldbEntry.volumeId[2];
+            for ( i=0; i<nServers; i++ ) {
+                serverFlags[i] = uvldbEntry.serverFlags[i];
+                if ( !(flags & VLSERVER_FLAG_UUID) )
+                    serverNumber[i] = uvldbEntry.serverNumber[i].time_low;
+                else {
+                    /* see afs/afs_volume.c InstallUVolumeEntry().  We need to 
+                     * implement an equivalent to afs_FindServer() and afs_GetServer()
+                     * which support multiple addresses.
+                     */
+                }
+            }
+            break;
+#endif
+        }
+
+        /* decode the response */
+        lock_ObtainWrite(&cm_volumeLock);
+        if (flags & VLF_RWEXISTS)
+            volp->rwID = rwID;
+        else
             volp->rwID = 0;
-        if (vldbEntry.flags & VLF_ROEXISTS)
-            volp->roID = vldbEntry.volumeId[1];
+        if (flags & VLF_ROEXISTS)
+            volp->roID = roID;
         else
             volp->roID = 0;
-        if (vldbEntry.flags & VLF_BACKEXISTS)
-            volp->bkID = vldbEntry.volumeId[2];
-               else
+        if (flags & VLF_BACKEXISTS)
+            volp->bkID = bkID;
+        else
             volp->bkID = 0;
-               lock_ReleaseWrite(&cm_volumeLock);
-        for(i=0; i<vldbEntry.nServers; i++) {
-                       /* create a server entry */
-                       tflags = vldbEntry.serverFlags[i];
-                       if (tflags & VLSF_DONTUSE) continue;
-                       tsockAddr.sin_family = AF_INET;
-                       tempAddr = htonl(vldbEntry.serverNumber[i]);
-                       tsockAddr.sin_addr.s_addr = tempAddr;
-                       tsp = cm_FindServer(&tsockAddr, CM_SERVER_FILE);
-                       if (!tsp)
+        lock_ReleaseWrite(&cm_volumeLock);
+        for (i=0; i<nServers; i++) {
+            /* create a server entry */
+            tflags = serverFlags[i];
+            if (tflags & VLSF_DONTUSE) 
+                continue;
+            tsockAddr.sin_family = AF_INET;
+            tempAddr = htonl(serverNumber[i]);
+            tsockAddr.sin_addr.s_addr = tempAddr;
+            tsp = cm_FindServer(&tsockAddr, CM_SERVER_FILE);
+            if (!tsp)
                 tsp = cm_NewServer(&tsockAddr, CM_SERVER_FILE,
                                     cellp);
 
-                       /* if this server was created by fs setserverprefs */
-                       if ( !tsp->cellp ) 
-                               tsp->cellp = cellp;
+            /* if this server was created by fs setserverprefs */
+            if ( !tsp->cellp ) 
+                tsp->cellp = cellp;
 
             osi_assert(tsp != NULL);
                         
             /* and add it to the list(s). */
-                       /*
+            /*
              * Each call to cm_NewServerRef() increments the
              * ref count of tsp.  These reference will be dropped,
-                        * if and when the volume is reset; see reset code
-                        * earlier in this function.
-                        */
-                       if ((tflags & VLSF_RWVOL)
-                 && (vldbEntry.flags & VLF_RWEXISTS)) {
-                               tsrp = cm_NewServerRef(tsp);
+             * if and when the volume is reset; see reset code
+             * earlier in this function.
+             */
+            if ((tflags & VLSF_RWVOL) && (flags & VLF_RWEXISTS)) {
+                tsrp = cm_NewServerRef(tsp);
                 cm_InsertServerList(&volp->rwServersp, tsrp);
                 lock_ObtainWrite(&cm_serverLock);
                 tsrp->refCount--;       /* drop allocation reference */
                 lock_ReleaseWrite(&cm_serverLock);
-                       }
-            if ((tflags & VLSF_ROVOL)
-                 && (vldbEntry.flags & VLF_ROEXISTS)) {
-                               tsrp = cm_NewServerRef(tsp);
-                               cm_InsertServerList(&volp->roServersp, tsrp);
+            }
+            if ((tflags & VLSF_ROVOL) && (flags & VLF_ROEXISTS)) {
+                tsrp = cm_NewServerRef(tsp);
+                cm_InsertServerList(&volp->roServersp, tsrp);
                 lock_ObtainWrite(&cm_serverLock);
                 tsrp->refCount--;       /* drop allocation reference */
                 lock_ReleaseWrite(&cm_serverLock);
-                               ROcount++;
+                ROcount++;
             }
-                       /* We don't use VLSF_BACKVOL !?! */
-            if ((tflags & VLSF_RWVOL)
-                 && (vldbEntry.flags & VLF_BACKEXISTS)) {
-                               tsrp = cm_NewServerRef(tsp);
+            /* We don't use VLSF_BACKVOL !?! */
+            if ((tflags & VLSF_RWVOL) && (flags & VLF_BACKEXISTS)) {
+                tsrp = cm_NewServerRef(tsp);
                 cm_InsertServerList(&volp->bkServersp, tsrp);
                 lock_ObtainWrite(&cm_serverLock);
                 tsrp->refCount--;       /* drop allocation reference */
                 lock_ReleaseWrite(&cm_serverLock);
-                       }
-                       /* Drop the reference obtained by cm_FindServer() */
-                       cm_PutServer(tsp);
+            }
+            /* Drop the reference obtained by cm_FindServer() */
+            cm_PutServer(tsp);
+        }       
+
+        /*
+         * Randomize RO list
+         *
+         * If the first n servers have the same ipRank, then we 
+         * randomly pick one among them and move it to the beginning.
+         * We don't bother to re-order the whole list because
+         * the rest of the list is used only if the first server is
+         * down.  We only do this for the RO list; we assume the other
+         * lists are length 1.
+         */
+        if (ROcount > 1) {
+            cm_RandomizeServer(&volp->roServersp);
         }
-
-               /*
-                * Randomize RO list
-                *
-                * If the first n servers have the same ipRank, then we 
-                * randomly pick one among them and move it to the beginning.
-                * We don't bother to re-order the whole list because
-                * the rest of the list is used only if the first server is
-                * down.  We only do this for the RO list; we assume the other
-                * lists are length 1.
-                */
-               if (ROcount > 1) {
-                       cm_RandomizeServer(&volp->roServersp);
-               }
-       }
-       return code;
+    }
+    return code;
 }
 
 long cm_GetVolumeByID(cm_cell_t *cellp, long volumeID, cm_user_t *userp,
index 980da2c..50df833 100644 (file)
@@ -21,7 +21,6 @@
 #include <string.h>
 #include <stdio.h>
 #include <time.h>
-
 #include <osi.h>
 
 #include "afsd.h"
index ff568ca..47312c9 100644 (file)
@@ -446,7 +446,7 @@ int GetDefaultCell (LPTSTR pszCell)
     }
     else if (IsServiceRunning())
     {
-        char szCellA[ 256 ] = "";
+        char szCellA[ cchRESOURCE ] = "";
         int rc;
         HKEY hk;
 
@@ -463,8 +463,8 @@ int GetDefaultCell (LPTSTR pszCell)
         } else {
             rc = 0;
         }
-               if (rc == 0)
-                       CopyAnsiToString(pszCell, szCellA);
+        if (rc == 0)
+            CopyAnsiToString(pszCell, szCellA);
     }
     return rc;
 }
index 2ab0949..d9ac53e 100644 (file)
@@ -389,6 +389,10 @@ void NewCreds_OnCancel (HWND hDlg)
        pszCell = (LPTSTR)GetWindowLong (hDlg, DWL_USER);
    if (pszCell)
       {
+      HWND hTab = GetDlgItem (g.hMain, IDC_TABS);
+      LPTSTR pszTab = (LPTSTR)GetTabParam (hTab, TabCtrl_GetCurSel(hTab));
+      HWND hChildDlg = NULL;
+
       lock_ObtainMutex(&g.credsLock);
       for (size_t iCreds = 0; iCreds < g.cCreds; ++iCreds)
          {
@@ -399,17 +403,16 @@ void NewCreds_OnCancel (HWND hDlg)
 
             // Check the active tab, and fix its checkbox if necessary
             //
-            HWND hTab = GetDlgItem (g.hMain, IDC_TABS);
-            LPTSTR pszTab = (LPTSTR)GetTabParam (hTab, TabCtrl_GetCurSel(hTab));
             if (pszTab && HIWORD(pszTab) && (!lstrcmpi (pszTab, pszCell)))
                {
-               HWND hDlg = GetTabChild (hTab);
-               if (hDlg)
-                  CheckDlgButton (hDlg, IDC_CREDS_REMIND, FALSE);
+               hChildDlg = GetTabChild (hTab);
                }
             }
          }
       lock_ReleaseMutex(&g.credsLock);
-      }
+
+      if (hChildDlg)
+         CheckDlgButton (hChildDlg, IDC_CREDS_REMIND, FALSE);
+         }
 }