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