deluser: make it simpler, fix inability to delete user from group

Also makes menuconfig order more sensible

Signed-off-by: Harald Becker <ralda@gmx.de>
Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
diff --git a/loginutils/Config.src b/loginutils/Config.src
index 5d497c4..8158bce 100644
--- a/loginutils/Config.src
+++ b/loginutils/Config.src
@@ -93,6 +93,47 @@
 	  With this option off, login will fail password check for any
 	  user which has password encrypted with these algorithms.
 
+config ADDUSER
+	bool "adduser"
+	default y
+	help
+	  Utility for creating a new user account.
+
+config FEATURE_ADDUSER_LONG_OPTIONS
+	bool "Enable long options"
+	default y
+	depends on ADDUSER && LONG_OPTS
+	help
+	  Support long options for the adduser applet.
+
+config FEATURE_CHECK_NAMES
+	bool "Enable sanity check on user/group names in adduser and addgroup"
+	default n
+	depends on ADDUSER || ADDGROUP
+	help
+	  Enable sanity check on user and group names in adduser and addgroup.
+	  To avoid problems, the user or group name should consist only of
+	  letters, digits, underscores, periods, at signs and dashes,
+	  and not start with a dash (as defined by IEEE Std 1003.1-2001).
+	  For compatibility with Samba machine accounts "$" is also supported
+	  at the end of the user or group name.
+
+config FIRST_SYSTEM_ID
+	int "First valid system uid or gid for adduser and addgroup"
+	depends on ADDUSER || ADDGROUP
+	range 0 64900
+	default 100
+	help
+	  First valid system uid or gid for adduser and addgroup
+
+config LAST_SYSTEM_ID
+	int "Last valid system uid or gid for adduser and addgroup"
+	depends on ADDUSER || ADDGROUP
+	range 0 64900
+	default 999
+	help
+	  Last valid system uid or gid for adduser and addgroup
+
 config ADDGROUP
 	bool "addgroup"
 	default y
@@ -115,6 +156,12 @@
 	  addgroup will add an existing user to an
 	  existing group.
 
+config DELUSER
+	bool "deluser"
+	default y
+	help
+	  Utility for deleting a user account.
+
 config DELGROUP
 	bool "delgroup"
 	default y
@@ -129,53 +176,6 @@
 	  If called with two non-option arguments, deluser
 	  or delgroup will remove an user from a specified group.
 
-config FEATURE_CHECK_NAMES
-	bool "Enable sanity check on user/group names in adduser and addgroup"
-	default n
-	depends on ADDUSER || ADDGROUP
-	help
-	  Enable sanity check on user and group names in adduser and addgroup.
-	  To avoid problems, the user or group name should consist only of
-	  letters, digits, underscores, periods, at signs and dashes,
-	  and not start with a dash (as defined by IEEE Std 1003.1-2001).
-	  For compatibility with Samba machine accounts "$" is also supported
-	  at the end of the user or group name.
-
-config ADDUSER
-	bool "adduser"
-	default y
-	help
-	  Utility for creating a new user account.
-
-config FEATURE_ADDUSER_LONG_OPTIONS
-	bool "Enable long options"
-	default y
-	depends on ADDUSER && LONG_OPTS
-	help
-	  Support long options for the adduser applet.
-
-config FIRST_SYSTEM_ID
-	int "First valid system uid or gid for adduser and addgroup"
-	depends on ADDUSER || ADDGROUP
-	range 0 64900
-	default 100
-	help
-	  First valid system uid or gid for adduser and addgroup
-
-config LAST_SYSTEM_ID
-	int "Last valid system uid or gid for adduser and addgroup"
-	depends on ADDUSER || ADDGROUP
-	range 0 64900
-	default 999
-	help
-	  Last valid system uid or gid for adduser and addgroup
-
-config DELUSER
-	bool "deluser"
-	default y
-	help
-	  Utility for deleting a user account.
-
 config GETTY
 	bool "getty"
 	default y
