1dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes/* 2dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * Execute a command with blocked, reset, and raised signal. 3dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * 4dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * Copyright (c) 2017 Dmitry V. Levin <ldv@altlinux.org> 5dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * All rights reserved. 6dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * 7dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * Redistribution and use in source and binary forms, with or without 8dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * modification, are permitted provided that the following conditions 9dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * are met: 10dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * 1. Redistributions of source code must retain the above copyright 11dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * notice, this list of conditions and the following disclaimer. 12dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * 2. Redistributions in binary form must reproduce the above copyright 13dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * notice, this list of conditions and the following disclaimer in the 14dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * documentation and/or other materials provided with the distribution. 15dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * 3. The name of the author may not be used to endorse or promote products 16dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * derived from this software without specific prior written permission. 17dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * 18dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 19dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 20dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 21dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 22dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 23dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 27dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes */ 29dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes 30dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes#include "tests.h" 31dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes#include <signal.h> 32dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes#include <stdlib.h> 33dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes#include <unistd.h> 34dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes 35dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughesint 36dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughesmain(int ac, char **av) 37dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes{ 38dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes if (ac < 3) 39dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes error_msg_and_fail("usage: block_reset_raise_run signo path..."); 40dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes 41dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes sigset_t mask; 42dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes sigemptyset(&mask); 43dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes const int signo = atoi(av[1]); 44dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes if (sigaddset(&mask, signo)) 45dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes perror_msg_and_fail("sigaddset: %s", av[1]); 46dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes if (sigprocmask(SIG_BLOCK, &mask, NULL)) 47dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes perror_msg_and_fail("sigprocmask"); 48dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes if (signal(signo, SIG_DFL) == SIG_ERR) 49dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes perror_msg_and_fail("signal: %s", av[1]); 50dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes if (raise(signo)) 51dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes perror_msg_and_fail("raise: %s", av[1]); 52dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes 53dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes execvp(av[2], av + 2); 54dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes perror_msg_and_fail("execvp: %s", av[2]); 55dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes} 56