]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
service-util: add generic parser for runtime scope
authorLennart Poettering <lennart@poettering.net>
Tue, 15 Jul 2025 06:44:48 +0000 (08:44 +0200)
committerLennart Poettering <lennart@poettering.net>
Thu, 25 Sep 2025 20:43:59 +0000 (22:43 +0200)
14 files changed:
src/home/homed.c
src/hostname/hostnamed.c
src/import/importd.c
src/locale/localed.c
src/login/logind.c
src/machine/machined.c
src/network/networkd.c
src/portable/portabled.c
src/resolve/resolved.c
src/shared/service-util.c
src/shared/service-util.h
src/sysupdate/sysupdated.c
src/timedate/timedated.c
src/timesync/timesyncd.c

index bb319925d036cb8f019327ce16cd7ce50801bdf2..9aaabd5c19e51ab255c4700685ab4855683102e3 100644 (file)
@@ -25,6 +25,7 @@ static int run(int argc, char *argv[]) {
                                "A service to create, remove, change or inspect home areas.",
                                BUS_IMPLEMENTATIONS(&manager_object,
                                                    &log_control_object),
+                               /* runtime_scope= */ NULL,
                                argc, argv);
         if (r <= 0)
                 return r;
index 06fb3f28789b5901fb71be8ea3163c87201c9645..9ba3d312bd11ca1a5c05972b65625f26c312dc9e 100644 (file)
@@ -1988,6 +1988,7 @@ static int run(int argc, char *argv[]) {
                                "Manage the system hostname and related metadata.",
                                BUS_IMPLEMENTATIONS(&manager_object,
                                                    &log_control_object),
+                               /* runtime_scope= */ NULL,
                                argc, argv);
         if (r <= 0)
                 return r;
index f2715691abbbb5dcdac40328f0aca5388cd24fee..8603069047a08738684ded6b6560847a7e28d8df 100644 (file)
@@ -2019,6 +2019,7 @@ static int run(int argc, char *argv[]) {
                                "VM and container image import and export service.",
                                BUS_IMPLEMENTATIONS(&manager_object,
                                                    &log_control_object),
+                               /* runtime_scope= */ NULL,
                                argc, argv);
         if (r <= 0)
                 return r;
index 11d9130bbca3973aab2138f5629292c3c3d582f1..041ba29cd8a3986efe00caa31219e2be04ec4be4 100644 (file)
@@ -635,6 +635,7 @@ static int run(int argc, char *argv[]) {
                                "Manage system locale settings and key mappings.",
                                BUS_IMPLEMENTATIONS(&manager_object,
                                                    &log_control_object),
+                               /* runtime_scope= */ NULL,
                                argc, argv);
         if (r <= 0)
                 return r;
index 9427bae815a7a568cb022f627578832e86763180..e1219fe73a8c8e78445745f005d1143bbcc1a849 100644 (file)
@@ -1340,6 +1340,7 @@ static int run(int argc, char *argv[]) {
                                "Manager for user logins and devices and privileged operations.",
                                BUS_IMPLEMENTATIONS(&manager_object,
                                                    &log_control_object),
+                               /* runtime_scope= */ NULL,
                                argc, argv);
         if (r <= 0)
                 return r;
index 46395d7df4a90774fcc5bc69efa71cc750717dd4..ea83f97ad96208a3d8fc7eacaa03ea6b83378f32 100644 (file)
@@ -324,6 +324,7 @@ static int run(int argc, char *argv[]) {
                                "Manage registrations of local VMs and containers.",
                                BUS_IMPLEMENTATIONS(&manager_object,
                                                    &log_control_object),
+                               /* runtime_scope= */ NULL,
                                argc, argv);
         if (r <= 0)
                 return r;
