diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2009-07-13 01:15:30 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2009-07-13 01:15:30 +0200 |
commit | 189f74d0f2760d3da1a05cba75653dade4c8a9c3 (patch) | |
tree | f192b88fd0a919d8d71d930272f25de1002a3e70 /libbb/update_passwd.c | |
parent | 044b18083b4380f158002ed7c00c52d362c9632c (diff) | |
download | busybox-w32-189f74d0f2760d3da1a05cba75653dade4c8a9c3.tar.gz busybox-w32-189f74d0f2760d3da1a05cba75653dade4c8a9c3.tar.bz2 busybox-w32-189f74d0f2760d3da1a05cba75653dade4c8a9c3.zip |
passwd + /etc/shadow: chage "change time" field too
function old new delta
update_passwd 1171 1270 +99
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'libbb/update_passwd.c')
-rw-r--r-- | libbb/update_passwd.c | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/libbb/update_passwd.c b/libbb/update_passwd.c index aa1e2ed08..3aab40175 100644 --- a/libbb/update_passwd.c +++ b/libbb/update_passwd.c | |||
@@ -87,6 +87,12 @@ int FAST_FUNC update_passwd(const char *filename, | |||
87 | int i; | 87 | int i; |
88 | int changed_lines; | 88 | int changed_lines; |
89 | int ret = -1; /* failure */ | 89 | int ret = -1; /* failure */ |
90 | /* used as a bool: "are we modifying /etc/shadow?" */ | ||
91 | #if ENABLE_FEATURE_SHADOWPASSWDS | ||
92 | const char *shadow = strstr(filename, "shadow"); | ||
93 | #else | ||
94 | # define shadow NULL | ||
95 | #endif | ||
90 | 96 | ||
91 | filename = xmalloc_follow_symlinks(filename); | 97 | filename = xmalloc_follow_symlinks(filename); |
92 | if (filename == NULL) | 98 | if (filename == NULL) |
@@ -100,7 +106,7 @@ int FAST_FUNC update_passwd(const char *filename, | |||
100 | name = xasprintf("%s:", name); | 106 | name = xasprintf("%s:", name); |
101 | user_len = strlen(name); | 107 | user_len = strlen(name); |
102 | 108 | ||
103 | if (ENABLE_FEATURE_SHADOWPASSWDS && strstr(filename, "shadow")) | 109 | if (shadow) |
104 | old_fp = fopen(filename, "r+"); | 110 | old_fp = fopen(filename, "r+"); |
105 | else | 111 | else |
106 | old_fp = fopen_or_warn(filename, "r+"); | 112 | old_fp = fopen_or_warn(filename, "r+"); |
@@ -215,8 +221,18 @@ int FAST_FUNC update_passwd(const char *filename, | |||
215 | ) { | 221 | ) { |
216 | /* Change passwd */ | 222 | /* Change passwd */ |
217 | cp = strchrnul(cp, ':'); /* move past old passwd */ | 223 | cp = strchrnul(cp, ':'); /* move past old passwd */ |
218 | /* name: + new_passwd + :rest of line */ | 224 | |
219 | fprintf(new_fp, "%s%s%s\n", name, new_passwd, cp); | 225 | if (shadow && *cp == ':') { |
226 | /* /etc/shadow's field 3 (passwd change date) needs updating */ | ||
227 | /* move past old change date */ | ||
228 | cp = strchrnul(cp + 1, ':'); | ||
229 | /* "name:" + "new_passwd" + ":" + "change date" + ":rest of line" */ | ||
230 | fprintf(new_fp, "%s%s:%u%s\n", name, new_passwd, | ||
231 | (unsigned)(time(NULL)) / (24*60*60), cp); | ||
232 | } else { | ||
233 | /* "name:" + "new_passwd" + ":rest of line" */ | ||
234 | fprintf(new_fp, "%s%s%s\n", name, new_passwd, cp); | ||
235 | } | ||
220 | changed_lines++; | 236 | changed_lines++; |
221 | } /* else delete user or group: skip the line */ | 237 | } /* else delete user or group: skip the line */ |
222 | next: | 238 | next: |