diff options
author | Denys Vlasenko | 2010-01-09 20:57:06 +0100 |
---|---|---|
committer | Denys Vlasenko | 2010-01-09 20:57:06 +0100 |
commit | 4653e442ba66bd4917a6069293d4daff9691c61f (patch) | |
tree | 3a5e179afc32ebb62a365bbcc9ee1827d6641df6 | |
parent | 02dd96f688994b5ef4f79a7cdf940b844d6ac52b (diff) | |
download | busybox-4653e442ba66bd4917a6069293d4daff9691c61f.zip busybox-4653e442ba66bd4917a6069293d4daff9691c61f.tar.gz |
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 <vda.linux@googlemail.com>
-rw-r--r-- | libbb/update_passwd.c | 25 | ||||
-rw-r--r-- | loginutils/adduser.c | 7 |
2 files changed, 19 insertions, 13 deletions
diff --git a/libbb/update_passwd.c b/libbb/update_passwd.c index 301893b..f5ce1f9 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 ff30a59..5f593ac 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. */ |