Module Name: src
Committed By: kre
Date: Thu Aug 20 22:56:56 UTC 2020
Modified Files:
src/lib/libc/gen: signalname.3 signalnumber.c
Log Message:
When not compiling -DSMALL permit use of names RTMIN[+n] and RTMAX[-n]
(where n is a decimal integer in the range [0 .. SIGRTMAX-SIGRTMIN].
As usual a leading "sig" is ignored and the strings are case independent.
Some implementations do not name the real time signals, and using
labels like RTMIN+3 can be the only way they can be manipulated,
so allow that technique (we still return the RTnn names on the inverse
translation though).
Because this is used by both kill(1) and sh(1) the kill and trap
commands both gain access to the new notation (when !SMALL).
To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/lib/libc/gen/signalname.3 \
src/lib/libc/gen/signalnumber.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/lib/libc/gen/signalname.3
diff -u src/lib/libc/gen/signalname.3:1.2 src/lib/libc/gen/signalname.3:1.3
--- src/lib/libc/gen/signalname.3:1.2 Sun May 14 12:35:46 2017
+++ src/lib/libc/gen/signalname.3 Thu Aug 20 22:56:56 2020
@@ -1,4 +1,4 @@
-.\" $NetBSD: signalname.3,v 1.2 2017/05/14 12:35:46 wiz Exp $
+.\" $NetBSD: signalname.3,v 1.3 2020/08/20 22:56:56 kre Exp $
.\"
.\" Available to all and sundry, without restriction on use, or other
.\" limitations, and without fee. Also without any warranty of fitness
@@ -76,6 +76,17 @@ prefix in
.Fa name
is ignored.
.Pp
+This implementation also accepts
+.Dv rtmax Ns \&[\-n]
+and
+.Dv rtmin Ns \&[+n]
+.Po
+where the optional
+.Ar n
+is a decimal integer between 0 and SIGRTMAX\-SIGRTMIN
+.Pc
+to refer to the real time signals.
+.Pp
The
.Fn signalnumber
function returns the signal number,
@@ -93,7 +104,8 @@ signal number.
.Pp
The
.Fn signalnext
-function returns minus one (\-1) on error, if the given signal
+function returns minus one (\-1) on error,
+that is, if the given signal
.Fa sig
is neither a valid signal number nor zero.
It returns zero when the input signal number,
Index: src/lib/libc/gen/signalnumber.c
diff -u src/lib/libc/gen/signalnumber.c:1.2 src/lib/libc/gen/signalnumber.c:1.3
--- src/lib/libc/gen/signalnumber.c:1.2 Thu Jan 4 20:57:29 2018
+++ src/lib/libc/gen/signalnumber.c Thu Aug 20 22:56:56 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: signalnumber.c,v 1.2 2018/01/04 20:57:29 kamil Exp $ */
+/* $NetBSD: signalnumber.c,v 1.3 2020/08/20 22:56:56 kre Exp $ */
/*
* Software available to all and sundry without limitations
@@ -20,7 +20,9 @@
#include "namespace.h"
#include <signal.h>
+#include <stdlib.h>
#include <string.h>
+#include <ctype.h>
/*
* signalnumber()
@@ -42,6 +44,10 @@ int
signalnumber(const char *name)
{
int i;
+#ifndef SMALL
+ long offs;
+ char *ep;
+#endif
if (strncasecmp(name, "sig", 3) == 0)
name += 3;
@@ -50,5 +56,36 @@ signalnumber(const char *name)
if (sys_signame[i] != NULL &&
strcasecmp(name, sys_signame[i]) == 0)
return i;
+
+#ifndef SMALL
+ if (strncasecmp(name, "rtm", 3) == 0) {
+ name += 3;
+ if (strncasecmp(name, "ax", 2) == 0)
+ i = SIGRTMAX;
+ else if (strncasecmp(name, "in", 2) == 0)
+ i = SIGRTMIN;
+ else
+ return 0;
+ name += 2;
+ if (name[0] == '\0')
+ return i;
+ if (i == SIGRTMAX && name[0] != '-')
+ return 0;
+ if (i == SIGRTMIN && name[0] != '+')
+ return 0;
+ if (!isdigit((unsigned char)name[1]))
+ return 0;
+ offs = strtol(name+1, &ep, 10);
+ if (ep == name+1 || *ep != '\0' ||
+ offs < 0 || offs > SIGRTMAX-SIGRTMIN)
+ return 0;
+ if (name[0] == '+')
+ i += (int)offs;
+ else
+ i -= (int)offs;
+ if (i >= SIGRTMIN && i <= SIGRTMAX)
+ return i;
+ }
+#endif
return 0;
}