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
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox