1#!/bin/sh
2
3# Copyright 2016 The Go Authors. All rights reserved.
4# Use of this source code is governed by a BSD-style
5# license that can be found in the LICENSE file.
6
7# Create sigtab.go from gen-sysinfo.go.
8
9# This shell scripts creates the sigtab.go file, which maps signals to
10# their dispositions.  We generate a file so that we can build a
11# composite literal that only refers to signals that are defined on
12# this system.
13
14# This script simply writes to standard output.
15
16set -e
17
18echo '// Generated by mksigtab.sh.  Do not edit.'
19echo
20echo 'package runtime'
21echo
22echo 'var sigtable = [...]sigTabT{'
23
24SIGLIST=""
25
26# Handle signals valid on all Unix systems.
27
28addsig() {
29    echo "	$1: $2,"
30    # Get the signal number and add it to SIGLIST
31    signum=`grep "const $1 = " gen-sysinfo.go | sed -e 's/.* = //'`
32    if echo "$signum" | grep '^_SIG[A-Z0-9_]*$' >/dev/null 2>&1; then
33        # Recurse once to obtain signal number
34        # This is needed for some MIPS signals defined as aliases of other signals
35        signum=`grep "const $signum = " gen-sysinfo.go | sed -e 's/.* = //'`
36    fi
37    SIGLIST=$SIGLIST"_${signum}_"
38}
39
40echo '	0:          {0, "SIGNONE: no trap"},'
41addsig _SIGHUP     '{_SigNotify + _SigKill, "SIGHUP: terminal line hangup"}'
42addsig _SIGINT     '{_SigNotify + _SigKill, "SIGINT: interrupt"}'
43addsig _SIGQUIT    '{_SigNotify + _SigThrow, "SIGQUIT: quit"}'
44addsig _SIGILL     '{_SigThrow + _SigUnblock, "SIGILL: illegal instruction"}'
45addsig _SIGTRAP    '{_SigThrow + _SigUnblock, "SIGTRAP: trace trap"}'
46addsig _SIGABRT    '{_SigNotify + _SigThrow, "SIGABRT: abort"}'
47addsig _SIGBUS     '{_SigPanic + _SigUnblock, "SIGBUS: bus error"}'
48addsig _SIGFPE     '{_SigPanic + _SigUnblock, "SIGFPE: floating-point exception"}'
49addsig _SIGKILL    '{0, "SIGKILL: kill"}'
50addsig _SIGUSR1    '{_SigNotify, "SIGUSR1: user-defined signal 1"}'
51addsig _SIGSEGV    '{_SigPanic + _SigUnblock, "SIGSEGV: segmentation violation"}'
52addsig _SIGUSR2    '{_SigNotify, "SIGUSR2: user-defined signal 2"}'
53addsig _SIGPIPE    '{_SigNotify, "SIGPIPE: write to broken pipe"}'
54addsig _SIGALRM    '{_SigNotify, "SIGALRM: alarm clock"}'
55addsig _SIGTERM    '{_SigNotify + _SigKill, "SIGTERM: termination"}'
56addsig _SIGCHLD    '{_SigNotify + _SigUnblock, "SIGCHLD: child status has changed"}'
57addsig _SIGCONT    '{_SigNotify + _SigDefault, "SIGCONT: continue"}'
58addsig _SIGSTOP    '{0, "SIGSTOP: stop"}'
59addsig _SIGTSTP    '{_SigNotify + _SigDefault, "SIGTSTP: keyboard stop"}'
60addsig _SIGTTIN    '{_SigNotify + _SigDefault, "SIGTTIN: background read from tty"}'
61addsig _SIGTTOU    '{_SigNotify + _SigDefault, "SIGTTOU: background write to tty"}'
62addsig _SIGURG     '{_SigNotify, "SIGURG: urgent condition on socket"}'
63addsig _SIGXCPU    '{_SigNotify, "SIGXCPU: cpu limit exceeded"}'
64addsig _SIGXFSZ    '{_SigNotify, "SIGXFSZ: file size limit exceeded"}'
65addsig _SIGVTALRM  '{_SigNotify, "SIGVTALRM: virtual alarm clock"}'
66addsig _SIGPROF    '{_SigNotify + _SigUnblock, "SIGPROF: profiling alarm clock"}'
67addsig _SIGWINCH   '{_SigNotify, "SIGWINCH: window size change"}'
68addsig _SIGSYS     '{_SigThrow, "SIGSYS: bad system call"}'
69
70# Handle signals that are not supported on all systems.
71
72checksig() {
73    if grep "const $1 = " gen-sysinfo.go >/dev/null 2>&1 \
74	&& ! grep "const $1 = _SIG" gen-sysinfo.go > /dev/null 2>&1; then
75	addsig $1 "$2"
76    fi
77}
78
79checksig _SIGSTKFLT  '{_SigThrow + _SigUnblock, "SIGSTKFLT: stack fault"}'
80checksig _SIGIO      '{_SigNotify, "SIGIO: i/o now possible"}'
81checksig _SIGPWR     '{_SigNotify, "SIGPWR: power failure restart"}'
82checksig _SIGEMT     '{_SigThrow, "SIGEMT: emulate instruction executed"}'
83checksig _SIGINFO    '{_SigNotify, "SIGINFO: status request from keyboard"}'
84checksig _SIGTHR     '{_SigNotify, "SIGTHR: reserved"}'
85checksig _SIGPOLL    '{_SigNotify, "SIGPOLL: pollable event occurred"}'
86checksig _SIGWAITING '{_SigNotify, "SIGWAITING: reserved signal no longer used by"}'
87checksig _SIGLWP     '{_SigNotify, "SIGLWP: reserved signal no longer used by"}'
88checksig _SIGFREEZE  '{_SigNotify, "SIGFREEZE: special signal used by CPR"}'
89checksig _SIGTHAW    '{_SigNotify, "SIGTHAW: special signal used by CPR"}'
90checksig _SIGCANCEL  '{_SigSetStack + _SigUnblock, "SIGCANCEL: reserved signal for thread cancellation"}'
91checksig _SIGXRES    '{_SigNotify, "SIGXRES: resource control exceeded"}'
92checksig _SIGJVM1    '{_SigNotify, "SIGJVM1: reserved signal for Java Virtual Machine"}'
93checksig _SIGJVM2    '{_SigNotify, "SIGJVM2: reserved signal for Java Virtual Machine"}'
94
95# Special handling of signals 32 and 33 on GNU/Linux systems,
96# because they are special to glibc.
97if test "${GOOS}" = "linux"; then
98    SIGLIST=$SIGLIST"_32__33_"
99    echo '	32: {_SigSetStack + _SigUnblock, "signal 32"}, /* SIGCANCEL; see issue 6997 */'
100    echo '	33: {_SigSetStack + _SigUnblock, "signal 33"}, /* SIGSETXID; see issues 3871, 9400, 12498 */'
101fi
102
103if test "${GOOS}" = "aix"; then
104    # _NSIG = _NSIG32/_NSIG64 and _NSIG* = _SIGMAX* + 1
105    bits=`grep 'const _NSIG = _NSIG[0-9]*$' gen-sysinfo.go | sed -e 's/.* = _NSIG\([0-9]*\)/\1/'`
106    nsig=`grep "const _SIGMAX$bits = [0-9]*$" gen-sysinfo.go | sed -e 's/.* = \([0-9]*\)/\1/'`
107    nsig=`expr $nsig + 1`
108else
109    nsig=`grep 'const _*NSIG = [0-9]*$' gen-sysinfo.go | sed -e 's/.* = \([0-9]*\)/\1/'`
110    if test -z "$nsig"; then
111	if grep 'const _*NSIG = [ (]*_*SIGRTMAX + 1[ )]*' gen-sysinfo.go >/dev/null 2>&1; then
112	    rtmax=`grep 'const _*SIGRTMAX = [0-9]*$' gen-sysinfo.go | sed -e 's/.* = \([0-9]*\)/\1/'`
113	    if test -n "$rtmax"; then
114		nsig=`expr $rtmax + 1`
115	    fi
116	fi
117    fi
118fi
119
120if test -z "$nsig"; then
121    echo 1>&2 "could not determine number of signals"
122    exit 1
123fi
124
125i=1
126# Fill in the remaining signal numbers in sigtable
127while test "$i" -lt "$nsig"; do
128    if ! echo $SIGLIST | grep "_${i}_" >/dev/null 2>&1; then
129	echo "	$i: {_SigNotify, \"signal $i\"},"
130    fi
131    i=`expr "$i" + 1`
132done
133echo '}'
134