t_signals.c revision 314817
1139749Simp/* $NetBSD: t_signals.c,v 1.3 2017/01/13 21:30:43 christos Exp $ */ 223925Sgibbs 323925Sgibbs/*- 423925Sgibbs * Copyright (c) 2011 The NetBSD Foundation, Inc. 5102668Sgibbs * All rights reserved. 623925Sgibbs * 723925Sgibbs * Redistribution and use in source and binary forms, with or without 823925Sgibbs * modification, are permitted provided that the following conditions 923925Sgibbs * are met: 1023925Sgibbs * 1. Redistributions of source code must retain the above copyright 1123925Sgibbs * notice, this list of conditions and the following disclaimer. 1226997Sgibbs * 2. Redistributions in binary form must reproduce the above copyright 1354211Sgibbs * notice, this list of conditions and the following disclaimer in the 1495376Sgibbs * documentation and/or other materials provided with the distribution. 1595376Sgibbs * 1695376Sgibbs * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND 1795376Sgibbs * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, 1895376Sgibbs * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 1995376Sgibbs * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 2095376Sgibbs * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY 2195376Sgibbs * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2223925Sgibbs * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 2363457Sgibbs * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2495376Sgibbs * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 2595376Sgibbs * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 2663457Sgibbs * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 2795376Sgibbs * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2895376Sgibbs */ 2995376Sgibbs 3095376Sgibbs#include <sys/types.h> 3195376Sgibbs#include <sys/wait.h> 3295376Sgibbs 3323925Sgibbs#include <atf-c.h> 3423925Sgibbs#include <errno.h> 3595376Sgibbs#include <string.h> 3695376Sgibbs#include <signal.h> 3795376Sgibbs#include <unistd.h> 3895376Sgibbs 3923925Sgibbs#include <rump/rump.h> 40109575Sgibbs 4165943Sgibbs#include "../kernspace/kernspace.h" 4250477Speter#include "h_macros.h" 4323925Sgibbs 4423925SgibbsATF_TC(sigraise); 4523925SgibbsATF_TC_HEAD(sigraise, tc) 46224046Semaste{ 47224046Semaste 48224046Semaste atf_tc_set_md_var(tc, "descr", "RUMP_SIGMODEL_RAISE"); 4965943Sgibbs} 50224046Semaste 5165943SgibbsATF_TC(sigignore); 52193244SdelphijATF_TC_HEAD(sigignore, tc) 53107303Sscottl{ 54104028Sgibbs 5595376Sgibbs atf_tc_set_md_var(tc, "descr", "RUMP_SIGMODEL_IGNORE"); 5623925Sgibbs} 5723925Sgibbs 5823925SgibbsATF_TC(sigpanic); 5923925SgibbsATF_TC_HEAD(sigpanic, tc) 6023925Sgibbs{ 6129050Sgibbs 6229050Sgibbs atf_tc_set_md_var(tc, "descr", "RUMP_SIGMODEL_PANIC"); 6323925Sgibbs} 6423925Sgibbs 6523925Sgibbsstatic volatile sig_atomic_t sigcnt; 66193244Sdelphijstatic void 67193244Sdelphijthehand(int sig) 6823925Sgibbs{ 6923925Sgibbs 7023925Sgibbs sigcnt++; 7123925Sgibbs} 7223925Sgibbs 7323925SgibbsATF_TC_BODY(sigraise, tc) 7423925Sgibbs{ 7523925Sgibbs 7623925Sgibbs signal(SIGUSR2, thehand); 7723925Sgibbs rump_boot_setsigmodel(RUMP_SIGMODEL_RAISE); 78102668Sgibbs 79102668Sgibbs rump_init(); 8023925Sgibbs rump_schedule(); 8123925Sgibbs rumptest_localsig(SIGUSR2); 8223925Sgibbs rump_unschedule(); 8323925Sgibbs ATF_REQUIRE_EQ(sigcnt, 1); 8423925Sgibbs} 8565943Sgibbs 8623925SgibbsATF_TC_BODY(sigignore, tc) 8723925Sgibbs{ 8823925Sgibbs 8923925Sgibbs rump_boot_setsigmodel(RUMP_SIGMODEL_IGNORE); 9023925Sgibbs 9123925Sgibbs rump_init(); 9223925Sgibbs rump_schedule(); 9323925Sgibbs rumptest_localsig(SIGKILL); 9423925Sgibbs rump_unschedule(); 9523925Sgibbs} 9623925Sgibbs 9723925SgibbsATF_TC_BODY(sigpanic, tc) 9823925Sgibbs{ 9923925Sgibbs int status; 10023925Sgibbs 10123925Sgibbs rump_boot_setsigmodel(RUMP_SIGMODEL_PANIC); 10223925Sgibbs 10323925Sgibbs switch (fork()) { 10423925Sgibbs case 0: 10523925Sgibbs rump_init(); 106102668Sgibbs rump_schedule(); 107102668Sgibbs rumptest_localsig(SIGCONT); 108102668Sgibbs /* NOTREACHED */ 109102668Sgibbs exit(1); 110102668Sgibbs default: 111102668Sgibbs wait(&status); 11223925Sgibbs ATF_REQUIRE(WIFSIGNALED(status) && WTERMSIG(status) == SIGABRT); 11323925Sgibbs break; 11429897Sgibbs case -1: 11523925Sgibbs atf_tc_fail_errno("fork"); 11623925Sgibbs } 11723925Sgibbs} 11823925Sgibbs 11923925SgibbsATF_TP_ADD_TCS(tp) 12023925Sgibbs{ 12123925Sgibbs 12223925Sgibbs ATF_TP_ADD_TC(tp, sigraise); 12323925Sgibbs ATF_TP_ADD_TC(tp, sigignore); 12423925Sgibbs ATF_TP_ADD_TC(tp, sigpanic); 12523925Sgibbs 12623925Sgibbs return atf_no_error(); 12723925Sgibbs} 12823925Sgibbs