Skip to content

Commit 2aa05b1

Browse files
committed
Simplify signal code
1 parent 880edf0 commit 2aa05b1

File tree

1 file changed

+30
-49
lines changed

1 file changed

+30
-49
lines changed

signal.c

Lines changed: 30 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,9 @@
88

99
#include "common.h"
1010

11-
#define ENTRY(e) { (e), #e }
12-
#define ENTRY_RT(e, n) (struct signal_entry){ (e), (n) };
11+
#define ENTRY(e) [e] = #e
1312

14-
struct signal_entry {
15-
int number;
16-
char *name;
17-
} static sig[] = {
13+
static char sig[_NSIG][16] = {
1814
ENTRY(SIGHUP),
1915
ENTRY(SIGINT),
2016
ENTRY(SIGQUIT),
@@ -50,57 +46,49 @@ struct signal_entry {
5046
ENTRY(SIGSYS),
5147
};
5248

53-
static void print_signal(struct signal_entry *s)
49+
50+
static void sig_rt_init(void)
51+
{
52+
int i;
53+
54+
for (i = SIGRTMIN; i <= SIGRTMAX; i++)
55+
snprintf(sig[i], sizeof(sig[i]), "SIGRT + %d", i - SIGRTMIN);
56+
}
57+
58+
static void print_signal(int number)
5459
{
60+
if (sig[number][0] == '\0') {
61+
log("unknown signal %d\n", number);
62+
return;
63+
}
64+
5565
#if __GLIBC_PREREQ(2, 32)
56-
log("%-11s %2d %-25s %-8s %-25s\n", s->name, s->number,
57-
strsignal(s->number), sigabbrev_np(s->number), sigdescr_np(s->number));
66+
log("%-11s %2d %-25s %-8s %-25s\n", sig[number], number,
67+
strsignal(number), sigabbrev_np(number), sigdescr_np(number));
5868
#else
59-
log("%-11s %2d %-25s\n", s->name, s->number, strsignal(s->number));
60-
69+
log("%-11s %2d %-25s\n", sig[number], number, strsignal(number));
6170
#endif
6271
}
6372

6473
int main(int argc, char *argv[])
6574
{
66-
/*
67-
* SIGRTMIN and SIGRTMAX are defined as __libc_current_sigrtmin()
68-
* and __libc_current_sigrtmax() respecively hence separate sig_rt
69-
* array.
70-
*/
71-
struct signal_entry sig_rt[SIGRTMAX - SIGRTMIN + 1];
72-
struct signal_entry *e;
75+
int i;
7376
char *endptr;
7477
long val;
7578

76-
for (e = ARRAY_BEGIN(sig_rt); e < ARRAY_END(sig_rt); e++) {
77-
char *name;
78-
79-
/* yes, this is a leak */
80-
name = malloc(32);
81-
82-
snprintf(name, 32, "SIGRT + %td", e - ARRAY_BEGIN(sig_rt));
83-
*e = ENTRY_RT(SIGRTMIN + e - ARRAY_BEGIN(sig_rt), name);
84-
}
79+
sig_rt_init();
8580

8681
if (argc == 1) {
87-
for (e = ARRAY_BEGIN(sig); e < ARRAY_END(sig); e++)
88-
print_signal(e);
89-
90-
for (e = ARRAY_BEGIN(sig_rt); e < ARRAY_END(sig_rt); e++)
91-
print_signal(e);
82+
for (i = 0; i < ARRAY_SIZE(sig); i++)
83+
print_signal(i);
9284

9385
return 0;
9486
}
9587

9688
if (argv[1][0] == 'S') {
97-
for (e = ARRAY_BEGIN(sig); e < ARRAY_END(sig); e++)
98-
if (!strncmp(e->name, argv[1], strlen(argv[1])))
99-
print_signal(e);
100-
101-
for (e = ARRAY_BEGIN(sig_rt); e < ARRAY_END(sig_rt); e++)
102-
if (!strncmp(e->name, argv[1], strlen(argv[1])))
103-
print_signal(e);
89+
for (i = 0; i < ARRAY_SIZE(sig); i++)
90+
if (!strncmp(sig[i], argv[1], strlen(argv[1])))
91+
print_signal(i);
10492

10593
return 0;
10694
}
@@ -113,16 +101,9 @@ int main(int argc, char *argv[])
113101
if (endptr == argv[1])
114102
die("not a number: %s\n", argv[1]);
115103

116-
for (e = ARRAY_BEGIN(sig); e < ARRAY_END(sig); e++) {
117-
if (e->number == val) {
118-
print_signal(e);
119-
return 0;
120-
}
121-
}
122-
123-
for (e = ARRAY_BEGIN(sig_rt); e < ARRAY_END(sig_rt); e++) {
124-
if (e->number == val) {
125-
print_signal(e);
104+
for (i = 0; i < ARRAY_SIZE(sig); i++) {
105+
if (i == val) {
106+
print_signal(i);
126107
return 0;
127108
}
128109
}

0 commit comments

Comments
 (0)