1
0
mirror of https://github.com/samba-team/samba.git synced 2025-11-25 00:23:52 +03:00

r4296: Patch from William Jojo <jojowil@hvcc.edu> to fix HPUX sendfile and add

configure.in tests and code for sendfile on AIX.
Jeremy.
This commit is contained in:
Jeremy Allison
2004-12-20 22:33:37 +00:00
committed by Gerald (Jerry) Carter
parent 473babfeca
commit f08aceb988
2 changed files with 86 additions and 1 deletions

View File

@@ -4239,7 +4239,36 @@ samba_cv_HAVE_SENDFILEV=yes,samba_cv_HAVE_SENDFILEV=no)])
AC_MSG_RESULT(no); AC_MSG_RESULT(no);
fi 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 esac

View File

@@ -274,7 +274,7 @@ ssize_t sys_sendfile(int tofd, int fromfd, const DATA_BLOB *header, SMB_OFF_T of
hdtrl[0].iov_len = hdr_len = 0; hdtrl[0].iov_len = hdr_len = 0;
} }
hdtrl[1].iov_base = NULL; hdtrl[1].iov_base = NULL;
hdtrl[1].iov_base = 0; hdtrl[1].iov_len = 0;
total = count; total = count;
while (total + hdtrl[0].iov_len) { while (total + hdtrl[0].iov_len) {
@@ -395,6 +395,62 @@ ssize_t sys_sendfile(int tofd, int fromfd, const DATA_BLOB *header, SMB_OFF_T of
return count + hdr_len; return count + hdr_len;
} }
#elif defined(AIX_SENDFILE_API)
/* BEGIN AIX SEND_FILE */
/* Contributed by William Jojo <jojowil@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. */ #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) ssize_t sys_sendfile(int tofd, int fromfd, const DATA_BLOB *header, SMB_OFF_T offset, size_t count)