]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
run: simplify timer property handling 43047/head
authorLennart Poettering <lennart@amutable.com>
Thu, 16 Jul 2026 14:44:44 +0000 (16:44 +0200)
committerLennart Poettering <lennart@amutable.com>
Fri, 17 Jul 2026 22:01:47 +0000 (00:01 +0200)
Let's make timer prop handling less special, and more like path/socket
handling. Let's move the checks for at least one OnXYZ= setting to a
common place at the end of parsing, instead of explicit checks for each
property.

src/run/run.c

index 696274d2a0672fa7f3fed686c9c8ad69e93aa8e0..1288dc0d1f0508674ad50aaee885e85995527f21 100644 (file)
@@ -110,7 +110,6 @@ static int arg_pty_late = -1; /* tristate */
 static char **arg_path_property = NULL;
 static char **arg_socket_property = NULL;
 static char **arg_timer_property = NULL;
-static bool arg_with_timer = false;
 static bool arg_quiet = false;
 static bool arg_verbose = false;
 static OutputMode arg_output = _OUTPUT_MODE_INVALID;
@@ -513,7 +512,6 @@ static int parse_argv(int argc, char *argv[]) {
                         if (r < 0)
                                 return r;
 
-                        arg_with_timer = true;
                         break;
 
                 OPTION_LONG("on-boot", "SECONDS", "Run SECONDS after machine was booted up"):
@@ -521,7 +519,6 @@ static int parse_argv(int argc, char *argv[]) {
                         if (r < 0)
                                 return r;
 
-                        arg_with_timer = true;
                         break;
 
                 OPTION_LONG("on-startup", "SECONDS", "Run SECONDS after systemd activation"):
@@ -529,7 +526,6 @@ static int parse_argv(int argc, char *argv[]) {
                         if (r < 0)
                                 return r;
 
-                        arg_with_timer = true;
                         break;
 
                 OPTION_LONG("on-unit-active", "SECONDS", "Run SECONDS after the last activation"):
@@ -537,7 +533,6 @@ static int parse_argv(int argc, char *argv[]) {
                         if (r < 0)
                                 return r;
 
-                        arg_with_timer = true;
                         break;
 
                 OPTION_LONG("on-unit-inactive", "SECONDS",
@@ -546,7 +541,6 @@ static int parse_argv(int argc, char *argv[]) {
                         if (r < 0)
                                 return r;
 
-                        arg_with_timer = true;
                         break;
 
                 OPTION_LONG("on-calendar", "SPEC", "Realtime timer"): {
@@ -576,7 +570,6 @@ static int parse_argv(int argc, char *argv[]) {
                         if (r < 0)
                                 return r;
 
-                        arg_with_timer = true;
                         break;
                 }
 
@@ -585,7 +578,6 @@ static int parse_argv(int argc, char *argv[]) {
                         if (r < 0)
                                 return r;
 
-                        arg_with_timer = true;
                         break;
 
                 OPTION_LONG("on-clock-change", NULL, "Run when the realtime clock jumps"):
@@ -593,23 +585,12 @@ static int parse_argv(int argc, char *argv[]) {
                         if (r < 0)
                                 return r;
 
-                        arg_with_timer = true;
                         break;
 
                 OPTION_LONG("timer-property", "NAME=VALUE", "Set timer unit property"):
                         if (strv_extend(&arg_timer_property, opts.arg) < 0)
                                 return log_oom();
 
-                        arg_with_timer = arg_with_timer ||
-                                STARTSWITH_SET(opts.arg,
-                                               "OnActiveSec=",
-                                               "OnBootSec=",
-                                               "OnStartupSec=",
-                                               "OnUnitActiveSec=",
-                                               "OnUnitInactiveSec=",
-                                               "OnCalendar=",
-                                               "OnClockChange=",
-                                               "OnTimezoneChange=");
                         break;
                 }
 
@@ -617,10 +598,27 @@ static int parse_argv(int argc, char *argv[]) {
         if (arg_runtime_scope == RUNTIME_SCOPE_USER)
                 arg_ask_password = false;
 
-        with_trigger = !!arg_path_property || !!arg_socket_property || arg_with_timer;
+        size_t n_timer_triggers = 0, n_other_timer_properties = 0;
+        STRV_FOREACH(i, arg_timer_property)
+                if (STARTSWITH_SET(*i,
+                                   "OnActiveSec=",
+                                   "OnBootSec=",
+                                   "OnStartupSec=",
+                                   "OnUnitActiveSec=",
+                                   "OnUnitInactiveSec=",
+                                   "OnCalendar=",
+                                   "OnClockChange=",
+                                   "OnTimezoneChange="))
+                        n_timer_triggers++;
+                else
+                        n_other_timer_properties++;
+        if (n_other_timer_properties > 0 && n_timer_triggers == 0)
+                return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "--timer-property= set without any timer trigger expression (i.e. On*= setting), refusing.");
+
+        with_trigger = arg_path_property || arg_socket_property || arg_timer_property;
 
         /* currently, only single trigger (path, socket, timer) unit can be created simultaneously */
-        if (!!arg_path_property + !!arg_socket_property + (int) arg_with_timer > 1)
+        if (!!arg_path_property + !!arg_socket_property + !!arg_timer_property > 1)
                 return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
                                        "Only single trigger (path, socket, timer) unit can be created.");
 
@@ -749,10 +747,6 @@ static int parse_argv(int argc, char *argv[]) {
                                                "--json= is not compatible with path, socket or timer operations.");
         }
 
-        if (arg_timer_property && !arg_with_timer)
-                return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
-                                       "--timer-property= has no effect without any other timer options.");
-
         if (arg_wait) {
                 if (arg_no_block)
                         return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
@@ -3089,7 +3083,7 @@ static int run(int argc, char* argv[]) {
                 return start_transient_trigger(bus, ".path");
         if (arg_socket_property)
                 return start_transient_trigger(bus, ".socket");
-        if (arg_with_timer)
+        if (arg_timer_property)
                 return start_transient_trigger(bus, ".timer");
         return start_transient_service(bus);
 }