r4296: Patch from William Jojo <jojowil@hvcc.edu> to fix HPUX sendfile and add
authorJeremy Allison <jra@samba.org>
Mon, 20 Dec 2004 22:33:37 +0000 (22:33 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 15:53:42 +0000 (10:53 -0500)
configure.in tests and code for sendfile on AIX.
Jeremy.
(This used to be commit f08aceb9882fb1df1e1e28179f87ac5c3d5afa45)

source3/configure.in
source3/lib/sendfile.c

index 09586adcd60b91ef488cf0e4bbd717ab08185d3d..35300151104571cc5b0ffdfb770909f03c078b35 100644 (file)
@@ -4239,7 +4239,36 @@ samba_cv_HAVE_SENDFILEV=yes,samba_cv_HAVE_SENDFILEV=no)])
                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
index 75fb635fa2613142029a1a5a84a1830fe1bfe458..f9f33b8f35e2eb46ccdaa316bbdc9eed6c8cdbcc 100644 (file)
@@ -274,7 +274,7 @@ ssize_t sys_sendfile(int tofd, int fromfd, const DATA_BLOB *header, SMB_OFF_T of
                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 @@ ssize_t sys_sendfile(int tofd, int fromfd, const DATA_BLOB *header, SMB_OFF_T of
        return count + hdr_len;
 }
 
+#elif defined(AIX_SENDFILE_API)
+
+/* BEGIN AIX SEND_FILE */
+
+/* Contributed by William Jojo <jojowil@hvcc.edu> */
+#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)