summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2010-12-30 01:17:03 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2010-12-30 01:17:03 +0100
commit2753aae0e8728f527bedf103b1207857b7c3e151 (patch)
tree81a721b4e9aa1884e0f25db7e0310b7c6037bc62
parent90615a0c5c326fa3cf78fc719f7b16207f47395a (diff)
libbb: optionally support RTMIN[+n] and RTMAX[-n] signal names
function old new delta get_signum 140 336 +196 __libc_allocate_rtsig - 56 +56 __libc_current_sigrtmin - 6 +6 __libc_current_sigrtmax - 6 +6 current_rtmin - 4 +4 current_rtmax - 4 +4 bbconfig_config_bz2 4961 4962 +1 ------------------------------------------------------------------------------ (add/remove: 6/0 grow/shrink: 2/0 up/down: 273/0) Total: 273 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--libbb/Config.src2
-rw-r--r--libbb/u_signal_names.c42
2 files changed, 38 insertions, 6 deletions
diff --git a/libbb/Config.src b/libbb/Config.src
index f6c7a11ea..85892d3fe 100644
--- a/libbb/Config.src
+++ b/libbb/Config.src
@@ -135,7 +135,7 @@ config FEATURE_NON_POSIX_CP
and create a regular file. This does not conform to POSIX,
but prevents a symlink attack.
Similarly, "cp file device" will not send file's data
- to the device.
+ to the device. (To do that, use "cat file >device")
config FEATURE_VERBOSE_CP_MESSAGE
bool "Give more precise messages when copy fails (cp, mv etc)"
diff --git a/libbb/u_signal_names.c b/libbb/u_signal_names.c
index 9263859f5..53ccdd1a7 100644
--- a/libbb/u_signal_names.c
+++ b/libbb/u_signal_names.c
@@ -7,6 +7,13 @@
* Licensed under GPLv2 or later, see file LICENSE in this source tree.
*/
+//config:config FEATURE_RTMINMAX
+//config: bool "Support RTMIN[+n] and RTMAX[-n] signal names"
+//config: default y
+//config: help
+//config: Support RTMIN[+n] and RTMAX[-n] signal names
+//config: in kill, killall etc. This costs ~250 bytes.
+
#include "libbb.h"
/* Believe it or not, but some arches have more than 32 SIGs!
@@ -134,20 +141,45 @@ int FAST_FUNC get_signum(const char *name)
if (strcasecmp(name, signals[i]) == 0)
return i;
-#if ENABLE_DESKTOP && (defined(SIGIOT) || defined(SIGIO))
+#if ENABLE_DESKTOP
+# if defined(SIGIOT) || defined(SIGIO)
/* SIGIO[T] are aliased to other names,
* thus cannot be stored in the signals[] array.
* Need special code to recognize them */
if ((name[0] | 0x20) == 'i' && (name[1] | 0x20) == 'o') {
-#ifdef SIGIO
+# ifdef SIGIO
if (!name[2])
return SIGIO;
-#endif
-#ifdef SIGIOT
+# endif
+# ifdef SIGIOT
if ((name[2] | 0x20) == 't' && !name[3])
return SIGIOT;
-#endif
+# endif
+ }
+# endif
+#endif
+
+#if ENABLE_FEATURE_RTMINMAX
+# if defined(SIGRTMIN) && defined(SIGRTMAX)
+ if (strncasecmp(name, "RTMAX", 5) == 0) {
+ if (!name[5])
+ return SIGRTMAX;
+ if (name[5] == '-') {
+ i = bb_strtou(name + 6, NULL, 10);
+ if (!errno && i <= SIGRTMAX - SIGRTMIN)
+ return SIGRTMAX - i;
+ }
+ }
+ if (strncasecmp(name, "RTMIN", 5) == 0) {
+ if (!name[5])
+ return SIGRTMIN;
+ if (name[5] == '+') {
+ i = bb_strtou(name + 6, NULL, 10);
+ if (!errno && i <= SIGRTMAX - SIGRTMIN)
+ return SIGRTMIN + i;
+ }
}
+# endif
#endif
return -1;