]>
git.ipfire.org Git - thirdparty/systemd.git/blob - src/portable/portabled.c
1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
9 #include "alloc-util.h"
10 #include "bus-log-control-api.h"
11 #include "bus-polkit.h"
13 #include "main-func.h"
14 #include "portabled-bus.h"
15 #include "portabled-image-bus.h"
16 #include "portabled.h"
17 #include "process-util.h"
18 #include "service-util.h"
19 #include "signal-util.h"
21 static Manager
* manager_unref(Manager
*m
);
22 DEFINE_TRIVIAL_CLEANUP_FUNC(Manager
*, manager_unref
);
24 static int manager_new(Manager
**ret
) {
25 _cleanup_(manager_unrefp
) Manager
*m
= NULL
;
34 r
= sd_event_default(&m
->event
);
38 r
= sd_event_add_signal(m
->event
, NULL
, SIGINT
, NULL
, NULL
);
42 r
= sd_event_add_signal(m
->event
, NULL
, SIGTERM
, NULL
, NULL
);
46 (void) sd_event_set_watchdog(m
->event
, true);
52 static Manager
* manager_unref(Manager
*m
) {
55 hashmap_free(m
->image_cache
);
57 sd_event_source_unref(m
->image_cache_defer_event
);
59 bus_verify_polkit_async_registry_free(m
->polkit_registry
);
61 sd_bus_flush_close_unref(m
->bus
);
62 sd_event_unref(m
->event
);
67 static int manager_connect_bus(Manager
*m
) {
73 r
= sd_bus_default_system(&m
->bus
);
75 return log_error_errno(r
, "Failed to connect to system bus: %m");
77 r
= bus_add_implementation(m
->bus
, &manager_object
, m
);
81 r
= bus_log_control_api_register(m
->bus
);
85 r
= sd_bus_request_name_async(m
->bus
, NULL
, "org.freedesktop.portable1", 0, NULL
, NULL
);
87 return log_error_errno(r
, "Failed to request name: %m");
89 r
= sd_bus_attach_event(m
->bus
, m
->event
, 0);
91 return log_error_errno(r
, "Failed to attach bus to event loop: %m");
93 (void) sd_bus_set_exit_on_disconnect(m
->bus
, true);
98 static int manager_startup(Manager
*m
) {
103 r
= manager_connect_bus(m
);
110 static bool check_idle(void *userdata
) {
111 Manager
*m
= userdata
;
113 return !m
->operations
;
116 static int manager_run(Manager
*m
) {
119 return bus_event_loop_with_idle(
122 "org.freedesktop.portable1",
127 static int run(int argc
, char *argv
[]) {
128 _cleanup_(manager_unrefp
) Manager
*m
= NULL
;
133 r
= service_parse_argv("systemd-portabled.service",
134 "Manage registrations of portable images.",
135 BUS_IMPLEMENTATIONS(&manager_object
,
136 &log_control_object
),
144 return log_error_errno(SYNTHETIC_ERRNO(EINVAL
), "This program takes no arguments.");
146 assert_se(sigprocmask_many(SIG_BLOCK
, NULL
, SIGCHLD
, SIGTERM
, SIGINT
, -1) >= 0);
150 return log_error_errno(r
, "Failed to allocate manager object: %m");
152 r
= manager_startup(m
);
154 return log_error_errno(r
, "Failed to fully start up daemon: %m");
156 log_debug("systemd-portabled running as pid " PID_FMT
, getpid_cached());
159 "STATUS=Processing requests...");
163 (void) sd_notify(false,
165 "STATUS=Shutting down...");
166 log_debug("systemd-portabled stopped as pid " PID_FMT
, getpid_cached());
170 DEFINE_MAIN_FUNCTION(run
);