From 4ffe7630675d3faf9068264f9a1e7b494a71477b Mon Sep 17 00:00:00 2001 From: Dag-Erling Smørgrav Date: Wed, 23 May 2007 08:12:34 +0000 Subject: If (flags & O_TRUNC), don't truncate the file until we've successfully locked it. MFC after: 3 weeks --- libutil/flopen.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) (limited to 'libutil') 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); } } -- cgit v1.2.3-56-ge451