#ifndef _LIGHTTPD_NETWORK_H_ #define _LIGHTTPD_NETWORK_H_ #ifndef _LIGHTTPD_BASE_H_ #error Please include instead of this file #endif #if defined(USE_LINUX_SENDFILE) || defined(USE_FREEBSD_SENDFILE) || defined(USE_SOLARIS_SENDFILEV) || defined(USE_OSX_SENDFILE) # define USE_SENDFILE #endif typedef enum { NETWORK_STATUS_SUCCESS, /**< some IO was actually done (read/write) or cq was empty for write */ NETWORK_STATUS_FATAL_ERROR, NETWORK_STATUS_CONNECTION_CLOSE, NETWORK_STATUS_WAIT_FOR_EVENT, /**< read/write returned -1 with errno=EAGAIN/EWOULDBLOCK; no real IO was done internal: some io may be done */ NETWORK_STATUS_WAIT_FOR_AIO_EVENT /**< nothing done yet, read/write will be done somewhere else */ } network_status_t; /** repeats write after EINTR */ LI_API ssize_t net_write(int fd, void *buf, ssize_t nbyte); /** repeats read after EINTR */ LI_API ssize_t net_read(int fd, void *buf, ssize_t nbyte); LI_API network_status_t network_write(vrequest *vr, int fd, chunkqueue *cq, goffset write_max); LI_API network_status_t network_read(vrequest *vr, int fd, chunkqueue *cq); /* use writev for mem chunks, buffered read/write for files */ LI_API network_status_t network_write_writev(vrequest *vr, int fd, chunkqueue *cq, goffset *write_max); #ifdef USE_SENDFILE /* use sendfile for files, writev for mem chunks */ LI_API network_status_t network_write_sendfile(vrequest *vr, int fd, chunkqueue *cq, goffset *write_max); #endif /* write backends */ LI_API network_status_t network_backend_write(vrequest *vr, int fd, chunkqueue *cq, goffset *write_max); LI_API network_status_t network_backend_writev(vrequest *vr, int fd, chunkqueue *cq, goffset *write_max); #define NETWORK_FALLBACK(f, write_max) do { \ network_status_t res; \ switch(res = f(vr, fd, cq, write_max)) { \ case NETWORK_STATUS_SUCCESS: \ break; \ default: \ return res; \ } \ } while(0) #endif