1 /* SPDX-License-Identifier: LGPL-2.1+ */
9 #include "alloc-util.h"
10 #include "bus-polkit.h"
12 #include "main-func.h"
13 #include "portabled-bus.h"
14 #include "portabled-image-bus.h"
15 #include "portabled.h"
16 #include "process-util.h"
17 #include "signal-util.h"
19 static Manager
* manager_unref(Manager
*m
);
20 DEFINE_TRIVIAL_CLEANUP_FUNC(Manager
*, manager_unref
);
22 static int manager_new(Manager
**ret
) {
23 _cleanup_(manager_unrefp
) Manager
*m
= NULL
;
32 r
= sd_event_default(&m
->event
);
36 r
= sd_event_add_signal(m
->event
, NULL
, SIGINT
, NULL
, NULL
);
40 r
= sd_event_add_signal(m
->event
, NULL
, SIGTERM
, NULL
, NULL
);
44 (void) sd_event_set_watchdog(m
->event
, true);
50 static Manager
* manager_unref(Manager
*m
) {
53 hashmap_free(m
->image_cache
);
55 sd_event_source_unref(m
->image_cache_defer_event
);
57 bus_verify_polkit_async_registry_free(m
->polkit_registry
);
59 sd_bus_flush_close_unref(m
->bus
);
60 sd_event_unref(m
->event
);
65 static int manager_connect_bus(Manager
*m
) {
71 r
= sd_bus_default_system(&m
->bus
);
73 return log_error_errno(r
, "Failed to connect to system bus: %m");
75 r
= sd_bus_add_object_vtable(m
->bus
, NULL
, "/org/freedesktop/portable1", "org.freedesktop.portable1.Manager", manager_vtable
, m
);
77 return log_error_errno(r
, "Failed to add manager object vtable: %m");
79 r
= sd_bus_add_fallback_vtable(m
->bus
, NULL
, "/org/freedesktop/portable1/image", "org.freedesktop.portable1.Image", image_vtable
, bus_image_object_find
, m
);
81 return log_error_errno(r
, "Failed to add image object vtable: %m");
83 r
= sd_bus_add_node_enumerator(m
->bus
, NULL
, "/org/freedesktop/portable1/image", bus_image_node_enumerator
, m
);
85 return log_error_errno(r
, "Failed to add image enumerator: %m");
87 r
= sd_bus_request_name_async(m
->bus
, NULL
, "org.freedesktop.portable1", 0, NULL
, NULL
);
89 return log_error_errno(r
, "Failed to request name: %m");
91 r
= sd_bus_attach_event(m
->bus
, m
->event
, 0);
93 return log_error_errno(r
, "Failed to attach bus to event loop: %m");
95 (void) sd_bus_set_exit_on_disconnect(m
->bus
, true);
100 static int manager_startup(Manager
*m
) {
105 r
= manager_connect_bus(m
);
112 static bool check_idle(void *userdata
) {
113 Manager
*m
= userdata
;
115 return !m
->operations
;
118 static int manager_run(Manager
*m
) {
121 return bus_event_loop_with_idle(
124 "org.freedesktop.portable1",
129 static int run(int argc
, char *argv
[]) {
130 _cleanup_(manager_unrefp
) Manager
*m
= NULL
;
138 return log_error_errno(SYNTHETIC_ERRNO(EINVAL
), "This program takes no arguments.");
140 assert_se(sigprocmask_many(SIG_BLOCK
, NULL
, SIGCHLD
, SIGTERM
, SIGINT
, -1) >= 0);
144 return log_error_errno(r
, "Failed to allocate manager object: %m");
146 r
= manager_startup(m
);
148 return log_error_errno(r
, "Failed to fully start up daemon: %m");
150 log_debug("systemd-portabled running as pid " PID_FMT
, getpid_cached());
153 "STATUS=Processing requests...");
157 (void) sd_notify(false,
159 "STATUS=Shutting down...");
160 log_debug("systemd-portabled stopped as pid " PID_FMT
, getpid_cached());
164 DEFINE_MAIN_FUNCTION(run
);