/* SPDX-License-Identifier: LGPL-2.1-or-later */ #pragma once #include #include "bitmap.h" #include "hashmap.h" #include "macro.h" /* This defines pretty names for the LSB 'start' verb exit codes. Note that they shouldn't be confused with * the LSB 'status' verb exit codes which are defined very differently. For details see: * * https://refspecs.linuxbase.org/LSB_5.0.0/LSB-Core-generic/LSB-Core-generic/iniscrptact.html */ enum { /* EXIT_SUCCESS defined by libc */ /* EXIT_FAILURE defined by libc */ EXIT_INVALIDARGUMENT = 2, EXIT_NOTIMPLEMENTED = 3, EXIT_NOPERMISSION = 4, EXIT_NOTINSTALLED = 5, EXIT_NOTCONFIGURED = 6, EXIT_NOTRUNNING = 7, /* BSD's sysexits.h defines a couple EX_xyz exit codes in the range 64 … 78 */ /* The LSB suggests that error codes >= 200 are "reserved". We use them here under the assumption * that they hence are unused by init scripts. */ EXIT_CHDIR = 200, EXIT_NICE, EXIT_FDS, EXIT_EXEC, EXIT_MEMORY, EXIT_LIMITS, EXIT_OOM_ADJUST, EXIT_SIGNAL_MASK, EXIT_STDIN, EXIT_STDOUT, EXIT_CHROOT, /* 210 */ EXIT_IOPRIO, EXIT_TIMERSLACK, EXIT_SECUREBITS, EXIT_SETSCHEDULER, EXIT_CPUAFFINITY, EXIT_GROUP, EXIT_USER, EXIT_CAPABILITIES, EXIT_CGROUP, EXIT_SETSID, /* 220 */ EXIT_CONFIRM, EXIT_STDERR, _EXIT_RESERVED, /* used to be tcpwrap, don't reuse! */ EXIT_PAM, EXIT_NETWORK, EXIT_NAMESPACE, EXIT_NO_NEW_PRIVILEGES, EXIT_SECCOMP, EXIT_SELINUX_CONTEXT, EXIT_PERSONALITY, /* 230 */ EXIT_APPARMOR_PROFILE, EXIT_ADDRESS_FAMILIES, EXIT_RUNTIME_DIRECTORY, _EXIT_RESERVED2, /* used to be used by kdbus, don't reuse */ EXIT_CHOWN, EXIT_SMACK_PROCESS_LABEL, EXIT_KEYRING, EXIT_STATE_DIRECTORY, EXIT_CACHE_DIRECTORY, EXIT_LOGS_DIRECTORY, /* 240 */ EXIT_CONFIGURATION_DIRECTORY, EXIT_NUMA_POLICY, EXIT_CREDENTIALS, EXIT_EXCEPTION = 255, /* Whenever we want to propagate an abnormal/signal exit, in line with bash */ }; typedef enum ExitStatusClass { EXIT_STATUS_LIBC = 1 << 0, /* libc EXIT_STATUS/EXIT_FAILURE */ EXIT_STATUS_SYSTEMD = 1 << 1, /* systemd's own exit codes */ EXIT_STATUS_LSB = 1 << 2, /* LSB exit codes */ EXIT_STATUS_BSD = 1 << 3, /* BSD (EX_xyz) exit codes */ EXIT_STATUS_FULL = EXIT_STATUS_LIBC | EXIT_STATUS_SYSTEMD | EXIT_STATUS_LSB | EXIT_STATUS_BSD, } ExitStatusClass; typedef struct ExitStatusSet { Bitmap status; Bitmap signal; } ExitStatusSet; const char* exit_status_to_string(int code, ExitStatusClass class) _const_; const char* exit_status_class(int code) _const_; int exit_status_from_string(const char *s) _pure_; typedef struct ExitStatusMapping { const char *name; ExitStatusClass class; } ExitStatusMapping; extern const ExitStatusMapping exit_status_mappings[256]; typedef enum ExitClean { EXIT_CLEAN_DAEMON, EXIT_CLEAN_COMMAND, } ExitClean; bool is_clean_exit(int code, int status, ExitClean clean, const ExitStatusSet *success_status); void exit_status_set_free(ExitStatusSet *x); bool exit_status_set_is_empty(const ExitStatusSet *x); bool exit_status_set_test(const ExitStatusSet *x, int code, int status);