From d7a805efafd83203e72c334089c3f88204231ac7 Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Wed, 3 Dec 2008 19:05:55 +0000 Subject: [PATCH] libbb: introduce and use xgetpwnam. ~ -150 bytes. --- coreutils/id.c | 4 +--- include/libbb.h | 1 + libbb/bb_pwd.c | 15 ++++++++++----- loginutils/addgroup.c | 1 + loginutils/passwd.c | 4 +--- loginutils/su.c | 4 +--- miscutils/crontab.c | 4 +--- networking/tftp.c | 4 +--- 8 files changed, 17 insertions(+), 20 deletions(-) diff --git a/coreutils/id.c b/coreutils/id.c index 33e06f427..43f403fa3 100644 --- a/coreutils/id.c +++ b/coreutils/id.c @@ -124,9 +124,7 @@ int id_main(int argc UNUSED_PARAM, char **argv) username = argv[optind]; if (username) { - struct passwd *p = getpwnam(username); - if (!p) - bb_error_msg_and_die("unknown user %s", username); + struct passwd *p = xgetpwnam(username); euid = ruid = p->pw_uid; egid = rgid = p->pw_gid; } else { diff --git a/include/libbb.h b/include/libbb.h index a34e8a1f9..80311db2b 100644 --- a/include/libbb.h +++ b/include/libbb.h @@ -702,6 +702,7 @@ int get_uidgid(struct bb_uidgid_t*, const char*, int numeric_ok) FAST_FUNC; void xget_uidgid(struct bb_uidgid_t*, const char*) FAST_FUNC; /* chown-like handling of "user[:[group]" */ void parse_chown_usergroup_or_die(struct bb_uidgid_t *u, char *user_group) FAST_FUNC; +struct passwd* xgetpwnam(const char *name) FAST_FUNC; struct passwd* xgetpwuid(uid_t uid) FAST_FUNC; struct group* xgetgrgid(gid_t gid) FAST_FUNC; char* xuid2uname(uid_t uid) FAST_FUNC; diff --git a/libbb/bb_pwd.c b/libbb/bb_pwd.c index 5e44edc90..5dbc58d9f 100644 --- a/libbb/bb_pwd.c +++ b/libbb/bb_pwd.c @@ -15,7 +15,15 @@ * pointers to static data (getpwuid) */ -/* TODO: add xgetpwnam, this construct is used a lot */ +struct passwd* FAST_FUNC xgetpwnam(const char *name) +{ + struct passwd *pw = getpwnam(name); + if (!pw) + bb_error_msg_and_die("unknown user %s", name); + return pw; +} + +/* xgetgrnam too? */ struct passwd* FAST_FUNC xgetpwuid(uid_t uid) { @@ -73,10 +81,7 @@ long FAST_FUNC xuname2uid(const char *name) { struct passwd *myuser; - myuser = getpwnam(name); - if (myuser == NULL) - bb_error_msg_and_die("unknown user %s", name); - + myuser = xgetpwnam(name); return myuser->pw_uid; } diff --git a/loginutils/addgroup.c b/loginutils/addgroup.c index 89414d738..2a840d7c0 100644 --- a/loginutils/addgroup.c +++ b/loginutils/addgroup.c @@ -159,6 +159,7 @@ int addgroup_main(int argc UNUSED_PARAM, char **argv) /* check if group and user exist */ xuname2uid(argv[0]); /* unknown user: exit */ xgroup2gid(argv[1]); /* unknown group: exit */ +// race here! /* check if user is already in this group */ gr = getgrnam(argv[1]); for (; *(gr->gr_mem) != NULL; (gr->gr_mem)++) { diff --git a/loginutils/passwd.c b/loginutils/passwd.c index e3e74bae7..aa89b87a7 100644 --- a/loginutils/passwd.c +++ b/loginutils/passwd.c @@ -118,9 +118,7 @@ int passwd_main(int argc UNUSED_PARAM, char **argv) myname = xstrdup(xuid2uname(myuid)); name = argv[0] ? argv[0] : myname; - pw = getpwnam(name); - if (!pw) - bb_error_msg_and_die("unknown user %s", name); + pw = xgetpwnam(name); if (myuid && pw->pw_uid != myuid) { /* LOGMODE_BOTH */ bb_error_msg_and_die("%s can't change password for %s", myname, name); diff --git a/loginutils/su.c b/loginutils/su.c index 61039d823..e7e0001c7 100644 --- a/loginutils/su.c +++ b/loginutils/su.c @@ -48,9 +48,7 @@ int su_main(int argc UNUSED_PARAM, char **argv) openlog(applet_name, 0, LOG_AUTH); } - pw = getpwnam(opt_username); - if (!pw) - bb_error_msg_and_die("unknown id: %s", opt_username); + pw = xgetpwnam(opt_username); /* Make sure pw->pw_shell is non-NULL. It may be NULL when NEW_USER is a username that is retrieved via NIS (YP), but that doesn't have diff --git a/miscutils/crontab.c b/miscutils/crontab.c index 902014963..13dfd77ad 100644 --- a/miscutils/crontab.c +++ b/miscutils/crontab.c @@ -126,9 +126,7 @@ int crontab_main(int argc UNUSED_PARAM, char **argv) } if (opt_ler & OPT_u) { - pas = getpwnam(user_name); - if (!pas) - bb_error_msg_and_die("user %s is not known", user_name); + pas = xgetpwnam(user_name); } else { pas = xgetpwuid(getuid()); } diff --git a/networking/tftp.c b/networking/tftp.c index 1f706852a..799dd9903 100644 --- a/networking/tftp.c +++ b/networking/tftp.c @@ -223,9 +223,7 @@ static int tftp_protocol( } if (user_opt) { - struct passwd *pw = getpwnam(user_opt); - if (!pw) - bb_error_msg_and_die("unknown user %s", user_opt); + struct passwd *pw = xgetpwnam(user_opt); change_identity(pw); /* initgroups, setgid, setuid */ } }