X-Git-Url: https://git.hcoop.net/hcoop/debian/libnss-afs.git/blobdiff_plain/abfd757bc51a9d7befdf1a0da59ba568af87b071..HEAD:/nss_afs.c diff --git a/nss_afs.c b/nss_afs.c index 2d6eaf4..a9326d4 100644 --- a/nss_afs.c +++ b/nss_afs.c @@ -40,6 +40,7 @@ #include #include #include +#include #include #include #include @@ -52,16 +53,17 @@ #include #include #include +#include #include #include #include -#include #include #include #include #include #include #include +#include #include #define HOMEDIR_AUTO 0 @@ -86,11 +88,14 @@ extern struct ubik_client *pruclient; int afs_initialized = 0; char cellname[MAXCELLNAMELEN]; -char homedir_prefix[MAXPATHLEN]; +char homedir_prefix[PATH_MAX]; +char cell_root[PATH_MAX]; int homedir_prefix_len=0; char homedirs_method=0; char shells_method=0; +int init_afs (); + /** * The cpstr() function copies a null-terminated string from str* * (the first argument) into buf and updates both buf and buflen. If @@ -109,12 +114,12 @@ int cpstr( char *str, char **buf, size_t *buflen) { /** * Look up the name corresponding to uid, store in buffer. */ -enum nss_status ptsid2name(int uid, char **buffer, int *buflen) { +enum nss_status ptsid2name(int uid, char **buffer, size_t *buflen) { int ret, i; idlist lid; namelist lnames; - init_afs(); + if (init_afs()) return NSS_STATUS_UNAVAIL; if (uid==AFS_MAGIC_ANONYMOUS_USERID) { if (!cpstr("anonymous", buffer, buflen)) return NSS_STATUS_UNAVAIL; @@ -128,7 +133,8 @@ enum nss_status ptsid2name(int uid, char **buffer, int *buflen) { lnames.namelist_val = 0; lnames.namelist_len = 0; - if (ubik_Call(PR_IDToName,pruclient,0,&lid,&lnames) != PRSUCCESS) { + if (ubik_PR_IDToName(pruclient,0,&lid,&lnames) != PRSUCCESS) { + perror("ubik_Call() in ptsid2name() failed\n"); pthread_mutex_unlock(&mutex); return NSS_STATUS_UNAVAIL; } @@ -136,7 +142,7 @@ enum nss_status ptsid2name(int uid, char **buffer, int *buflen) { ret = NSS_STATUS_NOTFOUND; for (i=0;igr_passwd=buffer; - if (!cpstr("x",&buffer,&buflen)) break; + if (!cpstr("z",&buffer,&buflen)) break; if (buflen < sizeof(char*)) break; - result->gr_mem=buffer; + result->gr_mem=&buffer; result->gr_mem[0] = NULL; *errnop=errno; @@ -370,9 +417,9 @@ enum nss_status fill_result_buf(uid_t uid, int *errnop) { result_buf->pw_name = name; do { - /* set the password to "x" */ + /* set the password to "z"; we can't use "x" because of pam_unix.so */ result_buf->pw_passwd = buffer; - if ( ! cpstr("x",&buffer, &buflen) ) break; + if ( ! cpstr("z",&buffer, &buflen) ) break; /* the uid and gid are both the uid passed in */ result_buf->pw_uid = uid; @@ -390,6 +437,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 +476,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); }