[libvirt] [dbus PATCH 00/25] Introduce more Domain* APIs

Katerina Koukiou (25): Implement GetControlInfo method for Domain Interface Implement SendKey method for Domain Interface Implement InjectNMI method for Domain Interface Implement BlockPeek metohd for Domain Interface Implement MemoryPeek method for Domain Interface Add AddIOThread method for Domain Interface Implement BlockCommit method for Domain Interface Implement BlockJobAbort method for Domain Interface Implement BlockPull method for Domain Interface Implement BlockRebase method for Domain Interface Implement BlockResize method for Domain Interface Implement CoreDumpWithFormat method for Domain Interface Implement DelIOThread method for Domain Interface Implement FSFreeze method for Domain Interface Implement FSThaw method for Domain Interface Implement FSTrim method for Domain Interface Implement MigrateStartPostCopy method for Domain Interface Implement PinEmulator method for Domain Interface Implement PinIOThread method for Domain Interface Implement Rename method for Domain Interface Implement DomainRestore method for Connect Interface Implement Save method for Domain Interface Implement DomainSaveImageDefineXML method for Connect Interface Implement SendProcessSignal method for Domain Interface Implement UpdateDevice method for Domain Interface data/org.libvirt.Connect.xml | 14 + data/org.libvirt.Domain.xml | 157 ++++++++++ src/connect.c | 52 ++++ src/domain.c | 723 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 946 insertions(+) -- 2.15.0

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 +++++ src/domain.c | 54 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 98e2873..74b0a62 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -76,6 +76,12 @@ <arg name="flags" type="u" direction="in"/> <arg name="BlkioParameters" type="a{sv}" direction="out"/> </method> + <method name="GetControlInfo"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetControlInfo"/> + <arg name="flags" type="u" direction="in"/> + <arg name="jobInfo" type="(sst)" direction="out"/> + </method> <method name="GetJobInfo"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetJobInfo"/> diff --git a/src/domain.c b/src/domain.c index 8a25ae1..5ec7686 100644 --- a/src/domain.c +++ b/src/domain.c @@ -3,6 +3,22 @@ #include <libvirt/libvirt.h> +VIRT_DBUS_ENUM_DECL(virtDBusDomainControlState) +VIRT_DBUS_ENUM_IMPL(virtDBusDomainControlState, + VIR_DOMAIN_CONTROL_LAST, + "ok", + "job", + "occupied", + "error") + +VIRT_DBUS_ENUM_DECL(virtDBusDomainControlErrorReason) +VIRT_DBUS_ENUM_IMPL(virtDBusDomainControlErrorReason, + VIR_DOMAIN_CONTROL_ERROR_REASON_LAST, + "none", + "unknown", + "monitor", + "internal") + VIRT_DBUS_ENUM_DECL(virtDBusDomainJob) VIRT_DBUS_ENUM_IMPL(virtDBusDomainJob, VIR_DOMAIN_JOB_LAST, @@ -472,6 +488,43 @@ virtDBusDomainGetBlkioParameters(GVariant *inArgs, *outArgs = g_variant_new_tuple(&grecords, 1); } +static void +virtDBusDomainGetControlInfo(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + g_autofree virDomainControlInfoPtr controlInfo = NULL; + const gchar *stateStr; + const gchar *errorReasonStr; + guint flags; + + g_variant_get(inArgs, "(u)", &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + controlInfo = g_new0(virDomainControlInfo, 1); + if (virDomainGetControlInfo(domain, controlInfo, flags) == -1) + return virtDBusUtilSetLastVirtError(error); + + stateStr = virtDBusDomainControlStateTypeToString(controlInfo->state); + if (!stateStr) + return; + errorReasonStr = virtDBusDomainControlErrorReasonTypeToString(controlInfo->details); + if (!errorReasonStr) + return; + + *outArgs = g_variant_new("((sst))", stateStr, + errorReasonStr, controlInfo->stateTime); +} + static void virtDBusDomainGetJobInfo(GVariant *inArgs G_GNUC_UNUSED, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -1086,6 +1139,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "Destroy", virtDBusDomainDestroy }, { "DetachDevice", virtDBusDomainDetachDevice }, { "GetBlkioParameters", virtDBusDomainGetBlkioParameters }, + { "GetControlInfo", virtDBusDomainGetControlInfo }, { "GetJobInfo", virtDBusDomainGetJobInfo }, { "GetMemoryParameters", virtDBusDomainGetMemoryParameters }, { "GetSchedulerParameters", virtDBusDomainGetSchedulerParameters }, -- 2.15.0

