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)

Reply via email to