]>
git.ipfire.org Git - thirdparty/systemd.git/blob - src/basic/exit-status.c
2 This file is part of systemd.
4 Copyright 2010 Lennart Poettering
6 systemd is free software; you can redistribute it and/or modify it
7 under the terms of the GNU Lesser General Public License as published by
8 the Free Software Foundation; either version 2.1 of the License, or
9 (at your option) any later version.
11 systemd is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
16 You should have received a copy of the GNU Lesser General Public License
17 along with systemd; If not, see <http://www.gnu.org/licenses/>.
23 #include "exit-status.h"
27 const char* exit_status_to_string(ExitStatus status
, ExitStatusLevel level
) {
29 /* We cast to int here, so that -Wenum doesn't complain that
30 * EXIT_SUCCESS/EXIT_FAILURE aren't in the enum */
32 switch ((int) status
) {
42 if (level
== EXIT_STATUS_SYSTEMD
|| level
== EXIT_STATUS_LSB
) {
43 switch ((int) status
) {
66 case EXIT_SIGNAL_MASK
:
87 case EXIT_SETSCHEDULER
:
88 return "SETSCHEDULER";
90 case EXIT_CPUAFFINITY
:
99 case EXIT_CAPABILITIES
:
100 return "CAPABILITIES";
123 case EXIT_NO_NEW_PRIVILEGES
:
124 return "NO_NEW_PRIVILEGES";
129 case EXIT_SELINUX_CONTEXT
:
130 return "SELINUX_CONTEXT";
132 case EXIT_PERSONALITY
:
133 return "PERSONALITY";
135 case EXIT_APPARMOR_PROFILE
:
138 case EXIT_ADDRESS_FAMILIES
:
139 return "ADDRESS_FAMILIES";
141 case EXIT_RUNTIME_DIRECTORY
:
142 return "RUNTIME_DIRECTORY";
147 case EXIT_MAKE_STARTER
:
148 return "MAKE_STARTER";
150 case EXIT_BUS_ENDPOINT
:
151 return "BUS_ENDPOINT";
153 case EXIT_SMACK_PROCESS_LABEL
:
154 return "SMACK_PROCESS_LABEL";
158 if (level
== EXIT_STATUS_LSB
) {
159 switch ((int) status
) {
161 case EXIT_INVALIDARGUMENT
:
162 return "INVALIDARGUMENT";
164 case EXIT_NOTIMPLEMENTED
:
165 return "NOTIMPLEMENTED";
167 case EXIT_NOPERMISSION
:
168 return "NOPERMISSION";
170 case EXIT_NOTINSTALLED
:
171 return "NOTINSTALLED";
173 case EXIT_NOTCONFIGURED
:
174 return "NOTCONFIGURED";
176 case EXIT_NOTRUNNING
:
185 bool is_clean_exit(int code
, int status
, ExitStatusSet
*success_status
) {
187 if (code
== CLD_EXITED
)
188 return status
== 0 ||
190 set_contains(success_status
->status
, INT_TO_PTR(status
)));
192 /* If a daemon does not implement handlers for some of the
193 * signals that's not considered an unclean shutdown */
194 if (code
== CLD_KILLED
)
201 set_contains(success_status
->signal
, INT_TO_PTR(status
)));
206 bool is_clean_exit_lsb(int code
, int status
, ExitStatusSet
*success_status
) {
208 if (is_clean_exit(code
, status
, success_status
))
212 code
== CLD_EXITED
&&
213 (status
== EXIT_NOTINSTALLED
|| status
== EXIT_NOTCONFIGURED
);
216 void exit_status_set_free(ExitStatusSet
*x
) {
221 x
->status
= x
->signal
= NULL
;
224 bool exit_status_set_is_empty(ExitStatusSet
*x
) {
228 return set_isempty(x
->status
) && set_isempty(x
->signal
);
231 bool exit_status_set_test(ExitStatusSet
*x
, int code
, int status
) {
233 if (exit_status_set_is_empty(x
))
236 if (code
== CLD_EXITED
&& set_contains(x
->status
, INT_TO_PTR(status
)))
239 if (IN_SET(code
, CLD_KILLED
, CLD_DUMPED
) && set_contains(x
->signal
, INT_TO_PTR(status
)))