diff options
author | Jeremy Allison <jra@samba.org> | 2004-12-20 22:33:37 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 10:53:42 -0500 |
commit | be60bf64478261a642b5636669c7a8fc92b7b13d (patch) | |
tree | bb4bf2e5872a5038ede646a7edf96506b6de0219 /source3/lib | |
parent | 52d377b75f7740b529c337c2e8585826246bc148 (diff) | |
download | samba-be60bf64478261a642b5636669c7a8fc92b7b13d.tar.gz samba-be60bf64478261a642b5636669c7a8fc92b7b13d.tar.bz2 samba-be60bf64478261a642b5636669c7a8fc92b7b13d.zip |
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 used to be commit f08aceb9882fb1df1e1e28179f87ac5c3d5afa45)
Diffstat (limited to 'source3/lib')
-rw-r--r-- | source3/lib/sendfile.c | 58 |
1 files changed, 57 insertions, 1 deletions
diff --git a/source3/lib/sendfile.c b/source3/lib/sendfile.c index 75fb635fa2..f9f33b8f35 100644 --- a/source3/lib/sendfile.c +++ b/source3/lib/sendfile.c @@ -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[1].iov_base = NULL; - hdtrl[1].iov_base = 0; + hdtrl[1].iov_len = 0; total = count; 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; } +#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. */ ssize_t sys_sendfile(int tofd, int fromfd, const DATA_BLOB *header, SMB_OFF_T offset, size_t count) |