Author: jra Date: 2004-12-20 22:33:43 +0000 (Mon, 20 Dec 2004) New Revision: 4297
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=4297 Log: Patch from William Jojo <[EMAIL PROTECTED]> to fix HPUX sendfile and add configure.in tests and code for sendfile on AIX. Jeremy. Modified: trunk/source/configure.in trunk/source/lib/sendfile.c Changeset: Modified: trunk/source/configure.in =================================================================== --- trunk/source/configure.in 2004-12-20 22:33:37 UTC (rev 4296) +++ trunk/source/configure.in 2004-12-20 22:33:43 UTC (rev 4297) @@ -4224,7 +4224,36 @@ AC_MSG_RESULT(no); fi ;; + *aix*) + AC_CACHE_CHECK([for AIX send_file support],samba_cv_HAVE_SENDFILE,[ + AC_TRY_LINK([\ +#include <sys/socket.h>], +[\ + int fromfd, tofd; + size_t total=0; + struct sf_parms hdtrl; + ssize_t nwritten; + off64_t offset; + hdtrl.header_data = 0; + hdtrl.header_length = 0; + hdtrl.file_descriptor = fromfd; + hdtrl.file_offset = 0; + hdtrl.file_bytes = 0; + hdtrl.trailer_data = 0; + hdtrl.trailer_length = 0; + + nwritten = send_file(&tofd, &hdtrl, 0); +], +samba_cv_HAVE_SENDFILE=yes,samba_cv_HAVE_SENDFILE=no)]) + if test x"$samba_cv_HAVE_SENDFILE" = x"yes"; then + AC_DEFINE(HAVE_SENDFILE,1,[Whether sendfile() is available]) + AC_DEFINE(AIX_SENDFILE_API,1,[Whether the AIX send_file() API is available]) + AC_DEFINE(WITH_SENDFILE,1,[Whether to include sendfile() support]) + else + AC_MSG_RESULT(no); + fi + ;; *) ;; esac Modified: trunk/source/lib/sendfile.c =================================================================== --- trunk/source/lib/sendfile.c 2004-12-20 22:33:37 UTC (rev 4296) +++ trunk/source/lib/sendfile.c 2004-12-20 22:33:43 UTC (rev 4297) @@ -274,7 +274,7 @@ hdtrl[0].iov_len = hdr_len = 0; } hdtrl[1].iov_base = NULL; - hdtrl[1].iov_base = 0; + hdtrl[1].iov_len = 0; total = count; while (total + hdtrl[0].iov_len) { @@ -395,6 +395,62 @@ return count + hdr_len; } +#elif defined(AIX_SENDFILE_API) + +/* BEGIN AIX SEND_FILE */ + +/* Contributed by William Jojo <[EMAIL PROTECTED]> */ +#include <sys/socket.h> + +ssize_t sys_sendfile(int tofd, int fromfd, const DATA_BLOB *header, SMB_OFF_T offset, size_t count) +{ + size_t total=0; + struct sf_parms hdtrl; + + /* Set up the header/trailer struct params. */ + if (header) { + hdtrl.header_data = header->data; + hdtrl.header_length = header->length; + } else { + hdtrl.header_data = NULL; + hdtrl.header_length = 0; + } + hdtrl.trailer_data = NULL; + hdtrl.trailer_length = 0; + + hdtrl.file_descriptor = fromfd; + hdtrl.file_offset = offset; + hdtrl.file_bytes = count; + + while ( hdtrl.file_bytes + hdtrl.header_length ) { + ssize_t ret; + + /* + Return Value + + There are three possible return values from send_file: + + Value Description + + -1 an error has occurred, errno contains the error code. + + 0 the command has completed successfully. + + 1 the command was completed partially, some data has been + transmitted but the command has to return for some reason, + for example, the command was interrupted by signals. + */ + do { + ret = send_file(&tofd, &hdtrl, 0); + } while ( (ret == 1) || (ret == -1 && errno == EINTR) ); + if ( ret == -1 ) + return -1; + } + + return count + header->length; +} +/* END AIX SEND_FILE */ + #else /* No sendfile implementation. Return error. */ ssize_t sys_sendfile(int tofd, int fromfd, const DATA_BLOB *header, SMB_OFF_T offset, size_t count)