Add option to only remove group if it is empty. The option can also be given to deluser, if delgroup is enabled. When --only-if-empty flag is given to deluser, it will not return failure when removing same named group fails due to being non-empty. --- loginutils/deluser.c | 50 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 42 insertions(+), 8 deletions(-)
diff --git a/loginutils/deluser.c b/loginutils/deluser.c index 8e7df737c..689adc7db 100644 --- a/loginutils/deluser.c +++ b/loginutils/deluser.c @@ -36,16 +36,23 @@ //kbuild:lib-$(CONFIG_DELGROUP) += deluser.o //usage:#define deluser_trivial_usage -//usage: IF_LONG_OPTS("[--remove-home] ") "USER" +//usage: IF_LONG_OPTS("[--remove-home] ") +//usage: IF_DELGROUP(IF_LONG_OPTS("[--only-if-empty] ")) "USER" //usage:#define deluser_full_usage "\n\n" //usage: "Delete USER from the system" -// --remove-home is self-explanatory enough to put it in --help +//usage: "\n --remove-home Remove also home folder of user USER" +//usage: "\n --only-if-empty Only remove group, with same name as user USER," +//usage: "\n from the system if it is empty" + //usage:#define delgroup_trivial_usage -//usage: IF_FEATURE_DEL_USER_FROM_GROUP("[USER] ")"GROUP" +//usage: IF_LONG_OPTS("[--only-if-empty] ") +//usage: IF_FEATURE_DEL_USER_FROM_GROUP("[USER] ")"GROUP" //usage:#define delgroup_full_usage "\n\n" //usage: "Delete group GROUP from the system" //usage: IF_FEATURE_DEL_USER_FROM_GROUP(" or user USER from group GROUP") +//usage: "\n --only-if-empty Only remove group GROUP from the system" +//usage: "\n if it is empty" #include "libbb.h" @@ -65,13 +72,34 @@ int deluser_main(int argc, char **argv) #if !ENABLE_LONG_OPTS const int opt_delhome = 0; + const int opt_delgroup_onlyifempty = 0; #else + int opt_delgroup_onlyifempty = 0; int opt_delhome = 0; if (do_deluser) { - opt_delhome = getopt32long(argv, "", - "remove-home\0" No_argument "\xff"); - argv += opt_delhome; - argc -= opt_delhome; + int num_opts = 0; + int opts = getopt32long(argv, "", + "remove-home\0" No_argument "\xef" + "only-if-empty\0" No_argument "\xff"); + if (opts & 1 << 0) + { + opt_delhome = 1; + num_opts++; + } + if (opts & 1 << 1) + { + opt_delgroup_onlyifempty = 1; + num_opts++; + } + + argv += num_opts; + argc -= num_opts; + + } else { + opt_delgroup_onlyifempty = getopt32long(argv, "", + "only-if-empty\0" No_argument "\xff"); + argv += opt_delgroup_onlyifempty; + argc -= opt_delgroup_onlyifempty; } #endif @@ -114,10 +142,16 @@ int deluser_main(int argc, char **argv) if (do_deluser < 0) { /* delgroup after deluser? */ gr = getgrnam(name); if (!gr) - return EXIT_SUCCESS; + return EXIT_SUCCESS; } else { gr = xgetgrnam(name); /* bail out if GROUP is wrong */ } + if (opt_delgroup_onlyifempty && gr->gr_mem != NULL) { + if (do_deluser < 0) { /* delgroup after deluser? */ + return EXIT_SUCCESS; + } + bb_error_msg_and_die("'%s' is not empty", name); + } if (!member) { /* "delgroup GROUP" */ struct passwd *pw; -- 2.34.1 _______________________________________________ busybox mailing list busybox@busybox.net http://lists.busybox.net/mailman/listinfo/busybox