Ignore:
Timestamp:
Nov 4, 2007, 3:16:40 AM (16 years ago)
Author:
Bruno Cornec
Message:

Update to busybox 1.7.2

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2.2.5/mindi-busybox/libbb/u_signal_names.c

    r821 r1765  
    11/* vi: set sw=4 ts=4: */
    22/*
    3  * Utility routines.
     3 * Signal name/number conversion routines.
    44 *
    5  * Copyright (C) many different people.
    6  * If you wrote this, please acknowledge your work.
     5 * Copyright 2006 Rob Landley <rob@landley.net>
    76 *
    87 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
    98 */
    109
    11 #include <signal.h>
    12 #include <ctype.h>
    13 #include <string.h>
    14 #include <strings.h>
    15 #include <stdlib.h>
    16 #include <stdio.h>
    17 
    1810#include "libbb.h"
    1911
    20 struct signal_name {
    21     const char *name;
    22     int number;
     12static const char signals[32][7] = {
     13    // SUSv3 says kill must support these, and specifies the numerical values,
     14    // http://www.opengroup.org/onlinepubs/009695399/utilities/kill.html
     15    // TODO: "[SIG]EXIT" shouldn't work for kill, right?
     16    // {0, "EXIT"}, {1, "HUP"}, {2, "INT"}, {3, "QUIT"},
     17    // {6, "ABRT"}, {9, "KILL"}, {14, "ALRM"}, {15, "TERM"}
     18    // And Posix adds the following:
     19    // {SIGILL, "ILL"}, {SIGTRAP, "TRAP"}, {SIGFPE, "FPE"}, {SIGUSR1, "USR1"},
     20    // {SIGSEGV, "SEGV"}, {SIGUSR2, "USR2"}, {SIGPIPE, "PIPE"}, {SIGCHLD, "CHLD"},
     21    // {SIGCONT, "CONT"}, {SIGSTOP, "STOP"}, {SIGTSTP, "TSTP"}, {SIGTTIN, "TTIN"},
     22    // {SIGTTOU, "TTOU"}
     23    [0] = "EXIT",
     24#ifdef SIGHUP
     25    [SIGHUP   ] = "HUP",
     26#endif
     27#ifdef SIGINT
     28    [SIGINT   ] = "INT",
     29#endif
     30#ifdef SIGQUIT
     31    [SIGQUIT  ] = "QUIT",
     32#endif
     33#ifdef SIGILL
     34    [SIGILL   ] = "ILL",
     35#endif
     36#ifdef SIGTRAP
     37    [SIGTRAP  ] = "TRAP",
     38#endif
     39#ifdef SIGABRT
     40    [SIGABRT  ] = "ABRT",
     41#endif
     42#ifdef SIGBUS
     43    [SIGBUS   ] = "BUS",
     44#endif
     45#ifdef SIGFPE
     46    [SIGFPE   ] = "FPE",
     47#endif
     48#ifdef SIGKILL
     49    [SIGKILL  ] = "KILL",
     50#endif
     51#ifdef SIGUSR1
     52    [SIGUSR1  ] = "USR1",
     53#endif
     54#ifdef SIGSEGV
     55    [SIGSEGV  ] = "SEGV",
     56#endif
     57#ifdef SIGUSR2
     58    [SIGUSR2  ] = "USR2",
     59#endif
     60#ifdef SIGPIPE
     61    [SIGPIPE  ] = "PIPE",
     62#endif
     63#ifdef SIGALRM
     64    [SIGALRM  ] = "ALRM",
     65#endif
     66#ifdef SIGTERM
     67    [SIGTERM  ] = "TERM",
     68#endif
     69#ifdef SIGSTKFLT
     70    [SIGSTKFLT] = "STKFLT",
     71#endif
     72#ifdef SIGCHLD
     73    [SIGCHLD  ] = "CHLD",
     74#endif
     75#ifdef SIGCONT
     76    [SIGCONT  ] = "CONT",
     77#endif
     78#ifdef SIGSTOP
     79    [SIGSTOP  ] = "STOP",
     80#endif
     81#ifdef SIGTSTP
     82    [SIGTSTP  ] = "TSTP",
     83#endif
     84#ifdef SIGTTIN
     85    [SIGTTIN  ] = "TTIN",
     86#endif
     87#ifdef SIGTTOU
     88    [SIGTTOU  ] = "TTOU",
     89#endif
     90#ifdef SIGURG
     91    [SIGURG   ] = "URG",
     92#endif
     93#ifdef SIGXCPU
     94    [SIGXCPU  ] = "XCPU",
     95#endif
     96#ifdef SIGXFSZ
     97    [SIGXFSZ  ] = "XFSZ",
     98#endif
     99#ifdef SIGVTALRM
     100    [SIGVTALRM] = "VTALRM",
     101#endif
     102#ifdef SIGPROF
     103    [SIGPROF  ] = "PROF",
     104#endif
     105#ifdef SIGWINCH
     106    [SIGWINCH ] = "WINCH",
     107#endif
     108#ifdef SIGPOLL
     109    [SIGPOLL  ] = "POLL",
     110#endif
     111#ifdef SIGPWR
     112    [SIGPWR   ] = "PWR",
     113#endif
     114#ifdef SIGSYS
     115    [SIGSYS   ] = "SYS",
     116#endif
    23117};
    24118
    25 static const struct signal_name signames[] = {
    26     /* POSIX signals */
    27     { "EXIT",       0 },            /* 0 */
    28     { "HUP",        SIGHUP },       /* 1 */
    29     { "INT",        SIGINT },       /* 2 */
    30     { "QUIT",       SIGQUIT },      /* 3 */
    31     { "ILL",        SIGILL },       /* 4 */
    32     { "ABRT",       SIGABRT },      /* 6 */
    33     { "FPE",        SIGFPE },       /* 8 */
    34     { "KILL",       SIGKILL },      /* 9 */
    35     { "SEGV",       SIGSEGV },      /* 11 */
    36     { "PIPE",       SIGPIPE },      /* 13 */
    37     { "ALRM",       SIGALRM },      /* 14 */
    38     { "TERM",       SIGTERM },      /* 15 */
    39     { "USR1",       SIGUSR1 },      /* 10 (arm,i386,m68k,ppc), 30 (alpha,sparc*), 16 (mips) */
    40     { "USR2",       SIGUSR2 },      /* 12 (arm,i386,m68k,ppc), 31 (alpha,sparc*), 17 (mips) */
    41     { "CHLD",       SIGCHLD },      /* 17 (arm,i386,m68k,ppc), 20 (alpha,sparc*), 18 (mips) */
    42     { "CONT",       SIGCONT },      /* 18 (arm,i386,m68k,ppc), 19 (alpha,sparc*), 25 (mips) */
    43     { "STOP",       SIGSTOP },      /* 19 (arm,i386,m68k,ppc), 17 (alpha,sparc*), 23 (mips) */
    44     { "TSTP",       SIGTSTP },      /* 20 (arm,i386,m68k,ppc), 18 (alpha,sparc*), 24 (mips) */
    45     { "TTIN",       SIGTTIN },      /* 21 (arm,i386,m68k,ppc,alpha,sparc*), 26 (mips) */
    46     { "TTOU",       SIGTTOU },      /* 22 (arm,i386,m68k,ppc,alpha,sparc*), 27 (mips) */
    47     /* Miscellaneous other signals */
    48 #ifdef SIGTRAP
    49     { "TRAP",       SIGTRAP },      /* 5 */
     119// Convert signal name to number.
     120
     121int get_signum(const char *name)
     122{
     123    int i;
     124
     125    i = bb_strtou(name, NULL, 10);
     126    if (!errno)
     127        return i;
     128    if (strncasecmp(name, "SIG", 3) == 0)
     129        name += 3;
     130    for (i = 0; i < ARRAY_SIZE(signals); i++)
     131        if (strcasecmp(name, signals[i]) == 0)
     132            return i;
     133
     134#if ENABLE_DESKTOP && (defined(SIGIOT) || defined(SIGIO))
     135    /* These are aliased to other names */
     136    if ((name[0] | 0x20) == 'i' && (name[1] | 0x20) == 'o') {
     137#ifdef SIGIO
     138        if (!name[2])
     139            return SIGIO;
    50140#endif
    51141#ifdef SIGIOT
    52     { "IOT",        SIGIOT },       /* 6, same as SIGABRT */
     142        if ((name[2] | 0x20) == 't' && !name[3])
     143            return SIGIOT;
    53144#endif
    54 #ifdef SIGEMT
    55     { "EMT",        SIGEMT },       /* 7 (mips,alpha,sparc*) */
     145    }
    56146#endif
    57 #ifdef SIGBUS
    58     { "BUS",        SIGBUS },       /* 7 (arm,i386,m68k,ppc), 10 (mips,alpha,sparc*) */
    59 #endif
    60 #ifdef SIGSYS
    61     { "SYS",        SIGSYS },       /* 12 (mips,alpha,sparc*) */
    62 #endif
    63 #ifdef SIGSTKFLT
    64     { "STKFLT",     SIGSTKFLT },    /* 16 (arm,i386,m68k,ppc) */
    65 #endif
    66 #ifdef SIGURG
    67     { "URG",        SIGURG },       /* 23 (arm,i386,m68k,ppc), 16 (alpha,sparc*), 21 (mips) */
    68 #endif
    69 #ifdef SIGIO
    70     { "IO",         SIGIO },        /* 29 (arm,i386,m68k,ppc), 23 (alpha,sparc*), 22 (mips) */
    71 #endif
    72 #ifdef SIGPOLL
    73     { "POLL",       SIGPOLL },      /* same as SIGIO */
    74 #endif
    75 #ifdef SIGCLD
    76     { "CLD",        SIGCLD },       /* same as SIGCHLD (mips) */
    77 #endif
    78 #ifdef SIGXCPU
    79     { "XCPU",       SIGXCPU },      /* 24 (arm,i386,m68k,ppc,alpha,sparc*), 30 (mips) */
    80 #endif
    81 #ifdef SIGXFSZ
    82     { "XFSZ",       SIGXFSZ },      /* 25 (arm,i386,m68k,ppc,alpha,sparc*), 31 (mips) */
    83 #endif
    84 #ifdef SIGVTALRM
    85     { "VTALRM",     SIGVTALRM },    /* 26 (arm,i386,m68k,ppc,alpha,sparc*), 28 (mips) */
    86 #endif
    87 #ifdef SIGPROF
    88     { "PROF",       SIGPROF },      /* 27 (arm,i386,m68k,ppc,alpha,sparc*), 29 (mips) */
    89 #endif
    90 #ifdef SIGPWR
    91     { "PWR",        SIGPWR },       /* 30 (arm,i386,m68k,ppc), 29 (alpha,sparc*), 19 (mips) */
    92 #endif
    93 #ifdef SIGINFO
    94     { "INFO",       SIGINFO },      /* 29 (alpha) */
    95 #endif
    96 #ifdef SIGLOST
    97     { "LOST",       SIGLOST },      /* 29 (arm,i386,m68k,ppc,sparc*) */
    98 #endif
    99 #ifdef SIGWINCH
    100     { "WINCH",      SIGWINCH },     /* 28 (arm,i386,m68k,ppc,alpha,sparc*), 20 (mips) */
    101 #endif
    102 #ifdef SIGUNUSED
    103     { "UNUSED",     SIGUNUSED },    /* 31 (arm,i386,m68k,ppc) */
    104 #endif
    105     {0, 0}
    106 };
    107147
    108 /*
    109     if str_sig == NULL returned signal name [*signo],
    110     if str_sig != NULL - set *signo from signal_name,
    111         findings with digit number or with or without SIG-prefix name
     148    return -1;
     149}
    112150
    113     if startnum=0 flag for support finding zero signal,
    114         but str_sig="0" always found, (hmm - standart or realize?)
    115     if startnum<0 returned reverse signal_number  <-> signal_name
    116     if found error - returned NULL
     151// Convert signal number to name
    117152
    118 */
     153const char *get_signame(int number)
     154{
     155    if ((unsigned)number < ARRAY_SIZE(signals)) {
     156        if (signals[number][0]) /* if it's not an empty str */
     157            return signals[number];
     158    }
    119159
    120 const char *
    121 u_signal_names(const char *str_sig, int *signo, int startnum)
    122 {
    123     static char retstr[16];
    124     const struct signal_name *s = signames;
    125     static const char prefix[] = "SIG";
    126     const char *sptr;
    127 
    128     if(startnum)
    129         s++;
    130     if(str_sig==NULL) {
    131         while (s->name != 0) {
    132             if(s->number == *signo)
    133                 break;
    134             s++;
    135         }
    136     } else {
    137         if (isdigit(((unsigned char)*str_sig))) {
    138             char *endp;
    139             long int sn = strtol(str_sig, &endp, 10);
    140             /* test correct and overflow */
    141             if(*endp == 0 && sn >= 0 && sn < NSIG) {
    142                 *signo = (int)sn;
    143                 /* test for unnamed */
    144                 sptr = u_signal_names(0, signo, 0);
    145                 if(sptr==NULL)
    146                     return NULL;
    147                 if(sn!=0)
    148                     sptr += 3;
    149                 return sptr;
    150             }
    151         } else {
    152             sptr = str_sig;
    153             while (s->name != 0) {
    154                 if (strcasecmp(s->name, sptr) == 0) {
    155                     *signo = s->number;
    156                     if(startnum<0) {
    157                         sprintf(retstr, "%d", *signo);
    158                         return retstr;
    159                     }
    160                     break;
    161                 }
    162                 if(s!=signames && sptr == str_sig &&
    163                         strncasecmp(sptr, prefix, 3) == 0) {
    164                     sptr += 3;      /* strlen(prefix) */
    165                     continue;
    166                 }
    167                 sptr = str_sig;
    168                 s++;
    169             }
    170         }
    171     }
    172     if(s->name==0)
    173         return NULL;
    174     if(s!=signames)
    175         strcpy(retstr, prefix);
    176      else
    177         retstr[0] = 0;
    178     return strcat(retstr, s->name);
     160    return itoa(number);
    179161}
Note: See TracChangeset for help on using the changeset viewer.