diff options
author | Denys Vlasenko | 2009-07-13 01:15:30 +0200 |
---|---|---|
committer | Denys Vlasenko | 2009-07-13 01:15:30 +0200 |
commit | 189f74d0f2760d3da1a05cba75653dade4c8a9c3 (patch) | |
tree | f192b88fd0a919d8d71d930272f25de1002a3e70 /libbb/update_passwd.c | |
parent | 044b18083b4380f158002ed7c00c52d362c9632c (diff) | |
download | busybox-189f74d0f2760d3da1a05cba75653dade4c8a9c3.zip busybox-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.c | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/libbb/update_passwd.c b/libbb/update_passwd.c index aa1e2ed..3aab401 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: |