6b3196e97010c29b4cfe49a7d2fd55cf7a9aa301
[platform/upstream/bash.git] / support / mksignames.c
1 /* signames.c -- Create and write `signames.h', which contains an array of
2    signal names. */
3
4 /* Copyright (C) 1992 Free Software Foundation, Inc.
5
6    This file is part of GNU Bash, the Bourne Again SHell.
7
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.
12
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.
17
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. */
21
22 #include <stdio.h>
23 #include <sys/types.h>
24 #include <signal.h>
25 #if defined (HAVE_STDLIB_H)
26 #  include <stdlib.h>
27 #else
28 #  include "ansi_stdlib.h"
29 #endif /* HAVE_STDLIB_H */
30
31 #if !defined (NSIG)
32 #  define NSIG 64
33 #endif
34
35 char *signal_names[2 * NSIG];
36
37 #define signal_names_size (sizeof(signal_names)/sizeof(signal_names[0]))
38
39 char *progname;
40
41 /* AIX 4.3 defines SIGRTMIN and SIGRTMAX as 888 and 999 respectively.
42    I don't want to allocate so much unused space for the intervening signal
43    numbers, so we just punt if SIGRTMAX is past the bounds of the
44    signal_names array (handled in configure). */
45 #if defined (SIGRTMAX) && defined (UNUSABLE_RT_SIGNALS)
46 #  undef SIGRTMAX
47 #  undef SIGRTMIN
48 #endif
49
50 #if defined (SIGRTMAX) || defined (SIGRTMIN)
51 #  define RTLEN 14
52 #  define RTLIM 256
53 #endif
54
55 void
56 initialize_signames ()
57 {
58   register int i;
59 #if defined (SIGRTMAX) || defined (SIGRTMIN)
60   int rtmin, rtmax, rtcnt;
61 #endif
62
63   for (i = 1; i < signal_names_size; i++)
64     signal_names[i] = (char *)NULL;
65
66   /* `signal' 0 is what we do on exit. */
67   signal_names[0] = "EXIT";
68
69   /* Place signal names which can be aliases for more common signal
70      names first.  This allows (for example) SIGABRT to overwrite SIGLOST. */
71
72   /* POSIX 1003.1b-1993 real time signals, but take care of incomplete
73      implementations. Acoording to the standard, both, SIGRTMIN and
74      SIGRTMAX must be defined, SIGRTMIN must be stricly less than
75      SIGRTMAX, and the difference must be at least 7, that is, there
76      must be at least eight distinct real time signals. */
77
78   /* The generated signal names are SIGRTMIN, SIGRTMIN+1, ...,
79      SIGRTMIN+x, SIGRTMAX-x, ..., SIGRTMAX-1, SIGRTMAX. If the number
80      of RT signals is odd, there is an extra SIGRTMIN+(x+1).
81      These names are the ones used by ksh and /usr/xpg4/bin/sh on SunOS5. */
82
83 #if defined (SIGRTMIN)
84   rtmin = SIGRTMIN;
85   signal_names[rtmin] = "SIGRTMIN";
86 #endif
87
88 #if defined (SIGRTMAX)
89   rtmax = SIGRTMAX;
90   signal_names[rtmax] = "SIGRTMAX";
91 #endif
92
93 #if defined (SIGRTMAX) && defined (SIGRTMIN)
94   if (rtmax > rtmin)
95     {
96       rtcnt = (rtmax - rtmin - 1) / 2;
97       /* croak if there are too many RT signals */
98       if (rtcnt >= RTLIM/2)
99         {
100           rtcnt = RTLIM/2-1;
101           fprintf(stderr, "%s: error: more than %i real time signals, fix `%s'\n",
102                   progname, RTLIM, progname);
103         }
104
105       for (i = 1; i <= rtcnt; i++)
106         {
107           signal_names[rtmin+i] = (char *)malloc(RTLEN);
108           sprintf (signal_names[rtmin+i], "SIGRTMIN+%d", i);
109           signal_names[rtmax-i] = (char *)malloc(RTLEN);
110           sprintf (signal_names[rtmax-i], "SIGRTMAX-%d", i);
111         }
112
113       if (rtcnt < RTLIM/2-1 && rtcnt != (rtmax-rtmin)/2)
114         {
115           /* Need an extra RTMIN signal */
116           signal_names[rtmin+rtcnt+1] = (char *)malloc(RTLEN);
117           sprintf (signal_names[rtmin+rtcnt+1], "SIGRTMIN+%d", rtcnt+1);
118         }
119     }
120 #endif /* SIGRTMIN && SIGRTMAX */
121
122 /* AIX */
123 #if defined (SIGLOST)   /* resource lost (eg, record-lock lost) */
124   signal_names[SIGLOST] = "SIGLOST";
125 #endif
126
127 #if defined (SIGMSG)    /* HFT input data pending */
128   signal_names[SIGMSG] = "SIGMSG";
129 #endif
130
131 #if defined (SIGDANGER) /* system crash imminent */
132   signal_names[SIGDANGER] = "SIGDANGER";
133 #endif
134
135 #if defined (SIGMIGRATE) /* migrate process to another CPU */
136   signal_names[SIGMIGRATE] = "SIGMIGRATE";
137 #endif
138
139 #if defined (SIGPRE)    /* programming error */
140   signal_names[SIGPRE] = "SIGPRE";
141 #endif
142
143 #if defined (SIGVIRT)   /* AIX virtual time alarm */
144   signal_names[SIGVIRT] = "SIGVIRT";
145 #endif
146
147 #if defined (SIGALRM1)  /* m:n condition variables */
148   signal_names[SIGALRM1] = "SIGALRM1";
149 #endif
150
151 #if defined (SIGWAITING)        /* m:n scheduling */
152   signal_names[SIGWAITING] = "SIGWAITING";
153 #endif
154
155 #if defined (SIGGRANT)  /* HFT monitor mode granted */
156   signal_names[SIGGRANT] = "SIGGRANT";
157 #endif
158
159 #if defined (SIGKAP)    /* keep alive poll from native keyboard */
160   signal_names[SIGKAP] = "SIGKAP";
161 #endif
162
163 #if defined (SIGRETRACT) /* HFT monitor mode retracted */
164   signal_names[SIGRETRACT] = "SIGRETRACT";
165 #endif
166
167 #if defined (SIGSOUND)  /* HFT sound sequence has completed */
168   signal_names[SIGSOUND] = "SIGSOUND";
169 #endif
170
171 #if defined (SIGSAK)    /* Secure Attention Key */
172   signal_names[SIGSAK] = "SIGSAK";
173 #endif
174
175 /* SunOS5 */
176 #if defined (SIGLWP)    /* special signal used by thread library */
177   signal_names[SIGLWP] = "SIGLWP";
178 #endif
179
180 #if defined (SIGFREEZE) /* special signal used by CPR */
181   signal_names[SIGFREEZE] = "SIGFREEZE";
182 #endif
183
184 #if defined (SIGTHAW)   /* special signal used by CPR */
185   signal_names[SIGTHAW] = "SIGTHAW";
186 #endif
187
188 #if defined (SIGCANCEL) /* thread cancellation signal used by libthread */
189   signal_names[SIGCANCEL] = "SIGCANCEL";
190 #endif
191
192 /* HP-UX */
193 #if defined (SIGDIL)    /* DIL signal (?) */
194   signal_names[SIGDIL] = "SIGDIL";
195 #endif
196
197 /* System V */
198 #if defined (SIGCLD)    /* Like SIGCHLD.  */
199   signal_names[SIGCLD] = "SIGCLD";
200 #endif
201
202 #if defined (SIGPWR)    /* power state indication */
203   signal_names[SIGPWR] = "SIGPWR";
204 #endif
205
206 #if defined (SIGPOLL)   /* Pollable event (for streams)  */
207   signal_names[SIGPOLL] = "SIGPOLL";
208 #endif
209
210 /* Unknown */
211 #if defined (SIGWINDOW)
212   signal_names[SIGWINDOW] = "SIGWINDOW";
213 #endif
214
215 /* Common */
216 #if defined (SIGHUP)    /* hangup */
217   signal_names[SIGHUP] = "SIGHUP";
218 #endif
219
220 #if defined (SIGINT)    /* interrupt */
221   signal_names[SIGINT] = "SIGINT";
222 #endif
223
224 #if defined (SIGQUIT)   /* quit */
225   signal_names[SIGQUIT] = "SIGQUIT";
226 #endif
227
228 #if defined (SIGILL)    /* illegal instruction (not reset when caught) */
229   signal_names[SIGILL] = "SIGILL";
230 #endif
231
232 #if defined (SIGTRAP)   /* trace trap (not reset when caught) */
233   signal_names[SIGTRAP] = "SIGTRAP";
234 #endif
235
236 #if defined (SIGIOT)    /* IOT instruction */
237   signal_names[SIGIOT] = "SIGIOT";
238 #endif
239
240 #if defined (SIGABRT)   /* Cause current process to dump core. */
241   signal_names[SIGABRT] = "SIGABRT";
242 #endif
243
244 #if defined (SIGEMT)    /* EMT instruction */
245   signal_names[SIGEMT] = "SIGEMT";
246 #endif
247
248 #if defined (SIGFPE)    /* floating point exception */
249   signal_names[SIGFPE] = "SIGFPE";
250 #endif
251
252 #if defined (SIGKILL)   /* kill (cannot be caught or ignored) */
253   signal_names[SIGKILL] = "SIGKILL";
254 #endif
255
256 #if defined (SIGBUS)    /* bus error */
257   signal_names[SIGBUS] = "SIGBUS";
258 #endif
259
260 #if defined (SIGSEGV)   /* segmentation violation */
261   signal_names[SIGSEGV] = "SIGSEGV";
262 #endif
263
264 #if defined (SIGSYS)    /* bad argument to system call */
265   signal_names[SIGSYS] = "SIGSYS";
266 #endif
267
268 #if defined (SIGPIPE)   /* write on a pipe with no one to read it */
269   signal_names[SIGPIPE] = "SIGPIPE";
270 #endif
271
272 #if defined (SIGALRM)   /* alarm clock */
273   signal_names[SIGALRM] = "SIGALRM";
274 #endif
275
276 #if defined (SIGTERM)   /* software termination signal from kill */
277   signal_names[SIGTERM] = "SIGTERM";
278 #endif
279
280 #if defined (SIGURG)    /* urgent condition on IO channel */
281   signal_names[SIGURG] = "SIGURG";
282 #endif
283
284 #if defined (SIGSTOP)   /* sendable stop signal not from tty */
285   signal_names[SIGSTOP] = "SIGSTOP";
286 #endif
287
288 #if defined (SIGTSTP)   /* stop signal from tty */
289   signal_names[SIGTSTP] = "SIGTSTP";
290 #endif
291
292 #if defined (SIGCONT)   /* continue a stopped process */
293   signal_names[SIGCONT] = "SIGCONT";
294 #endif
295
296 #if defined (SIGCHLD)   /* to parent on child stop or exit */
297   signal_names[SIGCHLD] = "SIGCHLD";
298 #endif
299
300 #if defined (SIGTTIN)   /* to readers pgrp upon background tty read */
301   signal_names[SIGTTIN] = "SIGTTIN";
302 #endif
303
304 #if defined (SIGTTOU)   /* like TTIN for output if (tp->t_local&LTOSTOP) */
305   signal_names[SIGTTOU] = "SIGTTOU";
306 #endif
307
308 #if defined (SIGIO)     /* input/output possible signal */
309   signal_names[SIGIO] = "SIGIO";
310 #endif
311
312 #if defined (SIGXCPU)   /* exceeded CPU time limit */
313   signal_names[SIGXCPU] = "SIGXCPU";
314 #endif
315
316 #if defined (SIGXFSZ)   /* exceeded file size limit */
317   signal_names[SIGXFSZ] = "SIGXFSZ";
318 #endif
319
320 #if defined (SIGVTALRM) /* virtual time alarm */
321   signal_names[SIGVTALRM] = "SIGVTALRM";
322 #endif
323
324 #if defined (SIGPROF)   /* profiling time alarm */
325   signal_names[SIGPROF] = "SIGPROF";
326 #endif
327
328 #if defined (SIGWINCH)  /* window changed */
329   signal_names[SIGWINCH] = "SIGWINCH";
330 #endif
331
332 /* 4.4 BSD */
333 #if defined (SIGINFO) && !defined (_SEQUENT_)   /* information request */
334   signal_names[SIGINFO] = "SIGINFO";
335 #endif
336
337 #if defined (SIGUSR1)   /* user defined signal 1 */
338   signal_names[SIGUSR1] = "SIGUSR1";
339 #endif
340
341 #if defined (SIGUSR2)   /* user defined signal 2 */
342   signal_names[SIGUSR2] = "SIGUSR2";
343 #endif
344
345 #if defined (SIGKILLTHR)        /* BeOS: Kill Thread */
346   signal_names[SIGKILLTHR] = "SIGKILLTHR";
347 #endif
348
349   for (i = 0; i < NSIG; i++)
350     if (signal_names[i] == (char *)NULL)
351       {
352         signal_names[i] = (char *)malloc (18);
353         sprintf (signal_names[i], "SIGJUNK(%d)", i);
354       }
355
356   signal_names[NSIG] = "DEBUG";
357 }
358
359 void
360 write_signames (stream)
361      FILE *stream;
362 {
363   register int i;
364
365   fprintf (stream, "/* This file was automatically created by %s.\n",
366            progname);
367   fprintf (stream, "   Do not edit.  Edit support/mksignames.c instead. */\n\n");
368   fprintf (stream,
369            "/* A translation list so we can be polite to our users. */\n");
370   fprintf (stream, "char *signal_names[NSIG + 2] = {\n");
371
372   for (i = 0; i <= NSIG; i++)
373     fprintf (stream, "    \"%s\",\n", signal_names[i]);
374
375   fprintf (stream, "    (char *)0x0,\n");
376   fprintf (stream, "};\n");
377 }
378
379 int
380 main (argc, argv)
381      int argc;
382      char **argv;
383 {
384   char *stream_name;
385   FILE *stream;
386
387   progname = argv[0];
388
389   if (argc == 1)
390     {
391       stream_name = "stdout";
392       stream = stdout;
393     }
394   else if (argc == 2)
395     {
396       stream_name = argv[1];
397       stream = fopen (stream_name, "w");
398     }
399   else
400     {
401       fprintf (stderr, "Usage: %s [output-file]\n", progname);
402       exit (1);
403     }
404
405   if (!stream)
406     {
407       fprintf (stderr, "%s: %s: cannot open for writing\n",
408                progname, stream_name);
409       exit (2);
410     }
411
412   initialize_signames ();
413   write_signames (stream);
414   exit (0);
415 }