Signed-off-by: Martin Kletzander <mkletzan(a)redhat.com>
---
src/libvirt_private.syms | 1 +
src/util/virsystemd.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++
src/util/virsystemd.h | 2 ++
tests/virsystemdtest.c | 44 ++++++++++++++++++++++++++++++++++++++++
4 files changed, 100 insertions(+)
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 3d0ec9d786b6..e2d552e0193d 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -2273,6 +2273,7 @@ virSystemdCanHibernate;
virSystemdCanHybridSleep;
virSystemdCanSuspend;
virSystemdCreateMachine;
+virSystemdGetMachineNameByPID;
virSystemdMakeMachineName;
virSystemdMakeScopeName;
virSystemdMakeSliceName;
diff --git a/src/util/virsystemd.c b/src/util/virsystemd.c
index abd883c73844..3349d95a4597 100644
--- a/src/util/virsystemd.c
+++ b/src/util/virsystemd.c
@@ -139,6 +139,59 @@ char *virSystemdMakeMachineName(const char *name,
return machinename;
}
+char *
+virSystemdGetMachineNameByPID(pid_t pid)
+{
+ DBusConnection *conn;
+ DBusMessage *reply;
+ char *name = NULL, *object = NULL;
+
+ if (virDBusIsServiceEnabled("org.freedesktop.machine1") < 0)
+ goto cleanup;
+
+ if (virDBusIsServiceRegistered("org.freedesktop.systemd1") < 0)
+ goto cleanup;
+
+ if (!(conn = virDBusGetSystemBus()))
+ goto cleanup;
+
+ if (virDBusCallMethod(conn, &reply, NULL,
+ "org.freedesktop.machine1",
+ "/org/freedesktop/machine1",
+ "org.freedesktop.machine1.Manager",
+ "GetMachineByPID",
+ "u", pid) < 0)
+ goto cleanup;
+
+ if (virDBusMessageRead(reply, "o", &object) < 0)
+ goto cleanup;
+
+ VIR_DEBUG("Domain with pid %llu has object path '%s'",
+ (unsigned long long)pid, object);
+
+ if (virDBusCallMethod(conn, &reply, NULL,
+ "org.freedesktop.machine1",
+ object,
+ "org.freedesktop.DBus.Properties",
+ "Get",
+ "ss",
+ "org.freedesktop.machine1.Machine",
+ "Name") < 0)
+ goto cleanup;
+
+ if (virDBusMessageRead(reply, "v", "s", &name) < 0)
+ goto cleanup;
+
+ VIR_DEBUG("Domain with pid %llu has machine name '%s'",
+ (unsigned long long)pid, name);
+
+ cleanup:
+ VIR_FREE(object);
+ dbus_message_unref(reply);
+
+ return name;
+}
+
/**
* virSystemdCreateMachine:
* @name: driver unique name of the machine
diff --git a/src/util/virsystemd.h b/src/util/virsystemd.h
index 8af216910188..a13a4c0c48be 100644
--- a/src/util/virsystemd.h
+++ b/src/util/virsystemd.h
@@ -55,4 +55,6 @@ int virSystemdCanHibernate(bool *result);
int virSystemdCanHybridSleep(bool *result);
+char *virSystemdGetMachineNameByPID(pid_t pid);
+
#endif /* __VIR_SYSTEMD_H__ */
diff --git a/tests/virsystemdtest.c b/tests/virsystemdtest.c
index 06fec5495bc2..1746a02b131d 100644
--- a/tests/virsystemdtest.c
+++ b/tests/virsystemdtest.c
@@ -54,6 +54,31 @@ VIR_MOCK_WRAP_RET_ARGS(dbus_connection_send_with_reply_and_block,
"Something went wrong creating the machine");
} else {
reply = dbus_message_new(DBUS_MESSAGE_TYPE_METHOD_RETURN);
+
+ if (STREQ(member, "GetMachineByPID")) {
+ const char *object_path =
"/org/freedesktop/machine1/machine/qemu_2ddemo";
+ DBusMessageIter iter;
+
+ dbus_message_iter_init_append(reply, &iter);
+ if (!dbus_message_iter_append_basic(&iter,
+ DBUS_TYPE_OBJECT_PATH,
+ &object_path))
+ goto error;
+ } else if (STREQ(member, "Get")) {
+ const char *name = "qemu-demo";
+ DBusMessageIter iter;
+ DBusMessageIter sub;
+
+ dbus_message_iter_init_append(reply, &iter);
+ dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT,
+ "s", &sub);
+
+ if (!dbus_message_iter_append_basic(&sub,
+ DBUS_TYPE_STRING,
+ &name))
+ goto error;
+ dbus_message_iter_close_container(&iter, &sub);
+ }
}
} else if (STREQ(service, "org.freedesktop.login1")) {
char *supported = getenv("RESULT_SUPPORT");
@@ -337,6 +362,23 @@ static int testCreateNetwork(const void *opaque ATTRIBUTE_UNUSED)
return 0;
}
+static int testGetMachineName(const void *opaque ATTRIBUTE_UNUSED)
+{
+ char *tmp = virSystemdGetMachineNameByPID(1234);
+ int ret = -1;
+
+ if (!tmp) {
+ fprintf(stderr, "%s", "Failed to create LXC machine\n");
+ return ret;
+ }
+
+ if (STREQ(tmp, "qemu-demo"))
+ ret = 0;
+
+ VIR_FREE(tmp);
+ return ret;
+}
+
struct testNameData {
const char *name;
@@ -491,6 +533,8 @@ mymain(void)
ret = -1;
if (virtTestRun("Test create with network ", testCreateNetwork, NULL) <
0)
ret = -1;
+ if (virtTestRun("Test getting machine name ", testGetMachineName, NULL)
< 0)
+ ret = -1;
# define TEST_SCOPE(name, unitname) \
do { \
--
2.7.0