+static bool manager_utmp_good(Manager *m) {
+ int r;
+
+ assert(m);
+
+ if ((r = mount_path_is_mounted(m, _PATH_UTMPX)) <= 0) {
+
+ if (r < 0)
+ log_warning("Failed to determine whether " _PATH_UTMPX " is mounted: %s", strerror(-r));
+
+ return false;
+ }
+
+ return true;
+}
+
+void manager_write_utmp_reboot(Manager *m) {
+ int r;
+
+ assert(m);
+
+ if (m->utmp_reboot_written)
+ return;
+
+ if (m->running_as != MANAGER_INIT)
+ return;
+
+ if (!manager_utmp_good(m))
+ return;
+
+ if ((r = utmp_put_reboot(m->boot_timestamp)) < 0) {
+
+ if (r != -ENOENT && r != -EROFS)
+ log_warning("Failed to write utmp/wtmp: %s", strerror(-r));
+
+ return;
+ }
+
+ m->utmp_reboot_written = true;
+}
+
+void manager_write_utmp_runlevel(Manager *m, Unit *u) {
+ int runlevel, r;
+
+ assert(m);
+ assert(u);
+
+ if (u->meta.type != UNIT_TARGET)
+ return;
+
+ if (m->running_as != MANAGER_INIT)
+ return;
+
+ if (!manager_utmp_good(m))
+ return;
+
+ if ((runlevel = target_get_runlevel(TARGET(u))) <= 0)
+ return;
+
+ if ((r = utmp_put_runlevel(0, runlevel, 0)) < 0) {
+
+ if (r != -ENOENT && r != -EROFS)
+ log_warning("Failed to write utmp/wtmp: %s", strerror(-r));
+ }
+}
+
+void manager_dispatch_bus_name_owner_changed(
+ Manager *m,
+ const char *name,
+ const char* old_owner,
+ const char *new_owner) {
+
+ Unit *u;
+
+ assert(m);
+ assert(name);
+
+ if (!(u = hashmap_get(m->watch_bus, name)))
+ return;
+
+ UNIT_VTABLE(u)->bus_name_owner_change(u, name, old_owner, new_owner);
+}
+
+void manager_dispatch_bus_query_pid_done(
+ Manager *m,
+ const char *name,
+ pid_t pid) {
+
+ Unit *u;
+
+ assert(m);
+ assert(name);
+ assert(pid >= 1);
+
+ if (!(u = hashmap_get(m->watch_bus, name)))
+ return;
+
+ UNIT_VTABLE(u)->bus_query_pid_done(u, name, pid);
+}
+