changeset 976:b3e0f857981c HEAD

Support for Solaris sendfilev(). Entirely untested, hope it works.
author Timo Sirainen <tss@iki.fi>
date Tue, 14 Jan 2003 22:59:57 +0200
parents 7bd8508ed0fa
children 45d04b5dcd24
files configure.in src/lib/sendfile-util.c
diffstat 2 files changed, 39 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/configure.in	Tue Jan 14 15:26:31 2003 +0200
+++ b/configure.in	Tue Jan 14 22:59:57 2003 +0200
@@ -530,6 +530,16 @@
   AC_MSG_RESULT(no)
 ])
 
+dnl * Solaris compatible sendfilev()
+AC_MSG_CHECKING([Solaris compatible sendfilev()])
+AC_CHECK_LIB(sendfile, sendfilev, [
+  LIBS="$LIBS -lsendfile"
+  AC_DEFINE(HAVE_SOLARIS_SENDFILEV,, Define if you have Solaris-compatible sendfilev())
+  AC_MSG_RESULT(yes)
+], [
+  AC_MSG_RESULT(no)
+])
+
 dnl ***
 dnl *** va_copy checks (from GLIB)
 dnl ***
--- a/src/lib/sendfile-util.c	Tue Jan 14 15:26:31 2003 +0200
+++ b/src/lib/sendfile-util.c	Tue Jan 14 22:59:57 2003 +0200
@@ -68,6 +68,34 @@
 	else
 		return -1;
 }
+
+#elif defined (HAVE_SOLARIS_SENDFILEV)
+
+#include <sys/sendfile.h>
+
+ssize_t safe_sendfile(int out_fd, int in_fd, uoff_t *offset, size_t count)
+{
+	struct sendfilevec vec;
+	size_t sbytes;
+	ssize_t ret;
+
+	i_assert(count <= SSIZE_T_MAX);
+
+	vec.sfv_fd = in_fd;
+	vec.sfv_flag = 0;
+	vec.sfv_off = *offset;
+	vec.sfv_len = count;
+
+	ret = sendfilev(out_fd, &vec, 1, &sbytes);
+
+	*offset += sbytes;
+
+	if (ret >= 0 || (ret < 0 && errno == EAGAIN && sbytes > 0))
+		return (ssize_t)sbytes;
+	else
+		return -1;
+}
+
 #else
 ssize_t safe_sendfile(int out_fd __attr_unused__, int in_fd __attr_unused__,
 		      uoff_t *offset __attr_unused__,
@@ -76,4 +104,5 @@
 	errno = EINVAL;
 	return -1;
 }
+
 #endif