On Tue, Apr 17, 2018 at 02:04:20PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 +++++ src/domain.c | 54 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+)
diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 98e2873..74b0a62 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -76,6 +76,12 @@ <arg name="flags" type="u" direction="in"/> <arg name="BlkioParameters" type="a{sv}" direction="out"/> </method> + <method name="GetControlInfo"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetControlInfo"/> + <arg name="flags" type="u" direction="in"/> + <arg name="jobInfo" type="(sst)" direction="out"/>
s/jobInfo/controlInfo/
+ </method> <method name="GetJobInfo"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetJobInfo"/> diff --git a/src/domain.c b/src/domain.c index 8a25ae1..5ec7686 100644 --- a/src/domain.c +++ b/src/domain.c @@ -3,6 +3,22 @@
#include <libvirt/libvirt.h>
+VIRT_DBUS_ENUM_DECL(virtDBusDomainControlState) +VIRT_DBUS_ENUM_IMPL(virtDBusDomainControlState, + VIR_DOMAIN_CONTROL_LAST, + "ok", + "job", + "occupied", + "error") + +VIRT_DBUS_ENUM_DECL(virtDBusDomainControlErrorReason) +VIRT_DBUS_ENUM_IMPL(virtDBusDomainControlErrorReason, + VIR_DOMAIN_CONTROL_ERROR_REASON_LAST, + "none", + "unknown", + "monitor", + "internal") +
Any plans to keep these alphabetically sorted?
VIRT_DBUS_ENUM_DECL(virtDBusDomainJob) VIRT_DBUS_ENUM_IMPL(virtDBusDomainJob, VIR_DOMAIN_JOB_LAST, @@ -472,6 +488,43 @@ virtDBusDomainGetBlkioParameters(GVariant *inArgs, *outArgs = g_variant_new_tuple(&grecords, 1); }
+static void +virtDBusDomainGetControlInfo(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + g_autofree virDomainControlInfoPtr controlInfo = NULL; + const gchar *stateStr; + const gchar *errorReasonStr; + guint flags; + + g_variant_get(inArgs, "(u)", &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + controlInfo = g_new0(virDomainControlInfo, 1); + if (virDomainGetControlInfo(domain, controlInfo, flags) == -1)
s/== -1/< 0/
+ return virtDBusUtilSetLastVirtError(error); + + stateStr = virtDBusDomainControlStateTypeToString(controlInfo->state); + if (!stateStr) + return; + errorReasonStr = virtDBusDomainControlErrorReasonTypeToString(controlInfo->details); + if (!errorReasonStr) + return;
Two returns without an error reported. Is that the policy? virtDBusDomainGetJobInfo does report an error when it fails to convert an enum. Jano
+ + *outArgs = g_variant_new("((sst))", stateStr, + errorReasonStr, controlInfo->stateTime); +} + static void virtDBusDomainGetJobInfo(GVariant *inArgs G_GNUC_UNUSED, GUnixFDList *inFDs G_GNUC_UNUSED,

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 8 ++++++++ src/domain.c | 46 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 74b0a62..0b23e75 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -178,6 +178,14 @@ <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainResume"/> </method> + <method name="SendKey"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainSendKey"/> + <arg name="codeset" type="u" direction="in"/> + <arg name="holdtime" type="u" direction="in"/> + <arg name="keycodes" type="au" direction="in"/> + <arg name="flags" type="u" direction="in"/> + </method> <method name="SetMemory"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainSetMemoryFlags"/> diff --git a/src/domain.c b/src/domain.c index 5ec7686..0c8e1ce 100644 --- a/src/domain.c +++ b/src/domain.c @@ -1002,6 +1002,51 @@ virtDBusDomainResume(GVariant *inArgs G_GNUC_UNUSED, virtDBusUtilSetLastVirtError(error); } +static void +virtDBusDomainSendKey(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs G_GNUC_UNUSED, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) + +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + guint codeset; + guint holdtime; + const guint *keycodes; + gsize nkeycodes = 0; + gint ret; + guint flags; + GVariant *v; + + v = g_variant_get_child_value(inArgs, 0); + codeset = g_variant_get_uint32(v); + g_variant_unref(v); + + v = g_variant_get_child_value(inArgs, 1); + holdtime = g_variant_get_uint32(v); + g_variant_unref(v); + + v = g_variant_get_child_value(inArgs, 2); + keycodes = g_variant_get_fixed_array(v, &nkeycodes, sizeof(guint)); + g_variant_unref(v); + + v = g_variant_get_child_value(inArgs, 3); + flags = g_variant_get_uint32(v); + g_variant_unref(v); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + ret = virDomainSendKey(domain, codeset, holdtime, (guint *)keycodes, nkeycodes, flags); + if (ret < 0) + virtDBusUtilSetLastVirtError(error); +} + static void virtDBusDomainSetMemory(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -1157,6 +1202,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "Reboot", virtDBusDomainReboot }, { "Reset", virtDBusDomainReset }, { "Resume", virtDBusDomainResume }, + { "SendKey", virtDBusDomainSendKey }, { "SetVcpus", virtDBusDomainSetVcpus }, { "SetMemory", virtDBusDomainSetMemory }, { "Shutdown", virtDBusDomainShutdown }, -- 2.15.0

On Tue, Apr 17, 2018 at 02:04:21PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 8 ++++++++ src/domain.c | 46 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+)
diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 74b0a62..0b23e75 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -178,6 +178,14 @@ <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainResume"/> </method> + <method name="SendKey"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainSendKey"/> + <arg name="codeset" type="u" direction="in"/> + <arg name="holdtime" type="u" direction="in"/> + <arg name="keycodes" type="au" direction="in"/> + <arg name="flags" type="u" direction="in"/> + </method> <method name="SetMemory"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainSetMemoryFlags"/> diff --git a/src/domain.c b/src/domain.c index 5ec7686..0c8e1ce 100644 --- a/src/domain.c +++ b/src/domain.c @@ -1002,6 +1002,51 @@ virtDBusDomainResume(GVariant *inArgs G_GNUC_UNUSED, virtDBusUtilSetLastVirtError(error); }
+static void +virtDBusDomainSendKey(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs G_GNUC_UNUSED, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) + +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + guint codeset; + guint holdtime; + const guint *keycodes; + gsize nkeycodes = 0; + gint ret; + guint flags; + GVariant *v; + + v = g_variant_get_child_value(inArgs, 0); + codeset = g_variant_get_uint32(v);
Double space ^^
+ g_variant_unref(v); + + v = g_variant_get_child_value(inArgs, 1); + holdtime = g_variant_get_uint32(v);
Here too ^^
+ g_variant_unref(v); +
With that fixed: Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

On Tue, Apr 17, 2018 at 02:04:21PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 8 ++++++++ src/domain.c | 46 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+)
diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 74b0a62..0b23e75 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -178,6 +178,14 @@ <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainResume"/> </method> + <method name="SendKey"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainSendKey"/> + <arg name="codeset" type="u" direction="in"/> + <arg name="holdtime" type="u" direction="in"/> + <arg name="keycodes" type="au" direction="in"/> + <arg name="flags" type="u" direction="in"/> + </method> <method name="SetMemory"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainSetMemoryFlags"/> diff --git a/src/domain.c b/src/domain.c index 5ec7686..0c8e1ce 100644 --- a/src/domain.c +++ b/src/domain.c @@ -1002,6 +1002,51 @@ virtDBusDomainResume(GVariant *inArgs G_GNUC_UNUSED, virtDBusUtilSetLastVirtError(error); }
+static void +virtDBusDomainSendKey(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs G_GNUC_UNUSED, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) + +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + guint codeset; + guint holdtime; + const guint *keycodes; + gsize nkeycodes = 0; + gint ret; + guint flags; + GVariant *v; + + v = g_variant_get_child_value(inArgs, 0); + codeset = g_variant_get_uint32(v); + g_variant_unref(v); + + v = g_variant_get_child_value(inArgs, 1); + holdtime = g_variant_get_uint32(v); + g_variant_unref(v); + + v = g_variant_get_child_value(inArgs, 2); + keycodes = g_variant_get_fixed_array(v, &nkeycodes, sizeof(guint)); + g_variant_unref(v); + + v = g_variant_get_child_value(inArgs, 3); + flags = g_variant_get_uint32(v); + g_variant_unref(v);
This can be simplified into: + g_variant_get(inArgs, "(uu@auu)", &codeset, &holdtime, &v, &flags); + + keycodes = g_variant_get_fixed_array(v, &nkeycodes, sizeof(guint)); + g_variant_unref(v);
+ + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + ret = virDomainSendKey(domain, codeset, holdtime, (guint *)keycodes, nkeycodes, flags);
Long line, it should not be longer than 80 chars. Reviewed-by: Pavel Hrdina <phrdina@redhat.com>

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 5 +++++ src/domain.c | 24 ++++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 0b23e75..48b8a95 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -124,6 +124,11 @@ <arg name="flags" type="u" direction="in"/> <arg name="managedSaveImage" type="b" direction="out"/> </method> + <method name="InjectNMI"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainInjectNMI"/> + <arg name="flags" type="u" direction="in"/> + </method> <method name="ManagedSave"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainManagedSave"/> diff --git a/src/domain.c b/src/domain.c index 0c8e1ce..9197755 100644 --- a/src/domain.c +++ b/src/domain.c @@ -752,6 +752,29 @@ virtDBusDomainHasManagedSaveImage(GVariant *inArgs, *outArgs = g_variant_new("(b)", managedSaveImage); } +static void +virtDBusDomainInjectNMI(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs G_GNUC_UNUSED, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + guint flags; + + g_variant_get(inArgs, "(u)", &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + if (virDomainInjectNMI(domain, flags) < 0) + virtDBusUtilSetLastVirtError(error); +} + static void virtDBusDomainManagedSave(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -1192,6 +1215,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "GetVcpus", virtDBusDomainGetVcpus }, { "GetXMLDesc", virtDBusDomainGetXMLDesc }, { "HasManagedSaveImage", virtDBusDomainHasManagedSaveImage }, + { "InjectNMI", virtDBusDomainInjectNMI }, { "ManagedSave", virtDBusDomainManagedSave }, { "ManagedSaveRemove", virtDBusDomainManagedSaveRemove }, { "MemoryStats", virtDBusDomainMemoryStats }, -- 2.15.0

On Tue, Apr 17, 2018 at 02:04:22PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 5 +++++ src/domain.c | 24 ++++++++++++++++++++++++ 2 files changed, 29 insertions(+)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 9 +++++++++ src/domain.c | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 48b8a95..85e2cf6 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -54,6 +54,15 @@ <arg name="xml" type="s" direction="in"/> <arg name="flags" type="u" direction="in"/> </method> + <method name="BlockPeek"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainCreateWithFlags"/> + <arg name="disk" type="s" direction="in"/> + <arg name="offset" type="t" direction="in"/> + <arg name="size" type="u" direction="in"/> + <arg name="flags" type="u" direction="in"/> + <arg name="buffer" type="ay" direction="out"/> + </method> <method name="Create"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainCreateWithFlags"/> diff --git a/src/domain.c b/src/domain.c index 9197755..c02e289 100644 --- a/src/domain.c +++ b/src/domain.c @@ -383,6 +383,44 @@ virtDBusDomainAttachDevice(GVariant *inArgs, virtDBusUtilSetLastVirtError(error); } +static void +virtDBusDomainBlockPeek(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + const gchar *disk; + gulong offset; + guint size; + guint flags; + g_autofree guchar *buffer = NULL; + GVariantBuilder *builder; + GVariant *res; + + g_variant_get(inArgs, "(&stuu)", &disk, &offset, &size, &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + buffer = g_new0(guchar, size); + if (virDomainBlockPeek(domain, disk, offset, size, buffer, flags) < 0) + virtDBusUtilSetLastVirtError(error); + + builder = g_variant_builder_new(G_VARIANT_TYPE("ay")); + for (unsigned int i = 0; i < size; i++) + g_variant_builder_add(builder, "y", buffer[i]); + + res = g_variant_builder_end(builder); + + *outArgs = g_variant_new_tuple(&res, 1); +} + static void virtDBusDomainCreate(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -1203,6 +1241,7 @@ static virtDBusGDBusPropertyTable virtDBusDomainPropertyTable[] = { static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "AbortJob", virtDBusDomainAbortJob }, { "AttachDevice", virtDBusDomainAttachDevice }, + { "BlockPeek", virtDBusDomainBlockPeek }, { "Create", virtDBusDomainCreate }, { "Destroy", virtDBusDomainDestroy }, { "DetachDevice", virtDBusDomainDetachDevice }, -- 2.15.0

On Tue, Apr 17, 2018 at 02:04:23PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 9 +++++++++ src/domain.c | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+)
diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 48b8a95..85e2cf6 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -54,6 +54,15 @@ <arg name="xml" type="s" direction="in"/> <arg name="flags" type="u" direction="in"/> </method> + <method name="BlockPeek"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainCreateWithFlags"/>
https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainBlockPeek
+ <arg name="disk" type="s" direction="in"/> + <arg name="offset" type="t" direction="in"/> + <arg name="size" type="u" direction="in"/>
Even though size_t is (usually) 64 bits, unsigned should be enough given the documented RPC limits.
+ <arg name="flags" type="u" direction="in"/> + <arg name="buffer" type="ay" direction="out"/> + </method> <method name="Create"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainCreateWithFlags"/>
With the doc link fixed: Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

s/metohd/method/ in the commit summary On Tue, Apr 17, 2018 at 04:08:49PM +0200, Ján Tomko wrote:
On Tue, Apr 17, 2018 at 02:04:23PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 9 +++++++++ src/domain.c | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+)
Jano

On Tue, Apr 17, 2018 at 02:04:23PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 9 +++++++++ src/domain.c | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+)
diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 48b8a95..85e2cf6 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -54,6 +54,15 @@ <arg name="xml" type="s" direction="in"/> <arg name="flags" type="u" direction="in"/> </method> + <method name="BlockPeek"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainCreateWithFlags"/> + <arg name="disk" type="s" direction="in"/> + <arg name="offset" type="t" direction="in"/> + <arg name="size" type="u" direction="in"/>
I agree with Jano that this should be "t" type and therefore gsize in the code.
+ <arg name="flags" type="u" direction="in"/> + <arg name="buffer" type="ay" direction="out"/> + </method> <method name="Create"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainCreateWithFlags"/> diff --git a/src/domain.c b/src/domain.c index 9197755..c02e289 100644 --- a/src/domain.c +++ b/src/domain.c @@ -383,6 +383,44 @@ virtDBusDomainAttachDevice(GVariant *inArgs, virtDBusUtilSetLastVirtError(error); }
+static void +virtDBusDomainBlockPeek(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + const gchar *disk; + gulong offset; + guint size; + guint flags; + g_autofree guchar *buffer = NULL; + GVariantBuilder *builder; + GVariant *res; + + g_variant_get(inArgs, "(&stuu)", &disk, &offset, &size, &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + buffer = g_new0(guchar, size); + if (virDomainBlockPeek(domain, disk, offset, size, buffer, flags) < 0) + virtDBusUtilSetLastVirtError(error);
We need to return from the function if error is set. Reviewed-by: Pavel Hrdina <phrdina@redhat.com>

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 8 ++++++++ src/domain.c | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 85e2cf6..bd30ad4 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -148,6 +148,14 @@ value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainManagedSaveRemove"/> <arg name="flags" type="u" direction="in"/> </method> + <method name="MemoryPeek"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainMemoryPeek"/> + <arg name="offset" type="t" direction="in"/> + <arg name="size" type="u" direction="in"/> + <arg name="flags" type="u" direction="in"/> + <arg name="buffer" type="ay" direction="out"/> + </method> <method name="MemoryStats"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainMemoryStats"/> diff --git a/src/domain.c b/src/domain.c index c02e289..01f120d 100644 --- a/src/domain.c +++ b/src/domain.c @@ -859,6 +859,43 @@ virtDBusDomainManagedSaveRemove(GVariant *inArgs, virtDBusUtilSetLastVirtError(error); } +static void +virtDBusDomainMemoryPeek(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + gulong offset; + guint size; + guint flags; + g_autofree guchar *buffer = NULL; + GVariantBuilder *builder; + GVariant *res; + + g_variant_get(inArgs, "(tuu)", &offset, &size, &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + buffer = g_new0(guchar, size); + if (virDomainMemoryPeek(domain, offset, size, buffer, flags) < 0) + virtDBusUtilSetLastVirtError(error); + + builder = g_variant_builder_new(G_VARIANT_TYPE("ay")); + for (unsigned int i = 0; i < size; i++) + g_variant_builder_add(builder, "y", buffer[i]); + + res = g_variant_builder_end(builder); + + *outArgs = g_variant_new_tuple(&res, 1); +} + static void virtDBusDomainMemoryStats(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -1257,6 +1294,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "InjectNMI", virtDBusDomainInjectNMI }, { "ManagedSave", virtDBusDomainManagedSave }, { "ManagedSaveRemove", virtDBusDomainManagedSaveRemove }, + { "MemoryPeek", virtDBusDomainMemoryPeek }, { "MemoryStats", virtDBusDomainMemoryStats }, { "MigrateGetMaxDowntime", virtDBusDomainMigrateGetMaxDowntime }, { "MigrateGetMaxSpeed", virtDBusDomainMigrateGetMaxSpeed }, -- 2.15.0

On Tue, Apr 17, 2018 at 02:04:24PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 8 ++++++++ src/domain.c | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

On Tue, Apr 17, 2018 at 02:04:24PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 8 ++++++++ src/domain.c | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+)
diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 85e2cf6..bd30ad4 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -148,6 +148,14 @@ value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainManagedSaveRemove"/> <arg name="flags" type="u" direction="in"/> </method> + <method name="MemoryPeek"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainMemoryPeek"/> + <arg name="offset" type="t" direction="in"/> + <arg name="size" type="u" direction="in"/>
Same as for the previous one, "t" type and gsize in the code.
+ <arg name="flags" type="u" direction="in"/> + <arg name="buffer" type="ay" direction="out"/> + </method> <method name="MemoryStats"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainMemoryStats"/> diff --git a/src/domain.c b/src/domain.c index c02e289..01f120d 100644 --- a/src/domain.c +++ b/src/domain.c @@ -859,6 +859,43 @@ virtDBusDomainManagedSaveRemove(GVariant *inArgs, virtDBusUtilSetLastVirtError(error); }
+static void +virtDBusDomainMemoryPeek(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + gulong offset; + guint size; + guint flags; + g_autofree guchar *buffer = NULL; + GVariantBuilder *builder; + GVariant *res; + + g_variant_get(inArgs, "(tuu)", &offset, &size, &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + buffer = g_new0(guchar, size); + if (virDomainMemoryPeek(domain, offset, size, buffer, flags) < 0) + virtDBusUtilSetLastVirtError(error);
Missing return in case of error. Reviewed-by: Pavel Hrdina <phrdina@redhat.com>

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 ++++++ src/domain.c | 25 +++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index bd30ad4..10ce15a 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -48,6 +48,12 @@ <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainAbortJob"/> </method> + <method name="AddIOThread"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainAddIOThread"/> + <arg name="iothreadId" type="u" direction="in"/> + <arg name="flags" type="u" direction="in"/> + </method> <method name="AttachDevice"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainAttachDeviceFlags"/> diff --git a/src/domain.c b/src/domain.c index 01f120d..1edad05 100644 --- a/src/domain.c +++ b/src/domain.c @@ -359,6 +359,30 @@ virtDBusDomainAbortJob(GVariant *inArgs G_GNUC_UNUSED, virtDBusUtilSetLastVirtError(error); } +static void +virtDBusDomainAddIOThread(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs G_GNUC_UNUSED, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + guint iothreadId; + guint flags; + + g_variant_get(inArgs, "(uu)", &iothreadId, &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + if (virDomainAddIOThread(domain, iothreadId, flags) < 0) + virtDBusUtilSetLastVirtError(error); +} + static void virtDBusDomainAttachDevice(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -1277,6 +1301,7 @@ static virtDBusGDBusPropertyTable virtDBusDomainPropertyTable[] = { static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "AbortJob", virtDBusDomainAbortJob }, + { "AddIOThread", virtDBusDomainAddIOThread }, { "AttachDevice", virtDBusDomainAttachDevice }, { "BlockPeek", virtDBusDomainBlockPeek }, { "Create", virtDBusDomainCreate }, -- 2.15.0

On Tue, Apr 17, 2018 at 02:04:25PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 ++++++ src/domain.c | 25 +++++++++++++++++++++++++ 2 files changed, 31 insertions(+)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 9 +++++++++ src/domain.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 10ce15a..3d8e7b1 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -60,6 +60,15 @@ <arg name="xml" type="s" direction="in"/> <arg name="flags" type="u" direction="in"/> </method> + <method name="BlockCommit"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainBlockCommit"/> + <arg name="disk" type="s" direction="in"/> + <arg name="base" type="s" direction="in"/> + <arg name="top" type="s" direction="in"/> + <arg name="bandwidth" type="t" direction="in"/> + <arg name="flags" type="u" direction="in"/> + </method> <method name="BlockPeek"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainCreateWithFlags"/> diff --git a/src/domain.c b/src/domain.c index 1edad05..f482bb9 100644 --- a/src/domain.c +++ b/src/domain.c @@ -407,6 +407,33 @@ virtDBusDomainAttachDevice(GVariant *inArgs, virtDBusUtilSetLastVirtError(error); } +static void +virtDBusDomainBlockCommit(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs G_GNUC_UNUSED, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + const gchar *disk; + const gchar *base; + const gchar *top; + gulong bandwidth; + guint flags; + + g_variant_get(inArgs, "(&s&s&stu)", &disk, &base, &top, &bandwidth, &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + if (virDomainBlockCommit(domain, disk, base, top, bandwidth, flags) < 0) + virtDBusUtilSetLastVirtError(error); +} + static void virtDBusDomainBlockPeek(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -1303,6 +1330,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "AbortJob", virtDBusDomainAbortJob }, { "AddIOThread", virtDBusDomainAddIOThread }, { "AttachDevice", virtDBusDomainAttachDevice }, + { "BlockCommit", virtDBusDomainBlockCommit }, { "BlockPeek", virtDBusDomainBlockPeek }, { "Create", virtDBusDomainCreate }, { "Destroy", virtDBusDomainDestroy }, -- 2.15.0

On Tue, Apr 17, 2018 at 02:04:26PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 9 +++++++++ src/domain.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 ++++++ src/domain.c | 25 +++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 3d8e7b1..480499c 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -69,6 +69,12 @@ <arg name="bandwidth" type="t" direction="in"/> <arg name="flags" type="u" direction="in"/> </method> + <method name="BlockJobAbort"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainBlockJobAbort"/> + <arg name="disk" type="s" direction="in"/> + <arg name="flags" type="u" direction="in"/> + </method> <method name="BlockPeek"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainCreateWithFlags"/> diff --git a/src/domain.c b/src/domain.c index f482bb9..fee4a2c 100644 --- a/src/domain.c +++ b/src/domain.c @@ -434,6 +434,30 @@ virtDBusDomainBlockCommit(GVariant *inArgs, virtDBusUtilSetLastVirtError(error); } +static void +virtDBusDomainBlockJobAbort(GVariant *inArgs G_GNUC_UNUSED, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs G_GNUC_UNUSED, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + const gchar *disk; + guint flags; + + g_variant_get(inArgs, "(&su)", &disk, &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + if (virDomainBlockJobAbort(domain, disk, flags) < 0) + virtDBusUtilSetLastVirtError(error); +} + static void virtDBusDomainBlockPeek(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -1331,6 +1355,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "AddIOThread", virtDBusDomainAddIOThread }, { "AttachDevice", virtDBusDomainAttachDevice }, { "BlockCommit", virtDBusDomainBlockCommit }, + { "BlockJobAbort", virtDBusDomainBlockJobAbort }, { "BlockPeek", virtDBusDomainBlockPeek }, { "Create", virtDBusDomainCreate }, { "Destroy", virtDBusDomainDestroy }, -- 2.15.0

On Tue, Apr 17, 2018 at 02:04:27PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 ++++++ src/domain.c | 25 +++++++++++++++++++++++++ 2 files changed, 31 insertions(+)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

On Tue, Apr 17, 2018 at 02:04:27PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 ++++++ src/domain.c | 25 +++++++++++++++++++++++++ 2 files changed, 31 insertions(+)
diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 3d8e7b1..480499c 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -69,6 +69,12 @@ <arg name="bandwidth" type="t" direction="in"/> <arg name="flags" type="u" direction="in"/> </method> + <method name="BlockJobAbort"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainBlockJobAbort"/> + <arg name="disk" type="s" direction="in"/> + <arg name="flags" type="u" direction="in"/> + </method> <method name="BlockPeek"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainCreateWithFlags"/> diff --git a/src/domain.c b/src/domain.c index f482bb9..fee4a2c 100644 --- a/src/domain.c +++ b/src/domain.c @@ -434,6 +434,30 @@ virtDBusDomainBlockCommit(GVariant *inArgs, virtDBusUtilSetLastVirtError(error); }
+static void +virtDBusDomainBlockJobAbort(GVariant *inArgs G_GNUC_UNUSED,
inArgs is used so remove G_GNUC_UNUSED. Reviewed-by: Pavel Hrdina <phrdina@redhat.com>

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 7 +++++++ src/domain.c | 26 ++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 480499c..46a6632 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -84,6 +84,13 @@ <arg name="flags" type="u" direction="in"/> <arg name="buffer" type="ay" direction="out"/> </method> + <method name="BlockPull"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainBlockPull"/> + <arg name="disk" type="s" direction="in"/> + <arg name="bandwidth" type="t" direction="in"/> + <arg name="flags" type="u" direction="in"/> + </method> <method name="Create"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainCreateWithFlags"/> diff --git a/src/domain.c b/src/domain.c index fee4a2c..af8cc73 100644 --- a/src/domain.c +++ b/src/domain.c @@ -496,6 +496,31 @@ virtDBusDomainBlockPeek(GVariant *inArgs, *outArgs = g_variant_new_tuple(&res, 1); } +static void +virtDBusDomainBlockPull(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs G_GNUC_UNUSED, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + const gchar *disk; + gulong bandwidth; + guint flags; + + g_variant_get(inArgs, "(&stu)", &disk, &bandwidth, &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + if (virDomainBlockPull(domain, disk, bandwidth, flags) < 0) + virtDBusUtilSetLastVirtError(error); +} + static void virtDBusDomainCreate(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -1357,6 +1382,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "BlockCommit", virtDBusDomainBlockCommit }, { "BlockJobAbort", virtDBusDomainBlockJobAbort }, { "BlockPeek", virtDBusDomainBlockPeek }, + { "BlockPull", virtDBusDomainBlockPull }, { "Create", virtDBusDomainCreate }, { "Destroy", virtDBusDomainDestroy }, { "DetachDevice", virtDBusDomainDetachDevice }, -- 2.15.0

On Tue, Apr 17, 2018 at 02:04:28PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 7 +++++++ src/domain.c | 26 ++++++++++++++++++++++++++ 2 files changed, 33 insertions(+)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 8 ++++++++ src/domain.c | 29 +++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 46a6632..f5c7fb0 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -91,6 +91,14 @@ <arg name="bandwidth" type="t" direction="in"/> <arg name="flags" type="u" direction="in"/> </method> + <method name="BlockRebase"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainBlockRebase"/> + <arg name="disk" type="s" direction="in"/> + <arg name="base" type="s" direction="in"/> + <arg name="bandwidth" type="t" direction="in"/> + <arg name="flags" type="u" direction="in"/> + </method> <method name="Create"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainCreateWithFlags"/> diff --git a/src/domain.c b/src/domain.c index af8cc73..107355e 100644 --- a/src/domain.c +++ b/src/domain.c @@ -521,6 +521,34 @@ virtDBusDomainBlockPull(GVariant *inArgs, virtDBusUtilSetLastVirtError(error); } +static void +virtDBusDomainBlockRebase(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs G_GNUC_UNUSED, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + const gchar *disk; + const gchar *base; + gulong bandwidth; + guint flags; + + g_variant_get(inArgs, "(&s&stu)", &disk, &base, &bandwidth, &flags); + if (g_strcmp0(base, "") == 0) + base = NULL; + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + if (virDomainBlockRebase(domain, disk, base, bandwidth, flags) < 0) + virtDBusUtilSetLastVirtError(error); +} + static void virtDBusDomainCreate(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -1383,6 +1411,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "BlockJobAbort", virtDBusDomainBlockJobAbort }, { "BlockPeek", virtDBusDomainBlockPeek }, { "BlockPull", virtDBusDomainBlockPull }, + { "BlockRebase", virtDBusDomainBlockRebase }, { "Create", virtDBusDomainCreate }, { "Destroy", virtDBusDomainDestroy }, { "DetachDevice", virtDBusDomainDetachDevice }, -- 2.15.0

On Tue, Apr 17, 2018 at 02:04:29PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 8 ++++++++ src/domain.c | 29 +++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+)
diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 46a6632..f5c7fb0 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -91,6 +91,14 @@ <arg name="bandwidth" type="t" direction="in"/> <arg name="flags" type="u" direction="in"/> </method> + <method name="BlockRebase"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainBlockRebase"/> + <arg name="disk" type="s" direction="in"/> + <arg name="base" type="s" direction="in"/> + <arg name="bandwidth" type="t" direction="in"/> + <arg name="flags" type="u" direction="in"/> + </method> <method name="Create"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainCreateWithFlags"/> diff --git a/src/domain.c b/src/domain.c index af8cc73..107355e 100644 --- a/src/domain.c +++ b/src/domain.c @@ -521,6 +521,34 @@ virtDBusDomainBlockPull(GVariant *inArgs, virtDBusUtilSetLastVirtError(error); }
+static void +virtDBusDomainBlockRebase(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs G_GNUC_UNUSED, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + const gchar *disk; + const gchar *base; + gulong bandwidth; + guint flags; + + g_variant_get(inArgs, "(&s&stu)", &disk, &base, &bandwidth, &flags); + if (g_strcmp0(base, "") == 0)
You can use g_str_equal(). Reviewed-by: Pavel Hrdina <phrdina@redhat.com>

On Tue, Apr 17, 2018 at 07:26:15PM +0200, Pavel Hrdina wrote:
On Tue, Apr 17, 2018 at 02:04:29PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 8 ++++++++ src/domain.c | 29 +++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+)
diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 46a6632..f5c7fb0 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -91,6 +91,14 @@ <arg name="bandwidth" type="t" direction="in"/> <arg name="flags" type="u" direction="in"/> </method> + <method name="BlockRebase"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainBlockRebase"/>
One more thing, we should document that empty string is same as NULL, for example: "Empty string can be used to pass a NULL as @base argument." Pavel

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 7 +++++++ src/domain.c | 26 ++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index f5c7fb0..c7fb637 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -99,6 +99,13 @@ <arg name="bandwidth" type="t" direction="in"/> <arg name="flags" type="u" direction="in"/> </method> + <method name="BlockResize"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainBlockResize"/> + <arg name="disk" type="s" direction="in"/> + <arg name="size" type="t" direction="in"/> + <arg name="flags" type="u" direction="in"/> + </method> <method name="Create"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainCreateWithFlags"/> diff --git a/src/domain.c b/src/domain.c index 107355e..191d9e8 100644 --- a/src/domain.c +++ b/src/domain.c @@ -549,6 +549,31 @@ virtDBusDomainBlockRebase(GVariant *inArgs, virtDBusUtilSetLastVirtError(error); } +static void +virtDBusDomainBlockResize(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs G_GNUC_UNUSED, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + const gchar *disk; + gulong size; + guint flags; + + g_variant_get(inArgs, "(&stu)", &disk, &size, &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + if (virDomainBlockResize(domain, disk, size, flags) < 0) + virtDBusUtilSetLastVirtError(error); +} + static void virtDBusDomainCreate(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -1412,6 +1437,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "BlockPeek", virtDBusDomainBlockPeek }, { "BlockPull", virtDBusDomainBlockPull }, { "BlockRebase", virtDBusDomainBlockRebase }, + { "BlockResize", virtDBusDomainBlockResize }, { "Create", virtDBusDomainCreate }, { "Destroy", virtDBusDomainDestroy }, { "DetachDevice", virtDBusDomainDetachDevice }, -- 2.15.0

On Tue, Apr 17, 2018 at 02:04:30PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 7 +++++++ src/domain.c | 26 ++++++++++++++++++++++++++ 2 files changed, 33 insertions(+)
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 7 +++++++ src/domain.c | 26 ++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index c7fb637..05f4da9 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -106,6 +106,13 @@ <arg name="size" type="t" direction="in"/> <arg name="flags" type="u" direction="in"/> </method> + <method name="CoreDumpWithFormat"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainCoreDumpWithFormat"/> + <arg name="to" type="s" direction="in"/> + <arg name="dumpformat" type="u" direction="in"/> + <arg name="flags" type="u" direction="in"/> + </method> <method name="Create"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainCreateWithFlags"/> diff --git a/src/domain.c b/src/domain.c index 191d9e8..7c87133 100644 --- a/src/domain.c +++ b/src/domain.c @@ -574,6 +574,31 @@ virtDBusDomainBlockResize(GVariant *inArgs, virtDBusUtilSetLastVirtError(error); } +static void +virtDBusDomainCoreDumpWithFormat(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs G_GNUC_UNUSED, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + const gchar *to; + guint dumpformat; + guint flags; + + g_variant_get(inArgs, "(&suu)", &to, &dumpformat, &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + if (virDomainCoreDumpWithFormat(domain, to, dumpformat, flags) < 0) + virtDBusUtilSetLastVirtError(error); +} + static void virtDBusDomainCreate(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -1438,6 +1463,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "BlockPull", virtDBusDomainBlockPull }, { "BlockRebase", virtDBusDomainBlockRebase }, { "BlockResize", virtDBusDomainBlockResize }, + { "CoreDumpWithFormat", virtDBusDomainCoreDumpWithFormat }, { "Create", virtDBusDomainCreate }, { "Destroy", virtDBusDomainDestroy }, { "DetachDevice", virtDBusDomainDetachDevice }, -- 2.15.0

On Tue, Apr 17, 2018 at 02:04:31PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 7 +++++++ src/domain.c | 26 ++++++++++++++++++++++++++ 2 files changed, 33 insertions(+)
diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index c7fb637..05f4da9 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -106,6 +106,13 @@ <arg name="size" type="t" direction="in"/> <arg name="flags" type="u" direction="in"/> </method> + <method name="CoreDumpWithFormat"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainCoreDumpWithFormat"/> + <arg name="to" type="s" direction="in"/> + <arg name="dumpformat" type="u" direction="in"/> + <arg name="flags" type="u" direction="in"/> + </method>
Analogically to the *Flags APIs, this D-Bus method can be called just "CoreDump" since there is no legacy method with that name. Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 ++++++ src/domain.c | 25 +++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 05f4da9..fb2bcce 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -118,6 +118,12 @@ value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainCreateWithFlags"/> <arg name="flags" type="u" direction="in"/> </method> + <method name="DelIOThread"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainDelIOThread"/> + <arg name="iothreadId" type="u" direction="in"/> + <arg name="flags" type="u" direction="in"/> + </method> <method name="Destroy"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainDestroyFlags"/> diff --git a/src/domain.c b/src/domain.c index 7c87133..2fd8343 100644 --- a/src/domain.c +++ b/src/domain.c @@ -622,6 +622,30 @@ virtDBusDomainCreate(GVariant *inArgs, virtDBusUtilSetLastVirtError(error); } +static void +virtDBusDomainDelIOThread(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs G_GNUC_UNUSED, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + guint iothreadId; + guint flags; + + g_variant_get(inArgs, "(uu)", &iothreadId, &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + if (virDomainDelIOThread(domain, iothreadId, flags) < 0) + virtDBusUtilSetLastVirtError(error); +} + static void virtDBusDomainDestroy(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -1465,6 +1489,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "BlockResize", virtDBusDomainBlockResize }, { "CoreDumpWithFormat", virtDBusDomainCoreDumpWithFormat }, { "Create", virtDBusDomainCreate }, + { "DelIOThread", virtDBusDomainDelIOThread }, { "Destroy", virtDBusDomainDestroy }, { "DetachDevice", virtDBusDomainDetachDevice }, { "GetBlkioParameters", virtDBusDomainGetBlkioParameters }, -- 2.15.0

On Tue, Apr 17, 2018 at 02:04:32PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 ++++++ src/domain.c | 25 +++++++++++++++++++++++++ 2 files changed, 31 insertions(+)
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 7 +++++++ src/domain.c | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index fb2bcce..66cf5e2 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -135,6 +135,13 @@ <arg name="xml" type="s" direction="in"/> <arg name="flags" type="u" direction="in"/> </method> + <method name="FSFreeze"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainFSFreeze"/> + <arg name="mountpoints" type="as" direction="in"/> + <arg name="flags" type="u" direction="in"/> + <arg name="frozenFilesystems" type="u" direction="out"/> + </method> <method name="GetBlkioParameters"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetBlkioParameters"/> diff --git a/src/domain.c b/src/domain.c index 2fd8343..04115d1 100644 --- a/src/domain.c +++ b/src/domain.c @@ -693,6 +693,45 @@ virtDBusDomainDetachDevice(GVariant *inArgs, virtDBusUtilSetLastVirtError(error); } +static void +virtDBusDomainFSFreeze(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + g_autofree const gchar **mountpoints = NULL; + GVariantIter *iter; + gsize nmountpoints = 0; + guint flags; + gint ret; + + g_variant_get(inArgs, "(asu)", &iter, &flags); + + nmountpoints = g_variant_iter_n_children(iter); + if (nmountpoints) { + mountpoints = g_new0(const gchar*, nmountpoints + 1); + while (g_variant_iter_loop(iter, "s", &mountpoints[nmountpoints-1])) + nmountpoints++; + nmountpoints--; + g_variant_iter_free(iter); + } + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + ret = virDomainFSFreeze(domain, (const gchar **)mountpoints, nmountpoints, flags); + if (ret < 0) + virtDBusUtilSetLastVirtError(error); + + *outArgs = g_variant_new("(u)", ret); +} + static void virtDBusDomainGetBlkioParameters(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -1492,6 +1531,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "DelIOThread", virtDBusDomainDelIOThread }, { "Destroy", virtDBusDomainDestroy }, { "DetachDevice", virtDBusDomainDetachDevice }, + { "FSFreeze", virtDBusDomainFSFreeze }, { "GetBlkioParameters", virtDBusDomainGetBlkioParameters }, { "GetControlInfo", virtDBusDomainGetControlInfo }, { "GetJobInfo", virtDBusDomainGetJobInfo }, -- 2.15.0

On Tue, Apr 17, 2018 at 02:04:33PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 7 +++++++ src/domain.c | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+)
diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index fb2bcce..66cf5e2 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -135,6 +135,13 @@ <arg name="xml" type="s" direction="in"/> <arg name="flags" type="u" direction="in"/> </method> + <method name="FSFreeze"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainFSFreeze"/> + <arg name="mountpoints" type="as" direction="in"/> + <arg name="flags" type="u" direction="in"/> + <arg name="frozenFilesystems" type="u" direction="out"/> + </method> <method name="GetBlkioParameters"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetBlkioParameters"/> diff --git a/src/domain.c b/src/domain.c index 2fd8343..04115d1 100644 --- a/src/domain.c +++ b/src/domain.c @@ -693,6 +693,45 @@ virtDBusDomainDetachDevice(GVariant *inArgs, virtDBusUtilSetLastVirtError(error); }
+static void +virtDBusDomainFSFreeze(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + g_autofree const gchar **mountpoints = NULL; + GVariantIter *iter; + gsize nmountpoints = 0; + guint flags; + gint ret; + + g_variant_get(inArgs, "(asu)", &iter, &flags); + + nmountpoints = g_variant_iter_n_children(iter); + if (nmountpoints) { + mountpoints = g_new0(const gchar*, nmountpoints + 1); + while (g_variant_iter_loop(iter, "s", &mountpoints[nmountpoints-1])) + nmountpoints++; + nmountpoints--; + g_variant_iter_free(iter); + }
This code will not work for nmountpoints >= 2. At the first line you get a number of mountpoints, let's say it's 2 ("/root", "/home"). Then you allocate nmountpoints + 1 array of strings, the array should have only nmountpoints elements. The while loop is the place where it actually fails: 1 cycle: g_variant_iter_loop(iter, "s", &mountpoints[3-1]) - this will not fail because mountpoints[2] is still allocated 2 cycle: g_variant_iter_loop(iter, "s", &mountpoints[4-1]) - there the program crashes because mountpoints[3] is not allocated Another issue here is that using "s" as signature makes a copy of the string and it needs to be freed, in this case "&s" would be better. One possible way how the code can look like: const gchar **tmp; nmountpoints = g_variant_iter_n_children(iter); if (nmountpoints > 0) { mountpoints = g_new0(const gchar*, nmountpoints); tmp = mountpoints; while (g_variant_iter_loop(iter, "&s", tmp)) tmp++; g_variant_iter_free(iter); }
+ + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + ret = virDomainFSFreeze(domain, (const gchar **)mountpoints, nmountpoints, flags);
There is no need to typecast mountpoints and the line is too long.
+ if (ret < 0) + virtDBusUtilSetLastVirtError(error);
Missing return. Pavel

On Wed, 2018-04-18 at 09:42 +0200, Pavel Hrdina wrote:
On Tue, Apr 17, 2018 at 02:04:33PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 7 +++++++ src/domain.c | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+)
diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index fb2bcce..66cf5e2 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -135,6 +135,13 @@ <arg name="xml" type="s" direction="in"/> <arg name="flags" type="u" direction="in"/> </method> + <method name="FSFreeze"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain .html#virDomainFSFreeze"/>; + <arg name="mountpoints" type="as" direction="in"/> + <arg name="flags" type="u" direction="in"/> + <arg name="frozenFilesystems" type="u" direction="out"/> + </method> <method name="GetBlkioParameters"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain .html#virDomainGetBlkioParameters"/>; diff --git a/src/domain.c b/src/domain.c index 2fd8343..04115d1 100644 --- a/src/domain.c +++ b/src/domain.c @@ -693,6 +693,45 @@ virtDBusDomainDetachDevice(GVariant *inArgs, virtDBusUtilSetLastVirtError(error); }
+static void +virtDBusDomainFSFreeze(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + g_autofree const gchar **mountpoints = NULL; + GVariantIter *iter; + gsize nmountpoints = 0; + guint flags; + gint ret; + + g_variant_get(inArgs, "(asu)", &iter, &flags); + + nmountpoints = g_variant_iter_n_children(iter); + if (nmountpoints) { + mountpoints = g_new0(const gchar*, nmountpoints + 1); + while (g_variant_iter_loop(iter, "s", &mountpoints[nmountpoints-1])) + nmountpoints++; + nmountpoints--; + g_variant_iter_free(iter); + }
This code will not work for nmountpoints >= 2.
At the first line you get a number of mountpoints, let's say it's 2 ("/root", "/home").
Then you allocate nmountpoints + 1 array of strings, the array should have only nmountpoints elements.
The while loop is the place where it actually fails:
1 cycle: g_variant_iter_loop(iter, "s", &mountpoints[3-1])
- this will not fail because mountpoints[2] is still allocated
2 cycle: g_variant_iter_loop(iter, "s", &mountpoints[4-1])
- there the program crashes because mountpoints[3] is not allocated
Another issue here is that using "s" as signature makes a copy of the string and it needs to be freed, in this case "&s" would be better.
One possible way how the code can look like:
const gchar **tmp;
nmountpoints = g_variant_iter_n_children(iter); if (nmountpoints > 0) { mountpoints = g_new0(const gchar*, nmountpoints); tmp = mountpoints; while (g_variant_iter_loop(iter, "&s", tmp)) tmp++; g_variant_iter_free(iter); }
I 'll need slight modification here: I 'll have to allocate nmountpoints + 1 because else I am getting the following Error after the last iteration. free(): invalid next size (fast) Thanks, Katerina
+ + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + ret = virDomainFSFreeze(domain, (const gchar **)mountpoints, nmountpoints, flags);
There is no need to typecast mountpoints and the line is too long.
+ if (ret < 0) + virtDBusUtilSetLastVirtError(error);
Missing return.
Pavel

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 7 +++++++ src/domain.c | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 66cf5e2..367bc00 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -142,6 +142,13 @@ <arg name="flags" type="u" direction="in"/> <arg name="frozenFilesystems" type="u" direction="out"/> </method> + <method name="FSThaw"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainFSThaw"/> + <arg name="mountpoints" type="as" direction="in"/> + <arg name="flags" type="u" direction="in"/> + <arg name="thawdFilesystems" type="u" direction="out"/> + </method> <method name="GetBlkioParameters"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetBlkioParameters"/> diff --git a/src/domain.c b/src/domain.c index 04115d1..a0feea9 100644 --- a/src/domain.c +++ b/src/domain.c @@ -732,6 +732,45 @@ virtDBusDomainFSFreeze(GVariant *inArgs, *outArgs = g_variant_new("(u)", ret); } +static void +virtDBusDomainFSThaw(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + g_autofree const gchar **mountpoints = NULL; + GVariantIter *iter; + guint nmountpoints; + guint flags; + gint ret; + + g_variant_get(inArgs, "(asu)", &iter, &flags); + + nmountpoints = g_variant_iter_n_children(iter); + if (nmountpoints) { + mountpoints = g_new0(const gchar*, nmountpoints + 1); + while (g_variant_iter_loop(iter, "s", &mountpoints[nmountpoints-1])) + nmountpoints++; + nmountpoints--; + g_variant_iter_free(iter); + } + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + ret = virDomainFSThaw(domain, (const gchar **)mountpoints, nmountpoints, flags); + if (ret < 0) + virtDBusUtilSetLastVirtError(error); + + *outArgs = g_variant_new("(u)", ret); +} + static void virtDBusDomainGetBlkioParameters(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -1532,6 +1571,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "Destroy", virtDBusDomainDestroy }, { "DetachDevice", virtDBusDomainDetachDevice }, { "FSFreeze", virtDBusDomainFSFreeze }, + { "FSThaw", virtDBusDomainFSThaw }, { "GetBlkioParameters", virtDBusDomainGetBlkioParameters }, { "GetControlInfo", virtDBusDomainGetControlInfo }, { "GetJobInfo", virtDBusDomainGetJobInfo }, -- 2.15.0

On Tue, Apr 17, 2018 at 02:04:34PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 7 +++++++ src/domain.c | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+)
Same issues as the previous patch. Pavel

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 7 +++++++ src/domain.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 367bc00..6d4ffa5 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -149,6 +149,13 @@ <arg name="flags" type="u" direction="in"/> <arg name="thawdFilesystems" type="u" direction="out"/> </method> + <method name="FSTrim"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainFSTrim"/> + <arg name="mountpoint" type="s" direction="in"/> + <arg name="minimum" type="t" direction="in"/> + <arg name="flags" type="u" direction="in"/> + </method> <method name="GetBlkioParameters"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetBlkioParameters"/> diff --git a/src/domain.c b/src/domain.c index a0feea9..f0e7f28 100644 --- a/src/domain.c +++ b/src/domain.c @@ -771,6 +771,33 @@ virtDBusDomainFSThaw(GVariant *inArgs, *outArgs = g_variant_new("(u)", ret); } +static void +virtDBusDomainFSTrim(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs G_GNUC_UNUSED, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + const gchar *mountpoint; + gulong minimum; + guint flags; + + g_variant_get(inArgs, "(stu)", &mountpoint, &minimum, &flags); + if (g_strcmp0(mountpoint, "") == 0) + mountpoint = NULL; + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + if (virDomainFSTrim(domain, mountpoint, minimum, flags) < 0) + virtDBusUtilSetLastVirtError(error); +} + static void virtDBusDomainGetBlkioParameters(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -1572,6 +1599,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "DetachDevice", virtDBusDomainDetachDevice }, { "FSFreeze", virtDBusDomainFSFreeze }, { "FSThaw", virtDBusDomainFSThaw }, + { "FSTrim", virtDBusDomainFSTrim }, { "GetBlkioParameters", virtDBusDomainGetBlkioParameters }, { "GetControlInfo", virtDBusDomainGetControlInfo }, { "GetJobInfo", virtDBusDomainGetJobInfo }, -- 2.15.0

On Tue, Apr 17, 2018 at 02:04:35PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 7 +++++++ src/domain.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+)
diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 367bc00..6d4ffa5 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -149,6 +149,13 @@ <arg name="flags" type="u" direction="in"/> <arg name="thawdFilesystems" type="u" direction="out"/> </method> + <method name="FSTrim"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainFSTrim"/> + <arg name="mountpoint" type="s" direction="in"/> + <arg name="minimum" type="t" direction="in"/> + <arg name="flags" type="u" direction="in"/> + </method> <method name="GetBlkioParameters"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetBlkioParameters"/> diff --git a/src/domain.c b/src/domain.c index a0feea9..f0e7f28 100644 --- a/src/domain.c +++ b/src/domain.c @@ -771,6 +771,33 @@ virtDBusDomainFSThaw(GVariant *inArgs, *outArgs = g_variant_new("(u)", ret); }
+static void +virtDBusDomainFSTrim(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs G_GNUC_UNUSED, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + const gchar *mountpoint; + gulong minimum; + guint flags; + + g_variant_get(inArgs, "(stu)", &mountpoint, &minimum, &flags); + if (g_strcmp0(mountpoint, "") == 0)
You can use g_str_equal() here, at this point mountpoint will be always allocated. Reviewed-by: Pavel Hrdina <phrdina@redhat.com>

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 5 +++++ src/domain.c | 25 +++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 6d4ffa5..f2ef3dd 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -263,6 +263,11 @@ <arg name="bandwidth" type="t" direction="in"/> <arg name="flags" type="u" direction="in"/> </method> + <method name="MigrateStartPostCopy"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainMigrateStartPostCopy"/> + <arg name="flags" type="u" direction="in"/> + </method> <method name="Reboot"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainReboot"/> diff --git a/src/domain.c b/src/domain.c index f0e7f28..f50043d 100644 --- a/src/domain.c +++ b/src/domain.c @@ -1339,6 +1339,30 @@ virtDBusDomainMigrateSetMaxSpeed(GVariant *inArgs, virtDBusUtilSetLastVirtError(error); } +static void +virtDBusDomainMigrateStartPostCopy(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs G_GNUC_UNUSED, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) + +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + guint flags; + + g_variant_get(inArgs, "(u)", &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + if (virDomainMigrateStartPostCopy(domain, flags) < 0) + virtDBusUtilSetLastVirtError(error); +} + static void virtDBusDomainReboot(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -1618,6 +1642,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "MigrateGetMaxSpeed", virtDBusDomainMigrateGetMaxSpeed }, { "MigrateSetMaxDowntime", virtDBusDomainMigrateSetMaxDowntime }, { "MigrateSetMaxSpeed", virtDBusDomainMigrateSetMaxSpeed }, + { "MigrateStartPostCopy", virtDBusDomainMigrateStartPostCopy }, { "Reboot", virtDBusDomainReboot }, { "Reset", virtDBusDomainReset }, { "Resume", virtDBusDomainResume }, -- 2.15.0

On Tue, Apr 17, 2018 at 02:04:36PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 5 +++++ src/domain.c | 25 +++++++++++++++++++++++++ 2 files changed, 30 insertions(+)
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 ++++++ src/domain.c | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index f2ef3dd..97c5471 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -268,6 +268,12 @@ value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainMigrateStartPostCopy"/> <arg name="flags" type="u" direction="in"/> </method> + <method name="PinEmulator"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainPinEmulator"/> + <arg name="cpumap" type="ay" direction="in"/> + <arg name="flags" type="u" direction="in"/> + </method> <method name="Reboot"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainReboot"/> diff --git a/src/domain.c b/src/domain.c index f50043d..92799ac 100644 --- a/src/domain.c +++ b/src/domain.c @@ -1363,6 +1363,39 @@ virtDBusDomainMigrateStartPostCopy(GVariant *inArgs, virtDBusUtilSetLastVirtError(error); } +static void +virtDBusDomainPinEmulator(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs G_GNUC_UNUSED, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) + +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + g_autofree const guchar *cpumap = NULL; + gsize maplen; + guint flags; + GVariant *v; + + v = g_variant_get_child_value(inArgs, 0); + cpumap = g_variant_get_fixed_array(v, &maplen, sizeof(guchar)); + g_variant_unref(v); + + v = g_variant_get_child_value(inArgs, 1); + flags = g_variant_get_uint32(v); + g_variant_unref(v); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + if (virDomainPinEmulator(domain, (guchar *)cpumap, maplen, flags) < 0) + virtDBusUtilSetLastVirtError(error); +} + static void virtDBusDomainReboot(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -1643,6 +1676,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "MigrateSetMaxDowntime", virtDBusDomainMigrateSetMaxDowntime }, { "MigrateSetMaxSpeed", virtDBusDomainMigrateSetMaxSpeed }, { "MigrateStartPostCopy", virtDBusDomainMigrateStartPostCopy }, + { "PinEmulator", virtDBusDomainPinEmulator }, { "Reboot", virtDBusDomainReboot }, { "Reset", virtDBusDomainReset }, { "Resume", virtDBusDomainResume }, -- 2.15.0

On Tue, Apr 17, 2018 at 02:04:37PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 ++++++ src/domain.c | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+)
diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index f2ef3dd..97c5471 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -268,6 +268,12 @@ value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainMigrateStartPostCopy"/> <arg name="flags" type="u" direction="in"/> </method> + <method name="PinEmulator"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainPinEmulator"/> + <arg name="cpumap" type="ay" direction="in"/>
We need to figure out a better way how to represent the CPU map in libvirt-dbus. IMHO using an array of unsigned char is not the best from for D-Bus. There are two possible forms, using the string representation as we have in virsh, so for example "0,3-7,^5" which is 10011011. The second form is the one that libvirt-python uses, a tuple of boolean values, which in case of D-Bus would be represented as array of boolean values. The first form is better suited for humans so I guess we should go with the second form in D-Bus. Pavel

On Wed, Apr 18, 2018 at 03:03:20PM +0200, Pavel Hrdina wrote:
On Tue, Apr 17, 2018 at 02:04:37PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 ++++++ src/domain.c | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+)
diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index f2ef3dd..97c5471 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -268,6 +268,12 @@ value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainMigrateStartPostCopy"/> <arg name="flags" type="u" direction="in"/> </method> + <method name="PinEmulator"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainPinEmulator"/> + <arg name="cpumap" type="ay" direction="in"/>
We need to figure out a better way how to represent the CPU map in libvirt-dbus. IMHO using an array of unsigned char is not the best from for D-Bus.
There are two possible forms, using the string representation as we have in virsh, so for example "0,3-7,^5" which is 10011011.
The second form is the one that libvirt-python uses, a tuple of boolean values, which in case of D-Bus would be represented as array of boolean values.
array of boolean is better than array of char in that it is explicitly typed. It is inefficient though - each boolean value takes up 32-bit on the wire !
The first form is better suited for humans so I guess we should go with the second form in D-Bus.
Ultimately you should think about how a dbus client will consume the data. If you use array of boolean, that all the DBus clients will map that into native boolean types which are easy to acess for apps. If you use the string syntax, then every application has to write parsing & formatting code for this syntax. Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|

On Wed, Apr 18, 2018 at 02:41:19PM +0100, Daniel P. Berrangé wrote:
On Wed, Apr 18, 2018 at 03:03:20PM +0200, Pavel Hrdina wrote:
On Tue, Apr 17, 2018 at 02:04:37PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 ++++++ src/domain.c | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+)
diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index f2ef3dd..97c5471 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -268,6 +268,12 @@ value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainMigrateStartPostCopy"/> <arg name="flags" type="u" direction="in"/> </method> + <method name="PinEmulator"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainPinEmulator"/> + <arg name="cpumap" type="ay" direction="in"/>
We need to figure out a better way how to represent the CPU map in libvirt-dbus. IMHO using an array of unsigned char is not the best from for D-Bus.
There are two possible forms, using the string representation as we have in virsh, so for example "0,3-7,^5" which is 10011011.
The second form is the one that libvirt-python uses, a tuple of boolean values, which in case of D-Bus would be represented as array of boolean values.
array of boolean is better than array of char in that it is explicitly typed. It is inefficient though - each boolean value takes up 32-bit on the wire !
The first form is better suited for humans so I guess we should go with the second form in D-Bus.
Ultimately you should think about how a dbus client will consume the data. If you use array of boolean, that all the DBus clients will map that into native boolean types which are easy to acess for apps.
If you use the string syntax, then every application has to write parsing & formatting code for this syntax.
I completely agree, that's why I suggested using an array of boolean. Thanks, Pavel

On Wed, Apr 18, 2018 at 03:44:51PM +0200, Pavel Hrdina wrote:
On Wed, Apr 18, 2018 at 02:41:19PM +0100, Daniel P. Berrangé wrote:
On Wed, Apr 18, 2018 at 03:03:20PM +0200, Pavel Hrdina wrote:
On Tue, Apr 17, 2018 at 02:04:37PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 ++++++ src/domain.c | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+)
diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index f2ef3dd..97c5471 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -268,6 +268,12 @@ value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainMigrateStartPostCopy"/> <arg name="flags" type="u" direction="in"/> </method> + <method name="PinEmulator"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainPinEmulator"/> + <arg name="cpumap" type="ay" direction="in"/>
We need to figure out a better way how to represent the CPU map in libvirt-dbus. IMHO using an array of unsigned char is not the best from for D-Bus.
There are two possible forms, using the string representation as we have in virsh, so for example "0,3-7,^5" which is 10011011.
The second form is the one that libvirt-python uses, a tuple of boolean values, which in case of D-Bus would be represented as array of boolean values.
array of boolean is better than array of char in that it is explicitly typed. It is inefficient though - each boolean value takes up 32-bit on the wire !
The first form is better suited for humans so I guess we should go with the second form in D-Bus.
Ultimately you should think about how a dbus client will consume the data. If you use array of boolean, that all the DBus clients will map that into native boolean types which are easy to acess for apps.
If you use the string syntax, then every application has to write parsing & formatting code for this syntax.
I completely agree, that's why I suggested using an array of boolean.
Yeah, my gut feeling is that array of boolean is best despite the wire inefficience. Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 7 +++++++ src/domain.c | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 97c5471..9490654 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -274,6 +274,13 @@ <arg name="cpumap" type="ay" direction="in"/> <arg name="flags" type="u" direction="in"/> </method> + <method name="PinIOThread"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainPinIOThread"/> + <arg name="iothreadId" type="u" direction="in"/> + <arg name="cpumap" type="ay" direction="in"/> + <arg name="flags" type="u" direction="in"/> + </method> <method name="Reboot"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainReboot"/> diff --git a/src/domain.c b/src/domain.c index 92799ac..60dab7e 100644 --- a/src/domain.c +++ b/src/domain.c @@ -1396,6 +1396,44 @@ virtDBusDomainPinEmulator(GVariant *inArgs, virtDBusUtilSetLastVirtError(error); } +static void +virtDBusDomainPinIOThread(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs G_GNUC_UNUSED, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) + +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + guint iothreadId; + g_autofree const guchar *cpumap = NULL; + gsize maplen; + guint flags; + GVariant *v; + + v = g_variant_get_child_value(inArgs, 0); + iothreadId = g_variant_get_uint32(v); + g_variant_unref(v); + + v = g_variant_get_child_value(inArgs, 1); + cpumap = g_variant_get_fixed_array(v, &maplen, sizeof(guchar)); + g_variant_unref(v); + + v = g_variant_get_child_value(inArgs, 2); + flags = g_variant_get_uint32(v); + g_variant_unref(v); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + if (virDomainPinIOThread(domain, iothreadId, (guchar *)cpumap, maplen, flags) < 0) + virtDBusUtilSetLastVirtError(error); +} + static void virtDBusDomainReboot(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -1677,6 +1715,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "MigrateSetMaxSpeed", virtDBusDomainMigrateSetMaxSpeed }, { "MigrateStartPostCopy", virtDBusDomainMigrateStartPostCopy }, { "PinEmulator", virtDBusDomainPinEmulator }, + { "PinIOThread", virtDBusDomainPinIOThread }, { "Reboot", virtDBusDomainReboot }, { "Reset", virtDBusDomainReset }, { "Resume", virtDBusDomainResume }, -- 2.15.0

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 ++++++ src/domain.c | 26 ++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 9490654..f68cc39 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -286,6 +286,12 @@ value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainReboot"/> <arg name="flags" type="u" direction="in"/> </method> + <method name="Rename"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainRename"/> + <arg name="name" type="s" direction="in"/> + <arg name="flags" type="u" direction="in"/> + </method> <method name="Reset"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainReset"/> diff --git a/src/domain.c b/src/domain.c index 60dab7e..2a27667 100644 --- a/src/domain.c +++ b/src/domain.c @@ -1458,6 +1458,31 @@ virtDBusDomainReboot(GVariant *inArgs, virtDBusUtilSetLastVirtError(error); } +static void +virtDBusDomainRename(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs G_GNUC_UNUSED, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) + +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + const gchar *name; + guint flags; + + g_variant_get(inArgs, "(&su)", &name, &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + if (virDomainRename(domain, name, flags) < 0) + virtDBusUtilSetLastVirtError(error); +} + static void virtDBusDomainReset(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -1717,6 +1742,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "PinEmulator", virtDBusDomainPinEmulator }, { "PinIOThread", virtDBusDomainPinIOThread }, { "Reboot", virtDBusDomainReboot }, + { "Rename", virtDBusDomainRename }, { "Reset", virtDBusDomainReset }, { "Resume", virtDBusDomainResume }, { "SendKey", virtDBusDomainSendKey }, -- 2.15.0

On Tue, Apr 17, 2018 at 02:04:39PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 ++++++ src/domain.c | 26 ++++++++++++++++++++++++++ 2 files changed, 32 insertions(+)
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Connect.xml | 7 +++++++ src/connect.c | 27 +++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/data/org.libvirt.Connect.xml b/data/org.libvirt.Connect.xml index 55260cc..04ac2de 100644 --- a/data/org.libvirt.Connect.xml +++ b/data/org.libvirt.Connect.xml @@ -56,6 +56,13 @@ <arg name="uuid" type="s" direction="in"/> <arg name="domain" type="o" direction="out"/> </method> + <method name="DomainRestore"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainRestoreFlags"/> + <arg name="from" type="s" direction="in"/> + <arg name="xml" type="s" direction="in"/> + <arg name="flags" type="u" direction="in"/> + </method> <method name="GetCapabilities"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-host.html#virConnectGetCapabilities"/> diff --git a/src/connect.c b/src/connect.c index a8ff43c..97e4d9c 100644 --- a/src/connect.c +++ b/src/connect.c @@ -347,6 +347,32 @@ virtDBusConnectDomainLookupByUUID(GVariant *inArgs, *outArgs = g_variant_new("(o)", path); } +static void +virtDBusConnectDomainRestoreFlags(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath G_GNUC_UNUSED, + gpointer userData, + GVariant **outArgs G_GNUC_UNUSED, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + const gchar *from; + const gchar *xml; + guint flags; + + g_variant_get(inArgs, "(&s&su)", &from, &xml, &flags); + if (g_strcmp0(xml, "") == 0) + xml = NULL; + + if (!virtDBusConnectOpen(connect, error)) + return; + + if (virDomainRestoreFlags(connect->connection, from, xml, flags) < 0) + virtDBusUtilSetLastVirtError(error); +} + static void virtDBusConnectGetSysinfo(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -580,6 +606,7 @@ static virtDBusGDBusMethodTable virtDBusConnectMethodTable[] = { { "DomainLookupByID", virtDBusConnectDomainLookupByID }, { "DomainLookupByName", virtDBusConnectDomainLookupByName }, { "DomainLookupByUUID", virtDBusConnectDomainLookupByUUID }, + { "DomainRestore", virtDBusConnectDomainRestoreFlags }, { "GetCapabilities", virtDBusConnectGetCapabilities }, { "GetSysinfo", virtDBusConnectGetSysinfo }, { "ListDomains", virtDBusConnectListDomains }, -- 2.15.0

On Tue, Apr 17, 2018 at 02:04:40PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Connect.xml | 7 +++++++ src/connect.c | 27 +++++++++++++++++++++++++++ 2 files changed, 34 insertions(+)
diff --git a/data/org.libvirt.Connect.xml b/data/org.libvirt.Connect.xml index 55260cc..04ac2de 100644 --- a/data/org.libvirt.Connect.xml +++ b/data/org.libvirt.Connect.xml @@ -56,6 +56,13 @@ <arg name="uuid" type="s" direction="in"/> <arg name="domain" type="o" direction="out"/> </method> + <method name="DomainRestore"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainRestoreFlags"/> + <arg name="from" type="s" direction="in"/> + <arg name="xml" type="s" direction="in"/> + <arg name="flags" type="u" direction="in"/> + </method> <method name="GetCapabilities"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-host.html#virConnectGetCapabilities"/> diff --git a/src/connect.c b/src/connect.c index a8ff43c..97e4d9c 100644 --- a/src/connect.c +++ b/src/connect.c @@ -347,6 +347,32 @@ virtDBusConnectDomainLookupByUUID(GVariant *inArgs, *outArgs = g_variant_new("(o)", path); }
+static void +virtDBusConnectDomainRestoreFlags(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath G_GNUC_UNUSED, + gpointer userData, + GVariant **outArgs G_GNUC_UNUSED, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + const gchar *from; + const gchar *xml; + guint flags; + + g_variant_get(inArgs, "(&s&su)", &from, &xml, &flags); + if (g_strcmp0(xml, "") == 0)
You can use g_str_equal(). Reviewed-by: Pavel Hrdina <phrdina@redhat.com>

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 7 +++++++ src/domain.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index f68cc39..bc8a6eb 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -301,6 +301,13 @@ <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainResume"/> </method> + <method name="Save"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainSave"/> + <arg name="to" type="s" direction="in"/> + <arg name="xml" type="s" direction="in"/> + <arg name="flags" type="u" direction="in"/> + </method> <method name="SendKey"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainSendKey"/> diff --git a/src/domain.c b/src/domain.c index 2a27667..c30e9b5 100644 --- a/src/domain.c +++ b/src/domain.c @@ -1527,6 +1527,33 @@ virtDBusDomainResume(GVariant *inArgs G_GNUC_UNUSED, virtDBusUtilSetLastVirtError(error); } +static void +virtDBusDomainSave(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs G_GNUC_UNUSED, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + const gchar *to; + const gchar *xml; + guint flags; + + g_variant_get(inArgs, "(&s&su)", &to, &xml, &flags); + if (g_strcmp0(xml, "") == 0) + xml = NULL; + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + if (virDomainSaveFlags(domain, to, xml, flags) < 0) + virtDBusUtilSetLastVirtError(error); +} + static void virtDBusDomainSendKey(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -1745,6 +1772,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "Rename", virtDBusDomainRename }, { "Reset", virtDBusDomainReset }, { "Resume", virtDBusDomainResume }, + { "Save", virtDBusDomainSave }, { "SendKey", virtDBusDomainSendKey }, { "SetVcpus", virtDBusDomainSetVcpus }, { "SetMemory", virtDBusDomainSetMemory }, -- 2.15.0

On Tue, Apr 17, 2018 at 02:04:41PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 7 +++++++ src/domain.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+)
diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index f68cc39..bc8a6eb 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -301,6 +301,13 @@ <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainResume"/> </method> + <method name="Save"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainSave"/>
It should point to virDomainSaveFlags.
+ <arg name="to" type="s" direction="in"/> + <arg name="xml" type="s" direction="in"/> + <arg name="flags" type="u" direction="in"/> + </method> <method name="SendKey"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainSendKey"/> diff --git a/src/domain.c b/src/domain.c index 2a27667..c30e9b5 100644 --- a/src/domain.c +++ b/src/domain.c @@ -1527,6 +1527,33 @@ virtDBusDomainResume(GVariant *inArgs G_GNUC_UNUSED, virtDBusUtilSetLastVirtError(error); }
+static void +virtDBusDomainSave(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs G_GNUC_UNUSED, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + const gchar *to; + const gchar *xml; + guint flags; + + g_variant_get(inArgs, "(&s&su)", &to, &xml, &flags); + if (g_strcmp0(xml, "") == 0)
g_str_equal() Reviewed-by: Pavel Hrdina <phrdina@redhat.com>

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Connect.xml | 7 +++++++ src/connect.c | 25 +++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/data/org.libvirt.Connect.xml b/data/org.libvirt.Connect.xml index 04ac2de..d2c77c1 100644 --- a/data/org.libvirt.Connect.xml +++ b/data/org.libvirt.Connect.xml @@ -63,6 +63,13 @@ <arg name="xml" type="s" direction="in"/> <arg name="flags" type="u" direction="in"/> </method> + <method name="DomainSaveImageDefineXML"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainSaveImageDefineXML"/> + <arg name="file" type="s" direction="in"/> + <arg name="xml" type="s" direction="in"/> + <arg name="flags" type="u" direction="in"/> + </method> <method name="GetCapabilities"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-host.html#virConnectGetCapabilities"/> diff --git a/src/connect.c b/src/connect.c index 97e4d9c..af3d460 100644 --- a/src/connect.c +++ b/src/connect.c @@ -373,6 +373,30 @@ virtDBusConnectDomainRestoreFlags(GVariant *inArgs, virtDBusUtilSetLastVirtError(error); } +static void +virtDBusConnectDomainSaveImageDefineXML(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath G_GNUC_UNUSED, + gpointer userData, + GVariant **outArgs G_GNUC_UNUSED, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + const gchar *file; + const gchar *xml; + guint flags; + + g_variant_get(inArgs, "(&s&su)", &file, &xml, &flags); + + if (!virtDBusConnectOpen(connect, error)) + return; + + if (virDomainSaveImageDefineXML(connect->connection, file, xml, flags) < 0) + virtDBusUtilSetLastVirtError(error); +} + static void virtDBusConnectGetSysinfo(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -607,6 +631,7 @@ static virtDBusGDBusMethodTable virtDBusConnectMethodTable[] = { { "DomainLookupByName", virtDBusConnectDomainLookupByName }, { "DomainLookupByUUID", virtDBusConnectDomainLookupByUUID }, { "DomainRestore", virtDBusConnectDomainRestoreFlags }, + { "DomainSaveImageDefineXML", virtDBusConnectDomainSaveImageDefineXML }, { "GetCapabilities", virtDBusConnectGetCapabilities }, { "GetSysinfo", virtDBusConnectGetSysinfo }, { "ListDomains", virtDBusConnectListDomains }, -- 2.15.0

On Tue, Apr 17, 2018 at 02:04:42PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Connect.xml | 7 +++++++ src/connect.c | 25 +++++++++++++++++++++++++ 2 files changed, 32 insertions(+)
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 7 +++++++ src/domain.c | 27 +++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index bc8a6eb..5c08756 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -316,6 +316,13 @@ <arg name="keycodes" type="au" direction="in"/> <arg name="flags" type="u" direction="in"/> </method> + <method name="SendProcessSignal"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainSendProcessSignal"/> + <arg name="pidValue" type="x" direction="in"/> + <arg name="sigNum" type="u" direction="in"/> + <arg name="flags" type="u" direction="in"/> + </method> <method name="SetMemory"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainSetMemoryFlags"/> diff --git a/src/domain.c b/src/domain.c index c30e9b5..1cca5df 100644 --- a/src/domain.c +++ b/src/domain.c @@ -1599,6 +1599,32 @@ virtDBusDomainSendKey(GVariant *inArgs, virtDBusUtilSetLastVirtError(error); } +static void +virtDBusDomainSendProcessSignal(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs G_GNUC_UNUSED, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) + +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + gint64 pidValue; + guint sigNum; + guint flags; + + g_variant_get(inArgs, "(xuu)", &pidValue, &sigNum, &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + if (virDomainSendProcessSignal(domain, pidValue, sigNum, flags) < 0) + virtDBusUtilSetLastVirtError(error); +} + static void virtDBusDomainSetMemory(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -1774,6 +1800,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "Resume", virtDBusDomainResume }, { "Save", virtDBusDomainSave }, { "SendKey", virtDBusDomainSendKey }, + { "SendProcessSignal", virtDBusDomainSendProcessSignal }, { "SetVcpus", virtDBusDomainSetVcpus }, { "SetMemory", virtDBusDomainSetMemory }, { "Shutdown", virtDBusDomainShutdown }, -- 2.15.0

On Tue, Apr 17, 2018 at 02:04:43PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 7 +++++++ src/domain.c | 27 +++++++++++++++++++++++++++ 2 files changed, 34 insertions(+)
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 ++++++ src/domain.c | 25 +++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 5c08756..60d01d4 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -349,6 +349,12 @@ value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainUndefineFlags"/> <arg name="flags" type="u" direction="in"/> </method> + <method name="UpdateDevice"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainUpdateDeviceFlags"/> + <arg name="xml" type="s" direction="in"/> + <arg name="flags" type="u" direction="in"/> + </method> <signal name="DeviceAdded"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virConnectDomainEventDeviceAddedCallback"/> diff --git a/src/domain.c b/src/domain.c index 1cca5df..b1343aa 100644 --- a/src/domain.c +++ b/src/domain.c @@ -1741,6 +1741,30 @@ virtDBusDomainUndefine(GVariant *inArgs, virtDBusUtilSetLastVirtError(error); } +static void +virtDBusDomainUpdateDevice(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs G_GNUC_UNUSED, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + const gchar *xml; + guint flags; + + g_variant_get(inArgs, "(&su)", &xml, &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + if (virDomainUpdateDeviceFlags(domain, xml, flags) < 0) + virtDBusUtilSetLastVirtError(error); +} + static virtDBusGDBusPropertyTable virtDBusDomainPropertyTable[] = { { "Active", virtDBusDomainGetActive, NULL }, { "Autostart", virtDBusDomainGetAutostart, virtDBusDomainSetAutostart }, @@ -1806,6 +1830,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "Shutdown", virtDBusDomainShutdown }, { "Suspend", virtDBusDomainSuspend }, { "Undefine", virtDBusDomainUndefine }, + { "UpdateDevice", virtDBusDomainUpdateDevice }, { 0 } }; -- 2.15.0

On Tue, Apr 17, 2018 at 02:04:44PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 ++++++ src/domain.c | 25 +++++++++++++++++++++++++ 2 files changed, 31 insertions(+)
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
participants (4)
-
Daniel P. Berrangé
-
Ján Tomko
-
Katerina Koukiou
-
Pavel Hrdina