summaryrefslogtreecommitdiffstats
path: root/chpass
diff options
context:
space:
mode:
authorBill Paul <wpaul@FreeBSD.org>1996-10-22 03:27:12 +0000
committerBill Paul <wpaul@FreeBSD.org>1996-10-22 03:27:12 +0000
commit3531aab720184b36e2c61cd9c06de07c8b0724b8 (patch)
treecbf73bde483c2e8f73d4571b5fba7943ea5d9fa8 /chpass
parent2e3d15689a705bdf5332df79fa68bbad034ddb05 (diff)
downloadpw-darwin-3531aab720184b36e2c61cd9c06de07c8b0724b8.tar.gz
pw-darwin-3531aab720184b36e2c61cd9c06de07c8b0724b8.tar.zst
pw-darwin-3531aab720184b36e2c61cd9c06de07c8b0724b8.zip
Part 2 of fix for PR #1519. The problem here is similar to what
was going on in pwd_mkdb, except here we also have to deal with the pw_change and pw_expire fields.
Diffstat (limited to 'chpass')
-rw-r--r--chpass/pw_copy.c33
1 files changed, 25 insertions, 8 deletions
diff --git a/chpass/pw_copy.c b/chpass/pw_copy.c
index 4a1d9a5..b2c234c 100644
--- a/chpass/pw_copy.c
+++ b/chpass/pw_copy.c
@@ -58,6 +58,15 @@ pw_copy(ffd, tfd, pw)
FILE *from, *to;
int done;
char *p, buf[8192];
+ char uidstr[20];
+ char gidstr[20];
+ char chgstr[20];
+ char expstr[20];
+
+ snprintf(uidstr, sizeof(uidstr), "%d", pw->pw_uid);
+ snprintf(gidstr, sizeof(gidstr), "%d", pw->pw_gid);
+ snprintf(chgstr, sizeof(chgstr), "%lu", pw->pw_change);
+ snprintf(expstr, sizeof(expstr), "%lu", pw->pw_expire);
if (!(from = fdopen(ffd, "r")))
pw_error(_PATH_MASTERPASSWD, 1, 1);
@@ -87,10 +96,14 @@ pw_copy(ffd, tfd, pw)
goto err;
continue;
}
- (void)fprintf(to, "%s:%s:%d:%d:%s:%ld:%ld:%s:%s:%s\n",
- pw->pw_name, pw->pw_passwd, pw->pw_uid, pw->pw_gid,
- pw->pw_class, pw->pw_change, pw->pw_expire, pw->pw_gecos,
- pw->pw_dir, pw->pw_shell);
+ (void)fprintf(to, "%s:%s:%s:%s:%s:%ld:%ld:%s:%s:%s\n",
+ pw->pw_name, pw->pw_passwd,
+ pw->pw_fields & _PWF_UID ? uidstr : "",
+ pw->pw_fields & _PWF_GID ? gidstr : "",
+ pw->pw_class,
+ pw->pw_fields & _PWF_CHANGE ? chgstr : "",
+ pw->pw_fields & _PWF_EXPIRE ? expstr : "",
+ pw->pw_gecos, pw->pw_dir, pw->pw_shell);
done = 1;
if (ferror(to))
goto err;
@@ -104,10 +117,14 @@ pw_copy(ffd, tfd, pw)
pw_error(NULL, 0, 1);
} else
#endif /* YP */
- (void)fprintf(to, "%s:%s:%d:%d:%s:%ld:%ld:%s:%s:%s\n",
- pw->pw_name, pw->pw_passwd, pw->pw_uid, pw->pw_gid,
- pw->pw_class, pw->pw_change, pw->pw_expire, pw->pw_gecos,
- pw->pw_dir, pw->pw_shell);
+ (void)fprintf(to, "%s:%s:%s:%s:%s:%ld:%ld:%s:%s:%s\n",
+ pw->pw_name, pw->pw_passwd,
+ pw->pw_fields & _PWF_UID ? uidstr : "",
+ pw->pw_fields & _PWF_GID ? gidstr : "",
+ pw->pw_class,
+ pw->pw_fields & _PWF_CHANGE ? chgstr : "",
+ pw->pw_fields & _PWF_EXPIRE ? expstr : "",
+ pw->pw_gecos, pw->pw_dir, pw->pw_shell);
if (ferror(to))
err: pw_error(NULL, 1, 1);