1 ?RCS: $Id: Signal.U,v 3.0.1.1 1997/02/28 15:20:01 ram Exp $
3 ?RCS: Copyright (c) 1991-1993, Raphael Manfredi
5 ?RCS: You may redistribute only under the terms of the Artistic Licence,
6 ?RCS: as specified in the README file that comes with the distribution.
7 ?RCS: You may reuse parts of this distribution only within the terms of
8 ?RCS: that same Artistic Licence; a copy of which may be found at the root
9 ?RCS: of the source tree for dist 3.0.
11 ?RCS: $Log: Signal.U,v $
12 ?RCS: Revision 3.0.1.1 1997/02/28 15:20:01 ram
13 ?RCS: patch61: created
16 ?X: This unit produces three files:
17 ?X: 1- A signal.c file, which, when compiled and run, produces an output like:
24 ?X: 2- A signal.awk script to parse the output of signal.c, fill
25 ?X: in gaps (up to NSIG) and move duplicates to the end.
26 ?X: 3- A signal_cmd script to compile signal.c and run it
27 ?X: through sort -n -k 2 | uniq | awk -f signal.awk.
28 ?X: (we try also sort -n +1 since some old hosts don't grok sort -k)
29 ?X: (This is called signal_cmd to avoid OS/2 confusion with
30 ?X: signal.cmd vs. signal.
31 ?X: The signal_cmd script also falls back on checking signals one at a
32 ?X: time in case the signal.c program fails. On at least one version of
33 ?X: Linux 2.1.x, the header file #define'd SIGRTMAX to a symbol that
34 ?X: is not defined by the compiler/linker. :-(. Further, on that same
35 ?X: version of Linux, the user had a defective C-shell that gave an
36 ?X: incorrect list for kill -l, so the fall-back didn't work.
38 ?X: This unit is then used by sig_name.U.
40 ?MAKE:Signal: test tr rm awk cat grep startsh eunicefix sed sort uniq \
41 Findhdr cppstdin +cppflags cppminus Compile _o _exe trnl run i_stdlib
42 ?MAKE: -pick add $@ %<
43 ?X:all files declared as "public" since they're used from other units
44 ?F:signal.c signal_cmd signal.lst signal signal.awk
46 : Trace out the files included by signal.h, then look for SIGxxx names.
47 : Remove SIGARRAYSIZE used by HPUX.
48 : Remove SIGSTKSIZE used by Linux.
49 : Remove SIGSTKSZ used by Posix.
50 : Remove SIGTYP void lines used by OS2.
51 : Some cpps, like os390, dont give the file name anywhere
52 if [ "X$fieldn" = X ]; then
53 : Just make some guesses. We check them later.
54 xxx='/usr/include/signal.h /usr/include/sys/signal.h'
56 xxx=`echo '#include <signal.h>' |
57 $cppstdin $cppminus $cppflags 2>/dev/null |
58 $grep '^[ ]*#.*include' |
59 $awk "{print \\$$fieldn}" | $sed 's!"!!g' | $sed 's!\\\\\\\\!/!g' | $sort | $uniq`
61 : Check this list of files to be sure we have parsed the cpp output ok.
62 : This will also avoid potentially non-existent files, such
65 ?X: Add /dev/null in case the $xxx list is empty.
66 for xx in $xxx /dev/null ; do
67 $test -f "$xx" && xxxfiles="$xxxfiles $xx"
69 : If we have found no files, at least try signal.h
71 '') xxxfiles=`./findhdr signal.h` ;;
74 $1 ~ /^#define$/ && $2 ~ /^SIG[A-Z0-9]*$/ && $2 !~ /SIGARRAYSIZE/ && $2 !~ /SIGSTKSIZE/ && $2 !~ /SIGSTKSZ/ && $3 !~ /void/ {
75 print substr($2, 4, 20)
77 $1 == "#" && $2 ~ /^define$/ && $3 ~ /^SIG[A-Z0-9]*$/ && $3 !~ /SIGARRAYSIZE/ && $4 !~ /void/ {
78 print substr($3, 4, 20)
80 : Append some common names just in case the awk scan failed.
81 xxx="$xxx ABRT ALRM BUS CANCEL CHLD CLD CONT DIL EMT FPE"
82 xxx="$xxx FREEZE HUP ILL INT IO IOT KILL LOST LWP PHONE"
83 xxx="$xxx PIPE POLL PROF PWR QUIT RTMAX RTMIN SEGV STKFLT STOP"
84 xxx="$xxx SYS TERM THAW TRAP TSTP TTIN TTOU URG USR1 USR2"
85 xxx="$xxx USR3 USR4 VTALRM WAITING WINCH WIND WINDOW XCPU XFSZ"
87 : generate a few handy files for later
88 $cat > signal.c <<EOCP
89 #include <sys/types.h>
98 /* Strange style to avoid deeply-nested #if/#else/#endif */
101 # define NSIG (_NSIG)
107 # define NSIG (SIGMAX+1)
113 # define NSIG (SIG_MAX+1)
119 # define NSIG (_SIG_MAX+1)
125 # define NSIG (MAXSIG+1)
131 # define NSIG (MAX_SIG+1)
137 # define NSIG SIGARRAYSIZE /* Assume ary[SIGARRAYSIZE] */
143 # define NSIG (_sys_nsig) /* Solaris 2.5 */
147 /* Default to some arbitrary number that's big enough to get most
148 of the common signals.
154 printf("NSIG %d\n", NSIG);
160 echo $xxx | $tr ' ' $trnl | $sort | $uniq | $awk '
162 printf "#ifdef SIG"; printf $1; printf "\n"
163 printf "printf(\""; printf $1; printf " %%d\\n\",SIG";
164 printf $1; printf ");\n"
168 printf "#endif /* JUST_NSIG */\n";
169 printf "exit(0);\n}\n";
172 $cat >signal.awk <<'EOP'
174 $1 ~ /^NSIG$/ { nsig = $2 }
175 ($1 !~ /^NSIG$/) && (NF == 2) && ($2 ~ /^[0-9][0-9]*$/) {
176 if ($2 > maxsig) { maxsig = $2 }
191 printf("NSIG %d\n", nsig);
192 for (n = 1; n < nsig; n++) {
194 printf("%s %d\n", sig_name[n], sig_num[n])
197 printf("NUM%d %d\n", n, n)
200 for (n = 0; n < ndups; n++) {
201 printf("%s %d\n", dup_name[n], dup_num[n])
205 $cat >signal_cmd <<EOS
207 if $test -s signal.lst; then
208 echo "Using your existing signal.lst file"
213 ?X: Avoid variable interpolation problems, especially with
214 ?X: xxx, which contains newlines.
215 $cat >>signal_cmd <<'EOS'
218 if eval $compile_ok; then
219 $run ./signal$_exe | ($sort -n -k 2 2>/dev/null || $sort -n +1) | $uniq | $awk -f signal.awk >signal.lst
221 echo "(I can't seem be able to compile the whole test program)" >&4
222 echo "(I'll try it in little pieces.)" >&4
223 set signal -DJUST_NSIG
224 if eval $compile_ok; then
225 $run ./signal$_exe > signal.nsg
228 echo "I can't seem to figure out how many signals you have." >&4
229 echo "Guessing 50." >&4
230 echo 'NSIG 50' > signal.nsg
232 : Now look at all the signal names, one at a time.
233 for xx in `echo $xxx | $tr ' ' $trnl | $sort | $uniq`; do
234 $cat > signal.c <<EOCP
235 #include <sys/types.h>
239 printf("$xx %d\n", SIG${xx});
244 if eval $compile; then
245 echo "SIG${xx} found."
246 $run ./signal$_exe >> signal.ls1
248 echo "SIG${xx} NOT found."
251 if $test -s signal.ls1; then
252 $cat signal.nsg signal.ls1 |
253 $sort -n | $uniq | $awk -f signal.awk >signal.lst
257 if $test -s signal.lst; then
260 echo "(AAK! I can't compile the test programs -- Guessing)" >&4
261 echo 'kill -l' >signal
262 set X `csh -f <signal`
266 0) set HUP INT QUIT ILL TRAP ABRT EMT FPE KILL BUS SEGV SYS PIPE ALRM TERM;;
268 echo $@ | $tr ' ' $trnl | \
269 $awk '{ printf "%s %d\n", $1, ++s; }
270 END { printf "NSIG %d\n", ++s }' >signal.lst
272 $rm -f signal.c signal$_exe signal$_o signal.nsg signal.ls1
275 $eunicefix signal_cmd