1f08c3bdfSopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 2f08c3bdfSopenharmony_ci/* 3f08c3bdfSopenharmony_ci * Copyright (c) 2000 Silicon Graphics, Inc. All Rights Reserved. 4f08c3bdfSopenharmony_ci * AUTHOR : Bob Clark 5f08c3bdfSopenharmony_ci * CO-PILOT : Barrie Kletscher 6f08c3bdfSopenharmony_ci * DATE STARTED : 9/26/86 7f08c3bdfSopenharmony_ci * Copyright (C) 2015 Cyril Hrubis <chrubis@suse.cz> 8f08c3bdfSopenharmony_ci * Copyright (C) 2021 SUSE LLC Andrea Cervesato <andrea.cervesato@suse.com> 9f08c3bdfSopenharmony_ci */ 10f08c3bdfSopenharmony_ci 11f08c3bdfSopenharmony_ci/*\ 12f08c3bdfSopenharmony_ci * [Description] 13f08c3bdfSopenharmony_ci * 14f08c3bdfSopenharmony_ci * This test checks following conditions: 15f08c3bdfSopenharmony_ci * 1. sighold action to turn off the receipt of all signals was done without error. 16f08c3bdfSopenharmony_ci * 2. After signals were held, and sent, no signals were trapped. 17f08c3bdfSopenharmony_ci */ 18f08c3bdfSopenharmony_ci 19f08c3bdfSopenharmony_ci#define _XOPEN_SOURCE 600 20f08c3bdfSopenharmony_ci#include <signal.h> 21f08c3bdfSopenharmony_ci#include "tst_test.h" 22f08c3bdfSopenharmony_ci 23f08c3bdfSopenharmony_ci#ifndef NSIG 24f08c3bdfSopenharmony_ci# define NSIG _NSIG 25f08c3bdfSopenharmony_ci#endif 26f08c3bdfSopenharmony_ci 27f08c3bdfSopenharmony_ci#ifndef NUMSIGS 28f08c3bdfSopenharmony_ci# define NUMSIGS NSIG 29f08c3bdfSopenharmony_ci#endif 30f08c3bdfSopenharmony_ci 31f08c3bdfSopenharmony_cistatic int sigs_catched; 32f08c3bdfSopenharmony_cistatic int sigs_map[NUMSIGS]; 33f08c3bdfSopenharmony_ci 34f08c3bdfSopenharmony_cistatic int skip_sig(int sig) 35f08c3bdfSopenharmony_ci{ 36f08c3bdfSopenharmony_ci if (sig >= 32 && sig < SIGRTMIN) 37f08c3bdfSopenharmony_ci return 1; 38f08c3bdfSopenharmony_ci 39f08c3bdfSopenharmony_ci switch (sig) { 40f08c3bdfSopenharmony_ci case SIGCHLD: 41f08c3bdfSopenharmony_ci case SIGKILL: 42f08c3bdfSopenharmony_ci case SIGALRM: 43f08c3bdfSopenharmony_ci case SIGSTOP: 44f08c3bdfSopenharmony_ci return 1; 45f08c3bdfSopenharmony_ci default: 46f08c3bdfSopenharmony_ci return 0; 47f08c3bdfSopenharmony_ci } 48f08c3bdfSopenharmony_ci} 49f08c3bdfSopenharmony_ci 50f08c3bdfSopenharmony_cistatic void handle_sigs(int sig) 51f08c3bdfSopenharmony_ci{ 52f08c3bdfSopenharmony_ci sigs_map[sig] = 1; 53f08c3bdfSopenharmony_ci sigs_catched++; 54f08c3bdfSopenharmony_ci} 55f08c3bdfSopenharmony_ci 56f08c3bdfSopenharmony_cistatic void do_child(void) 57f08c3bdfSopenharmony_ci{ 58f08c3bdfSopenharmony_ci int sig; 59f08c3bdfSopenharmony_ci 60f08c3bdfSopenharmony_ci for (sig = 1; sig < NUMSIGS; sig++) { 61f08c3bdfSopenharmony_ci if (skip_sig(sig)) 62f08c3bdfSopenharmony_ci continue; 63f08c3bdfSopenharmony_ci 64f08c3bdfSopenharmony_ci SAFE_SIGNAL(sig, handle_sigs); 65f08c3bdfSopenharmony_ci } 66f08c3bdfSopenharmony_ci 67f08c3bdfSopenharmony_ci for (sig = 1; sig < NUMSIGS; sig++) { 68f08c3bdfSopenharmony_ci if (skip_sig(sig)) 69f08c3bdfSopenharmony_ci continue; 70f08c3bdfSopenharmony_ci 71f08c3bdfSopenharmony_ci if (sighold(sig)) 72f08c3bdfSopenharmony_ci tst_brk(TBROK | TERRNO, "sighold(%s %i)", tst_strsig(sig), sig); 73f08c3bdfSopenharmony_ci } 74f08c3bdfSopenharmony_ci 75f08c3bdfSopenharmony_ci TST_CHECKPOINT_WAKE_AND_WAIT(0); 76f08c3bdfSopenharmony_ci 77f08c3bdfSopenharmony_ci if (!sigs_catched) { 78f08c3bdfSopenharmony_ci tst_res(TPASS, "all signals were hold"); 79f08c3bdfSopenharmony_ci return; 80f08c3bdfSopenharmony_ci } 81f08c3bdfSopenharmony_ci 82f08c3bdfSopenharmony_ci tst_res(TFAIL, "signal handler was executed"); 83f08c3bdfSopenharmony_ci 84f08c3bdfSopenharmony_ci for (sig = 1; sig < NUMSIGS; sig++) 85f08c3bdfSopenharmony_ci if (sigs_map[sig]) 86f08c3bdfSopenharmony_ci tst_res(TINFO, "Signal %i(%s) catched", sig, tst_strsig(sig)); 87f08c3bdfSopenharmony_ci} 88f08c3bdfSopenharmony_ci 89f08c3bdfSopenharmony_cistatic void run(void) 90f08c3bdfSopenharmony_ci{ 91f08c3bdfSopenharmony_ci pid_t pid_child; 92f08c3bdfSopenharmony_ci int signal; 93f08c3bdfSopenharmony_ci 94f08c3bdfSopenharmony_ci pid_child = SAFE_FORK(); 95f08c3bdfSopenharmony_ci if (!pid_child) { 96f08c3bdfSopenharmony_ci do_child(); 97f08c3bdfSopenharmony_ci return; 98f08c3bdfSopenharmony_ci } 99f08c3bdfSopenharmony_ci 100f08c3bdfSopenharmony_ci TST_CHECKPOINT_WAIT(0); 101f08c3bdfSopenharmony_ci 102f08c3bdfSopenharmony_ci for (signal = 1; signal < NUMSIGS; signal++) { 103f08c3bdfSopenharmony_ci if (skip_sig(signal)) 104f08c3bdfSopenharmony_ci continue; 105f08c3bdfSopenharmony_ci 106f08c3bdfSopenharmony_ci SAFE_KILL(pid_child, signal); 107f08c3bdfSopenharmony_ci } 108f08c3bdfSopenharmony_ci 109f08c3bdfSopenharmony_ci TST_CHECKPOINT_WAKE(0); 110f08c3bdfSopenharmony_ci} 111f08c3bdfSopenharmony_ci 112f08c3bdfSopenharmony_cistatic struct tst_test test = { 113f08c3bdfSopenharmony_ci .test_all = run, 114f08c3bdfSopenharmony_ci .forks_child = 1, 115f08c3bdfSopenharmony_ci .needs_checkpoints = 1, 116f08c3bdfSopenharmony_ci}; 117