2 * Copyright (c) 2009 Mark Heily <mark@heily.com>
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.
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.
21 /* Checks if any events are pending, which is an error. */
23 test_no_kevents(int kqfd)
26 struct timespec timeo;
29 memset(&timeo, 0, sizeof(timeo));
30 nfds = kevent(kqfd, NULL, 0, &kev, 1, &timeo);
34 puts("\nUnexpected event:");
35 die(kevent_to_str(&kev));
39 /* Retrieve a single kevent */
44 static struct kevent __thread kev;
46 nfds = kevent(kqfd, NULL, 0, &kev, 1, NULL);
54 kevent_fflags_dump(struct kevent *kev)
58 #define KEVFFL_DUMP(attrib) \
59 if (kev->fflags & attrib) \
60 strncat(buf, #attrib" ", 64);
62 if ((buf = calloc(1, 1024)) == NULL)
65 /* Not every filter has meaningful fflags */
66 if (kev->filter != EVFILT_VNODE) {
67 snprintf(buf, 1024, "fflags = %d", kev->fflags);
71 snprintf(buf, 1024, "fflags = %d (", kev->fflags);
72 KEVFFL_DUMP(NOTE_DELETE);
73 KEVFFL_DUMP(NOTE_WRITE);
74 KEVFFL_DUMP(NOTE_EXTEND);
75 #if HAVE_NOTE_TRUNCATE
76 KEVFFL_DUMP(NOTE_TRUNCATE);
78 KEVFFL_DUMP(NOTE_ATTRIB);
79 KEVFFL_DUMP(NOTE_LINK);
80 KEVFFL_DUMP(NOTE_RENAME);
82 KEVFFL_DUMP(NOTE_REVOKE);
84 buf[strlen(buf) - 1] = ')';
90 kevent_flags_dump(struct kevent *kev)
94 #define KEVFL_DUMP(attrib) \
95 if (kev->flags & attrib) \
96 strncat(buf, #attrib" ", 64);
98 if ((buf = calloc(1, 1024)) == NULL)
101 snprintf(buf, 1024, "flags = %d (", kev->flags);
103 KEVFL_DUMP(EV_ENABLE);
104 KEVFL_DUMP(EV_DISABLE);
105 KEVFL_DUMP(EV_DELETE);
106 KEVFL_DUMP(EV_ONESHOT);
107 KEVFL_DUMP(EV_CLEAR);
109 KEVFL_DUMP(EV_ERROR);
111 KEVFL_DUMP(EV_DISPATCH);
114 KEVFL_DUMP(EV_RECEIPT);
116 buf[strlen(buf) - 1] = ')';
121 /* TODO - backport changes from src/common/kevent.c kevent_dump() */
123 kevent_to_str(struct kevent *kev)
127 snprintf(&buf[0], sizeof(buf),
128 "[ident=%d, filter=%d, %s, %s, data=%d, udata=%p]",
131 kevent_flags_dump(kev),
132 kevent_fflags_dump(kev),
136 return (strdup(buf));
140 kevent_update(int kqfd, struct kevent *kev)
142 if (kevent(kqfd, kev, 1, NULL, 0, NULL) < 0) {
143 printf("Unable to add the following kevent:\n%s\n",
150 kevent_add(int kqfd, struct kevent *kev,
158 EV_SET(kev, ident, filter, flags, fflags, data, NULL);
159 if (kevent(kqfd, kev, 1, NULL, 0, NULL) < 0) {
160 printf("Unable to add the following kevent:\n%s\n",
167 kevent_cmp(struct kevent *k1, struct kevent *k2)
170 Workaround for inconsistent implementation of kevent(2)
172 #if defined (__FreeBSD_kernel__) || defined (__FreeBSD__)
173 if (k1->flags & EV_ADD)
176 if (memcmp(k1, k2, sizeof(*k1)) != 0) {
177 printf("kevent_cmp: mismatch:\n expected %s\n but got %s\n",
178 kevent_to_str(k1), kevent_to_str(k2));