X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=loginutils%2Fdeluser.c;h=293e324b06147340007959e9616f0a475b067ff1;hb=2d3253d1f93fbffb62c7521d41eed0102747d949;hp=e337101755233f238e59f17dc8f6f8b6d5dc054c;hpb=c9bb67787a0d48af33045a2d813faf44ed5d59b4;p=oweals%2Fbusybox.git diff --git a/loginutils/deluser.c b/loginutils/deluser.c index e33710175..293e324b0 100644 --- a/loginutils/deluser.c +++ b/loginutils/deluser.c @@ -1,82 +1,56 @@ /* vi: set sw=4 ts=4: */ /* - * deluser (remove lusers from the system ;) for TinyLogin + * deluser/delgroup implementation for busybox * * Copyright (C) 1999 by Lineo, inc. and John Beppu * Copyright (C) 1999,2000,2001 by John Beppu - * Unified with delgroup by Tito Ragusa + * Copyright (C) 2007 by Tito Ragusa * * Licensed under GPL version 2, see file LICENSE in this tarball for details. * */ +#include "libbb.h" -#include "busybox.h" - -static void del_line_matching(const char *login, const char *filename) +static int del_line_matching(char **args, const char *filename) { - char *line; - FILE *passwd; - int len = strlen(login); - int found = 0; - llist_t *plist = NULL; - - passwd = fopen_or_warn(filename, "r"); - if (!passwd) return; - - while ((line = xmalloc_fgets(passwd))) { - if (!strncmp(line, login, len) - && line[len] == ':' - ) { - found++; - free(line); - } else { - llist_add_to_end(&plist, line); - } - } - - if (!found) { - bb_error_msg("can't find '%s' in '%s'", login, filename); - if (!ENABLE_FEATURE_CLEAN_UP) return; - goto clean_up; - } - - if (ENABLE_FEATURE_CLEAN_UP) - fclose(passwd); - - passwd = fopen_or_warn(filename, "w"); - if (passwd) { - if (ENABLE_FEATURE_CLEAN_UP) { - clean_up: - while ((line = llist_pop(&plist))) { - if (found) fputs(line, passwd); - free(line); - } - fclose(passwd); - } else { - /* found != 0 here, no need to check */ - while ((line = llist_pop(&plist))) - fputs(line, passwd); - } + 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) + if (argc != 2 + && (!ENABLE_FEATURE_DEL_USER_FROM_GROUP + || (applet_name[3] != 'g' || argc != 3)) + ) { bb_show_usage(); + } - if (ENABLE_DELUSER - && (!ENABLE_DELGROUP || applet_name[3] == 'u') + 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) ) { - del_line_matching(argv[1], bb_path_passwd_file); - if (ENABLE_FEATURE_SHADOWPASSWDS) - del_line_matching(argv[1], bb_path_shadow_file); + if (ENABLE_DELUSER + && (!ENABLE_DELGROUP || applet_name[3] == 'u') + ) { + if (del_line_matching(argv, bb_path_passwd_file) < 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); } - del_line_matching(argv[1], bb_path_group_file); - if (ENABLE_FEATURE_SHADOWPASSWDS) - del_line_matching(argv[1], bb_path_gshadow_file); - return EXIT_SUCCESS; } - -/* $Id: deluser.c,v 1.4 2003/07/14 20:20:45 andersen Exp $ */