From ae73dd9f37b296c9a29acd89a2dc59da69ee4ee9 Mon Sep 17 00:00:00 2001 From: Baptiste Daroussin Date: Sat, 11 Jul 2015 18:09:27 +0000 Subject: [PATCH] Make separate functions to show users and groups --- usr.sbin/pw/pw.c | 6 +++++ usr.sbin/pw/pw_group.c | 51 ++++++++++++++++++++++++++++------------- usr.sbin/pw/pw_user.c | 52 ++++++++++++++++++++++++++++-------------- usr.sbin/pw/pwupd.h | 2 ++ 4 files changed, 78 insertions(+), 33 deletions(-) diff --git a/usr.sbin/pw/pw.c b/usr.sbin/pw/pw.c index 951abc6a0b0a..56e410329471 100644 --- a/usr.sbin/pw/pw.c +++ b/usr.sbin/pw/pw.c @@ -234,6 +234,9 @@ main(int argc, char *argv[]) conf.config = optarg; config = conf.config; break; + case 'F': + conf.force = true; + break; case 'N': conf.dryrun = true; break; @@ -248,6 +251,9 @@ main(int argc, char *argv[]) case 'Y': nis = true; break; + case 'a': + conf.all = true; + break; case 'g': if (which == 0) { /* for user* */ addarg(&arglist, 'g', optarg); diff --git a/usr.sbin/pw/pw_group.c b/usr.sbin/pw/pw_group.c index 61f0a21d90cb..d87c8cc6408e 100644 --- a/usr.sbin/pw/pw_group.c +++ b/usr.sbin/pw/pw_group.c @@ -103,6 +103,37 @@ pw_groupnext(struct userconf *cnf, bool quiet) return (EXIT_SUCCESS); } +static int +pw_groupshow(const char *name, long id, struct group *fakegroup) +{ + struct group *grp = NULL; + + if (id < 0 && name == NULL && !conf.all) + errx(EX_DATAERR, "groupname or id or '-a' required"); + + if (conf.all) { + SETGRENT(); + while ((grp = GETGRENT()) != NULL) + print_group(grp); + ENDGRENT(); + + return (EXIT_SUCCESS); + } + + grp = (name != NULL) ? GETGRNAM(name) : GETGRGID(id); + if (grp == NULL) { + if (conf.force) { + grp = fakegroup; + } else { + if (name == NULL) + errx(EX_DATAERR, "unknown gid `%ld'", id); + errx(EX_DATAERR, "unknown group `%s'", name); + } + } + + return (print_group(grp)); +} + int pw_group(int mode, char *name, long id, struct cargs * args) { @@ -124,34 +155,22 @@ pw_group(int mode, char *name, long id, struct cargs * args) if (mode == M_NEXT) return (pw_groupnext(cnf, conf.quiet)); + if (mode == M_PRINT) + return (pw_groupshow(name, id, &fakegroup)); + if (mode == M_LOCK || mode == M_UNLOCK) errx(EX_USAGE, "'lock' command is not available for groups"); - if (mode == M_PRINT && getarg(args, 'a')) { - SETGRENT(); - while ((grp = GETGRENT()) != NULL) - print_group(grp); - ENDGRENT(); - return EXIT_SUCCESS; - } if (id < 0 && name == NULL) errx(EX_DATAERR, "group name or id required"); grp = (name != NULL) ? GETGRNAM(name) : GETGRGID(id); - if (mode == M_UPDATE || mode == M_DELETE || mode == M_PRINT) { + if (mode == M_UPDATE || mode == M_DELETE) { if (name == NULL && grp == NULL) /* Try harder */ grp = GETGRGID(id); if (grp == NULL) { - if (mode == M_PRINT && getarg(args, 'F')) { - char *fmems[1]; - fmems[0] = NULL; - fakegroup.gr_name = name ? name : "nogroup"; - fakegroup.gr_gid = (gid_t) id; - fakegroup.gr_mem = fmems; - return print_group(&fakegroup); - } if (name == NULL) errx(EX_DATAERR, "unknown group `%s'", name); else diff --git a/usr.sbin/pw/pw_user.c b/usr.sbin/pw/pw_user.c index dc9827af0e22..153bc43baba5 100644 --- a/usr.sbin/pw/pw_user.c +++ b/usr.sbin/pw/pw_user.c @@ -162,6 +162,36 @@ pw_usernext(struct userconf *cnf, bool quiet) return (EXIT_SUCCESS); } +static int +pw_usershow(char *name, long id, struct passwd *fakeuser) +{ + struct passwd *pwd = NULL; + + if (id < 0 && name == NULL && !conf.all) + errx(EX_DATAERR, "username or id or '-a' required"); + + if (conf.all) { + SETPWENT(); + while ((pwd = GETPWENT()) != NULL) + print_user(pwd); + ENDPWENT(); + return (EXIT_SUCCESS); + } + + pwd = (name != NULL) ? GETPWNAM(pw_checkname(name, 0)) : GETPWUID(id); + if (pwd == NULL) { + if (conf.force) { + pwd = fakeuser; + } else { + if (name == NULL) + errx(EX_NOUSER, "no such uid `%ld'", id); + errx(EX_NOUSER, "no such user `%s'", name); + } + } + + return (print_user(pwd)); +} + /*- * -C config configuration file * -q quiet operation @@ -213,7 +243,7 @@ pw_user(int mode, char *name, long id, struct cargs * args) static struct passwd fakeuser = { - NULL, + "nouser", "*", -1, -1, @@ -233,6 +263,9 @@ pw_user(int mode, char *name, long id, struct cargs * args) if (mode == M_NEXT) return (pw_usernext(cnf, conf.quiet)); + if (mode == M_PRINT) + return (pw_usershow(name, id, &fakeuser)); + /* * We can do all of the common legwork here */ @@ -377,14 +410,6 @@ pw_user(int mode, char *name, long id, struct cargs * args) err(EX_IOERR, "config udpate"); } - if (mode == M_PRINT && getarg(args, 'a')) { - SETPWENT(); - while ((pwd = GETPWENT()) != NULL) - print_user(pwd); - ENDPWENT(); - return EXIT_SUCCESS; - } - if (name != NULL) pwd = GETPWNAM(pw_checkname(name, 0)); @@ -395,17 +420,12 @@ pw_user(int mode, char *name, long id, struct cargs * args) * Update, delete & print require that the user exists */ if (mode == M_UPDATE || mode == M_DELETE || - mode == M_PRINT || mode == M_LOCK || mode == M_UNLOCK) { + mode == M_LOCK || mode == M_UNLOCK) { if (name == NULL && pwd == NULL) /* Try harder */ pwd = GETPWUID(id); if (pwd == NULL) { - if (mode == M_PRINT && getarg(args, 'F')) { - fakeuser.pw_name = name ? name : "nouser"; - fakeuser.pw_uid = (uid_t) id; - return print_user(&fakeuser); - } if (name == NULL) errx(EX_NOUSER, "no such uid `%ld'", id); errx(EX_NOUSER, "no such user `%s'", name); @@ -440,8 +460,6 @@ pw_user(int mode, char *name, long id, struct cargs * args) } else if (mode == M_DELETE) return (delete_user(cnf, pwd, name, getarg(args, 'r') != NULL, mode)); - else if (mode == M_PRINT) - return print_user(pwd); /* * The rest is edit code diff --git a/usr.sbin/pw/pwupd.h b/usr.sbin/pw/pwupd.h index be126c54a46f..97e18f5b8878 100644 --- a/usr.sbin/pw/pwupd.h +++ b/usr.sbin/pw/pwupd.h @@ -88,6 +88,8 @@ struct pwconf { int fd; int which; bool quiet; + bool force; + bool all; bool dryrun; bool pretty; bool v7;