]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
STABLE14-pr_init-fix-20050623
authorJeffrey Altman <jaltman@secure-endpoints.com>
Mon, 11 Jul 2005 20:03:09 +0000 (20:03 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Mon, 11 Jul 2005 20:03:09 +0000 (20:03 +0000)
remove the pr_Initialize force cell change hack from afskfw lib

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

(cherry picked from commit c4b1decf6caacb13db666f516ceaf9b65e4371ab)

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

index 9b37eb882547db6e51a969825bc2c1f48977b0b1..5bb3b0264a3eb280f765de3e8ffb9c1dca45e600 100644 (file)
@@ -196,6 +196,28 @@ 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
+    * 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';
+        }
+    }
+#endif
+
     strcpy(lastcell, aserver->cell);
 
        if (!pr_Initialize (0, confname, aserver->cell)) {
@@ -257,6 +279,13 @@ void ViceIDToUsername(char *username, char *realm_of_user, char *realm_of_cell,
                 return ;
             }
 
+            /*
+             * 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))) {
                 printf("Error %d\n", status);
                 return;
index 8bab3b12812ea0cb0ef27522c609e665c26be75e..709de2037174b512ec688744c894099a6ab6509d 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 3d6d11a2e8db616adfaeccc0b17eb1494d0c1272..e33e84932dac40e6eee574f1626875daeea64a91 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);