1 /* vi: set sw=4 ts=4: */
3 * deluser/delgroup implementation for busybox
5 * Copyright (C) 1999 by Lineo, inc. and John Beppu
6 * Copyright (C) 1999,2000,2001 by John Beppu <beppu@codepoet.org>
7 * Copyright (C) 2007 by Tito Ragusa <farmatito@tiscali.it>
9 * Licensed under GPL version 2, see file LICENSE in this tarball for details.
17 #define NAME_NOT_FOUND 1
18 #define MEMBER_NOT_FOUND 2
20 static void del_line_matching(char **args,
22 FILE* FAST_FUNC (*fopen_func)(const char *fileName, const char *mode))
25 smallint error = NAME_NOT_FOUND;
26 char *name = (ENABLE_FEATURE_DEL_USER_FROM_GROUP && args[2]) ? args[2] : args[1];
28 char *new = xzalloc(1);
30 passwd = fopen_func(filename, "r");
32 while ((line = xmalloc_fgets(passwd))) {
33 int len = strlen(name);
35 if (strncmp(line, name, len) == 0
39 if (ENABLE_FEATURE_DEL_USER_FROM_GROUP) {
43 /* There were two args on commandline */
44 && (gr = getgrnam(name))
45 /* The group was not deleted in the meanwhile */
46 && (p = strrchr(line, ':'))
47 /* We can find a pointer to the last ':' */
49 error = MEMBER_NOT_FOUND;
50 /* Move past ':' (worst case to '\0') and cut the line */
53 for (p = xzalloc(1); *gr->gr_mem != NULL; gr->gr_mem++) {
54 /* Add all the other group members */
55 if (strcmp(args[1], *gr->gr_mem) != 0) {
57 p = xasprintf("%s%s%s", p, p[0] ? "," : "", *gr->gr_mem);
62 /* Recompose the line */
63 line = xasprintf("%s%s\n", line, p);
64 if (ENABLE_FEATURE_CLEAN_UP) free(p);
70 new = xasprintf("%s%s", new, line);
76 if (ENABLE_FEATURE_CLEAN_UP) fclose(passwd);
79 if (ENABLE_FEATURE_DEL_USER_FROM_GROUP && error == MEMBER_NOT_FOUND) {
80 /* Set the correct values for error message */
84 bb_error_msg("can't find %s in %s", name, filename);
86 passwd = fopen_func(filename, "w");
89 if (ENABLE_FEATURE_CLEAN_UP) fclose(passwd);
96 int deluser_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
97 int deluser_main(int argc, char **argv)
100 || (ENABLE_FEATURE_DEL_USER_FROM_GROUP
101 && (applet_name[3] == 'g' && argc == 3))
104 bb_error_msg_and_die(bb_msg_perm_denied_are_you_root);
106 if ((ENABLE_FEATURE_DEL_USER_FROM_GROUP && argc != 3)
108 || (ENABLE_DELGROUP && ENABLE_DESKTOP)
111 && (!ENABLE_DELGROUP || applet_name[3] == 'u')
113 del_line_matching(argv, bb_path_passwd_file, xfopen);
114 if (ENABLE_FEATURE_SHADOWPASSWDS)
115 del_line_matching(argv, bb_path_shadow_file, fopen_or_warn);
116 } else if (ENABLE_DESKTOP && ENABLE_DELGROUP && getpwnam(argv[1]))
117 bb_error_msg_and_die("can't remove primary group of user %s", argv[1]);
119 del_line_matching(argv, bb_path_group_file, xfopen);
120 if (ENABLE_FEATURE_SHADOWPASSWDS)
121 del_line_matching(argv, bb_path_gshadow_file, fopen_or_warn);