summaryrefslogtreecommitdiff
path: root/sd_daemon/exit-status.go
blob: b7fd305300472862c08d7e24a42c35a5d82199d4 (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
// Copyright 2015-2016, 2018 Luke Shumaker
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package sd_daemon

import (
	"fmt"
	"os"
)

// daemon(7) recommends using the exit codes defined in the "LSB
// recomendations for SysV init scripts"[1].
//
// BSD sysexits.h (which is also in GNU libc) defines several exit
// codes in the range 64-78.  These are typically used in the context
// of mail delivery; originating with BSD delivermail (the NCP
// predecessor to the TCP/IP sendmail), and are still used by modern
// mail systems such as Postfix to interpret the local(8) delivery
// agent's exit status.  Using these for service exit codes isn't
// recommended by LSB (which says they are in the range reserved for
// future LSB use) or by daemon(7).  However, they are used in
// practice, and are recognized by systemd.
//
// [1]: http://refspecs.linuxbase.org/LSB_5.0.0/LSB-Core-generic/LSB-Core-generic/iniscrptact.html
//
// sysexits(3): https://www.freebsd.org/cgi/man.cgi?query=sysexits
//
// local(8): http://www.postfix.org/local.8.html
const (
	//   0-  8 are currently defined by LSB.
	EXIT_SUCCESS         uint8 = 0
	EXIT_FAILURE         uint8 = 1
	EXIT_INVALIDARGUMENT uint8 = 2
	EXIT_NOTIMPLEMENTED  uint8 = 3
	EXIT_NOPERMISSION    uint8 = 4
	EXIT_NOTINSTALLED    uint8 = 5
	EXIT_NOTCONFIGURED   uint8 = 6
	EXIT_NOTRUNNING      uint8 = 7
	//
	//   8- 99 are reserved for future LSB use.
	//         However, let's provide the EX_ codes from
	//         sysexits.h anyway.
	EX_OK          uint8 = EXIT_SUCCESS
	EX_USAGE       uint8 = 64 // command line usage error
	EX_DATAERR     uint8 = 65 // data format error
	EX_NOINPUT     uint8 = 66 // cannot open input
	EX_NOUSER      uint8 = 67 // addressee unknown
	EX_NOHOST      uint8 = 68 // host name unknown
	EX_UNAVAILABLE uint8 = 69 // service unavailable
	EX_SOFTWARE    uint8 = 70 // internal software error
	EX_OSERR       uint8 = 71 // system error (e.g., can't fork)
	EX_OSFILE      uint8 = 72 // critical OS file missing
	EX_CANTCREAT   uint8 = 73 // can't create (user) output file
	EX_IOERR       uint8 = 74 // input/output error
	EX_TEMPFAIL    uint8 = 75 // temp failure; user is invited to retry
	EX_PROTOCOL    uint8 = 76 // remote error in protocol
	EX_NOPERM      uint8 = 77 // permission denied
	EX_CONFIG      uint8 = 78 // configuration error
	//
	// 100-149 are reserved for distribution use.
	//
	// 150-199 are reserved for application use.
	//
	// 200-254 are reserved (for init system use).
	//         So, take codes 200+ from systemd's
	//         `src/basic/exit-status.h`
	EXIT_CHDIR                   uint8 = 200 // SD v8+
	EXIT_NICE                    uint8 = 201 // SD v8+
	EXIT_FDS                     uint8 = 202 // SD v8+
	EXIT_EXEC                    uint8 = 203 // SD v8+
	EXIT_MEMORY                  uint8 = 204 // SD v8+
	EXIT_LIMITS                  uint8 = 205 // SD v8+
	EXIT_OOM_ADJUST              uint8 = 206 // SD v8+
	EXIT_SIGNAL_MASK             uint8 = 207 // SD v8+
	EXIT_STDIN                   uint8 = 208 // SD v8+
	EXIT_STDOUT                  uint8 = 209 // SD v8+
	EXIT_CHROOT                  uint8 = 210 // SD v8+
	EXIT_IOPRIO                  uint8 = 211 // SD v8+
	EXIT_TIMERSLACK              uint8 = 212 // SD v8+
	EXIT_SECUREBITS              uint8 = 213 // SD v8+
	EXIT_SETSCHEDULER            uint8 = 214 // SD v8+
	EXIT_CPUAFFINITY             uint8 = 215 // SD v8+
	EXIT_GROUP                   uint8 = 216 // SD v8+
	EXIT_USER                    uint8 = 217 // SD v8+
	EXIT_CAPABILITIES            uint8 = 218 // SD v8+
	EXIT_CGROUP                  uint8 = 219 // SD v8+
	EXIT_SETSID                  uint8 = 220 // SD v8+
	EXIT_CONFIRM                 uint8 = 221 // SD v8+
	EXIT_STDERR                  uint8 = 222 // SD v8+
	EXIT_TCPWRAP                 uint8 = 223 // SD v8-v211
	EXIT_PAM                     uint8 = 224 // SD v8+
	EXIT_NETWORK                 uint8 = 225 // SD v33+
	EXIT_NAMESPACE               uint8 = 226 // SD v38+
	EXIT_NO_NEW_PRIVILEGES       uint8 = 227 // SD v187+
	EXIT_SECCOMP                 uint8 = 228 // SD v187+
	EXIT_SELINUX_CONTEXT         uint8 = 229 // SD v209+
	EXIT_PERSONALITY             uint8 = 230 // SD v209+
	EXIT_APPARMOR_PROFILE        uint8 = 231 // SD v210+
	EXIT_ADDRESS_FAMILIES        uint8 = 232 // SD v211+
	EXIT_RUNTIME_DIRECTORY       uint8 = 233 // SD v211+
	EXIT_MAKE_STARTER            uint8 = 234 // SD v214-v234
	EXIT_CHOWN                   uint8 = 235 // SD v214+
	EXIT_SMACK_PROCESS_LABEL     uint8 = 236 // SD v230+; was BUS_ENDPOINT in SD v217-v229
	EXIT_KEYRING                 uint8 = 237 // SD v233+; was SMACK_PROCESS_LABEL in SD v218-v229
	EXIT_STATE_DIRECTORY         uint8 = 238 // SD v235+
	EXIT_CACHE_DIRECTORY         uint8 = 239 // SD v235+
	EXIT_LOGS_DIRECTORY          uint8 = 240 // SD v235+
	EXIT_CONFIGURATION_DIRECTORY uint8 = 241 // SD v235+
)

// Recover is a utility function to defer at the beginning of a
// goroutine in order to have the correct exit code in the case of a
// panic.
func Recover() {
	if r := recover(); r != nil {
		Log.Err(fmt.Sprintf("panic: %v", r))
		os.Exit(int(EXIT_FAILURE))
	}
}