builtin: Align test -nt and -ot with POSIX.1-2024
[dash.git] / src / mksignames.c
blob192728b44efa96951c60d4f5225afe6175960069
1 /* signames.c -- Create and write `signames.c', which contains an array of
2 signal names. */
4 /* Copyright (C) 1992 Free Software Foundation, Inc.
6 This file is part of GNU Bash, the Bourne Again SHell.
8 Bash is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 2, or (at your option) any later
11 version.
13 Bash is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 for more details.
18 You should have received a copy of the GNU General Public License along
19 with Bash; see the file COPYING. If not, write to the Free Software
20 Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
22 #include <stdio.h>
23 #include <sys/types.h>
24 #include <signal.h>
25 #include <stdlib.h>
27 #if !defined (NSIG)
28 # define NSIG 64
29 #endif
32 * Special traps:
33 * EXIT == 0
35 #define LASTSIG NSIG-1
37 char *signal_names[2 * NSIG + 3];
39 #define signal_names_size (sizeof(signal_names)/sizeof(signal_names[0]))
41 char *progname;
43 /* AIX 4.3 defines SIGRTMIN and SIGRTMAX as 888 and 999 respectively.
44 I don't want to allocate so much unused space for the intervening signal
45 numbers, so we just punt if SIGRTMAX is past the bounds of the
46 signal_names array (handled in configure). */
47 #if defined (SIGRTMAX) && defined (UNUSABLE_RT_SIGNALS)
48 # undef SIGRTMAX
49 # undef SIGRTMIN
50 #endif
52 #if defined (SIGRTMAX) || defined (SIGRTMIN)
53 # define RTLEN 14
54 # define RTLIM 256
55 #endif
57 void
58 initialize_signames ()
60 register int i;
61 #if defined (SIGRTMAX) || defined (SIGRTMIN)
62 int rtmin, rtmax, rtcnt;
63 #endif
65 for (i = 1; i < signal_names_size; i++)
66 signal_names[i] = (char *)NULL;
68 /* `signal' 0 is what we do on exit. */
69 signal_names[0] = "EXIT";
71 /* Place signal names which can be aliases for more common signal
72 names first. This allows (for example) SIGABRT to overwrite SIGLOST. */
74 /* POSIX 1003.1b-1993 real time signals, but take care of incomplete
75 implementations. Acoording to the standard, both, SIGRTMIN and
76 SIGRTMAX must be defined, SIGRTMIN must be stricly less than
77 SIGRTMAX, and the difference must be at least 7, that is, there
78 must be at least eight distinct real time signals. */
80 /* The generated signal names are SIGRTMIN, SIGRTMIN+1, ...,
81 SIGRTMIN+x, SIGRTMAX-x, ..., SIGRTMAX-1, SIGRTMAX. If the number
82 of RT signals is odd, there is an extra SIGRTMIN+(x+1).
83 These names are the ones used by ksh and /usr/xpg4/bin/sh on SunOS5. */
85 #if defined (SIGRTMIN)
86 rtmin = SIGRTMIN;
87 signal_names[rtmin] = "RTMIN";
88 #endif
90 #if defined (SIGRTMAX)
91 rtmax = SIGRTMAX;
92 signal_names[rtmax] = "RTMAX";
93 #endif
95 #if defined (SIGRTMAX) && defined (SIGRTMIN)
96 if (rtmax > rtmin)
98 rtcnt = (rtmax - rtmin - 1) / 2;
99 /* croak if there are too many RT signals */
100 if (rtcnt >= RTLIM/2)
102 rtcnt = RTLIM/2-1;
103 fprintf(stderr, "%s: error: more than %i real time signals, fix `%s'\n",
104 progname, RTLIM, progname);
107 for (i = 1; i <= rtcnt; i++)
109 signal_names[rtmin+i] = (char *)malloc(RTLEN);
110 if (signal_names[rtmin+i])
111 sprintf (signal_names[rtmin+i], "RTMIN+%d", i);
112 signal_names[rtmax-i] = (char *)malloc(RTLEN);
113 if (signal_names[rtmax-i])
114 sprintf (signal_names[rtmax-i], "RTMAX-%d", i);
117 if (rtcnt < RTLIM/2-1 && rtcnt != (rtmax-rtmin)/2)
119 /* Need an extra RTMIN signal */
120 signal_names[rtmin+rtcnt+1] = (char *)malloc(RTLEN);
121 if (signal_names[rtmin+rtcnt+1])
122 sprintf (signal_names[rtmin+rtcnt+1], "RTMIN+%d", rtcnt+1);
125 #endif /* SIGRTMIN && SIGRTMAX */
127 /* AIX */
128 #if defined (SIGLOST) /* resource lost (eg, record-lock lost) */
129 signal_names[SIGLOST] = "LOST";
130 #endif
132 #if defined (SIGMSG) /* HFT input data pending */
133 signal_names[SIGMSG] = "MSG";
134 #endif
136 #if defined (SIGDANGER) /* system crash imminent */
137 signal_names[SIGDANGER] = "DANGER";
138 #endif
140 #if defined (SIGMIGRATE) /* migrate process to another CPU */
141 signal_names[SIGMIGRATE] = "MIGRATE";
142 #endif
144 #if defined (SIGPRE) /* programming error */
145 signal_names[SIGPRE] = "PRE";
146 #endif
148 #if defined (SIGVIRT) /* AIX virtual time alarm */
149 signal_names[SIGVIRT] = "VIRT";
150 #endif
152 #if defined (SIGALRM1) /* m:n condition variables */
153 signal_names[SIGALRM1] = "ALRM1";
154 #endif
156 #if defined (SIGWAITING) /* m:n scheduling */
157 signal_names[SIGWAITING] = "WAITING";
158 #endif
160 #if defined (SIGGRANT) /* HFT monitor mode granted */
161 signal_names[SIGGRANT] = "GRANT";
162 #endif
164 #if defined (SIGKAP) /* keep alive poll from native keyboard */
165 signal_names[SIGKAP] = "KAP";
166 #endif
168 #if defined (SIGRETRACT) /* HFT monitor mode retracted */
169 signal_names[SIGRETRACT] = "RETRACT";
170 #endif
172 #if defined (SIGSOUND) /* HFT sound sequence has completed */
173 signal_names[SIGSOUND] = "SOUND";
174 #endif
176 #if defined (SIGSAK) /* Secure Attention Key */
177 signal_names[SIGSAK] = "SAK";
178 #endif
180 /* SunOS5 */
181 #if defined (SIGLWP) /* special signal used by thread library */
182 signal_names[SIGLWP] = "LWP";
183 #endif
185 #if defined (SIGFREEZE) /* special signal used by CPR */
186 signal_names[SIGFREEZE] = "FREEZE";
187 #endif
189 #if defined (SIGTHAW) /* special signal used by CPR */
190 signal_names[SIGTHAW] = "THAW";
191 #endif
193 #if defined (SIGCANCEL) /* thread cancellation signal used by libthread */
194 signal_names[SIGCANCEL] = "CANCEL";
195 #endif
197 /* HP-UX */
198 #if defined (SIGDIL) /* DIL signal (?) */
199 signal_names[SIGDIL] = "DIL";
200 #endif
202 /* System V */
203 #if defined (SIGCLD) /* Like SIGCHLD. */
204 signal_names[SIGCLD] = "CLD";
205 #endif
207 #if defined (SIGPWR) /* power state indication */
208 signal_names[SIGPWR] = "PWR";
209 #endif
211 #if defined (SIGPOLL) /* Pollable event (for streams) */
212 signal_names[SIGPOLL] = "POLL";
213 #endif
215 /* Unknown */
216 #if defined (SIGWINDOW)
217 signal_names[SIGWINDOW] = "WINDOW";
218 #endif
220 /* Common */
221 #if defined (SIGHUP) /* hangup */
222 signal_names[SIGHUP] = "HUP";
223 #endif
225 #if defined (SIGINT) /* interrupt */
226 signal_names[SIGINT] = "INT";
227 #endif
229 #if defined (SIGQUIT) /* quit */
230 signal_names[SIGQUIT] = "QUIT";
231 #endif
233 #if defined (SIGILL) /* illegal instruction (not reset when caught) */
234 signal_names[SIGILL] = "ILL";
235 #endif
237 #if defined (SIGTRAP) /* trace trap (not reset when caught) */
238 signal_names[SIGTRAP] = "TRAP";
239 #endif
241 #if defined (SIGIOT) /* IOT instruction */
242 signal_names[SIGIOT] = "IOT";
243 #endif
245 #if defined (SIGABRT) /* Cause current process to dump core. */
246 signal_names[SIGABRT] = "ABRT";
247 #endif
249 #if defined (SIGEMT) /* EMT instruction */
250 signal_names[SIGEMT] = "EMT";
251 #endif
253 #if defined (SIGFPE) /* floating point exception */
254 signal_names[SIGFPE] = "FPE";
255 #endif
257 #if defined (SIGKILL) /* kill (cannot be caught or ignored) */
258 signal_names[SIGKILL] = "KILL";
259 #endif
261 #if defined (SIGBUS) /* bus error */
262 signal_names[SIGBUS] = "BUS";
263 #endif
265 #if defined (SIGSEGV) /* segmentation violation */
266 signal_names[SIGSEGV] = "SEGV";
267 #endif
269 #if defined (SIGSYS) /* bad argument to system call */
270 signal_names[SIGSYS] = "SYS";
271 #endif
273 #if defined (SIGPIPE) /* write on a pipe with no one to read it */
274 signal_names[SIGPIPE] = "PIPE";
275 #endif
277 #if defined (SIGALRM) /* alarm clock */
278 signal_names[SIGALRM] = "ALRM";
279 #endif
281 #if defined (SIGTERM) /* software termination signal from kill */
282 signal_names[SIGTERM] = "TERM";
283 #endif
285 #if defined (SIGURG) /* urgent condition on IO channel */
286 signal_names[SIGURG] = "URG";
287 #endif
289 #if defined (SIGSTOP) /* sendable stop signal not from tty */
290 signal_names[SIGSTOP] = "STOP";
291 #endif
293 #if defined (SIGTSTP) /* stop signal from tty */
294 signal_names[SIGTSTP] = "TSTP";
295 #endif
297 #if defined (SIGCONT) /* continue a stopped process */
298 signal_names[SIGCONT] = "CONT";
299 #endif
301 #if defined (SIGCHLD) /* to parent on child stop or exit */
302 signal_names[SIGCHLD] = "CHLD";
303 #endif
305 #if defined (SIGTTIN) /* to readers pgrp upon background tty read */
306 signal_names[SIGTTIN] = "TTIN";
307 #endif
309 #if defined (SIGTTOU) /* like TTIN for output if (tp->t_local&LTOSTOP) */
310 signal_names[SIGTTOU] = "TTOU";
311 #endif
313 #if defined (SIGIO) /* input/output possible signal */
314 signal_names[SIGIO] = "IO";
315 #endif
317 #if defined (SIGXCPU) /* exceeded CPU time limit */
318 signal_names[SIGXCPU] = "XCPU";
319 #endif
321 #if defined (SIGXFSZ) /* exceeded file size limit */
322 signal_names[SIGXFSZ] = "XFSZ";
323 #endif
325 #if defined (SIGVTALRM) /* virtual time alarm */
326 signal_names[SIGVTALRM] = "VTALRM";
327 #endif
329 #if defined (SIGPROF) /* profiling time alarm */
330 signal_names[SIGPROF] = "PROF";
331 #endif
333 #if defined (SIGWINCH) /* window changed */
334 signal_names[SIGWINCH] = "WINCH";
335 #endif
337 /* 4.4 BSD */
338 #if defined (SIGINFO) && !defined (_SEQUENT_) /* information request */
339 signal_names[SIGINFO] = "INFO";
340 #endif
342 #if defined (SIGUSR1) /* user defined signal 1 */
343 signal_names[SIGUSR1] = "USR1";
344 #endif
346 #if defined (SIGUSR2) /* user defined signal 2 */
347 signal_names[SIGUSR2] = "USR2";
348 #endif
350 #if defined (SIGKILLTHR) /* BeOS: Kill Thread */
351 signal_names[SIGKILLTHR] = "KILLTHR";
352 #endif
354 for (i = 0; i < NSIG; i++)
355 if (signal_names[i] == (char *)NULL)
357 signal_names[i] = (char *)malloc (18);
358 if (signal_names[i])
359 sprintf (signal_names[i], "%d", i);
363 void write_signames(FILE *stream)
365 register int i;
367 fprintf (stream, "/* This file was automatically created by %s.\n",
368 progname);
369 fprintf (stream, " Do not edit. Edit support/mksignames.c instead. */\n\n");
370 fprintf (stream, "#include <signal.h>\n\n");
371 fprintf (stream,
372 "/* A translation list so we can be polite to our users. */\n");
373 fprintf (stream, "const char *const signal_names[NSIG + 1] = {\n");
375 for (i = 0; i <= LASTSIG; i++)
376 fprintf (stream, " \"%s\",\n", signal_names[i]);
378 fprintf (stream, " (char *)0x0\n");
379 fprintf (stream, "};\n");
383 main(int argc, char **argv)
385 char *stream_name;
386 FILE *stream;
388 progname = argv[0];
390 if (argc == 1)
392 stream_name = "signames.c";
394 else if (argc == 2)
396 stream_name = argv[1];
398 else
400 fprintf (stderr, "Usage: %s [output-file]\n", progname);
401 exit (1);
404 stream = fopen (stream_name, "w");
405 if (!stream)
407 fprintf (stderr, "%s: %s: cannot open for writing\n",
408 progname, stream_name);
409 exit (2);
412 initialize_signames ();
413 write_signames (stream);
414 exit (0);