diff options
Diffstat (limited to 'usr.sbin/pw/fileupd.c')
-rw-r--r-- | usr.sbin/pw/fileupd.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/usr.sbin/pw/fileupd.c b/usr.sbin/pw/fileupd.c index 3782bf7..fe46480 100644 --- a/usr.sbin/pw/fileupd.c +++ b/usr.sbin/pw/fileupd.c @@ -26,7 +26,7 @@ #ifndef lint static const char rcsid[] = - "$Id$"; + "$Id: fileupd.c,v 1.5 1997/10/10 06:23:31 charnier Exp $"; #endif /* not lint */ #include <stdio.h> @@ -76,7 +76,7 @@ fileupdate(char const * filename, mode_t fmode, char const * newline, char const if (pfxlen <= 1) errno = EINVAL; else { - int infd = open(filename, O_RDWR | O_CREAT | O_EXLOCK, fmode); + int infd = open(filename, O_RDWR | O_CREAT, fmode); if (infd != -1) { FILE *infp = fdopen(infd, "r+"); @@ -168,9 +168,20 @@ fileupdate(char const * filename, mode_t fmode, char const * newline, char const fputs(line, infp); /* + * If there was a problem with copying + * we will just rename 'file.new' + * to 'file'. * This is a gross hack, but we may have * corrupted the original file - * Unfortunately, it will lose the inode. + * 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; |