Annotation of embedaddon/lighttpd/src/network_freebsd_sendfile.c, revision 1.1.1.3
1.1.1.3 ! misho 1: #include "first.h"
! 2:
1.1 misho 3: #include "network_backends.h"
4:
1.1.1.3 ! misho 5: #if defined(USE_FREEBSD_SENDFILE)
1.1 misho 6:
7: #include "network.h"
8: #include "log.h"
9:
10: #include <sys/types.h>
11: #include <sys/socket.h>
1.1.1.3 ! misho 12: #include <sys/uio.h>
1.1 misho 13:
14: #include <errno.h>
15: #include <string.h>
16:
1.1.1.3 ! misho 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: }
1.1 misho 35:
1.1.1.3 ! misho 36: if (0 != network_open_file_chunk(srv, con, cq)) return -1;
1.1 misho 37:
1.1.1.3 ! misho 38: /* FreeBSD sendfile() */
! 39: if (-1 == (r = sendfile(c->file.fd, fd, offset, toSend, NULL, &written, 0))) {
! 40: switch(errno) {
! 41: case EAGAIN:
! 42: case EINTR:
! 43: /* for EAGAIN/EINTR written still contains the sent bytes */
! 44: break; /* try again later */
! 45: case EPIPE:
! 46: case ENOTCONN:
! 47: return -2;
! 48: case EINVAL:
! 49: case ENOSYS:
! 50: #if defined(ENOTSUP) \
! 51: && (!defined(EOPNOTSUPP) || EOPNOTSUPP != ENOTSUP)
! 52: case ENOTSUP:
! 53: #endif
! 54: #ifdef EOPNOTSUPP
! 55: case EOPNOTSUPP:
! 56: #endif
! 57: #ifdef ESOCKTNOSUPPORT
! 58: case ESOCKTNOSUPPORT:
! 59: #endif
! 60: #ifdef EAFNOSUPPORT
! 61: case EAFNOSUPPORT:
! 62: #endif
! 63: #ifdef USE_MMAP
! 64: return network_write_file_chunk_mmap(srv, con, fd, cq, p_max_bytes);
! 65: #else
! 66: return network_write_file_chunk_no_mmap(srv, con, fd, cq, p_max_bytes);
! 67: #endif
1.1 misho 68: default:
1.1.1.3 ! misho 69: log_error_write(srv, __FILE__, __LINE__, "ssd", "sendfile: ", strerror(errno), errno);
1.1 misho 70: return -1;
71: }
1.1.1.3 ! misho 72: }
1.1 misho 73:
1.1.1.3 ! misho 74: if (written >= 0) {
! 75: chunkqueue_mark_written(cq, written);
! 76: *p_max_bytes -= written;
1.1 misho 77: }
78:
1.1.1.3 ! misho 79: return (r >= 0 && written == toSend) ? 0 : -3;
1.1 misho 80: }
81:
1.1.1.3 ! misho 82: #endif /* USE_FREEBSD_SENDFILE */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>