Mailing List Archive

r1467 - trunk/varnish-cache/lib/libvarnish
Author: des
Date: 2007-05-23 10:14:11 +0200 (Wed, 23 May 2007)
New Revision: 1467

Modified:
trunk/varnish-cache/lib/libvarnish/flopen.c
Log:
From FreeBSD: if (flags & O_TRUNC), don't truncate the file until we've
successfully locked it.


Modified: trunk/varnish-cache/lib/libvarnish/flopen.c
===================================================================
--- trunk/varnish-cache/lib/libvarnish/flopen.c 2007-05-22 16:05:55 UTC (rev 1466)
+++ trunk/varnish-cache/lib/libvarnish/flopen.c 2007-05-23 08:14:11 UTC (rev 1467)
@@ -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 <sys/file.h>
@@ -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 @@
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 @@
close(fd);
continue;
}
+ if (truncate && ftruncate(fd, 0) != 0) {
+ /* can't happen [tm] */
+ serrno = errno;
+ close(fd);
+ errno = serrno;
+ return (-1);
+ }
return (fd);
}
}