17 #include "apr_arch_networkio.h" 22 #include "apr_arch_file_io.h" 26 #if defined(__FreeBSD__) 27 #include <osreldate.h> 42 }
while (rv == -1 && errno == EINTR);
44 while (rv == -1 && (errno == EAGAIN || errno == EWOULDBLOCK)
56 }
while (rv == -1 && errno == EINTR);
82 }
while (rv == -1 && errno == EINTR);
84 while ((rv == -1) && (errno == EAGAIN || errno == EWOULDBLOCK)
95 }
while (rv == -1 && errno == EINTR);
122 }
while (rv == -1 && errno == EINTR);
124 while ((rv == -1) && (errno == EAGAIN || errno == EWOULDBLOCK)
135 }
while (rv == -1 && errno == EINTR);
152 from->
salen =
sizeof(from->
sa);
157 }
while (rv == -1 && errno == EINTR);
159 while ((rv == -1) && (errno == EAGAIN || errno == EWOULDBLOCK)
169 }
while (rv == -1 && errno == EINTR);
183 ntohs(from->
sa.
sin.sin_port));
187 if (rv == 0 &&
sock->
type == SOCK_STREAM) {
195 apr_int32_t
nvec, apr_size_t *
len)
199 apr_size_t requested_len = 0;
202 for (i = 0; i <
nvec; i++) {
203 requested_len +=
vec[i].iov_len;
213 }
while (rv == -1 && errno == EINTR);
215 while ((rv == -1) && (errno == EAGAIN || errno == EWOULDBLOCK)
227 }
while (rv == -1 && errno == EINTR);
255 #if (defined(__linux__) || defined(__GNU__)) && defined(HAVE_WRITEV) 261 int rv,
nbytes = 0, total_hdrbytes, i;
264 #if APR_HAS_LARGE_FILES && defined(HAVE_SENDFILE64) 266 #define sendfile sendfile64 268 #elif APR_HAS_LARGE_FILES && SIZEOF_OFF_T == 4 273 if ((apr_int64_t)*
offset + *
len > INT_MAX) {
286 if (
sizeof(off_t) == 8 && *
len > INT_MAX) {
319 total_hdrbytes += hdtr->
headers[i].iov_len;
321 if (hdrbytes < total_hdrbytes) {
337 }
while (rv == -1 && errno == EINTR);
339 while ((rv == -1) && (errno == EAGAIN || errno == EWOULDBLOCK)
353 }
while (rv == -1 && errno == EINTR);
410 #elif defined(DARWIN) 418 apr_off_t bytes_to_send = *
len;
419 apr_off_t bytes_sent = 0;
449 hbytes += hdtr->
headers[i].iov_len;
451 if (bytes_sent < hbytes) {
458 if (!bytes_to_send) {
480 if (errno == EAGAIN) {
506 }
while (rv == -1 && (errno == EINTR || errno == EAGAIN));
513 bytes_sent += tbytes;
528 #elif defined(__FreeBSD__) || defined(__DragonFly__) 533 apr_size_t *
len, apr_int32_t
flags)
537 #if defined(__FreeBSD_version) && __FreeBSD_version < 460001 540 struct sf_hdtr headerstruct;
541 apr_size_t bytes_to_send = *
len;
550 #if defined(__FreeBSD_version) && __FreeBSD_version < 460001 561 bytes_to_send += hdtr->
headers[i].iov_len;
566 headerstruct.headers = hdtr->
headers;
568 headerstruct.trailers = hdtr->
trailers;
596 if (errno == EAGAIN) {
635 if ((rv == -1) && (errno == EAGAIN)
643 }
while (rv == -1 && (errno == EINTR || errno == EAGAIN));
652 #elif defined(__hpux) || defined(__hpux__) 673 apr_size_t
nbytes = *
len, headerlen, trailerlen;
674 struct iovec hdtrarray[2];
675 char *headerbuf, *trailerbuf;
677 #if APR_HAS_LARGE_FILES && defined(HAVE_SENDFILE64) 679 #define sendfile sendfile64 682 #elif APR_HAS_LARGE_FILES && SIZEOF_OFF_T == 4 687 if ((apr_int64_t)*
offset + *
len > INT_MAX) {
708 hdtrarray[0].iov_base = NULL;
709 hdtrarray[0].iov_len = 0;
712 hdtrarray[0] = hdtr->
headers[0];
717 headerlen += hdtr->
headers[i].iov_len;
721 headerbuf = hdtrarray[0].iov_base = apr_palloc(
sock->
pool, headerlen);
722 hdtrarray[0].iov_len = headerlen;
725 memcpy(headerbuf, hdtr->
headers[i].iov_base,
727 headerbuf += hdtr->
headers[i].iov_len;
733 hdtrarray[1].iov_base = NULL;
734 hdtrarray[1].iov_len = 0;
742 trailerlen += hdtr->
trailers[i].iov_len;
746 trailerbuf = hdtrarray[1].iov_base = apr_palloc(
sock->
pool, trailerlen);
747 hdtrarray[1].iov_len = trailerlen;
750 memcpy(trailerbuf, hdtr->
trailers[i].iov_base,
752 trailerbuf += hdtr->
trailers[i].iov_len;
768 }
while (rc == -1 && errno == EINTR);
770 while ((rc == -1) && (errno == EAGAIN || errno == EWOULDBLOCK)
791 }
while (rc == -1 && errno == EINTR);
804 #elif defined(_AIX) || defined(__MVS__) 817 apr_size_t *
len, apr_int32_t
flags)
820 void * hbuf=NULL, * tbuf=NULL;
822 struct sf_parms parms;
840 parms.header_length = 0;
843 parms.header_data = hdtr->
headers[0].iov_base;
844 parms.header_length = hdtr->
headers[0].iov_len;
848 parms.header_length += hdtr->
headers[i].iov_len;
852 hbuf = malloc(parms.header_length);
857 hbuf = apr_palloc(
sock->
pool, parms.header_length);
861 memcpy((
char *)hbuf + ptr, hdtr->
headers[i].iov_base,
863 ptr += hdtr->
headers[i].iov_len;
865 parms.header_data = hbuf;
868 else parms.header_data = NULL;
869 parms.trailer_length = 0;
872 parms.trailer_data = hdtr->
trailers[0].iov_base;
873 parms.trailer_length = hdtr->
trailers[0].iov_len;
877 parms.trailer_length += hdtr->
trailers[i].iov_len;
881 tbuf = malloc(parms.trailer_length);
883 tbuf = apr_palloc(
sock->
pool, parms.trailer_length);
887 memcpy((
char *)tbuf + ptr, hdtr->
trailers[i].iov_base,
891 parms.trailer_data = tbuf;
895 parms.trailer_data = NULL;
901 parms.file_offset = *
offset;
902 parms.file_bytes = *
len;
915 }
while (rv == -1 && errno == EINTR);
917 while ((rv == -1) && (errno == EAGAIN || errno == EWOULDBLOCK)
930 }
while (rv == -1 && errno == EINTR);
934 (*len) = parms.bytes_sent;
948 < (parms.file_bytes + parms.header_length + parms.trailer_length))) {
954 #elif defined(__osf__) && defined (__alpha) 959 #elif defined(HAVE_SENDFILEV) 972 #if APR_HAS_LARGE_FILES && defined(HAVE_SENDFILEV64) 973 #define sendfilevec_t sendfilevec64_t 974 #define sendfilev sendfilev64 984 int vecs, curvec, i, repeat;
985 apr_size_t requested_len = 0;
996 sfv = apr_palloc(
sock->
pool,
sizeof(sendfilevec_t) * vecs);
1001 for (i = 0; i < hdtr->
numheaders; i++, curvec++) {
1002 sfv[curvec].sfv_fd = SFV_FD_SELF;
1003 sfv[curvec].sfv_flag = 0;
1006 sfv[curvec].sfv_off = (
unsigned long)hdtr->
headers[i].iov_base;
1007 sfv[curvec].sfv_len = hdtr->
headers[i].iov_len;
1008 requested_len += sfv[curvec].sfv_len;
1015 sfv[curvec].sfv_flag = 0;
1016 sfv[curvec].sfv_off = *
offset;
1017 sfv[curvec].sfv_len = *
len;
1018 requested_len += sfv[curvec].sfv_len;
1027 for (i = 0; i < hdtr->
numtrailers; i++, curvec++) {
1028 sfv[curvec].sfv_fd = SFV_FD_SELF;
1029 sfv[curvec].sfv_flag = 0;
1030 sfv[curvec].sfv_off = (
unsigned long)hdtr->
trailers[i].iov_base;
1031 sfv[curvec].sfv_len = hdtr->
trailers[i].iov_len;
1032 requested_len += sfv[curvec].sfv_len;
1065 if (rv == -1 && errno == EAGAIN) {
1081 }
while ((rv == -1 && errno == EINTR) || repeat);
1104 #error APR has detected sendfile on your system, but nobody has written a 1105 #error version of it for APR yet. To get past this, either write 1106 #error apr_socket_sendfile or change APR_HAS_SENDFILE in apr.h to 0.