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:
committed by
Gerald (Jerry) Carter
parent
473babfeca
commit
f08aceb988
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user