1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2010 Lennart Poettering
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
24 #include "exit-status.h"
28 const char* exit_status_to_string(ExitStatus status, ExitStatusLevel level) {
30 /* We cast to int here, so that -Wenum doesn't complain that
31 * EXIT_SUCCESS/EXIT_FAILURE aren't in the enum */
33 switch ((int) status) {
43 if (level == EXIT_STATUS_SYSTEMD || level == EXIT_STATUS_LSB) {
44 switch ((int) status) {
67 case EXIT_SIGNAL_MASK:
88 case EXIT_SETSCHEDULER:
89 return "SETSCHEDULER";
91 case EXIT_CPUAFFINITY:
100 case EXIT_CAPABILITIES:
101 return "CAPABILITIES";
124 case EXIT_NO_NEW_PRIVILEGES:
125 return "NO_NEW_PRIVILEGES";
130 case EXIT_SELINUX_CONTEXT:
131 return "SELINUX_CONTEXT";
133 case EXIT_PERSONALITY:
134 return "PERSONALITY";
136 case EXIT_APPARMOR_PROFILE:
139 case EXIT_ADDRESS_FAMILIES:
140 return "ADDRESS_FAMILIES";
142 case EXIT_RUNTIME_DIRECTORY:
143 return "RUNTIME_DIRECTORY";
148 case EXIT_MAKE_STARTER:
149 return "MAKE_STARTER";
151 case EXIT_BUS_ENDPOINT:
152 return "BUS_ENDPOINT";
156 if (level == EXIT_STATUS_LSB) {
157 switch ((int) status) {
159 case EXIT_INVALIDARGUMENT:
160 return "INVALIDARGUMENT";
162 case EXIT_NOTIMPLEMENTED:
163 return "NOTIMPLEMENTED";
165 case EXIT_NOPERMISSION:
166 return "NOPERMISSION";
168 case EXIT_NOTINSTALLED:
169 return "NOTINSSTALLED";
171 case EXIT_NOTCONFIGURED:
172 return "NOTCONFIGURED";
174 case EXIT_NOTRUNNING:
183 bool is_clean_exit(int code, int status, ExitStatusSet *success_status) {
185 if (code == CLD_EXITED)
186 return status == 0 ||
188 set_contains(success_status->status, INT_TO_PTR(status)));
190 /* If a daemon does not implement handlers for some of the
191 * signals that's not considered an unclean shutdown */
192 if (code == CLD_KILLED)
199 set_contains(success_status->signal, INT_TO_PTR(status)));
204 bool is_clean_exit_lsb(int code, int status, ExitStatusSet *success_status) {
206 if (is_clean_exit(code, status, success_status))
210 code == CLD_EXITED &&
211 (status == EXIT_NOTINSTALLED || status == EXIT_NOTCONFIGURED);
214 void exit_status_set_free(ExitStatusSet *x) {
219 x->status = x->signal = NULL;
222 bool exit_status_set_is_empty(ExitStatusSet *x) {
226 return set_isempty(x->status) && set_isempty(x->signal);