diff options
author | Eric Andersen <andersen@codepoet.org> | 2003-07-14 20:20:45 +0000 |
---|---|---|
committer | Eric Andersen <andersen@codepoet.org> | 2003-07-14 20:20:45 +0000 |
commit | 74f270a3177a43b29d98b6c5b6a2c5338be8b98f (patch) | |
tree | f07a9933508907612bc6d4af818447ff099a7c63 /loginutils/deluser.c | |
parent | e5642119ee566520a098027746808dd6b9226d99 (diff) |
decouple delgroup and deluser
Diffstat (limited to 'loginutils/deluser.c')
-rw-r--r-- | loginutils/deluser.c | 127 |
1 files changed, 8 insertions, 119 deletions
diff --git a/loginutils/deluser.c b/loginutils/deluser.c index ad62d41e0..1cd2b01e3 100644 --- a/loginutils/deluser.c +++ b/loginutils/deluser.c @@ -29,113 +29,10 @@ #include "busybox.h" +#include "delline.c" -/* where to start and stop deletion */ -typedef struct { - size_t start; - size_t stop; -} Bounds; +static const char deluser_format[]="%s: User could not be removed from %s"; -/* An interesting side-effect of boundary()'s - * implementation is that the first user (typically root) - * cannot be removed. Let's call it a feature. */ -static inline Bounds boundary(const char *buffer, const char *login) -{ - char needle[256]; - char *start; - char *stop; - Bounds b; - - snprintf(needle, 256, "\n%s:", login); - needle[255] = 0; - start = strstr(buffer, needle); - if (!start) { - b.start = 0; - b.stop = 0; - return b; - } - start++; - - stop = index(start, '\n'); /* index is a BSD-ism */ - b.start = start - buffer; - b.stop = stop - buffer; - return b; -} - -/* grep -v ^login (except it only deletes the first match) */ -/* ...in fact, I think I'm going to simplify this later */ -static int del_line_matching(const char *login, const char *filename) -{ - char *buffer; - FILE *passwd; - size_t len; - Bounds b; - struct stat statbuf; - - /* load into buffer */ - passwd = fopen(filename, "r"); - if (!passwd) { - return 1; - } - stat(filename, &statbuf); - len = statbuf.st_size; - buffer = (char *) malloc(len * sizeof(char)); - - if (!buffer) { - fclose(passwd); - return 1; - } - fread(buffer, len, sizeof(char), passwd); - - fclose(passwd); - - /* find the user to remove */ - b = boundary(buffer, login); - if (b.stop == 0) { - free(buffer); - return 1; - } - - /* write the file w/o the user */ - passwd = fopen(filename, "w"); - if (!passwd) { - return 1; - } - fwrite(buffer, (b.start - 1), sizeof(char), passwd); - fwrite(&buffer[b.stop], (len - b.stop), sizeof(char), passwd); - - fclose(passwd); - - return 0; -} - -/* ________________________________________________________________________ */ -int delgroup_main(int argc, char **argv) -{ - /* int successful; */ - int failure; - - if (argc != 2) { - bb_show_usage(); - } else { - - failure = del_line_matching(argv[1], bb_path_group_file); -#ifdef CONFIG_FEATURE_SHADOWPASSWDS - if (access(bb_path_gshadow_file, W_OK) == 0) { - /* EDR the |= works if the error is not 0, so he had it wrong */ - failure |= del_line_matching(argv[1], bb_path_gshadow_file); - } -#endif /* CONFIG_FEATURE_SHADOWPASSWDS */ - /* if (!successful) { */ - if (failure) { - bb_error_msg_and_die("%s: Group could not be removed\n", argv[1]); - } - - } - return (EXIT_SUCCESS); -} - -/* ________________________________________________________________________ */ int deluser_main(int argc, char **argv) { /* int successful; */ @@ -146,34 +43,26 @@ int deluser_main(int argc, char **argv) } else { failure = del_line_matching(argv[1], bb_path_passwd_file); - /* if (!successful) { */ if (failure) { - bb_error_msg_and_die("%s: User could not be removed from %s\n", - argv[1], bb_path_passwd_file); + bb_error_msg_and_die(deluser_format, argv[1], bb_path_passwd_file); } #ifdef CONFIG_FEATURE_SHADOWPASSWDS failure = del_line_matching(argv[1], bb_path_shadow_file); - /* if (!successful) { */ if (failure) { - bb_error_msg_and_die("%s: User could not be removed from %s\n", - argv[1], bb_path_shadow_file); + bb_error_msg_and_die(deluser_format, argv[1], bb_path_shadow_file); } failure = del_line_matching(argv[1], bb_path_gshadow_file); - /* if (!successful) { */ if (failure) { - bb_error_msg_and_die("%s: User could not be removed from %s\n", - argv[1], bb_path_gshadow_file); + bb_error_msg_and_die(deluser_format, argv[1], bb_path_gshadow_file); } -#endif /* CONFIG_FEATURE_SHADOWPASSWDS */ +#endif failure = del_line_matching(argv[1], bb_path_group_file); - /* if (!successful) { */ if (failure) { - bb_error_msg_and_die("%s: User could not be removed from %s\n", - argv[1], bb_path_group_file); + bb_error_msg_and_die(deluser_format, argv[1], bb_path_group_file); } } return (EXIT_SUCCESS); } -/* $Id: deluser.c,v 1.3 2003/03/19 09:12:20 mjn3 Exp $ */ +/* $Id: deluser.c,v 1.4 2003/07/14 20:20:45 andersen Exp $ */ |