X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=nss_afs.c;h=e05f53aa2e46336e7d692fa24dd9cc9910e23ea6;hb=b114bb36917dc761ef3817c3d2223f4b807312d9;hp=2d6eaf418a688b2fe9f9c1a48105cf120fc451b2;hpb=abfd757bc51a9d7befdf1a0da59ba568af87b071;p=libnss-afs.git diff --git a/nss_afs.c b/nss_afs.c index 2d6eaf4..e05f53a 100644 --- a/nss_afs.c +++ b/nss_afs.c @@ -52,6 +52,7 @@ #include #include #include +#include #include #include #include @@ -87,6 +88,7 @@ extern struct ubik_client *pruclient; int afs_initialized = 0; char cellname[MAXCELLNAMELEN]; char homedir_prefix[MAXPATHLEN]; +char cell_root[MAXPATHLEN]; int homedir_prefix_len=0; char homedirs_method=0; char shells_method=0; @@ -193,9 +195,14 @@ enum nss_status ptsname2id(char *name, uid_t* uid) { int init_afs() { FILE *thiscell; int len; + struct stat statbuf; - if (afs_initialized) return 0; - + if (afs_initialized) { + /* wait until /afs/@cell/ appears as a proxy for "the network is up" */ + if (stat(cell_root, &statbuf)) return -1; + return 0; + } + if (pthread_mutex_lock(&mutex)) return -1; do { homedirs_method=HOMEDIR_PREFIX; @@ -219,9 +226,17 @@ int init_afs() { if (cellname[len-1] == '\n') len--; cellname[len]='\0'; + + /* wait until /afs/@cell/ appears as a proxy for "the network is up" */ + sprintf(cell_root,"/afs/%s/",cellname); + if (stat(cell_root, &statbuf)) break; + sprintf(homedir_prefix,"/afs/%s/user/",cellname); homedir_prefix_len=strlen(homedir_prefix); - + + /* time out requests after 5 seconds to avoid hanging things */ + rx_SetRxDeadTime(5); + if (pr_Initialize(0L,AFSDIR_CLIENT_ETC_DIRPATH, 0)) break; afs_initialized = 1; @@ -390,6 +405,14 @@ enum nss_status fill_result_buf(uid_t uid, result_buf->pw_shell = buffer; if ( get_shell(result_buf->pw_name,&buffer,&buflen) ) break; +#ifdef LIMIT_USERNAME_CHARS + if ( strlen(result_buf->pw_name) > LIMIT_USERNAME_CHARS ) { + result_buf->pw_name[LIMIT_USERNAME_CHARS] = '\0'; + buflen = buflen + ( buffer - &result_buf->pw_name[LIMIT_USERNAME_CHARS+1] ); + buffer = &result_buf->pw_name[LIMIT_USERNAME_CHARS+1]; + } +#endif + *errnop = errno; return NSS_STATUS_SUCCESS; } while(0); @@ -421,14 +444,6 @@ enum nss_status _nss_afs_getpwuid_r (uid_t uid, return temp; } -#ifdef LIMIT_USERNAME_CHARS - if ( strlen(result_buf->pw_name) > LIMIT_USERNAME_CHARS ) { - result_buf->pw_name[LIMIT_USERNAME_CHARS] = '\0'; - buflen = buflen + ( buffer - &result_buf->pw_name[LIMIT_USERNAME_CHARS+1] ); - buffer = &result_buf->pw_name[LIMIT_USERNAME_CHARS+1]; - } -#endif - return fill_result_buf(uid, name, result_buf, buffer, buflen, errnop); }