SCCS-vsn: usr.sbin/quot/quot.c 4.10
-static char *sccsid = "@(#)quot.c 4.9 (Berkeley) 83/09/22";
+static char *sccsid = "@(#)quot.c 4.10 (Berkeley) 85/05/27";
+/* rest should be done with nameserver or database */
+
#include <utmp.h>
struct utmp utmp;
#include <utmp.h>
struct utmp utmp;
#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)
{
register struct passwd *pw;
{
register struct passwd *pw;
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)
- }
- 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);