dynroot-allow-cell-aliases-20011101
[openafs.git] / src / auth / cellconfig.c
index cf40e41..8e299f4 100644 (file)
@@ -357,6 +357,7 @@ char clones[];
     FILE *tf;
     register char *tp, *bp;
     register struct afsconf_entry *curEntry;
+    struct afsconf_aliasentry *curAlias;
     register afs_int32 code;
     afs_int32 i;
     char tbuffer[256], tbuf1[256];
@@ -469,7 +470,44 @@ char clones[];
        curEntry->next = adir->entries;
        adir->entries = curEntry;
     }
-    
+
+    /* Read in the alias list */
+    strcompose(tbuffer, 256, adir->name, "/", AFSDIR_CELLALIAS_FILE, NULL);
+
+    tf = fopen(tbuffer, "r");
+    while (tf) {
+       char *aliasPtr;
+
+       tp = fgets(tbuffer, sizeof(tbuffer), tf);
+       if (!tp) break;
+       TrimLine(tbuffer);  /* remove white space */
+
+       if (tbuffer[0] == '\0' ||
+           tbuffer[0] == '\n' ||
+           tbuffer[0] == '#') continue;        /* empty line */
+
+       tp = tbuffer;
+       while (tp[0] != '\0' && tp[0] != ' ' && tp[0] != '\t') tp++;
+       if (tp[0] == '\0') continue;            /* invalid line */
+
+       while (tp[0] != '\0' && (tp[0] == ' ' || tp[0] == '\t')) 0[tp++] = '\0';
+       if (tp[0] == '\0') continue;            /* invalid line */
+
+       aliasPtr = tp;
+       while (tp[0] != '\0' && tp[0] != ' ' && tp[0] != '\t' &&
+              tp[0] != '\r' && tp[0] != '\n') tp++;
+       tp[0] = '\0';
+
+       curAlias = malloc(sizeof(*curAlias));
+       memset(curAlias, 0, sizeof(*curAlias));
+
+       strcpy(curAlias->aliasInfo.aliasName, aliasPtr);
+       strcpy(curAlias->aliasInfo.realName, tbuffer);
+
+       curAlias->next = adir->alias_entries;
+       adir->alias_entries = curAlias;
+    }
+
     /* now read the fs keys, if possible */
     adir->keystr = (struct afsconf_keys *) 0;
     afsconf_IntGetKeys(adir);
@@ -545,6 +583,28 @@ char *arock; {
     return 0;
 }
 
+/* call aproc(entry, arock, adir) for all cell aliases.
+ * Proc must return 0, or we'll stop early and return the code it returns
+ */
+afsconf_CellAliasApply(adir, aproc, arock)
+    struct afsconf_dir *adir;
+    int (*aproc)();
+    char *arock;
+{
+    register struct afsconf_aliasentry *tde;
+    register afs_int32 code;
+    LOCK_GLOBAL_MUTEX
+    for(tde=adir->alias_entries; tde; tde=tde->next) {
+       code = (*aproc)(&tde->aliasInfo, arock, adir);
+       if (code) {
+           UNLOCK_GLOBAL_MUTEX
+           return code;
+       }
+    }
+    UNLOCK_GLOBAL_MUTEX
+    return 0;
+}
+
 afs_int32 afsconf_SawCell = 0;
 
 afsconf_GetExtendedCellInfo(adir, acellName, aservice, acellInfo, clones)
@@ -734,6 +794,7 @@ char *aservice;
 char *acellName;
 struct afsconf_cell *acellInfo; {
     register struct afsconf_entry *tce;
+    struct afsconf_aliasentry *tcae;
     struct afsconf_entry *bestce;
     register afs_int32 i;
     int tservice;
@@ -765,6 +826,15 @@ struct afsconf_cell *acellInfo; {
        UNLOCK_GLOBAL_MUTEX
        return 0;
     }
+
+    /* Look through the list of aliases */
+    for (tcae = adir->alias_entries; tcae; tcae = tcae->next) {
+       if (strcasecmp(tcae->aliasInfo.aliasName, tcell) == 0) {
+           tcell = tcae->aliasInfo.realName;
+           break;
+       }
+    }
+
     for(tce=adir->entries;tce;tce=tce->next) {
        if (strcasecmp(tce->cellInfo.name, tcell) == 0) {
            /* found our cell */
@@ -797,7 +867,7 @@ struct afsconf_cell *acellInfo; {
     else {
        UNLOCK_GLOBAL_MUTEX
 #ifdef AFS_AFSDB_ENV
-       return afsconf_GetAfsdbInfo(acellName, aservice, acellInfo);
+       return afsconf_GetAfsdbInfo(tcell, aservice, acellInfo);
 #else
        return AFSCONF_NOTFOUND;
 #endif /* AFS_AFSDB_ENV */