summaryrefslogtreecommitdiffstats
path: root/pw
diff options
context:
space:
mode:
authorDavid Nugent <davidn@FreeBSD.org>2000-06-18 02:16:07 +0000
committerDavid Nugent <davidn@FreeBSD.org>2000-06-18 02:16:07 +0000
commitcf75e4c4fe862eb5b50d6146d9e8daafd95c243e (patch)
tree5daa38441c44dbb2dd3926ff9e1e6df6f7cd93a0 /pw
parent6725a28236ac98fa784b48a9310408df389e70d2 (diff)
downloadpw-darwin-cf75e4c4fe862eb5b50d6146d9e8daafd95c243e.tar.gz
pw-darwin-cf75e4c4fe862eb5b50d6146d9e8daafd95c243e.tar.zst
pw-darwin-cf75e4c4fe862eb5b50d6146d9e8daafd95c243e.zip
Second and hopefully final fix to .db sync when renaming a user; we must run
a full reindex in this case to remove the old record. #ifdef -u capability since this is available on FreeBSD only. PR: bin/16418 Problem pointed out by: Masachika ISHIZUKA <ishizuka@ish.org>
Diffstat (limited to 'pw')
-rw-r--r--pw/pwupd.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/pw/pwupd.c b/pw/pwupd.c
index 7b96035..1f0d86f 100644
--- a/pw/pwupd.c
+++ b/pw/pwupd.c
@@ -43,6 +43,7 @@ static const char rcsid[] =
#include "pwupd.h"
#define HAVE_PWDB_C 1
+#define HAVE_PWDB_U 1
static char pathpwd[] = _PATH_PWD;
static char * pwpath = pathpwd;
@@ -150,9 +151,12 @@ pw_update(struct passwd * pwd, char const * user, int mode)
#else
{ /* No -C */
#endif
- char pfx[32];
+ char pfx[PWBUFSZ];
char pwbuf[PWBUFSZ];
- int l = sprintf(pfx, "%s:", user);
+ int l = snprintf(pfx, PWBUFSZ, "%s:", user);
+#ifdef HAVE_PWDB_U
+ int isrename = strcmp(user, pwd->pw_name);
+#endif
/*
* Update the passwd file first
@@ -172,10 +176,14 @@ pw_update(struct passwd * pwd, char const * user, int mode)
fmtpwentry(pwbuf, pwd, PWF_MASTER);
rc = fileupdate(getpwpath(_MASTERPASSWD), 0644, pwbuf, pfx, l, mode);
if (rc == 0) {
- if (mode == UPD_DELETE)
+#ifdef HAVE_PWDB_U
+ if (mode == UPD_DELETE || isrename)
+#endif
rc = pwdb(NULL);
+#ifdef HAVE_PWDB_U
else
- rc = pwdb("-u", pwd->pw_name, NULL);
+ rc = pwdb("-u", user, NULL);
+#endif
}
}
}