diff options
author | Dag-Erling Smørgrav <des@FreeBSD.org> | 2007-05-23 08:12:34 +0000 |
---|---|---|
committer | Dag-Erling Smørgrav <des@FreeBSD.org> | 2007-05-23 08:12:34 +0000 |
commit | 4ffe7630675d3faf9068264f9a1e7b494a71477b (patch) | |
tree | 6db3e78716171ce238cc73d18b40e81d0d04eedb /libutil | |
parent | 7750efa40b8dcef319473176ea0fd3c8afb7d765 (diff) | |
download | pw-darwin-4ffe7630675d3faf9068264f9a1e7b494a71477b.tar.gz pw-darwin-4ffe7630675d3faf9068264f9a1e7b494a71477b.tar.zst pw-darwin-4ffe7630675d3faf9068264f9a1e7b494a71477b.zip |
If (flags & O_TRUNC), don't truncate the file until we've successfully
locked it.
MFC after: 3 weeks
Diffstat (limited to 'libutil')
-rw-r--r-- | libutil/flopen.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/libutil/flopen.c b/libutil/flopen.c index 687ebac..92254cc 100644 --- a/libutil/flopen.c +++ b/libutil/flopen.c @@ -41,7 +41,7 @@ __FBSDID("$FreeBSD$"); int flopen(const char *path, int flags, ...) { - int fd, operation, serrno; + int fd, operation, serrno, truncate; struct stat sb, fsb; mode_t mode; @@ -62,6 +62,9 @@ flopen(const char *path, int flags, ...) if (flags & O_NONBLOCK) operation |= LOCK_NB; + truncate = (flags & O_TRUNC); + flags |= ~O_TRUNC; + for (;;) { if ((fd = open(path, flags, mode)) == -1) /* non-existent or no access */ @@ -91,6 +94,13 @@ flopen(const char *path, int flags, ...) close(fd); continue; } + if (truncate && ftruncate(fd, 0) != 0) { + /* can't happen [tm] */ + serrno = errno; + close(fd); + errno = serrno; + return (-1); + } return (fd); } } |