svn commit: samba r4297 - in trunk/source: . lib

jra at samba.org jra at samba.org
Mon Dec 20 22:33:45 GMT 2004


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 <jojowil at hvcc.edu> 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 <jojowil at 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)



More information about the samba-cvs mailing list