]>
git.ipfire.org Git - thirdparty/systemd.git/blob - src/portable/portabled.c
1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
8 #include "alloc-util.h"
9 #include "bus-log-control-api.h"
10 #include "bus-polkit.h"
11 #include "common-signal.h"
12 #include "constants.h"
13 #include "daemon-util.h"
14 #include "main-func.h"
15 #include "portabled-bus.h"
16 #include "portabled-image-bus.h"
17 #include "portabled.h"
18 #include "process-util.h"
19 #include "service-util.h"
20 #include "signal-util.h"
22 static Manager
* manager_unref(Manager
*m
);
23 DEFINE_TRIVIAL_CLEANUP_FUNC(Manager
*, manager_unref
);
25 static int manager_new(Manager
**ret
) {
26 _cleanup_(manager_unrefp
) Manager
*m
= NULL
;
35 r
= sd_event_default(&m
->event
);
39 r
= sd_event_add_signal(m
->event
, NULL
, SIGINT
, NULL
, NULL
);
43 r
= sd_event_add_signal(m
->event
, NULL
, SIGTERM
, NULL
, NULL
);
47 r
= sd_event_add_signal(m
->event
, NULL
, SIGRTMIN
+18, sigrtmin18_handler
, NULL
);
51 r
= sd_event_add_memory_pressure(m
->event
, NULL
, NULL
, NULL
);
53 log_debug_errno(r
, "Failed allocate memory pressure event source, ignoring: %m");
55 (void) sd_event_set_watchdog(m
->event
, true);
61 static Manager
* manager_unref(Manager
*m
) {
64 hashmap_free(m
->image_cache
);
66 sd_event_source_unref(m
->image_cache_defer_event
);
68 hashmap_free(m
->polkit_registry
);
70 sd_bus_flush_close_unref(m
->bus
);
71 sd_event_unref(m
->event
);
76 static int manager_connect_bus(Manager
*m
) {
82 r
= sd_bus_default_system(&m
->bus
);
84 return log_error_errno(r
, "Failed to connect to system bus: %m");
86 r
= bus_add_implementation(m
->bus
, &manager_object
, m
);
90 r
= bus_log_control_api_register(m
->bus
);
94 r
= sd_bus_request_name_async(m
->bus
, NULL
, "org.freedesktop.portable1", 0, NULL
, NULL
);
96 return log_error_errno(r
, "Failed to request name: %m");
98 r
= sd_bus_attach_event(m
->bus
, m
->event
, 0);
100 return log_error_errno(r
, "Failed to attach bus to event loop: %m");
102 (void) sd_bus_set_exit_on_disconnect(m
->bus
, true);
107 static int manager_startup(Manager
*m
) {
112 r
= manager_connect_bus(m
);
119 static bool check_idle(void *userdata
) {
120 Manager
*m
= userdata
;
122 return !m
->operations
;
125 static int run(int argc
, char *argv
[]) {
126 _cleanup_(manager_unrefp
) Manager
*m
= NULL
;
131 r
= service_parse_argv("systemd-portabled.service",
132 "Manage registrations of portable images.",
133 BUS_IMPLEMENTATIONS(&manager_object
,
134 &log_control_object
),
142 return log_error_errno(SYNTHETIC_ERRNO(EINVAL
), "This program takes no arguments.");
144 assert_se(sigprocmask_many(SIG_BLOCK
, NULL
, SIGCHLD
, SIGTERM
, SIGINT
, SIGRTMIN
+18) >= 0);
148 return log_error_errno(r
, "Failed to allocate manager object: %m");
150 r
= manager_startup(m
);
152 return log_error_errno(r
, "Failed to fully start up daemon: %m");
154 r
= sd_notify(false, NOTIFY_READY
);
156 log_warning_errno(r
, "Failed to send readiness notification, ignoring: %m");
158 r
= bus_event_loop_with_idle(
161 "org.freedesktop.portable1",
165 return log_error_errno(r
, "Failed to run main loop: %m");
170 DEFINE_MAIN_FUNCTION(run
);