1 /* SPDX-License-Identifier: LGPL-2.1+ */
6 #include "alloc-util.h"
10 #include "portabled-bus.h"
11 #include "portabled-image-bus.h"
12 #include "portabled.h"
13 #include "process-util.h"
14 #include "signal-util.h"
16 static Manager
* manager_unref(Manager
*m
);
17 DEFINE_TRIVIAL_CLEANUP_FUNC(Manager
*, manager_unref
);
19 static int manager_new(Manager
**ret
) {
20 _cleanup_(manager_unrefp
) Manager
*m
= NULL
;
29 r
= sd_event_default(&m
->event
);
33 r
= sd_event_add_signal(m
->event
, NULL
, SIGINT
, NULL
, NULL
);
37 r
= sd_event_add_signal(m
->event
, NULL
, SIGTERM
, NULL
, NULL
);
41 (void) sd_event_set_watchdog(m
->event
, true);
47 static Manager
* manager_unref(Manager
*m
) {
50 hashmap_free(m
->image_cache
);
52 sd_event_source_unref(m
->image_cache_defer_event
);
54 bus_verify_polkit_async_registry_free(m
->polkit_registry
);
56 sd_bus_flush_close_unref(m
->bus
);
57 sd_event_unref(m
->event
);
62 static int manager_connect_bus(Manager
*m
) {
68 r
= sd_bus_default_system(&m
->bus
);
70 return log_error_errno(r
, "Failed to connect to system bus: %m");
72 r
= sd_bus_add_object_vtable(m
->bus
, NULL
, "/org/freedesktop/portable1", "org.freedesktop.portable1.Manager", manager_vtable
, m
);
74 return log_error_errno(r
, "Failed to add manager object vtable: %m");
76 r
= sd_bus_add_fallback_vtable(m
->bus
, NULL
, "/org/freedesktop/portable1/image", "org.freedesktop.portable1.Image", image_vtable
, bus_image_object_find
, m
);
78 return log_error_errno(r
, "Failed to add image object vtable: %m");
80 r
= sd_bus_add_node_enumerator(m
->bus
, NULL
, "/org/freedesktop/portable1/image", bus_image_node_enumerator
, m
);
82 return log_error_errno(r
, "Failed to add image enumerator: %m");
84 r
= sd_bus_request_name_async(m
->bus
, NULL
, "org.freedesktop.portable1", 0, NULL
, NULL
);
86 return log_error_errno(r
, "Failed to request name: %m");
88 r
= sd_bus_attach_event(m
->bus
, m
->event
, 0);
90 return log_error_errno(r
, "Failed to attach bus to event loop: %m");
92 (void) sd_bus_set_exit_on_disconnect(m
->bus
, true);
97 static int manager_startup(Manager
*m
) {
102 r
= manager_connect_bus(m
);
109 static bool check_idle(void *userdata
) {
110 Manager
*m
= userdata
;
112 return !m
->operations
;
115 static int manager_run(Manager
*m
) {
118 return bus_event_loop_with_idle(
121 "org.freedesktop.portable1",
126 static int run(int argc
, char *argv
[]) {
127 _cleanup_(manager_unrefp
) Manager
*m
= NULL
;
135 log_error("This program takes no arguments.");
139 assert_se(sigprocmask_many(SIG_BLOCK
, NULL
, SIGCHLD
, SIGTERM
, SIGINT
, -1) >= 0);
143 return log_error_errno(r
, "Failed to allocate manager object: %m");
145 r
= manager_startup(m
);
147 return log_error_errno(r
, "Failed to fully start up daemon: %m");
149 log_debug("systemd-portabled running as pid " PID_FMT
, getpid_cached());
152 "STATUS=Processing requests...");
156 (void) sd_notify(false,
158 "STATUS=Shutting down...");
159 log_debug("systemd-portabled stopped as pid " PID_FMT
, getpid_cached());
163 DEFINE_MAIN_FUNCTION(run
);