windows-cell-aliases-20071228
authorJeffrey Altman <jaltman@secure-endpoints.com>
Fri, 28 Dec 2007 07:11:59 +0000 (07:11 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Fri, 28 Dec 2007 07:11:59 +0000 (07:11 +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

src/WINNT/afsd/cm_cell.c

index 3904b15..d8ab12d 100644 (file)
@@ -28,7 +28,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;
@@ -42,8 +42,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
@@ -144,8 +146,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);
@@ -166,6 +178,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__);