diff options
author | 2000-06-18 02:16:07 +0000 | |
---|---|---|
committer | 2000-06-18 02:16:07 +0000 | |
commit | 06942a0cdf3606d24a458c573469b65ba918c210 (patch) | |
tree | ee3980280f8a36509dad0c01fe82e26b55a7ebef /pw | |
parent | 12a360af7578168a68cb173f523d637bab4609ce (diff) | |
download | pw-darwin-06942a0cdf3606d24a458c573469b65ba918c210.tar.gz pw-darwin-06942a0cdf3606d24a458c573469b65ba918c210.tar.zst pw-darwin-06942a0cdf3606d24a458c573469b65ba918c210.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.c | 16 |
1 files changed, 12 insertions, 4 deletions
@@ -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 } } } |