From: Karel Zak Date: Mon, 28 Feb 2011 12:43:28 +0000 (+0100) Subject: kill: add support for real-time signals X-Git-Tag: v2.20-rc1~505 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ae63d823abc33554ee1d3906a876734277293557;p=thirdparty%2Futil-linux.git kill: add support for real-time signals Newly supported syntax for RT signals: RT = SIGRTMIN + n RTMIN+ = SIGRTMIN + n RTMAX- = SIGRTMAX - n the final signal number has to be in interval [SIGRTMIN,SIGRTMAX]. Note that the "SIG" prefix is also supported for RT signals of course. Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=676297 Signed-off-by: Karel Zak --- diff --git a/misc-utils/kill.c b/misc-utils/kill.c index 61e61a321f..e975d57ab1 100644 --- a/misc-utils/kill.c +++ b/misc-utils/kill.c @@ -279,6 +279,35 @@ int main (int argc, char *argv[]) return (errors); } +#ifdef SIGRTMIN +int rtsig_to_signum(char *sig) +{ + int num, maxi = 0; + char *ep = NULL; + + if (strncasecmp(sig, "min+", 4) == 0) + sig += 4; + else if (strncasecmp(sig, "max-", 4) == 0) { + sig += 4; + maxi = 1; + } + + if (!isdigit(*sig)) + return -1; + + errno = 0; + num = strtol(sig, &ep, 10); + if (!ep || sig == ep || errno || num < 0) + return -1; + + num = maxi ? SIGRTMAX - num : SIGRTMIN + num; + + if (num < SIGRTMIN || num > SIGRTMAX) + return -1; + + return num; +} +#endif int signame_to_signum (char *sig) { @@ -286,6 +315,13 @@ int signame_to_signum (char *sig) if (! strncasecmp (sig, "sig", 3)) sig += 3; + +#ifdef SIGRTMIN + /* RT signals */ + if (!strncasecmp(sig, "rt", 2)) + return rtsig_to_signum(sig + 2); +#endif + /* Normal sugnals */ for (n = 0; n < ARRAY_SIZE(sys_signame); n++) { if (! strcasecmp (sys_signame[n].name, sig)) return sys_signame[n].val; @@ -343,6 +379,9 @@ void printsignals (FILE *fp) lpos += lth; fputs (sys_signame[n].name, fp); } +#ifdef SIGRTMIN + fputs (" RT RTMIN+ RTMAX-", fp); +#endif fputc ('\n', fp); }