fix recognitions of -SIGname signals
authorDenis Vlasenko <vda.linux@googlemail.com>
Sat, 23 Dec 2006 01:06:21 +0000 (01:06 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Sat, 23 Dec 2006 01:06:21 +0000 (01:06 -0000)
(fix by Jacques LUDER <jacques.luder@thalesgroup.com>)

libbb/u_signal_names.c
procps/fuser.c

index 88311dd9cc84b42b9d4b24e06e7abaf8777ab4fb..eb835e93632f84b89ae3a70e62806ee02975ca05 100644 (file)
@@ -15,7 +15,8 @@ static const struct signal_name {
 } signals[] = {
        // SUSv3 says kill must support these, and specifies the numerical values,
        // http://www.opengroup.org/onlinepubs/009695399/utilities/kill.html
-       {0, "0"}, {1, "HUP"}, {2, "INT"}, {3, "QUIT"}, {6, "ABRT"}, {9, "KILL"},
+       // TODO: "[SIG]EXIT" shouldn't work for kill, right?
+       {0, "EXIT"}, {1, "HUP"}, {2, "INT"}, {3, "QUIT"}, {6, "ABRT"}, {9, "KILL"},
        {14, "ALRM"}, {15, "TERM"},
        // And Posix adds the following:
        {SIGILL, "ILL"}, {SIGTRAP, "TRAP"}, {SIGFPE, "FPE"}, {SIGUSR1, "USR1"},
@@ -30,13 +31,13 @@ int get_signum(const char *name)
 {
        int i;
 
-       i = atoi(name);
-       if (i) return i;
+       i = bb_strtou(name, NULL, 10);
+       if (!errno) return i;
        for (i = 0; i < sizeof(signals) / sizeof(struct signal_name); i++)
-               if (!strcasecmp(signals[i].name, name) ||
-                       (!strncasecmp(signals[i].name, "SIG", 3)
-                                && !strcasecmp(signals[i].name+3, signals[i].name)))
-                                       return signals[i].number;
+               if (strcasecmp(name, signals[i].name) == 0
+                || (strncasecmp(name, "SIG", 3) == 0
+                    && strcasecmp(&name[3], signals[i].name) == 0))
+                               return signals[i].number;
        return -1;
 }
 
index 4628cdf5c2e5f512bbe9188f908bdc414534851d..a216eaec89e4fc60d6464bdbd99833286a8b772a 100644 (file)
@@ -323,7 +323,8 @@ int fuser_main(int argc, char **argv)
                optn = fuser_option(argv[i]);
                if(optn) opt |= optn;
                else if(argv[i][0] == '-') {
-                       if(0>(killsig = get_signum(argv[i]+1)))
+                       killsig = get_signum(argv[i]+1);
+                       if(0 > killsig)
                                killsig = SIGTERM;
                }
                else {