1/*
2 * sh.init.c: Function and signal tables
3 */
4/*-
5 * Copyright (c) 1980, 1991 The Regents of the University of California.
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 *    notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 *    notice, this list of conditions and the following disclaimer in the
15 *    documentation and/or other materials provided with the distribution.
16 * 3. Neither the name of the University nor the names of its contributors
17 *    may be used to endorse or promote products derived from this software
18 *    without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 * SUCH DAMAGE.
31 */
32#include "sh.h"
33#include "ed.h"
34#include "tw.h"
35
36/*
37 * C shell
38 */
39
40#define	INF INT_MAX
41
42const struct biltins bfunc[] = {
43    { ":",		dozip,		0,	INF	},
44    { "@",		dolet,		0,	INF	},
45    { "alias",		doalias,	0,	INF	},
46    { "alloc",		showall,	0,	1	},
47#if defined(_CX_UX)
48    { "att",		doatt,		0,	INF	},
49#endif /* _CX_UX */
50    { "bg",		dobg,		0,	INF	},
51    { "bindkey",	dobindkey,	0,	8	},
52    { "break",		dobreak,	0,	0	},
53    { "breaksw",	doswbrk,	0,	0	},
54#ifdef _OSD_POSIX
55    { "bs2cmd",		dobs2cmd,	1,	INF	},
56#endif /* OBSOLETE */
57    { "builtins",	dobuiltins,	0,	0	},
58#ifdef KAI
59    { "bye",		goodbye,	0,	0	},
60#endif /* KAI */
61    { "case",		dozip,		0,	1	},
62    { "cd",		dochngd,	0,	INF	},
63    { "chdir",		dochngd,	0,	INF	},
64    { "complete",	docomplete,	0,	INF	},
65    { "continue",	docontin,	0,	0	},
66    { "default",	dozip,		0,	0	},
67    { "dirs",		dodirs,		0,	INF	},
68#if defined(_CRAY) && !defined(_CRAYMPP)
69    { "dmmode",		dodmmode,	0,	1	},
70#endif /* _CRAY && !_CRAYMPP */
71    { "echo",		doecho,		0,	INF	},
72    { "echotc",		doechotc,	0,	INF	},
73    { "else",		doelse,		0,	INF	},
74    { "end",		doend,		0,	0	},
75    { "endif",		dozip,		0,	0	},
76    { "endsw",		dozip,		0,	0	},
77    { "eval",		doeval,		0,	INF	},
78    { "exec",		execash,	1,	INF	},
79    { "exit",		doexit,		0,	INF	},
80    { "fg",		dofg,		0,	INF	},
81    { "filetest",	dofiletest,	2,	INF	},
82    { "foreach",	doforeach,	3,	INF	},
83#ifdef TCF
84    { "getspath",	dogetspath,	0,	0	},
85    { "getxvers",	dogetxvers,	0,	0	},
86#endif /* TCF */
87    { "glob",		doglob,		0,	INF	},
88    { "goto",		dogoto,		1,	1	},
89    { "hashstat",	hashstat,	0,	0	},
90    { "history",	dohist,		0,	2	},
91    { "hup",		dohup,		0,	INF	},
92    { "if",		doif,		1,	INF	},
93#ifdef apollo
94    { "inlib", 		doinlib,	1,	INF	},
95#endif /* apollo */
96    { "jobs",		dojobs,		0,	1	},
97    { "kill",		dokill,		1,	INF	},
98#ifndef HAVENOLIMIT
99    { "limit",		dolimit,	0,	3	},
100#endif /* !HAVENOLIMIT */
101#ifdef OBSOLETE
102    { "linedit",	doecho,		0,	INF	},
103#endif /* OBSOLETE */
104#if !defined(HAVENOUTMP) && !defined(KAI)
105    { "log",		dolog,		0,	0	},
106#endif /* !HAVENOUTMP && !KAI */
107    { "login",		dologin,	0,	1	},
108    { "logout",		dologout,	0,	0	},
109    { "ls-F",		dolist,		0,	INF	},
110#ifdef TCF
111    { "migrate",	domigrate,	1,	INF	},
112#endif /* TCF */
113#ifdef NEWGRP
114    { "newgrp",		donewgrp,	0,	2	},
115#endif /* NEWGRP */
116    { "nice",		donice,		0,	INF	},
117    { "nohup",		donohup,	0,	INF	},
118    { "notify",		donotify,	0,	INF	},
119    { "onintr",		doonintr,	0,	2	},
120    { "popd",		dopopd,		0,	INF	},
121    { "printenv",	doprintenv,	0,	1	},
122    { "pushd",		dopushd,	0,	INF	},
123    { "rehash",		dohash,		0,	3	},
124    { "repeat",		dorepeat,	2,	INF	},
125#ifdef apollo
126    { "rootnode",	dorootnode,	1,	1	},
127#endif /* apollo */
128    { "sched",		dosched,	0,	INF	},
129    { "set",		doset,		0,	INF	},
130    { "setenv",		dosetenv,	0,	2	},
131#ifdef MACH
132    { "setpath",	dosetpath,	0,	INF	},
133#endif	/* MACH */
134#ifdef TCF
135    { "setspath",	dosetspath,	1,	INF	},
136#endif /* TCF */
137    { "settc",		dosettc,	2,	2	},
138    { "setty", 		dosetty,	0,      INF	},
139#ifdef TCF
140    { "setxvers",	dosetxvers,	0,	1	},
141#endif /* TCF */
142    { "shift",		shift,		0,	1	},
143    { "source",		dosource,	1,	INF	},
144    { "stop",		dostop,		1,	INF	},
145    { "suspend",	dosuspend,	0,	0	},
146    { "switch",		doswitch,	1,	INF	},
147    { "telltc",		dotelltc,	0,	INF	},
148#ifndef WINNT_NATIVE
149    { "termname",	dotermname,	0,  	1       },
150#endif
151    { "time",		dotime,		0,	INF	},
152#if defined(_CX_UX)
153    { "ucb",		doucb,		0,	INF	},
154#endif /* _CX_UX */
155    { "umask",		doumask,	0,	1	},
156    { "unalias",	unalias,	1,	INF	},
157    { "uncomplete",	douncomplete,	1,	INF	},
158    { "unhash",		dounhash,	0,	0	},
159#if defined(masscomp) || defined(_CX_UX)
160    { "universe",	douniverse,	0,	INF	},
161#endif /* masscomp || _CX_UX */
162#ifndef HAVENOLIMIT
163    { "unlimit",	dounlimit,	0,	INF	},
164#endif /* !HAVENOLIMIT */
165    { "unset",		unset,		1,	INF	},
166    { "unsetenv",	dounsetenv,	1,	INF	},
167#ifdef apollo
168    { "ver",		dover,		0,	INF	},
169#endif /* apollo */
170    { "wait",		dowait,		0,	0	},
171#ifdef WARP
172    { "warp",		dowarp,		0,	2	},
173#endif /* WARP */
174#if !defined(HAVENOUTMP) && defined(KAI)
175    { "watchlog",	dolog,		0,	0	},
176#endif /* !HAVENOUTMP && KAI */
177    { "where",		dowhere,	1,	INF	},
178    { "which",		dowhich,	1,	INF	},
179    { "while",		dowhile,	1,	INF	}
180};
181int nbfunc = sizeof bfunc / sizeof *bfunc;
182
183struct srch srchn[] = {
184    { "@",		TC_LET		},
185    { "break",		TC_BREAK	},
186    { "breaksw",	TC_BRKSW	},
187    { "case",		TC_CASE		},
188    { "default", 	TC_DEFAULT	},
189    { "else",		TC_ELSE		},
190    { "end",		TC_END		},
191    { "endif",		TC_ENDIF	},
192    { "endsw",		TC_ENDSW	},
193    { "exit",		TC_EXIT		},
194    { "foreach", 	TC_FOREACH	},
195    { "goto",		TC_GOTO		},
196    { "if",		TC_IF		},
197    { "label",		TC_LABEL	},
198    { "set",		TC_SET		},
199    { "switch",		TC_SWITCH	},
200    { "while",		TC_WHILE	}
201};
202int nsrchn = sizeof srchn / sizeof *srchn;
203
204
205/*
206 * Note: For some machines, (hpux eg.)
207 * NSIG = number of signals + 1...
208 * so we define 33 or 65 (POSIX) signals for
209 * everybody
210 */
211
212/* We define NUMSIG to avoid changing NSIG or MAXSIG */
213#if defined(POSIX) && (!defined(__CYGWIN__) || defined (__x86_64__))
214# define NUMSIG 65
215#else /* !POSIX */
216# define NUMSIG 33
217#endif /* POSIX */
218
219int	nsig = NUMSIG - 1;	/* This should be the number of real signals */
220				/* not counting signal 0 */
221struct mesg mesg[NUMSIG];	/* Arrays start at [0] so we initialize from */
222				/* 0 to 32 or 64, the max real signal number */
223
224void
225mesginit(void)
226{
227
228#ifdef NLS_CATALOGS
229    int i;
230
231    for (i = 0; i < NUMSIG; i++) {
232        xfree((char *)(intptr_t)mesg[i].pname);
233	mesg[i].pname = NULL;
234    }
235#endif /* NLS_CATALOGS */
236
237#if defined(SIGNULL) || defined(DECOSF1)
238# ifndef SIGNULL
239#  define SIGNULL 0
240# endif /* !SIGNULL */
241    if (mesg[SIGNULL].pname == NULL) {
242	mesg[SIGNULL].iname = "NULL";
243	mesg[SIGNULL].pname = CSAVS(2, 1, "Null signal");
244    }
245#endif /* SIGNULL || DECOSF1 */
246
247#ifdef SIGHUP
248    if (mesg[SIGHUP].pname == NULL) {
249	mesg[SIGHUP].iname = "HUP";
250	mesg[SIGHUP].pname = CSAVS(2, 2, "Hangup");
251    }
252#endif /* SIGHUP */
253
254#ifdef SIGINT
255    if (mesg[SIGINT].pname == NULL) {
256	mesg[SIGINT].iname = "INT";
257	mesg[SIGINT].pname = CSAVS(2, 3, "Interrupt");
258    }
259#endif /* SIGINT */
260
261#ifdef SIGQUIT
262    if (mesg[SIGQUIT].pname == NULL) {
263	mesg[SIGQUIT].iname = "QUIT";
264	mesg[SIGQUIT].pname = CSAVS(2, 4, "Quit");
265    }
266#endif /* SIGQUIT */
267
268#ifdef SIGILL
269    if (mesg[SIGILL].pname == NULL) {
270	mesg[SIGILL].iname = "ILL";
271	mesg[SIGILL].pname = CSAVS(2, 5, "Illegal instruction");
272    }
273#endif /* SIGILL */
274
275#ifdef SIGTRAP
276    if (mesg[SIGTRAP].pname == NULL) {
277	mesg[SIGTRAP].iname = "TRAP";
278	mesg[SIGTRAP].pname = CSAVS(2, 6, "Trace/BPT trap");
279    }
280#endif /* SIGTRAP */
281
282#ifdef SIGABRT
283    if (mesg[SIGABRT].pname == NULL) {
284	mesg[SIGABRT].iname = "ABRT";
285	mesg[SIGABRT].pname = CSAVS(2, 7, "Abort");
286    }
287#endif /* SIGABRT */
288
289#ifdef SIGIOT
290    if (mesg[SIGIOT].pname == NULL) {
291	mesg[SIGIOT].iname = "IOT";
292	mesg[SIGIOT].pname = CSAVS(2, 8, "IOT trap");
293    }
294#endif /* SIGIOT */
295
296#ifdef SIGDANGER
297    /* aiws */
298    if (mesg[SIGDANGER].pname == NULL) {
299	mesg[SIGDANGER].iname = "DANGER";
300	mesg[SIGDANGER].pname = CSAVS(2, 9, "System Crash Imminent");
301    }
302#endif /* SIGDANGER */
303
304#ifdef SIGERR
305    /* _CRAY */
306    if (mesg[SIGERR].pname == NULL) {
307	mesg[SIGERR].iname = "ERR";
308	mesg[SIGERR].pname = CSAVS(2, 10, "Error exit");
309    }
310#endif /* SIGERR */
311
312#ifdef SIGEMT
313    if (mesg[SIGEMT].pname == NULL) {
314	mesg[SIGEMT].iname = "EMT";
315	mesg[SIGEMT].pname = CSAVS(2, 11, "EMT trap");
316    }
317#endif /* SIGEMT */
318
319#ifdef SIGFPE
320    if (mesg[SIGFPE].pname == NULL) {
321	mesg[SIGFPE].iname = "FPE";
322	mesg[SIGFPE].pname = CSAVS(2, 12, "Floating exception");
323    }
324#endif /* SIGFPE */
325
326#ifdef SIGKILL
327    if (mesg[SIGKILL].pname == NULL) {
328	mesg[SIGKILL].iname = "KILL";
329	mesg[SIGKILL].pname = CSAVS(2, 13, "Killed");
330    }
331#endif /* SIGKILL */
332
333#ifdef SIGUSR1
334    if (mesg[SIGUSR1].pname == NULL) {
335	mesg[SIGUSR1].iname = "USR1";
336	mesg[SIGUSR1].pname = CSAVS(2, 14, "User signal 1");
337    }
338#endif /* SIGUSR1 */
339
340#ifdef SIGUSR2
341    if (mesg[SIGUSR2].pname == NULL) {
342	mesg[SIGUSR2].iname = "USR2";
343	mesg[SIGUSR2].pname = CSAVS(2, 15, "User signal 2");
344    }
345#endif /* SIGUSR2 */
346
347#ifdef SIGSEGV
348    if (mesg[SIGSEGV].pname == NULL) {
349	mesg[SIGSEGV].iname = "SEGV";
350	mesg[SIGSEGV].pname = CSAVS(2, 16, "Segmentation fault");
351    }
352#endif /* SIGSEGV */
353
354#ifdef SIGBUS
355    if (mesg[SIGBUS].pname == NULL) {
356	mesg[SIGBUS].iname = "BUS";
357	mesg[SIGBUS].pname = CSAVS(2, 17, "Bus error");
358    }
359#endif /* SIGBUS */
360
361#ifdef SIGPRE
362    /* _CRAY || IBMAIX */
363    if (mesg[SIGPRE].pname == NULL) {
364	mesg[SIGPRE].iname = "PRE";
365	mesg[SIGPRE].pname = CSAVS(2, 18, "Program range error");
366    }
367#endif /* SIGPRE */
368
369#ifdef SIGORE
370    /* _CRAY */
371    if (mesg[SIGORE].pname == NULL) {
372	mesg[SIGORE].iname = "ORE";
373	mesg[SIGORE].pname = CSAVS(2, 19, "Operand range error");
374    }
375#endif /* SIGORE */
376
377#ifdef SIGSYS
378    if (mesg[SIGSYS].pname == NULL) {
379	mesg[SIGSYS].iname = "SYS";
380	mesg[SIGSYS].pname = CSAVS(2, 20, "Bad system call");
381    }
382#endif /* SIGSYS */
383
384#ifdef SIGPIPE
385    if (mesg[SIGPIPE].pname == NULL) {
386	mesg[SIGPIPE].iname = "PIPE";
387	mesg[SIGPIPE].pname = CSAVS(2, 21, "Broken pipe");
388    }
389#endif /* SIGPIPE */
390
391#ifdef SIGALRM
392    if (mesg[SIGALRM].pname == NULL) {
393	mesg[SIGALRM].iname = "ALRM";
394	mesg[SIGALRM].pname = CSAVS(2, 22, "Alarm clock");
395    }
396#endif /* SIGALRM */
397
398#ifdef SIGTERM
399    if (mesg[SIGTERM].pname == NULL) {
400	mesg[SIGTERM].iname = "TERM";
401	mesg[SIGTERM].pname = CSAVS(2, 23, "Terminated");
402    }
403#endif /* SIGTERM */
404
405/* SIGCLD vs SIGCHLD */
406#if !defined(SIGCHLD) || defined(SOLARIS2) || defined(apollo) || defined(__EMX__)
407    /* If we don't define SIGCHLD, or our OS prefers SIGCLD to SIGCHLD, */
408    /* check for SIGCLD */
409# ifdef SIGCLD
410    if (mesg[SIGCLD].pname == NULL) {
411	mesg[SIGCLD].iname = "CLD";
412#  ifdef BSDJOBS
413	mesg[SIGCLD].pname = CSAVS(2, 24, "Child status change");
414#  else /* !BSDJOBS */
415	mesg[SIGCLD].pname = CSAVS(2, 25, "Death of child");
416#  endif /* BSDJOBS */
417    }
418# endif /* SIGCLD */
419#else /* !(!SIGCHLD || SOLARIS2 || apollo || __EMX__) */
420    /* We probably define SIGCHLD */
421# ifdef SIGCHLD
422    if (mesg[SIGCHLD].pname == NULL) {
423	mesg[SIGCHLD].iname = "CHLD";
424#  ifdef BSDJOBS
425	mesg[SIGCHLD].pname = CSAVS(2, 27, "Child stopped or exited");
426#  else /* !BSDJOBS */
427	mesg[SIGCHLD].pname = CSAVS(2, 28, "Child exited");
428#  endif /* BSDJOBS */
429    }
430# endif /* SIGCHLD */
431#endif /* !SIGCHLD || SOLARIS2 || apollo || __EMX__ */
432
433#ifdef SIGAPOLLO
434    /* apollo */
435    if (mesg[SIGAPOLLO].pname == NULL) {
436	mesg[SIGAPOLLO].iname = "APOLLO";
437	mesg[SIGAPOLLO].pname = CSAVS(2, 26, "Apollo-specific fault");
438    }
439#endif /* SIGAPOLLO */
440
441#ifdef SIGPWR
442    if (mesg[SIGPWR].pname == NULL) {
443	mesg[SIGPWR].iname = "PWR";
444	mesg[SIGPWR].pname = CSAVS(2, 29, "Power failure");
445    }
446#endif /* SIGPWR */
447
448#ifdef SIGLOST
449    if (mesg[SIGLOST].pname == NULL) {
450	mesg[SIGLOST].iname = "LOST";
451	mesg[SIGLOST].pname = CSAVS(2, 30, "Resource Lost");
452    }
453#endif /* SIGLOST */
454
455#ifdef SIGBREAK
456    /* __EMX__ */
457    if (mesg[SIGBREAK].pname == NULL) {
458	mesg[SIGBREAK].iname = "BREAK";
459	mesg[SIGBREAK].pname = CSAVS(2, 31, "Break (Ctrl-Break)");
460    }
461#endif /* SIGBREAK */
462
463#ifdef SIGIO
464# if !defined(SIGPOLL) || SIGPOLL != SIGIO
465    if (mesg[SIGIO].pname == NULL) {
466	mesg[SIGIO].iname = "IO";
467#  ifdef cray
468	mesg[SIGIO].pname = CSAVS(2, 32, "Input/output possible signal");
469#  else /* !cray */
470	mesg[SIGIO].pname = CSAVS(2, 33, "Asynchronous I/O (select)");
471#  endif /* cray */
472    }
473# endif /* !SIGPOLL || SIGPOLL != SIGIO */
474#endif /* SIGIO */
475
476#ifdef SIGURG
477    if (mesg[SIGURG].pname == NULL) {
478	mesg[SIGURG].iname = "URG";
479	mesg[SIGURG].pname = CSAVS(2, 34, "Urgent condition on I/O channel");
480    }
481#endif /* SIGURG */
482
483#ifdef SIGMT
484    /* cray */
485    if (mesg[SIGMT].pname == NULL) {
486	mesg[SIGMT].iname = "MT";
487	mesg[SIGMT].pname = CSAVS(2, 35, "Multitasking wake-up");
488    }
489#endif /* SIGMT */
490
491#ifdef SIGMTKILL
492    /* cray */
493    if (mesg[SIGMTKILL].pname == NULL) {
494	mesg[SIGMTKILL].iname = "MTKILL";
495	mesg[SIGMTKILL].pname = CSAVS(2, 36, "Multitasking kill");
496    }
497#endif /* SIGMTKILL */
498
499#ifdef SIGBUFIO
500    /* _CRAYCOM */
501    if (mesg[SIGBUFIO].pname == NULL) {
502	mesg[SIGBUFIO].iname = "BUFIO";
503	mesg[SIGBUFIO].pname = CSAVS(2, 37,
504				    "Fortran asynchronous I/O completion");
505    }
506#endif /* SIGBUFIO */
507
508#ifdef SIGRECOVERY
509    /* _CRAYCOM */
510    if (mesg[SIGRECOVERY].pname == NULL) {
511	mesg[SIGRECOVERY].iname = "RECOVERY";
512	mesg[SIGRECOVERY].pname = CSAVS(2, 38, "Recovery");
513    }
514#endif /* SIGRECOVERY */
515
516#ifdef SIGUME
517    /* _CRAYCOM */
518    if (mesg[SIGUME].pname == NULL) {
519	mesg[SIGUME].iname = "UME";
520	mesg[SIGUME].pname = CSAVS(2, 39, "Uncorrectable memory error");
521    }
522#endif /* SIGUME */
523
524#ifdef SIGCPULIM
525    /* _CRAYCOM */
526    if (mesg[SIGCPULIM].pname == NULL) {
527	mesg[SIGCPULIM].iname = "CPULIM";
528	mesg[SIGCPULIM].pname = CSAVS(2, 40, "CPU time limit exceeded");
529    }
530#endif /* SIGCPULIM */
531
532#ifdef SIGSHUTDN
533    /* _CRAYCOM */
534    if (mesg[SIGSHUTDN].pname == NULL) {
535	mesg[SIGSHUTDN].iname = "SHUTDN";
536	mesg[SIGSHUTDN].pname = CSAVS(2, 41, "System shutdown imminent");
537    }
538#endif /* SIGSHUTDN */
539
540#ifdef SIGNOWAK
541    /* _CRAYCOM */
542    if (mesg[SIGNOWAK].pname == NULL) {
543	mesg[SIGNOWAK].iname = "NOWAK";
544	mesg[SIGNOWAK].pname = CSAVS(2, 42,
545				    "Micro-tasking group-no wakeup flag set");
546    }
547#endif /* SIGNOWAK */
548
549#ifdef SIGTHERR
550    /* _CRAYCOM */
551    if (mesg[SIGTHERR].pname == NULL) {
552	mesg[SIGTHERR].iname = "THERR";
553	mesg[SIGTHERR].pname = CSAVS(2, 43,
554			    "Thread error - (use cord -T for detailed info)");
555    }
556#endif /* SIGTHERR */
557
558#ifdef SIGRPE
559    /* cray */
560    if (mesg[SIGRPE].pname == NULL) {
561	mesg[SIGRPE].pname = CSAVS(2, 44, "CRAY Y-MP register parity error");
562	mesg[SIGRPE].iname = "RPE";
563    }
564#endif /* SIGRPE */
565
566#ifdef SIGINFO
567    if (mesg[SIGINFO].pname == NULL) {
568	mesg[SIGINFO].iname = "INFO";
569	mesg[SIGINFO].pname = CSAVS(2, 45, "Information request");
570    }
571#endif /* SIGINFO */
572
573#ifdef SIGSTOP
574    if (mesg[SIGSTOP].pname == NULL) {
575	mesg[SIGSTOP].iname = "STOP";
576# ifdef SUSPENDED
577	mesg[SIGSTOP].pname = CSAVS(2, 46, "Suspended (signal)");
578# else /* !SUSPENDED */
579	mesg[SIGSTOP].pname = CSAVS(2, 47, "Stopped (signal)");
580# endif /* SUSPENDED */
581    }
582#endif /* SIGSTOP */
583
584#ifdef SIGTSTP
585    if (mesg[SIGTSTP].pname == NULL) {
586	mesg[SIGTSTP].iname = "TSTP";
587# ifdef SUSPENDED
588	mesg[SIGTSTP].pname = CSAVS(2, 48, "Suspended");
589# else /* !SUSPENDED */
590	mesg[SIGTSTP].pname = CSAVS(2, 49, "Stopped");
591# endif /* SUSPENDED */
592    }
593#endif /* SIGTSTP */
594
595#ifdef SIGCONT
596    if (mesg[SIGCONT].pname == NULL) {
597	mesg[SIGCONT].iname = "CONT";
598	mesg[SIGCONT].pname = CSAVS(2, 50, "Continued");
599    }
600#endif /* SIGCONT */
601
602#ifdef SIGTTIN
603    if (mesg[SIGTTIN].pname == NULL) {
604	mesg[SIGTTIN].iname = "TTIN";
605# ifdef SUSPENDED
606	mesg[SIGTTIN].pname = CSAVS(2, 51, "Suspended (tty input)");
607# else /* !SUSPENDED */
608	mesg[SIGTTIN].pname = CSAVS(2, 52, "Stopped (tty input)");
609# endif /* SUSPENDED */
610    }
611#endif /* SIGTTIN */
612
613#ifdef SIGTTOU
614    if (mesg[SIGTTOU].pname == NULL) {
615	mesg[SIGTTOU].iname = "TTOU";
616# ifdef SUSPENDED
617	mesg[SIGTTOU].pname = CSAVS(2, 53, "Suspended (tty output)");
618# else /* SUSPENDED */
619	mesg[SIGTTOU].pname = CSAVS(2, 54, "Stopped (tty output)");
620# endif /* SUSPENDED */
621    }
622#endif /* SIGTTOU */
623
624#ifdef SIGWIND
625    /* UNIXPC */
626    if (mesg[SIGWIND].pname == NULL) {
627	mesg[SIGWIND].iname = "WIND";
628	mesg[SIGWIND].pname = CSAVS(2, 55, "Window status changed");
629    }
630#endif /* SIGWIND */
631
632#ifdef SIGWINDOW
633    if (mesg[SIGWINDOW].pname == NULL) {
634	mesg[SIGWINDOW].iname = "WINDOW";
635	mesg[SIGWINDOW].pname = CSAVS(2, 56, "Window size changed");
636    }
637#endif /* SIGWINDOW */
638
639#ifdef SIGWINCH
640    if (mesg[SIGWINCH].pname == NULL) {
641	mesg[SIGWINCH].iname = "WINCH";
642	mesg[SIGWINCH].pname = CSAVS(2, 56, "Window size changed");
643    }
644#endif /* SIGWINCH */
645
646#ifdef SIGPHONE
647    /* UNIXPC */
648    if (mesg[SIGPHONE].pname == NULL) {
649	mesg[SIGPHONE].iname = "PHONE";
650	mesg[SIGPHONE].pname = CSAVS(2, 57, "Phone status changed");
651    }
652# endif /* SIGPHONE */
653
654#ifdef SIGXCPU
655    if (mesg[SIGXCPU].pname == NULL) {
656	mesg[SIGXCPU].iname = "XCPU";
657	mesg[SIGXCPU].pname = CSAVS(2, 58, "Cputime limit exceeded");
658    }
659#endif /* SIGXCPU */
660
661#ifdef SIGXFSZ
662    if (mesg[SIGXFSZ].pname == NULL) {
663	mesg[SIGXFSZ].iname = "XFSZ";
664	mesg[SIGXFSZ].pname = CSAVS(2, 59, "Filesize limit exceeded");
665    }
666#endif /* SIGXFSZ */
667
668#ifdef SIGVTALRM
669    if (mesg[SIGVTALRM].pname == NULL) {
670	mesg[SIGVTALRM].iname = "VTALRM";
671	mesg[SIGVTALRM].pname = CSAVS(2, 60, "Virtual time alarm");
672    }
673#endif /* SIGVTALRM */
674
675#ifdef SIGPROF
676    if (mesg[SIGPROF].pname == NULL) {
677	mesg[SIGPROF].iname = "PROF";
678	mesg[SIGPROF].pname = CSAVS(2, 61, "Profiling time alarm");
679    }
680#endif /* SIGPROF */
681
682#ifdef SIGDIL
683    /* hpux */
684    if (mesg[SIGDIL].pname == NULL) {
685	mesg[SIGDIL].iname = "DIL";
686	mesg[SIGDIL].pname = CSAVS(2, 62, "DIL signal");
687    }
688#endif /* SIGDIL */
689
690#ifdef SIGPOLL
691    if (mesg[SIGPOLL].pname == NULL) {
692	mesg[SIGPOLL].iname = "POLL";
693	mesg[SIGPOLL].pname = CSAVS(2, 63, "Pollable event occured");
694    }
695#endif /* SIGPOLL */
696
697#ifdef SIGWAITING
698    /* solaris */
699    if (mesg[SIGWAITING].pname == NULL) {
700	mesg[SIGWAITING].iname = "WAITING";
701	mesg[SIGWAITING].pname = CSAVS(2, 64, "Process's lwps are blocked");
702    }
703#endif /* SIGWAITING */
704
705#ifdef SIGLWP
706    /* solaris */
707    if (mesg[SIGLWP].pname == NULL) {
708	mesg[SIGLWP].iname = "LWP";
709	mesg[SIGLWP].pname = CSAVS(2, 65, "Special LWP signal");
710    }
711#endif /* SIGLWP */
712
713#ifdef SIGFREEZE
714    /* solaris */
715    if (mesg[SIGFREEZE].pname == NULL) {
716	mesg[SIGFREEZE].iname = "FREEZE";
717	mesg[SIGFREEZE].pname = CSAVS(2, 66, "Special CPR Signal");
718    }
719#endif /* SIGFREEZE */
720
721#ifdef SIGTHAW
722    /* solaris */
723    if (mesg[SIGTHAW].pname == NULL) {
724	mesg[SIGTHAW].iname = "THAW";
725	mesg[SIGTHAW].pname = CSAVS(2, 67, "Special CPR Signal");
726    }
727#endif /* SIGTHAW */
728
729#ifdef SIGCANCEL
730    /* solaris */
731    if (mesg[SIGCANCEL].pname == NULL) {
732	mesg[SIGCANCEL].iname = "CANCEL";
733	mesg[SIGCANCEL].pname = CSAVS(2, 109,
734	    "Thread cancellation signal used by libthread");
735    }
736#endif /* SIGCANCEL */
737
738/*
739 * Careful, some OS's (HP/UX 10.0) define these as -1
740 */
741#ifdef SIGRTMIN
742    /*
743     * Cannot do this at compile time; Solaris2 uses _sysconf for these
744     */
745    if (SIGRTMIN > 0 && SIGRTMIN < NUMSIG) {
746	if (mesg[SIGRTMIN].pname == NULL) {
747	    mesg[SIGRTMIN].iname = "RTMIN";
748	    mesg[SIGRTMIN].pname = CSAVS(2, 68, "First Realtime Signal");
749	}
750
751	if (SIGRTMIN + 1 < SIGRTMAX && SIGRTMIN + 1 < NUMSIG &&
752	    mesg[SIGRTMIN+1].pname == NULL) {
753	    mesg[SIGRTMIN+1].iname = "RTMIN+1";
754	    mesg[SIGRTMIN+1].pname = CSAVS(2, 69, "Second Realtime Signal");
755	}
756
757	if (SIGRTMIN + 2 < SIGRTMAX && SIGRTMIN + 2 < NUMSIG &&
758	    mesg[SIGRTMIN+2].pname == NULL) {
759	    mesg[SIGRTMIN+2].iname = "RTMIN+2";
760	    mesg[SIGRTMIN+2].pname = CSAVS(2, 70, "Third Realtime Signal");
761	}
762
763	if (SIGRTMIN + 3 < SIGRTMAX && SIGRTMIN + 3 < NUMSIG &&
764	    mesg[SIGRTMIN+3].pname == NULL) {
765	    mesg[SIGRTMIN+3].iname = "RTMIN+3";
766	    mesg[SIGRTMIN+3].pname = CSAVS(2, 71, "Fourth Realtime Signal");
767	}
768    }
769#endif /* SIGRTMIN */
770
771#ifdef SIGRTMAX
772    /*
773     * Cannot do this at compile time; Solaris2 uses _sysconf for these
774     */
775    if (SIGRTMAX > 0 && SIGRTMAX < NUMSIG) {
776	if (SIGRTMAX - 3 > SIGRTMIN && mesg[SIGRTMAX-3].pname == NULL) {
777	    mesg[SIGRTMAX-3].iname = "RTMAX-3";
778	    mesg[SIGRTMAX-3].pname = CSAVS(2, 72,
779					   "Fourth Last Realtime Signal");
780	}
781
782	if (SIGRTMAX - 2 > SIGRTMIN && mesg[SIGRTMAX-2].pname == NULL) {
783	    mesg[SIGRTMAX-2].iname = "RTMAX-2";
784	    mesg[SIGRTMAX-2].pname = CSAVS(2, 73,
785					   "Third Last Realtime Signal");
786	}
787
788	if (SIGRTMAX - 1 > SIGRTMIN && mesg[SIGRTMAX-1].pname == NULL) {
789	    mesg[SIGRTMAX-1].iname = "RTMAX-1";
790	    mesg[SIGRTMAX-1].pname = CSAVS(2, 74,
791					   "Second Last Realtime Signal");
792	}
793
794	if (SIGRTMAX > SIGRTMIN && mesg[SIGRTMAX].pname == NULL) {
795	    mesg[SIGRTMAX].iname = "RTMAX";
796	    mesg[SIGRTMAX].pname = CSAVS(2, 75,
797					 "Last Realtime Signal");
798	}
799    }
800#endif /* SIGRTMAX */
801
802
803#ifdef SIGAIO
804    /* aiws */
805    if (mesg[SIGAIO].pname == NULL) {
806	mesg[SIGAIO].iname = "AIO";
807	mesg[SIGAIO].pname = CSAVS(2, 76, "LAN Asyncronous I/O");
808    }
809#endif /* SIGAIO */
810
811#ifdef SIGPTY
812    /* aiws */
813    if (mesg[SIGPTY].pname == NULL) {
814	mesg[SIGPTY].iname = "PTY";
815	mesg[SIGPTY].pname = CSAVS(2, 77, "PTY read/write availability");
816    }
817#endif /* SIGPTY */
818
819#ifdef SIGIOINT
820    /* aiws */
821    if (mesg[SIGIOINT].pname == NULL) {
822	mesg[SIGIOINT].iname = "IOINT";
823	mesg[SIGIOINT].pname = CSAVS(2, 78, "I/O intervention required");
824    }
825#endif /* SIGIOINT */
826
827#ifdef SIGGRANT
828    /* aiws */
829    if (mesg[SIGGRANT].pname == NULL) {
830	mesg[SIGGRANT].iname = "GRANT";
831	mesg[SIGGRANT].pname = CSAVS(2, 79, "HFT monitor mode granted");
832    }
833#endif /* SIGGRANT */
834
835#ifdef SIGRETRACT
836    /* aiws */
837    if (mesg[SIGRETRACT].pname == NULL) {
838	mesg[SIGRETRACT].iname = "RETRACT";
839	mesg[SIGRETRACT].pname = CSAVS(2, 80,
840				  "HFT monitor mode should be relinguished");
841    }
842#endif /* SIGRETRACT */
843
844#ifdef SIGSOUND
845    /* aiws */
846    if (mesg[SIGSOUND].pname == NULL) {
847	mesg[SIGSOUND].iname = "SOUND";
848	mesg[SIGSOUND].pname = CSAVS(2, 81, "HFT sound control has completed");
849    }
850#endif /* SIGSOUND */
851
852#ifdef SIGSMSG
853    /* aiws */
854    if (mesg[SIGSMSG].pname == NULL) {
855	mesg[SIGSMSG].iname = "SMSG";
856	mesg[SIGSMSG].pname = CSAVS(2, 82, "Data in HFT ring buffer");
857    }
858#endif /* SIGMSG */
859
860#ifdef SIGMIGRATE
861    /* IBMAIX */
862    if (mesg[SIGMIGRATE].pname == NULL) {
863	mesg[SIGMIGRATE].iname = "MIGRATE";
864	mesg[SIGMIGRATE].pname = CSAVS(2, 83, "Migrate process");
865    }
866#endif /* SIGMIGRATE */
867
868#ifdef SIGSAK
869    /* IBMAIX */
870    if (mesg[SIGSAK].pname == NULL) {
871	mesg[SIGSAK].iname = "SAK";
872	mesg[SIGSAK].pname = CSAVS(2, 84, "Secure attention key");
873    }
874#endif /* SIGSAK */
875
876#ifdef SIGRESCHED
877    /* CX/UX */
878    if (mesg[SIGRESCHED].pname == NULL) {
879	mesg[SIGRESCHED].iname = "RESCHED";
880	mesg[SIGRESCHED].pname = CSAVS(2, 85, "Reschedule");
881    }
882#endif /* SIGRESCHED */
883
884#ifdef SIGDEBUG
885    /* VMS_POSIX */
886    if (mesg[SIGDEBUG].pname == NULL) {
887	mesg[SIGDEBUG].iname = "DEBUG";
888	mesg[SIGDEBUG].pname = CSAVS(2, 86, "Signaling SS$_DEBUG");
889    }
890#endif /* SIGDEBUG */
891
892#ifdef SIGPRIO
893    /* Lynx */
894    if (mesg[SIGPRIO].pname == NULL) {
895	mesg[SIGPRIO].iname = "PRIO";
896	mesg[SIGPRIO].pname = CSAVS(2, 87, "Priority changed");
897    }
898#endif /* SIGPRIO */
899
900#ifdef SIGDLK
901    /* cray */
902    if (mesg[SIGDLK].pname == NULL) {
903	mesg[SIGDLK].iname = "DLK";
904	mesg[SIGDLK].pname = CSAVS(2, 88, "True deadlock detected");
905    }
906#endif /* SIGDLK */
907
908#ifdef SIGTINT
909    /* masscomp */
910    if (mesg[SIGTINT].pname == NULL) {
911	mesg[SIGTINT].iname = "TINT";
912	mesg[SIGTINT].pname = CSAVS(2, 89, "New input character");
913    }
914#endif /* SIGTINT */
915
916#ifdef SIGSTKFLT
917    if (mesg[SIGSTKFLT].pname == NULL) {
918	mesg[SIGSTKFLT].iname = "STKFLT";
919	mesg[SIGSTKFLT].pname = CSAVS(2, 90, "Stack limit exceeded");
920    }
921#endif /* SIGSTKFLT */
922
923#ifdef SIGUNUSED
924    if (mesg[SIGUNUSED].pname == NULL) {
925	mesg[SIGUNUSED].iname = "UNUSED";
926	mesg[SIGUNUSED].pname = CSAVS(2, 91, "Unused signal");
927    }
928#endif /* SIGUNUSED */
929
930#ifdef SIGOVLY
931    /* SX-4 */
932    if (mesg[SIGOVLY].pname == NULL) {
933	mesg[SIGOVLY].iname = "OVLY";
934	mesg[SIGOVLY].pname = CSAVS(2, 92, "LM overlay");
935    }
936#endif /* SIGOVLY */
937
938#ifdef SIGFRZ
939    /* SX-4 */
940    if (mesg[SIGFRZ].pname == NULL) {
941	mesg[SIGFRZ].iname = "FRZ";
942	mesg[SIGFRZ].pname = CSAVS(2, 93, "system freeze");
943    }
944#endif /* SIGFRZ */
945
946#ifdef SIGDFRZ
947    /* SX-4 */
948    if (mesg[SIGDFRZ].pname == NULL) {
949	mesg[SIGDFRZ].iname = "DFRZ";
950	mesg[SIGDFRZ].pname = CSAVS(2, 94, "system defreeze");
951    }
952#endif /* SIGDFRZ */
953
954#ifdef SIGDEAD
955    /* SX-4 */
956    if (mesg[SIGDEAD].pname == NULL) {
957	mesg[SIGDEAD].iname = "DEAD";
958	mesg[SIGDEAD].pname = CSAVS(2, 95, "dead lock");
959    }
960#endif /* SIGDEAD */
961
962#ifdef SIGXMEM
963    /* SX-4 */
964    if (mesg[SIGXMEM].pname == NULL) {
965	mesg[SIGXMEM].iname = "XMEM";
966	mesg[SIGXMEM].pname = CSAVS(2, 96, "exceeded memory size limit");
967    }
968#endif /* SIGXMEM */
969
970#ifdef SIGXDSZ
971    /* SX-4 */
972    if (mesg[SIGXDSZ].pname == NULL) {
973	mesg[SIGXDSZ].iname = "XDSZ";
974	mesg[SIGXDSZ].pname = CSAVS(2, 97, "exceeded data size limit");
975    }
976#endif /* SIGXDSZ */
977
978#ifdef SIGMEM32
979    /* SX-4 */
980    if (mesg[SIGMEM32].pname == NULL) {
981	mesg[SIGMEM32].iname = "MEM32";
982	mesg[SIGMEM32].pname = CSAVS(2, 98, "exceeded memory size limit of 32KB");
983    }
984#endif /* SIGMEM32 */
985
986#ifdef SIGNMEM
987    /* SX-4 */
988    if (mesg[SIGNMEM].pname == NULL) {
989	mesg[SIGNMEM].iname = "NMEM";
990	mesg[SIGNMEM].pname = CSAVS(2, 99, "exce error for no memory");
991    }
992#endif /* SIGNMEM */
993
994#ifdef SIGCHKP
995    /* SX-4 */
996    if (mesg[SIGCHKP].pname == NULL) {
997	mesg[SIGCHKP].iname = "CHKP";
998	mesg[SIGCHKP].pname = CSAVS(2, 100, "check point start");
999    }
1000#endif /* SIGCHKP */
1001
1002#ifdef SIGKCHKP
1003#if 0
1004    /* SX-4 */
1005    if (mesg[SIGKCHKP].pname == NULL) {
1006	mesg[SIGKCHKP].iname = "KCHKP";
1007	mesg[SIGKCHKP].pname = CSAVS(2, 101, "check point start of kernel");
1008    }
1009#endif
1010#endif /* SIGKCHKP */
1011
1012#ifdef SIGRSTA
1013    /* SX-4 */
1014    if (mesg[SIGRSTA].pname == NULL) {
1015	mesg[SIGRSTA].iname = "RSTA";
1016	mesg[SIGRSTA].pname = CSAVS(2, 102, "restart start");
1017    }
1018#endif /* SIGRSTA */
1019
1020#ifdef SIGKRSTA
1021#if 0
1022    /* SX-4 */
1023    if (mesg[SIGKRSTA].pname == NULL) {
1024	mesg[SIGKRSTA].iname = "KRSTA";
1025	mesg[SIGKRSTA].pname = CSAVS(2, 103, "restart of kernel");
1026    }
1027#endif
1028#endif /* SIGKRSTA */
1029
1030#ifdef SIGXXMU
1031    /* SX-4 */
1032    if (mesg[SIGXXMU].pname == NULL) {
1033	mesg[SIGXXMU].iname = "XXMU";
1034	mesg[SIGXXMU].pname = CSAVS(2, 104, "exeeded XMU size limit");
1035    }
1036#endif /* SIGXXMU */
1037
1038#ifdef SIGXRLG0
1039    /* SX-4 */
1040    if (mesg[SIGXRLG0].pname == NULL) {
1041	mesg[SIGXRLG0].iname = "XRLG0";
1042	mesg[SIGXRLG0].pname = CSAVS(2, 105, "exeeded RLG0 limit");
1043    }
1044#endif /* SIGXRLG0 */
1045
1046#ifdef SIGXRLG1
1047    /* SX-4 */
1048    if (mesg[SIGXRLG1].pname == NULL) {
1049	mesg[SIGXRLG1].iname = "XRLG1";
1050	mesg[SIGXRLG1].pname = CSAVS(2, 106, "exeeded RLG1 limit");
1051    }
1052#endif /* SIGXRLG1 */
1053
1054#ifdef SIGXRLG2
1055    /* SX-4 */
1056    if (mesg[SIGXRLG2].pname == NULL) {
1057	mesg[SIGXRLG2].iname = "XRLG2";
1058	mesg[SIGXRLG2].pname = CSAVS(2, 107, "exeeded RLG2 limit");
1059    }
1060#endif /* SIGXRLG2 */
1061
1062#ifdef SIGXRLG3
1063    /* SX-4 */
1064    if (mesg[SIGXRLG3].pname == NULL) {
1065	mesg[SIGXRLG3].iname = "XRLG3";
1066	mesg[SIGXRLG3].pname = CSAVS(2, 108, "exeeded RLG3 limit");
1067    }
1068#endif /* SIGXRLG3 */
1069}
1070