diff options
-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); } } |