From: Jeffrey Altman Date: Thu, 23 Jun 2005 15:23:50 +0000 (+0000) Subject: pr_init-fix-20050623 X-Git-Tag: openafs-devel-1_5_0~479 X-Git-Url: http://git.openafs.org/?p=openafs.git;a=commitdiff_plain;h=c4b1decf6caacb13db666f516ceaf9b65e4371ab pr_init-fix-20050623 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 --- diff --git a/src/WINNT/afsd/afskfw.c b/src/WINNT/afsd/afskfw.c index d86ad7a..a7b78ab 100644 --- a/src/WINNT/afsd/afskfw.c +++ b/src/WINNT/afsd/afskfw.c @@ -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)) diff --git a/src/WINNT/aklog/aklog.c b/src/WINNT/aklog/aklog.c index 8af991d..efce84c 100644 --- a/src/WINNT/aklog/aklog.c +++ b/src/WINNT/aklog/aklog.c @@ -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); diff --git a/src/aklog/aklog_main.c b/src/aklog/aklog_main.c index 8bab3b1..709de20 100644 --- a/src/aklog/aklog_main.c +++ b/src/aklog/aklog_main.c @@ -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)) diff --git a/src/ptserver/ptuser.c b/src/ptserver/ptuser.c index 3d6d11a..e33e849 100644 --- a/src/ptserver/ptuser.c +++ b/src/ptserver/ptuser.c @@ -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);