#define AFS_MAGIC_ANONYMOUS_USERID 32766
#define MIN_PAG_GID 0x41000000L
#define MAX_PAG_GID 0x41FFFFFFL
+#define MIN_OLDPAG_GID 0x3f00
+#define MAX_OLDPAG_GID 0xff00
+
+#define MAX_CELLNAME 256
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
extern struct ubik_client *pruclient;
int afs_initialized = 0;
-char cellname[256];
+char cellname[MAX_CELLNAME];
char homedir_prefix[300];
int homedir_prefix_len=0;
char homedirs_method=0;
do {
homedirs_method=HOMEDIR_PREFIX;
shells_method=SHELL_USERLINK;
-
- thiscell=fopen("/etc/openafs/ThisCell","r");
+
+ len = snprintf(cellname, MAX_CELLNAME, "%s/ThisCell", AFSDIR_CLIENT_ETC_DIRPATH);
+ if (len < 0 || len >= MAX_CELLNAME) return -1;
+
+ thiscell=fopen(cellname,"r");
if (thiscell == NULL) break;
- len=fread(cellname,1,256,thiscell);
+ len=fread(cellname,1,MAX_CELLNAME,thiscell);
if (!feof(thiscell)) {
// Cellname too long
fclose(thiscell);
break;
}
fclose(thiscell);
+
if (cellname[len-1] == '\n') len--;
cellname[len]='\0';
sprintf(homedir_prefix,"/afs/%s/user/",cellname);
switch (shells_method) {
case SHELL_BASH:
- if (!cpstr("/bin/bash",buffer, buflen)) return -1;
break;
case SHELL_ADMINLINK:
- if ( snprintf(buf,256,"/afs/%s/admin/shells/%s",cellname,name) > 0 ) {
- temp=readlink(buf,*buffer,*buflen);
- if ( temp > -1) {
- b[temp]=0;
- *buflen = *buflen - temp - 1;
- return -1;
- }
- }
- if (! cpstr("/bin/bash",buffer,buflen) )
- return -1;
- break;
+ if (snprintf(buf,256,"/afs/%s/admin/shells/%s",cellname,name)<=0) break;
+ temp = readlink(buf,*buffer,*buflen);
+ if (temp < 0) break;
+ b[temp]=0;
+ *buflen = *buflen - temp - 1;
+ return 0;
case SHELL_USERLINK:
- if (get_homedir(name, &bufx, &bufxlen)) return -1;
- strncpy(buf+strlen(buf),"/.loginshell",bufxlen);
- temp=readlink(buf,*buffer,*buflen);
- if ( temp > -1) {
- b[temp]=0;
- *buflen = *buflen - temp - 1;
- return -1;
- }
- if (! cpstr("/bin/bash",buffer,buflen) )
- return -1;
- break;
+ if (get_homedir(name, &bufx, &bufxlen)) break;
+ if (strncpy(buf+strlen(buf),"/.loginshell",bufxlen)<=0) break;
+ temp = readlink(buf,*buffer,*buflen);
+ if (temp < 0) break;
+ b[temp]=0;
+ *buflen = *buflen - temp - 1;
+ return 0;
}
+ if (! cpstr("/bin/bash",buffer,buflen) )
+ return -1;
return 0;
}
enum nss_status _nss_afs_getgrgid_r (gid_t gid, struct group *result,
char *buffer, size_t buflen, int *errnop) {
int length;
- if ( gid < MIN_PAG_GID || gid > MAX_PAG_GID) {
+ int showgid = 0;
+ if (gid >= MIN_PAG_GID && gid <= MAX_PAG_GID) {
+ showgid = gid-MIN_PAG_GID;
+ } else if (gid >= MIN_OLDPAG_GID && gid <= MAX_OLDPAG_GID) {
+ showgid = gid-MIN_OLDPAG_GID;
+ } else {
*errnop=ENOENT;
return NSS_STATUS_NOTFOUND;
}
result->gr_gid=gid;
result->gr_name=buffer;
- length=snprintf(buffer,buflen,"AfsPag-%x",gid-MIN_PAG_GID);
+ length=snprintf(buffer,buflen,"AfsPag-%x",showgid);
if (length < 0) break;
length += 1;