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

Reply via email to