* 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;
/* 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);
if (ENABLE_FEATURE_SHADOWPASSWDS)
sfile = bb_path_shadow_file;
} else {
+ struct group *gr;
do_delgroup:
/* "delgroup GROUP" or "delgroup USER GROUP" */
- 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".
- * If user with tha same name exists,
- * bail out.
- */
-//BUG: check should be done by GID, not by matching name!
-//1. find GROUP's GID
-//2. check that /etc/passwd doesn't have lines of the form
-// user:pwd:uid:GID:...
-//3. bail out if at least one such line exists
- if (getpwnam(name) != NULL)
- bb_error_msg_and_die("'%s' still has '%s' as their primary group!", name, name);
+ /* "delgroup GROUP" */
+ struct passwd *pw;
+ struct passwd pwent;
+ /* Check if the group is in use */
+#define passwd_buf bb_common_bufsiz1
+ while (!getpwent_r(&pwent, passwd_buf, sizeof(passwd_buf), &pw)) {
+ if (pwent.pw_gid == gr->gr_gid)
+ bb_error_msg_and_die("'%s' still has '%s' as their primary group!", pwent.pw_name, name);
+ }
+ //endpwent();
}
pfile = bb_path_group_file;
if (ENABLE_FEATURE_SHADOWPASSWDS)
}
} 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;