8c03ec
From 9ec1193393c48198fd05b795bcce0d607b45d4ee Mon Sep 17 00:00:00 2001
8c03ec
Message-Id: <9ec1193393c48198fd05b795bcce0d607b45d4ee@dist-git>
8c03ec
From: Pavel Hrdina <phrdina@redhat.com>
8c03ec
Date: Fri, 19 Feb 2021 13:33:54 +0100
8c03ec
Subject: [PATCH] virsystemd: introduce virSystemdGetMachineUnitByPID
8c03ec
MIME-Version: 1.0
8c03ec
Content-Type: text/plain; charset=UTF-8
8c03ec
Content-Transfer-Encoding: 8bit
8c03ec
8c03ec
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
8c03ec
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
8c03ec
(cherry picked from commit d3fb774b1ed548c0338b3338a87094dafea32aa2)
8c03ec
8c03ec
Conflicts:
8c03ec
    src/util/virsystemd.c
8c03ec
    tests/virsystemdtest.c
8c03ec
        - missing upstream glib dbus rewrite
8c03ec
8c03ec
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1798463
8c03ec
8c03ec
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
8c03ec
Message-Id: <28be8d962cde455d215fe9ee09fbdcc4145e931f.1613737828.git.phrdina@redhat.com>
8c03ec
Reviewed-by: Ján Tomko <jtomko@redhat.com>
8c03ec
---
8c03ec
 src/libvirt_private.syms |  1 +
8c03ec
 src/util/virsystemd.c    | 48 ++++++++++++++++++++++++++++++++
8c03ec
 src/util/virsystemd.h    |  2 ++
8c03ec
 tests/virsystemdtest.c   | 59 ++++++++++++++++++++++++++++++++++------
8c03ec
 4 files changed, 101 insertions(+), 9 deletions(-)
8c03ec
8c03ec
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
8c03ec
index a869d1f7a4..af6f32fb1e 100644
8c03ec
--- a/src/libvirt_private.syms
8c03ec
+++ b/src/libvirt_private.syms
8c03ec
@@ -3241,6 +3241,7 @@ virSystemdCanSuspend;
8c03ec
 virSystemdCreateMachine;
8c03ec
 virSystemdGetActivation;
8c03ec
 virSystemdGetMachineNameByPID;
8c03ec
+virSystemdGetMachineUnitByPID;
8c03ec
 virSystemdHasLogind;
8c03ec
 virSystemdHasLogindResetCachedValue;
8c03ec
 virSystemdHasMachined;
8c03ec
diff --git a/src/util/virsystemd.c b/src/util/virsystemd.c
8c03ec
index 394eb13f38..0b8e21ae46 100644
8c03ec
--- a/src/util/virsystemd.c
8c03ec
+++ b/src/util/virsystemd.c
8c03ec
@@ -280,6 +280,54 @@ virSystemdGetMachineNameByPID(pid_t pid)
8c03ec
 }
8c03ec
 
8c03ec
 
8c03ec
+/**
8c03ec
+ * virSystemdGetMachineUnitByPID:
8c03ec
+ * @pid: pid of running VM
8c03ec
+ *
8c03ec
+ * Returns systemd Unit name of a running VM registered with machined.
8c03ec
+ * On error returns NULL.
8c03ec
+ */
8c03ec
+char *
8c03ec
+virSystemdGetMachineUnitByPID(pid_t pid)
8c03ec
+{
8c03ec
+    DBusConnection *conn;
8c03ec
+    DBusMessage *reply = NULL;
8c03ec
+    char *unit = NULL, *object = NULL;
8c03ec
+
8c03ec
+    if (virSystemdHasMachined() < 0)
8c03ec
+        goto cleanup;
8c03ec
+
8c03ec
+    if (!(conn = virDBusGetSystemBus()))
8c03ec
+        goto cleanup;
8c03ec
+
8c03ec
+    object = virSystemdGetMachineByPID(conn, pid);
8c03ec
+    if (!object)
8c03ec
+        goto cleanup;
8c03ec
+
8c03ec
+    if (virDBusCallMethod(conn, &reply, NULL,
8c03ec
+                          "org.freedesktop.machine1",
8c03ec
+                          object,
8c03ec
+                          "org.freedesktop.DBus.Properties",
8c03ec
+                          "Get",
8c03ec
+                          "ss",
8c03ec
+                          "org.freedesktop.machine1.Machine",
8c03ec
+                          "Unit") < 0)
8c03ec
+        goto cleanup;
8c03ec
+
8c03ec
+    if (virDBusMessageDecode(reply, "v", "s", &unit) < 0)
8c03ec
+        goto cleanup;
8c03ec
+
8c03ec
+    VIR_DEBUG("Domain with pid %lld has unit name '%s'",
8c03ec
+              (long long) pid, unit);
8c03ec
+
8c03ec
+ cleanup:
8c03ec
+    VIR_FREE(object);
8c03ec
+    virDBusMessageUnref(reply);
8c03ec
+
8c03ec
+    return unit;
8c03ec
+}
8c03ec
+
8c03ec
+
8c03ec
 /**
8c03ec
  * virSystemdCreateMachine:
8c03ec
  * @name: driver unique name of the machine
8c03ec
diff --git a/src/util/virsystemd.h b/src/util/virsystemd.h
8c03ec
index 9ce16b7de1..cd329c49f9 100644
8c03ec
--- a/src/util/virsystemd.h
8c03ec
+++ b/src/util/virsystemd.h
8c03ec
@@ -69,6 +69,8 @@ int virSystemdCanHybridSleep(bool *result);
8c03ec
 
8c03ec
 char *virSystemdGetMachineNameByPID(pid_t pid);
8c03ec
 
8c03ec
+char *virSystemdGetMachineUnitByPID(pid_t pid);
8c03ec
+
8c03ec
 int virSystemdGetActivation(virSystemdActivationMap *map,
8c03ec
                             size_t nmap,
8c03ec
                             virSystemdActivationPtr *act);
8c03ec
diff --git a/tests/virsystemdtest.c b/tests/virsystemdtest.c
8c03ec
index eb510b40e4..475bf8debc 100644
8c03ec
--- a/tests/virsystemdtest.c
8c03ec
+++ b/tests/virsystemdtest.c
8c03ec
@@ -69,19 +69,42 @@ VIR_MOCK_WRAP_RET_ARGS(dbus_connection_send_with_reply_and_block,
8c03ec
                                                     &object_path))
8c03ec
                     goto error;
8c03ec
             } else if (STREQ(member, "Get")) {
8c03ec
-                const char *name = "qemu-demo";
8c03ec
+                const char *name = NULL;
8c03ec
+                char *iface = NULL;
8c03ec
+                char *prop = NULL;
8c03ec
                 DBusMessageIter iter;
8c03ec
                 DBusMessageIter sub;
8c03ec
 
8c03ec
-                dbus_message_iter_init_append(reply, &iter);
8c03ec
-                dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT,
8c03ec
-                                                 "s", &sub);
8c03ec
-
8c03ec
-                if (!dbus_message_iter_append_basic(&sub,
8c03ec
-                                                    DBUS_TYPE_STRING,
8c03ec
-                                                    &name))
8c03ec
+                if (virDBusMessageDecode(message, "ss", &iface, &prop) < 0)
8c03ec
                     goto error;
8c03ec
-                dbus_message_iter_close_container(&iter, &sub);
8c03ec
+
8c03ec
+                VIR_FREE(iface);
8c03ec
+
8c03ec
+                if (STREQ(prop, "Name")) {
8c03ec
+                    name = "qemu-demo";
8c03ec
+                } else if (STREQ(prop, "Unit")) {
8c03ec
+                    name = "machine-qemu-demo.scope";
8c03ec
+                } else {
8c03ec
+                    dbus_set_error_const(error,
8c03ec
+                                         "org.freedesktop.systemd.badthing",
8c03ec
+                                         "Unknown machine property");
8c03ec
+                }
8c03ec
+
8c03ec
+                VIR_FREE(prop);
8c03ec
+
8c03ec
+                if (name) {
8c03ec
+                    dbus_message_iter_init_append(reply, &iter);
8c03ec
+
8c03ec
+                    dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT,
8c03ec
+                                                     "s", &sub);
8c03ec
+
8c03ec
+                    if (!dbus_message_iter_append_basic(&sub,
8c03ec
+                                                        DBUS_TYPE_STRING,
8c03ec
+                                                        &name))
8c03ec
+                        goto error;
8c03ec
+
8c03ec
+                    dbus_message_iter_close_container(&iter, &sub);
8c03ec
+                }
8c03ec
             }
8c03ec
         }
8c03ec
     } else if (STREQ(service, "org.freedesktop.login1")) {
8c03ec
@@ -376,6 +399,23 @@ testGetMachineName(const void *opaque G_GNUC_UNUSED)
8c03ec
 }
8c03ec
 
8c03ec
 
8c03ec
+static int
8c03ec
+testGetMachineUnit(const void *opaque G_GNUC_UNUSED)
8c03ec
+{
8c03ec
+    g_autofree char *tmp = virSystemdGetMachineUnitByPID(1234);
8c03ec
+
8c03ec
+    if (!tmp) {
8c03ec
+        fprintf(stderr, "%s", "Failed to create get machine unit\n");
8c03ec
+        return -1;
8c03ec
+    }
8c03ec
+
8c03ec
+    if (STREQ(tmp, "machine-qemu-demo.scope"))
8c03ec
+        return 0;
8c03ec
+
8c03ec
+    return -1;
8c03ec
+}
8c03ec
+
8c03ec
+
8c03ec
 struct testNameData {
8c03ec
     const char *name;
8c03ec
     const char *expected;
8c03ec
@@ -698,6 +738,7 @@ mymain(void)
8c03ec
     DO_TEST("Test create bad systemd ", testCreateBadSystemd);
8c03ec
     DO_TEST("Test create with network ", testCreateNetwork);
8c03ec
     DO_TEST("Test getting machine name ", testGetMachineName);
8c03ec
+    DO_TEST("Test getting machine unit ", testGetMachineUnit);
8c03ec
 
8c03ec
 # define TEST_SCOPE(_name, unitname, _legacy) \
8c03ec
     do { \
8c03ec
-- 
8c03ec
2.30.0
8c03ec