1/* 2 * Copyright (c) 2009 Mark Heily <mark@heily.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#include <stdlib.h> 18 19#include "sys/event.h" 20#include "private.h" 21 22const struct filter evfilt_proc = EVFILT_NOTIMPL; 23 24int 25kevent_wait(struct kqueue *kq, const struct timespec *timeout) 26{ 27 int n; 28 29 dbg_puts("waiting for events"); 30 kq->kq_rfds = kq->kq_fds; 31 n = pselect(kq->kq_nfds, &kq->kq_rfds, NULL , NULL, timeout, NULL); 32 if (n < 0) { 33 if (errno == EINTR) { 34 dbg_puts("signal caught"); 35 return (-1); 36 } 37 dbg_perror("pselect(2)"); 38 return (-1); 39 } 40 41 return (n); 42} 43 44int 45kevent_copyout(struct kqueue *kq, int nready, 46 struct kevent *eventlist, int nevents) 47{ 48 struct filter *filt; 49 int i, rv, nret; 50 51 nret = 0; 52 for (i = 0; (i < EVFILT_SYSCOUNT && nready > 0 && nevents > 0); i++) { 53// dbg_printf("eventlist: n = %d nevents = %d", nready, nevents); 54 filt = &kq->kq_filt[i]; 55// dbg_printf("pfd[%d] = %d", i, filt->kf_pfd); 56 if (FD_ISSET(filt->kf_pfd, &kq->kq_rfds)) { 57 dbg_printf("pending events for filter %d (%s)", filt->kf_id, filter_name(filt->kf_id)); 58 rv = filt->kf_copyout(filt, eventlist, nevents); 59 if (rv < 0) { 60 dbg_puts("kevent_copyout failed"); 61 nret = -1; 62 break; 63 } 64 nret += rv; 65 eventlist += rv; 66 nevents -= rv; 67 nready--; 68 } 69 } 70 71 return (nret); 72} 73