+char *
+flagbits(f)
+ register int f;
+{
+ register int i = 0;
+ static char flags[20];
+
+#define BIT(flag, ch) flags[i++] = (f & flag) ? ch : ' '
+ BIT(ASU, 'S');
+ BIT(AFORK, 'F');
+ BIT(ACOMPAT, 'C');
+ BIT(ACORE, 'D');
+ BIT(AXSIG, 'X');
+ flags[i] = '\0';
+ return (flags);
+}
+
+ok(argc, argv, acp)
+ register int argc;
+ register char *argv[];
+ register struct acct *acp;
+{
+ register int j;
+
+ for (j = 1; j < argc; j++)
+ if (strcmp(getname(acp->ac_uid), argv[j]) &&
+ strcmp(getdev(acp->ac_tty), argv[j]) &&
+ strcmp(acp->ac_comm, argv[j]))
+ break;
+ return (j == argc);
+}
+
+/* should be done with nameserver or database */
+
+struct utmp utmp;
+
+#define NUID 2048
+#define NMAX (sizeof (utmp.ut_name))
+
+char names[NUID][NMAX+1];
+char outrangename[NMAX+1];
+int outrangeuid = -1;
+
+char *
+getname(uid)
+{
+ register struct passwd *pw;
+ static init;
+ struct passwd *getpwent();
+
+ if (uid >= 0 && uid < NUID && names[uid][0])
+ return (&names[uid][0]);
+ if (uid >= 0 && uid == outrangeuid)
+ return (outrangename);
+ 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, NUID);
+ endpwent();
+ return (outrangename);
+ }
+ endpwent();
+ 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, NUID);
+ 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;
+ endpwent();
+ return (0);
+}
+
+#include <sys/dir.h>
+
+#define N_DEVS 43 /* hash value for device names */
+#define NDEVS 500 /* max number of file names in /dev */
+
+struct devhash {
+ dev_t dev_dev;
+ char dev_name [fldsiz(utmp, ut_line) + 1];
+ struct devhash * dev_nxt;
+};
+struct devhash *dev_hash[N_DEVS];
+struct devhash *dev_chain;
+#define HASH(d) (((int) d) % N_DEVS)
+
+setupdevs()