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