summaryrefslogtreecommitdiff
path: root/libgo/mksigtab.sh
blob: 11e4ec436bd893202ebca4c685d41b9ea50b1ce8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#!/bin/sh

# Copyright 2016 The Go Authors. All rights reserved.
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file.

# Create sigtab.go from gen-sysinfo.go.

# This shell scripts creates the sigtab.go file, which maps signals to
# their dispositions.  We generate a file so that we can build a
# composite literal that only refers to signals that are defined on
# this system.

# This script simply writes to standard output.

set -e

echo '// Generated by mksigtab.sh.  Do not edit.'
echo
echo 'package runtime'
echo
echo 'var sigtable = [...]sigTabT{'

SIGLIST=""

# Handle signals valid on all Unix systems.

addsig() {
    echo "	$1: $2,"
    # Get the signal number and add it to SIGLIST
    signum=`grep "const $1 = " gen-sysinfo.go | sed -e 's/.* = //'`
    if echo "$signum" | grep '^_SIG[A-Z0-9_]*$' >/dev/null 2>&1; then
        # Recurse once to obtain signal number
        # This is needed for some MIPS signals defined as aliases of other signals
        signum=`grep "const $signum = " gen-sysinfo.go | sed -e 's/.* = //'`
    fi
    SIGLIST=$SIGLIST"_${signum}_"
}

echo '	0:          {0, "SIGNONE: no trap"},'
addsig _SIGHUP     '{_SigNotify + _SigKill, "SIGHUP: terminal line hangup"}'
addsig _SIGINT     '{_SigNotify + _SigKill, "SIGINT: interrupt"}'
addsig _SIGQUIT    '{_SigNotify + _SigThrow, "SIGQUIT: quit"}'
addsig _SIGILL     '{_SigThrow + _SigUnblock, "SIGILL: illegal instruction"}'
addsig _SIGTRAP    '{_SigThrow + _SigUnblock, "SIGTRAP: trace trap"}'
addsig _SIGABRT    '{_SigNotify + _SigThrow, "SIGABRT: abort"}'
addsig _SIGBUS     '{_SigPanic + _SigUnblock, "SIGBUS: bus error"}'
addsig _SIGFPE     '{_SigPanic + _SigUnblock, "SIGFPE: floating-point exception"}'
addsig _SIGKILL    '{0, "SIGKILL: kill"}'
addsig _SIGUSR1    '{_SigNotify, "SIGUSR1: user-defined signal 1"}'
addsig _SIGSEGV    '{_SigPanic + _SigUnblock, "SIGSEGV: segmentation violation"}'
addsig _SIGUSR2    '{_SigNotify, "SIGUSR2: user-defined signal 2"}'
addsig _SIGPIPE    '{_SigNotify, "SIGPIPE: write to broken pipe"}'
addsig _SIGALRM    '{_SigNotify, "SIGALRM: alarm clock"}'
addsig _SIGTERM    '{_SigNotify + _SigKill, "SIGTERM: termination"}'
addsig _SIGCHLD    '{_SigNotify + _SigUnblock, "SIGCHLD: child status has changed"}'
addsig _SIGCONT    '{_SigNotify + _SigDefault, "SIGCONT: continue"}'
addsig _SIGSTOP    '{0, "SIGSTOP: stop"}'
addsig _SIGTSTP    '{_SigNotify + _SigDefault, "SIGTSTP: keyboard stop"}'
addsig _SIGTTIN    '{_SigNotify + _SigDefault, "SIGTTIN: background read from tty"}'
addsig _SIGTTOU    '{_SigNotify + _SigDefault, "SIGTTOU: background write to tty"}'
addsig _SIGURG     '{_SigNotify, "SIGURG: urgent condition on socket"}'
addsig _SIGXCPU    '{_SigNotify, "SIGXCPU: cpu limit exceeded"}'
addsig _SIGXFSZ    '{_SigNotify, "SIGXFSZ: file size limit exceeded"}'
addsig _SIGVTALRM  '{_SigNotify, "SIGVTALRM: virtual alarm clock"}'
addsig _SIGPROF    '{_SigNotify + _SigUnblock, "SIGPROF: profiling alarm clock"}'
addsig _SIGWINCH   '{_SigNotify, "SIGWINCH: window size change"}'
addsig _SIGSYS     '{_SigThrow, "SIGSYS: bad system call"}'

# Handle signals that are not supported on all systems.

