pr_init-fix-20050623
authorJeffrey Altman <jaltman@secure-endpoints.com>
Thu, 23 Jun 2005 15:23:50 +0000 (15:23 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Thu, 23 Jun 2005 15:23:50 +0000 (15:23 +0000)
for the longest time aklog implementations with automatic pts registration
have included a work around for a bug in pr_Initialize.  The bug fails to
reset the connection when the cell changes.  This patch fixes that bug.

====================
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.
====================

for the longest time aklog implementations with automatic pts registration
have included a work around for a bug in pr_Initialize.  The bug fails to
reset the connection when the cell changes.  pr_Initialize has been fixed
so we can remove the hack.

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

remove the pr_Initialize force cell change hack from afskfw lib

src/WINNT/afsd/afskfw.c
src/WINNT/aklog/aklog.c
src/aklog/aklog_main.c
src/ptserver/ptuser.c

index d86ad7a..a7b78ab 100644 (file)
@@ -2542,26 +2542,6 @@ ViceIDToUsername(char *username,
         confname[sizeof(confname) - 2] = '\0';
     }
 
-    /*
-     * Talk about DUMB!  It turns out that there is a bug in
-     * pr_Initialize -- even if you give a different cell name
-     * to it, it still uses a connection to a previous AFS server
-     * if one exists.  The way to fix this is to change the
-     * _filename_ argument to pr_Initialize - that forces it to
-     * re-initialize the connection.  We do this by adding and
-     * removing a "/" on the end of the configuration directory name.
-     */
-
-    if (lastcell[0] != '\0' && (strcmp(lastcell, aserver->cell) != 0)) {
-        int i = strlen(confname);
-        if (confname[i - 1] == '/') {
-            confname[i - 1] = '\0';
-        } else {
-            confname[i] = '/';
-            confname[i + 1] = '\0';
-        }
-    }
-
     strcpy(lastcell, aserver->cell);
 
     if (!pr_Initialize (0, confname, aserver->cell))
@@ -2602,14 +2582,6 @@ ViceIDToUsername(char *username,
             strncpy(aclient->cell, realm_of_user, MAXKTCREALMLEN - 1);
             if (status = ktc_SetToken(aserver, atoken, aclient, 0))
                 return status;
-
-            /*                                    
-             * In case you're wondering, we don't need to change the
-             * filename here because we're still connecting to the
-             * same cell -- we're just using a different authentication
-             * level
-             */
-
             if (status = pr_Initialize(1L, confname, aserver->cell))
                 return status;
             if (status = pr_CreateUser(username, &id))
index 8af991d..efce84c 100644 (file)
@@ -196,6 +196,7 @@ void ViceIDToUsername(char *username, char *realm_of_user, char *realm_of_cell,
     if (dflag)
         printf("About to resolve name %s to id\n", username);
 
+#ifdef COMMENT
     /*
     * Talk about DUMB!  It turns out that there is a bug in
     * pr_Initialize -- even if you give a different cell name
@@ -215,6 +216,7 @@ void ViceIDToUsername(char *username, char *realm_of_user, char *realm_of_cell,
             confname[i + 1] = '\0';
         }
     }
+#endif
 
     strcpy(lastcell, aserver->cell);
 
index 8bab3b1..709de20 100644 (file)
@@ -694,26 +694,6 @@ static int auth_to_cell(context, cell, realm)
                params.pstdout(msgbuf);
            }
 
-           /*
-            * Talk about DUMB!  It turns out that there is a bug in
-            * pr_Initialize -- even if you give a different cell name
-            * to it, it still uses a connection to a previous AFS server
-            * if one exists.  The way to fix this is to change the
-            * _filename_ argument to pr_Initialize - that forces it to
-            * re-initialize the connection.  We do this by adding and
-            * removing a "/" on the end of the configuration directory name.
-            */
-
-           if (lastcell[0] != '\0' && (strcmp(lastcell, aserver.cell) != 0)) {
-               int i = strlen(confname);
-               if (confname[i - 1] == '/') {
-                   confname[i - 1] = '\0';
-               } else {
-                   confname[i] = '/';
-                   confname[i + 1] = '\0';
-               }
-           }
-
            strcpy(lastcell, aserver.cell);
 
            if (!pr_Initialize (0, confname, aserver.cell, 0))
index 3d6d11a..e33e849 100644 (file)
@@ -73,6 +73,7 @@ pr_Initialize(IN afs_int32 secLevel, IN char *confDir, IN char *cell)
     struct rx_securityClass *sc[3];
     static struct afsconf_dir *tdir = 0;       /* only do this once */
     static char tconfDir[100];
+    static char tcell[64];
     struct ktc_token ttoken;
     afs_int32 scIndex;
     static struct afsconf_cell info;
@@ -84,7 +85,24 @@ pr_Initialize(IN afs_int32 secLevel, IN char *confDir, IN char *cell)
     initialize_ACFG_error_table();
     initialize_KTC_error_table();
 
-    if (strcmp(confDir, tconfDir)) {
+#if defined(UKERNEL)
+    if (!cell) {
+        cell = afs_LclCellName;
+    }
+#else /* defined(UKERNEL) */
+    if (!cell) {
+        code = afsconf_GetLocalCell(tdir, cellstr, sizeof(cellstr));
+        if (code) {
+            fprintf(stderr,
+                     "vos: can't get local cell name - check %s/%s\n",
+                     confDir, AFSDIR_THISCELL_FILE);
+            exit(1);
+        }
+        cell = cellstr;
+    }
+#endif /* defined(UKERNEL) */
+
+    if (strcmp(confDir, tconfDir) || strcmp(cell, tcell)) {
        /*
         * Different conf dir; force re-evaluation.
         */
@@ -93,13 +111,13 @@ pr_Initialize(IN afs_int32 secLevel, IN char *confDir, IN char *cell)
        tdir = (struct afsconf_dir *)0;
        pruclient = (struct ubik_client *)0;
     }
+
     if (tdir == 0) {
        strncpy(tconfDir, confDir, sizeof(tconfDir));
+        strncpy(tcell, cell, sizeof(tcell));
+
 #if defined(UKERNEL)
        tdir = afs_cdir;
-       if (!cell) {
-           cell = afs_LclCellName;
-       }
 #else /* defined(UKERNEL) */
        tdir = afsconf_Open(confDir);
        if (!tdir) {
@@ -109,17 +127,6 @@ pr_Initialize(IN afs_int32 secLevel, IN char *confDir, IN char *cell)
                        confDir);
            return -1;
        }
-
-       if (!cell) {
-           code = afsconf_GetLocalCell(tdir, cellstr, sizeof(cellstr));
-           if (code) {
-               fprintf(stderr,
-                       "vos: can't get local cell name - check %s/%s\n",
-                       confDir, AFSDIR_THISCELL_FILE);
-               exit(1);
-           }
-           cell = cellstr;
-       }
 #endif /* defined(UKERNEL) */
 
        code = afsconf_GetCellInfo(tdir, cell, "afsprot", &info);