1d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes/* 2d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Check decoding of threads when a non-leader thread invokes execve. 3d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * 4d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Copyright (c) 2016 Dmitry V. Levin <ldv@altlinux.org> 539bac055674d23770b9a724221b728e443196ea7Elliott Hughes * Copyright (c) 2016-2017 The strace developers. 6d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * All rights reserved. 7d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * 8d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Redistribution and use in source and binary forms, with or without 9d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * modification, are permitted provided that the following conditions 10d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * are met: 11d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * 1. Redistributions of source code must retain the above copyright 12d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * notice, this list of conditions and the following disclaimer. 13d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * 2. Redistributions in binary form must reproduce the above copyright 14d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * notice, this list of conditions and the following disclaimer in the 15d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * documentation and/or other materials provided with the distribution. 16d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * 3. The name of the author may not be used to endorse or promote products 17d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * derived from this software without specific prior written permission. 18d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * 19d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 20d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 21d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 22d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 23d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 24d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 28d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes */ 30d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 31d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include "tests.h" 32d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include <asm/unistd.h> 33d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include <errno.h> 34d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include <pthread.h> 35d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include <signal.h> 36d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include <stdio.h> 37d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include <stdlib.h> 38d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include <time.h> 39d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include <unistd.h> 40d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 41d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic pid_t leader; 42d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic pid_t tid; 43d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 44d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic void 45d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hugheshandler(int signo) 46d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{ 47d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes} 48d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 49d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic unsigned int sigsetsize; 50d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic long 51d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesk_sigsuspend(const sigset_t *const set) 52d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{ 53d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes return syscall(__NR_rt_sigsuspend, set, sigsetsize); 54d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes} 55d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 56d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic pid_t 57d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesk_gettid(void) 58d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{ 59d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes return syscall(__NR_gettid); 60d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes} 61d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 62d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic void 63d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesget_sigsetsize(void) 64d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{ 65d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes static const struct sigaction sa = { .sa_handler = handler }; 66d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes if (sigaction(SIGUSR1, &sa, NULL)) 67d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes perror_msg_and_fail("sigaction"); 68d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 69d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes sigset_t mask; 70d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes sigemptyset(&mask); 71d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes sigaddset(&mask, SIGUSR1); 72d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes if (sigprocmask(SIG_BLOCK, &mask, NULL)) 73d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes perror_msg_and_fail("sigprocmask"); 74d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 75d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes raise(SIGUSR1); 76d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 77d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes sigemptyset(&mask); 78d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes for (sigsetsize = sizeof(mask) / sizeof(long); 79d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes sigsetsize; sigsetsize >>= 1) { 80d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes long rc = k_sigsuspend(&mask); 81d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes if (!rc) 82d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes error_msg_and_fail("rt_sigsuspend"); 83d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes if (EINTR == errno) 84d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes break; 85d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes printf("%-5d rt_sigsuspend(%p, %u) = %s\n", 86d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes leader, &mask, sigsetsize, sprintrc(rc)); 87d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes } 88d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes if (!sigsetsize) 89d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes perror_msg_and_fail("rt_sigsuspend"); 90d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes printf("%-5d rt_sigsuspend([], %u) = ? ERESTARTNOHAND" 91d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes " (To be restarted if no handler)\n", leader, sigsetsize); 92d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes} 93d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 94d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesenum { 95d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes ACTION_exit = 0, 96d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes ACTION_rt_sigsuspend, 97d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes ACTION_nanosleep, 98d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes NUMBER_OF_ACTIONS 99d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}; 100d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 101d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic const unsigned int NUMBER_OF_ITERATIONS = 1; 102d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic unsigned int action; 103d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic int fds[2]; 104d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 105d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic unsigned int 106d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesarglen(char **args) 107d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{ 108d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes char **p; 109d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 110d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes for (p = args; *p; ++p) 111d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes ; 112d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 113d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes return p - args; 114d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes} 115d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 116d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic void * 117d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesthread(void *arg) 118d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{ 119d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes tid = k_gettid(); 120d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 121d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes static char buf[sizeof(action) * 3]; 122d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes sprintf(buf, "%u", action + 1); 123d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 124d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes char **argv = arg; 125d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes argv[2] = buf; 126d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 127d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes if (read(fds[0], fds, sizeof(fds[0]))) 128d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes perror_msg_and_fail("execve"); 129d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 130d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes struct timespec ts = { .tv_nsec = 100000000 }; 131d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes (void) clock_nanosleep(CLOCK_REALTIME, 0, &ts, NULL); 132d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 133d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes ts.tv_nsec = 12345; 134d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes printf("%-5d nanosleep({tv_sec=0, tv_nsec=%u}, NULL) = 0\n", 135d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes tid, (unsigned int) ts.tv_nsec); 136d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 137d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes switch (action % NUMBER_OF_ACTIONS) { 138d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes case ACTION_exit: 139d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes printf("%-5d execve(\"%s\", [\"%s\", \"%s\", \"%s\"]" 14039bac055674d23770b9a724221b728e443196ea7Elliott Hughes ", %p /* %u vars */ <pid changed to %u ...>\n", 141d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes tid, argv[0], argv[0], argv[1], argv[2], 14239bac055674d23770b9a724221b728e443196ea7Elliott Hughes environ, arglen(environ), leader); 143d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes break; 144d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes case ACTION_rt_sigsuspend: 145d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes printf("%-5d execve(\"%s\", [\"%s\", \"%s\", \"%s\"]" 14639bac055674d23770b9a724221b728e443196ea7Elliott Hughes ", %p /* %u vars */ <unfinished ...>\n" 147d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes "%-5d <... rt_sigsuspend resumed>) = ?\n", 148d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes tid, argv[0], argv[0], argv[1], argv[2], 14939bac055674d23770b9a724221b728e443196ea7Elliott Hughes environ, arglen(environ), 150d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes leader); 151d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes break; 152d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes case ACTION_nanosleep: 153d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes printf("%-5d execve(\"%s\", [\"%s\", \"%s\", \"%s\"]" 15439bac055674d23770b9a724221b728e443196ea7Elliott Hughes ", %p /* %u vars */ <unfinished ...>\n" 155d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes "%-5d <... nanosleep resumed> <unfinished ...>)" 156d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes " = ?\n", 157d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes tid, argv[0], argv[0], argv[1], argv[2], 15839bac055674d23770b9a724221b728e443196ea7Elliott Hughes environ, arglen(environ), 159d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes leader); 160d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes break; 161d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes } 162d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 163d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes printf("%-5d +++ superseded by execve in pid %u +++\n" 164d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes "%-5d <... execve resumed> ) = 0\n", 165d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes leader, tid, 166d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes leader); 167d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 168d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes (void) nanosleep(&ts, NULL); 169d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes execve(argv[0], argv, environ); 170d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes perror_msg_and_fail("execve"); 171d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes} 172d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 173d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesint 174d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesmain(int ac, char **av) 175d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{ 176d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes setvbuf(stdout, NULL, _IONBF, 0); 177d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes leader = getpid(); 178d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 179d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes if (ac < 3) { 180d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes struct timespec ts = { .tv_nsec = 1 }; 181d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes if (clock_nanosleep(CLOCK_REALTIME, 0, &ts, NULL)) 182d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes perror_msg_and_skip("clock_nanosleep CLOCK_REALTIME"); 183d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 184d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes get_sigsetsize(); 185d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes static char buf[sizeof(sigsetsize) * 3]; 186d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes sprintf(buf, "%u", sigsetsize); 187d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 188d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes char *argv[] = { av[0], buf, (char *) "0", NULL }; 189d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes printf("%-5d execve(\"%s\", [\"%s\", \"%s\", \"%s\"]" 19039bac055674d23770b9a724221b728e443196ea7Elliott Hughes ", %p /* %u vars */) = 0\n", 191d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes leader, argv[0], argv[0], argv[1], argv[2], 19239bac055674d23770b9a724221b728e443196ea7Elliott Hughes environ, arglen(environ)); 193d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes execve(argv[0], argv, environ); 194d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes perror_msg_and_fail("execve"); 195d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes } 196d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 197d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes sigsetsize = atoi(av[1]); 198d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes action = atoi(av[2]); 199d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 200d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes if (action >= NUMBER_OF_ACTIONS * NUMBER_OF_ITERATIONS) { 201d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes printf("%-5d +++ exited with 0 +++\n", leader); 202d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes return 0; 203d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes } 204d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 205d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes if (pipe(fds)) 206d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes perror_msg_and_fail("pipe"); 207d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 208d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes pthread_t t; 209d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes errno = pthread_create(&t, NULL, thread, av); 210d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes if (errno) 211d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes perror_msg_and_fail("pthread_create"); 212d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 213d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes struct timespec ts = { .tv_sec = 123 }; 214d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes sigset_t mask; 215d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes sigemptyset(&mask); 216d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 217d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes static char leader_str[sizeof(leader) * 3]; 218d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes int leader_str_len = 219d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes snprintf(leader_str, sizeof(leader_str), "%-5d", leader); 220d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 221d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes switch (action % NUMBER_OF_ACTIONS) { 222d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes case ACTION_exit: 223d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes printf("%s exit(42)%*s= ?\n", leader_str, 224d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes (int) sizeof(leader_str) - leader_str_len, " "); 225d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes close(fds[1]); 226d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes (void) syscall(__NR_exit, 42); 227d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes break; 228d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes case ACTION_rt_sigsuspend: 229d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes printf("%s rt_sigsuspend([], %u <unfinished ...>\n", 230d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes leader_str, sigsetsize); 231d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes close(fds[1]); 232d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes (void) k_sigsuspend(&mask); 233d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes break; 234d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes case ACTION_nanosleep: 235d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes printf("%s nanosleep({tv_sec=%u, tv_nsec=0}" 236d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes ", <unfinished ...>\n", 237d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes leader_str, (unsigned int) ts.tv_sec); 238d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes close(fds[1]); 239d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes (void) nanosleep(&ts, 0); 240d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes break; 241d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes } 242d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 243d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes return 1; 244d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes} 245