diff options
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/condition.c | 17 | ||||
-rw-r--r-- | src/core/load-fragment-gperf.gperf.m4 | 1 | ||||
-rw-r--r-- | src/core/main.c | 2 | ||||
-rw-r--r-- | src/core/manager.c | 25 | ||||
-rw-r--r-- | src/core/manager.h | 4 | ||||
-rw-r--r-- | src/core/shutdown.c | 2 |
6 files changed, 39 insertions, 12 deletions
diff --git a/src/core/condition.c b/src/core/condition.c index 410fb36797..353e0c97f1 100644 --- a/src/core/condition.c +++ b/src/core/condition.c @@ -120,6 +120,20 @@ static bool condition_test_needs_update(Condition *c) { (usr.st_mtim.tv_sec == other.st_mtim.tv_sec && usr.st_mtim.tv_nsec > other.st_mtim.tv_nsec)) == !c->negate; } +static bool condition_test_first_boot(Condition *c) { + int r; + + assert(c); + assert(c->parameter); + assert(c->type == CONDITION_FIRST_BOOT); + + r = parse_boolean(c->parameter); + if (r < 0) + return c->negate; + + return ((access("/run/systemd/first-boot", F_OK) >= 0) == !!r) == !c->negate; +} + static bool condition_test(Condition *c) { assert(c); @@ -202,6 +216,9 @@ static bool condition_test(Condition *c) { case CONDITION_NEEDS_UPDATE: return condition_test_needs_update(c); + case CONDITION_FIRST_BOOT: + return condition_test_first_boot(c); + case CONDITION_NULL: return !c->negate; diff --git a/src/core/load-fragment-gperf.gperf.m4 b/src/core/load-fragment-gperf.gperf.m4 index a7c4469a46..4c092d77a2 100644 --- a/src/core/load-fragment-gperf.gperf.m4 +++ b/src/core/load-fragment-gperf.gperf.m4 @@ -162,6 +162,7 @@ Unit.ConditionDirectoryNotEmpty, config_parse_unit_condition_path, CONDITION_D Unit.ConditionFileNotEmpty, config_parse_unit_condition_path, CONDITION_FILE_NOT_EMPTY, 0 Unit.ConditionFileIsExecutable, config_parse_unit_condition_path, CONDITION_FILE_IS_EXECUTABLE, 0 Unit.ConditionNeedsUpdate, config_parse_unit_condition_path, CONDITION_NEEDS_UPDATE, 0 +Unit.ConditionFirstBoot, config_parse_unit_condition_path, CONDITION_FIRST_BOOT, 0 Unit.ConditionKernelCommandLine, config_parse_unit_condition_string, CONDITION_KERNEL_COMMAND_LINE, 0 Unit.ConditionArchitecture, config_parse_unit_condition_string, CONDITION_ARCHITECTURE, 0 Unit.ConditionVirtualization, config_parse_unit_condition_string, CONDITION_VIRTUALIZATION, 0 diff --git a/src/core/main.c b/src/core/main.c index e1fc3f3718..a21a959be9 100644 --- a/src/core/main.c +++ b/src/core/main.c @@ -1648,11 +1648,11 @@ int main(int argc, char *argv[]) { m->initrd_timestamp = initrd_timestamp; m->security_start_timestamp = security_start_timestamp; m->security_finish_timestamp = security_finish_timestamp; - m->is_first_boot = empty_etc; manager_set_default_rlimits(m, arg_default_rlimit); manager_environment_add(m, NULL, arg_default_environment); manager_set_show_status(m, arg_show_status); + manager_set_first_boot(m, empty_etc); /* Remember whether we should queue the default job */ queue_default_job = !arg_serialization || arg_switched_root; diff --git a/src/core/manager.c b/src/core/manager.c index 9d078c0af7..3dffbe259b 100644 --- a/src/core/manager.c +++ b/src/core/manager.c @@ -2477,7 +2477,7 @@ void manager_check_finished(Manager *m) { m->confirm_spawn = false; /* This is no longer the first boot */ - m->is_first_boot = false; + manager_set_first_boot(m, false); if (dual_timestamp_is_set(&m->finish_timestamp)) return; @@ -2631,7 +2631,6 @@ void manager_run_generators(Manager *m) { _cleanup_closedir_ DIR *d = NULL; const char *generator_path; const char *argv[5]; - const char *env[2]; int r; assert(m); @@ -2665,14 +2664,8 @@ void manager_run_generators(Manager *m) { argv[3] = m->generator_unit_path_late; argv[4] = NULL; - if (m->is_first_boot) { - env[0] = (char*) "SYSTEMD_FIRST_BOOT=1"; - env[1] = NULL; - } else - env[0] = NULL; - RUN_WITH_UMASK(0022) - execute_directory(generator_path, d, DEFAULT_TIMEOUT_USEC, (char**) argv, (char**) env); + execute_directory(generator_path, d, DEFAULT_TIMEOUT_USEC, (char**) argv); finish: trim_generator_dir(m, &m->generator_unit_path); @@ -2816,6 +2809,20 @@ static bool manager_get_show_status(Manager *m) { return plymouth_running(); } +void manager_set_first_boot(Manager *m, bool b) { + assert(m); + + if (m->running_as != SYSTEMD_SYSTEM) + return; + + m->first_boot = b; + + if (m->first_boot) + touch("/run/systemd/first-boot"); + else + unlink("/run/systemd/first-boot"); +} + void manager_status_printf(Manager *m, bool ephemeral, const char *status, const char *format, ...) { va_list ap; diff --git a/src/core/manager.h b/src/core/manager.h index eff639d1b6..718c29fa0f 100644 --- a/src/core/manager.h +++ b/src/core/manager.h @@ -228,6 +228,7 @@ struct Manager { bool dispatching_dbus_queue:1; bool taint_usr:1; + bool first_boot:1; ShowStatus show_status; bool confirm_spawn; @@ -243,7 +244,6 @@ struct Manager { bool default_cpu_accounting; bool default_memory_accounting; bool default_blockio_accounting; - bool is_first_boot; usec_t default_timer_accuracy_usec; @@ -334,6 +334,8 @@ void manager_undo_generators(Manager *m); void manager_recheck_journal(Manager *m); void manager_set_show_status(Manager *m, ShowStatus mode); +void manager_set_first_boot(Manager *m, bool b); + void manager_status_printf(Manager *m, bool ephemeral, const char *status, const char *format, ...) _printf_(4,5); void manager_flip_auto_status(Manager *m, bool enable); diff --git a/src/core/shutdown.c b/src/core/shutdown.c index e7771c968e..fde3ce9c27 100644 --- a/src/core/shutdown.c +++ b/src/core/shutdown.c @@ -375,7 +375,7 @@ int main(int argc, char *argv[]) { arguments[0] = NULL; arguments[1] = arg_verb; arguments[2] = NULL; - execute_directory(SYSTEM_SHUTDOWN_PATH, NULL, DEFAULT_TIMEOUT_USEC, arguments, NULL); + execute_directory(SYSTEM_SHUTDOWN_PATH, NULL, DEFAULT_TIMEOUT_USEC, arguments); if (!in_container && !in_initrd() && access("/run/initramfs/shutdown", X_OK) == 0) { |