X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fshared%2Fexit-status.c;h=5c73b4d3c0d1384c27e6edf748d8fa2cf162d357;hp=ab8907d32c1c2f9bb9aaa5913a2af8a8a75db35d;hb=c532d8a00cacacc6775effb7aadca680b1d39ccd;hpb=d7832d2c6e0ef5f2839a2296c1cc2fc85c7d9632 diff --git a/src/shared/exit-status.c b/src/shared/exit-status.c index ab8907d32..5c73b4d3c 100644 --- a/src/shared/exit-status.c +++ b/src/shared/exit-status.c @@ -6,16 +6,16 @@ Copyright 2010 Lennart Poettering systemd is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. systemd is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. + Lesser General Public License for more details. - You should have received a copy of the GNU General Public License + You should have received a copy of the GNU Lesser General Public License along with systemd; If not, see . ***/ @@ -23,6 +23,8 @@ #include #include "exit-status.h" +#include "set.h" +#include "macro.h" const char* exit_status_to_string(ExitStatus status, ExitStatusLevel level) { @@ -111,9 +113,6 @@ const char* exit_status_to_string(ExitStatus status, ExitStatusLevel level) { case EXIT_STDERR: return "STDERR"; - case EXIT_TCPWRAP: - return "TCPWRAP"; - case EXIT_PAM: return "PAM"; @@ -122,6 +121,36 @@ const char* exit_status_to_string(ExitStatus status, ExitStatusLevel level) { case EXIT_NAMESPACE: return "NAMESPACE"; + + case EXIT_NO_NEW_PRIVILEGES: + return "NO_NEW_PRIVILEGES"; + + case EXIT_SECCOMP: + return "SECCOMP"; + + case EXIT_SELINUX_CONTEXT: + return "SELINUX_CONTEXT"; + + case EXIT_PERSONALITY: + return "PERSONALITY"; + + case EXIT_APPARMOR_PROFILE: + return "APPARMOR"; + + case EXIT_ADDRESS_FAMILIES: + return "ADDRESS_FAMILIES"; + + case EXIT_RUNTIME_DIRECTORY: + return "RUNTIME_DIRECTORY"; + + case EXIT_CHOWN: + return "CHOWN"; + + case EXIT_MAKE_STARTER: + return "MAKE_STARTER"; + + case EXIT_BUS_ENDPOINT: + return "BUS_ENDPOINT"; } } @@ -152,10 +181,12 @@ const char* exit_status_to_string(ExitStatus status, ExitStatusLevel level) { } -bool is_clean_exit(int code, int status) { +bool is_clean_exit(int code, int status, ExitStatusSet *success_status) { if (code == CLD_EXITED) - return status == 0; + return status == 0 || + (success_status && + set_contains(success_status->status, INT_TO_PTR(status))); /* If a daemon does not implement handlers for some of the * signals that's not considered an unclean shutdown */ @@ -164,17 +195,34 @@ bool is_clean_exit(int code, int status) { status == SIGHUP || status == SIGINT || status == SIGTERM || - status == SIGPIPE; + status == SIGPIPE || + (success_status && + set_contains(success_status->signal, INT_TO_PTR(status))); return false; } -bool is_clean_exit_lsb(int code, int status) { +bool is_clean_exit_lsb(int code, int status, ExitStatusSet *success_status) { - if (is_clean_exit(code, status)) + if (is_clean_exit(code, status, success_status)) return true; return code == CLD_EXITED && (status == EXIT_NOTINSTALLED || status == EXIT_NOTCONFIGURED); } + +void exit_status_set_free(ExitStatusSet *x) { + assert(x); + + set_free(x->status); + set_free(x->signal); + x->status = x->signal = NULL; +} + +bool exit_status_set_is_empty(ExitStatusSet *x) { + if (!x) + return true; + + return set_isempty(x->status) && set_isempty(x->signal); +}