| File: | build-scan/../src/machine/machined.c |
| Warning: | line 115, column 24 Potential leak of memory pointed to by 'unit' |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
| 1 | /* SPDX-License-Identifier: LGPL-2.1+ */ | |||
| 2 | ||||
| 3 | #include <errno(*__errno_location ()).h> | |||
| 4 | #include <string.h> | |||
| 5 | #include <unistd.h> | |||
| 6 | ||||
| 7 | #include "sd-daemon.h" | |||
| 8 | ||||
| 9 | #include "alloc-util.h" | |||
| 10 | #include "bus-error.h" | |||
| 11 | #include "bus-util.h" | |||
| 12 | #include "cgroup-util.h" | |||
| 13 | #include "dirent-util.h" | |||
| 14 | #include "fd-util.h" | |||
| 15 | #include "format-util.h" | |||
| 16 | #include "hostname-util.h" | |||
| 17 | #include "label.h" | |||
| 18 | #include "machine-image.h" | |||
| 19 | #include "machined.h" | |||
| 20 | #include "process-util.h" | |||
| 21 | #include "signal-util.h" | |||
| 22 | #include "special.h" | |||
| 23 | ||||
| 24 | static Manager* manager_unref(Manager *m); | |||
| 25 | DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_unref)static inline void manager_unrefp(Manager* *p) { if (*p) manager_unref (*p); }; | |||
| 26 | ||||
| 27 | static int manager_new(Manager **ret) { | |||
| 28 | _cleanup_(manager_unrefp)__attribute__((cleanup(manager_unrefp))) Manager *m = NULL((void*)0); | |||
| 29 | int r; | |||
| 30 | ||||
| 31 | assert(ret)do { if ((__builtin_expect(!!(!(ret)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("ret"), "../src/machine/machined.c", 31, __PRETTY_FUNCTION__); } while (0); | |||
| 32 | ||||
| 33 | m = new0(Manager, 1)((Manager*) calloc((1), sizeof(Manager))); | |||
| 34 | if (!m) | |||
| 35 | return -ENOMEM12; | |||
| 36 | ||||
| 37 | m->machines = hashmap_new(&string_hash_ops)internal_hashmap_new(&string_hash_ops ); | |||
| 38 | m->machine_units = hashmap_new(&string_hash_ops)internal_hashmap_new(&string_hash_ops ); | |||
| 39 | m->machine_leaders = hashmap_new(NULL)internal_hashmap_new(((void*)0) ); | |||
| 40 | ||||
| 41 | if (!m->machines || !m->machine_units || !m->machine_leaders) | |||
| 42 | return -ENOMEM12; | |||
| 43 | ||||
| 44 | r = sd_event_default(&m->event); | |||
| 45 | if (r < 0) | |||
| 46 | return r; | |||
| 47 | ||||
| 48 | r = sd_event_add_signal(m->event, NULL((void*)0), SIGINT2, NULL((void*)0), NULL((void*)0)); | |||
| 49 | if (r < 0) | |||
| 50 | return r; | |||
| 51 | ||||
| 52 | r = sd_event_add_signal(m->event, NULL((void*)0), SIGTERM15, NULL((void*)0), NULL((void*)0)); | |||
| 53 | if (r < 0) | |||
| 54 | return r; | |||
| 55 | ||||
| 56 | (void) sd_event_set_watchdog(m->event, true1); | |||
| 57 | ||||
| 58 | *ret = TAKE_PTR(m)({ typeof(m) _ptr_ = (m); (m) = ((void*)0); _ptr_; }); | |||
| 59 | return 0; | |||
| 60 | } | |||
| 61 | ||||
| 62 | static Manager* manager_unref(Manager *m) { | |||
| 63 | Machine *machine; | |||
| 64 | ||||
| 65 | if (!m) | |||
| 66 | return NULL((void*)0); | |||
| 67 | ||||
| 68 | while (m->operations) | |||
| 69 | operation_free(m->operations); | |||
| 70 | ||||
| 71 | assert(m->n_operations == 0)do { if ((__builtin_expect(!!(!(m->n_operations == 0)),0)) ) log_assert_failed_realm(LOG_REALM_SYSTEMD, ("m->n_operations == 0" ), "../src/machine/machined.c", 71, __PRETTY_FUNCTION__); } while (0); | |||
| 72 | ||||
| 73 | while ((machine = hashmap_first(m->machines))) | |||
| 74 | machine_free(machine); | |||
| 75 | ||||
| 76 | hashmap_free(m->machines); | |||
| 77 | hashmap_free(m->machine_units); | |||
| 78 | hashmap_free(m->machine_leaders); | |||
| 79 | ||||
| 80 | hashmap_free_with_destructor(m->image_cache, image_unref)({ ({ void *_item; while ((_item = hashmap_steal_first(m-> image_cache))) image_unref(_item); }); hashmap_free(m->image_cache ); }); | |||
| 81 | ||||
| 82 | sd_event_source_unref(m->image_cache_defer_event); | |||
| 83 | ||||
| 84 | bus_verify_polkit_async_registry_free(m->polkit_registry); | |||
| 85 | ||||
| 86 | sd_bus_unref(m->bus); | |||
| 87 | sd_event_unref(m->event); | |||
| 88 | ||||
| 89 | return mfree(m); | |||
| 90 | } | |||
| 91 | ||||
| 92 | static int manager_add_host_machine(Manager *m) { | |||
| 93 | _cleanup_free___attribute__((cleanup(freep))) char *rd = NULL((void*)0), *unit = NULL((void*)0); | |||
| 94 | sd_id128_t mid; | |||
| 95 | Machine *t; | |||
| 96 | int r; | |||
| 97 | ||||
| 98 | if (m->host_machine) | |||
| 99 | return 0; | |||
| 100 | ||||
| 101 | r = sd_id128_get_machine(&mid); | |||
| 102 | if (r < 0) | |||
| 103 | return log_error_errno(r, "Failed to get machine ID: %m")({ int _level = ((3)), _e = ((r)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/machine/machined.c", 103, __func__, "Failed to get machine ID: %m" ) : -abs(_e); }); | |||
| 104 | ||||
| 105 | rd = strdup("/"); | |||
| 106 | if (!rd) | |||
| 107 | return log_oom()log_oom_internal(LOG_REALM_SYSTEMD, "../src/machine/machined.c" , 107, __func__); | |||
| 108 | ||||
| 109 | unit = strdup(SPECIAL_ROOT_SLICE"-.slice"); | |||
| 110 | if (!unit) | |||
| 111 | return log_oom()log_oom_internal(LOG_REALM_SYSTEMD, "../src/machine/machined.c" , 111, __func__); | |||
| 112 | ||||
| 113 | t = machine_new(m, MACHINE_HOST, ".host"); | |||
| 114 | if (!t) | |||
| 115 | return log_oom()log_oom_internal(LOG_REALM_SYSTEMD, "../src/machine/machined.c" , 115, __func__); | |||
| ||||
| 116 | ||||
| 117 | t->leader = 1; | |||
| 118 | t->id = mid; | |||
| 119 | ||||
| 120 | t->root_directory = TAKE_PTR(rd)({ typeof(rd) _ptr_ = (rd); (rd) = ((void*)0); _ptr_; }); | |||
| 121 | t->unit = TAKE_PTR(unit)({ typeof(unit) _ptr_ = (unit); (unit) = ((void*)0); _ptr_; } ); | |||
| 122 | ||||
| 123 | dual_timestamp_from_boottime_or_monotonic(&t->timestamp, 0); | |||
| 124 | ||||
| 125 | m->host_machine = t; | |||
| 126 | ||||
| 127 | return 0; | |||
| 128 | } | |||
| 129 | ||||
| 130 | static int manager_enumerate_machines(Manager *m) { | |||
| 131 | _cleanup_closedir___attribute__((cleanup(closedirp))) DIR *d = NULL((void*)0); | |||
| 132 | struct dirent *de; | |||
| 133 | int r = 0; | |||
| 134 | ||||
| 135 | assert(m)do { if ((__builtin_expect(!!(!(m)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("m"), "../src/machine/machined.c", 135, __PRETTY_FUNCTION__ ); } while (0); | |||
| 136 | ||||
| 137 | r = manager_add_host_machine(m); | |||
| 138 | if (r < 0) | |||
| 139 | return r; | |||
| 140 | ||||
| 141 | /* Read in machine data stored on disk */ | |||
| 142 | d = opendir("/run/systemd/machines"); | |||
| 143 | if (!d) { | |||
| 144 | if (errno(*__errno_location ()) == ENOENT2) | |||
| 145 | return 0; | |||
| 146 | ||||
| 147 | return log_error_errno(errno, "Failed to open /run/systemd/machines: %m")({ int _level = ((3)), _e = (((*__errno_location ()))), _realm = (LOG_REALM_SYSTEMD); (log_get_max_level_realm(_realm) >= ((_level) & 0x07)) ? log_internal_realm(((_realm) << 10 | (_level)), _e, "../src/machine/machined.c", 147, __func__ , "Failed to open /run/systemd/machines: %m") : -abs(_e); }); | |||
| 148 | } | |||
| 149 | ||||
| 150 | FOREACH_DIRENT(de, d, return -errno)for ((*__errno_location ()) = 0, de = readdir(d);; (*__errno_location ()) = 0, de = readdir(d)) if (!de) { if ((*__errno_location ( )) > 0) { return -(*__errno_location ()); } break; } else if (hidden_or_backup_file((de)->d_name)) continue; else { | |||
| 151 | struct Machine *machine; | |||
| 152 | int k; | |||
| 153 | ||||
| 154 | if (!dirent_is_file(de)) | |||
| 155 | continue; | |||
| 156 | ||||
| 157 | /* Ignore symlinks that map the unit name to the machine */ | |||
| 158 | if (startswith(de->d_name, "unit:")) | |||
| 159 | continue; | |||
| 160 | ||||
| 161 | if (!machine_name_is_valid(de->d_name)hostname_is_valid(de->d_name, 0)) | |||
| 162 | continue; | |||
| 163 | ||||
| 164 | k = manager_add_machine(m, de->d_name, &machine); | |||
| 165 | if (k < 0) { | |||
| 166 | r = log_error_errno(k, "Failed to add machine by file name %s: %m", de->d_name)({ int _level = ((3)), _e = ((k)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/machine/machined.c", 166, __func__, "Failed to add machine by file name %s: %m" , de->d_name) : -abs(_e); }); | |||
| 167 | continue; | |||
| 168 | } | |||
| 169 | ||||
| 170 | machine_add_to_gc_queue(machine); | |||
| 171 | ||||
| 172 | k = machine_load(machine); | |||
| 173 | if (k < 0) | |||
| 174 | r = k; | |||
| 175 | } | |||
| 176 | ||||
| 177 | return r; | |||
| 178 | } | |||
| 179 | ||||
| 180 | static int manager_connect_bus(Manager *m) { | |||
| 181 | int r; | |||
| 182 | ||||
| 183 | assert(m)do { if ((__builtin_expect(!!(!(m)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("m"), "../src/machine/machined.c", 183, __PRETTY_FUNCTION__ ); } while (0); | |||
| 184 | assert(!m->bus)do { if ((__builtin_expect(!!(!(!m->bus)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("!m->bus"), "../src/machine/machined.c" , 184, __PRETTY_FUNCTION__); } while (0); | |||
| 185 | ||||
| 186 | r = sd_bus_default_system(&m->bus); | |||
| 187 | if (r < 0) | |||
| 188 | return log_error_errno(r, "Failed to connect to system bus: %m")({ int _level = ((3)), _e = ((r)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/machine/machined.c", 188, __func__, "Failed to connect to system bus: %m" ) : -abs(_e); }); | |||
| 189 | ||||
| 190 | r = sd_bus_add_object_vtable(m->bus, NULL((void*)0), "/org/freedesktop/machine1", "org.freedesktop.machine1.Manager", manager_vtable, m); | |||
| 191 | if (r < 0) | |||
| 192 | return log_error_errno(r, "Failed to add manager object vtable: %m")({ int _level = ((3)), _e = ((r)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/machine/machined.c", 192, __func__, "Failed to add manager object vtable: %m" ) : -abs(_e); }); | |||
| 193 | ||||
| 194 | r = sd_bus_add_fallback_vtable(m->bus, NULL((void*)0), "/org/freedesktop/machine1/machine", "org.freedesktop.machine1.Machine", machine_vtable, machine_object_find, m); | |||
| 195 | if (r < 0) | |||
| 196 | return log_error_errno(r, "Failed to add machine object vtable: %m")({ int _level = ((3)), _e = ((r)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/machine/machined.c", 196, __func__, "Failed to add machine object vtable: %m" ) : -abs(_e); }); | |||
| 197 | ||||
| 198 | r = sd_bus_add_node_enumerator(m->bus, NULL((void*)0), "/org/freedesktop/machine1/machine", machine_node_enumerator, m); | |||
| 199 | if (r < 0) | |||
| 200 | return log_error_errno(r, "Failed to add machine enumerator: %m")({ int _level = ((3)), _e = ((r)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/machine/machined.c", 200, __func__, "Failed to add machine enumerator: %m" ) : -abs(_e); }); | |||
| 201 | ||||
| 202 | r = sd_bus_add_fallback_vtable(m->bus, NULL((void*)0), "/org/freedesktop/machine1/image", "org.freedesktop.machine1.Image", image_vtable, image_object_find, m); | |||
| 203 | if (r < 0) | |||
| 204 | return log_error_errno(r, "Failed to add image object vtable: %m")({ int _level = ((3)), _e = ((r)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/machine/machined.c", 204, __func__, "Failed to add image object vtable: %m" ) : -abs(_e); }); | |||
| 205 | ||||
| 206 | r = sd_bus_add_node_enumerator(m->bus, NULL((void*)0), "/org/freedesktop/machine1/image", image_node_enumerator, m); | |||
| 207 | if (r < 0) | |||
| 208 | return log_error_errno(r, "Failed to add image enumerator: %m")({ int _level = ((3)), _e = ((r)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/machine/machined.c", 208, __func__, "Failed to add image enumerator: %m" ) : -abs(_e); }); | |||
| 209 | ||||
| 210 | r = sd_bus_match_signal_async( | |||
| 211 | m->bus, | |||
| 212 | NULL((void*)0), | |||
| 213 | "org.freedesktop.systemd1", | |||
| 214 | "/org/freedesktop/systemd1", | |||
| 215 | "org.freedesktop.systemd1.Manager", | |||
| 216 | "JobRemoved", | |||
| 217 | match_job_removed, NULL((void*)0), m); | |||
| 218 | if (r < 0) | |||
| 219 | return log_error_errno(r, "Failed to add match for JobRemoved: %m")({ int _level = ((3)), _e = ((r)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/machine/machined.c", 219, __func__, "Failed to add match for JobRemoved: %m" ) : -abs(_e); }); | |||
| 220 | ||||
| 221 | r = sd_bus_match_signal_async( | |||
| 222 | m->bus, | |||
| 223 | NULL((void*)0), | |||
| 224 | "org.freedesktop.systemd1", | |||
| 225 | "/org/freedesktop/systemd1", | |||
| 226 | "org.freedesktop.systemd1.Manager", | |||
| 227 | "UnitRemoved", | |||
| 228 | match_unit_removed, NULL((void*)0), m); | |||
| 229 | if (r < 0) | |||
| 230 | return log_error_errno(r, "Failed to request match for UnitRemoved: %m")({ int _level = ((3)), _e = ((r)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/machine/machined.c", 230, __func__, "Failed to request match for UnitRemoved: %m" ) : -abs(_e); }); | |||
| 231 | ||||
| 232 | r = sd_bus_match_signal_async( | |||
| 233 | m->bus, | |||
| 234 | NULL((void*)0), | |||
| 235 | "org.freedesktop.systemd1", | |||
| 236 | NULL((void*)0), | |||
| 237 | "org.freedesktop.DBus.Properties", | |||
| 238 | "PropertiesChanged", | |||
| 239 | match_properties_changed, NULL((void*)0), m); | |||
| 240 | if (r < 0) | |||
| 241 | return log_error_errno(r, "Failed to request match for PropertiesChanged: %m")({ int _level = ((3)), _e = ((r)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/machine/machined.c", 241, __func__, "Failed to request match for PropertiesChanged: %m" ) : -abs(_e); }); | |||
| 242 | ||||
| 243 | r = sd_bus_match_signal_async( | |||
| 244 | m->bus, | |||
| 245 | NULL((void*)0), | |||
| 246 | "org.freedesktop.systemd1", | |||
| 247 | "/org/freedesktop/systemd1", | |||
| 248 | "org.freedesktop.systemd1.Manager", | |||
| 249 | "Reloading", | |||
| 250 | match_reloading, NULL((void*)0), m); | |||
| 251 | if (r < 0) | |||
| 252 | return log_error_errno(r, "Failed to request match for Reloading: %m")({ int _level = ((3)), _e = ((r)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/machine/machined.c", 252, __func__, "Failed to request match for Reloading: %m" ) : -abs(_e); }); | |||
| 253 | ||||
| 254 | r = sd_bus_call_method_async( | |||
| 255 | m->bus, | |||
| 256 | NULL((void*)0), | |||
| 257 | "org.freedesktop.systemd1", | |||
| 258 | "/org/freedesktop/systemd1", | |||
| 259 | "org.freedesktop.systemd1.Manager", | |||
| 260 | "Subscribe", | |||
| 261 | NULL((void*)0), NULL((void*)0), | |||
| 262 | NULL((void*)0)); | |||
| 263 | if (r < 0) | |||
| 264 | return log_error_errno(r, "Failed to enable subscription: %m")({ int _level = ((3)), _e = ((r)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/machine/machined.c", 264, __func__, "Failed to enable subscription: %m" ) : -abs(_e); }); | |||
| 265 | ||||
| 266 | r = sd_bus_request_name_async(m->bus, NULL((void*)0), "org.freedesktop.machine1", 0, NULL((void*)0), NULL((void*)0)); | |||
| 267 | if (r < 0) | |||
| 268 | return log_error_errno(r, "Failed to request name: %m")({ int _level = ((3)), _e = ((r)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/machine/machined.c", 268, __func__, "Failed to request name: %m" ) : -abs(_e); }); | |||
| 269 | ||||
| 270 | r = sd_bus_attach_event(m->bus, m->event, 0); | |||
| 271 | if (r < 0) | |||
| 272 | return log_error_errno(r, "Failed to attach bus to event loop: %m")({ int _level = ((3)), _e = ((r)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/machine/machined.c", 272, __func__, "Failed to attach bus to event loop: %m" ) : -abs(_e); }); | |||
| 273 | ||||
| 274 | return 0; | |||
| 275 | } | |||
| 276 | ||||
| 277 | static void manager_gc(Manager *m, bool_Bool drop_not_started) { | |||
| 278 | Machine *machine; | |||
| 279 | ||||
| 280 | assert(m)do { if ((__builtin_expect(!!(!(m)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("m"), "../src/machine/machined.c", 280, __PRETTY_FUNCTION__ ); } while (0); | |||
| 281 | ||||
| 282 | while ((machine = m->machine_gc_queue)) { | |||
| 283 | LIST_REMOVE(gc_queue, m->machine_gc_queue, machine)do { typeof(*(m->machine_gc_queue)) **_head = &(m-> machine_gc_queue), *_item = (machine); do { if ((__builtin_expect (!!(!(_item)),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD, ("_item"), "../src/machine/machined.c", 283, __PRETTY_FUNCTION__ ); } while (0); if (_item->gc_queue_next) _item->gc_queue_next ->gc_queue_prev = _item->gc_queue_prev; if (_item->gc_queue_prev ) _item->gc_queue_prev->gc_queue_next = _item->gc_queue_next ; else { do { if ((__builtin_expect(!!(!(*_head == _item)),0) )) log_assert_failed_realm(LOG_REALM_SYSTEMD, ("*_head == _item" ), "../src/machine/machined.c", 283, __PRETTY_FUNCTION__); } while (0); *_head = _item->gc_queue_next; } _item->gc_queue_next = _item->gc_queue_prev = ((void*)0); } while (0); | |||
| 284 | machine->in_gc_queue = false0; | |||
| 285 | ||||
| 286 | /* First, if we are not closing yet, initiate stopping */ | |||
| 287 | if (machine_may_gc(machine, drop_not_started) && | |||
| 288 | machine_get_state(machine) != MACHINE_CLOSING) | |||
| 289 | machine_stop(machine); | |||
| 290 | ||||
| 291 | /* Now, the stop probably made this referenced | |||
| 292 | * again, but if it didn't, then it's time to let it | |||
| 293 | * go entirely. */ | |||
| 294 | if (machine_may_gc(machine, drop_not_started)) { | |||
| 295 | machine_finalize(machine); | |||
| 296 | machine_free(machine); | |||
| 297 | } | |||
| 298 | } | |||
| 299 | } | |||
| 300 | ||||
| 301 | static int manager_startup(Manager *m) { | |||
| 302 | Machine *machine; | |||
| 303 | Iterator i; | |||
| 304 | int r; | |||
| 305 | ||||
| 306 | assert(m)do { if ((__builtin_expect(!!(!(m)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("m"), "../src/machine/machined.c", 306, __PRETTY_FUNCTION__ ); } while (0); | |||
| 307 | ||||
| 308 | /* Connect to the bus */ | |||
| 309 | r = manager_connect_bus(m); | |||
| 310 | if (r < 0) | |||
| 311 | return r; | |||
| 312 | ||||
| 313 | /* Deserialize state */ | |||
| 314 | manager_enumerate_machines(m); | |||
| 315 | ||||
| 316 | /* Remove stale objects before we start them */ | |||
| 317 | manager_gc(m, false0); | |||
| 318 | ||||
| 319 | /* And start everything */ | |||
| 320 | HASHMAP_FOREACH(machine, m->machines, i)for ((i) = ((Iterator) { .idx = ((2147483647 *2U +1U) - 1), . next_key = ((void*)0) }); hashmap_iterate((m->machines), & (i), (void**)&(machine), ((void*)0)); ) | |||
| 321 | machine_start(machine, NULL((void*)0), NULL((void*)0)); | |||
| 322 | ||||
| 323 | return 0; | |||
| 324 | } | |||
| 325 | ||||
| 326 | static bool_Bool check_idle(void *userdata) { | |||
| 327 | Manager *m = userdata; | |||
| 328 | ||||
| 329 | if (m->operations) | |||
| 330 | return false0; | |||
| 331 | ||||
| 332 | manager_gc(m, true1); | |||
| 333 | ||||
| 334 | return hashmap_isempty(m->machines); | |||
| 335 | } | |||
| 336 | ||||
| 337 | static int manager_run(Manager *m) { | |||
| 338 | assert(m)do { if ((__builtin_expect(!!(!(m)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("m"), "../src/machine/machined.c", 338, __PRETTY_FUNCTION__ ); } while (0); | |||
| 339 | ||||
| 340 | return bus_event_loop_with_idle( | |||
| 341 | m->event, | |||
| 342 | m->bus, | |||
| 343 | "org.freedesktop.machine1", | |||
| 344 | DEFAULT_EXIT_USEC(30*((usec_t) 1000000ULL)), | |||
| 345 | check_idle, m); | |||
| 346 | } | |||
| 347 | ||||
| 348 | int main(int argc, char *argv[]) { | |||
| 349 | _cleanup_(manager_unrefp)__attribute__((cleanup(manager_unrefp))) Manager *m = NULL((void*)0); | |||
| 350 | int r; | |||
| 351 | ||||
| 352 | log_set_target(LOG_TARGET_AUTO); | |||
| 353 | log_set_facility(LOG_AUTH(4<<3)); | |||
| 354 | log_parse_environment()log_parse_environment_realm(LOG_REALM_SYSTEMD); | |||
| 355 | log_open(); | |||
| 356 | ||||
| 357 | umask(0022); | |||
| 358 | ||||
| 359 | if (argc != 1) { | |||
| ||||
| 360 | log_error("This program takes no arguments.")({ int _level = (((3))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/machine/machined.c", 360, __func__, "This program takes no arguments." ) : -abs(_e); }); | |||
| 361 | r = -EINVAL22; | |||
| 362 | goto finish; | |||
| 363 | } | |||
| 364 | ||||
| 365 | /* Always create the directories people can create inotify watches in. Note that some applications might check | |||
| 366 | * for the existence of /run/systemd/machines/ to determine whether machined is available, so please always | |||
| 367 | * make sure this check stays in. */ | |||
| 368 | (void) mkdir_label("/run/systemd/machines", 0755); | |||
| 369 | ||||
| 370 | assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGCHLD, SIGTERM, SIGINT, -1) >= 0)do { if ((__builtin_expect(!!(!(sigprocmask_many(0, ((void*)0 ), 17, 15, 2, -1) >= 0)),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD , ("sigprocmask_many(SIG_BLOCK, NULL, SIGCHLD, SIGTERM, SIGINT, -1) >= 0" ), "../src/machine/machined.c", 370, __PRETTY_FUNCTION__); } while (0); | |||
| 371 | ||||
| 372 | r = manager_new(&m); | |||
| 373 | if (r
| |||
| 374 | log_error_errno(r, "Failed to allocate manager object: %m")({ int _level = ((3)), _e = ((r)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/machine/machined.c", 374, __func__, "Failed to allocate manager object: %m" ) : -abs(_e); }); | |||
| 375 | goto finish; | |||
| 376 | } | |||
| 377 | ||||
| 378 | r = manager_startup(m); | |||
| 379 | if (r < 0) { | |||
| 380 | log_error_errno(r, "Failed to fully start up daemon: %m")({ int _level = ((3)), _e = ((r)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/machine/machined.c", 380, __func__, "Failed to fully start up daemon: %m" ) : -abs(_e); }); | |||
| 381 | goto finish; | |||
| 382 | } | |||
| 383 | ||||
| 384 | log_debug("systemd-machined running as pid "PID_FMT, getpid_cached())({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/machine/machined.c", 384, __func__, "systemd-machined running as pid " "%" "i", getpid_cached()) : -abs(_e); }); | |||
| 385 | ||||
| 386 | (void) sd_notify(false0, | |||
| 387 | "READY=1\n" | |||
| 388 | "STATUS=Processing requests..."); | |||
| 389 | ||||
| 390 | r = manager_run(m); | |||
| 391 | ||||
| 392 | log_debug("systemd-machined stopped as pid "PID_FMT, getpid_cached())({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/machine/machined.c", 392, __func__, "systemd-machined stopped as pid " "%" "i", getpid_cached()) : -abs(_e); }); | |||
| 393 | ||||
| 394 | (void) sd_notify(false0, | |||
| 395 | "STOPPING=1\n" | |||
| 396 | "STATUS=Shutting down..."); | |||
| 397 | ||||
| 398 | finish: | |||
| 399 | return r < 0 ? EXIT_FAILURE1 : EXIT_SUCCESS0; | |||
| 400 | } |