checksig() {
    if grep "const $1 = " gen-sysinfo.go >/dev/null 2>&1 \
	&& ! grep "const $1 = _SIG" gen-sysinfo.go > /dev/null 2>&1; then
	addsig $1 "$2"
    fi
}

checksig _SIGSTKFLT  '{_SigThrow + _SigUnblock, "SIGSTKFLT: stack fault"}'
checksig _SIGIO      '{_SigNotify, "SIGIO: i/o now possible"}'
checksig _SIGPWR     '{_SigNotify, "SIGPWR: power failure restart"}'
checksig _SIGEMT     '{_SigThrow, "SIGEMT: emulate instruction executed"}'
checksig _SIGINFO    '{_SigNotify, "SIGINFO: status request from keyboard"}'
checksig _SIGTHR     '{_SigNotify, "SIGTHR: reserved"}'
checksig _SIGPOLL    '{_SigNotify, "SIGPOLL: pollable event occurred"}'
checksig _SIGWAITING '{_SigNotify, "SIGWAITING: reserved signal no longer used by"}'
checksig _SIGLWP     '{_SigNotify, "SIGLWP: reserved signal no longer used by"}'
checksig _SIGFREEZE  '{_SigNotify, "SIGFREEZE: special signal used by CPR"}'
checksig _SIGTHAW    '{_SigNotify, "SIGTHAW: special signal used by CPR"}'
checksig _SIGCANCEL  '{_SigSetStack + _SigUnblock, "SIGCANCEL: reserved signal for thread cancellation"}'
checksig _SIGXRES    '{_SigNotify, "SIGXRES: resource control exceeded"}'
checksig _SIGJVM1    '{_SigNotify, "SIGJVM1: reserved signal for Java Virtual Machine"}'
checksig _SIGJVM2    '{_SigNotify, "SIGJVM2: reserved signal for Java Virtual Machine"}'
checksig _SIGLOST '   {_SigNotify, "SIGLOST: resource lost (Sun); server died (GNU)"}'

# Special handling of signals 32 and 33 on GNU/Linux systems,
# because they are special to glibc.
if test "${GOOS}" = "linux"; then
    SIGLIST=$SIGLIST"_32__33_"
    echo '	32: {_SigSetStack + _SigUnblock, "signal 32"}, /* SIGCANCEL; see issue 6997 */'
    echo '	33: {_SigSetStack + _SigUnblock, "signal 33"}, /* SIGSETXID; see issues 3871, 9400, 12498 */'
fi

if test "${GOOS}" = "aix"; then
    # _NSIG = _NSIG32/_NSIG64 and _NSIG* = _SIGMAX* + 1
    bits=`grep 'const _NSIG = _NSIG[0-9]*$' gen-sysinfo.go | sed -e 's/.* = _NSIG\([0-9]*\)/\1/'`
    nsig=`grep "const _SIGMAX$bits = [0-9]*$" gen-sysinfo.go | sed -e 's/.* = \([0-9]*\)/\1/'`
    nsig=`expr $nsig + 1`
else
    nsig=`grep 'const _*NSIG = [0-9]*$' gen-sysinfo.go | sed -e 's/.* = \([0-9]*\)/\1/'`
    if test -z "$nsig"; then
	if grep 'const _*NSIG = [ (]*_*SIGRTMAX + 1[ )]*' gen-sysinfo.go >/dev/null 2>&1; then
	    rtmax=`grep 'const _*SIGRTMAX = [0-9]*$' gen-sysinfo.go | sed -e 's/.* = \([0-9]*\)/\1/'`
	    if test -n "$rtmax"; then
		nsig=`expr $rtmax + 1`
	    elif grep 'const _*SIGRTMAX = [ (]*_*SIGRTMIN[ )]*' gen-sysinfo.go >/dev/null 2>&1; then
		rtmin=`grep 'const _*SIGRTMIN = [0-9]*$' gen-sysinfo.go | sed -e 's/.* = \([0-9]*\)/\1/'`
		if test -n "$rtmin"; then
		    nsig=`expr $rtmin + 1`
		fi
	    fi
	fi
    fi
fi

if test -z "$nsig"; then
    echo 1>&2 "could not determine number of signals"
    exit 1
fi

i=1
# Fill in the remaining signal numbers in sigtable
while test "$i" -lt "$nsig"; do
    if ! echo $SIGLIST | grep "_${i}_" >/dev/null 2>&1; then
	echo "	$i: {_SigNotify, \"signal $i\"},"
    fi
    i=`expr "$i" + 1`
done
echo '}'