diff options
Diffstat (limited to 'loginutils/deluser.c')
-rw-r--r-- | loginutils/deluser.c | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/loginutils/deluser.c b/loginutils/deluser.c new file mode 100644 index 000000000..869b22013 --- /dev/null +++ b/loginutils/deluser.c @@ -0,0 +1,83 @@ +/* vi: set sw=4 ts=4: */ +/* + * deluser (remove lusers from the system ;) for TinyLogin + * + * Copyright (C) 1999 by Lineo, inc. and John Beppu + * Copyright (C) 1999,2000,2001 by John Beppu <beppu@codepoet.org> + * Unified with delgroup by Tito Ragusa <farmatito@tiscali.it> + * + * Licensed under GPL version 2, see file LICENSE in this tarball for details. + * + */ + +#include "busybox.h" + +static void del_line_matching(const char *login, 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 (!ENABLE_FEATURE_CLEAN_UP) { + if (!found) { + bb_error_msg("can't find '%s' in '%s'", login, filename); + return; + } + passwd = fopen_or_warn(filename, "w"); + if (passwd) + while ((line = llist_pop(&plist))) + fputs(line, passwd); + } else { + if (!found) { + bb_error_msg("can't find '%s' in '%s'", login, filename); + goto clean_up; + } + fclose(passwd); + passwd = fopen_or_warn(filename, "w"); + if (passwd) { + clean_up: + while ((line = llist_pop(&plist))) { + if (found) fputs(line, passwd); + free(line); + } + fclose(passwd); + } + } +} + +int deluser_main(int argc, char **argv) +{ + if (argc != 2) + bb_show_usage(); + + if (ENABLE_DELUSER + && (!ENABLE_DELGROUP || applet_name[3] == 'u') + ) { + del_line_matching(argv[1], bb_path_passwd_file); + if (ENABLE_FEATURE_SHADOWPASSWDS) + del_line_matching(argv[1], bb_path_shadow_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 $ */ |