This diff replaces calls to getpwuid/getgrgid with
uid_from_user/gid_from_group and fixes warnings caused by the
user_from_uid/group_from_gid return value change to const char *.

I've also changed some getpwnam/getgrnam to user_from_uid/group_from_gid
where it makes sense.

If desired, I can break the warning fixes out into a separate diff.

 - todd

Index: bin/chmod/chmod.c
===================================================================
RCS file: /cvs/src/bin/chmod/chmod.c,v
retrieving revision 1.42
diff -u -p -u -r1.42 chmod.c
--- bin/chmod/chmod.c   28 May 2017 08:03:36 -0000      1.42
+++ bin/chmod/chmod.c   10 Sep 2018 00:46:49 -0000
@@ -293,7 +293,6 @@ done:
 uid_t
 a_uid(const char *s, int silent)
 {
-       struct passwd *pw;
        const char *errstr;
        uid_t uid;
 
@@ -301,8 +300,8 @@ a_uid(const char *s, int silent)
                return ((uid_t)-1);
 
        /* User name was given. */
-       if ((pw = getpwnam(s)) != NULL)
-               return (pw->pw_uid);
+       if (uid_from_user(s, &uid) != -1)
+               return (uid);
 
        /* UID was given. */
        uid = (uid_t)strtonum(s, 0, UID_MAX, &errstr);
@@ -323,7 +322,6 @@ a_uid(const char *s, int silent)
 gid_t
 a_gid(const char *s)
 {
-       struct group *gr;
        const char *errstr;
        gid_t gid;
 
@@ -331,8 +329,8 @@ a_gid(const char *s)
                return ((gid_t)-1);
 
        /* Group name was given. */
-       if ((gr = getgrnam(s)) != NULL)
-               return (gr->gr_gid);
+       if (gid_from_group(s, &gid) != -1)
+               return (gid);
 
        /* GID was given. */
        gid = (gid_t)strtonum(s, 0, GID_MAX, &errstr);
Index: bin/ls/ls.c
===================================================================
RCS file: /cvs/src/bin/ls/ls.c,v
retrieving revision 1.50
diff -u -p -u -r1.50 ls.c
--- bin/ls/ls.c 4 Feb 2018 22:09:33 -0000       1.50
+++ bin/ls/ls.c 10 Sep 2018 15:34:13 -0000
@@ -431,8 +431,9 @@ display(FTSENT *p, FTSENT *list)
        int bcfile, flen, glen, ulen, maxflags, maxgroup, maxuser, maxlen;
        int entries, needstats;
        int width;
-       char *user, *group, buf[21];    /* 64 bits == 20 digits */
+       const char *user, *group;
        char nuser[12], ngroup[12];
+       char buf[21];   /* 64 bits == 20 digits */
        char *flags = NULL;
 
        /*
Index: bin/ps/ps.c
===================================================================
RCS file: /cvs/src/bin/ps/ps.c,v
retrieving revision 1.72
diff -u -p -u -r1.72 ps.c
--- bin/ps/ps.c 8 Aug 2018 14:38:31 -0000       1.72
+++ bin/ps/ps.c 10 Sep 2018 00:46:49 -0000
@@ -92,7 +92,6 @@ main(int argc, char *argv[])
        struct kinfo_proc *kp, **kinfo;
        struct varent *vent;
        struct winsize ws;
-       struct passwd *pwd;
        dev_t ttydev;
        pid_t pid;
        uid_t uid;
@@ -217,11 +216,8 @@ main(int argc, char *argv[])
                        break;
                }
                case 'U':
-                       pwd = getpwnam(optarg);
-                       if (pwd == NULL)
+                       if (uid_from_user(optarg, &uid) == -1)
                                errx(1, "%s: no such user", optarg);
-                       uid = pwd->pw_uid;
-                       endpwent();
                        Uflag = xflg = 1;
                        break;
                case 'u':
Index: sbin/fsck_ext2fs/inode.c
===================================================================
RCS file: /cvs/src/sbin/fsck_ext2fs/inode.c,v
retrieving revision 1.27
diff -u -p -u -r1.27 inode.c
--- sbin/fsck_ext2fs/inode.c    16 Dec 2016 17:44:59 -0000      1.27
+++ sbin/fsck_ext2fs/inode.c    10 Sep 2018 00:46:49 -0000
@@ -559,10 +559,7 @@ void
 pinode(ino_t ino)
 {
        struct ext2fs_dinode *dp;
-       char *p;
-#ifndef SMALL
-       struct passwd *pw;
-#endif
+       const char *p;
        time_t t;
        u_int32_t uid;
 
@@ -573,11 +570,11 @@ pinode(ino_t ino)
        printf(" OWNER=");
        uid = letoh16(dp->e2di_uid_low) | (letoh16(dp->e2di_uid_high) << 16);
 #ifndef SMALL
-       if ((pw = getpwuid((int)uid)) != 0)
-               printf("%s ", pw->pw_name);
+       if ((p = user_from_uid(uid, 1)) != NULL)
+               printf("%s ", p);
        else
 #endif
-               printf("%u ", (unsigned)uid);
+               printf("%u ", uid);
        printf("MODE=%o\n", letoh16(dp->e2di_mode));
        if (preen)
                printf("%s: ", cdevname());
Index: sbin/fsck_ffs/inode.c
===================================================================
RCS file: /cvs/src/sbin/fsck_ffs/inode.c,v
retrieving revision 1.48
diff -u -p -u -r1.48 inode.c
--- sbin/fsck_ffs/inode.c       16 Dec 2016 17:44:59 -0000      1.48
+++ sbin/fsck_ffs/inode.c       10 Sep 2018 00:46:49 -0000
@@ -525,10 +525,7 @@ void
 pinode(ino_t ino)
 {
        union dinode *dp;
-       char *p;
-#ifndef SMALL
-       struct passwd *pw;
-#endif
+       const char *p;
        time_t t;
 
        printf(" I=%llu ", (unsigned long long)ino);
@@ -537,8 +534,8 @@ pinode(ino_t ino)
        dp = ginode(ino);
        printf(" OWNER=");
 #ifndef SMALL
-       if ((pw = getpwuid(DIP(dp, di_uid))) != 0)
-               printf("%s ", pw->pw_name);
+       if ((p = user_from_uid(DIP(dp, di_uid), 1)) != NULL)
+               printf("%s ", p);
        else
 #endif
                printf("%u ", (unsigned)DIP(dp, di_uid));
Index: sbin/fsdb/fsdb.c
===================================================================
RCS file: /cvs/src/sbin/fsdb/fsdb.c,v
retrieving revision 1.31
diff -u -p -u -r1.31 fsdb.c
--- sbin/fsdb/fsdb.c    9 Sep 2016 15:37:14 -0000       1.31
+++ sbin/fsdb/fsdb.c    10 Sep 2018 01:59:26 -0000
@@ -760,7 +760,6 @@ CMDFUNCSTART(chowner)
        int rval = 1;
        uid_t uid;
        char *cp;
-       struct passwd *pwd;
 
        if (!checkactive())
                return 1;
@@ -768,9 +767,7 @@ CMDFUNCSTART(chowner)
        uid = strtoul(argv[1], &cp, 0);
        if (cp == argv[1] || *cp != '\0' ) {
                /* try looking up name */
-               if ((pwd = getpwnam(argv[1]))) {
-                       uid = pwd->pw_uid;
-               } else {
+               if (uid_from_user(argv[1], &uid) == -1) {
                        warnx("bad uid `%s'", argv[1]);
                        return 1;
                }
Index: sbin/fsdb/fsdbutil.c
===================================================================
RCS file: /cvs/src/sbin/fsdb/fsdbutil.c,v
retrieving revision 1.18
diff -u -p -u -r1.18 fsdbutil.c
--- sbin/fsdb/fsdbutil.c        29 Jul 2017 21:14:56 -0000      1.18
+++ sbin/fsdb/fsdbutil.c        10 Sep 2018 01:59:26 -0000
@@ -83,8 +83,7 @@ argcount(struct cmdtable *cmdp, int argc
 void
 printstat(const char *cp, ino_t inum, union dinode *dp)
 {
-       struct group *grp;
-       struct passwd *pw;
+       const char *name;
        time_t t;
        char *p;
 
@@ -139,12 +138,12 @@ printstat(const char *cp, ino_t inum, un
        printf("\n\tATIME=%15.15s %4.4s [%d nsec]\n", &p[4], &p[20],
            DIP(dp, di_atimensec));
 
-       if ((pw = getpwuid(DIP(dp, di_uid))))
-               printf("OWNER=%s ", pw->pw_name);
+       if ((name = user_from_uid(DIP(dp, di_uid), 1)) != NULL)
+               printf("OWNER=%s ", name);
        else
                printf("OWNUID=%u ", DIP(dp, di_uid));
-       if ((grp = getgrgid(DIP(dp, di_gid))))
-               printf("GRP=%s ", grp->gr_name);
+       if ((name = group_from_gid(DIP(dp, di_gid), 1)) != NULL)
+               printf("GRP=%s ", name);
        else
                printf("GID=%u ", DIP(dp, di_gid));
 
Index: sbin/pfctl/parse.y
===================================================================
RCS file: /cvs/src/sbin/pfctl/parse.y,v
retrieving revision 1.683
diff -u -p -u -r1.683 parse.y
--- sbin/pfctl/parse.y  6 Sep 2018 15:07:33 -0000       1.683
+++ sbin/pfctl/parse.y  10 Sep 2018 02:12:51 -0000
@@ -2965,14 +2965,14 @@ uid             : STRING                        {
                        if (!strcmp($1, "unknown"))
                                $$ = UID_MAX;
                        else {
-                               struct passwd   *pw;
+                               uid_t uid;
 
-                               if ((pw = getpwnam($1)) == NULL) {
+                               if (uid_from_user($1, &uid) == -1) {
                                        yyerror("unknown user %s", $1);
                                        free($1);
                                        YYERROR;
                                }
-                               $$ = pw->pw_uid;
+                               $$ = uid;
                        }
                        free($1);
                }
@@ -3043,14 +3043,14 @@ gid             : STRING                        {
                        if (!strcmp($1, "unknown"))
                                $$ = GID_MAX;
                        else {
-                               struct group    *grp;
+                               gid_t gid;
 
-                               if ((grp = getgrnam($1)) == NULL) {
+                               if (gid_from_group($1, &gid) == -1) {
                                        yyerror("unknown group %s", $1);
                                        free($1);
                                        YYERROR;
                                }
-                               $$ = grp->gr_gid;
+                               $$ = gid;
                        }
                        free($1);
                }
Index: usr.bin/find/function.c
===================================================================
RCS file: /cvs/src/usr.bin/find/function.c,v
retrieving revision 1.45
diff -u -p -u -r1.45 function.c
--- usr.bin/find/function.c     3 Jan 2017 21:31:16 -0000       1.45
+++ usr.bin/find/function.c     10 Sep 2018 00:46:49 -0000
@@ -933,20 +933,17 @@ PLAN *
 c_group(char *gname, char ***ignored, int unused)
 {
        PLAN *new;
-       struct group *g;
        gid_t gid;
     
        ftsoptions &= ~FTS_NOSTAT;
 
-       g = getgrnam(gname);
-       if (g == NULL) {
+       if (gid_from_group(gname, &gid) == -1) {
                const char *errstr;
 
                gid = strtonum(gname, 0, GID_MAX, &errstr);
                if (errstr)
                        errx(1, "-group: %s: no such group", gname);
-       } else
-               gid = g->gr_gid;
+       }
     
        new = palloc(N_GROUP, f_group);
        new->g_data = gid;
@@ -1543,20 +1540,17 @@ PLAN *
 c_user(char *username, char ***ignored, int unused)
 {
        PLAN *new;
-       struct passwd *p;
        uid_t uid;
     
        ftsoptions &= ~FTS_NOSTAT;
 
-       p = getpwnam(username);
-       if (p == NULL) {
+       if (uid_from_user(username, &uid) == -1) {
                const char *errstr;
 
                uid = strtonum(username, 0, UID_MAX, &errstr);
                if (errstr)
                        errx(1, "-user: %s: no such user", username);
-       } else
-               uid = p->pw_uid;
+       }
 
        new = palloc(N_USER, f_user);
        new->u_data = uid;
Index: usr.bin/fstat/fstat.c
===================================================================
RCS file: /cvs/src/usr.bin/fstat/fstat.c,v
retrieving revision 1.93
diff -u -p -u -r1.93 fstat.c
--- usr.bin/fstat/fstat.c       10 Apr 2018 11:09:14 -0000      1.93
+++ usr.bin/fstat/fstat.c       10 Sep 2018 15:29:32 -0000
@@ -159,6 +159,10 @@ main(int argc, char *argv[])
                optstr = "fnop:su:vN:M:";
        }
 
+       /* Keep passwd and group files open. */
+       setpassent(1);
+       setgroupent(1);
+
        /*
         * fuser and fstat share three flags: -f, -s and -u.  In both cases
         * -f is a boolean, but for -u fstat wants an argument while fuser
@@ -217,15 +221,17 @@ main(int argc, char *argv[])
                        if (uflg++)
                                usage();
                        if (!fuser) {
-                               if (!(passwd = getpwnam(optarg))) {
-                                       arg = strtonum(optarg, 0, UID_MAX,
+                               uid_t uid;
+
+                               if (uid_from_user(optarg, &uid) == -1) {
+                                       uid = strtonum(optarg, 0, UID_MAX,
                                            &errstr);
                                        if (errstr != NULL) {
                                                errx(1, "%s: unknown uid",
                                                    optarg);
                                        }
-                               } else
-                                       arg = passwd->pw_uid;
+                               }
+                               arg = uid;
                                what = KERN_FILE_BYUID;
                        }
                        break;
@@ -331,7 +337,7 @@ fstat_header(void)
        putchar('\n');
 }
 
-char   *Uname, *Comm;
+const char *Uname, *Comm;
 uid_t  *procuid;
 pid_t  Pid;
 
Index: usr.bin/fstat/fuser.c
===================================================================
RCS file: /cvs/src/usr.bin/fstat/fuser.c,v
retrieving revision 1.6
diff -u -p -u -r1.6 fuser.c
--- usr.bin/fstat/fuser.c       16 Jan 2015 06:40:08 -0000      1.6
+++ usr.bin/fstat/fuser.c       10 Sep 2018 00:46:49 -0000
@@ -133,7 +133,7 @@ fuser_check(struct kinfo_file *kf)
 static void
 printfu(struct fuser *fu)
 {
-       struct passwd *pwd;
+       const char *name;
 
        printf("%d", fu->pid);
        fflush(stdout);
@@ -148,11 +148,11 @@ printfu(struct fuser *fu)
                fprintf(stderr, "t");
 
        if (uflg) {
-               pwd = getpwuid(fu->uid);
-               if (pwd != NULL)
-                       fprintf(stderr, "(%s)", pwd->pw_name);
+               name = user_from_uid(fu->uid, 1);
+               if (name != NULL)
+                       fprintf(stderr, "(%s)", name);
                else
-                       fprintf(stderr, "(%d)", fu->uid);
+                       fprintf(stderr, "(%u)", fu->uid);
        }
 
        putchar(' ');
Index: usr.bin/mail/aux.c
===================================================================
RCS file: /cvs/src/usr.bin/mail/aux.c,v
retrieving revision 1.29
diff -u -p -u -r1.29 aux.c
--- usr.bin/mail/aux.c  16 Oct 2015 17:56:07 -0000      1.29
+++ usr.bin/mail/aux.c  10 Sep 2018 15:50:36 -0000
@@ -45,7 +45,7 @@ static char *save2str(char *, char *);
  * Return a pointer to a dynamic copy of the argument.
  */
 char *
-savestr(char *str)
+savestr(const char *str)
 {
        char *new;
        int size = strlen(str) + 1;
Index: usr.bin/mail/extern.h
===================================================================
RCS file: /cvs/src/usr.bin/mail/extern.h,v
retrieving revision 1.28
diff -u -p -u -r1.28 extern.h
--- usr.bin/mail/extern.h       20 Jan 2015 16:59:07 -0000      1.28
+++ usr.bin/mail/extern.h       10 Sep 2018 15:53:02 -0000
@@ -35,7 +35,7 @@
 
 struct name;
 struct name *cat(struct name *, struct name *);
-struct name *delname(struct name *, char *);
+struct name *delname(struct name *, const char *);
 struct name *elide(struct name *);
 struct name *extract(char *, int);
 struct grouphead;
@@ -55,7 +55,8 @@ char  *copyin(char *, char **);
 char   *detract(struct name *, int);
 char   *expand(char *);
 char   *getdeadletter(void);
-char   *getname(uid_t);
+const char
+       *getname(uid_t);
 struct message;
 char   *hfield(char *, struct message *);
 FILE   *infix(struct header *, FILE *);
@@ -67,12 +68,13 @@ char        *readtty(char *, char *);
 char   *reedit(char *);
 FILE   *run_editor(FILE *, off_t, int, int);
 char   *salloc(int);
-char   *savestr(char *);
+char   *savestr(const char *);
 FILE   *setinput(struct message *);
 char   *skin(char *);
 char   *skip_comment(char *);
 char   *snarf(char *, int *);
-char   *username(void);
+const char
+       *username(void);
 char   *value(char *);
 char   *vcopy(char *);
 char   *yankword(char *, char *);
@@ -119,7 +121,7 @@ void         fail(char *, char *);
 int     file(void *);
 struct grouphead *
         findgroup(char *);
-void    findmail(char *, char *, int);
+void    findmail(const char *, char *, int);
 void    fioint(int);
 int     first(int, int);
 void    fixhead(struct header *, struct name *);
@@ -134,7 +136,7 @@ int  gethfield(FILE *, char *, int, char
 int     gethfromtty(struct header *, int);
 int     getmsglist(char *, int *, int);
 int     getrawlist(char *, char **, int);
-uid_t   getuserid(char *);
+uid_t   getuserid(const char *);
 int     grabh(struct header *, int);
 int     group(void *);
 int     hash(char *);
Index: usr.bin/mail/getname.c
===================================================================
RCS file: /cvs/src/usr.bin/mail/getname.c,v
retrieving revision 1.8
diff -u -p -u -r1.8 getname.c
--- usr.bin/mail/getname.c      27 Oct 2009 23:59:40 -0000      1.8
+++ usr.bin/mail/getname.c      10 Sep 2018 15:51:17 -0000
@@ -39,14 +39,10 @@
 /*
  * Search the passwd file for a uid.  Return name on success, NULL on failure
  */
-char *
+const char *
 getname(uid_t uid)
 {
-       struct passwd *pw;
-
-       if ((pw = getpwuid(uid)) == NULL)
-               return(NULL);
-       return(pw->pw_name);
+       return user_from_uid(uid, 1);
 }
 
 /*
@@ -54,11 +50,9 @@ getname(uid_t uid)
  * on error.
  */
 uid_t
-getuserid(char *name)
+getuserid(const char *name)
 {
-       struct passwd *pw;
+       uid_t uid;
 
-       if ((pw = getpwnam(name)) == NULL)
-               return(UID_MAX);
-       return(pw->pw_uid);
+       return uid_from_user(name, &uid);
 }
Index: usr.bin/mail/glob.h
===================================================================
RCS file: /cvs/src/usr.bin/mail/glob.h,v
retrieving revision 1.8
diff -u -p -u -r1.8 glob.h
--- usr.bin/mail/glob.h 24 Nov 2014 20:01:43 -0000      1.8
+++ usr.bin/mail/glob.h 10 Sep 2018 15:49:30 -0000
@@ -54,7 +54,8 @@ FILE  *input;                         /* Current command input
 char   mailname[PATHSIZE];             /* Name of current file */
 char   prevfile[PATHSIZE];             /* Name of previous file */
 char   *homedir;                       /* Path name of home directory */
-char   *myname;                        /* My login name */
+const char
+       *myname;                        /* My login name */
 off_t  mailsize;                       /* Size of system mailbox */
 int    lexnumber;                      /* Number of TNUMBER from scan() */
 char   lexstring[STRINGLEN];           /* String from TSTRING, scan() */
Index: usr.bin/mail/lex.c
===================================================================
RCS file: /cvs/src/usr.bin/mail/lex.c,v
retrieving revision 1.39
diff -u -p -u -r1.39 lex.c
--- usr.bin/mail/lex.c  16 Oct 2015 17:56:07 -0000      1.39
+++ usr.bin/mail/lex.c  10 Sep 2018 15:53:27 -0000
@@ -58,7 +58,7 @@ setfile(char *name)
        int i, fd;
        struct stat stb;
        char isedit = *name != '%';
-       char *who = name[1] ? name + 1 : myname;
+       const char *who = name[1] ? name + 1 : myname;
        char tempname[PATHSIZE];
        static int shudclob;
 
Index: usr.bin/mail/names.c
===================================================================
RCS file: /cvs/src/usr.bin/mail/names.c,v
retrieving revision 1.23
diff -u -p -u -r1.23 names.c
--- usr.bin/mail/names.c        16 Oct 2015 17:56:07 -0000      1.23
+++ usr.bin/mail/names.c        10 Sep 2018 15:51:48 -0000
@@ -582,7 +582,7 @@ count(struct name *np)
  * Delete the given name from a namelist.
  */
 struct name *
-delname(struct name *np, char *name)
+delname(struct name *np, const char *name)
 {
        struct name *p;
 
Index: usr.bin/mail/temp.c
===================================================================
RCS file: /cvs/src/usr.bin/mail/temp.c,v
retrieving revision 1.17
diff -u -p -u -r1.17 temp.c
--- usr.bin/mail/temp.c 28 Jul 2016 21:37:45 -0000      1.17
+++ usr.bin/mail/temp.c 10 Sep 2018 15:49:55 -0000
@@ -65,12 +65,12 @@ tinit(void)
                if (getuserid(myname) == UID_MAX)
                        errx(1, "\"%s\" is not a user of this system", myname);
        } else {
-               if ((cp = username()) == NULL) {
+               if ((myname = username()) == NULL) {
                        myname = "nobody";
                        if (rcvmode)
                                exit(1);
                } else
-                       myname = savestr(cp);
+                       myname = savestr(myname);
        }
        if ((cp = getenv("HOME")) == NULL || *cp == '\0' ||
            strlen(cp) >= PATHSIZE)
Index: usr.bin/mail/v7.local.c
===================================================================
RCS file: /cvs/src/usr.bin/mail/v7.local.c,v
retrieving revision 1.17
diff -u -p -u -r1.17 v7.local.c
--- usr.bin/mail/v7.local.c     19 Jul 2016 06:43:27 -0000      1.17
+++ usr.bin/mail/v7.local.c     10 Sep 2018 15:52:56 -0000
@@ -48,7 +48,7 @@
  * mail is queued).
  */
 void
-findmail(char *user, char *buf, int buflen)
+findmail(const char *user, char *buf, int buflen)
 {
        char *mbox;
        struct stat sb;
@@ -82,10 +82,10 @@ demail(void)
 /*
  * Discover user login name.
  */
-char *
+const char *
 username(void)
 {
-       char *np;
+       const char *np;
        uid_t uid;
 
        if ((np = getenv("USER")) != NULL)
Index: usr.bin/newsyslog/newsyslog.c
===================================================================
RCS file: /cvs/src/usr.bin/newsyslog/newsyslog.c,v
retrieving revision 1.108
diff -u -p -u -r1.108 newsyslog.c
--- usr.bin/newsyslog/newsyslog.c       24 Jul 2017 12:57:01 -0000      1.108
+++ usr.bin/newsyslog/newsyslog.c       10 Sep 2018 15:10:55 -0000
@@ -191,6 +191,10 @@ main(int argc, char **argv)
        TAILQ_INIT(&config);
        TAILQ_INIT(&runlist);
 
+       /* Keep passwd and group files open for faster lookups. */
+       setpassent(1);
+       setgroupent(1);
+
        ret = parse_file(&config, &listlen);
        if (argc == 0)
                TAILQ_CONCAT(&runlist, &config, next);
@@ -468,8 +472,6 @@ parse_file(struct entrylist *list, int *
 {
        char line[BUFSIZ], *parse, *q, *errline, *group, *tmp, *ep;
        struct conf_entry *working;
-       struct passwd *pwd;
-       struct group *grp;
        struct stat sb;
        int lineno = 0;
        int ret = 0;
@@ -510,36 +512,28 @@ nextline:
                if ((group = strchr(q, ':')) != NULL ||
                    (group = strrchr(q, '.')) != NULL)  {
                        *group++ = '\0';
-                       if (*q) {
-                               if (!(isnumberstr(q))) {
-                                       if ((pwd = getpwnam(q)) == NULL) {
-                                               warnx("%s:%d: unknown user"
-                                                   " %s --> skipping",
-                                                   conf, lineno, q);
-                                               ret = 1;
-                                               goto nextline;
-                                       }
-                                       working->uid = pwd->pw_uid;
-                               } else
-                                       working->uid = atoi(q);
-                       } else
+                       if (*q == '\0') {
                                working->uid = (uid_t)-1;
+                       } else if (isnumberstr(q)) {
+                               working->uid = atoi(q);
+                       } else if (uid_from_user(q, &working->uid) == -1) {
+                               warnx("%s:%d: unknown user %s --> skipping",
+                                   conf, lineno, q);
+                               ret = 1;
+                               goto nextline;
+                       }
 
                        q = group;
-                       if (*q) {
-                               if (!(isnumberstr(q))) {
-                                       if ((grp = getgrnam(q)) == NULL) {
-                                               warnx("%s:%d: unknown group"
-                                                   " %s --> skipping",
-                                                   conf, lineno, q);
-                                               ret = 1;
-                                               goto nextline;
-                                       }
-                                       working->gid = grp->gr_gid;
-                               } else
-                                       working->gid = atoi(q);
-                       } else
+                       if (*q == '\0') {
                                working->gid = (gid_t)-1;
+                       } else if (isnumberstr(q)) {
+                               working->gid = atoi(q);
+                       } else if (gid_from_group(q, &working->gid) == -1) {
+                               warnx("%s:%d: unknown group %s --> skipping",
+                                   conf, lineno, q);
+                               ret = 1;
+                               goto nextline;
+                       }
 
                        q = parse = missing_field(sob(++parse), errline, 
lineno);
                        *(parse = son(parse)) = '\0';
Index: usr.bin/rdist/common.c
===================================================================
RCS file: /cvs/src/usr.bin/rdist/common.c,v
retrieving revision 1.38
diff -u -p -u -r1.38 common.c
--- usr.bin/rdist/common.c      9 Sep 2018 13:53:11 -0000       1.38
+++ usr.bin/rdist/common.c      10 Sep 2018 15:24:48 -0000
@@ -436,7 +436,7 @@ getusername(uid_t uid, char *file, opt_t
 {
        static char buf[100];
        static uid_t lastuid = (uid_t)-1;
-       struct passwd *pwd = NULL;
+       const char *name;
 
        /*
         * The value of opts may have changed so we always
@@ -448,14 +448,14 @@ getusername(uid_t uid, char *file, opt_t
        }
 
        /*
-        * Try to avoid getpwuid() call.
+        * Try to avoid passwd lookup.
         */
        if (lastuid == uid && buf[0] != '\0' && buf[0] != ':')
                return(buf);
 
        lastuid = uid;
 
-       if ((pwd = getpwuid(uid)) == NULL) {
+       if ((name = user_from_uid(uid, 1)) == NULL) {
                if (IS_ON(opts, DO_DEFOWNER) && !isserver) 
                        (void) strlcpy(buf, defowner, sizeof(buf));
                else {
@@ -464,7 +464,7 @@ getusername(uid_t uid, char *file, opt_t
                        (void) snprintf(buf, sizeof(buf), ":%u", uid);
                }
        } else {
-               (void) strlcpy(buf, pwd->pw_name, sizeof(buf));
+               (void) strlcpy(buf, name, sizeof(buf));
        }
 
        return(buf);
@@ -478,7 +478,7 @@ getgroupname(gid_t gid, char *file, opt_
 {
        static char buf[100];
        static gid_t lastgid = (gid_t)-1;
-       struct group *grp = NULL;
+       const char *name;
 
        /*
         * The value of opts may have changed so we always
@@ -490,14 +490,14 @@ getgroupname(gid_t gid, char *file, opt_
        }
 
        /*
-        * Try to avoid getgrgid() call.
+        * Try to avoid group lookup.
         */
        if (lastgid == gid && buf[0] != '\0' && buf[0] != ':')
                return(buf);
 
        lastgid = gid;
 
-       if ((grp = (struct group *)getgrgid(gid)) == NULL) {
+       if ((name = group_from_gid(gid, 1)) == NULL) {
                if (IS_ON(opts, DO_DEFGROUP) && !isserver) 
                        (void) strlcpy(buf, defgroup, sizeof(buf));
                else {
@@ -506,7 +506,7 @@ getgroupname(gid_t gid, char *file, opt_
                        (void) snprintf(buf, sizeof(buf), ":%u", gid);
                }
        } else
-               (void) strlcpy(buf, grp->gr_name, sizeof(buf));
+               (void) strlcpy(buf, name, sizeof(buf));
 
        return(buf);
 }
Index: usr.bin/rdistd/server.c
===================================================================
RCS file: /cvs/src/usr.bin/rdistd/server.c,v
retrieving revision 1.44
diff -u -p -u -r1.44 server.c
--- usr.bin/rdistd/server.c     9 Sep 2018 13:53:11 -0000       1.44
+++ usr.bin/rdistd/server.c     10 Sep 2018 15:24:48 -0000
@@ -177,7 +177,7 @@ setfilemode(char *file, int fd, int mode
 static int
 fchog(int fd, char *file, char *owner, char *group, int mode)
 {
-       static struct group *gr = NULL;
+       static struct group *gr = NULL; /* XXX */
        int i;
        struct stat st;
        uid_t uid;
@@ -189,9 +189,7 @@ fchog(int fd, char *file, char *owner, c
                if (*owner == ':') {
                        uid = (uid_t) atoi(owner + 1);
                } else if (strcmp(owner, locuser) != 0) {
-                       struct passwd *pw;
-
-                       if ((pw = getpwnam(owner)) == NULL) {
+                       if (uid_from_user(owner, &uid) == -1) {
                                if (mode != -1 && IS_ON(mode, S_ISUID)) {
                                        message(MT_NOTICE,
                              "%s: unknown login name \"%s\", clearing setuid",
@@ -202,8 +200,7 @@ fchog(int fd, char *file, char *owner, c
                                        message(MT_NOTICE,
                                        "%s: unknown login name \"%s\"",
                                                target, owner);
-                       } else
-                               uid = pw->pw_uid;
+                       }
                } else {
                        uid = userid;
                        primegid = groupid;
@@ -228,6 +225,7 @@ fchog(int fd, char *file, char *owner, c
        }
 
        gid = (gid_t)-1;
+       /* XXX - relies on undefined behavior (stashing gr pointer) */
        if (gr == NULL || strcmp(group, gr->gr_name) != 0) {
                if ((*group == ':' && 
                     (getgrgid(gid = atoi(group + 1)) == NULL))
Index: usr.bin/ssh/sftp-common.c
===================================================================
RCS file: /cvs/src/usr.bin/ssh/sftp-common.c,v
retrieving revision 1.30
diff -u -p -u -r1.30 sftp-common.c
--- usr.bin/ssh/sftp-common.c   10 Jun 2017 06:36:46 -0000      1.30
+++ usr.bin/ssh/sftp-common.c   10 Sep 2018 15:35:22 -0000
@@ -211,7 +211,7 @@ ls_file(const char *name, const struct s
 {
        int ulen, glen, sz = 0;
        struct tm *ltime = localtime(&st->st_mtime);
-       char *user, *group;
+       const char *user, *group;
        char buf[1024], lc[8], mode[11+1], tbuf[12+1], ubuf[11+1], gbuf[11+1];
        char sbuf[FMT_SCALED_STRSIZE];
        time_t now;
Index: usr.bin/stat/stat.c
===================================================================
RCS file: /cvs/src/usr.bin/stat/stat.c,v
retrieving revision 1.21
diff -u -p -u -r1.21 stat.c
--- usr.bin/stat/stat.c 10 Oct 2015 20:35:01 -0000      1.21
+++ usr.bin/stat/stat.c 10 Sep 2018 00:46:49 -0000
@@ -490,10 +490,9 @@ format1(const struct stat *st,
     int hilo, int what)
 {
        u_int64_t data;
-       char *sdata, lfmt[24], tmp[20];
+       char lfmt[24], tmp[20];
        char smode[12], sid[12], path[PATH_MAX + 4];
-       struct passwd *pw;
-       struct group *gr;
+       const char *sdata;
        struct tm *tm;
        time_t secs;
        long nsecs;
@@ -546,26 +545,30 @@ format1(const struct stat *st,
                small = (sizeof(st->st_mode) == 4);
                data = st->st_mode;
                strmode(st->st_mode, smode);
-               sdata = smode;
-               l = strlen(sdata);
-               if (sdata[l - 1] == ' ')
-                       sdata[--l] = '\0';
-               if (hilo == HIGH_PIECE) {
+               l = strlen(smode);
+               if (smode[l - 1] == ' ')
+                       smode[--l] = '\0';
+               switch (hilo) {
+               case HIGH_PIECE:
                        data >>= 12;
-                       sdata += 1;
-                       sdata[3] = '\0';
-                       hilo = 0;
-               } else if (hilo == MIDDLE_PIECE) {
+                       smode[4] = '\0';
+                       sdata = smode + 1;
+                       break;
+               case MIDDLE_PIECE:
                        data = (data >> 9) & 07;
-                       sdata += 4;
-                       sdata[3] = '\0';
-                       hilo = 0;
-               } else if (hilo == LOW_PIECE) {
+                       smode[7] = '\0';
+                       sdata = smode + 4;
+                       break;
+               case LOW_PIECE:
                        data &= 0777;
-                       sdata += 7;
-                       sdata[3] = '\0';
-                       hilo = 0;
+                       smode[10] = '\0';
+                       sdata = smode + 7;
+                       break;
+               default:
+                       sdata = smode;
+                       break;
                }
+               hilo = 0;
                formats = FMTF_DECIMAL | FMTF_OCTAL | FMTF_UNSIGNED | FMTF_HEX |
                    FMTF_STRING;
                if (ofmt == 0)
@@ -582,9 +585,8 @@ format1(const struct stat *st,
        case SHOW_st_uid:
                small = (sizeof(st->st_uid) == 4);
                data = st->st_uid;
-               if ((pw = getpwuid(st->st_uid)) != NULL)
-                       sdata = pw->pw_name;
-               else {
+               sdata = user_from_uid(st->st_uid, 1);
+               if (sdata == NULL) {
                        snprintf(sid, sizeof(sid), "(%ld)", (long)st->st_uid);
                        sdata = sid;
                }
@@ -596,9 +598,8 @@ format1(const struct stat *st,
        case SHOW_st_gid:
                small = (sizeof(st->st_gid) == 4);
                data = st->st_gid;
-               if ((gr = getgrgid(st->st_gid)) != NULL)
-                       sdata = gr->gr_name;
-               else {
+               sdata = group_from_gid(st->st_uid, 1);
+               if (sdata == NULL) {
                        snprintf(sid, sizeof(sid), "(%ld)", (long)st->st_gid);
                        sdata = sid;
                }
@@ -706,25 +707,25 @@ format1(const struct stat *st,
                small = 0;
                data = 0;
                sdata = smode;
-               sdata[0] = '\0';
+               smode[0] = '\0';
                if (hilo == 0 || hilo == LOW_PIECE) {
                        switch (st->st_mode & S_IFMT) {
                        case S_IFIFO:
-                               (void)strlcat(sdata, "|", sizeof(smode));
+                               (void)strlcat(smode, "|", sizeof(smode));
                                break;
                        case S_IFDIR:
-                               (void)strlcat(sdata, "/", sizeof(smode));
+                               (void)strlcat(smode, "/", sizeof(smode));
                                break;
                        case S_IFREG:
                                if (st->st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))
-                                       (void)strlcat(sdata, "*",
+                                       (void)strlcat(smode, "*",
                                            sizeof(smode));
                                break;
                        case S_IFLNK:
-                               (void)strlcat(sdata, "@", sizeof(smode));
+                               (void)strlcat(smode, "@", sizeof(smode));
                                break;
                        case S_IFSOCK:
-                               (void)strlcat(sdata, "=", sizeof(smode));
+                               (void)strlcat(smode, "=", sizeof(smode));
                                break;
                        }
                        hilo = 0;
Index: usr.bin/systat/pigs.c
===================================================================
RCS file: /cvs/src/usr.bin/systat/pigs.c,v
retrieving revision 1.30
diff -u -p -u -r1.30 pigs.c
--- usr.bin/systat/pigs.c       12 Sep 2015 15:59:36 -0000      1.30
+++ usr.bin/systat/pigs.c       10 Sep 2018 15:36:15 -0000
@@ -255,7 +255,7 @@ showpigs(int k)
 {
        struct kinfo_proc *kp;
        double value;
-       char *uname, *pname;
+       const char *uname, *pname;
 
        if (procbase == NULL)
                return;
Index: usr.bin/top/machine.c
===================================================================
RCS file: /cvs/src/usr.bin/top/machine.c,v
retrieving revision 1.90
diff -u -p -u -r1.90 machine.c
--- usr.bin/top/machine.c       14 May 2018 12:31:21 -0000      1.90
+++ usr.bin/top/machine.c       10 Sep 2018 15:39:00 -0000
@@ -545,7 +545,7 @@ format_comm(struct kinfo_proc *kp)
 }
 
 char *
-format_next_process(caddr_t hndl, char *(*get_userid)(uid_t), pid_t *pid,
+format_next_process(caddr_t hndl, const char *(*get_userid)(uid_t), pid_t *pid,
     int show_threads)
 {
        char *p_wait;
Index: usr.bin/top/machine.h
===================================================================
RCS file: /cvs/src/usr.bin/top/machine.h,v
retrieving revision 1.20
diff -u -p -u -r1.20 machine.h
--- usr.bin/top/machine.h       6 May 2015 07:53:29 -0000       1.20
+++ usr.bin/top/machine.h       10 Sep 2018 15:38:57 -0000
@@ -89,7 +89,7 @@ extern void     get_system_info(struct s
 extern caddr_t
 get_process_info(struct system_info *, struct process_select *,
                 int (*) (const void *, const void *));
-extern char    *format_next_process(caddr_t, char *(*)(uid_t), pid_t *, int);
+extern char    *format_next_process(caddr_t, const char *(*)(uid_t), pid_t *, 
int);
 extern uid_t    proc_owner(pid_t);
 
 extern struct kinfo_proc       *getprocs(int, int, int *);
Index: usr.bin/top/top.c
===================================================================
RCS file: /cvs/src/usr.bin/top/top.c,v
retrieving revision 1.90
diff -u -p -u -r1.90 top.c
--- usr.bin/top/top.c   29 Jul 2018 13:34:26 -0000      1.90
+++ usr.bin/top/top.c   10 Sep 2018 15:37:41 -0000
@@ -279,7 +279,7 @@ int
 main(int argc, char *argv[])
 {
        char *uname_field = "USERNAME", *header_text, *env_top;
-       char *(*get_userid)(uid_t) = username;
+       const char *(*get_userid)(uid_t) = username;
        char **preset_argv = NULL, **av = argv;
        int preset_argc = 0, ac = argc, active_procs, i;
        sigset_t mask, oldmask;
Index: usr.bin/top/top.h
===================================================================
RCS file: /cvs/src/usr.bin/top/top.h,v
retrieving revision 1.15
diff -u -p -u -r1.15 top.h
--- usr.bin/top/top.h   21 Sep 2013 14:15:19 -0000      1.15
+++ usr.bin/top/top.h   10 Sep 2018 15:37:15 -0000
@@ -78,5 +78,5 @@ extern char *renice_procs(char *);
 extern void quit(int);
 
 /* username.c */
-extern char *username(uid_t);
+extern const char *username(uid_t);
 extern uid_t userid(char *);
Index: usr.bin/top/username.c
===================================================================
RCS file: /cvs/src/usr.bin/top/username.c,v
retrieving revision 1.17
diff -u -p -u -r1.17 username.c
--- usr.bin/top/username.c      26 Oct 2015 13:56:18 -0000      1.17
+++ usr.bin/top/username.c      10 Sep 2018 15:40:26 -0000
@@ -41,7 +41,7 @@
 #include "top.h"
 #include "utils.h"
 
-char *
+const char *
 username(uid_t uid)
 {
        return user_from_uid(uid, 0);
@@ -50,10 +50,7 @@ username(uid_t uid)
 uid_t
 userid(char *username)
 {
-       struct passwd *pwd;
+       uid_t uid;
 
-       if ((pwd = getpwnam(username)) == NULL)
-               return ((uid_t)-1);
-
-       return (pwd->pw_uid);
+       return uid_from_user(username, &uid);
 }
Index: usr.bin/top/utils.c
===================================================================
RCS file: /cvs/src/usr.bin/top/utils.c,v
retrieving revision 1.26
diff -u -p -u -r1.26 utils.c
--- usr.bin/top/utils.c 15 Mar 2017 04:24:14 -0000      1.26
+++ usr.bin/top/utils.c 10 Sep 2018 15:38:23 -0000
@@ -88,7 +88,7 @@ itoa(int val)
  * format_uid(uid) - like itoa, except for uid_t and the number is right
  * justified in a 6 character field to match uname_field in top.c.
  */
-char *
+const char *
 format_uid(uid_t uid)
 {
        static char buffer[16]; /* result is built here */
Index: usr.bin/top/utils.h
===================================================================
RCS file: /cvs/src/usr.bin/top/utils.h,v
retrieving revision 1.8
diff -u -p -u -r1.8 utils.h
--- usr.bin/top/utils.h 8 Jun 2005 22:36:43 -0000       1.8
+++ usr.bin/top/utils.h 10 Sep 2018 15:38:26 -0000
@@ -32,7 +32,7 @@
 
 int atoiwi(char *);
 char *itoa(int);
-char *format_uid(uid_t);
+const char *format_uid(uid_t);
 int digits(int);
 int string_index(char *, char **);
 char **argparse(char *, int *);
Index: usr.bin/write/write.c
===================================================================
RCS file: /cvs/src/usr.bin/write/write.c,v
retrieving revision 1.33
diff -u -p -u -r1.33 write.c
--- usr.bin/write/write.c       5 Feb 2016 19:00:39 -0000       1.33
+++ usr.bin/write/write.c       10 Sep 2018 00:46:49 -0000
@@ -224,20 +224,16 @@ term_chk(char *tty, int *msgsokP, time_t
 void
 do_write(char *tty, char *mytty, uid_t myuid)
 {
-       char *login, *nows;
-       struct passwd *pwd;
+       const char *login;
+       char *nows;
        time_t now;
        char path[PATH_MAX], host[HOST_NAME_MAX+1], line[512];
        gid_t gid;
        int fd;
 
        /* Determine our login name before the we reopen() stdout */
-       if ((login = getlogin()) == NULL) {
-               if ((pwd = getpwuid(myuid)))
-                       login = pwd->pw_name;
-               else
-                       login = "???";
-       }
+       if ((login = getlogin()) == NULL)
+               login = user_from_uid(myuid, 0);
 
        (void)snprintf(path, sizeof(path), "%s%s", _PATH_DEV, tty);
        fd = open(path, O_WRONLY, 0666);
Index: usr.bin/xinstall/xinstall.c
===================================================================
RCS file: /cvs/src/usr.bin/xinstall/xinstall.c,v
retrieving revision 1.66
diff -u -p -u -r1.66 xinstall.c
--- usr.bin/xinstall/xinstall.c 21 Aug 2017 21:41:13 -0000      1.66
+++ usr.bin/xinstall/xinstall.c 10 Sep 2018 00:46:49 -0000
@@ -60,14 +60,12 @@
 #define NOCHANGEBITS   (UF_IMMUTABLE | UF_APPEND | SF_IMMUTABLE | SF_APPEND)
 #define BACKUP_SUFFIX  ".old"
 
-struct passwd *pp;
-struct group *gp;
 int dobackup, docompare, dodest, dodir, dopreserve, dostrip, safecopy;
 int mode = S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH;
 char pathbuf[PATH_MAX], tempfile[PATH_MAX];
 char *suffix = BACKUP_SUFFIX;
-uid_t uid;
-gid_t gid;
+uid_t uid = (uid_t)-1;
+gid_t gid = (gid_t)-1;
 
 void   copy(int, char *, int, char *, off_t, int);
 int    compare(int, const char *, off_t, int, const char *, off_t);
@@ -89,6 +87,7 @@ main(int argc, char *argv[])
        u_int iflags;
        int ch, no_target;
        char *flags, *to_name, *group = NULL, *owner = NULL;
+       const char *errstr;
 
        iflags = 0;
        while ((ch = getopt(argc, argv, "B:bCcDdFf:g:m:o:pSs")) != -1)
@@ -161,12 +160,16 @@ main(int argc, char *argv[])
                safecopy = 1;
 
        /* get group and owner id's */
-       if (group && !(gp = getgrnam(group)) && !isdigit((unsigned char)*group))
-               errx(1, "unknown group %s", group);
-       gid = (group) ? ((gp) ? gp->gr_gid : (gid_t)strtoul(group, NULL, 10)) : 
(gid_t)-1;
-       if (owner && !(pp = getpwnam(owner)) && !isdigit((unsigned char)*owner))
-               errx(1, "unknown user %s", owner);
-       uid = (owner) ? ((pp) ? pp->pw_uid : (uid_t)strtoul(owner, NULL, 10)) : 
(uid_t)-1;
+       if (group != NULL && gid_from_group(group, &gid) == -1) {
+               gid = strtonum(group, 0, GID_MAX, &errstr);
+               if (errstr != NULL)
+                       errx(1, "unknown group %s", group);
+       }
+       if (owner != NULL && uid_from_user(owner, &uid) == -1) {
+               uid = strtonum(owner, 0, UID_MAX, &errstr);
+               if (errstr != NULL)
+                       errx(1, "unknown user %s", owner);
+       }
 
        if (dodir) {
                for (; *argv != NULL; ++argv)
Index: usr.sbin/mtree/create.c
===================================================================
RCS file: /cvs/src/usr.sbin/mtree/create.c,v
retrieving revision 1.32
diff -u -p -u -r1.32 create.c
--- usr.sbin/mtree/create.c     16 Aug 2016 16:41:46 -0000      1.32
+++ usr.sbin/mtree/create.c     10 Sep 2018 00:46:49 -0000
@@ -127,11 +127,10 @@ cwalk(void)
 static void
 statf(int indent, FTSENT *p)
 {
-       struct group *gr;
-       struct passwd *pw;
        u_int32_t len, val;
        int fd, offset;
-       char *name, *escaped_name;
+       const char *name;
+       char *escaped_name;
        size_t esc_len;
 
        esc_len = p->fts_namelen * 4 + 1;
@@ -157,8 +156,9 @@ statf(int indent, FTSENT *p)
                output(indent, &offset, "type=%s", 
inotype(p->fts_statp->st_mode));
        if (p->fts_statp->st_uid != uid) {
                if (keys & F_UNAME) {
-                       if ((pw = getpwuid(p->fts_statp->st_uid)) != NULL) {
-                               output(indent, &offset, "uname=%s", 
pw->pw_name);
+                       name = user_from_uid(p->fts_statp->st_uid, 1);
+                       if (name != NULL) {
+                               output(indent, &offset, "uname=%s", name);
                        } else {
                                error("could not get uname for uid=%u",
                                    p->fts_statp->st_uid);
@@ -169,8 +169,9 @@ statf(int indent, FTSENT *p)
        }
        if (p->fts_statp->st_gid != gid) {
                if (keys & F_GNAME) {
-                       if ((gr = getgrgid(p->fts_statp->st_gid)) != NULL) {
-                               output(indent, &offset, "gname=%s", 
gr->gr_name);
+                       name = group_from_gid(p->fts_statp->st_gid, 1);
+                       if (name != NULL) {
+                               output(indent, &offset, "gname=%s", name);
                        } else {
                                error("could not get gname for gid=%u",
                                    p->fts_statp->st_gid);
@@ -270,8 +271,6 @@ statd(FTS *t, FTSENT *parent, uid_t *pui
        gid_t sgid;
        uid_t suid;
        mode_t smode;
-       struct group *gr;
-       struct passwd *pw;
        gid_t savegid = *pgid;
        uid_t saveuid = *puid;
        mode_t savemode = *pmode;
@@ -281,6 +280,7 @@ statd(FTS *t, FTSENT *parent, uid_t *pui
        gid_t g[MAXGID];
        uid_t u[MAXUID];
        mode_t m[MAXMODE];
+       const char *name;
        static int first = 1;
 
        if ((p = fts_children(t, 0)) == NULL) {
@@ -327,16 +327,16 @@ statd(FTS *t, FTSENT *parent, uid_t *pui
                else
                        (void)printf("/set type=file");
                if (keys & F_UNAME) {
-                       if ((pw = getpwuid(saveuid)) != NULL)
-                               (void)printf(" uname=%s", pw->pw_name);
+                       if ((name = user_from_uid(saveuid, 1)) != NULL)
+                               (void)printf(" uname=%s", name);
                        else
                                error("could not get uname for uid=%u", 
saveuid);
                }
                if (keys & F_UID)
                        (void)printf(" uid=%u", saveuid);
                if (keys & F_GNAME) {
-                       if ((gr = getgrgid(savegid)) != NULL)
-                               (void)printf(" gname=%s", gr->gr_name);
+                       if ((name = group_from_gid(savegid, 1)) != NULL)
+                               (void)printf(" gname=%s", name);
                        else
                                error("could not get gname for gid=%u", 
savegid);
                }
Index: usr.sbin/mtree/mtree.c
===================================================================
RCS file: /cvs/src/usr.sbin/mtree/mtree.c,v
retrieving revision 1.24
diff -u -p -u -r1.24 mtree.c
--- usr.sbin/mtree/mtree.c      20 Dec 2015 19:53:24 -0000      1.24
+++ usr.sbin/mtree/mtree.c      10 Sep 2018 15:08:51 -0000
@@ -155,6 +155,10 @@ main(int argc, char *argv[])
                }
        }
 
+       /* Keep passwd and group files open for faster lookups. */
+       setpassent(1);
+       setgroupent(1);
+
        if (dir && chdir(dir))
                error("%s: %s", dir, strerror(errno));
 
Index: usr.sbin/mtree/spec.c
===================================================================
RCS file: /cvs/src/usr.sbin/mtree/spec.c,v
retrieving revision 1.28
diff -u -p -u -r1.28 spec.c
--- usr.sbin/mtree/spec.c       16 Aug 2016 16:41:46 -0000      1.28
+++ usr.sbin/mtree/spec.c       10 Sep 2018 00:46:49 -0000
@@ -169,8 +169,6 @@ set(char *t, NODE *ip)
 {
        int type;
        char *kw, *val = NULL;
-       struct group *gr;
-       struct passwd *pw;
        void *m;
        int value;
        u_int32_t fset, fclr;
@@ -207,9 +205,8 @@ set(char *t, NODE *ip)
                                error("invalid gid %s", val);
                        break;
                case F_GNAME:
-                       if ((gr = getgrnam(val)) == NULL)
+                       if (gid_from_group(val, &ip->st_gid) == -1)
                            error("unknown group %s", val);
-                       ip->st_gid = gr->gr_gid;
                        break;
                case F_IGN:
                        /* just set flag bit */
@@ -302,9 +299,8 @@ set(char *t, NODE *ip)
                                error("invalid uid %s", val);
                        break;
                case F_UNAME:
-                       if ((pw = getpwnam(val)) == NULL)
+                       if (uid_from_user(val, &ip->st_uid) == -1)
                            error("unknown user %s", val);
-                       ip->st_uid = pw->pw_uid;
                        break;
                }
        }
Index: usr.sbin/vmctl/vmctl.c
===================================================================
RCS file: /cvs/src/usr.sbin/vmctl/vmctl.c,v
retrieving revision 1.56
diff -u -p -u -r1.56 vmctl.c
--- usr.sbin/vmctl/vmctl.c      9 Sep 2018 04:09:32 -0000       1.56
+++ usr.sbin/vmctl/vmctl.c      10 Sep 2018 16:01:05 -0000
@@ -631,8 +631,7 @@ print_vm_info(struct vmop_info_result *l
        char curmem[FMT_SCALED_STRSIZE];
        char maxmem[FMT_SCALED_STRSIZE];
        char user[16], group[16];
-       struct passwd *pw;
-       struct group *gr;
+       const char *name;
 
        printf("%5s %5s %5s %7s %7s %7s %12s %s\n", "ID", "PID", "VCPUS",
            "MAXMEM", "CURMEM", "TTY", "OWNER", "NAME");
@@ -642,22 +641,23 @@ print_vm_info(struct vmop_info_result *l
                vir = &vmi->vir_info;
                if (check_info_id(vir->vir_name, vir->vir_id)) {
                        /* get user name */
-                       if ((pw = getpwuid(vmi->vir_uid)) == NULL)
+                       name = user_from_uid(vmi->vir_uid, 1);
+                       if (name == NULL)
                                (void)snprintf(user, sizeof(user),
                                    "%d", vmi->vir_uid);
                        else
-                               (void)strlcpy(user, pw->pw_name,
-                                   sizeof(user));
+                               (void)strlcpy(user, name, sizeof(user));
                        /* get group name */
                        if (vmi->vir_gid != -1) {
                                if (vmi->vir_uid == 0)
                                        *user = '\0';
-                               if ((gr = getgrgid(vmi->vir_gid)) == NULL)
+                               name = group_from_gid(vmi->vir_gid, 1);
+                               if (name == NULL)
                                        (void)snprintf(group, sizeof(group),
                                            ":%lld", vmi->vir_gid);
                                else
                                        (void)snprintf(group, sizeof(group),
-                                           ":%s", gr->gr_name);
+                                           ":%s", name);
                                (void)strlcat(user, group, sizeof(user));
                        }
 
Index: usr.sbin/quot/quot.c
===================================================================
RCS file: /cvs/src/usr.sbin/quot/quot.c,v
retrieving revision 1.31
diff -u -p -u -r1.31 quot.c
--- usr.sbin/quot/quot.c        26 Jul 2018 13:37:40 -0000      1.31
+++ usr.sbin/quot/quot.c        10 Sep 2018 16:05:11 -0000
@@ -227,8 +227,8 @@ static struct user *
 user(uid_t uid)
 {
        int i;
-       struct passwd *pwd;
        struct user *usr;
+       const char *name;
 
        while (1) {
                for (usr = users + (uid&(nusers - 1)), i = nusers;
@@ -237,10 +237,10 @@ user(uid_t uid)
                        if (!usr->name) {
                                usr->uid = uid;
 
-                               if (!(pwd = getpwuid(uid)))
+                               if ((name = user_from_uid(uid, 1)) == NULL)
                                        asprintf(&usr->name, "#%u", uid);
                                else
-                                       usr->name = strdup(pwd->pw_name);
+                                       usr->name = strdup(name);
                                if (!usr->name)
                                        err(1, "allocate users");
                                return usr;
@@ -368,6 +368,8 @@ douser(int fd, struct fs *super, char *n
        struct user *usr, *usrs;
        union dinode *dp;
        int n;
+
+       setpassent(1);
 
        maxino = super->fs_ncg * super->fs_ipg - 1;
        for (inode = 0; inode < maxino; inode++) {
Index: usr.sbin/edquota/edquota.c
===================================================================
RCS file: /cvs/src/usr.sbin/edquota/edquota.c,v
retrieving revision 1.58
diff -u -p -u -r1.58 edquota.c
--- usr.sbin/edquota/edquota.c  26 Apr 2018 12:42:51 -0000      1.58
+++ usr.sbin/edquota/edquota.c  10 Sep 2018 16:11:17 -0000
@@ -191,14 +191,11 @@ main(int argc, char *argv[])
 int
 getentry(char *name, int quotatype, u_int *idp)
 {
-       struct passwd *pw;
-       struct group *gr;
        u_int id;
 
        switch(quotatype) {
        case USRQUOTA:
-               if ((pw = getpwnam(name))) {
-                       *idp = pw->pw_uid;
+               if (uid_from_user(name, idp) != (uid_t)-1) {
                        return 0;
                } else if (alldigits(name)) {
                        if ((id = strtoul(name, NULL, 10)) <= UID_MAX) {
@@ -209,8 +206,7 @@ getentry(char *name, int quotatype, u_in
                warnx("%s: no such user", name);
                break;
        case GRPQUOTA:
-               if ((gr = getgrnam(name))) {
-                       *idp = gr->gr_gid;
+               if (gid_from_group(name, idp) != (gid_t)-1) {
                        return 0;
                } else if (alldigits(name)) {
                        if ((id = strtoul(name, NULL, 10)) <= GID_MAX) {
Index: usr.bin/pkill/pkill.c
===================================================================
RCS file: /cvs/src/usr.bin/pkill/pkill.c,v
retrieving revision 1.39
diff -u -p -u -r1.39 pkill.c
--- usr.bin/pkill/pkill.c       10 Oct 2016 02:22:59 -0000      1.39
+++ usr.bin/pkill/pkill.c       10 Sep 2018 16:15:18 -0000
@@ -544,10 +544,10 @@ static void
 makelist(struct listhead *head, enum listtype type, char *src)
 {
        struct list *li;
-       struct passwd *pw;
-       struct group *gr;
        struct stat st;
        char *sp, *p, buf[PATH_MAX];
+       uid_t uid;
+       gid_t gid;
        int empty;
 
        empty = 1;
@@ -588,14 +588,14 @@ makelist(struct listhead *head, enum lis
 
                switch (type) {
                case LT_USER:
-                       if ((pw = getpwnam(sp)) == NULL)
+                       if (uid_from_user(sp, &uid) == -1)
                                errx(STATUS_BADUSAGE, "unknown user `%s'", sp);
-                       li->li_number = pw->pw_uid;
+                       li->li_number = uid;
                        break;
                case LT_GROUP:
-                       if ((gr = getgrnam(sp)) == NULL)
+                       if (gid_from_group(sp, &gid) == -1)
                                errx(STATUS_BADUSAGE, "unknown group `%s'", sp);
-                       li->li_number = gr->gr_gid;
+                       li->li_number = gid;
                        break;
                case LT_TTY:
                        if (strcmp(sp, "-") == 0) {

Reply via email to