adduser: more fixes to "add user to specified group"
authorDenys Vlasenko <vda.linux@googlemail.com>
Sat, 9 Jan 2010 19:57:06 +0000 (20:57 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sat, 9 Jan 2010 19:57:06 +0000 (20:57 +0100)
function                                             old     new   delta
update_passwd                                       1246    1295     +49
adduser_main                                         727     725      -2

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
libbb/update_passwd.c
loginutils/adduser.c

index 301893be1d08079f411af19a8317fec45f1c58ba..f5ce1f955d0364ca4dc66acde1eceef009e547ca 100644 (file)
@@ -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;
 }
index ff30a592d1e691ae35fe326f305316186f779414..5f593ac165c28eecc4b306c7a532cb7057c2395c 100644 (file)
@@ -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. */