This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[UTIL] Perl system does not default to $_
[metaconfig.git] / dist / U / Signal.U
CommitLineData
33a01fd2 1?RCS: $Id$
d8875586
MBT
2?RCS:
3?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi
33a01fd2
MBT
4?RCS:
5?RCS: You may redistribute only under the terms of the Artistic License,
d8875586
MBT
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
33a01fd2 8?RCS: that same Artistic License; a copy of which may be found at the root
d8875586
MBT
9?RCS: of the source tree for dist 4.0.
10?RCS:
11?RCS: $Log: Signal.U,v $
12?RCS: Revision 3.0.1.1 1997/02/28 15:20:01 ram
13?RCS: patch61: created
14?RCS:
15?X:
16?X: This unit produces three files:
17?X:
18?X: 1- A signal.c file, which, when compiled and run, produces an output like:
19?X:
20?X: HUP 1
21?X: INT 2
22?X: QUIT 3
23?X: etc...
24?X:
25?X: 2- A signal.awk script to parse the output of signal.c, fill
26?X: in gaps (up to NSIG) and move duplicates to the end.
27?X:
28?X: 3- A signal_cmd script to compile signal.c and run it
29?X: through sort -n -k 2 | uniq | awk -f signal.awk.
30?X: (we try also sort -n +1 since some old hosts don't grok sort -k)
31?X: (This is called signal_cmd to avoid OS/2 confusion with
32?X: signal.cmd vs. signal.
33?X: The signal_cmd script also falls back on checking signals one at a
34?X: time in case the signal.c program fails. On at least one version of
35?X: Linux 2.1.x, the header file #define'd SIGRTMAX to a symbol that
36?X: is not defined by the compiler/linker. :-(. Further, on that same
37?X: version of Linux, the user had a defective C-shell that gave an
38?X: incorrect list for kill -l, so the fall-back didn't work.
39?X:
40?X: This unit is then used by sig_name.U.
41?X:
42?MAKE:Signal: test tr rm awk cat grep startsh eunicefix sed sort uniq \
43 Findhdr cppstdin +cppflags cppminus Compile trnl run
44?MAKE: -pick add $@ %<
45?X:all files declared as "public" since they're used from other units
46?F:signal.c signal_cmd signal.lst signal signal.awk
47?T: xx xxx xxxfiles
48?LINT:use rm run
49: Trace out the files included by signal.h, then look for SIGxxx names.
50?X: Remove SIGARRAYSIZE used by HPUX.
51?X: Remove SIGSTKSIZE used by Linux.
52?X: Remove SIGSTKSZ used by Posix.
53?X: Remove SIGTYP void lines used by OS2.
54?X: Some cpps, like os390, dont give the file name anywhere
55if [ "X$fieldn" = X ]; then
56 : Just make some guesses. We check them later.
57 xxx='/usr/include/signal.h /usr/include/sys/signal.h'
58else
59 xxx=`echo '#include <signal.h>' |
60 $cppstdin $cppminus $cppflags 2>/dev/null |
61 $grep '^[ ]*#.*include' |
62 $awk "{print \\$$fieldn}" | $sed 's!"!!g' |\
63 $sed 's!\\\\\\\\!/!g' | $sort | $uniq`
64fi
65?X: Check this list of files to be sure we have parsed the cpp output ok.
66?X: This will also avoid potentially non-existent files, such
67?X: as ../foo/bar.h
68xxxfiles=''
69?X: Add /dev/null in case the $xxx list is empty.
70for xx in $xxx /dev/null ; do
71 $test -f "$xx" && xxxfiles="$xxxfiles $xx"
72done
73?X: If we have found no files, at least try signal.h
74case "$xxxfiles" in
75'') xxxfiles=`./findhdr signal.h` ;;
76esac
77xxx=`awk '
78$1 ~ /^#define$/ && $2 ~ /^SIG[A-Z0-9]*$/ && $2 !~ /SIGARRAYSIZE/ && $2 !~ /SIGSTKSIZE/ && $2 !~ /SIGSTKSZ/ && $3 !~ /void/ {
79 print substr($2, 4, 20)
80}
81$1 == "#" && $2 ~ /^define$/ && $3 ~ /^SIG[A-Z0-9]*$/ && $3 !~ /SIGARRAYSIZE/ && $4 !~ /void/ {
82 print substr($3, 4, 20)
83}' $xxxfiles`
84: Append some common names just in case the awk scan failed.
85xxx="$xxx ABRT ALRM BUS CANCEL CHLD CLD CONT DIL EMT FPE"
86xxx="$xxx FREEZE HUP ILL INT IO IOT KILL LOST LWP PHONE"
87xxx="$xxx PIPE POLL PROF PWR QUIT RTMAX RTMIN SEGV STKFLT STOP"
88xxx="$xxx SYS TERM THAW TRAP TSTP TTIN TTOU URG USR1 USR2"
89xxx="$xxx USR3 USR4 VTALRM WAITING WINCH WIND WINDOW XCPU XFSZ"
90
91: generate a few handy files for later
92$cat > signal.c <<'EOCP'
93#include <sys/types.h>
94#include <signal.h>
95#include <stdio.h>
96int main() {
97
98/* Strange style to avoid deeply-nested #if/#else/#endif */
99#ifndef NSIG
100# ifdef _NSIG
101# define NSIG (_NSIG)
102# endif
103#endif
104
105#ifndef NSIG
106# ifdef SIGMAX
107# define NSIG (SIGMAX+1)
108# endif
109#endif
110
111#ifndef NSIG
112# ifdef SIG_MAX
113# define NSIG (SIG_MAX+1)
114# endif
115#endif
116
117#ifndef NSIG
118# ifdef MAXSIG
119# define NSIG (MAXSIG+1)
120# endif
121#endif
122
123#ifndef NSIG
124# ifdef MAX_SIG
125# define NSIG (MAX_SIG+1)
126# endif
127#endif
128
129#ifndef NSIG
130# ifdef SIGARRAYSIZE
131# define NSIG (SIGARRAYSIZE+1) /* Not sure of the +1 */
132# endif
133#endif
134
135#ifndef NSIG
136# ifdef _sys_nsig
137# define NSIG (_sys_nsig) /* Solaris 2.5 */
138# endif
139#endif
140
141/* Default to some arbitrary number that's big enough to get most
142 of the common signals.
143*/
144#ifndef NSIG
145# define NSIG 50
146#endif
147
148printf("NSIG %d\n", NSIG);
149
150#ifndef JUST_NSIG
151
152EOCP
153
154echo $xxx | $tr ' ' $trnl | $sort | $uniq | $awk '
155{
156 printf "#ifdef SIG"; printf $1; printf "\n"
157 printf "printf(\""; printf $1; printf " %%d\\n\",SIG";
158 printf $1; printf ");\n"
159 printf "#endif\n"
160}
161END {
162 printf "#endif /* JUST_NSIG */\n";
163 printf "exit(0);\n}\n";
164}
165' >>signal.c
166$cat >signal.awk <<'EOP'
167BEGIN { ndups = 0 }
168$1 ~ /^NSIG$/ { nsig = $2 }
169($1 !~ /^NSIG$/) && (NF == 2) {
170 if ($2 > maxsig) { maxsig = $2 }
171 if (sig_name[$2]) {
172 dup_name[ndups] = $1
173 dup_num[ndups] = $2
174 ndups++
175 }
176 else {
177 sig_name[$2] = $1
178 sig_num[$2] = $2
179 }
180}
181END {
182 if (nsig == 0) {
183 nsig = maxsig + 1
184 }
185 printf("NSIG %d\n", nsig);
186 for (n = 1; n < nsig; n++) {
187 if (sig_name[n]) {
188 printf("%s %d\n", sig_name[n], sig_num[n])
189 }
190 else {
191 printf("NUM%d %d\n", n, n)
192 }
193 }
194 for (n = 0; n < ndups; n++) {
195 printf("%s %d\n", dup_name[n], dup_num[n])
196 }
197}
198EOP
199$cat >signal_cmd <<EOS
200$startsh
201if $test -s signal.lst; then
202 echo "Using your existing signal.lst file"
203 exit 0
204fi
205xxx="$xxx"
206EOS
207?X: Avoid variable interpolation problems, especially with
208?X: xxx, which contains newlines.
209$cat >>signal_cmd <<'EOS'
210
211set signal
212if eval $compile_ok; then
213 $run ./signal$_exe | ($sort -n -k 2 2>/dev/null || $sort -n +1) |\
214 $uniq | $awk -f signal.awk >signal.lst
215else
216 echo "(I can't seem be able to compile the whole test program)" >&4
217 echo "(I'll try it in little pieces.)" >&4
218 set signal -DJUST_NSIG
219 if eval $compile_ok; then
220 $run ./signal$_exe > signal.nsg
221 $cat signal.nsg
222 else
223 echo "I can't seem to figure out how many signals you have." >&4
224 echo "Guessing 50." >&4
225 echo 'NSIG 50' > signal.nsg
226 fi
227 : Now look at all the signal names, one at a time.
228 for xx in `echo $xxx | $tr ' ' $trnl | $sort | $uniq`; do
229 $cat > signal.c <<EOCP
230#include <sys/types.h>
231#include <signal.h>
232#include <stdio.h>
233int main() {
234printf("$xx %d\n", SIG${xx});
235return 0;
236}
237EOCP
238 set signal
239 if eval $compile; then
240 echo "SIG${xx} found."
241 $run ./signal$_exe >> signal.ls1
242 else
243 echo "SIG${xx} NOT found."
244 fi
245 done
246 if $test -s signal.ls1; then
247 $cat signal.nsg signal.ls1 |
248 $sort -n | $uniq | $awk -f signal.awk >signal.lst
249 fi
250
251fi
252if $test -s signal.lst; then
253 :
254else
255 echo "(AAK! I can't compile the test programs -- Guessing)" >&4
256 echo 'kill -l' >signal
257 set X `csh -f <signal`
258 $rm -f signal
259 shift
260 case $# in
261 0) set HUP INT QUIT ILL TRAP ABRT EMT FPE KILL BUS SEGV SYS PIPE ALRM TERM;;
262 esac
263 echo $@ | $tr ' ' $trnl | \
264 $awk '{ printf "%s %d\n", $1, ++s; }
265 END { printf "NSIG %d\n", ++s }' >signal.lst
266fi
267$rm -f signal.c signal$_exe signal$_o signal.nsg signal.ls1
268EOS
269chmod a+x signal_cmd
270$eunicefix signal_cmd
271