]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Solaris: Move from sendfilev() to sendfile() (was it always there?). Make
authorTimo Sirainen <tss@iki.fi>
Sat, 22 May 2004 02:16:36 +0000 (05:16 +0300)
committerTimo Sirainen <tss@iki.fi>
Sat, 22 May 2004 02:16:36 +0000 (05:16 +0300)
EAFNOSUPPORT error Linux-compatible EINVAL.

--HG--
branch : HEAD

configure.in
src/lib/sendfile-util.c

index 5f2d381f3ea32ca5cc20b57ad316f52ef0c7ed65..cded7e5f195ff9916c33f4d3b27935f2d7f96799 100644 (file)
@@ -1,7 +1,7 @@
 AC_INIT(src)
 
 AM_CONFIG_HEADER(config.h)
-AM_INIT_AUTOMAKE(dovecot, 1.0-test9)
+AM_INIT_AUTOMAKE(dovecot, 1.0-test10)
 
 AM_MAINTAINER_MODE
 
@@ -721,10 +721,10 @@ AC_TRY_RUN([
 ])
 
 
-dnl * Solaris compatible sendfilev()
-AC_CHECK_LIB(sendfile, sendfilev, [
+dnl * Solaris compatible sendfile()
+AC_CHECK_LIB(sendfile, sendfile, [
   LIBS="$LIBS -lsendfile"
-  AC_DEFINE(HAVE_SOLARIS_SENDFILEV,, Define if you have Solaris-compatible sendfilev())
+  AC_DEFINE(HAVE_SOLARIS_SENDFILE,, Define if you have Solaris-compatible sendfile())
 ], [
   dnl * Linux compatible sendfile() - don't check if Solaris one was found.
   dnl * This seems to pass with Solaris for some reason..
index 14a49495fc7c091b1a6da982f8333bee20376fdd..b84a8086f5a6990b6b0f46a0849aba06c9403323 100644 (file)
@@ -81,15 +81,13 @@ ssize_t safe_sendfile(int out_fd, int in_fd, uoff_t *offset, size_t count)
        }
 }
 
-#elif defined (HAVE_SOLARIS_SENDFILEV)
+#elif defined (HAVE_SOLARIS_SENDFILE)
 
 #include <sys/sendfile.h>
 #include "network.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);
@@ -97,19 +95,13 @@ ssize_t safe_sendfile(int out_fd, int in_fd, uoff_t *offset, size_t count)
        /* NOTE: if outfd is not a socket, some Solaris versions will
           kernel panic */
 
-       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;
+       ret = sendfile(out_fd, in_fd, offset, count);
+       if (ret < 0 && errno == EAFNOSUPPORT) {
+               /* not supported, return Linux-like EINVAL so caller
+                  sees only consistent errnos. */
+               errno = EINVAL;
+       }
+       return ret;
 }
 
 #else