X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=libatalk%2Fadouble%2Fad_sendfile.c;h=3cb28e7802c935db16ab4acf80645db577b43816;hb=1997a50e89d139cc15e05db4f3e40412b5fe4ce3;hp=2a1f1426aa45b6a5aeb1aa13614c46b3be17e078;hpb=dd14ee0c14fe7a965ec8db07c0d3e8bb0aa49613;p=netatalk.git diff --git a/libatalk/adouble/ad_sendfile.c b/libatalk/adouble/ad_sendfile.c index 2a1f1426..3cb28e78 100644 --- a/libatalk/adouble/ad_sendfile.c +++ b/libatalk/adouble/ad_sendfile.c @@ -40,37 +40,15 @@ #include "ad_lock.h" -#if defined(LINUX_BROKEN_SENDFILE_API) - -extern int32_t sendfile (int fdout, int fdin, int32_t *offset, u_int32_t count); +#if defined(SENDFILE_FLAVOR_LINUX) +#include ssize_t sys_sendfile(int tofd, int fromfd, off_t *offset, size_t count) { -u_int32_t small_total; -int32_t small_offset; -int32_t nwritten; - - /* - * Fix for broken Linux 2.4 systems with no working sendfile64(). - * If the offset+count > 2 GB then pretend we don't have the - * system call sendfile at all. The upper layer catches this - * and uses a normal read. JRA. - */ - - if ((sizeof(off_t) >= 8) && (*offset + count > (off_t)0x7FFFFFFF)) { - errno = ENOSYS; - return -1; - } - small_offset = (int32_t)*offset; - small_total = (u_int32_t)count; - nwritten = sendfile(tofd, fromfd, &small_offset, small_total); - if (nwritten > = 0) - *offset += nwritten; - - return nwritten; + return sendfile(tofd, fromfd, offset, count); } -#elif defined(SENDFILE_FLAVOR_LINUX) +#elif defined(SENDFILE_FLAVOR_SOLARIS) #include ssize_t sys_sendfile(int tofd, int fromfd, off_t *offset, size_t count) @@ -79,26 +57,21 @@ ssize_t sys_sendfile(int tofd, int fromfd, off_t *offset, size_t count) } #elif defined(SENDFILE_FLAVOR_BSD ) -/* FIXME untested */ -#error sendfile semantic broken -#include +#include +#include +#include ssize_t sys_sendfile(int tofd, int fromfd, off_t *offset, size_t count) { -size_t total=0; -int ret; - - total = count; - while (total) { - ssize_t nwritten; - do { - ret = sendfile(fromfd, tofd, offset, count, NULL, &nwritten, 0); - while (ret == -1 && errno == EINTR); - if (ret == -1) - return -1; - total -= nwritten; - offset += nwritten; - } - return count; + off_t len; + int ret; + + ret = sendfile(fromfd, tofd, *offset, count, NULL, &len, 0); + + *offset += len; + + if (ret != 0) + return -1; + return len; } #else