aboutsummaryrefslogtreecommitdiff
path: root/libbb/update_passwd.c
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2009-07-13 01:15:30 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2009-07-13 01:15:30 +0200
commit189f74d0f2760d3da1a05cba75653dade4c8a9c3 (patch)
treef192b88fd0a919d8d71d930272f25de1002a3e70 /libbb/update_passwd.c
parent044b18083b4380f158002ed7c00c52d362c9632c (diff)
downloadbusybox-189f74d0f2760d3da1a05cba75653dade4c8a9c3.tar.gz
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.c22
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,
int i;
int changed_lines;
int ret = -1; /* failure */
+ /* used as a bool: "are we modifying /etc/shadow?" */
+#if ENABLE_FEATURE_SHADOWPASSWDS
+ const char *shadow = strstr(filename, "shadow");
+#else
+# define shadow NULL
+#endif
filename = xmalloc_follow_symlinks(filename);
if (filename == NULL)
@@ -100,7 +106,7 @@ int FAST_FUNC update_passwd(const char *filename,
name = xasprintf("%s:", name);
user_len = strlen(name);
- if (ENABLE_FEATURE_SHADOWPASSWDS && strstr(filename, "shadow"))
+ if (shadow)
old_fp = fopen(filename, "r+");
else
old_fp = fopen_or_warn(filename, "r+");
@@ -215,8 +221,18 @@ int FAST_FUNC update_passwd(const char *filename,
) {
/* Change passwd */
cp = strchrnul(cp, ':'); /* move past old passwd */
- /* name: + new_passwd + :rest of line */
- fprintf(new_fp, "%s%s%s\n", name, new_passwd, cp);
+
+ if (shadow && *cp == ':') {
+ /* /etc/shadow's field 3 (passwd change date) needs updating */
+ /* 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,
+ (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);
+ }
changed_lines++;
} /* else delete user or group: skip the line */
next: