chiark / gitweb /
machine: move symbols referenced by shared code from main to shared file
[elogind.git] / src / machine / machined-dbus.c
index 6035597913ec6dc0295e80da8a58a48fe7a5a1f6..d60be0d3ba02db8b88755b047f7fb47ec9211c51 100644 (file)
@@ -86,17 +86,25 @@ static int method_get_machine_by_pid(sd_bus *bus, sd_bus_message *message, void
         _cleanup_free_ char *p = NULL;
         Manager *m = userdata;
         Machine *machine = NULL;
         _cleanup_free_ char *p = NULL;
         Manager *m = userdata;
         Machine *machine = NULL;
-        uint32_t pid;
+        pid_t pid;
         int r;
 
         assert(bus);
         assert(message);
         assert(m);
 
         int r;
 
         assert(bus);
         assert(message);
         assert(m);
 
+        assert_cc(sizeof(pid_t) == sizeof(uint32_t));
+
         r = sd_bus_message_read(message, "u", &pid);
         if (r < 0)
                 return sd_bus_reply_method_errno(bus, message, r, NULL);
 
         r = sd_bus_message_read(message, "u", &pid);
         if (r < 0)
                 return sd_bus_reply_method_errno(bus, message, r, NULL);
 
+        if (pid == 0) {
+                r = sd_bus_get_owner_pid(bus, sd_bus_message_get_sender(message), &pid);
+                if (r < 0)
+                        return sd_bus_reply_method_errno(bus, message, r, NULL);
+        }
+
         r = manager_get_machine_by_pid(m, pid, &machine);
         if (r < 0)
                 return sd_bus_reply_method_errno(bus, message, r, NULL);
         r = manager_get_machine_by_pid(m, pid, &machine);
         if (r < 0)
                 return sd_bus_reply_method_errno(bus, message, r, NULL);
@@ -334,35 +342,6 @@ const sd_bus_vtable manager_vtable[] = {
         SD_BUS_VTABLE_END
 };
 
         SD_BUS_VTABLE_END
 };
 
-int machine_node_enumerator(sd_bus *bus, const char *path, char ***nodes, void *userdata) {
-        Machine *machine = NULL;
-        Manager *m = userdata;
-        char **l = NULL;
-        Iterator i;
-        int r;
-
-        assert(bus);
-        assert(path);
-        assert(nodes);
-
-        HASHMAP_FOREACH(machine, m->machines, i) {
-                char *p;
-
-                p = machine_bus_path(machine);
-                if (!p)
-                        return -ENOMEM;
-
-                r = strv_push(&l, p);
-                if (r < 0) {
-                        free(p);
-                        return r;
-                }
-        }
-
-        *nodes = l;
-        return 1;
-}
-
 int match_job_removed(sd_bus *bus, sd_bus_message *message, void *userdata) {
         const char *path, *result, *unit;
         Manager *m = userdata;
 int match_job_removed(sd_bus *bus, sd_bus_message *message, void *userdata) {
         const char *path, *result, *unit;
         Manager *m = userdata;
@@ -456,6 +435,8 @@ int match_unit_removed(sd_bus *bus, sd_bus_message *message, void *userdata) {
 
 int match_reloading(sd_bus *bus, sd_bus_message *message, void *userdata) {
         Manager *m = userdata;
 
 int match_reloading(sd_bus *bus, sd_bus_message *message, void *userdata) {
         Manager *m = userdata;
+        Machine *machine;
+        Iterator i;
         int b, r;
 
         assert(bus);
         int b, r;
 
         assert(bus);
@@ -466,16 +447,14 @@ int match_reloading(sd_bus *bus, sd_bus_message *message, void *userdata) {
                 return 0;
         }
 
                 return 0;
         }
 
-        /* systemd finished reloading, let's recheck all our machines */
-        if (!b) {
-                Machine *machine;
-                Iterator i;
+        if (b)
+                return 0;
 
 
-                log_debug("System manager has been reloaded, rechecking machines...");
+        /* systemd finished reloading, let's recheck all our machines */
+        log_debug("System manager has been reloaded, rechecking machines...");
 
 
-                HASHMAP_FOREACH(machine, m->machines, i)
-                        machine_add_to_gc_queue(machine);
-        }
+        HASHMAP_FOREACH(machine, m->machines, i)
+                machine_add_to_gc_queue(machine);
 
         return 0;
 }
 
         return 0;
 }
@@ -507,7 +486,7 @@ int manager_start_scope(
         if (r < 0)
                 return r;
 
         if (r < 0)
                 return r;
 
-        r = sd_bus_message_append(m, "ss", scope, "fail");
+        r = sd_bus_message_append(m, "ss", strempty(scope), "fail");
         if (r < 0)
                 return r;
 
         if (r < 0)
                 return r;
 
@@ -620,23 +599,18 @@ int manager_stop_unit(Manager *manager, const char *unit, sd_bus_error *error, c
 }
 
 int manager_kill_unit(Manager *manager, const char *unit, KillWho who, int signo, sd_bus_error *error) {
 }
 
 int manager_kill_unit(Manager *manager, const char *unit, KillWho who, int signo, sd_bus_error *error) {
-        _cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
-        int r;
-
         assert(manager);
         assert(unit);
 
         assert(manager);
         assert(unit);
 
-        r = sd_bus_call_method(
+        return sd_bus_call_method(
                         manager->bus,
                         "org.freedesktop.systemd1",
                         "/org/freedesktop/systemd1",
                         "org.freedesktop.systemd1.Manager",
                         "KillUnit",
                         error,
                         manager->bus,
                         "org.freedesktop.systemd1",
                         "/org/freedesktop/systemd1",
                         "org.freedesktop.systemd1.Manager",
                         "KillUnit",
                         error,
-                        &reply,
+                        NULL,
                         "ssi", unit, who == KILL_LEADER ? "main" : "all", signo);
                         "ssi", unit, who == KILL_LEADER ? "main" : "all", signo);
-
-        return r;
 }
 
 int manager_unit_is_active(Manager *manager, const char *unit) {
 }
 
 int manager_unit_is_active(Manager *manager, const char *unit) {
@@ -714,3 +688,44 @@ int manager_job_is_active(Manager *manager, const char *path) {
 
         return true;
 }
 
         return true;
 }
+
+int manager_get_machine_by_pid(Manager *m, pid_t pid, Machine **machine) {
+        _cleanup_free_ char *unit = NULL;
+        Machine *mm;
+        int r;
+
+        assert(m);
+        assert(pid >= 1);
+        assert(machine);
+
+        r = cg_pid_get_unit(pid, &unit);
+        if (r < 0)
+                mm = hashmap_get(m->machine_leaders, UINT_TO_PTR(pid));
+        else
+                mm = hashmap_get(m->machine_units, unit);
+
+        if (!mm)
+                return 0;
+
+        *machine = mm;
+        return 1;
+}
+
+int manager_add_machine(Manager *m, const char *name, Machine **_machine) {
+        Machine *machine;
+
+        assert(m);
+        assert(name);
+
+        machine = hashmap_get(m->machines, name);
+        if (!machine) {
+                machine = machine_new(m, name);
+                if (!machine)
+                        return -ENOMEM;
+        }
+
+        if (_machine)
+                *_machine = machine;
+
+        return 0;
+}