1e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew/* 2e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew * Copyright 1998-2002 by Albert Cahalan; all rights resered. 3e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew * This file may be used subject to the terms and conditions of the 4e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew * GNU Library General Public License Version 2, or any later version 5e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew * at your option, as published by the Free Software Foundation. 6e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew * This program is distributed in the hope that it will be useful, 7e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew * but WITHOUT ANY WARRANTY; without even the implied warranty of 8e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 9e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew * GNU Library General Public License for more details. 10e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew */ 11e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew#include <signal.h> 12e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew#include <string.h> 13e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew#include <stdio.h> 14e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew#include <stdlib.h> 15e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew#include "sig.h" 16e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew 17e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew/* Linux signals: 18e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew * 19e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew * SIGSYS is required by Unix98. 20e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew * SIGEMT is part of SysV, BSD, and ancient UNIX tradition. 21e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew * 22e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew * They are provided by these Linux ports: alpha, mips, sparc, and sparc64. 23e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew * You get SIGSTKFLT and SIGUNUSED instead on i386, m68k, ppc, and arm. 24e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew * (this is a Linux & libc bug -- both must be fixed) 25e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew * 26e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew * Total garbage: SIGIO SIGINFO SIGIOT SIGLOST SIGCLD 27e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew * (popular ones are handled as aliases) 28e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew * Nearly garbage: SIGSTKFLT SIGUNUSED (nothing else to fill slots) 29e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew */ 30e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew 31e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew/* Linux 2.3.29 replaces SIGUNUSED with the standard SIGSYS signal */ 32e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew#ifndef SIGSYS 33354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#warning Standards require that <signal.h> define SIGSYS 34354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#define SIGSYS SIGUNUSED 35e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew#endif 36e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew 37e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew/* If we see both, it is likely SIGSTKFLT (junk) was replaced. */ 38e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew#ifdef SIGEMT 39354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#undef SIGSTKFLT 40e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew#endif 41e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew 42e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew#ifndef SIGRTMIN 43354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#warning Standards require that <signal.h> define SIGRTMIN; assuming 32 44354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#define SIGRTMIN 32 45e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew#endif 46e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew 47e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew/* It seems the SPARC libc does not know the kernel supports SIGPWR. */ 48e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew#ifndef SIGPWR 49354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#warning Your header files lack SIGPWR. (assuming it is number 29) 50354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#define SIGPWR 29 51e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew#endif 52e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew 53e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiewtypedef struct mapstruct { 54354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao const char *name; 55354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao int num; 56e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew} mapstruct; 57e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew 58e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiewstatic const mapstruct sigtable[] = { 59354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao {"ABRT", SIGABRT}, /* IOT */ 60354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao {"ALRM", SIGALRM}, 61354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao {"BUS", SIGBUS}, 62354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao {"CHLD", SIGCHLD}, /* CLD */ 63354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao {"CONT", SIGCONT}, 64e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew#ifdef SIGEMT 65354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao {"EMT", SIGEMT}, 66e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew#endif 67354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao {"FPE", SIGFPE}, 68354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao {"HUP", SIGHUP}, 69354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao {"ILL", SIGILL}, 70354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao {"INT", SIGINT}, 71354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao {"KILL", SIGKILL}, 72354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao {"PIPE", SIGPIPE}, 73354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao {"POLL", SIGPOLL}, /* IO */ 74354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao {"PROF", SIGPROF}, 75354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao {"PWR", SIGPWR}, 76354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao {"QUIT", SIGQUIT}, 77354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao {"SEGV", SIGSEGV}, 78e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew#ifdef SIGSTKFLT 79354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao {"STKFLT", SIGSTKFLT}, 80e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew#endif 81354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao {"STOP", SIGSTOP}, 82354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao {"SYS", SIGSYS}, /* UNUSED */ 83354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao {"TERM", SIGTERM}, 84354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao {"TRAP", SIGTRAP}, 85354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao {"TSTP", SIGTSTP}, 86354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao {"TTIN", SIGTTIN}, 87354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao {"TTOU", SIGTTOU}, 88354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao {"URG", SIGURG}, 89354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao {"USR1", SIGUSR1}, 90354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao {"USR2", SIGUSR2}, 91354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao {"VTALRM", SIGVTALRM}, 92354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao {"WINCH", SIGWINCH}, 93354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao {"XCPU", SIGXCPU}, 94354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao {"XFSZ", SIGXFSZ} 95e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew}; 96e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew 97354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic const int number_of_signals = sizeof(sigtable) / sizeof(mapstruct); 98e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew 99354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic int compare_signal_names(const void *a, const void *b) 100354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao{ 101354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao return strcasecmp(((const mapstruct *)a)->name, 102354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao ((const mapstruct *)b)->name); 103e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew} 104e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew 105e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew/* return -1 on failure */ 106354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint signal_name_to_number(const char *restrict name) 107354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao{ 108354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao long val; 109354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao int offset; 110354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao 111354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao /* clean up name */ 112354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (!strncasecmp(name, "SIG", 3)) 113354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao name += 3; 114354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao 115354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (!strcasecmp(name, "CLD")) 116354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao return SIGCHLD; 117354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (!strcasecmp(name, "IO")) 118354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao return SIGPOLL; 119354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (!strcasecmp(name, "IOT")) 120354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao return SIGABRT; 121354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao 122354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao /* search the table */ 123354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao { 124354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao const mapstruct ms = { name, 0 }; 125354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao const mapstruct *restrict const ptr = bsearch(&ms, 126354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao sigtable, 127354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao number_of_signals, 128354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao sizeof(mapstruct), 129354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao compare_signal_names); 130354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (ptr) 131354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao return ptr->num; 132354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 133354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao 134354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (!strcasecmp(name, "RTMIN")) 135354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao return SIGRTMIN; 136354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (!strcasecmp(name, "EXIT")) 137354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao return 0; 138354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (!strcasecmp(name, "NULL")) 139354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao return 0; 140354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao 141354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao offset = 0; 142354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (!strncasecmp(name, "RTMIN+", 6)) { 143354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao name += 6; 144354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao offset = SIGRTMIN; 145354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 146354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao 147354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao /* not found, so try as a number */ 148354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao { 149354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao char *endp; 150354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao val = strtol(name, &endp, 10); 151354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (*endp || endp == name) 152354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao return -1; /* not valid */ 153354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 154354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (val + SIGRTMIN > 127) 155354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao return -1; /* not valid */ 156354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao return val + offset; 157e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew} 158e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew 159354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic const char *signal_number_to_name(int signo) 160354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao{ 161354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao static char buf[32]; 162354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao int n = number_of_signals; 163354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao signo &= 0x7f; /* need to process exit values too */ 164354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao while (n--) { 165354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (sigtable[n].num == signo) 166354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao return sigtable[n].name; 167354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 168354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (signo == SIGRTMIN) 169354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao return "RTMIN"; 170354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (signo) 171354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao sprintf(buf, "RTMIN+%d", signo - SIGRTMIN); 172354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao else 173354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao strcpy(buf, "0"); /* AIX has NULL; Solaris has EXIT */ 174354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao return buf; 175e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew} 176e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew 177354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint print_given_signals(int argc, const char *restrict const *restrict argv, 178354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao int max_line) 179354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao{ 180354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao char buf[1280]; /* 128 signals, "RTMIN+xx" is largest */ 181354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao int ret = 0; /* to be used as exit code by caller */ 182354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao int place = 0; /* position on this line */ 183354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao int amt; 184354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (argc > 128) 185354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao return 1; 186354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao while (argc--) { 187354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao char tmpbuf[16]; 188354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao const char *restrict const txt = *argv; 189354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (*txt >= '0' && *txt <= '9') { 190354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao long val; 191354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao char *endp; 192354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao val = strtol(txt, &endp, 10); 193354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (*endp) { 194354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao fprintf(stderr, "Signal \"%s\" not known.\n", 195354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao txt); 196354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao ret = 1; 197354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao goto end; 198354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 199354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao amt = sprintf(tmpbuf, "%s", signal_number_to_name(val)); 200354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } else { 201354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao int sno; 202354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao sno = signal_name_to_number(txt); 203354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (sno == -1) { 204354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao fprintf(stderr, "Signal \"%s\" not known.\n", 205354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao txt); 206354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao ret = 1; 207354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao goto end; 208354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 209354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao amt = sprintf(tmpbuf, "%d", sno); 210354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 211354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao 212354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (!place) { 213354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao strcpy(buf, tmpbuf); 214354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao place = amt; 215354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao goto end; 216354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 217354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (amt + place + 1 > max_line) { 218354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao printf("%s\n", buf); 219354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao strcpy(buf, tmpbuf); 220354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao place = amt; 221354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao goto end; 222354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 223354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao sprintf(buf + place, " %s", tmpbuf); 224354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao place += amt + 1; 225e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiewend: 226354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao argv++; 227354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 228354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (place) 229354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao printf("%s\n", buf); 230354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao return ret; 231e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew} 232e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew 233354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaovoid pretty_print_signals(void) 234354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao{ 235354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao int i = 0; 236354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao while (++i <= number_of_signals) { 237354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao int n; 238354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao n = printf("%2d %s", i, signal_number_to_name(i)); 239354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (i % 7) 240354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao printf 241354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao (" \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" 242354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao + n); 243354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao else 244354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao printf("\n"); 245354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 246354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if ((i - 1) % 7) 247354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao printf("\n"); 248e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew} 249e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew 250354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaovoid unix_print_signals(void) 251354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao{ 252354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao int pos = 0; 253354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao int i = 0; 254354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao while (++i <= number_of_signals) { 255354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (i - 1) 256354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao printf("%c", 257354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao (pos > 73) ? (pos = 0, '\n') : (pos++, ' ')); 258354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao pos += printf("%s", signal_number_to_name(i)); 259354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 260354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao printf("\n"); 261e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew} 262e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew 263e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew/* sanity check */ 264354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic int init_signal_list(void) __attribute__ ((constructor)); 265354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic int init_signal_list(void) 266354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao{ 267354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (number_of_signals != 31) { 268354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao fprintf(stderr, 269354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "WARNING: %d signals -- adjust and recompile.\n", 270354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao number_of_signals); 271354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 272354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao return 0; 273ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman} 274