1200483Srwatson/*
2200483Srwatson * Copyright (c) 2009 Mark Heily <mark@heily.com>
3200483Srwatson *
4200483Srwatson * Permission to use, copy, modify, and distribute this software for any
5200483Srwatson * purpose with or without fee is hereby granted, provided that the above
6200483Srwatson * copyright notice and this permission notice appear in all copies.
7200483Srwatson *
8200483Srwatson * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9200483Srwatson * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10200483Srwatson * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11200483Srwatson * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12200483Srwatson * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13200483Srwatson * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14200483Srwatson * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15200483Srwatson *
16200483Srwatson * $FreeBSD: stable/11/tests/sys/kqueue/libkqueue/signal.c 359754 2020-04-09 20:38:36Z kevans $
17200483Srwatson */
18200483Srwatson
19200483Srwatson#include "common.h"
20200483Srwatson
21200483Srwatson
22200483Srwatsonvoid
23200483Srwatsontest_kevent_signal_add(void)
24200483Srwatson{
25200483Srwatson    const char *test_id = "kevent(EVFILT_SIGNAL, EV_ADD)";
26200483Srwatson    struct kevent kev;
27200483Srwatson
28200483Srwatson    test_begin(test_id);
29200483Srwatson
30200483Srwatson    EV_SET(&kev, SIGUSR1, EVFILT_SIGNAL, EV_ADD, 0, 0, NULL);
31200483Srwatson    if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)
32200483Srwatson        err(1, "%s", test_id);
33200483Srwatson
34200483Srwatson    success();
35200483Srwatson}
36200483Srwatson
37200483Srwatsonvoid
38200483Srwatsontest_kevent_signal_get(void)
39200483Srwatson{
40200483Srwatson    const char *test_id = "kevent(EVFILT_SIGNAL, wait)";
41200483Srwatson    struct kevent kev;
42200483Srwatson
43200483Srwatson    test_begin(test_id);
44200483Srwatson
45200483Srwatson    EV_SET(&kev, SIGUSR1, EVFILT_SIGNAL, EV_ADD, 0, 0, NULL);
46200483Srwatson    if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)
47200483Srwatson        err(1, "%s", test_id);
48200483Srwatson
49200483Srwatson    /* Block SIGUSR1, then send it to ourselves */
50200483Srwatson    sigset_t mask;
51200483Srwatson    sigemptyset(&mask);
52200483Srwatson    sigaddset(&mask, SIGUSR1);
53200483Srwatson    if (sigprocmask(SIG_BLOCK, &mask, NULL) == -1)
54200483Srwatson        err(1, "sigprocmask");
55200483Srwatson    if (kill(getpid(), SIGUSR1) < 0)
56200483Srwatson        err(1, "kill");
57200483Srwatson
58200483Srwatson    kev.flags |= EV_CLEAR;
59200483Srwatson    kev.data = 1;
60200483Srwatson    kevent_cmp(&kev, kevent_get(kqfd));
61200483Srwatson
62200483Srwatson    success();
63200483Srwatson}
64200483Srwatson
65200483Srwatsonvoid
66200483Srwatsontest_kevent_signal_disable(void)
67200483Srwatson{
68200483Srwatson    const char *test_id = "kevent(EVFILT_SIGNAL, EV_DISABLE)";
69200483Srwatson    struct kevent kev;
70200483Srwatson
71200483Srwatson    test_begin(test_id);
72200483Srwatson
73200483Srwatson    EV_SET(&kev, SIGUSR1, EVFILT_SIGNAL, EV_DISABLE, 0, 0, NULL);
74200483Srwatson    if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)
75200483Srwatson        err(1, "%s", test_id);
76200483Srwatson
77200483Srwatson    /* Block SIGUSR1, then send it to ourselves */
78200483Srwatson    sigset_t mask;
79200483Srwatson    sigemptyset(&mask);
80200483Srwatson    sigaddset(&mask, SIGUSR1);
81200483Srwatson    if (sigprocmask(SIG_BLOCK, &mask, NULL) == -1)
82200483Srwatson        err(1, "sigprocmask");
83200483Srwatson    if (kill(getpid(), SIGUSR1) < 0)
84200483Srwatson        err(1, "kill");
85200483Srwatson
86200483Srwatson    test_no_kevents();
87200483Srwatson
88200483Srwatson    success();
89200483Srwatson}
90200483Srwatson
91200483Srwatsonvoid
92200483Srwatsontest_kevent_signal_enable(void)
93200483Srwatson{
94200483Srwatson    const char *test_id = "kevent(EVFILT_SIGNAL, EV_ENABLE)";
95200483Srwatson    struct kevent kev;
96200483Srwatson
97200483Srwatson    test_begin(test_id);
98200483Srwatson
99200483Srwatson    EV_SET(&kev, SIGUSR1, EVFILT_SIGNAL, EV_ENABLE, 0, 0, NULL);
100200483Srwatson    if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)
101200483Srwatson        err(1, "%s", test_id);
102200483Srwatson
103200483Srwatson    /* Block SIGUSR1, then send it to ourselves */
104200483Srwatson    sigset_t mask;
105200483Srwatson    sigemptyset(&mask);
106200483Srwatson    sigaddset(&mask, SIGUSR1);
107200483Srwatson    if (sigprocmask(SIG_BLOCK, &mask, NULL) == -1)
108200483Srwatson        err(1, "sigprocmask");
109200483Srwatson    if (kill(getpid(), SIGUSR1) < 0)
110200483Srwatson        err(1, "kill");
111200483Srwatson
112200483Srwatson    kev.flags = EV_ADD | EV_CLEAR;
113200483Srwatson#if LIBKQUEUE
114200483Srwatson    kev.data = 1; /* WORKAROUND */
115200483Srwatson#else
116200483Srwatson    kev.data = 2; // one extra time from test_kevent_signal_disable()
117200483Srwatson#endif
118200483Srwatson    kevent_cmp(&kev, kevent_get(kqfd));
119200483Srwatson
120200483Srwatson    /* Delete the watch */
121200483Srwatson    kev.flags = EV_DELETE;
122200483Srwatson    if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)
123200483Srwatson        err(1, "%s", test_id);
124200483Srwatson
125200483Srwatson    success();
126200483Srwatson}
127200483Srwatson
128200483Srwatsonvoid
129200483Srwatsontest_kevent_signal_del(void)
130200483Srwatson{
131200483Srwatson    const char *test_id = "kevent(EVFILT_SIGNAL, EV_DELETE)";
132200483Srwatson    struct kevent kev;
133200483Srwatson
134200483Srwatson    test_begin(test_id);
135200483Srwatson
136200483Srwatson    /* Delete the kevent */
137200483Srwatson    EV_SET(&kev, SIGUSR1, EVFILT_SIGNAL, EV_DELETE, 0, 0, NULL);
138200483Srwatson    if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)
139200483Srwatson        err(1, "%s", test_id);
140200483Srwatson
141200483Srwatson    /* Block SIGUSR1, then send it to ourselves */
142200483Srwatson    sigset_t mask;
143200483Srwatson    sigemptyset(&mask);
144200483Srwatson    sigaddset(&mask, SIGUSR1);
145200483Srwatson    if (sigprocmask(SIG_BLOCK, &mask, NULL) == -1)
146200483Srwatson        err(1, "sigprocmask");
147200483Srwatson    if (kill(getpid(), SIGUSR1) < 0)
148200483Srwatson        err(1, "kill");
149200483Srwatson
150200483Srwatson    test_no_kevents();
151200483Srwatson    success();
152200483Srwatson}
153200483Srwatson
154200483Srwatsonvoid
155200483Srwatsontest_kevent_signal_oneshot(void)
156200483Srwatson{
157200483Srwatson    const char *test_id = "kevent(EVFILT_SIGNAL, EV_ONESHOT)";
158200483Srwatson    struct kevent kev;
159200483Srwatson
160200483Srwatson    test_begin(test_id);
161200483Srwatson
162200483Srwatson    EV_SET(&kev, SIGUSR1, EVFILT_SIGNAL, EV_ADD | EV_ONESHOT, 0, 0, NULL);
163200483Srwatson    if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)
164200483Srwatson        err(1, "%s", test_id);
165200483Srwatson
166200483Srwatson    /* Block SIGUSR1, then send it to ourselves */
167200483Srwatson    sigset_t mask;
168200483Srwatson    sigemptyset(&mask);
169200483Srwatson    sigaddset(&mask, SIGUSR1);
170200483Srwatson    if (sigprocmask(SIG_BLOCK, &mask, NULL) == -1)
171200483Srwatson        err(1, "sigprocmask");
172200483Srwatson    if (kill(getpid(), SIGUSR1) < 0)
173200483Srwatson        err(1, "kill");
174200483Srwatson
175200483Srwatson    kev.flags |= EV_CLEAR;
176200483Srwatson    kev.data = 1;
177200483Srwatson    kevent_cmp(&kev, kevent_get(kqfd));
178200483Srwatson
179200483Srwatson    /* Send another one and make sure we get no events */
180200483Srwatson    if (kill(getpid(), SIGUSR1) < 0)
181200483Srwatson        err(1, "kill");
182200483Srwatson    test_no_kevents();
183200483Srwatson
184200483Srwatson    success();
185200483Srwatson}
186200483Srwatson
187200483Srwatsonvoid
188200483Srwatsontest_evfilt_signal()
189200483Srwatson{
190341275Sdab    kqfd = kqueue();
191341275Sdab    test_kevent_signal_add();
192341275Sdab    test_kevent_signal_del();
193341275Sdab    test_kevent_signal_get();
194341275Sdab    test_kevent_signal_disable();
195341275Sdab    test_kevent_signal_enable();
196341275Sdab    test_kevent_signal_oneshot();
197341275Sdab    close(kqfd);
198200483Srwatson}
199