From 311e23d37ace337b0c6a78959dbe8623a1ce7ed1 Mon Sep 17 00:00:00 2001 From: des Date: Wed, 23 May 2007 08:14:11 +0000 Subject: [PATCH] From FreeBSD: if (flags & O_TRUNC), don't truncate the file until we've successfully locked it. git-svn-id: svn+ssh://projects.linpro.no/svn/varnish/trunk@1467 d4fa192b-c00b-0410-8231-f00ffab90ce4 --- varnish-cache/lib/libvarnish/flopen.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/varnish-cache/lib/libvarnish/flopen.c b/varnish-cache/lib/libvarnish/flopen.c index 009d898a..d0c03f7c 100644 --- a/varnish-cache/lib/libvarnish/flopen.c +++ b/varnish-cache/lib/libvarnish/flopen.c @@ -26,7 +26,7 @@ * * $Id$ * Derived from: - * $FreeBSD: src/lib/libutil/flopen.c,v 1.4 2007/05/10 15:01:42 des Exp $ + * $FreeBSD: src/lib/libutil/flopen.c,v 1.5 2007/05/23 08:12:34 des Exp $ */ #include @@ -42,7 +42,7 @@ int flopen(const char *path, int flags, ...) { - int fd, operation, serrno; + int fd, operation, serrno, truncate; struct stat sb, fsb; mode_t mode; @@ -63,6 +63,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 */ @@ -92,6 +95,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); } } -- 2.39.5