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) {