Branch data Line data Source code
1 : : /* SPDX-License-Identifier: LGPL-2.1+ */
2 : :
3 : : #include <sys/stat.h>
4 : : #include <sys/types.h>
5 : :
6 : : #include "sd-bus.h"
7 : : #include "sd-daemon.h"
8 : :
9 : : #include "alloc-util.h"
10 : : #include "bus-util.h"
11 : : #include "def.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"
18 : :
19 : : static Manager* manager_unref(Manager *m);
20 [ # # ]: 0 : DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_unref);
21 : :
22 : 0 : static int manager_new(Manager **ret) {
23 : 0 : _cleanup_(manager_unrefp) Manager *m = NULL;
24 : : int r;
25 : :
26 [ # # ]: 0 : assert(ret);
27 : :
28 : 0 : m = new0(Manager, 1);
29 [ # # ]: 0 : if (!m)
30 : 0 : return -ENOMEM;
31 : :
32 : 0 : r = sd_event_default(&m->event);
33 [ # # ]: 0 : if (r < 0)
34 : 0 : return r;
35 : :
36 : 0 : r = sd_event_add_signal(m->event, NULL, SIGINT, NULL, NULL);
37 [ # # ]: 0 : if (r < 0)
38 : 0 : return r;
39 : :
40 : 0 : r = sd_event_add_signal(m->event, NULL, SIGTERM, NULL, NULL);
41 [ # # ]: 0 : if (r < 0)
42 : 0 : return r;
43 : :
44 : 0 : (void) sd_event_set_watchdog(m->event, true);
45 : :
46 : 0 : *ret = TAKE_PTR(m);
47 : 0 : return 0;
48 : : }
49 : :
50 : 0 : static Manager* manager_unref(Manager *m) {
51 [ # # ]: 0 : assert(m);
52 : :
53 : 0 : hashmap_free(m->image_cache);
54 : :
55 : 0 : sd_event_source_unref(m->image_cache_defer_event);
56 : :
57 : 0 : bus_verify_polkit_async_registry_free(m->polkit_registry);
58 : :
59 : 0 : sd_bus_flush_close_unref(m->bus);
60 : 0 : sd_event_unref(m->event);
61 : :
62 : 0 : return mfree(m);
63 : : }
64 : :
65 : 0 : static int manager_connect_bus(Manager *m) {
66 : : int r;
67 : :
68 [ # # ]: 0 : assert(m);
69 [ # # ]: 0 : assert(!m->bus);
70 : :
71 : 0 : r = sd_bus_default_system(&m->bus);
72 [ # # ]: 0 : if (r < 0)
73 [ # # ]: 0 : return log_error_errno(r, "Failed to connect to system bus: %m");
74 : :
75 : 0 : r = sd_bus_add_object_vtable(m->bus, NULL, "/org/freedesktop/portable1", "org.freedesktop.portable1.Manager", manager_vtable, m);
76 [ # # ]: 0 : if (r < 0)
77 [ # # ]: 0 : return log_error_errno(r, "Failed to add manager object vtable: %m");
78 : :
79 : 0 : r = sd_bus_add_fallback_vtable(m->bus, NULL, "/org/freedesktop/portable1/image", "org.freedesktop.portable1.Image", image_vtable, bus_image_object_find, m);
80 [ # # ]: 0 : if (r < 0)
81 [ # # ]: 0 : return log_error_errno(r, "Failed to add image object vtable: %m");
82 : :
83 : 0 : r = sd_bus_add_node_enumerator(m->bus, NULL, "/org/freedesktop/portable1/image", bus_image_node_enumerator, m);
84 [ # # ]: 0 : if (r < 0)
85 [ # # ]: 0 : return log_error_errno(r, "Failed to add image enumerator: %m");
86 : :
87 : 0 : r = sd_bus_request_name_async(m->bus, NULL, "org.freedesktop.portable1", 0, NULL, NULL);
88 [ # # ]: 0 : if (r < 0)
89 [ # # ]: 0 : return log_error_errno(r, "Failed to request name: %m");
90 : :
91 : 0 : r = sd_bus_attach_event(m->bus, m->event, 0);
92 [ # # ]: 0 : if (r < 0)
93 [ # # ]: 0 : return log_error_errno(r, "Failed to attach bus to event loop: %m");
94 : :
95 : 0 : (void) sd_bus_set_exit_on_disconnect(m->bus, true);
96 : :
97 : 0 : return 0;
98 : : }
99 : :
100 : 0 : static int manager_startup(Manager *m) {
101 : : int r;
102 : :
103 [ # # ]: 0 : assert(m);
104 : :
105 : 0 : r = manager_connect_bus(m);
106 [ # # ]: 0 : if (r < 0)
107 : 0 : return r;
108 : :
109 : 0 : return 0;
110 : : }
111 : :
112 : 0 : static bool check_idle(void *userdata) {
113 : 0 : Manager *m = userdata;
114 : :
115 : 0 : return !m->operations;
116 : : }
117 : :
118 : 0 : static int manager_run(Manager *m) {
119 [ # # ]: 0 : assert(m);
120 : :
121 : 0 : return bus_event_loop_with_idle(
122 : : m->event,
123 : : m->bus,
124 : : "org.freedesktop.portable1",
125 : : DEFAULT_EXIT_USEC,
126 : : check_idle, m);
127 : : }
128 : :
129 : 0 : static int run(int argc, char *argv[]) {
130 : 0 : _cleanup_(manager_unrefp) Manager *m = NULL;
131 : : int r;
132 : :
133 : 0 : log_setup_service();
134 : :
135 : 0 : umask(0022);
136 : :
137 [ # # ]: 0 : if (argc != 1)
138 [ # # ]: 0 : return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "This program takes no arguments.");
139 : :
140 [ # # ]: 0 : assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGCHLD, SIGTERM, SIGINT, -1) >= 0);
141 : :
142 : 0 : r = manager_new(&m);
143 [ # # ]: 0 : if (r < 0)
144 [ # # ]: 0 : return log_error_errno(r, "Failed to allocate manager object: %m");
145 : :
146 : 0 : r = manager_startup(m);
147 [ # # ]: 0 : if (r < 0)
148 [ # # ]: 0 : return log_error_errno(r, "Failed to fully start up daemon: %m");
149 : :
150 [ # # ]: 0 : log_debug("systemd-portabled running as pid " PID_FMT, getpid_cached());
151 : 0 : sd_notify(false,
152 : : "READY=1\n"
153 : : "STATUS=Processing requests...");
154 : :
155 : 0 : r = manager_run(m);
156 : :
157 : 0 : (void) sd_notify(false,
158 : : "STOPPING=1\n"
159 : : "STATUS=Shutting down...");
160 [ # # ]: 0 : log_debug("systemd-portabled stopped as pid " PID_FMT, getpid_cached());
161 : 0 : return r;
162 : : }
163 : :
164 : 0 : DEFINE_MAIN_FUNCTION(run);
|