Add groupadd applet which aims to be portable with groupadd from shadow-utils/pkg-shadow. groupadd exists in both debian/ubuntu and fedora/centos while addgroup only exists on debian/ubuntu.
We add the groupadd applet to improve portability, while keeping addgroup to be backwards compatible. function old new delta new_group - 214 +214 groupadd_main - 166 +166 .rodata 93576 93643 +67 packed_usage 19378 19413 +35 groupadd_longopts - 16 +16 applet_names 1632 1641 +9 applet_main 1984 1992 +8 bbconfig_config_bz2 5543 5544 +1 applet_suid 62 63 +1 applet_install_loc 124 125 +1 addgroup_main 503 303 -200 ------------------------------------------------------------------------------ (add/remove: 3/0 grow/shrink: 7/1 up/down: 518/-200) Total: 318 bytes text data bss dec hex filename 593356 11443 3096 607895 94697 busybox_old 593627 11451 3096 608174 947ae busybox_unstripped Signed-off-by: Natanael Copa <[email protected]> --- I kept the addgroup applet for the following reasons: - We may need the backward compatible addgroup for a migration period to not break things. - the `shadow` groupadd can not add users to a group. We need keep addgroup til we have an applet that can add users to a group. libbb/Kbuild.src | 1 + loginutils/addgroup.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 69 insertions(+), 1 deletion(-) diff --git a/libbb/Kbuild.src b/libbb/Kbuild.src index b08ce11..b2a5fdc 100644 --- a/libbb/Kbuild.src +++ b/libbb/Kbuild.src @@ -140,6 +140,7 @@ lib-$(CONFIG_ADDGROUP) += update_passwd.o lib-$(CONFIG_ADDUSER) += update_passwd.o lib-$(CONFIG_DELGROUP) += update_passwd.o lib-$(CONFIG_DELUSER) += update_passwd.o +lib-$(CONFIG_GROUPADD) += update_passwd.o lib-$(CONFIG_FTPD) += correct_password.o lib-$(CONFIG_PASSWD) += pw_encrypt.o update_passwd.o obscure.o diff --git a/loginutils/addgroup.c b/loginutils/addgroup.c index 4d4fc3f..bc0d56c 100644 --- a/loginutils/addgroup.c +++ b/loginutils/addgroup.c @@ -31,9 +31,25 @@ //config: addgroup will add an existing user to an //config: existing group. +//config:config GROUPADD +//config: bool "groupadd" +//config: default n +//config: help +//config: A more portable utility for creating a new group account. +//config: +//config:config FEATURE_GROUPADD_LONG_OPTIONS +//config: bool "Enable long options" +//config: default y +//config: depends on GROUPADD && LONG_OPTS +//config: help +//config: Support long options for the groupadd applet. +//config: + //applet:IF_ADDGROUP(APPLET(addgroup, BB_DIR_USR_SBIN, BB_SUID_DROP)) +//applet:IF_GROUPADD(APPLET(groupadd, BB_DIR_USR_SBIN, BB_SUID_DROP)) //kbuild:lib-$(CONFIG_ADDGROUP) += addgroup.o +//kbuild:lib-$(CONFIG_GROUPADD) += addgroup.o //usage:#define addgroup_trivial_usage //usage: "[-g GID] [-S] " IF_FEATURE_ADDUSER_TO_GROUP("[USER] ") "GROUP" @@ -42,6 +58,13 @@ //usage: "\n -g GID Group id" //usage: "\n -S Create a system group" +//usage:#define groupadd_trivial_usage +//usage: "[-g GID] [-r] GROUP" +//usage:#define groupadd_full_usage "\n\n" +//usage: "Add a group\n" +//usage: "\n -g GID Group id" +//usage: "\n -r Create a system group" + #include "libbb.h" #if CONFIG_LAST_SYSTEM_ID < CONFIG_FIRST_SYSTEM_ID @@ -101,6 +124,8 @@ static void new_group(char *group, gid_t gid) struct group gr; char *p; + die_if_bad_username(group); + /* make sure gid and group haven't already been allocated */ gr.gr_gid = gid; gr.gr_name = group; @@ -147,6 +172,7 @@ static const char addgroup_longopts[] ALIGN1 = * If called with two non-option arguments, addgroup * will add an existing user to an existing group. */ +#if ENABLE_ADDGROUP int addgroup_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; int addgroup_main(int argc UNUSED_PARAM, char **argv) { @@ -200,9 +226,50 @@ int addgroup_main(int argc UNUSED_PARAM, char **argv) } else #endif /* ENABLE_FEATURE_ADDUSER_TO_GROUP */ { - die_if_bad_username(argv[0]); new_group(argv[0], xatou_range(gid, 0, CONFIG_LAST_ID)); } /* Reached only on success */ return EXIT_SUCCESS; } +#endif /* ENABLE_ADDGROUP */ + + +#if ENABLE_FEATURE_GROUPADD_LONG_OPTIONS +static const char groupadd_longopts[] ALIGN1 = + "gid\0" Required_argument "g" + "system\0" No_argument "r" + ; +#endif + +/* + * groupadd will take a login_name as its first parameter. + * + * gid can be customized via command-line parameters. + */ +#if ENABLE_GROUPADD +int groupadd_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; +int groupadd_main(int argc UNUSED_PARAM, char **argv) +{ + unsigned opts; + const char *gid = "0"; + + /* need to be root */ + if (geteuid()) { + bb_error_msg_and_die(bb_msg_perm_denied_are_you_root); + } +#if ENABLE_FEATURE_GROUPADD_LONG_OPTIONS + applet_long_options = groupadd_longopts; +#endif + /* Syntax: + * groupadd group + * groupadd -g num group + * Check for min, max and missing args */ + opt_complementary = "=1"; + opts = getopt32(argv, "g:r", &gid); + + new_group(argv[optind], xatou_range(gid, 0, CONFIG_LAST_ID)); + + /* Reached only on success */ + return EXIT_SUCCESS; +} +#endif /* ENABLE_GROUPADD */ -- 2.8.1 _______________________________________________ busybox mailing list [email protected] http://lists.busybox.net/mailman/listinfo/busybox
