X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fcore%2Funit.h;h=1b13ca826651fcc24c696c57af74a880d48fa125;hb=8c8549db376ce9325e5a7547959ab7d9218505b7;hp=43ab4d1045de148a8e86949cb8d99476326b6e75;hpb=7c52a17b1a31eedd40093a4fbb460cf492087d9b;p=elogind.git diff --git a/src/core/unit.h b/src/core/unit.h index 43ab4d104..1b13ca826 100644 --- a/src/core/unit.h +++ b/src/core/unit.h @@ -41,6 +41,7 @@ typedef struct UnitStatusMessageFormats UnitStatusMessageFormats; #include "condition.h" #include "install.h" #include "unit-name.h" +#include "failure-action.h" enum UnitActiveState { UNIT_ACTIVE, @@ -53,6 +54,12 @@ enum UnitActiveState { _UNIT_ACTIVE_STATE_INVALID = -1 }; +typedef enum KillOperation { + KILL_TERMINATE, + KILL_KILL, + KILL_ABORT, +} KillOperation; + static inline bool UNIT_IS_ACTIVE_OR_RELOADING(UnitActiveState t) { return t == UNIT_ACTIVE || t == UNIT_RELOADING; } @@ -112,15 +119,20 @@ struct Unit { /* JOB_NOP jobs are special and can be installed without disturbing the real job. */ Job *nop_job; + /* Job timeout and action to take */ usec_t job_timeout; + FailureAction job_timeout_action; + char *job_timeout_reboot_arg; /* References to this */ LIST_HEAD(UnitRef, refs); /* Conditions to check */ LIST_HEAD(Condition, conditions); + LIST_HEAD(Condition, asserts); dual_timestamp condition_timestamp; + dual_timestamp assert_timestamp; dual_timestamp inactive_exit_timestamp; dual_timestamp active_enter_timestamp; @@ -202,6 +214,7 @@ struct Unit { /* Did the last condition check succeed? */ bool condition_result; + bool assert_result; /* Is this a transient unit? */ bool transient; @@ -572,7 +585,7 @@ int unit_write_drop_in_private_format(Unit *u, UnitSetPropertiesMode mode, const int unit_remove_drop_in(Unit *u, UnitSetPropertiesMode mode, const char *name); -int unit_kill_context(Unit *u, KillContext *c, bool sigkill, pid_t main_pid, pid_t control_pid, bool main_pid_alien); +int unit_kill_context(Unit *u, KillContext *c, KillOperation k, pid_t main_pid, pid_t control_pid, bool main_pid_alien); int unit_make_transient(Unit *u); @@ -583,11 +596,20 @@ UnitActiveState unit_active_state_from_string(const char *s) _pure_; /* Macros which append UNIT= or USER_UNIT= to the message */ -#define log_full_unit(level, unit, ...) log_meta_object(level, __FILE__, __LINE__, __func__, getpid() == 1 ? "UNIT=" : "USER_UNIT=", unit, __VA_ARGS__) -#define log_debug_unit(unit, ...) log_full_unit(LOG_DEBUG, unit, __VA_ARGS__) -#define log_info_unit(unit, ...) log_full_unit(LOG_INFO, unit, __VA_ARGS__) -#define log_notice_unit(unit, ...) log_full_unit(LOG_NOTICE, unit, __VA_ARGS__) -#define log_warning_unit(unit, ...) log_full_unit(LOG_WARNING, unit, __VA_ARGS__) -#define log_error_unit(unit, ...) log_full_unit(LOG_ERR, unit, __VA_ARGS__) +#define log_unit_full_errno(unit, level, error, ...) log_object_internal(level, error, __FILE__, __LINE__, __func__, getpid() == 1 ? "UNIT=" : "USER_UNIT=", unit, __VA_ARGS__) +#define log_unit_full(unit, level, ...) log_unit_full_errno(unit, level, 0, __VA_ARGS__) + +#define log_unit_debug(unit, ...) log_unit_full(unit, LOG_DEBUG, __VA_ARGS__) +#define log_unit_info(unit, ...) log_unit_full(unit, LOG_INFO, __VA_ARGS__) +#define log_unit_notice(unit, ...) log_unit_full(unit, LOG_NOTICE, __VA_ARGS__) +#define log_unit_warning(unit, ...) log_unit_full(unit, LOG_WARNING, __VA_ARGS__) +#define log_unit_error(unit, ...) log_unit_full(unit, LOG_ERR, __VA_ARGS__) + +#define log_unit_debug_errno(unit, error, ...) log_unit_full_errno(unit, LOG_DEBUG, error, __VA_ARGS__) +#define log_unit_info_errno(unit, error, ...) log_unit_full_errno(unit, LOG_INFO, error, __VA_ARGS__) +#define log_unit_notice_errno(unit, error, ...) log_unit_full_errno(unit, LOG_NOTICE, error, __VA_ARGS__) +#define log_unit_warning_errno(unit, error, ...) log_unit_full_errno(unit, LOG_WARNING, error, __VA_ARGS__) +#define log_unit_error_errno(unit, error, ...) log_unit_full_errno(unit, LOG_ERR, error, __VA_ARGS__) -#define log_struct_unit(level, unit, ...) log_struct(level, getpid() == 1 ? "UNIT=%s" : "USER_UNIT=%s", unit, __VA_ARGS__) +#define log_unit_struct(unit, level, ...) log_struct(level, getpid() == 1 ? "UNIT=%s" : "USER_UNIT=%s", unit, __VA_ARGS__) +#define log_unit_struct_errno(unit, level, error, ...) log_struct_errno(level, error, getpid() == 1 ? "UNIT=%s" : "USER_UNIT=%s", unit, __VA_ARGS__)