2005-02-20 14:27:00 +00:00
|
|
|
#ifndef _FDEVENT_H_
|
|
|
|
#define _FDEVENT_H_
|
2016-03-19 15:14:35 +00:00
|
|
|
#include "first.h"
|
2009-10-11 14:31:42 +00:00
|
|
|
|
2005-02-20 14:27:00 +00:00
|
|
|
#include "settings.h"
|
|
|
|
|
2009-10-11 14:48:08 +00:00
|
|
|
#if defined HAVE_STDINT_H
|
|
|
|
# include <stdint.h>
|
|
|
|
#elif defined HAVE_INTTYPES_H
|
|
|
|
# include <inttypes.h>
|
|
|
|
#endif
|
|
|
|
|
2009-10-11 14:54:33 +00:00
|
|
|
#include <sys/types.h>
|
|
|
|
|
2005-02-20 14:27:00 +00:00
|
|
|
/* select event-system */
|
|
|
|
|
|
|
|
#if defined(HAVE_EPOLL_CTL) && defined(HAVE_SYS_EPOLL_H)
|
|
|
|
# define USE_LINUX_EPOLL
|
2016-06-30 01:12:21 +00:00
|
|
|
struct epoll_event; /* declaration */
|
2005-02-20 14:27:00 +00:00
|
|
|
#endif
|
|
|
|
|
2006-10-04 13:26:23 +00:00
|
|
|
/* MacOS 10.3.x has poll.h under /usr/include/, all other unixes
|
2005-02-20 14:27:00 +00:00
|
|
|
* under /usr/include/sys/ */
|
|
|
|
#if defined HAVE_POLL && (defined(HAVE_SYS_POLL_H) || defined(HAVE_POLL_H))
|
|
|
|
# define USE_POLL
|
2016-06-30 01:12:21 +00:00
|
|
|
struct pollfd; /* declaration */
|
2005-02-20 14:27:00 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#if defined HAVE_SELECT
|
|
|
|
# ifdef __WIN32
|
|
|
|
# include <winsock2.h>
|
|
|
|
# endif
|
|
|
|
# define USE_SELECT
|
2005-09-20 15:57:48 +00:00
|
|
|
# ifdef HAVE_SYS_SELECT_H
|
|
|
|
# include <sys/select.h>
|
|
|
|
# endif
|
2005-02-20 14:27:00 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#if defined HAVE_SYS_DEVPOLL_H && defined(__sun)
|
|
|
|
# define USE_SOLARIS_DEVPOLL
|
2016-06-30 01:12:21 +00:00
|
|
|
struct pollfd; /* declaration */
|
2005-02-20 14:27:00 +00:00
|
|
|
#endif
|
|
|
|
|
2011-06-13 17:34:57 +00:00
|
|
|
#if defined HAVE_PORT_H && defined HAVE_PORT_CREATE && defined(__sun)
|
|
|
|
# define USE_SOLARIS_PORT
|
|
|
|
# include <port.h>
|
|
|
|
#endif
|
|
|
|
|
2005-02-20 14:27:00 +00:00
|
|
|
#if defined HAVE_SYS_EVENT_H && defined HAVE_KQUEUE
|
|
|
|
# define USE_FREEBSD_KQUEUE
|
2016-06-30 01:12:21 +00:00
|
|
|
struct kevent; /* declaration */
|
2005-02-20 14:27:00 +00:00
|
|
|
#endif
|
|
|
|
|
2010-08-07 10:46:34 +00:00
|
|
|
#if defined HAVE_LIBEV
|
|
|
|
# define USE_LIBEV
|
2016-06-30 01:12:21 +00:00
|
|
|
struct ev_loop; /* declaration */
|
2010-08-07 10:46:34 +00:00
|
|
|
#endif
|
|
|
|
|
2016-06-30 01:12:21 +00:00
|
|
|
struct server; /* declaration */
|
2010-08-06 21:57:15 +00:00
|
|
|
|
|
|
|
typedef handler_t (*fdevent_handler)(struct server *srv, void *ctx, int revents);
|
2005-02-20 14:27:00 +00:00
|
|
|
|
2010-08-06 21:57:15 +00:00
|
|
|
/* these are the POLL* values from <bits/poll.h> (linux poll)
|
|
|
|
*/
|
2005-02-20 14:27:00 +00:00
|
|
|
|
|
|
|
#define FDEVENT_IN BV(0)
|
|
|
|
#define FDEVENT_PRI BV(1)
|
|
|
|
#define FDEVENT_OUT BV(2)
|
|
|
|
#define FDEVENT_ERR BV(3)
|
|
|
|
#define FDEVENT_HUP BV(4)
|
|
|
|
#define FDEVENT_NVAL BV(5)
|
|
|
|
|
2016-06-04 14:56:06 +00:00
|
|
|
#define FDEVENT_STREAM_REQUEST BV(0)
|
|
|
|
#define FDEVENT_STREAM_REQUEST_BUFMIN BV(1)
|
|
|
|
#define FDEVENT_STREAM_REQUEST_POLLIN BV(15)
|
|
|
|
|
|
|
|
#define FDEVENT_STREAM_RESPONSE BV(0)
|
|
|
|
#define FDEVENT_STREAM_RESPONSE_BUFMIN BV(1)
|
|
|
|
|
2006-10-04 13:26:23 +00:00
|
|
|
typedef enum { FD_EVENT_TYPE_UNSET = -1,
|
|
|
|
FD_EVENT_TYPE_CONNECTION,
|
|
|
|
FD_EVENT_TYPE_FCGI_CONNECTION,
|
|
|
|
FD_EVENT_TYPE_DIRWATCH,
|
|
|
|
FD_EVENT_TYPE_CGI_CONNECTION
|
2005-02-20 14:27:00 +00:00
|
|
|
} fd_event_t;
|
|
|
|
|
2006-10-04 13:26:23 +00:00
|
|
|
typedef enum { FDEVENT_HANDLER_UNSET,
|
2005-02-20 14:27:00 +00:00
|
|
|
FDEVENT_HANDLER_SELECT,
|
|
|
|
FDEVENT_HANDLER_POLL,
|
|
|
|
FDEVENT_HANDLER_LINUX_SYSEPOLL,
|
|
|
|
FDEVENT_HANDLER_SOLARIS_DEVPOLL,
|
2011-06-13 17:34:57 +00:00
|
|
|
FDEVENT_HANDLER_SOLARIS_PORT,
|
2005-02-20 14:27:00 +00:00
|
|
|
FDEVENT_HANDLER_FREEBSD_KQUEUE,
|
2010-08-07 10:46:34 +00:00
|
|
|
FDEVENT_HANDLER_LIBEV
|
2005-02-20 14:27:00 +00:00
|
|
|
} fdevent_handler_t;
|
|
|
|
|
|
|
|
|
2005-09-29 13:03:39 +00:00
|
|
|
typedef struct _fdnode {
|
2005-02-20 14:27:00 +00:00
|
|
|
fdevent_handler handler;
|
|
|
|
void *ctx;
|
2010-08-07 10:46:34 +00:00
|
|
|
void *handler_ctx;
|
2005-02-20 14:27:00 +00:00
|
|
|
int fd;
|
2010-08-17 09:54:42 +00:00
|
|
|
int events;
|
2005-02-20 14:27:00 +00:00
|
|
|
} fdnode;
|
|
|
|
|
2010-08-07 10:46:34 +00:00
|
|
|
/**
|
|
|
|
* array of unused fd's
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
2005-02-20 14:27:00 +00:00
|
|
|
typedef struct {
|
|
|
|
int *ptr;
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-02-20 14:27:00 +00:00
|
|
|
size_t used;
|
|
|
|
size_t size;
|
|
|
|
} buffer_int;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* fd-event handler for select(), poll() and rt-signals on Linux 2.4
|
2006-10-04 13:26:23 +00:00
|
|
|
*
|
2005-02-20 14:27:00 +00:00
|
|
|
*/
|
|
|
|
typedef struct fdevents {
|
2010-08-06 21:57:15 +00:00
|
|
|
struct server *srv;
|
2005-02-20 14:27:00 +00:00
|
|
|
fdevent_handler_t type;
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-02-20 14:27:00 +00:00
|
|
|
fdnode **fdarray;
|
|
|
|
size_t maxfds;
|
2016-08-24 19:30:11 +00:00
|
|
|
int highfd;
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-02-20 14:27:00 +00:00
|
|
|
#ifdef USE_LINUX_EPOLL
|
|
|
|
int epoll_fd;
|
|
|
|
struct epoll_event *epoll_events;
|
|
|
|
#endif
|
|
|
|
#ifdef USE_POLL
|
|
|
|
struct pollfd *pollfds;
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-02-20 14:27:00 +00:00
|
|
|
size_t size;
|
|
|
|
size_t used;
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-02-20 14:27:00 +00:00
|
|
|
buffer_int unused;
|
|
|
|
#endif
|
|
|
|
#ifdef USE_SELECT
|
|
|
|
fd_set select_read;
|
|
|
|
fd_set select_write;
|
|
|
|
fd_set select_error;
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-02-20 14:27:00 +00:00
|
|
|
fd_set select_set_read;
|
|
|
|
fd_set select_set_write;
|
|
|
|
fd_set select_set_error;
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-02-20 14:27:00 +00:00
|
|
|
int select_max_fd;
|
|
|
|
#endif
|
|
|
|
#ifdef USE_SOLARIS_DEVPOLL
|
|
|
|
int devpoll_fd;
|
|
|
|
struct pollfd *devpollfds;
|
|
|
|
#endif
|
2011-06-13 17:34:57 +00:00
|
|
|
#ifdef USE_SOLARIS_PORT
|
|
|
|
port_event_t *port_events;
|
|
|
|
#endif
|
2005-02-20 14:27:00 +00:00
|
|
|
#ifdef USE_FREEBSD_KQUEUE
|
|
|
|
int kq_fd;
|
|
|
|
struct kevent *kq_results;
|
|
|
|
#endif
|
|
|
|
#ifdef USE_SOLARIS_PORT
|
|
|
|
int port_fd;
|
2010-08-07 10:46:34 +00:00
|
|
|
#endif
|
|
|
|
#ifdef USE_LIBEV
|
|
|
|
struct ev_loop *libev_loop;
|
2005-02-20 14:27:00 +00:00
|
|
|
#endif
|
|
|
|
int (*reset)(struct fdevents *ev);
|
|
|
|
void (*free)(struct fdevents *ev);
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2010-08-17 09:54:42 +00:00
|
|
|
int (*event_set)(struct fdevents *ev, int fde_ndx, int fd, int events);
|
2005-02-20 14:27:00 +00:00
|
|
|
int (*event_del)(struct fdevents *ev, int fde_ndx, int fd);
|
|
|
|
int (*event_get_revent)(struct fdevents *ev, size_t ndx);
|
|
|
|
int (*event_get_fd)(struct fdevents *ev, size_t ndx);
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-02-20 14:27:00 +00:00
|
|
|
int (*event_next_fdndx)(struct fdevents *ev, int ndx);
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-02-20 14:27:00 +00:00
|
|
|
int (*poll)(struct fdevents *ev, int timeout_ms);
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-02-20 14:27:00 +00:00
|
|
|
int (*fcntl_set)(struct fdevents *ev, int fd);
|
|
|
|
} fdevents;
|
|
|
|
|
2010-08-06 21:57:15 +00:00
|
|
|
fdevents *fdevent_init(struct server *srv, size_t maxfds, fdevent_handler_t type);
|
|
|
|
int fdevent_reset(fdevents *ev); /* "init" after fork() */
|
2005-02-20 14:27:00 +00:00
|
|
|
void fdevent_free(fdevents *ev);
|
|
|
|
|
2016-06-04 14:56:06 +00:00
|
|
|
#define fdevent_event_get_interest(ev, fd) \
|
2016-06-21 07:39:17 +00:00
|
|
|
((fd) >= 0 ? (ev)->fdarray[(fd)]->events : 0)
|
2016-04-11 03:20:54 +00:00
|
|
|
void fdevent_event_set(fdevents *ev, int *fde_ndx, int fd, int events); /* events can be FDEVENT_IN, FDEVENT_OUT or FDEVENT_IN | FDEVENT_OUT */
|
[core] option to stream response body to client (fixes #949, #760, #1283, #1387)
Set server.stream-response-body = 1 or server.stream-response-body = 2
to have lighttpd stream response body to client as it arrives from the
backend (CGI, FastCGI, SCGI, proxy).
default: buffer entire response body before sending response to client.
(This preserves existing behavior for now, but may in the future be
changed to stream response to client, which is the behavior more
commonly expected.)
x-ref:
"fastcgi, cgi, flush, php5 problem."
https://redmine.lighttpd.net/issues/949
"Random crashing on FreeBSD 6.1"
https://redmine.lighttpd.net/issues/760
"Memory usage increases when proxy+ssl+large file"
https://redmine.lighttpd.net/issues/1283
"lighttpd+fastcgi memory problem"
https://redmine.lighttpd.net/issues/1387
2016-06-11 15:04:01 +00:00
|
|
|
void fdevent_event_add(fdevents *ev, int *fde_ndx, int fd, int event); /* events can be FDEVENT_IN or FDEVENT_OUT */
|
|
|
|
void fdevent_event_clr(fdevents *ev, int *fde_ndx, int fd, int event); /* events can be FDEVENT_IN or FDEVENT_OUT */
|
2016-04-11 03:20:54 +00:00
|
|
|
void fdevent_event_del(fdevents *ev, int *fde_ndx, int fd);
|
2005-02-20 14:27:00 +00:00
|
|
|
int fdevent_event_get_revent(fdevents *ev, size_t ndx);
|
|
|
|
int fdevent_event_get_fd(fdevents *ev, size_t ndx);
|
|
|
|
fdevent_handler fdevent_get_handler(fdevents *ev, int fd);
|
|
|
|
void * fdevent_get_context(fdevents *ev, int fd);
|
|
|
|
|
|
|
|
int fdevent_event_next_fdndx(fdevents *ev, int ndx);
|
|
|
|
|
|
|
|
int fdevent_poll(fdevents *ev, int timeout_ms);
|
|
|
|
|
|
|
|
int fdevent_register(fdevents *ev, int fd, fdevent_handler handler, void *ctx);
|
|
|
|
int fdevent_unregister(fdevents *ev, int fd);
|
2016-08-24 19:30:11 +00:00
|
|
|
void fdevent_sched_close(fdevents *ev, int fd, int issock);
|
|
|
|
void fdevent_sched_run(struct server *srv, fdevents *ev);
|
2005-02-20 14:27:00 +00:00
|
|
|
|
2014-02-16 13:08:29 +00:00
|
|
|
void fd_close_on_exec(int fd);
|
2005-02-20 14:27:00 +00:00
|
|
|
int fdevent_fcntl_set(fdevents *ev, int fd);
|
|
|
|
|
|
|
|
int fdevent_select_init(fdevents *ev);
|
|
|
|
int fdevent_poll_init(fdevents *ev);
|
|
|
|
int fdevent_linux_sysepoll_init(fdevents *ev);
|
|
|
|
int fdevent_solaris_devpoll_init(fdevents *ev);
|
2011-06-13 17:34:57 +00:00
|
|
|
int fdevent_solaris_port_init(fdevents *ev);
|
2005-02-20 14:27:00 +00:00
|
|
|
int fdevent_freebsd_kqueue_init(fdevents *ev);
|
2010-08-07 10:46:34 +00:00
|
|
|
int fdevent_libev_init(fdevents *ev);
|
2005-02-20 14:27:00 +00:00
|
|
|
|
2016-08-06 08:11:16 +00:00
|
|
|
/* fd must be TCP socket (AF_INET, AF_INET6), end-of-stream recv() 0 bytes */
|
|
|
|
int fdevent_is_tcp_half_closed(int fd);
|
|
|
|
|
2005-02-20 14:27:00 +00:00
|
|
|
#endif
|