Annotation of embedaddon/lighttpd/src/network_write.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: 
                      5: #include "network.h"
                      6: #include "log.h"
                      7: 
                      8: #include "sys-socket.h"
                      9: 
                     10: #include <unistd.h>
                     11: 
1.1.1.3 ! misho      12: #include <errno.h>
        !            13: #include <string.h>
1.1       misho      14: 
1.1.1.3 ! misho      15: int network_write_mem_chunk(server *srv, connection *con, int fd, chunkqueue *cq, off_t *p_max_bytes) {
        !            16:        chunk* const c = cq->first;
        !            17:        off_t c_len;
        !            18:        ssize_t r;
        !            19:        UNUSED(con);
        !            20: 
        !            21:        force_assert(NULL != c);
        !            22:        force_assert(MEM_CHUNK == c->type);
        !            23:        force_assert(c->offset >= 0 && c->offset <= (off_t)buffer_string_length(c->mem));
        !            24: 
        !            25:        c_len = buffer_string_length(c->mem) - c->offset;
        !            26:        if (c_len > *p_max_bytes) c_len = *p_max_bytes;
        !            27: 
        !            28:        if (0 == c_len) {
        !            29:                chunkqueue_remove_finished_chunks(cq);
        !            30:                return 0;
        !            31:        }
1.1       misho      32: 
1.1.1.3 ! misho      33: #if defined(__WIN32)
        !            34:        if ((r = send(fd, c->mem->ptr + c->offset, c_len, 0)) < 0) {
        !            35:                int lastError = WSAGetLastError();
        !            36:                switch (lastError) {
        !            37:                case WSAEINTR:
        !            38:                case WSAEWOULDBLOCK:
1.1       misho      39:                        break;
1.1.1.3 ! misho      40:                case WSAECONNRESET:
        !            41:                case WSAETIMEDOUT:
        !            42:                case WSAECONNABORTED:
        !            43:                        return -2;
        !            44:                default:
        !            45:                        log_error_write(srv, __FILE__, __LINE__, "sdd",
        !            46:                                "send failed: ", lastError, fd);
        !            47:                        return -1;
1.1       misho      48:                }
1.1.1.3 ! misho      49:        }
1.1       misho      50: #else /* __WIN32 */
1.1.1.3 ! misho      51:        if ((r = write(fd, c->mem->ptr + c->offset, c_len)) < 0) {
        !            52:                switch (errno) {
        !            53:                case EAGAIN:
        !            54:                case EINTR:
1.1       misho      55:                        break;
1.1.1.3 ! misho      56:                case EPIPE:
        !            57:                case ECONNRESET:
        !            58:                        return -2;
1.1       misho      59:                default:
1.1.1.3 ! misho      60:                        log_error_write(srv, __FILE__, __LINE__, "ssd",
        !            61:                                "write failed:", strerror(errno), fd);
1.1       misho      62:                        return -1;
                     63:                }
1.1.1.3 ! misho      64:        }
        !            65: #endif /* __WIN32 */
1.1       misho      66: 
1.1.1.3 ! misho      67:        if (r >= 0) {
        !            68:                *p_max_bytes -= r;
        !            69:                chunkqueue_mark_written(cq, r);
        !            70:        }
1.1       misho      71: 
1.1.1.3 ! misho      72:        return (r > 0 && r == c_len) ? 0 : -3;
        !            73: }
        !            74: 
        !            75: int network_write_chunkqueue_write(server *srv, connection *con, int fd, chunkqueue *cq, off_t max_bytes) {
        !            76:        while (max_bytes > 0 && NULL != cq->first) {
        !            77:                int r = -1;
        !            78: 
        !            79:                switch (cq->first->type) {
        !            80:                case MEM_CHUNK:
        !            81:                        r = network_write_mem_chunk(srv, con, fd, cq, &max_bytes);
        !            82:                        break;
        !            83:                case FILE_CHUNK:
        !            84:                        r = network_write_file_chunk_mmap(srv, con, fd, cq, &max_bytes);
1.1       misho      85:                        break;
                     86:                }
1.1.1.3 ! misho      87: 
        !            88:                if (-3 == r) return 0;
        !            89:                if (0 != r) return r;
1.1       misho      90:        }
                     91: 
                     92:        return 0;
                     93: }
                     94: 
1.1.1.3 ! misho      95: #if defined(USE_SENDFILE)
        !            96: int network_write_chunkqueue_sendfile(server *srv, connection *con, int fd, chunkqueue *cq, off_t max_bytes) {
        !            97:        while (max_bytes > 0 && NULL != cq->first) {
        !            98:                int r = -1;
        !            99: 
        !           100:                switch (cq->first->type) {
        !           101:                case MEM_CHUNK:
        !           102:                        r = network_writev_mem_chunks(srv, con, fd, cq, &max_bytes);
        !           103:                        break;
        !           104:                case FILE_CHUNK:
        !           105:                        r = network_write_file_chunk_sendfile(srv, con, fd, cq, &max_bytes);
        !           106:                        break;
        !           107:                }
        !           108: 
        !           109:                if (-3 == r) return 0;
        !           110:                if (0 != r) return r;
        !           111:        }
        !           112: 
        !           113:        return 0;
1.1       misho     114: }
                    115: #endif

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>