5 #include "base_decls.h"
7 struct fdevents
; /* declaration */
8 typedef struct fdevents fdevents
;
10 typedef handler_t (*fdevent_handler
)(struct server
*srv
, void *ctx
, int revents
);
12 /* these are the POLL* values from <bits/poll.h> (linux poll)
15 #define FDEVENT_IN 0x0001
16 #define FDEVENT_PRI 0x0002
17 #define FDEVENT_OUT 0x0004
18 #define FDEVENT_ERR 0x0008
19 #define FDEVENT_HUP 0x0010
20 #define FDEVENT_NVAL 0x0020
21 #if defined(__sun) && defined(__SVR4) /* Solaris */
22 #define FDEVENT_RDHUP 0x4000
24 #define FDEVENT_RDHUP 0x2000
27 #define FDEVENT_STREAM_REQUEST BV(0)
28 #define FDEVENT_STREAM_REQUEST_BUFMIN BV(1)
29 #define FDEVENT_STREAM_REQUEST_POLLRDHUP BV(12)
30 #define FDEVENT_STREAM_REQUEST_TCP_FIN BV(13)
31 #define FDEVENT_STREAM_REQUEST_BACKEND_SHUT_WR BV(14)
32 #define FDEVENT_STREAM_REQUEST_POLLIN BV(15)
34 #define FDEVENT_STREAM_RESPONSE BV(0)
35 #define FDEVENT_STREAM_RESPONSE_BUFMIN BV(1)
36 #define FDEVENT_STREAM_RESPONSE_POLLRDHUP BV(15)
39 int fdevent_config(server
*srv
);
42 const char * fdevent_show_event_handlers(void);
45 fdevents
*fdevent_init(struct server
*srv
);
48 int fdevent_reset(fdevents
*ev
); /* "init" after fork() */
51 void fdevent_free(fdevents
*ev
);
53 int fdevent_event_get_interest(const fdevents
*ev
, int fd
);
54 void fdevent_event_set(fdevents
*ev
, int fd
, int events
);/* events can be FDEVENT_IN, FDEVENT_OUT or FDEVENT_IN | FDEVENT_OUT */
55 void fdevent_event_add(fdevents
*ev
, int fd
, int event
); /* event can be FDEVENT_IN or FDEVENT_OUT */
56 void fdevent_event_clr(fdevents
*ev
, int fd
, int event
); /* event can be FDEVENT_IN or FDEVENT_OUT */
57 void fdevent_event_del(fdevents
*ev
, int fd
);
59 int fdevent_poll(fdevents
*ev
, int timeout_ms
);
61 void fdevent_register(fdevents
*ev
, int fd
, fdevent_handler handler
, void *ctx
);
62 void fdevent_unregister(fdevents
*ev
, int fd
);
63 void fdevent_sched_close(fdevents
*ev
, int fd
, int issock
);
65 void fdevent_setfd_cloexec(int fd
);
66 void fdevent_clrfd_cloexec(int fd
);
67 int fdevent_fcntl_set_nb(fdevents
*ev
, int fd
);
68 int fdevent_fcntl_set_nb_cloexec(fdevents
*ev
, int fd
);
69 int fdevent_fcntl_set_nb_cloexec_sock(fdevents
*ev
, int fd
);
70 int fdevent_socket_cloexec(int domain
, int type
, int protocol
);
71 int fdevent_socket_nb_cloexec(int domain
, int type
, int protocol
);
72 int fdevent_open_cloexec(const char *pathname
, int flags
, mode_t mode
);
75 int fdevent_accept_listenfd(int listenfd
, struct sockaddr
*addr
, size_t *addrlen
);
77 char ** fdevent_environ(void);
78 int fdevent_open_devnull(void);
79 int fdevent_open_dirname(char *path
);
80 int fdevent_set_stdin_stdout_stderr(int fdin
, int fdout
, int fderr
);
81 pid_t
fdevent_fork_execve(const char *name
, char *argv
[], char *envp
[], int fdin
, int fdout
, int fderr
, int dfd
);
82 int fdevent_open_logger(const char *logger
);
83 int fdevent_cycle_logger(const char *logger
, int *curfd
);
84 int fdevent_reaped_logger_pipe(pid_t pid
);
85 int fdevent_waitpid_logger_pipe_pid(pid_t pid
, time_t ts
);
86 void fdevent_restart_logger_pipes(time_t ts
);
87 void fdevent_close_logger_pipes(void);
88 void fdevent_breakagelog_logger_pipe(int fd
);
89 void fdevent_clr_logger_pipe_pids(void);
91 ssize_t
fdevent_socket_read_discard (int fd
, char *buf
, size_t sz
, int family
, int so_type
);
93 int fdevent_ioctl_fionread (int fd
, int fdfmt
, int *toread
);
95 int fdevent_connect_status(int fd
);
97 /* fd must be TCP socket (AF_INET, AF_INET6), end-of-stream recv() 0 bytes */
98 int fdevent_is_tcp_half_closed(int fd
);
99 int fdevent_set_tcp_nodelay (const int fd
, const int opt
);
101 int fdevent_set_so_reuseaddr (const int fd
, const int opt
);