adduser: more fixes to "add user to specified group"
No binary (build failed)
—
(log yok)
| @@ -81,6 +81,7 @@ int FAST_FUNC update_passwd(const char *filename, | |
| FILE *new_fp; | |
| char *fnamesfx; | |
| char *sfx_char; | |
| + | char *name_colon; |
| unsigned user_len; | |
| int old_fd; | |
| int new_fd; | |
| @@ -103,8 +104,8 @@ int FAST_FUNC update_passwd(const char *filename, | |
| /* New passwd file, "/etc/passwd+" for now */ | |
| fnamesfx = xasprintf("%s+", filename); | |
| sfx_char = &fnamesfx[strlen(fnamesfx)-1]; | |
| - | name = xasprintf("%s:", name); |
| - | user_len = strlen(name); |
| + | name_colon = xasprintf("%s:", name); |
| + | user_len = strlen(name_colon); |
| if (shadow) | |
| old_fp = fopen(filename, "r+"); | |
| @@ -166,7 +167,7 @@ int FAST_FUNC update_passwd(const char *filename, | |
| line = xmalloc_fgetline(old_fp); | |
| if (!line) /* EOF/error */ | |
| break; | |
| - | if (strncmp(name, line, user_len) != 0) { |
| + | if (strncmp(name_colon, line, user_len) != 0) { |
| fprintf(new_fp, "%s\n", line); | |
| goto next; | |
| } | |
| @@ -225,11 +226,11 @@ int FAST_FUNC update_passwd(const char *filename, | |
| /* move past old change date */ | |
| cp = strchrnul(cp + 1, ':'); | |
| /* "name:" + "new_passwd" + ":" + "change date" + ":rest of line" */ | |
| - | fprintf(new_fp, "%s%s:%u%s\n", name, new_passwd, |
| + | fprintf(new_fp, "%s%s:%u%s\n", name_colon, new_passwd, |
| (unsigned)(time(NULL)) / (24*60*60), cp); | |
| } else { | |
| /* "name:" + "new_passwd" + ":rest of line" */ | |
| - | fprintf(new_fp, "%s%s%s\n", name, new_passwd, cp); |
| + | fprintf(new_fp, "%s%s%s\n", name_colon, new_passwd, cp); |
| } | |
| changed_lines++; | |
| } /* else delete user or group: skip the line */ | |
| @@ -238,15 +239,19 @@ int FAST_FUNC update_passwd(const char *filename, | |
| } | |
| if (changed_lines == 0) { | |
| - | #if ENABLE_FEATURE_DEL_USER_FROM_GROUP |
| - | if (member) |
| - | bb_error_msg("can't find %s in %s", member, filename); |
| + | #if ENABLE_FEATURE_ADDUSER_TO_GROUP || ENABLE_FEATURE_DEL_USER_FROM_GROUP |
| + | if (member) { |
| + | if (ENABLE_ADDGROUP && applet_name[0] == 'a') |
| + | bb_error_msg("can't find %s in %s", name, filename); |
| + | if (ENABLE_DELGROUP && applet_name[0] == 'd') |
| + | bb_error_msg("can't find %s in %s", member, filename); |
| + | } |
| #endif | |
| if ((ENABLE_ADDUSER || ENABLE_ADDGROUP) | |
| && applet_name[0] == 'a' && !member | |
| ) { | |
| /* add user or group */ | |
| - | fprintf(new_fp, "%s%s\n", name, new_passwd); |
| + | fprintf(new_fp, "%s%s\n", name_colon, new_passwd); |
| changed_lines++; | |
| } | |
| } | |
| @@ -275,6 +280,6 @@ int FAST_FUNC update_passwd(const char *filename, | |
| free_mem: | |
| free(fnamesfx); | |
| free((char *)filename); | |
| - | free((char *)name); |
| + | free(name_colon); |
| return ret; | |
| } | |
| @@ -65,11 +65,12 @@ static void passwd_study(struct passwd *p) | |
| } | |
| } | |
| - | static void addgroup_wrapper(struct passwd *p) |
| + | static void addgroup_wrapper(struct passwd *p, const char *group_name) |
| { | |
| char *cmd; | |
| - | cmd = xasprintf("addgroup -g %u '%s'", (unsigned)p->pw_gid, p->pw_name); |
| + | cmd = xasprintf("addgroup '%s' '%s'", |
| + | p->pw_name, group_name); |
| system(cmd); | |
| free(cmd); | |
| } | |
| @@ -191,7 +192,7 @@ int adduser_main(int argc UNUSED_PARAM, char **argv) | |
| /* addgroup should be responsible for dealing w/ gshadow */ | |
| /* if using a pre-existing group, don't create one */ | |
| if (usegroup) | |
| - | addgroup_wrapper(&pw); |
| + | addgroup_wrapper(&pw, usegroup); |
| /* clear the umask for this process so it doesn't | |
| * screw up the permissions on the mkdir and chown. */ | |