From 8dc6d1a813e2be33ecfcf3fa97a1b5aae05a8631 Mon Sep 17 00:00:00 2001 From: Tito Ragusa Date: Mon, 8 Oct 2012 11:18:08 +0200 Subject: adduser: make it accept "adduser USER GROUP" form Signed-off-by: Tito Ragusa Signed-off-by: Denys Vlasenko Signed-off-by: Denys Vlasenko --- loginutils/adduser.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) (limited to 'loginutils') diff --git a/loginutils/adduser.c b/loginutils/adduser.c index 1d082c8..dc02444 100644 --- a/loginutils/adduser.c +++ b/loginutils/adduser.c @@ -9,9 +9,9 @@ */ //usage:#define adduser_trivial_usage -//usage: "[OPTIONS] USER" +//usage: "[OPTIONS] USER [GROUP]" //usage:#define adduser_full_usage "\n\n" -//usage: "Add a user\n" +//usage: "Create new user, or add USER to GROUP\n" //usage: "\n -h DIR Home directory" //usage: "\n -g GECOS GECOS field" //usage: "\n -s SHELL Login shell" @@ -80,7 +80,7 @@ static void passwd_study(struct passwd *p) } } -static void addgroup_wrapper(struct passwd *p, const char *group_name) +static int addgroup_wrapper(struct passwd *p, const char *group_name) { char *argv[6]; @@ -110,7 +110,7 @@ static void addgroup_wrapper(struct passwd *p, const char *group_name) argv[5] = NULL; } - spawn_and_wait(argv); + return spawn_and_wait(argv); } static void passwd_wrapper(const char *login_name) NORETURN; @@ -162,9 +162,9 @@ int adduser_main(int argc UNUSED_PARAM, char **argv) pw.pw_shell = (char *)get_shell_name(); pw.pw_dir = NULL; - /* exactly one non-option arg */ + /* at most two non-option args */ /* disable interactive passwd for system accounts */ - opt_complementary = "=1:SD:u+"; + opt_complementary = "?2:SD:u+"; if (sizeof(pw.pw_uid) == sizeof(int)) { opts = getopt32(argv, "h:g:s:G:DSHu:", &pw.pw_dir, &pw.pw_gecos, &pw.pw_shell, &usegroup, &pw.pw_uid); } else { @@ -175,9 +175,16 @@ int adduser_main(int argc UNUSED_PARAM, char **argv) } } argv += optind; + pw.pw_name = argv[0]; + + if (!opts && argv[1]) { + /* if called with two non-option arguments, adduser + * will add an existing user to an existing group. + */ + return addgroup_wrapper(&pw, argv[1]); + } /* fill in the passwd struct */ - pw.pw_name = argv[0]; die_if_bad_username(pw.pw_name); if (!pw.pw_dir) { /* create string for $HOME if not specified already */ @@ -205,7 +212,6 @@ int adduser_main(int argc UNUSED_PARAM, char **argv) } if (ENABLE_FEATURE_CLEAN_UP) free(p); - #if ENABLE_FEATURE_SHADOWPASSWDS /* /etc/shadow fields: * 1. username -- cgit v1.1