diff options
author | davidn <davidn@FreeBSD.org> | 1999-02-23 07:15:11 +0000 |
---|---|---|
committer | davidn <davidn@FreeBSD.org> | 1999-02-23 07:15:11 +0000 |
commit | aea1f6bc3cb4963dbd48dcd9f051919520f70f2b (patch) | |
tree | b3bd7501edb165799eda61bf2ac5d8202c789a5d /usr.sbin/pw/fileupd.c | |
parent | f6416f79a6b9a2eb5c485e8af421d3d570a95d25 (diff) | |
download | FreeBSD-src-aea1f6bc3cb4963dbd48dcd9f051919520f70f2b.zip FreeBSD-src-aea1f6bc3cb4963dbd48dcd9f051919520f70f2b.tar.gz |
1) Do not blindly ignore file update errors which may occur due to concurrent
updating
2) Add -V <etcdir>, which allows maintaining user/group database in alternate
locations other than /etc.
Diffstat (limited to 'usr.sbin/pw/fileupd.c')
-rw-r--r-- | usr.sbin/pw/fileupd.c | 15 |
1 files changed, 5 insertions, 10 deletions
diff --git a/usr.sbin/pw/fileupd.c b/usr.sbin/pw/fileupd.c index fe46480..d76259b 100644 --- a/usr.sbin/pw/fileupd.c +++ b/usr.sbin/pw/fileupd.c @@ -26,7 +26,7 @@ #ifndef lint static const char rcsid[] = - "$Id: fileupd.c,v 1.5 1997/10/10 06:23:31 charnier Exp $"; + "$Id: fileupd.c,v 1.6 1998/07/16 17:18:24 nate Exp $"; #endif /* not lint */ #include <stdio.h> @@ -175,16 +175,11 @@ fileupdate(char const * filename, mode_t fmode, char const * newline, char const * corrupted the original file * Unfortunately, it will lose the inode * and hence the lock. - * - * The implications of this is that this invocation of pw - * won't have the file locked and concurrent copies - * of pw, vipw etc could clobber what this one is doing. - * - * It should probably just return an error instead - * of going on like nothing is wrong. */ - if (fflush(infp) == EOF || ferror(infp)) - rc = rename(file, filename) == 0; + if (fflush(infp) == EOF || ferror(infp)) { + rc = errno; /* Preserve errno for return */ + rename(file, filename); + } else ftruncate(infd, ftell(infp)); } |