If (flags & O_TRUNC), don't truncate the file until we've successfully
locked it. MFC after: 3 weeks
This commit is contained in:
parent
905a24b997
commit
d75d56060e
@ -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);
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user