release v1.02 (important bugfix)
[libnss-afs.git] / nss_afs.c
index 6004e74..b3381fe 100644 (file)
--- a/nss_afs.c
+++ b/nss_afs.c
 #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;
 
@@ -62,7 +66,7 @@ extern int cpstr( char *str, char **buf, size_t *buflen);
 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;
@@ -173,10 +177,13 @@ int init_afs() {
   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);
@@ -185,6 +192,7 @@ int init_afs() {
       break;
     }
     fclose(thiscell);
+
     if (cellname[len-1] == '\n') len--;
     cellname[len]='\0';
     sprintf(homedir_prefix,"/afs/%s/user/",cellname);
@@ -254,35 +262,27 @@ int get_shell(char *name, char **buffer, size_t *buflen) {
 
   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;
 }
 
@@ -293,7 +293,12 @@ int get_shell(char *name, char **buffer, size_t *buflen) {
 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;
   }
@@ -301,7 +306,7 @@ enum nss_status _nss_afs_getgrgid_r (gid_t gid, struct group *result,
     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;