2010-08-20 05:26:37 +04:00
/***
This file is part of systemd .
Copyright 2010 Lennart Poettering
systemd is free software ; you can redistribute it and / or modify it
2012-04-12 02:20:58 +04:00
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
2010-08-20 05:26:37 +04:00
( 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
2012-04-12 02:20:58 +04:00
Lesser General Public License for more details .
2010-08-20 05:26:37 +04:00
2012-04-12 02:20:58 +04:00
You should have received a copy of the GNU Lesser General Public License
2010-08-20 05:26:37 +04:00
along with systemd ; If not , see < http : //www.gnu.org/licenses/>.
* * */
2015-06-18 10:00:01 +03:00
# include <signal.h>
2015-11-17 00:09:36 +03:00
# include <stdlib.h>
2010-08-20 05:26:37 +04:00
# include "exit-status.h"
2012-08-13 15:58:01 +04:00
# include "macro.h"
2015-11-17 00:09:36 +03:00
# include "set.h"
2010-08-20 05:26:37 +04:00
2016-10-10 21:08:41 +03:00
const char * exit_status_to_string ( int status , ExitStatusLevel level ) {
2010-08-20 05:26:37 +04:00
/* We cast to int here, so that -Wenum doesn't complain that
* EXIT_SUCCESS / EXIT_FAILURE aren ' t in the enum */
2016-10-10 21:08:41 +03:00
switch ( status ) {
2010-08-20 05:26:37 +04:00
case EXIT_SUCCESS :
return " SUCCESS " ;
case EXIT_FAILURE :
return " FAILURE " ;
}
2016-06-02 18:41:48 +03:00
if ( IN_SET ( level , EXIT_STATUS_SYSTEMD , EXIT_STATUS_LSB ) ) {
2016-10-10 21:08:41 +03:00
switch ( status ) {
2010-08-20 05:26:37 +04:00
case EXIT_CHDIR :
return " CHDIR " ;
case EXIT_NICE :
return " NICE " ;
case EXIT_FDS :
return " FDS " ;
case EXIT_EXEC :
return " EXEC " ;
case EXIT_MEMORY :
return " MEMORY " ;
case EXIT_LIMITS :
return " LIMITS " ;
case EXIT_OOM_ADJUST :
return " OOM_ADJUST " ;
case EXIT_SIGNAL_MASK :
return " SIGNAL_MASK " ;
case EXIT_STDIN :
return " STDIN " ;
case EXIT_STDOUT :
return " STDOUT " ;
case EXIT_CHROOT :
return " CHROOT " ;
case EXIT_IOPRIO :
return " IOPRIO " ;
case EXIT_TIMERSLACK :
return " TIMERSLACK " ;
case EXIT_SECUREBITS :
return " SECUREBITS " ;
case EXIT_SETSCHEDULER :
return " SETSCHEDULER " ;
case EXIT_CPUAFFINITY :
return " CPUAFFINITY " ;
case EXIT_GROUP :
return " GROUP " ;
case EXIT_USER :
return " USER " ;
case EXIT_CAPABILITIES :
return " CAPABILITIES " ;
case EXIT_CGROUP :
return " CGROUP " ;
case EXIT_SETSID :
return " SETSID " ;
case EXIT_CONFIRM :
return " CONFIRM " ;
case EXIT_STDERR :
return " STDERR " ;
case EXIT_PAM :
return " PAM " ;
2011-08-02 07:24:58 +04:00
case EXIT_NETWORK :
return " NETWORK " ;
2011-11-17 03:21:16 +04:00
case EXIT_NAMESPACE :
return " NAMESPACE " ;
2012-07-17 06:17:53 +04:00
case EXIT_NO_NEW_PRIVILEGES :
return " NO_NEW_PRIVILEGES " ;
case EXIT_SECCOMP :
return " SECCOMP " ;
2014-02-06 13:05:16 +04:00
case EXIT_SELINUX_CONTEXT :
return " SELINUX_CONTEXT " ;
2014-02-19 05:15:24 +04:00
case EXIT_PERSONALITY :
return " PERSONALITY " ;
2014-02-20 19:19:44 +04:00
case EXIT_APPARMOR_PROFILE :
return " APPARMOR " ;
2014-02-25 23:37:03 +04:00
case EXIT_ADDRESS_FAMILIES :
return " ADDRESS_FAMILIES " ;
2014-03-03 20:14:07 +04:00
case EXIT_RUNTIME_DIRECTORY :
return " RUNTIME_DIRECTORY " ;
2014-06-05 11:55:53 +04:00
2014-06-05 14:24:03 +04:00
case EXIT_MAKE_STARTER :
return " MAKE_STARTER " ;
2014-09-05 19:24:27 +04:00
2016-10-10 21:11:21 +03:00
case EXIT_CHOWN :
return " CHOWN " ;
2015-07-23 08:17:03 +03:00
case EXIT_SMACK_PROCESS_LABEL :
return " SMACK_PROCESS_LABEL " ;
2010-08-20 05:26:37 +04:00
}
}
if ( level = = EXIT_STATUS_LSB ) {
2016-10-10 21:08:41 +03:00
switch ( status ) {
2010-08-20 05:26:37 +04:00
case EXIT_INVALIDARGUMENT :
return " INVALIDARGUMENT " ;
case EXIT_NOTIMPLEMENTED :
return " NOTIMPLEMENTED " ;
case EXIT_NOPERMISSION :
return " NOPERMISSION " ;
case EXIT_NOTINSTALLED :
2015-04-19 00:38:13 +03:00
return " NOTINSTALLED " ;
2010-08-20 05:26:37 +04:00
case EXIT_NOTCONFIGURED :
return " NOTCONFIGURED " ;
case EXIT_NOTRUNNING :
return " NOTRUNNING " ;
}
}
return NULL ;
}
2011-01-20 20:22:03 +03:00
2016-10-10 23:07:30 +03:00
bool is_clean_exit ( int code , int status , ExitClean clean , ExitStatusSet * success_status ) {
2011-01-20 20:22:03 +03:00
if ( code = = CLD_EXITED )
2012-08-13 15:58:01 +04:00
return status = = 0 | |
( success_status & &
2014-07-03 17:36:50 +04:00
set_contains ( success_status - > status , INT_TO_PTR ( status ) ) ) ;
2011-01-20 20:22:03 +03:00
2016-10-10 23:07:30 +03:00
/* If a daemon does not implement handlers for some of the signals that's not considered an unclean shutdown */
2011-01-20 20:22:03 +03:00
if ( code = = CLD_KILLED )
2016-10-10 23:07:30 +03:00
return
( clean = = EXIT_CLEAN_DAEMON & & IN_SET ( status , SIGHUP , SIGINT , SIGTERM , SIGPIPE ) ) | |
2012-08-13 15:58:01 +04:00
( success_status & &
2016-06-02 18:41:48 +03:00
set_contains ( success_status - > signal , INT_TO_PTR ( status ) ) ) ;
2011-01-20 20:22:03 +03:00
return false ;
}
2014-07-03 14:47:40 +04:00
void exit_status_set_free ( ExitStatusSet * x ) {
assert ( x ) ;
2016-06-02 18:41:48 +03:00
x - > status = set_free ( x - > status ) ;
x - > signal = set_free ( x - > signal ) ;
2014-07-03 14:47:40 +04:00
}
2014-07-03 17:50:31 +04:00
bool exit_status_set_is_empty ( ExitStatusSet * x ) {
if ( ! x )
return true ;
return set_isempty ( x - > status ) & & set_isempty ( x - > signal ) ;
}
2015-04-28 19:24:20 +03:00
bool exit_status_set_test ( ExitStatusSet * x , int code , int status ) {
if ( exit_status_set_is_empty ( x ) )
return false ;
if ( code = = CLD_EXITED & & set_contains ( x - > status , INT_TO_PTR ( status ) ) )
return true ;
if ( IN_SET ( code , CLD_KILLED , CLD_DUMPED ) & & set_contains ( x - > signal , INT_TO_PTR ( status ) ) )
return true ;
return false ;
}