aboutsummaryrefslogtreecommitdiff
path: root/libbb/update_passwd.c
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2010-01-09 20:57:06 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2010-01-09 20:57:06 +0100
commit4653e442ba66bd4917a6069293d4daff9691c61f (patch)
tree3a5e179afc32ebb62a365bbcc9ee1827d6641df6 /libbb/update_passwd.c
parent02dd96f688994b5ef4f79a7cdf940b844d6ac52b (diff)
downloadbusybox-w32-4653e442ba66bd4917a6069293d4daff9691c61f.tar.gz
busybox-w32-4653e442ba66bd4917a6069293d4daff9691c61f.tar.bz2
busybox-w32-4653e442ba66bd4917a6069293d4daff9691c61f.zip
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>
Diffstat (limited to 'libbb/update_passwd.c')
-rw-r--r--libbb/update_passwd.c25
1 files changed, 15 insertions, 10 deletions
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,
81 FILE *new_fp; 81 FILE *new_fp;
82 char *fnamesfx; 82 char *fnamesfx;
83 char *sfx_char; 83 char *sfx_char;
84 char *name_colon;
84 unsigned user_len; 85 unsigned user_len;
85 int old_fd; 86 int old_fd;
86 int new_fd; 87 int new_fd;
@@ -103,8 +104,8 @@ int FAST_FUNC update_passwd(const char *filename,
103 /* New passwd file, "/etc/passwd+" for now */ 104 /* New passwd file, "/etc/passwd+" for now */
104 fnamesfx = xasprintf("%s+", filename); 105 fnamesfx = xasprintf("%s+", filename);
105 sfx_char = &fnamesfx[strlen(fnamesfx)-1]; 106 sfx_char = &fnamesfx[strlen(fnamesfx)-1];
106 name = xasprintf("%s:", name); 107 name_colon = xasprintf("%s:", name);
107 user_len = strlen(name); 108 user_len = strlen(name_colon);
108 109
109 if (shadow) 110 if (shadow)
110 old_fp = fopen(filename, "r+"); 111 old_fp = fopen(filename, "r+");
@@ -166,7 +167,7 @@ int FAST_FUNC update_passwd(const char *filename,
166 line = xmalloc_fgetline(old_fp); 167 line = xmalloc_fgetline(old_fp);
167 if (!line) /* EOF/error */ 168 if (!line) /* EOF/error */
168 break; 169 break;
169 if (strncmp(name, line, user_len) != 0) { 170 if (strncmp(name_colon, line, user_len) != 0) {
170 fprintf(new_fp, "%s\n", line); 171 fprintf(new_fp, "%s\n", line);
171 goto next; 172 goto next;
172 } 173 }
@@ -225,11 +226,11 @@ int FAST_FUNC update_passwd(const char *filename,
225 /* move past old change date */ 226 /* move past old change date */
226 cp = strchrnul(cp + 1, ':'); 227 cp = strchrnul(cp + 1, ':');
227 /* "name:" + "new_passwd" + ":" + "change date" + ":rest of line" */ 228 /* "name:" + "new_passwd" + ":" + "change date" + ":rest of line" */
228 fprintf(new_fp, "%s%s:%u%s\n", name, new_passwd, 229 fprintf(new_fp, "%s%s:%u%s\n", name_colon, new_passwd,
229 (unsigned)(time(NULL)) / (24*60*60), cp); 230 (unsigned)(time(NULL)) / (24*60*60), cp);
230 } else { 231 } else {
231 /* "name:" + "new_passwd" + ":rest of line" */ 232 /* "name:" + "new_passwd" + ":rest of line" */
232 fprintf(new_fp, "%s%s%s\n", name, new_passwd, cp); 233 fprintf(new_fp, "%s%s%s\n", name_colon, new_passwd, cp);
233 } 234 }
234 changed_lines++; 235 changed_lines++;
235 } /* else delete user or group: skip the line */ 236 } /* else delete user or group: skip the line */
@@ -238,15 +239,19 @@ int FAST_FUNC update_passwd(const char *filename,
238 } 239 }
239 240
240 if (changed_lines == 0) { 241 if (changed_lines == 0) {
241#if ENABLE_FEATURE_DEL_USER_FROM_GROUP 242#if ENABLE_FEATURE_ADDUSER_TO_GROUP || ENABLE_FEATURE_DEL_USER_FROM_GROUP
242 if (member) 243 if (member) {
243 bb_error_msg("can't find %s in %s", member, filename); 244 if (ENABLE_ADDGROUP && applet_name[0] == 'a')
245 bb_error_msg("can't find %s in %s", name, filename);
246 if (ENABLE_DELGROUP && applet_name[0] == 'd')
247 bb_error_msg("can't find %s in %s", member, filename);
248 }
244#endif 249#endif
245 if ((ENABLE_ADDUSER || ENABLE_ADDGROUP) 250 if ((ENABLE_ADDUSER || ENABLE_ADDGROUP)
246 && applet_name[0] == 'a' && !member 251 && applet_name[0] == 'a' && !member
247 ) { 252 ) {
248 /* add user or group */ 253 /* add user or group */
249 fprintf(new_fp, "%s%s\n", name, new_passwd); 254 fprintf(new_fp, "%s%s\n", name_colon, new_passwd);
250 changed_lines++; 255 changed_lines++;
251 } 256 }
252 } 257 }
@@ -275,6 +280,6 @@ int FAST_FUNC update_passwd(const char *filename,
275 free_mem: 280 free_mem:
276 free(fnamesfx); 281 free(fnamesfx);
277 free((char *)filename); 282 free((char *)filename);
278 free((char *)name); 283 free(name_colon);
279 return ret; 284 return ret;
280} 285}