Make separate functions to show users and groups

This commit is contained in:
Baptiste Daroussin 2015-07-11 18:09:27 +00:00
parent 20b6ee617f
commit ae73dd9f37
4 changed files with 78 additions and 33 deletions

View File

@ -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);

View File

@ -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

View File

@ -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

View File

@ -88,6 +88,8 @@ struct pwconf {
int fd;
int which;
bool quiet;
bool force;
bool all;
bool dryrun;
bool pretty;
bool v7;