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