DEVEL15-windows-cell-aliases-20071228
authorJeffrey Altman <jaltman@secure-endpoints.com>
Fri, 28 Dec 2007 07:13:15 +0000 (07:13 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Fri, 28 Dec 2007 07:13:15 +0000 (07:13 +0000)
LICENSE MIT

Fix the lookup of cell aliases to:

1. avoid re-reading CellServDB each time a cell alias is specified
2. avoid reconstructing the vlserver list for the cell each time an
   alias is specified
3. permit aliases to be used when AFSDB records were used previously
   with the full cell name

(cherry picked from commit d942d97ed82b9f4b86fdea8443912ec64b28dd96)

src/WINNT/afsd/cm_cell.c

index 57b4503..b3d3c40 100644 (file)
@@ -30,7 +30,7 @@ osi_rwlock_t cm_cellLock;
  *
  * At the present time the return value is ignored by the caller.
  */
-long cm_AddCellProc(void *rockp, struct sockaddr_in *addrp, char *namep)
+long cm_AddCellProc(void *rockp, struct sockaddr_in *addrp, char *hostnamep)
 {
     cm_server_t *tsp;
     cm_serverRef_t *tsrp;
@@ -44,8 +44,10 @@ long cm_AddCellProc(void *rockp, struct sockaddr_in *addrp, char *namep)
         if ( !tsp->cellp )
             tsp->cellp = cellp;
         else if (tsp->cellp != cellp) {
-            osi_Log2(afsd_logp, "found a vlserver associated with two cell names %s and %s",
-                     osi_LogSaveString(afsd_logp,tsp->cellp->name), osi_LogSaveString(afsd_logp,cellp->name));
+            osi_Log3(afsd_logp, "found a vlserver %s associated with two cells named %s and %s",
+                     osi_LogSaveString(afsd_logp,hostnamep),
+                     osi_LogSaveString(afsd_logp,tsp->cellp->name), 
+                     osi_LogSaveString(afsd_logp,cellp->name));
         }
     }       
     else
@@ -146,8 +148,18 @@ cm_cell_t *cm_GetCell_Gen(char *namep, char *newnamep, afs_uint32 flags)
             strcpy(fullname, cp->name);
             break;
         }
-    }   
-    lock_ReleaseRead(&cm_cellLock);    
+    }
+
+    if (!cp) {
+        for (cp = cm_data.allCellsp; cp; cp=cp->allNextp) {
+            if (strnicmp(namep, cp->name, strlen(namep)) == 0) {
+                strcpy(fullname, cp->name);
+                break;
+            }
+        }   
+    }
+
+    lock_ReleaseRead(&cm_cellLock);
 
     if (cp) {
         cm_UpdateCell(cp);
@@ -168,6 +180,16 @@ cm_cell_t *cm_GetCell_Gen(char *namep, char *newnamep, afs_uint32 flags)
         if (cp)
             goto done;
 
+        for (cp = cm_data.allCellsp; cp; cp=cp->allNextp) {
+            if (strnicmp(namep, cp->name, strlen(namep)) == 0) {
+                strcpy(fullname, cp->name);
+                break;
+            }
+        }   
+
+        if (cp)
+            goto done;
+
         if ( cm_data.currentCells >= cm_data.maxCells )
             osi_panic("Exceeded Max Cells", __FILE__, __LINE__);