libbb: move nuke_str() from passwd into libbb
[oweals/busybox.git] / libbb / u_signal_names.c
index 53ccdd1a7fe3dff6fe8628788ff3f98f0f1e92d5..8c78f5e20c88026b223b9e33b42ff39fe7811169 100644 (file)
@@ -124,6 +124,16 @@ static const char signals[][7] = {
 #ifdef SIGSYS
        [SIGSYS   ] = "SYS",
 #endif
+#if ENABLE_FEATURE_RTMINMAX
+# ifdef __SIGRTMIN
+       [__SIGRTMIN] = "RTMIN",
+# endif
+// This makes array about x2 bigger.
+// More compact approach is to special-case SIGRTMAX in print_signames()
+//# ifdef __SIGRTMAX
+//     [__SIGRTMAX] = "RTMAX",
+//# endif
+#endif
 };
 
 // Convert signal name to number.
@@ -161,22 +171,31 @@ int FAST_FUNC get_signum(const char *name)
 
 #if ENABLE_FEATURE_RTMINMAX
 # if defined(SIGRTMIN) && defined(SIGRTMAX)
-       if (strncasecmp(name, "RTMAX", 5) == 0) {
+/* libc may use some rt sigs for pthreads and therefore "remap" SIGRTMIN/MAX,
+ * but we want to use "raw" SIGRTMIN/MAX. Underscored names, if exist, provide
+ * them. If they don't exist, fall back to non-underscored ones: */
+#  if !defined(__SIGRTMIN)
+#   define __SIGRTMIN SIGRTMIN
+#  endif
+#  if !defined(__SIGRTMAX)
+#   define __SIGRTMAX SIGRTMAX
+#  endif
+       if (strncasecmp(name, "RTMIN", 5) == 0) {
                if (!name[5])
-                       return SIGRTMAX;
-               if (name[5] == '-') {
+                       return __SIGRTMIN;
+               if (name[5] == '+') {
                        i = bb_strtou(name + 6, NULL, 10);
-                       if (!errno && i <= SIGRTMAX - SIGRTMIN)
-                               return SIGRTMAX - i;
+                       if (!errno && i <= __SIGRTMAX - __SIGRTMIN)
+                               return __SIGRTMIN + i;
                }
        }
-       if (strncasecmp(name, "RTMIN", 5) == 0) {
+       else if (strncasecmp(name, "RTMAX", 5) == 0) {
                if (!name[5])
-                       return SIGRTMIN;
-               if (name[5] == '+') {
+                       return __SIGRTMAX;
+               if (name[5] == '-') {
                        i = bb_strtou(name + 6, NULL, 10);
-                       if (!errno && i <= SIGRTMAX - SIGRTMIN)
-                               return SIGRTMIN + i;
+                       if (!errno && i <= __SIGRTMAX - __SIGRTMIN)
+                               return __SIGRTMAX - i;
                }
        }
 # endif
@@ -207,6 +226,11 @@ void FAST_FUNC print_signames(void)
        for (signo = 1; signo < ARRAY_SIZE(signals); signo++) {
                const char *name = signals[signo];
                if (name[0])
-                       puts(name);
+                       printf("%2u) %s\n", signo, name);
        }
+#if ENABLE_FEATURE_RTMINMAX
+# ifdef __SIGRTMAX
+       printf("%2u) %s\n", __SIGRTMAX, "RTMAX");
+# endif
+#endif
 }