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