Annotation of embedaddon/lighttpd/src/network_darwin_sendfile.c, revision 1.1
1.1 ! misho 1: #include "first.h"
! 2:
! 3: #include "network_backends.h"
! 4:
! 5: #if defined(USE_DARWIN_SENDFILE)
! 6:
! 7: #include "network.h"
! 8: #include "log.h"
! 9:
! 10: #include <sys/types.h>
! 11: #include <sys/socket.h>
! 12: #include <sys/uio.h>
! 13:
! 14: #include <errno.h>
! 15: #include <string.h>
! 16:
! 17: int network_write_file_chunk_sendfile(server *srv, connection *con, int fd, chunkqueue *cq, off_t *p_max_bytes) {
! 18: chunk* const c = cq->first;
! 19: off_t offset, written = 0;
! 20: off_t toSend;
! 21: int r;
! 22:
! 23: force_assert(NULL != c);
! 24: force_assert(FILE_CHUNK == c->type);
! 25: force_assert(c->offset >= 0 && c->offset <= c->file.length);
! 26:
! 27: offset = c->file.start + c->offset;
! 28: toSend = c->file.length - c->offset;
! 29: if (toSend > *p_max_bytes) toSend = *p_max_bytes;
! 30:
! 31: if (0 == toSend) {
! 32: chunkqueue_remove_finished_chunks(cq);
! 33: return 0;
! 34: }
! 35:
! 36: if (0 != network_open_file_chunk(srv, con, cq)) return -1;
! 37:
! 38: /* Darwin sendfile() */
! 39: written = toSend;
! 40: if (-1 == (r = sendfile(c->file.fd, fd, offset, &written, NULL, 0))) {
! 41: switch(errno) {
! 42: case EAGAIN:
! 43: case EINTR:
! 44: /* for EAGAIN/EINTR written still contains the sent bytes */
! 45: break; /* try again later */
! 46: case EPIPE:
! 47: case ENOTCONN:
! 48: return -2;
! 49: case EINVAL:
! 50: case ENOSYS:
! 51: #if defined(ENOTSUP) \
! 52: && (!defined(EOPNOTSUPP) || EOPNOTSUPP != ENOTSUP)
! 53: case ENOTSUP:
! 54: #endif
! 55: #ifdef EOPNOTSUPP
! 56: case EOPNOTSUPP:
! 57: #endif
! 58: #ifdef ESOCKTNOSUPPORT
! 59: case ESOCKTNOSUPPORT:
! 60: #endif
! 61: #ifdef EAFNOSUPPORT
! 62: case EAFNOSUPPORT:
! 63: #endif
! 64: #ifdef USE_MMAP
! 65: return network_write_file_chunk_mmap(srv, con, fd, cq, p_max_bytes);
! 66: #else
! 67: return network_write_file_chunk_no_mmap(srv, con, fd, cq, p_max_bytes);
! 68: #endif
! 69: default:
! 70: log_error_write(srv, __FILE__, __LINE__, "ssd", "sendfile: ", strerror(errno), errno);
! 71: return -1;
! 72: }
! 73: }
! 74:
! 75: if (written >= 0) {
! 76: chunkqueue_mark_written(cq, written);
! 77: *p_max_bytes -= written;
! 78: }
! 79:
! 80: return (r >= 0 && written == toSend) ? 0 : -3;
! 81: }
! 82:
! 83: #endif /* USE_DARWIN_SENDFILE */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>