From fc5bbe41a574e668ccfafb0f15dddd28f6decd31 Mon Sep 17 00:00:00 2001 From: Stelian Ionescu Date: Thu, 2 Dec 2021 17:00:23 -0500 Subject: [PATCH] Fix lfp_sendfile() to always return the number of transferred bytes. Previously, the return value on DragonFlyBSD/FreeBSD/OSX was always 0 on success. Thanks to Vasily Postnicov for the bug report. Close #18 --- src/lib/sendfile.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/lib/sendfile.c b/src/lib/sendfile.c index a298a9b..a63b86a 100644 --- a/src/lib/sendfile.c +++ b/src/lib/sendfile.c @@ -38,6 +38,7 @@ int sendfile(int, int, off_t, off_t *, void *, int); #endif #include +#include DSO_PUBLIC ssize_t lfp_sendfile(int out_fd, int in_fd, off_t offset, size_t nbytes) @@ -46,18 +47,21 @@ lfp_sendfile(int out_fd, int in_fd, off_t offset, size_t nbytes) # if defined(__linux__) off_t off = offset; return (ssize_t) sendfile(out_fd, in_fd, &off, nbytes); -# elif defined(__FreeBSD__) - return (ssize_t) sendfile(in_fd, out_fd, offset, nbytes, NULL, NULL, SF_MNOWAIT); -# elif defined(__DragonFly__) - return (ssize_t) sendfile(in_fd, out_fd, offset, nbytes, NULL, NULL, 0); +# elif defined(__FreeBSD__) || defined(__DragonFly__) + off_t sbytes; + int res = sendfile(in_fd, out_fd, offset, nbytes, NULL, &sbytes, 0); + if (res == 0) { return sbytes; } + return res; # elif defined(__APPLE__) off_t len = nbytes; - return (ssize_t) sendfile(in_fd, out_fd, offset, &len, NULL, 0); + int res = sendfile(in_fd, out_fd, offset, &len, NULL, 0); + if (res == 0) { return len; } + return -1; # else # error "It appears that this OS has sendfile(), but LFP doesn't use it at the moment" # error "Please send an email to iolib-devel@common-lisp.net" # endif #else - return ENOSYS; + SYSERR(ENOSYS); #endif }