Mercurial > dovecot > original-hg > dovecot-1.2
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