index 2ce32fe4f3e708f12aa18d93e90ca67e6832c6eb..7e09629ddbe96dabde32ef1488acc9e16957db93 100644 (file)
@@ -29,6 +29,7 @@ static int run(int argc, char *argv[]) {
         r = service_parse_argv("systemd-networkd.service",
                                "Manage and configure network devices, create virtual network devices",
                                BUS_IMPLEMENTATIONS(&manager_object, &log_control_object),
+                               /* runtime_scope= */ NULL,
                                argc, argv);
         if (r <= 0)
                 return r;
index 65ceaf40b6d165e92323b896475916c495b3fcce..4059de01ed9561ac7baba928b2b5195ad4e2ce5b 100644 (file)
@@ -133,6 +133,7 @@ static int run(int argc, char *argv[]) {
                                "Manage registrations of portable images.",
                                BUS_IMPLEMENTATIONS(&manager_object,
                                                    &log_control_object),
+                               /* runtime_scope= */ NULL,
                                argc, argv);
         if (r <= 0)
                 return r;
index ea3e6a689c45e51ebe05ce1e7faf05a55f4e5826..aa165927a423fd90bd62b3676628021b83491499 100644 (file)
@@ -30,6 +30,7 @@ static int run(int argc, char *argv[]) {
                                "Provide name resolution with caching using DNS, mDNS, LLMNR.",
                                BUS_IMPLEMENTATIONS(&manager_object,
                                                    &log_control_object),
+                               /* runtime_scope= */ NULL,
                                argc, argv);
         if (r <= 0)
                 return r;
index 2645fe2c40bc487114d94d988e5a44096cf25622..70d59af6c51d1154c202e040c8f471f673bf6b2a 100644 (file)
@@ -8,9 +8,19 @@
 #include "bus-object.h"
 #include "log.h"
 #include "pretty-print.h"
+#include "runtime-scope.h"
 #include "service-util.h"
 
-static int help(const char *program_path, const char *service, const char *description, bool bus_introspect) {
+typedef enum HelpFlags {
+        HELP_WITH_BUS_INTROSPECT = 1 << 0,
+        HELP_WITH_RUNTIME_SCOPE  = 1 << 1,
+} HelpFlags;
+
+static int help(const char *program_path,
+                const char *service,
+                const char *description,
+                HelpFlags flags) {
+
         _cleanup_free_ char *link = NULL;
         int r;
 
@@ -25,6 +35,7 @@ static int help(const char *program_path, const char *service, const char *descr
                "  -h --help                 Show this help\n"
                "     --version              Show package version\n"
                "%8$s"
+               "%9$s"
                "\nSee the %2$s for details.\n",
                program_path,
                link,
@@ -33,7 +44,9 @@ static int help(const char *program_path, const char *service, const char *descr
                ansi_highlight(),
                ansi_normal(),
                description,
-               bus_introspect ? "     --bus-introspect=PATH  Write D-Bus XML introspection data\n" : "");
+               FLAGS_SET(flags, HELP_WITH_BUS_INTROSPECT) ? "     --bus-introspect=PATH  Write D-Bus XML introspection data\n" : "",
+               FLAGS_SET(flags, HELP_WITH_RUNTIME_SCOPE)  ? "     --system               Start service in system mode\n"
+                                                            "     --user                 Start service in user mode\n" : "");
 
         return 0; /* No further action */
 }
@@ -42,17 +55,22 @@ int service_parse_argv(
                 const char *service,
                 const char *description,
                 const BusObjectImplementation* const* bus_objects,
+                RuntimeScope *runtime_scope,
                 int argc, char *argv[]) {
 
         enum {
                 ARG_VERSION = 0x100,
                 ARG_BUS_INTROSPECT,
+                ARG_SYSTEM,
+                ARG_USER,
         };
 
         static const struct option options[] = {
                 { "help",           no_argument,       NULL, 'h'                },
                 { "version",        no_argument,       NULL, ARG_VERSION        },
                 { "bus-introspect", required_argument, NULL, ARG_BUS_INTROSPECT },
+                { "system",         no_argument,       NULL, ARG_SYSTEM         },
+                { "user",           no_argument,       NULL, ARG_USER           },
                 {}
         };
 
@@ -65,7 +83,11 @@ int service_parse_argv(
                 switch (c) {
 
                 case 'h':
-                        return help(argv[0], service, description, bus_objects);
+                        return help(argv[0],
+                                    service,
+                                    description,
+                                    (bus_objects ? HELP_WITH_BUS_INTROSPECT : 0) |
+                                    (runtime_scope ? HELP_WITH_RUNTIME_SCOPE : 0));
 
                 case ARG_VERSION:
                         return version();
@@ -76,6 +98,14 @@ int service_parse_argv(
                                         optarg,
                                         bus_objects);
 
+                case ARG_SYSTEM:
+                case ARG_USER:
+                        if (!runtime_scope)
+                                return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "This service cannot be run in --system or --user mode, refusing.");
+
+                        *runtime_scope = c == ARG_SYSTEM ? RUNTIME_SCOPE_SYSTEM : RUNTIME_SCOPE_USER;
+                        break;
+
                 case '?':
                         return -EINVAL;
 
index af36354e80e22bce7177d44125a0b8033316e3e1..462ba2b3fadb66171e12cd381b3e4f30163d2b2a 100644 (file)
@@ -7,4 +7,5 @@ int service_parse_argv(
                 const char *service,
                 const char *description,
                 const BusObjectImplementation* const* bus_objects,
+                RuntimeScope *runtime_scope,
                 int argc, char *argv[]);
index b1438ff825aa5aaa3adceef21a5f8ba2966a1256..1ade24b3748fd97f50825a6c10c7e80e2a718da2 100644 (file)
@@ -2079,6 +2079,7 @@ static int run(int argc, char *argv[]) {
                                "System update management service.",
                                BUS_IMPLEMENTATIONS(&manager_object,
                                                    &log_control_object),
+                               /* runtime_scope= */ NULL,
                                argc, argv);
         if (r <= 0)
                 return r;
index 662cc29ac5fab3e0cd4157a1435b8d92c21ab8e5..6e21d1a73ab4a963cec174938ba7bccae9c328a3 100644 (file)
@@ -1164,6 +1164,7 @@ static int run(int argc, char *argv[]) {
                                "Manage the system clock and timezone and NTP enablement.",
                                BUS_IMPLEMENTATIONS(&manager_object,
                                                    &log_control_object),
+                               /* runtime_scope= */ NULL,
                                argc, argv);
         if (r <= 0)
                 return r;
index 40305c046bc9461ab3d26f3ccbe914adb3071248..96d0dd5c2ba2bc3e72ed9c8e00d22cd4ced804dc 100644 (file)
@@ -151,6 +151,7 @@ static int run(int argc, char *argv[]) {
         r = service_parse_argv("systemd-timesyncd.service",
                                "Network time synchronization",
                                BUS_IMPLEMENTATIONS(&manager_object, &log_control_object),
+                               /* runtime_scope= */ NULL,
                                argc, argv);
         if (r <= 0)
                 return r;