udhcpc: fix a problem with binary-encoded options #2
[oweals/busybox.git] / loginutils / deluser.c
index 8ee72ef6f6e37806d4733235b42f589caf8084d6..e39ac55069723e2bd116be8704e918fcb5b70199 100644 (file)
@@ -9,6 +9,18 @@
  * Licensed under GPLv2, see file LICENSE in this source tree.
  *
  */
+
+//usage:#define deluser_trivial_usage
+//usage:       "USER"
+//usage:#define deluser_full_usage "\n\n"
+//usage:       "Delete USER from the system"
+
+//usage:#define delgroup_trivial_usage
+//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")
+
 #include "libbb.h"
 
 int deluser_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
@@ -23,7 +35,7 @@ int deluser_main(int argc, char **argv)
        /* Name of shadow or gshadow file */
        const char *sfile;
        /* Are we deluser or delgroup? */
-       bool do_deluser = (ENABLE_DELUSER && (!ENABLE_DELGROUP || applet_name[3] == 'u'));
+       int do_deluser = (ENABLE_DELUSER && (!ENABLE_DELGROUP || applet_name[3] == 'u'));
 
        if (geteuid() != 0)
                bb_error_msg_and_die(bb_msg_perm_denied_are_you_root);
@@ -51,7 +63,13 @@ int deluser_main(int argc, char **argv)
                        struct group *gr;
  do_delgroup:
                        /* "delgroup GROUP" or "delgroup USER GROUP" */
-                       gr = xgetgrnam(name); /* bail out if GROUP is wrong */
+                       if (do_deluser < 0) { /* delgroup after deluser? */
+                               gr = getgrnam(name);
+                               if (!gr)
+                                       return EXIT_SUCCESS;
+                       } else {
+                               gr = xgetgrnam(name); /* bail out if GROUP is wrong */
+                       }
                        if (!member) {
                                /* "delgroup GROUP" */
                                struct passwd *pw;
@@ -79,13 +97,15 @@ int deluser_main(int argc, char **argv)
                        }
                } while (ENABLE_FEATURE_SHADOWPASSWDS && pfile);
 
-               if (ENABLE_DELGROUP && do_deluser) {
+               if (ENABLE_DELGROUP && do_deluser > 0) {
                        /* "deluser USER" also should try to delete
                         * same-named group. IOW: do "delgroup USER"
                         */
-//TODO: check how it actually works in upstream.
-//I suspect it is only done if group has no more members.
-                       do_deluser = 0;
+// On debian deluser is a perl script that calls userdel.
+// From man userdel:
+//  If USERGROUPS_ENAB is defined to yes in /etc/login.defs, userdel will
+//  delete the group with the same name as the user.
+                       do_deluser = -1;
                        goto do_delgroup;
                }
                return EXIT_SUCCESS;