kill, whether implemented as a builtin or an external command, supports
signal numbers and signal names. As an extension to POSIX, signal names
may be prefixed with "SIG". Both /bin/kill and the kill ksh builtin
attempt to do that, but the test in ksh is flawed.
The minimal diff below fixes that.
Index: trap.c
===================================================================
RCS file: /d/cvs/src/bin/ksh/trap.c,v
retrieving revision 1.32
diff -u -p -p -u -r1.32 trap.c
--- trap.c 15 Mar 2018 16:51:29 -0000 1.32
+++ trap.c 8 Dec 2018 11:02:12 -0000
@@ -97,13 +97,13 @@ gettrap(const char *name, int igncase)
if (igncase) {
if (p->name && (!strcasecmp(p->name, name) ||
(strlen(name) > 3 && !strncasecmp("SIG",
- p->name, 3) &&
+ name, 3) &&
!strcasecmp(p->name, name + 3))))
return p;
} else {
if (p->name && (!strcmp(p->name, name) ||
(strlen(name) > 3 && !strncmp("SIG",
- p->name, 3) && !strcmp(p->name, name + 3))))
+ name, 3) && !strcmp(p->name, name + 3))))
return p;
}
}
Alternately, if you find that code a bit obfuscated, please find below
a version I find less redundant and more readable.
Looking for oks, preferably for the second version.
Index: trap.c
===================================================================
RCS file: /d/cvs/src/bin/ksh/trap.c,v
retrieving revision 1.32
diff -u -p -p -u -r1.32 trap.c
--- trap.c 15 Mar 2018 16:51:29 -0000 1.32
+++ trap.c 8 Dec 2018 11:03:46 -0000
@@ -92,20 +92,18 @@ gettrap(const char *name, int igncase)
return &sigtraps[n];
return NULL;
}
+
+ if (igncase && strncasecmp(name, "SIG", 3) == 0)
+ name += 3;
+ if (!igncase && strncmp(name, "SIG", 3) == 0)
+ name += 3;
+
for (p = sigtraps, i = NSIG+1; --i >= 0; p++)
if (p->name) {
- if (igncase) {
- if (p->name && (!strcasecmp(p->name, name) ||
- (strlen(name) > 3 && !strncasecmp("SIG",
- p->name, 3) &&
- !strcasecmp(p->name, name + 3))))
- return p;
- } else {
- if (p->name && (!strcmp(p->name, name) ||
- (strlen(name) > 3 && !strncmp("SIG",
- p->name, 3) && !strcmp(p->name, name + 3))))
- return p;
- }
+ if (igncase && strcasecmp(p->name, name) == 0)
+ return p;
+ if (!igncase && strcmp(p->name, name) == 0)
+ return p;
}
return NULL;
}
--
jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF DDCC 0DFA 74AE 1524 E7EE