svn commit: r285398 - head/usr.sbin/pw
Baptiste Daroussin
bapt at FreeBSD.org
Sat Jul 11 18:09:30 UTC 2015
Author: bapt
Date: Sat Jul 11 18:09:27 2015
New Revision: 285398
URL: https://svnweb.freebsd.org/changeset/base/285398
Log:
Make separate functions to show users and groups
Modified:
head/usr.sbin/pw/pw.c
head/usr.sbin/pw/pw_group.c
head/usr.sbin/pw/pw_user.c
head/usr.sbin/pw/pwupd.h
Modified: head/usr.sbin/pw/pw.c
==============================================================================
--- head/usr.sbin/pw/pw.c Sat Jul 11 17:33:50 2015 (r285397)
+++ head/usr.sbin/pw/pw.c Sat Jul 11 18:09:27 2015 (r285398)
@@ -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);
Modified: head/usr.sbin/pw/pw_group.c
==============================================================================
--- head/usr.sbin/pw/pw_group.c Sat Jul 11 17:33:50 2015 (r285397)
+++ head/usr.sbin/pw/pw_group.c Sat Jul 11 18:09:27 2015 (r285398)
@@ -103,6 +103,37 @@ pw_groupnext(struct userconf *cnf, bool
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,
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
Modified: head/usr.sbin/pw/pw_user.c
==============================================================================
--- head/usr.sbin/pw/pw_user.c Sat Jul 11 17:33:50 2015 (r285397)
+++ head/usr.sbin/pw/pw_user.c Sat Jul 11 18:09:27 2015 (r285398)
@@ -162,6 +162,36 @@ pw_usernext(struct userconf *cnf, bool q
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, s
static struct passwd fakeuser =
{
- NULL,
+ "nouser",
"*",
-1,
-1,
@@ -233,6 +263,9 @@ pw_user(int mode, char *name, long id, s
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, s
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, s
* 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, s
} 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
Modified: head/usr.sbin/pw/pwupd.h
==============================================================================
--- head/usr.sbin/pw/pwupd.h Sat Jul 11 17:33:50 2015 (r285397)
+++ head/usr.sbin/pw/pwupd.h Sat Jul 11 18:09:27 2015 (r285398)
@@ -88,6 +88,8 @@ struct pwconf {
int fd;
int which;
bool quiet;
+ bool force;
+ bool all;
bool dryrun;
bool pretty;
bool v7;
More information about the svn-src-head
mailing list