From: Denys Vlasenko Date: Sat, 9 Jan 2010 19:57:06 +0000 (+0100) Subject: adduser: more fixes to "add user to specified group" X-Git-Tag: 1_16_0~70 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=4653e442ba66bd4917a6069293d4daff9691c61f;p=oweals%2Fbusybox.git adduser: more fixes to "add user to specified group" function old new delta update_passwd 1246 1295 +49 adduser_main 727 725 -2 Signed-off-by: Denys Vlasenko --- diff --git a/libbb/update_passwd.c b/libbb/update_passwd.c index 301893be1..f5ce1f955 100644 --- a/libbb/update_passwd.c +++ b/libbb/update_passwd.c @@ -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; } diff --git a/loginutils/adduser.c b/loginutils/adduser.c index ff30a592d..5f593ac16 100644 --- a/loginutils/adduser.c +++ b/loginutils/adduser.c @@ -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. */