1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 
  22 /*
  23  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
  24  * Use is subject to license terms.
  25  * Copyright 2015, Joyent, Inc.
  26  */
  27 
  28 /*      Copyright (c) 1988 AT&T     */
  29 /*        All Rights Reserved   */
  30 
  31 #include "lint.h"
  32 #include <string.h>
  33 #include <stdlib.h>
  34 #include <signal.h>
  35 #include <sys/types.h>
  36 #include <errno.h>
  37 
  38 typedef struct signame {
  39         const char *sigstr;
  40         const int   signum;
  41 } signame_t;
  42 
  43 static signame_t signames[] = {
  44         { "EXIT",       0 },
  45         { "HUP",        SIGHUP },
  46         { "INT",        SIGINT },
  47         { "QUIT",       SIGQUIT },
  48         { "ILL",        SIGILL },
  49         { "TRAP",       SIGTRAP },
  50         { "ABRT",       SIGABRT },
  51         { "IOT",        SIGIOT },
  52         { "EMT",        SIGEMT },
  53         { "FPE",        SIGFPE },
  54         { "KILL",       SIGKILL },
  55         { "BUS",        SIGBUS },
  56         { "SEGV",       SIGSEGV },
  57         { "SYS",        SIGSYS },
  58         { "PIPE",       SIGPIPE },
  59         { "ALRM",       SIGALRM },
  60         { "TERM",       SIGTERM },
  61         { "USR1",       SIGUSR1 },
  62         { "USR2",       SIGUSR2 },
  63         { "CLD",        SIGCLD },
  64         { "CHLD",       SIGCHLD },
  65         { "PWR",        SIGPWR },
  66         { "WINCH",      SIGWINCH },
  67         { "URG",        SIGURG },
  68         { "POLL",       SIGPOLL },
  69         { "IO",         SIGPOLL },
  70         { "STOP",       SIGSTOP },
  71         { "TSTP",       SIGTSTP },
  72         { "CONT",       SIGCONT },
  73         { "TTIN",       SIGTTIN },
  74         { "TTOU",       SIGTTOU },
  75         { "VTALRM",     SIGVTALRM },
  76         { "PROF",       SIGPROF },
  77         { "XCPU",       SIGXCPU },
  78         { "XFSZ",       SIGXFSZ },
  79         { "WAITING",    SIGWAITING },
  80         { "LWP",        SIGLWP },
  81         { "FREEZE",     SIGFREEZE },
  82         { "THAW",       SIGTHAW },
  83         { "CANCEL",     SIGCANCEL },
  84         { "LOST",       SIGLOST },
  85         { "XRES",       SIGXRES },
  86         { "JVM1",       SIGJVM1 },
  87         { "JVM2",       SIGJVM2 },
  88         { "INFO",       SIGINFO },
  89         { "RTMIN",      _SIGRTMIN },
  90         { "RTMIN+1",    _SIGRTMIN+1 },
  91         { "RTMIN+2",    _SIGRTMIN+2 },
  92         { "RTMIN+3",    _SIGRTMIN+3 },
  93         { "RTMIN+4",    _SIGRTMIN+4 },
  94         { "RTMIN+5",    _SIGRTMIN+5 },
  95         { "RTMIN+6",    _SIGRTMIN+6 },
  96         { "RTMIN+7",    _SIGRTMIN+7 },
  97         { "RTMIN+8",    _SIGRTMIN+8 },
  98         { "RTMIN+9",    _SIGRTMIN+9 },
  99         { "RTMIN+10",   _SIGRTMIN+10 },
 100         { "RTMIN+11",   _SIGRTMIN+11 },
 101         { "RTMIN+12",   _SIGRTMIN+12 },
 102         { "RTMIN+13",   _SIGRTMIN+13 },
 103         { "RTMIN+14",   _SIGRTMIN+14 },
 104         { "RTMIN+15",   _SIGRTMIN+15 },
 105         { "RTMIN+16",   _SIGRTMIN+16 },
 106         { "RTMAX-15",   _SIGRTMAX-15 },
 107         { "RTMAX-14",   _SIGRTMAX-14 },
 108         { "RTMAX-13",   _SIGRTMAX-13 },
 109         { "RTMAX-12",   _SIGRTMAX-12 },
 110         { "RTMAX-11",   _SIGRTMAX-11 },
 111         { "RTMAX-10",   _SIGRTMAX-10 },
 112         { "RTMAX-9",    _SIGRTMAX-9 },
 113         { "RTMAX-8",    _SIGRTMAX-8 },
 114         { "RTMAX-7",    _SIGRTMAX-7 },
 115         { "RTMAX-6",    _SIGRTMAX-6 },
 116         { "RTMAX-5",    _SIGRTMAX-5 },
 117         { "RTMAX-4",    _SIGRTMAX-4 },
 118         { "RTMAX-3",    _SIGRTMAX-3 },
 119         { "RTMAX-2",    _SIGRTMAX-2 },
 120         { "RTMAX-1",    _SIGRTMAX-1 },
 121         { "RTMAX",      _SIGRTMAX },
 122 };
 123 
 124 #define SIGCNT  (sizeof (signames) / sizeof (struct signame))
 125 
 126 static int      str2long(const char *, long *);
 127 
 128 static int
 129 str2long(const char *p, long *val)
 130 {
 131         char *q;
 132         int error;
 133         int saved_errno = errno;
 134 
 135         errno = 0;
 136         *val = strtol(p, &q, 10);
 137 
 138         error = ((errno != 0 || q == p || *q != '\0') ? -1 : 0);
 139         errno = saved_errno;
 140 
 141         return (error);
 142 }
 143 
 144 int
 145 str2sig(const char *s, int *sigp)
 146 {
 147         const struct signame *sp;
 148 
 149         if (*s >= '0' && *s <= '9') {
 150                 long val;
 151 
 152                 if (str2long(s, &val) == -1)
 153                         return (-1);
 154 
 155                 for (sp = signames; sp < &signames[SIGCNT]; sp++) {
 156                         if (sp->signum == val) {
 157                                 *sigp = sp->signum;
 158                                 return (0);
 159                         }
 160                 }
 161                 return (-1);
 162         } else {
 163                 for (sp = signames; sp < &signames[SIGCNT]; sp++) {
 164                         if (strcmp(sp->sigstr, s) == 0) {
 165                                 *sigp = sp->signum;
 166                                 return (0);
 167                         }
 168                 }
 169                 return (-1);
 170         }
 171 }
 172 
 173 int
 174 sig2str(int i, char *s)
 175 {
 176         const struct signame *sp;
 177 
 178         for (sp = signames; sp < &signames[SIGCNT]; sp++) {
 179                 if (sp->signum == i) {
 180                         (void) strcpy(s, sp->sigstr);
 181                         return (0);
 182                 }
 183         }
 184         return (-1);
 185 }