Annotation of embedaddon/lighttpd/src/fdevent.c, revision 1.1
1.1 ! misho 1: #include "base.h"
! 2: #include "log.h"
! 3:
! 4: #include <sys/types.h>
! 5:
! 6: #include <unistd.h>
! 7: #include <stdlib.h>
! 8: #include <string.h>
! 9: #include <errno.h>
! 10: #include <stdio.h>
! 11: #include <fcntl.h>
! 12: #include <assert.h>
! 13:
! 14:
! 15: fdevents *fdevent_init(server *srv, size_t maxfds, fdevent_handler_t type) {
! 16: fdevents *ev;
! 17:
! 18: ev = calloc(1, sizeof(*ev));
! 19: ev->srv = srv;
! 20: ev->fdarray = calloc(maxfds, sizeof(*ev->fdarray));
! 21: ev->maxfds = maxfds;
! 22:
! 23: switch(type) {
! 24: case FDEVENT_HANDLER_POLL:
! 25: if (0 != fdevent_poll_init(ev)) {
! 26: log_error_write(ev->srv, __FILE__, __LINE__, "S",
! 27: "event-handler poll failed");
! 28:
! 29: return NULL;
! 30: }
! 31: return ev;
! 32: case FDEVENT_HANDLER_SELECT:
! 33: if (0 != fdevent_select_init(ev)) {
! 34: log_error_write(ev->srv, __FILE__, __LINE__, "S",
! 35: "event-handler select failed");
! 36: return NULL;
! 37: }
! 38: return ev;
! 39: case FDEVENT_HANDLER_LINUX_SYSEPOLL:
! 40: if (0 != fdevent_linux_sysepoll_init(ev)) {
! 41: log_error_write(ev->srv, __FILE__, __LINE__, "S",
! 42: "event-handler linux-sysepoll failed, try to set server.event-handler = \"poll\" or \"select\"");
! 43: return NULL;
! 44: }
! 45: return ev;
! 46: case FDEVENT_HANDLER_SOLARIS_DEVPOLL:
! 47: if (0 != fdevent_solaris_devpoll_init(ev)) {
! 48: log_error_write(ev->srv, __FILE__, __LINE__, "S",
! 49: "event-handler solaris-devpoll failed, try to set server.event-handler = \"poll\" or \"select\"");
! 50: return NULL;
! 51: }
! 52: return ev;
! 53: case FDEVENT_HANDLER_SOLARIS_PORT:
! 54: if (0 != fdevent_solaris_port_init(ev)) {
! 55: log_error_write(ev->srv, __FILE__, __LINE__, "S",
! 56: "event-handler solaris-eventports failed, try to set server.event-handler = \"poll\" or \"select\"");
! 57: return NULL;
! 58: }
! 59: return ev;
! 60: case FDEVENT_HANDLER_FREEBSD_KQUEUE:
! 61: if (0 != fdevent_freebsd_kqueue_init(ev)) {
! 62: log_error_write(ev->srv, __FILE__, __LINE__, "S",
! 63: "event-handler freebsd-kqueue failed, try to set server.event-handler = \"poll\" or \"select\"");
! 64: return NULL;
! 65: }
! 66: return ev;
! 67: case FDEVENT_HANDLER_LIBEV:
! 68: if (0 != fdevent_libev_init(ev)) {
! 69: log_error_write(ev->srv, __FILE__, __LINE__, "S",
! 70: "event-handler libev failed, try to set server.event-handler = \"poll\" or \"select\"");
! 71: return NULL;
! 72: }
! 73: return ev;
! 74: case FDEVENT_HANDLER_UNSET:
! 75: break;
! 76: }
! 77:
! 78: log_error_write(ev->srv, __FILE__, __LINE__, "S",
! 79: "event-handler is unknown, try to set server.event-handler = \"poll\" or \"select\"");
! 80: return NULL;
! 81: }
! 82:
! 83: void fdevent_free(fdevents *ev) {
! 84: size_t i;
! 85: if (!ev) return;
! 86:
! 87: if (ev->free) ev->free(ev);
! 88:
! 89: for (i = 0; i < ev->maxfds; i++) {
! 90: if (ev->fdarray[i]) free(ev->fdarray[i]);
! 91: }
! 92:
! 93: free(ev->fdarray);
! 94: free(ev);
! 95: }
! 96:
! 97: int fdevent_reset(fdevents *ev) {
! 98: if (ev->reset) return ev->reset(ev);
! 99:
! 100: return 0;
! 101: }
! 102:
! 103: static fdnode *fdnode_init(void) {
! 104: fdnode *fdn;
! 105:
! 106: fdn = calloc(1, sizeof(*fdn));
! 107: fdn->fd = -1;
! 108: return fdn;
! 109: }
! 110:
! 111: static void fdnode_free(fdnode *fdn) {
! 112: free(fdn);
! 113: }
! 114:
! 115: int fdevent_register(fdevents *ev, int fd, fdevent_handler handler, void *ctx) {
! 116: fdnode *fdn;
! 117:
! 118: fdn = fdnode_init();
! 119: fdn->handler = handler;
! 120: fdn->fd = fd;
! 121: fdn->ctx = ctx;
! 122: fdn->handler_ctx = NULL;
! 123: fdn->events = 0;
! 124:
! 125: ev->fdarray[fd] = fdn;
! 126:
! 127: return 0;
! 128: }
! 129:
! 130: int fdevent_unregister(fdevents *ev, int fd) {
! 131: fdnode *fdn;
! 132:
! 133: if (!ev) return 0;
! 134: fdn = ev->fdarray[fd];
! 135:
! 136: assert(fdn->events == 0);
! 137:
! 138: fdnode_free(fdn);
! 139:
! 140: ev->fdarray[fd] = NULL;
! 141:
! 142: return 0;
! 143: }
! 144:
! 145: int fdevent_event_del(fdevents *ev, int *fde_ndx, int fd) {
! 146: int fde = fde_ndx ? *fde_ndx : -1;
! 147:
! 148: if (NULL == ev->fdarray[fd]) return 0;
! 149:
! 150: if (ev->event_del) fde = ev->event_del(ev, fde, fd);
! 151: ev->fdarray[fd]->events = 0;
! 152:
! 153: if (fde_ndx) *fde_ndx = fde;
! 154:
! 155: return 0;
! 156: }
! 157:
! 158: int fdevent_event_set(fdevents *ev, int *fde_ndx, int fd, int events) {
! 159: int fde = fde_ndx ? *fde_ndx : -1;
! 160:
! 161: if (ev->event_set) fde = ev->event_set(ev, fde, fd, events);
! 162: ev->fdarray[fd]->events = events;
! 163:
! 164: if (fde_ndx) *fde_ndx = fde;
! 165:
! 166: return 0;
! 167: }
! 168:
! 169: int fdevent_poll(fdevents *ev, int timeout_ms) {
! 170: if (ev->poll == NULL) SEGFAULT();
! 171: return ev->poll(ev, timeout_ms);
! 172: }
! 173:
! 174: int fdevent_event_get_revent(fdevents *ev, size_t ndx) {
! 175: if (ev->event_get_revent == NULL) SEGFAULT();
! 176:
! 177: return ev->event_get_revent(ev, ndx);
! 178: }
! 179:
! 180: int fdevent_event_get_fd(fdevents *ev, size_t ndx) {
! 181: if (ev->event_get_fd == NULL) SEGFAULT();
! 182:
! 183: return ev->event_get_fd(ev, ndx);
! 184: }
! 185:
! 186: fdevent_handler fdevent_get_handler(fdevents *ev, int fd) {
! 187: if (ev->fdarray[fd] == NULL) SEGFAULT();
! 188: if (ev->fdarray[fd]->fd != fd) SEGFAULT();
! 189:
! 190: return ev->fdarray[fd]->handler;
! 191: }
! 192:
! 193: void * fdevent_get_context(fdevents *ev, int fd) {
! 194: if (ev->fdarray[fd] == NULL) SEGFAULT();
! 195: if (ev->fdarray[fd]->fd != fd) SEGFAULT();
! 196:
! 197: return ev->fdarray[fd]->ctx;
! 198: }
! 199:
! 200: int fdevent_fcntl_set(fdevents *ev, int fd) {
! 201: #ifdef FD_CLOEXEC
! 202: /* close fd on exec (cgi) */
! 203: fcntl(fd, F_SETFD, FD_CLOEXEC);
! 204: #endif
! 205: if ((ev) && (ev->fcntl_set)) return ev->fcntl_set(ev, fd);
! 206: #ifdef O_NONBLOCK
! 207: return fcntl(fd, F_SETFL, O_NONBLOCK | O_RDWR);
! 208: #else
! 209: return 0;
! 210: #endif
! 211: }
! 212:
! 213:
! 214: int fdevent_event_next_fdndx(fdevents *ev, int ndx) {
! 215: if (ev->event_next_fdndx) return ev->event_next_fdndx(ev, ndx);
! 216:
! 217: return -1;
! 218: }
! 219:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>