modernize name lookup
authorKirk McKusick <mckusick@ucbvax.Berkeley.EDU>
Tue, 28 May 1985 08:20:31 +0000 (00:20 -0800)
committerKirk McKusick <mckusick@ucbvax.Berkeley.EDU>
Tue, 28 May 1985 08:20:31 +0000 (00:20 -0800)
SCCS-vsn: usr.sbin/quot/quot.c 4.10

usr/src/usr.sbin/quot/quot.c

index a563b9c..08a0f14 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)quot.c      4.9 (Berkeley) 83/09/22";
+static char *sccsid = "@(#)quot.c      4.10 (Berkeley) 85/05/27";
 #endif
 
 /*
 #endif
 
 /*
@@ -323,63 +323,42 @@ report()
        }
 }
 
        }
 }
 
+/* rest should be done with nameserver or database */
+
 #include <pwd.h>
 #include <pwd.h>
+#include <grp.h>
 #include <utmp.h>
 
 struct utmp utmp;
 #include <utmp.h>
 
 struct utmp utmp;
-
-#define NUID   2048
 #define        NMAX    (sizeof (utmp.ut_name))
 #define        NMAX    (sizeof (utmp.ut_name))
+#define SCPYN(a, b)    strncpy(a, b, NMAX)
 
 
-char   names[NUID][NMAX+1];
+#define NUID   64      /* power of 2 */
+#define UIDMASK        0x3f
+
+struct ncache {
+       int     uid;
+       char    name[NMAX+1];
+} nc[NUID];
 char   outrangename[NMAX+1];
 int    outrangeuid = -1;
 
 char *
 getname(uid)
 char   outrangename[NMAX+1];
 int    outrangeuid = -1;
 
 char *
 getname(uid)
-       int uid;
 {
        register struct passwd *pw;
 {
        register struct passwd *pw;
-       static init;
        struct passwd *getpwent();
        struct passwd *getpwent();
-
-       if (uid >= 0 && uid < NUID && names[uid][0])
-               return (&names[uid][0]);
-       if (uid >= 0 && uid == outrangeuid)
-               return (outrangename);
-rescan:
-       if (init == 2) {
-               if (uid < NUID)
-                       return (0);
-               setpwent();
-               while (pw = getpwent()) {
-                       if (pw->pw_uid != uid)
-                               continue;
-                       outrangeuid = pw->pw_uid;
-                       strncpy(outrangename, pw->pw_name, NMAX);
-                       endpwent();
-                       return (outrangename);
-               }
-               endpwent();
+       extern int _pw_stayopen;
+       register int cp;
+
+       _pw_stayopen = 1;
+       cp = uid & UIDMASK;
+       if (uid >= 0 && nc[cp].uid == uid && nc[cp].name[0])
+               return (nc[cp].name);
+       pw = getpwuid(uid);
+       if (!pw)
                return (0);
                return (0);
-       }
-       if (init == 0)
-               setpwent(), init = 1;
-       while (pw = getpwent()) {
-               if (pw->pw_uid < 0 || pw->pw_uid >= NUID) {
-                       if (pw->pw_uid == uid) {
-                               outrangeuid = pw->pw_uid;
-                               strncpy(outrangename, pw->pw_name, NMAX);
-                               return (outrangename);
-                       }
-                       continue;
-               }
-               if (names[pw->pw_uid][0])
-                       continue;
-               strncpy(names[pw->pw_uid], pw->pw_name, NMAX);
-               if (pw->pw_uid == uid)
-                       return (&names[uid][0]);
-       }
-       init = 2;
-       goto rescan;
+       nc[cp].uid = uid;
+       SCPYN(nc[cp].name, pw->pw_name);
+       return (nc[cp].name);
 }
 }