diff --git a/loginutils/deluser.c b/loginutils/deluser.c
index e234d66..65817b9 100644
--- a/loginutils/deluser.c
+++ b/loginutils/deluser.c
@@ -6,25 +6,18 @@
  * Copyright (C) 1999,2000,2001 by John Beppu <beppu@codepoet.org>
  * Copyright (C) 2007 by Tito Ragusa <farmatito@tiscali.it>
  *
- * Licensed under GPLv2, see file LICENSE in this source tree.
+ * Licensed under GPL version 2, see file LICENSE in this tarball for details.
  *
  */
 #include "libbb.h"
 
-static int del_line_matching(char **args, const char *filename)
-{
-	if (ENABLE_FEATURE_DEL_USER_FROM_GROUP && args[2]) {
-		return update_passwd(filename, args[2], NULL, args[1]);
-	}
-	return update_passwd(filename, args[1], NULL, NULL);
-}
-
 int deluser_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 int deluser_main(int argc, char **argv)
 {
 	if (argc != 2
 	 && (!ENABLE_FEATURE_DEL_USER_FROM_GROUP
-	    || (applet_name[3] != 'g' || argc != 3))
+	    || applet_name[3] != 'g'
+	    || argc != 3)
 	) {
 		bb_show_usage();
 	}
@@ -32,25 +25,30 @@
 	if (geteuid())
 		bb_error_msg_and_die(bb_msg_perm_denied_are_you_root);
 
-	if ((ENABLE_FEATURE_DEL_USER_FROM_GROUP && argc != 3)
-	 || ENABLE_DELUSER
-	 || (ENABLE_DELGROUP && ENABLE_DESKTOP)
-	) {
-		if (ENABLE_DELUSER
-		 && (!ENABLE_DELGROUP || applet_name[3] == 'u')
-		) {
-			if (del_line_matching(argv, bb_path_passwd_file) < 0)
+	if (ENABLE_DELUSER && applet_name[3] == 'u') {
+		/* deluser USER */
+		if (update_passwd(bb_path_passwd_file, argv[1], NULL, NULL) < 0)
+			return EXIT_FAILURE;
+		if (ENABLE_FEATURE_SHADOWPASSWDS)
+			if (update_passwd(bb_path_shadow_file, argv[1], NULL, NULL) < 0)
 				return EXIT_FAILURE;
-			if (ENABLE_FEATURE_SHADOWPASSWDS) {
-				del_line_matching(argv, bb_path_shadow_file);
-			}
-		} else if (ENABLE_DESKTOP && ENABLE_DELGROUP && getpwnam(argv[1]))
-			bb_error_msg_and_die("can't remove primary group of user %s", argv[1]);
-	}
-	if (del_line_matching(argv, bb_path_group_file) < 0)
-		return EXIT_FAILURE;
-	if (ENABLE_FEATURE_SHADOWPASSWDS) {
-		del_line_matching(argv, bb_path_gshadow_file);
+	} else if (ENABLE_DELGROUP) {
+		/* delgroup ... */
+		if (!ENABLE_FEATURE_DEL_USER_FROM_GROUP || argc != 3) {
+			/* delgroup GROUP */
+			if (update_passwd(bb_path_group_file, argv[1], NULL, NULL) < 0)
+				return EXIT_FAILURE;
+			if (ENABLE_FEATURE_SHADOWPASSWDS)
+				if (update_passwd(bb_path_gshadow_file, argv[1], NULL, NULL) < 0)
+					return EXIT_FAILURE;
+		} else {
+			/* delgroup USER GROUP */
+			if (update_passwd(bb_path_group_file, argv[2], NULL, argv[1]) < 0)
+				return EXIT_FAILURE;
+			if (ENABLE_FEATURE_SHADOWPASSWDS)
+				if (update_passwd(bb_path_gshadow_file, argv[2], NULL, argv[1]) < 0)
+					return EXIT_FAILURE;
+		}
 	}
 	return EXIT_SUCCESS;
 }