Windows: Fix usage of cm_FreeServerList
[openafs.git] / src / WINNT / afsd / cm_cell.c
index 7c3f74c..317cd73 100644 (file)
@@ -18,6 +18,8 @@
 #include <malloc.h>
 #include <osi.h>
 #include <string.h>
+#define STRSAFE_NO_DEPRECATE
+#include <strsafe.h>
 
 #include "afsd.h"
 
@@ -54,7 +56,8 @@ long cm_AddCellProc(void *rockp, struct sockaddr_in *addrp, char *hostnamep, uns
     else
         tsp = cm_NewServer(addrp, CM_SERVER_VLDB, cellp, NULL, probe ? 0 : CM_FLAG_NOPROBE);
 
-    tsp->ipRank = ipRank;
+    if (ipRank)
+        tsp->ipRank = ipRank;
 
     /* Insert the vlserver into a sorted list, sorted by server rank */
     tsrp = cm_NewServerRef(tsp, 0);
@@ -75,29 +78,28 @@ cm_cell_t *cm_UpdateCell(cm_cell_t * cp, afs_uint32 flags)
 {
     long code = 0;
     cm_cell_rock_t rock;
+    afs_uint32 mxheld = 0;
 
     if (cp == NULL)
         return NULL;
 
     lock_ObtainMutex(&cp->mx);
+    mxheld = 1;
     if ((cp->vlServersp == NULL 
 #ifdef AFS_FREELANCE_CLIENT
           && !(cp->flags & CM_CELLFLAG_FREELANCE)
 #endif
           ) || (time(0) > cp->timeout)
-#ifdef AFS_AFSDB_ENV
         || (cm_dnsEnabled && (cp->flags & CM_CELLFLAG_DNS) &&
          ((cp->flags & CM_CELLFLAG_VLSERVER_INVALID)))
-#endif
             ) 
     {
         lock_ReleaseMutex(&cp->mx);
+        mxheld = 0;
 
         /* must empty cp->vlServersp */
-        if (cp->vlServersp) {
+        if (cp->vlServersp)
             cm_FreeServerList(&cp->vlServersp, CM_FREESERVERLIST_DELETE);
-            cp->vlServersp = NULL;
-        }
 
         rock.cellp = cp;
         rock.flags = flags;
@@ -106,10 +108,9 @@ cm_cell_t *cm_UpdateCell(cm_cell_t * cp, afs_uint32 flags)
             code = cm_SearchCellFileEx(cp->name, NULL, cp->linkedName, cm_AddCellProc, &rock);
         if (code == 0) {
             lock_ObtainMutex(&cp->mx);
+            mxheld = 1;
            cp->timeout = time(0) + 7200;
-            lock_ReleaseMutex(&cp->mx);
         }
-#ifdef AFS_AFSDB_ENV
         else {
             if (cm_dnsEnabled) {
                 int ttl;
@@ -117,10 +118,10 @@ cm_cell_t *cm_UpdateCell(cm_cell_t * cp, afs_uint32 flags)
                 code = cm_SearchCellByDNS(cp->name, NULL, &ttl, cm_AddCellProc, &rock);
                 if (code == 0) {   /* got cell from DNS */
                     lock_ObtainMutex(&cp->mx);
+                    mxheld = 1;
                     cp->flags |= CM_CELLFLAG_DNS;
                     cp->flags &= ~CM_CELLFLAG_VLSERVER_INVALID;
                    cp->timeout = time(0) + ttl;
-                    lock_ReleaseMutex(&cp->mx);
 #ifdef DEBUG
                     fprintf(stderr, "cell %s: ttl=%d\n", cp->name, ttl);
 #endif
@@ -129,15 +130,19 @@ cm_cell_t *cm_UpdateCell(cm_cell_t * cp, afs_uint32 flags)
                      * current entry alone 
                     */
                     lock_ObtainMutex(&cp->mx);
+                    mxheld = 1;
                     cp->flags |= CM_CELLFLAG_VLSERVER_INVALID;
-                    lock_ReleaseMutex(&cp->mx);
                 }
            }
        }
-#endif /* AFS_AFSDB_ENV */
-    } else {
-        lock_ReleaseMutex(&cp->mx);
     }
+
+    if (code == 0)
+        cm_RandomizeServer(&cp->vlServersp);
+
+    if (mxheld)
+        lock_ReleaseMutex(&cp->mx);
+
     return code ? NULL : cp;
 }
 
@@ -172,7 +177,7 @@ cm_cell_t *cm_GetCell_Gen(char *namep, char *newnamep, afs_uint32 flags)
     cm_cell_rock_t rock;
     size_t len;
 
-    if (namep == NULL || !namep[0] || !strcmp(namep,SMB_IOCTL_FILENAME_NOSLASH))
+    if (namep == NULL || !namep[0] || !strcmp(namep,CM_IOCTL_FILENAME_NOSLASH))
         return NULL;
 
     /* 
@@ -287,7 +292,6 @@ cm_cell_t *cm_GetCell_Gen(char *namep, char *newnamep, afs_uint32 flags)
                       osi_LogSaveString(afsd_logp,namep), code, osi_LogSaveString(afsd_logp,fullname),
                       osi_LogSaveString(afsd_logp,linkedName));
 
-#ifdef AFS_AFSDB_ENV
             if (cm_dnsEnabled) {
                 int ttl;
 
@@ -313,7 +317,6 @@ cm_cell_t *cm_GetCell_Gen(char *namep, char *newnamep, afs_uint32 flags)
                 }
             } 
             else 
-#endif
             {
                 lock_ObtainMutex(&cp->mx);
                 lock_ObtainWrite(&cm_cellLock);