Annotation of embedaddon/sudo/include/sudo_event.h, revision 1.1
1.1 ! misho 1: /*
! 2: * Copyright (c) 2013 Todd C. Miller <Todd.Miller@courtesan.com>
! 3: *
! 4: * Permission to use, copy, modify, and distribute this software for any
! 5: * purpose with or without fee is hereby granted, provided that the above
! 6: * copyright notice and this permission notice appear in all copies.
! 7: *
! 8: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
! 9: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
! 10: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
! 11: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
! 12: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
! 13: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
! 14: * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
! 15: */
! 16:
! 17: #ifndef _SUDO_EVENT_H
! 18: #define _SUDO_EVENT_H
! 19:
! 20: #include "queue.h"
! 21:
! 22: /* Event types */
! 23: #define SUDO_EV_TIMEOUT 0x01 /* fire after timeout */
! 24: #define SUDO_EV_READ 0x02 /* fire when readable */
! 25: #define SUDO_EV_WRITE 0x04 /* fire when writable */
! 26: #define SUDO_EV_PERSIST 0x08 /* persist until deleted */
! 27:
! 28: /* Event flags (internal) */
! 29: #define SUDO_EVQ_INSERTED 0x01 /* event is on the event queue */
! 30: #define SUDO_EVQ_ACTIVE 0x02 /* event is on the active queue */
! 31: #define SUDO_EVQ_TIMEOUTS 0x04 /* event is on the timeouts queue */
! 32:
! 33: /* Event loop flags */
! 34: #define SUDO_EVLOOP_ONCE 0x01 /* Only run once through the loop */
! 35: #define SUDO_EVLOOP_NONBLOCK 0x02 /* Do not block in event loop */
! 36:
! 37: /* Event base flags (internal) */
! 38: #define SUDO_EVBASE_LOOPEXIT 0x01
! 39: #define SUDO_EVBASE_LOOPBREAK 0x02
! 40: #define SUDO_EVBASE_LOOPCONT 0x04
! 41: #define SUDO_EVBASE_GOT_EXIT 0x10
! 42: #define SUDO_EVBASE_GOT_BREAK 0x20
! 43: #define SUDO_EVBASE_GOT_MASK 0xf0
! 44:
! 45: typedef void (*sudo_ev_callback_t)(int fd, int what, void *closure);
! 46:
! 47: /* Member of struct sudo_event_base. */
! 48: struct sudo_event {
! 49: TAILQ_ENTRY(sudo_event) entries;
! 50: TAILQ_ENTRY(sudo_event) active_entries;
! 51: TAILQ_ENTRY(sudo_event) timeouts_entries;
! 52: struct sudo_event_base *base; /* base this event belongs to */
! 53: int fd; /* fd we are interested in */
! 54: short events; /* SUDO_EV_* flags (in) */
! 55: short revents; /* SUDO_EV_* flags (out) */
! 56: short flags; /* internal event flags */
! 57: short pfd_idx; /* index into pfds array (XXX) */
! 58: sudo_ev_callback_t callback;/* user-provided callback */
! 59: struct timeval timeout; /* for SUDO_EV_TIMEOUT */
! 60: void *closure; /* user-provided data pointer */
! 61: };
! 62:
! 63: TAILQ_HEAD(sudo_event_list, sudo_event);
! 64:
! 65: struct sudo_event_base {
! 66: struct sudo_event_list events; /* tail queue of all events */
! 67: struct sudo_event_list active; /* tail queue of active events */
! 68: struct sudo_event_list timeouts; /* tail queue of timeout events */
! 69: #ifdef HAVE_POLL
! 70: struct pollfd *pfds; /* array of struct pollfd */
! 71: int pfd_max; /* size of the pfds array */
! 72: int pfd_high; /* highest slot used */
! 73: int pfd_free; /* idx of next free entry or pfd_max if full */
! 74: #else
! 75: fd_set *readfds_in; /* read I/O descriptor set (in) */
! 76: fd_set *writefds_in; /* write I/O descriptor set (in) */
! 77: fd_set *readfds_out; /* read I/O descriptor set (out) */
! 78: fd_set *writefds_out; /* write I/O descriptor set (out) */
! 79: int maxfd; /* max fd we can store in readfds/writefds */
! 80: int highfd; /* highest fd to pass as 1st arg to select */
! 81: #endif /* HAVE_POLL */
! 82: unsigned int flags; /* SUDO_EVBASE_* */
! 83: };
! 84:
! 85: /* Allocate a new event base. */
! 86: struct sudo_event_base *sudo_ev_base_alloc(void);
! 87:
! 88: /* Free an event base. */
! 89: void sudo_ev_base_free(struct sudo_event_base *base);
! 90:
! 91: /* Allocate a new event. */
! 92: struct sudo_event *sudo_ev_alloc(int fd, short events, sudo_ev_callback_t callback, void *closure);
! 93:
! 94: /* Free an event. */
! 95: void sudo_ev_free(struct sudo_event *ev);
! 96:
! 97: /* Add an event, returns 0 on success, -1 on error */
! 98: int sudo_ev_add(struct sudo_event_base *head, struct sudo_event *ev, struct timeval *timo, bool tohead);
! 99:
! 100: /* Delete an event, returns 0 on success, -1 on error */
! 101: int sudo_ev_del(struct sudo_event_base *head, struct sudo_event *ev);
! 102:
! 103: /* Main event loop, returns SUDO_CB_SUCCESS, SUDO_CB_BREAK or SUDO_CB_ERROR */
! 104: int sudo_ev_loop(struct sudo_event_base *head, int flags);
! 105:
! 106: /* Return the remaining timeout associated with an event. */
! 107: int sudo_ev_get_timeleft(struct sudo_event *ev, struct timeval *tv);
! 108:
! 109: /* Cause the event loop to exit after one run through. */
! 110: void sudo_ev_loopexit(struct sudo_event_base *base);
! 111:
! 112: /* Break out of the event loop right now. */
! 113: void sudo_ev_loopbreak(struct sudo_event_base *base);
! 114:
! 115: /* Rescan for events and restart the event loop. */
! 116: void sudo_ev_loopcontinue(struct sudo_event_base *base);
! 117:
! 118: /* Returns true if event loop stopped due to sudo_ev_loopexit(). */
! 119: bool sudo_ev_got_exit(struct sudo_event_base *base);
! 120:
! 121: /* Returns true if event loop stopped due to sudo_ev_loopbreak(). */
! 122: bool sudo_ev_got_break(struct sudo_event_base *base);
! 123:
! 124: /* Return the fd associated with an event. */
! 125: #define sudo_ev_get_fd(_ev) ((_ev) ? (_ev)->fd : -1)
! 126:
! 127: /* Return the (absolute) timeout associated with an event or NULL. */
! 128: #define sudo_ev_get_timeout(_ev) \
! 129: (ISSET((_ev)->flags, SUDO_EVQ_TIMEOUTS) ? &(_ev)->timeout : NULL)
! 130:
! 131: /* Return the base an event is associated with or NULL. */
! 132: #define sudo_ev_get_base(_ev) ((_ev) ? (_ev)->base : NULL)
! 133:
! 134: /* Magic pointer value to use self pointer as callback arg. */
! 135: #define sudo_ev_self_cbarg() ((void *)-1)
! 136:
! 137: /*
! 138: * Backend implementation.
! 139: */
! 140: int sudo_ev_base_alloc_impl(struct sudo_event_base *base);
! 141: void sudo_ev_base_free_impl(struct sudo_event_base *base);
! 142: int sudo_ev_add_impl(struct sudo_event_base *base, struct sudo_event *ev);
! 143: int sudo_ev_del_impl(struct sudo_event_base *base, struct sudo_event *ev);
! 144: int sudo_ev_scan_impl(struct sudo_event_base *base, int flags);
! 145:
! 146: #endif /* _SUDO_EVENT_H */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>