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