daemon: Alternate implementation of posix_fallocate.

If the posix_fallocate function is not available [ie. Windows]
use an alternate implementation that just loops and writes.
This commit is contained in:
Richard Jones
2009-11-24 16:16:08 +00:00
parent a951965403
commit c2aad5cd92
2 changed files with 23 additions and 1 deletions

View File

@@ -179,6 +179,7 @@ AC_CHECK_FUNCS([\
lsetxattr \
lremovexattr \
mknod \
posix_fallocate \
removexattr \
setxattr])

View File

@@ -30,7 +30,7 @@
int
do_fallocate (const char *path, int len)
{
int fd, r;
int fd;
CHROOT_IN;
fd = open (path, O_WRONLY | O_CREAT | O_TRUNC | O_NOCTTY, 0666);
@@ -40,12 +40,33 @@ do_fallocate (const char *path, int len)
return -1;
}
#ifdef HAVE_POSIX_FALLOCATE
int r;
r = posix_fallocate (fd, 0, len);
if (r == -1) {
reply_with_perror ("posix_fallocate: %s", path);
close (fd);
return -1;
}
#else
ssize_t r;
char buf[BUFSIZ];
const size_t len_sz = (size_t) len;
size_t n;
memset (buf, 0, BUFSIZ);
n = 0;
while (n < len_sz) {
r = write (fd, buf, len_sz - n < BUFSIZ ? len_sz - n : BUFSIZ);
if (r == -1) {
reply_with_perror ("write: %s", path);
close (fd);
return -1;
}
n += r;
}
#endif
if (close (fd) == -1) {
reply_with_perror ("close: %s", path);