[libvirt] [PATCH 0/5] remote generator: Cover more functions

Move more functions to the generator and cover stream-using functions. As the stream-usage is not detectable from the .x file directly add additional annotations. daemon/remote.c | 185 --------------------------- daemon/remote_generator.pl | 211 +++++++++++++++++++++++-------- daemon/stream.c | 7 +- src/driver.h | 2 +- src/libvirt.c | 4 +- src/lxc/lxc_driver.c | 2 +- src/qemu/qemu_driver.c | 2 +- src/remote/remote_driver.c | 288 ------------------------------------------ src/remote/remote_protocol.x | 26 +++-- src/uml/uml_driver.c | 2 +- src/xen/xen_driver.c | 2 +- 11 files changed, 188 insertions(+), 543 deletions(-) Matthias

--- daemon/remote_generator.pl | 5 +++++ src/remote/remote_driver.c | 26 -------------------------- src/remote/remote_protocol.x | 2 +- 3 files changed, 6 insertions(+), 27 deletions(-) diff --git a/daemon/remote_generator.pl b/daemon/remote_generator.pl index c53ebc8..dd5d482 100755 --- a/daemon/remote_generator.pl +++ b/daemon/remote_generator.pl @@ -953,6 +953,11 @@ elsif ($opt_k) { push(@ret_list, "rv = ret.$1;"); $single_ret_var = "char *rv = NULL"; $single_ret_type = "char *"; + } elsif ($ret_member =~ m/^remote_string (\S+);/) { + push(@ret_list, "rv = ret.$1 ? *ret.$1 : NULL;"); + push(@ret_list, "VIR_FREE(ret.$1);"); + $single_ret_var = "char *rv = NULL"; + $single_ret_type = "char *"; } elsif ($ret_member =~ m/^remote_nonnull_(domain|network|storage_pool|storage_vol|node_device|interface|secret|nwfilter|domain_snapshot) (\S+);/) { my $name = $1; my $arg_name = $2; diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c index 1847577..c2edaa2 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -2967,32 +2967,6 @@ remoteDevMonClose(virConnectPtr conn) return remoteGenericClose(conn, &conn->devMonPrivateData); } -static char *remoteNodeDeviceGetParent(virNodeDevicePtr dev) -{ - char *rv = NULL; - remote_node_device_get_parent_args args; - remote_node_device_get_parent_ret ret; - struct private_data *priv = dev->conn->devMonPrivateData; - - remoteDriverLock(priv); - - args.name = dev->name; - - memset (&ret, 0, sizeof ret); - if (call (dev->conn, priv, 0, REMOTE_PROC_NODE_DEVICE_GET_PARENT, - (xdrproc_t) xdr_remote_node_device_get_parent_args, (char *) &args, - (xdrproc_t) xdr_remote_node_device_get_parent_ret, (char *) &ret) == -1) - goto done; - - /* Caller frees. */ - rv = ret.parent ? *ret.parent : NULL; - VIR_FREE(ret.parent); - -done: - remoteDriverUnlock(priv); - return rv; -} - static int remoteNodeDeviceDettach (virNodeDevicePtr dev) { diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x index e115f39..571f273 100644 --- a/src/remote/remote_protocol.x +++ b/src/remote/remote_protocol.x @@ -2091,7 +2091,7 @@ enum remote_procedure { REMOTE_PROC_NODE_LIST_DEVICES = 112, /* autogen autogen */ REMOTE_PROC_NODE_DEVICE_LOOKUP_BY_NAME = 113, /* autogen autogen */ REMOTE_PROC_NODE_DEVICE_GET_XML_DESC = 114, /* autogen autogen */ - REMOTE_PROC_NODE_DEVICE_GET_PARENT = 115, /* skipgen skipgen */ + REMOTE_PROC_NODE_DEVICE_GET_PARENT = 115, /* skipgen autogen */ REMOTE_PROC_NODE_DEVICE_NUM_OF_CAPS = 116, /* autogen autogen */ REMOTE_PROC_NODE_DEVICE_LIST_CAPS = 117, /* autogen autogen */ REMOTE_PROC_NODE_DEVICE_DETTACH = 118, /* autogen skipgen */ -- 1.7.0.4

On 05/15/2011 12:23 AM, Matthias Bolte wrote:
--- daemon/remote_generator.pl | 5 +++++ src/remote/remote_driver.c | 26 -------------------------- src/remote/remote_protocol.x | 2 +- 3 files changed, 6 insertions(+), 27 deletions(-)
To test this, I installed the patch, and compared src/remote/remote_client_bodies.h with the hand-maintained code being removed; the only differences were in whitespace or trivial declaration reordering. ACK.
+++ b/src/remote/remote_protocol.x @@ -2091,7 +2091,7 @@ enum remote_procedure { REMOTE_PROC_NODE_LIST_DEVICES = 112, /* autogen autogen */ REMOTE_PROC_NODE_DEVICE_LOOKUP_BY_NAME = 113, /* autogen autogen */ REMOTE_PROC_NODE_DEVICE_GET_XML_DESC = 114, /* autogen autogen */ - REMOTE_PROC_NODE_DEVICE_GET_PARENT = 115, /* skipgen skipgen */ + REMOTE_PROC_NODE_DEVICE_GET_PARENT = 115, /* skipgen autogen */ REMOTE_PROC_NODE_DEVICE_NUM_OF_CAPS = 116, /* autogen autogen */ REMOTE_PROC_NODE_DEVICE_LIST_CAPS = 117, /* autogen autogen */ REMOTE_PROC_NODE_DEVICE_DETTACH = 118, /* autogen skipgen */
-- Eric Blake eblake@redhat.com +1-801-349-2682 Libvirt virtualization library http://libvirt.org

2011/5/16 Eric Blake <eblake@redhat.com>:
On 05/15/2011 12:23 AM, Matthias Bolte wrote:
--- daemon/remote_generator.pl | 5 +++++ src/remote/remote_driver.c | 26 -------------------------- src/remote/remote_protocol.x | 2 +- 3 files changed, 6 insertions(+), 27 deletions(-)
To test this, I installed the patch, and compared src/remote/remote_client_bodies.h with the hand-maintained code being removed; the only differences were in whitespace or trivial declaration reordering.
ACK.
That's how it's intended to be :) Thanks, pushed. Matthias

For virDomainDestroy and virDrvSupportsFeature. --- daemon/remote_generator.pl | 14 ++++++++++ src/remote/remote_driver.c | 55 ------------------------------------------ src/remote/remote_protocol.x | 4 +- 3 files changed, 16 insertions(+), 57 deletions(-) diff --git a/daemon/remote_generator.pl b/daemon/remote_generator.pl index dd5d482..a3b8421 100755 --- a/daemon/remote_generator.pl +++ b/daemon/remote_generator.pl @@ -1065,6 +1065,15 @@ elsif ($opt_k) { print "\n"; print " remoteDriverLock(priv);\n"; + if ($call->{ProcName} eq "SupportsFeature") { + # SPECIAL: VIR_DRV_FEATURE_REMOTE feature is handled directly + print "\n"; + print " if (feature == VIR_DRV_FEATURE_REMOTE) {\n"; + print " rv = 1;\n"; + print " goto done;\n"; + print " }\n"; + } + foreach my $args_check (@args_check_list) { print "\n"; print " if ($args_check->{arg} > $args_check->{limit}) {\n"; @@ -1140,6 +1149,11 @@ elsif ($opt_k) { print "\n"; } + if ($call->{ProcName} eq "DomainDestroy") { + # SPECIAL: virDomainDestroy needs to reset the domain id explicitly + print " dom->id = -1;\n"; + } + if ($multi_ret or !@ret_list) { print " rv = 0;\n"; } diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c index c2edaa2..f18523c 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -1590,37 +1590,6 @@ remoteClose (virConnectPtr conn) return ret; } -static int -remoteSupportsFeature (virConnectPtr conn, int feature) -{ - int rv = -1; - remote_supports_feature_args args; - remote_supports_feature_ret ret; - struct private_data *priv = conn->privateData; - - remoteDriverLock(priv); - - /* VIR_DRV_FEATURE_REMOTE* features are handled directly. */ - if (feature == VIR_DRV_FEATURE_REMOTE) { - rv = 1; - goto done; - } - - args.feature = feature; - - memset (&ret, 0, sizeof ret); - if (call (conn, priv, 0, REMOTE_PROC_SUPPORTS_FEATURE, - (xdrproc_t) xdr_remote_supports_feature_args, (char *) &args, - (xdrproc_t) xdr_remote_supports_feature_ret, (char *) &ret) == -1) - goto done; - - rv = ret.supported; - -done: - remoteDriverUnlock(priv); - return rv; -} - /* Unfortunately this function is defined to return a static string. * Since the remote end always answers with the same type (for a * single connection anyway) we cache the type in the connection's @@ -1811,30 +1780,6 @@ done: } static int -remoteDomainDestroy (virDomainPtr domain) -{ - int rv = -1; - remote_domain_destroy_args args; - struct private_data *priv = domain->conn->privateData; - - remoteDriverLock(priv); - - make_nonnull_domain (&args.dom, domain); - - if (call (domain->conn, priv, 0, REMOTE_PROC_DOMAIN_DESTROY, - (xdrproc_t) xdr_remote_domain_destroy_args, (char *) &args, - (xdrproc_t) xdr_void, (char *) NULL) == -1) - goto done; - - rv = 0; - domain->id = -1; - -done: - remoteDriverUnlock(priv); - return rv; -} - -static int remoteDomainSetMemoryParameters (virDomainPtr domain, virMemoryParameterPtr params, int nparams, diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x index 571f273..b14aee0 100644 --- a/src/remote/remote_protocol.x +++ b/src/remote/remote_protocol.x @@ -1978,7 +1978,7 @@ enum remote_procedure { REMOTE_PROC_DOMAIN_CREATE_XML = 10, /* autogen autogen */ REMOTE_PROC_DOMAIN_DEFINE_XML = 11, /* autogen autogen */ - REMOTE_PROC_DOMAIN_DESTROY = 12, /* autogen skipgen */ + REMOTE_PROC_DOMAIN_DESTROY = 12, /* autogen autogen */ REMOTE_PROC_DOMAIN_DETACH_DEVICE = 13, /* autogen autogen */ REMOTE_PROC_DOMAIN_GET_XML_DESC = 14, /* autogen autogen */ REMOTE_PROC_DOMAIN_GET_AUTOSTART = 15, /* autogen autogen */ @@ -2030,7 +2030,7 @@ enum remote_procedure { REMOTE_PROC_DOMAIN_GET_SCHEDULER_PARAMETERS = 57, /* skipgen skipgen */ REMOTE_PROC_DOMAIN_SET_SCHEDULER_PARAMETERS = 58, /* skipgen skipgen */ REMOTE_PROC_GET_HOSTNAME = 59, /* autogen autogen */ - REMOTE_PROC_SUPPORTS_FEATURE = 60, /* autogen skipgen */ + REMOTE_PROC_SUPPORTS_FEATURE = 60, /* autogen autogen */ REMOTE_PROC_DOMAIN_MIGRATE_PREPARE = 61, /* skipgen skipgen */ REMOTE_PROC_DOMAIN_MIGRATE_PERFORM = 62, /* autogen autogen */ -- 1.7.0.4

On 05/15/2011 12:23 AM, Matthias Bolte wrote:
For virDomainDestroy and virDrvSupportsFeature. --- daemon/remote_generator.pl | 14 ++++++++++ src/remote/remote_driver.c | 55 ------------------------------------------ src/remote/remote_protocol.x | 4 +- 3 files changed, 16 insertions(+), 57 deletions(-)
Comparison of the new generated functions to the replaced versions is sane (not identical, but the differences do not affect operation). ACK.
+++ b/src/remote/remote_protocol.x @@ -1978,7 +1978,7 @@ enum remote_procedure { REMOTE_PROC_DOMAIN_CREATE_XML = 10, /* autogen autogen */
REMOTE_PROC_DOMAIN_DEFINE_XML = 11, /* autogen autogen */ - REMOTE_PROC_DOMAIN_DESTROY = 12, /* autogen skipgen */ + REMOTE_PROC_DOMAIN_DESTROY = 12, /* autogen autogen */ REMOTE_PROC_DOMAIN_DETACH_DEVICE = 13, /* autogen autogen */ REMOTE_PROC_DOMAIN_GET_XML_DESC = 14, /* autogen autogen */ REMOTE_PROC_DOMAIN_GET_AUTOSTART = 15, /* autogen autogen */ @@ -2030,7 +2030,7 @@ enum remote_procedure { REMOTE_PROC_DOMAIN_GET_SCHEDULER_PARAMETERS = 57, /* skipgen skipgen */ REMOTE_PROC_DOMAIN_SET_SCHEDULER_PARAMETERS = 58, /* skipgen skipgen */ REMOTE_PROC_GET_HOSTNAME = 59, /* autogen autogen */ - REMOTE_PROC_SUPPORTS_FEATURE = 60, /* autogen skipgen */ + REMOTE_PROC_SUPPORTS_FEATURE = 60, /* autogen autogen */
REMOTE_PROC_DOMAIN_MIGRATE_PREPARE = 61, /* skipgen skipgen */ REMOTE_PROC_DOMAIN_MIGRATE_PERFORM = 62, /* autogen autogen */
-- Eric Blake eblake@redhat.com +1-801-349-2682 Libvirt virtualization library http://libvirt.org

2011/5/16 Eric Blake <eblake@redhat.com>:
On 05/15/2011 12:23 AM, Matthias Bolte wrote:
For virDomainDestroy and virDrvSupportsFeature. --- daemon/remote_generator.pl | 14 ++++++++++ src/remote/remote_driver.c | 55 ------------------------------------------ src/remote/remote_protocol.x | 4 +- 3 files changed, 16 insertions(+), 57 deletions(-)
Comparison of the new generated functions to the replaced versions is sane (not identical, but the differences do not affect operation).
ACK.
Thanks, pushed. Matthias

virStreamNew needs to dispatch the error that virGetStream reports on failure. remoteCreateClientStream can fail due to virStreamNew or due to VIR_ALLOC. Report OOM error for VIR_ALLOC failure to report errors in all error cases. Remove OOM error reporting from remoteCreateClientStream callers. --- daemon/remote.c | 8 ++------ daemon/stream.c | 7 ++++++- src/libvirt.c | 2 ++ 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/daemon/remote.c b/daemon/remote.c index 6e13958..e3bd4a2 100644 --- a/daemon/remote.c +++ b/daemon/remote.c @@ -1190,10 +1190,8 @@ remoteDispatchDomainMigratePrepareTunnel(struct qemud_server *server ATTRIBUTE_U dname = args->dname == NULL ? NULL : *args->dname; - if (!(stream = remoteCreateClientStream(conn, hdr))) { - virReportOOMError(); + if (!(stream = remoteCreateClientStream(conn, hdr))) goto cleanup; - } if (virDomainMigratePrepareTunnel(conn, stream->st, args->flags, dname, args->resource, @@ -3014,10 +3012,8 @@ remoteDispatchDomainOpenConsole(struct qemud_server *server ATTRIBUTE_UNUSED, if (!(dom = get_nonnull_domain(conn, args->dom))) goto cleanup; - if (!(stream = remoteCreateClientStream(conn, hdr))) { - virReportOOMError(); + if (!(stream = remoteCreateClientStream(conn, hdr))) goto cleanup; - } if (virDomainOpenConsole(dom, args->devname ? *args->devname : NULL, diff --git a/daemon/stream.c b/daemon/stream.c index cada0a1..48085da 100644 --- a/daemon/stream.c +++ b/daemon/stream.c @@ -27,6 +27,9 @@ #include "memory.h" #include "dispatch.h" #include "logging.h" +#include "virterror_internal.h" + +#define VIR_FROM_THIS VIR_FROM_STREAMS static int remoteStreamHandleWrite(struct qemud_client *client, @@ -209,8 +212,10 @@ remoteCreateClientStream(virConnectPtr conn, VIR_DEBUG("proc=%d serial=%d", hdr->proc, hdr->serial); - if (VIR_ALLOC(stream) < 0) + if (VIR_ALLOC(stream) < 0) { + virReportOOMError(); return NULL; + } stream->procedure = hdr->proc; stream->serial = hdr->serial; diff --git a/src/libvirt.c b/src/libvirt.c index 6325188..7dec5a6 100644 --- a/src/libvirt.c +++ b/src/libvirt.c @@ -11050,6 +11050,8 @@ virStreamNew(virConnectPtr conn, st = virGetStream(conn); if (st) st->flags = flags; + else + virDispatchError(conn); return st; } -- 1.7.0.4

On 05/15/2011 12:23 AM, Matthias Bolte wrote:
virStreamNew needs to dispatch the error that virGetStream reports on failure.
remoteCreateClientStream can fail due to virStreamNew or due to VIR_ALLOC. Report OOM error for VIR_ALLOC failure to report errors in all error cases.
Remove OOM error reporting from remoteCreateClientStream callers. --- daemon/remote.c | 8 ++------ daemon/stream.c | 7 ++++++- src/libvirt.c | 2 ++ 3 files changed, 10 insertions(+), 7 deletions(-)
ACK. -- Eric Blake eblake@redhat.com +1-801-349-2682 Libvirt virtualization library http://libvirt.org

2011/5/16 Eric Blake <eblake@redhat.com>:
On 05/15/2011 12:23 AM, Matthias Bolte wrote:
virStreamNew needs to dispatch the error that virGetStream reports on failure.
remoteCreateClientStream can fail due to virStreamNew or due to VIR_ALLOC. Report OOM error for VIR_ALLOC failure to report errors in all error cases.
Remove OOM error reporting from remoteCreateClientStream callers. --- daemon/remote.c | 8 ++------ daemon/stream.c | 7 ++++++- src/libvirt.c | 2 ++ 3 files changed, 10 insertions(+), 7 deletions(-)
ACK.
Thanks, pushed. Matthias

Reorder signature of virDrvDomainOpenConsole to match the common pattern. Add special case code to handle deviation in the public API version. Adds a missing remoteStreamRelease to remoteDomainScreenshot error path. --- daemon/remote.c | 181 ------------------------------------ daemon/remote_generator.pl | 104 +++++++++++++++++++-- src/driver.h | 2 +- src/libvirt.c | 2 +- src/lxc/lxc_driver.c | 2 +- src/qemu/qemu_driver.c | 2 +- src/remote/remote_driver.c | 207 ------------------------------------------ src/remote/remote_protocol.x | 20 +++-- src/uml/uml_driver.c | 2 +- src/xen/xen_driver.c | 2 +- 10 files changed, 113 insertions(+), 411 deletions(-) diff --git a/daemon/remote.c b/daemon/remote.c index e3bd4a2..f8db6fe 100644 --- a/daemon/remote.c +++ b/daemon/remote.c @@ -1171,50 +1171,6 @@ cleanup: } static int -remoteDispatchDomainMigratePrepareTunnel(struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, - virConnectPtr conn, - remote_message_header *hdr, - remote_error *rerr, - remote_domain_migrate_prepare_tunnel_args *args, - void *ret ATTRIBUTE_UNUSED) -{ - char *dname; - struct qemud_client_stream *stream = NULL; - int rv = -1; - - if (!conn) { - virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open")); - goto cleanup; - } - - dname = args->dname == NULL ? NULL : *args->dname; - - if (!(stream = remoteCreateClientStream(conn, hdr))) - goto cleanup; - - if (virDomainMigratePrepareTunnel(conn, stream->st, - args->flags, dname, args->resource, - args->dom_xml) < 0) - goto cleanup; - - if (remoteAddClientStream(client, stream, 0) < 0) - goto cleanup; - - rv = 0; - -cleanup: - if (rv < 0) { - remoteDispatchError(rerr); - if (stream) { - virStreamAbort(stream->st); - remoteFreeClientStream(client, stream); - } - } - return rv; -} - -static int remoteDispatchDomainPinVcpu(struct qemud_server *server ATTRIBUTE_UNUSED, struct qemud_client *client ATTRIBUTE_UNUSED, virConnectPtr conn, @@ -2601,96 +2557,6 @@ cleanup: return rv; } -static int remoteDispatchStorageVolUpload(struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, - virConnectPtr conn, - remote_message_header *hdr, - remote_error *rerr, - remote_storage_vol_upload_args *args, - void *ret ATTRIBUTE_UNUSED) -{ - struct qemud_client_stream *stream = NULL; - virStorageVolPtr vol = NULL; - int rv = -1; - - if (!conn) { - virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open")); - goto cleanup; - } - - if (!(vol = get_nonnull_storage_vol(conn, args->vol))) - goto cleanup; - - if (!(stream = remoteCreateClientStream(conn, hdr))) - goto cleanup; - - if (virStorageVolUpload(vol, stream->st, - args->offset, args->length, - args->flags) < 0) - goto cleanup; - - if (remoteAddClientStream(client, stream, 0) < 0) - goto cleanup; - - rv = 0; - -cleanup: - if (rv < 0) - remoteDispatchError(rerr); - if (vol) - virStorageVolFree(vol); - if (stream && rv != 0) { - virStreamAbort(stream->st); - remoteFreeClientStream(client, stream); - } - return rv; -} - -static int remoteDispatchStorageVolDownload(struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, - virConnectPtr conn, - remote_message_header *hdr, - remote_error *rerr, - remote_storage_vol_download_args *args, - void *ret ATTRIBUTE_UNUSED) -{ - struct qemud_client_stream *stream = NULL; - virStorageVolPtr vol = NULL; - int rv = -1; - - if (!conn) { - virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open")); - goto cleanup; - } - - if (!(vol = get_nonnull_storage_vol(conn, args->vol))) - goto cleanup; - - if (!(stream = remoteCreateClientStream(conn, hdr))) - goto cleanup; - - if (virStorageVolDownload(vol, stream->st, - args->offset, args->length, - args->flags) < 0) - goto cleanup; - - if (remoteAddClientStream(client, stream, 1) < 0) - goto cleanup; - - rv = 0; - -cleanup: - if (rv < 0) - remoteDispatchError(rerr); - if (vol) - virStorageVolFree(vol); - if (stream && rv != 0) { - virStreamAbort(stream->st); - remoteFreeClientStream(client, stream); - } - return rv; -} - /*************************** * Register / deregister events @@ -2991,53 +2857,6 @@ cleanup: } -static int -remoteDispatchDomainOpenConsole(struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, - virConnectPtr conn, - remote_message_header *hdr, - remote_error *rerr, - remote_domain_open_console_args *args, - void *ret ATTRIBUTE_UNUSED) -{ - struct qemud_client_stream *stream = NULL; - virDomainPtr dom = NULL; - int rv = -1; - - if (!conn) { - virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open")); - goto cleanup; - } - - if (!(dom = get_nonnull_domain(conn, args->dom))) - goto cleanup; - - if (!(stream = remoteCreateClientStream(conn, hdr))) - goto cleanup; - - if (virDomainOpenConsole(dom, - args->devname ? *args->devname : NULL, - stream->st, - args->flags) < 0) - goto cleanup; - - if (remoteAddClientStream(client, stream, 1) < 0) - goto cleanup; - - rv = 0; - -cleanup: - if (rv < 0) - remoteDispatchError(rerr); - if (stream && rv < 0) { - virStreamAbort(stream->st); - remoteFreeClientStream(client, stream); - } - if (dom) - virDomainFree(dom); - return rv; -} - #include "remote_dispatch_bodies.h" #include "qemu_dispatch_bodies.h" diff --git a/daemon/remote_generator.pl b/daemon/remote_generator.pl index a3b8421..c2468b9 100755 --- a/daemon/remote_generator.pl +++ b/daemon/remote_generator.pl @@ -43,7 +43,7 @@ sub name_to_ProcName { # Read the input file (usually remote_protocol.x) and form an # opinion about the name, args and return type of each RPC. -my ($name, $ProcName, $id, $flags, $gen, %calls, @calls); +my ($name, $ProcName, $id, $flags, %calls, @calls); # only generate a close method if -c was passed if ($opt_c) { @@ -135,19 +135,26 @@ while (<PROTOCOL>) { $ProcName = name_to_ProcName ($name); if ($opt_b or $opt_k) { - if (!($flags =~ m/^\s*\/\*\s*(\S+)\s+(\S+)\s*\*\/\s*$/)) { + if (!($flags =~ m/^\s*\/\*\s*(\S+)\s+(\S+)\s*(.*)\*\/\s*$/)) { die "invalid generator flags for ${procprefix}_PROC_${name}" } - $gen = $opt_b ? $1 : $2; + my $genmode = $opt_b ? $1 : $2; + my $genflags = $3; - if ($gen eq "autogen") { + if ($genmode eq "autogen") { push(@autogen, $ProcName); - } elsif ($gen eq "skipgen") { + } elsif ($genmode eq "skipgen") { # ignore it } else { die "invalid generator flags for ${procprefix}_PROC_${name}" } + + if (defined $genflags and $genflags =~ m/\|\s*(read|write)stream/) { + $calls{$name}->{streamflag} = $1; + } else { + $calls{$name}->{streamflag} = "none"; + } } $calls[$id] = $calls{$name}; @@ -563,6 +570,30 @@ elsif ($opt_b) { push(@vars_list, "vir$struct_name tmp"); } + if ($calls{$_}->{streamflag} ne "none") { + my $first_arg = shift(@args_list); + my $second_arg; + + if ($calls{$_}->{ProcName} eq "DomainOpenConsole") { + # SPECIAL: virDomainOpenConsole differs and takes the stream + # as third argument instead of the second + $second_arg = shift(@args_list); + } + + unshift(@args_list, "stream->st"); + + if (defined $second_arg) { + unshift(@args_list, $second_arg); + } + + unshift(@args_list, $first_arg); + + push(@free_list_on_error, "if (stream) {"); + push(@free_list_on_error, " virStreamAbort(stream->st);"); + push(@free_list_on_error, " remoteFreeClientStream(client, stream);"); + push(@free_list_on_error, "}"); + } + # print functions signature print "\n"; print "static int\n"; @@ -595,6 +626,10 @@ elsif ($opt_b) { print " $var;\n"; } + if ($calls{$_}->{streamflag} ne "none") { + print " struct qemud_client_stream *stream = NULL;\n"; + } + print "\n"; print " if (!conn) {\n"; print " virNetError(VIR_ERR_INTERNAL_ERROR, \"%s\", _(\"connection not open\"));\n"; @@ -625,6 +660,12 @@ elsif ($opt_b) { print "\n"; } + if ($calls{$_}->{streamflag} ne "none") { + print " if (!(stream = remoteCreateClientStream(conn, hdr)))\n"; + print " goto cleanup;\n"; + print "\n"; + } + if ($calls{$_}->{ret} eq "void") { print " if (vir$calls{$_}->{ProcName}("; print join(', ', @args_list); @@ -691,7 +732,6 @@ elsif ($opt_b) { print " if (vir$calls{$_}->{ProcName}("; print join(', ', @args_list); print ") < 0)\n"; - print " goto cleanup;\n"; print "\n"; @@ -703,6 +743,20 @@ elsif ($opt_b) { print "\n"; } + if ($calls{$_}->{streamflag} ne "none") { + print " if (remoteAddClientStream(client, stream, "; + + if ($calls{$_}->{streamflag} eq "write") { + print "0"; + } else { + print "1"; + } + + print ") < 0)\n"; + print " goto cleanup;\n"; + print "\n"; + } + print " rv = 0;\n"; print "\n"; print "cleanup:\n"; @@ -854,9 +908,14 @@ elsif ($opt_k) { } } - if ($call->{ProcName} eq "DomainMigrateSetMaxDowntime" and - $arg_name eq "downtime") { - $type_name = "unsigned long long"; + # SPECIAL: some hyper parameters map to long longs + if (($call->{ProcName} eq "DomainMigrateSetMaxDowntime" and + $arg_name eq "downtime") or + ($call->{ProcName} eq "StorageVolUpload" and + ($arg_name eq "offset" or $arg_name eq "length")) or + ($call->{ProcName} eq "StorageVolDownload" and + ($arg_name eq "offset" or $arg_name eq "length"))) { + $type_name .= " long"; } push(@args_list, "$type_name $arg_name"); @@ -1042,6 +1101,12 @@ elsif ($opt_k) { } } + if ($call->{streamflag} ne "none") { + my $first_arg = shift(@args_list); + unshift(@args_list, "virStreamPtr st"); + unshift(@args_list, $first_arg); + } + # print function print "\n"; print "static $single_ret_type\n"; @@ -1062,9 +1127,22 @@ elsif ($opt_k) { print " int i;\n"; } + if ($call->{streamflag} ne "none") { + print " struct private_stream_data *privst = NULL;\n"; + } + print "\n"; print " remoteDriverLock(priv);\n"; + if ($call->{streamflag} ne "none") { + print "\n"; + print " if (!(privst = remoteStreamOpen(st, REMOTE_PROC_$call->{UC_NAME}, priv->counter)))\n"; + print " goto done;\n"; + print "\n"; + print " st->driver = &remoteStreamDrv;\n"; + print " st->privateData = privst;\n"; + } + if ($call->{ProcName} eq "SupportsFeature") { # SPECIAL: VIR_DRV_FEATURE_REMOTE feature is handled directly print "\n"; @@ -1113,8 +1191,14 @@ elsif ($opt_k) { print "\n"; print " if (call($priv_src, priv, 0, ${procprefix}_PROC_$call->{UC_NAME},\n"; print " (xdrproc_t)xdr_$call->{args}, (char *)$call_args,\n"; - print " (xdrproc_t)xdr_$call->{ret}, (char *)$call_ret) == -1)\n"; + print " (xdrproc_t)xdr_$call->{ret}, (char *)$call_ret) == -1) {\n"; + + if ($call->{streamflag} ne "none") { + print " remoteStreamRelease(st);\n"; + } + print " goto done;\n"; + print " }\n"; print "\n"; if ($single_ret_as_list) { diff --git a/src/driver.h b/src/driver.h index b800f35..e0fe933 100644 --- a/src/driver.h +++ b/src/driver.h @@ -516,8 +516,8 @@ typedef int typedef int (*virDrvDomainOpenConsole)(virDomainPtr dom, - const char *devname, virStreamPtr st, + const char *devname, unsigned int flags); typedef int diff --git a/src/libvirt.c b/src/libvirt.c index 7dec5a6..8ce0afd 100644 --- a/src/libvirt.c +++ b/src/libvirt.c @@ -13598,7 +13598,7 @@ int virDomainOpenConsole(virDomainPtr dom, if (conn->driver->domainOpenConsole) { int ret; - ret = conn->driver->domainOpenConsole(dom, devname, st, flags); + ret = conn->driver->domainOpenConsole(dom, st, devname, flags); if (ret < 0) goto error; return ret; diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index 68824e4..49b933e 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -2608,8 +2608,8 @@ cleanup: static int lxcDomainOpenConsole(virDomainPtr dom, - const char *devname, virStreamPtr st, + const char *devname, unsigned int flags) { lxc_driver_t *driver = dom->conn->privateData; diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index fff41e0..5ebb5e6 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -7137,8 +7137,8 @@ cleanup: static int qemuDomainOpenConsole(virDomainPtr dom, - const char *devname, virStreamPtr st, + const char *devname, unsigned int flags) { struct qemud_driver *driver = dom->conn->privateData; diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c index f18523c..525f6a1 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -4537,48 +4537,6 @@ static virStreamDriver remoteStreamDrv = { .streamRemoveCallback = remoteStreamEventRemoveCallback, }; - -static int -remoteDomainMigratePrepareTunnel(virConnectPtr conn, - virStreamPtr st, - unsigned long flags, - const char *dname, - unsigned long resource, - const char *dom_xml) -{ - struct private_data *priv = conn->privateData; - struct private_stream_data *privst = NULL; - int rv = -1; - remote_domain_migrate_prepare_tunnel_args args; - - remoteDriverLock(priv); - - if (!(privst = remoteStreamOpen(st, REMOTE_PROC_DOMAIN_MIGRATE_PREPARE_TUNNEL, priv->counter))) - goto done; - - st->driver = &remoteStreamDrv; - st->privateData = privst; - - args.flags = flags; - args.dname = dname == NULL ? NULL : (char **) &dname; - args.resource = resource; - args.dom_xml = (char *) dom_xml; - - if (call(conn, priv, 0, REMOTE_PROC_DOMAIN_MIGRATE_PREPARE_TUNNEL, - (xdrproc_t) xdr_remote_domain_migrate_prepare_tunnel_args, (char *) &args, - (xdrproc_t) xdr_void, NULL) == -1) { - remoteStreamRelease(st); - goto done; - } - - rv = 0; - -done: - remoteDriverUnlock(priv); - - return rv; -} - static int remoteDomainEventRegisterAny(virConnectPtr conn, virDomainPtr dom, int eventID, @@ -4673,171 +4631,6 @@ done: return rv; } -static char * -remoteDomainScreenshot (virDomainPtr domain, - virStreamPtr st, - unsigned int screen, - unsigned int flags) -{ - struct private_data *priv = domain->conn->privateData; - struct private_stream_data *privst = NULL; - remote_domain_screenshot_args args; - remote_domain_screenshot_ret ret; - char *rv = NULL; - - remoteDriverLock(priv); - - if (!(privst = remoteStreamOpen(st, - REMOTE_PROC_DOMAIN_SCREENSHOT, - priv->counter))) - goto done; - - st->driver = &remoteStreamDrv; - st->privateData = privst; - - make_nonnull_domain(&args.dom, domain); - args.flags = flags; - args.screen = screen; - - memset(&ret, 0, sizeof(ret)); - if (call (domain->conn, priv, 0, REMOTE_PROC_DOMAIN_SCREENSHOT, - (xdrproc_t) xdr_remote_domain_screenshot_args, (char *) &args, - (xdrproc_t) xdr_remote_domain_screenshot_ret, (char *) &ret) == -1) - goto done; - - rv = ret.mime ? *ret.mime : NULL; - VIR_FREE(ret.mime); - -done: - remoteDriverUnlock(priv); - return rv; -} - -static int -remoteStorageVolUpload(virStorageVolPtr vol, - virStreamPtr st, - unsigned long long offset, - unsigned long long length, - unsigned int flags) -{ - struct private_data *priv = vol->conn->privateData; - struct private_stream_data *privst = NULL; - int rv = -1; - remote_storage_vol_upload_args args; - - remoteDriverLock(priv); - - if (!(privst = remoteStreamOpen(st, - REMOTE_PROC_STORAGE_VOL_UPLOAD, - priv->counter))) - goto done; - - st->driver = &remoteStreamDrv; - st->privateData = privst; - - make_nonnull_storage_vol(&args.vol, vol); - args.offset = offset; - args.length = length; - args.flags = flags; - - if (call (vol->conn, priv, 0, REMOTE_PROC_STORAGE_VOL_UPLOAD, - (xdrproc_t) xdr_remote_storage_vol_upload_args, (char *) &args, - (xdrproc_t) xdr_void, NULL) == -1) { - remoteStreamRelease(st); - goto done; - } - - rv = 0; - -done: - remoteDriverUnlock(priv); - - return rv; -} - - -static int -remoteStorageVolDownload(virStorageVolPtr vol, - virStreamPtr st, - unsigned long long offset, - unsigned long long length, - unsigned int flags) -{ - struct private_data *priv = vol->conn->privateData; - struct private_stream_data *privst = NULL; - int rv = -1; - remote_storage_vol_download_args args; - - remoteDriverLock(priv); - - if (!(privst = remoteStreamOpen(st, - REMOTE_PROC_STORAGE_VOL_DOWNLOAD, - priv->counter))) - goto done; - - st->driver = &remoteStreamDrv; - st->privateData = privst; - - make_nonnull_storage_vol(&args.vol, vol); - args.offset = offset; - args.length = length; - args.flags = flags; - - if (call (vol->conn, priv, 0, REMOTE_PROC_STORAGE_VOL_DOWNLOAD, - (xdrproc_t) xdr_remote_storage_vol_download_args, (char *) &args, - (xdrproc_t) xdr_void, NULL) == -1) { - remoteStreamRelease(st); - goto done; - } - - rv = 0; - -done: - remoteDriverUnlock(priv); - - return rv; -} - - -static int -remoteDomainOpenConsole(virDomainPtr dom, - const char *devname, - virStreamPtr st, - unsigned int flags) -{ - struct private_data *priv = dom->conn->privateData; - struct private_stream_data *privst = NULL; - int rv = -1; - remote_domain_open_console_args args; - - remoteDriverLock(priv); - - if (!(privst = remoteStreamOpen(st, REMOTE_PROC_DOMAIN_OPEN_CONSOLE, priv->counter))) - goto done; - - st->driver = &remoteStreamDrv; - st->privateData = privst; - - make_nonnull_domain (&args.dom, dom); - args.devname = devname ? (char **)&devname : NULL; - args.flags = flags; - - if (call(dom->conn, priv, 0, REMOTE_PROC_DOMAIN_OPEN_CONSOLE, - (xdrproc_t) xdr_remote_domain_open_console_args, (char *) &args, - (xdrproc_t) xdr_void, NULL) == -1) { - remoteStreamRelease(st); - goto done; - } - - rv = 0; - -done: - remoteDriverUnlock(priv); - - return rv; -} - - /*----------------------------------------------------------------------*/ static int diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x index b14aee0..e7bc2ec 100644 --- a/src/remote/remote_protocol.x +++ b/src/remote/remote_protocol.x @@ -1965,7 +1965,10 @@ const REMOTE_PROTOCOL_VERSION = 1; enum remote_procedure { /* Each function must have a two-word comment. The first word is * whether remote_generator.pl handles daemon, the second whether - * it handles src/remote. */ + * it handles src/remote. Additional flags can be specified after a + * pipe. The readstream/writestream flag lets daemon and src/remote + * create a stream. The direction is defined from the src/remote point of + * view. A readstream transfers data from daemon to src/remote. */ REMOTE_PROC_OPEN = 1, /* skipgen skipgen */ REMOTE_PROC_CLOSE = 2, /* skipgen skipgen */ REMOTE_PROC_GET_TYPE = 3, /* skipgen skipgen */ @@ -2127,7 +2130,7 @@ enum remote_procedure { REMOTE_PROC_SECRET_GET_VALUE = 145, /* skipgen skipgen */ REMOTE_PROC_SECRET_UNDEFINE = 146, /* autogen autogen */ REMOTE_PROC_SECRET_LOOKUP_BY_USAGE = 147, /* autogen autogen */ - REMOTE_PROC_DOMAIN_MIGRATE_PREPARE_TUNNEL = 148, /* skipgen skipgen */ + REMOTE_PROC_DOMAIN_MIGRATE_PREPARE_TUNNEL = 148, /* autogen autogen | writestream */ REMOTE_PROC_IS_SECURE = 149, /* autogen skipgen */ REMOTE_PROC_DOMAIN_IS_ACTIVE = 150, /* autogen autogen */ @@ -2186,18 +2189,18 @@ enum remote_procedure { REMOTE_PROC_DOMAIN_SET_VCPUS_FLAGS = 199, /* autogen autogen */ REMOTE_PROC_DOMAIN_GET_VCPUS_FLAGS = 200, /* autogen autogen */ - REMOTE_PROC_DOMAIN_OPEN_CONSOLE = 201, /* skipgen skipgen */ + REMOTE_PROC_DOMAIN_OPEN_CONSOLE = 201, /* autogen autogen | readstream */ REMOTE_PROC_DOMAIN_IS_UPDATED = 202, /* autogen autogen */ REMOTE_PROC_GET_SYSINFO = 203, /* autogen autogen */ REMOTE_PROC_DOMAIN_SET_MEMORY_FLAGS = 204, /* autogen autogen */ REMOTE_PROC_DOMAIN_SET_BLKIO_PARAMETERS = 205, /* skipgen skipgen */ REMOTE_PROC_DOMAIN_GET_BLKIO_PARAMETERS = 206, /* skipgen skipgen */ REMOTE_PROC_DOMAIN_MIGRATE_SET_MAX_SPEED = 207, /* autogen autogen */ - REMOTE_PROC_STORAGE_VOL_UPLOAD = 208, /* skipgen skipgen */ - REMOTE_PROC_STORAGE_VOL_DOWNLOAD = 209, /* skipgen skipgen */ + REMOTE_PROC_STORAGE_VOL_UPLOAD = 208, /* autogen autogen | writestream */ + REMOTE_PROC_STORAGE_VOL_DOWNLOAD = 209, /* autogen autogen | readstream */ REMOTE_PROC_DOMAIN_INJECT_NMI = 210, /* autogen autogen */ - REMOTE_PROC_DOMAIN_SCREENSHOT = 211 /* skipgen skipgen */ + REMOTE_PROC_DOMAIN_SCREENSHOT = 211 /* skipgen autogen | readstream */ /* * Notice how the entries are grouped in sets of 10 ? * Nice isn't it. Please keep it this way when adding more. @@ -2205,7 +2208,10 @@ enum remote_procedure { /* Each function must have a two-word comment. The first word is * whether remote_generator.pl handles daemon, the second whether - * it handles src/remote. */ + * it handles src/remote. Additional flags can be specified after a + * pipe. The readstream/writestream flag lets daemon and src/remote + * create a stream. The direction is defined from the src/remote point of + * view. A readstream transfers data from daemon to src/remote. */ }; /* diff --git a/src/uml/uml_driver.c b/src/uml/uml_driver.c index e7cd77a..579217e 100644 --- a/src/uml/uml_driver.c +++ b/src/uml/uml_driver.c @@ -2079,8 +2079,8 @@ cleanup: static int umlDomainOpenConsole(virDomainPtr dom, - const char *devname, virStreamPtr st, + const char *devname, unsigned int flags) { struct uml_driver *driver = dom->conn->privateData; diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c index 5bafb73..f2221cf 100644 --- a/src/xen/xen_driver.c +++ b/src/xen/xen_driver.c @@ -2042,8 +2042,8 @@ out: static int xenUnifiedDomainOpenConsole(virDomainPtr dom, - const char *devname, virStreamPtr st, + const char *devname, unsigned int flags) { virDomainDefPtr def = NULL; -- 1.7.0.4

On 05/15/2011 12:23 AM, Matthias Bolte wrote:
Reorder signature of virDrvDomainOpenConsole to match the common pattern. Add special case code to handle deviation in the public API version.
Adds a missing remoteStreamRelease to remoteDomainScreenshot error path. --- daemon/remote.c | 181 ------------------------------------ daemon/remote_generator.pl | 104 +++++++++++++++++++-- src/driver.h | 2 +- src/libvirt.c | 2 +- src/lxc/lxc_driver.c | 2 +- src/qemu/qemu_driver.c | 2 +- src/remote/remote_driver.c | 207 ------------------------------------------ src/remote/remote_protocol.x | 20 +++-- src/uml/uml_driver.c | 2 +- src/xen/xen_driver.c | 2 +- 10 files changed, 113 insertions(+), 411 deletions(-)
diff --git a/daemon/remote.c b/daemon/remote.c index e3bd4a2..f8db6fe 100644 --- a/daemon/remote.c +++ b/daemon/remote.c @@ -1171,50 +1171,6 @@ cleanup: }
static int -remoteDispatchDomainMigratePrepareTunnel(struct qemud_server *server ATTRIBUTE_UNUSED,
Hmm, your patch was written before Dan's migration v3 patch; you may need to tweak it to cover PrepareTunnel3 in the same manner. However, of the functions you moved, I validated that the generated version has the same behavior as the deleted version.
+++ b/daemon/remote_generator.pl @@ -43,7 +43,7 @@ sub name_to_ProcName {
# Read the input file (usually remote_protocol.x) and form an # opinion about the name, args and return type of each RPC. -my ($name, $ProcName, $id, $flags, $gen, %calls, @calls); +my ($name, $ProcName, $id, $flags, %calls, @calls);
# only generate a close method if -c was passed if ($opt_c) { @@ -135,19 +135,26 @@ while (<PROTOCOL>) { $ProcName = name_to_ProcName ($name);
if ($opt_b or $opt_k) { - if (!($flags =~ m/^\s*\/\*\s*(\S+)\s+(\S+)\s*\*\/\s*$/)) { + if (!($flags =~ m/^\s*\/\*\s*(\S+)\s+(\S+)\s*(.*)\*\/\s*$/)) { die "invalid generator flags for ${procprefix}_PROC_${name}" }
- $gen = $opt_b ? $1 : $2; + my $genmode = $opt_b ? $1 : $2; + my $genflags = $3;
- if ($gen eq "autogen") { + if ($genmode eq "autogen") { push(@autogen, $ProcName); - } elsif ($gen eq "skipgen") { + } elsif ($genmode eq "skipgen") { # ignore it } else { die "invalid generator flags for ${procprefix}_PROC_${name}" } + + if (defined $genflags and $genflags =~ m/\|\s*(read|write)stream/) { + $calls{$name}->{streamflag} = $1; + } else { + $calls{$name}->{streamflag} = "none"; + }
Really, we have readstream, writestream, or empty. Should we make this stricter and reject unknown words, rather than silently translating them to none?
@@ -854,9 +908,14 @@ elsif ($opt_k) { } }
- if ($call->{ProcName} eq "DomainMigrateSetMaxDowntime" and - $arg_name eq "downtime") { - $type_name = "unsigned long long"; + # SPECIAL: some hyper parameters map to long longs + if (($call->{ProcName} eq "DomainMigrateSetMaxDowntime" and + $arg_name eq "downtime") or + ($call->{ProcName} eq "StorageVolUpload" and + ($arg_name eq "offset" or $arg_name eq "length")) or + ($call->{ProcName} eq "StorageVolDownload" and + ($arg_name eq "offset" or $arg_name eq "length"))) { + $type_name .= " long";
Idea for a future patch - should we add annotations to remote_protocol.h for which hyper fields map to 'long' (and thus need overflow checking on 32-bit hosts) and which are 'long long'? That is, instead of special-casing per function name in remote_generator.pl, it might be nice to annotate it directly in the .x file (and error out if you use '[unsigned] hyper' but don't say whether it maps to 'long' or 'long long').
+++ b/src/driver.h @@ -516,8 +516,8 @@ typedef int
typedef int (*virDrvDomainOpenConsole)(virDomainPtr dom, - const char *devname, virStreamPtr st, + const char *devname, unsigned int flags);
I would have preferred seeing this split into two patches; one for the driver.h callback reorganization, and the other for the generator functions. I think it's okay as one, but it makes this patch rather large; especially since you have to rebase anyways for picking up migration v3.
+++ b/src/remote/remote_protocol.x @@ -1965,7 +1965,10 @@ const REMOTE_PROTOCOL_VERSION = 1; enum remote_procedure { /* Each function must have a two-word comment. The first word is * whether remote_generator.pl handles daemon, the second whether - * it handles src/remote. */ + * it handles src/remote. Additional flags can be specified after a + * pipe. The readstream/writestream flag lets daemon and src/remote + * create a stream. The direction is defined from the src/remote point of + * view. A readstream transfers data from daemon to src/remote. */ REMOTE_PROC_OPEN = 1, /* skipgen skipgen */ REMOTE_PROC_CLOSE = 2, /* skipgen skipgen */ REMOTE_PROC_GET_TYPE = 3, /* skipgen skipgen */ @@ -2127,7 +2130,7 @@ enum remote_procedure { REMOTE_PROC_SECRET_GET_VALUE = 145, /* skipgen skipgen */ REMOTE_PROC_SECRET_UNDEFINE = 146, /* autogen autogen */ REMOTE_PROC_SECRET_LOOKUP_BY_USAGE = 147, /* autogen autogen */ - REMOTE_PROC_DOMAIN_MIGRATE_PREPARE_TUNNEL = 148, /* skipgen skipgen */ + REMOTE_PROC_DOMAIN_MIGRATE_PREPARE_TUNNEL = 148, /* autogen autogen | writestream */ REMOTE_PROC_IS_SECURE = 149, /* autogen skipgen */ REMOTE_PROC_DOMAIN_IS_ACTIVE = 150, /* autogen autogen */
@@ -2186,18 +2189,18 @@ enum remote_procedure { REMOTE_PROC_DOMAIN_SET_VCPUS_FLAGS = 199, /* autogen autogen */ REMOTE_PROC_DOMAIN_GET_VCPUS_FLAGS = 200, /* autogen autogen */
- REMOTE_PROC_DOMAIN_OPEN_CONSOLE = 201, /* skipgen skipgen */ + REMOTE_PROC_DOMAIN_OPEN_CONSOLE = 201, /* autogen autogen | readstream */ REMOTE_PROC_DOMAIN_IS_UPDATED = 202, /* autogen autogen */ REMOTE_PROC_GET_SYSINFO = 203, /* autogen autogen */ REMOTE_PROC_DOMAIN_SET_MEMORY_FLAGS = 204, /* autogen autogen */ REMOTE_PROC_DOMAIN_SET_BLKIO_PARAMETERS = 205, /* skipgen skipgen */ REMOTE_PROC_DOMAIN_GET_BLKIO_PARAMETERS = 206, /* skipgen skipgen */ REMOTE_PROC_DOMAIN_MIGRATE_SET_MAX_SPEED = 207, /* autogen autogen */ - REMOTE_PROC_STORAGE_VOL_UPLOAD = 208, /* skipgen skipgen */ - REMOTE_PROC_STORAGE_VOL_DOWNLOAD = 209, /* skipgen skipgen */ + REMOTE_PROC_STORAGE_VOL_UPLOAD = 208, /* autogen autogen | writestream */ + REMOTE_PROC_STORAGE_VOL_DOWNLOAD = 209, /* autogen autogen | readstream */ REMOTE_PROC_DOMAIN_INJECT_NMI = 210, /* autogen autogen */
- REMOTE_PROC_DOMAIN_SCREENSHOT = 211 /* skipgen skipgen */ + REMOTE_PROC_DOMAIN_SCREENSHOT = 211 /* skipgen autogen | readstream */
Merge conflict due to migration v3.
/* * Notice how the entries are grouped in sets of 10 ? * Nice isn't it. Please keep it this way when adding more. @@ -2205,7 +2208,10 @@ enum remote_procedure {
/* Each function must have a two-word comment. The first word is
Should these two comments (grouping in sets of 10, and details about the comment) be joined into one? While this patch is accurate as-is, I had enough comments (especially regarding splitting this into two after rebasing onto the latest upstream) that it is worth seeing a v2. -- Eric Blake eblake@redhat.com +1-801-349-2682 Libvirt virtualization library http://libvirt.org

2011/5/16 Eric Blake <eblake@redhat.com>:
On 05/15/2011 12:23 AM, Matthias Bolte wrote:
Reorder signature of virDrvDomainOpenConsole to match the common pattern. Add special case code to handle deviation in the public API version.
Adds a missing remoteStreamRelease to remoteDomainScreenshot error path. --- daemon/remote.c | 181 ------------------------------------ daemon/remote_generator.pl | 104 +++++++++++++++++++-- src/driver.h | 2 +- src/libvirt.c | 2 +- src/lxc/lxc_driver.c | 2 +- src/qemu/qemu_driver.c | 2 +- src/remote/remote_driver.c | 207 ------------------------------------------ src/remote/remote_protocol.x | 20 +++-- src/uml/uml_driver.c | 2 +- src/xen/xen_driver.c | 2 +- 10 files changed, 113 insertions(+), 411 deletions(-)
diff --git a/daemon/remote.c b/daemon/remote.c index e3bd4a2..f8db6fe 100644 --- a/daemon/remote.c +++ b/daemon/remote.c @@ -1171,50 +1171,6 @@ cleanup: }
static int -remoteDispatchDomainMigratePrepareTunnel(struct qemud_server *server ATTRIBUTE_UNUSED,
Hmm, your patch was written before Dan's migration v3 patch; you may need to tweak it to cover PrepareTunnel3 in the same manner. However, of the functions you moved, I validated that the generated version has the same behavior as the deleted version.
+++ b/daemon/remote_generator.pl @@ -43,7 +43,7 @@ sub name_to_ProcName {
# Read the input file (usually remote_protocol.x) and form an # opinion about the name, args and return type of each RPC. -my ($name, $ProcName, $id, $flags, $gen, %calls, @calls); +my ($name, $ProcName, $id, $flags, %calls, @calls);
# only generate a close method if -c was passed if ($opt_c) { @@ -135,19 +135,26 @@ while (<PROTOCOL>) { $ProcName = name_to_ProcName ($name);
if ($opt_b or $opt_k) { - if (!($flags =~ m/^\s*\/\*\s*(\S+)\s+(\S+)\s*\*\/\s*$/)) { + if (!($flags =~ m/^\s*\/\*\s*(\S+)\s+(\S+)\s*(.*)\*\/\s*$/)) { die "invalid generator flags for ${procprefix}_PROC_${name}" }
- $gen = $opt_b ? $1 : $2; + my $genmode = $opt_b ? $1 : $2; + my $genflags = $3;
- if ($gen eq "autogen") { + if ($genmode eq "autogen") { push(@autogen, $ProcName); - } elsif ($gen eq "skipgen") { + } elsif ($genmode eq "skipgen") { # ignore it } else { die "invalid generator flags for ${procprefix}_PROC_${name}" } + + if (defined $genflags and $genflags =~ m/\|\s*(read|write)stream/) { + $calls{$name}->{streamflag} = $1; + } else { + $calls{$name}->{streamflag} = "none"; + }
Really, we have readstream, writestream, or empty. Should we make this stricter and reject unknown words, rather than silently translating them to none?
Is strict now, see https://www.redhat.com/archives/libvir-list/2011-May/msg01432.html
@@ -854,9 +908,14 @@ elsif ($opt_k) { } }
- if ($call->{ProcName} eq "DomainMigrateSetMaxDowntime" and - $arg_name eq "downtime") { - $type_name = "unsigned long long"; + # SPECIAL: some hyper parameters map to long longs + if (($call->{ProcName} eq "DomainMigrateSetMaxDowntime" and + $arg_name eq "downtime") or + ($call->{ProcName} eq "StorageVolUpload" and + ($arg_name eq "offset" or $arg_name eq "length")) or + ($call->{ProcName} eq "StorageVolDownload" and + ($arg_name eq "offset" or $arg_name eq "length"))) { + $type_name .= " long";
Idea for a future patch - should we add annotations to remote_protocol.h for which hyper fields map to 'long' (and thus need overflow checking on 32-bit hosts) and which are 'long long'? That is, instead of special-casing per function name in remote_generator.pl, it might be nice to annotate it directly in the .x file (and error out if you use '[unsigned] hyper' but don't say whether it maps to 'long' or 'long long').
Done, see https://www.redhat.com/archives/libvir-list/2011-May/msg01434.html
+++ b/src/driver.h @@ -516,8 +516,8 @@ typedef int
typedef int (*virDrvDomainOpenConsole)(virDomainPtr dom, - const char *devname, virStreamPtr st, + const char *devname, unsigned int flags);
I would have preferred seeing this split into two patches; one for the driver.h callback reorganization, and the other for the generator functions. I think it's okay as one, but it makes this patch rather large; especially since you have to rebase anyways for picking up migration v3.
I handled this differently now, because we cannot change the order in the public API anyway.
+++ b/src/remote/remote_protocol.x @@ -1965,7 +1965,10 @@ const REMOTE_PROTOCOL_VERSION = 1; enum remote_procedure { /* Each function must have a two-word comment. The first word is * whether remote_generator.pl handles daemon, the second whether - * it handles src/remote. */ + * it handles src/remote. Additional flags can be specified after a + * pipe. The readstream/writestream flag lets daemon and src/remote + * create a stream. The direction is defined from the src/remote point of + * view. A readstream transfers data from daemon to src/remote. */ REMOTE_PROC_OPEN = 1, /* skipgen skipgen */ REMOTE_PROC_CLOSE = 2, /* skipgen skipgen */ REMOTE_PROC_GET_TYPE = 3, /* skipgen skipgen */ @@ -2127,7 +2130,7 @@ enum remote_procedure { REMOTE_PROC_SECRET_GET_VALUE = 145, /* skipgen skipgen */ REMOTE_PROC_SECRET_UNDEFINE = 146, /* autogen autogen */ REMOTE_PROC_SECRET_LOOKUP_BY_USAGE = 147, /* autogen autogen */ - REMOTE_PROC_DOMAIN_MIGRATE_PREPARE_TUNNEL = 148, /* skipgen skipgen */ + REMOTE_PROC_DOMAIN_MIGRATE_PREPARE_TUNNEL = 148, /* autogen autogen | writestream */ REMOTE_PROC_IS_SECURE = 149, /* autogen skipgen */ REMOTE_PROC_DOMAIN_IS_ACTIVE = 150, /* autogen autogen */
@@ -2186,18 +2189,18 @@ enum remote_procedure { REMOTE_PROC_DOMAIN_SET_VCPUS_FLAGS = 199, /* autogen autogen */ REMOTE_PROC_DOMAIN_GET_VCPUS_FLAGS = 200, /* autogen autogen */
- REMOTE_PROC_DOMAIN_OPEN_CONSOLE = 201, /* skipgen skipgen */ + REMOTE_PROC_DOMAIN_OPEN_CONSOLE = 201, /* autogen autogen | readstream */ REMOTE_PROC_DOMAIN_IS_UPDATED = 202, /* autogen autogen */ REMOTE_PROC_GET_SYSINFO = 203, /* autogen autogen */ REMOTE_PROC_DOMAIN_SET_MEMORY_FLAGS = 204, /* autogen autogen */ REMOTE_PROC_DOMAIN_SET_BLKIO_PARAMETERS = 205, /* skipgen skipgen */ REMOTE_PROC_DOMAIN_GET_BLKIO_PARAMETERS = 206, /* skipgen skipgen */ REMOTE_PROC_DOMAIN_MIGRATE_SET_MAX_SPEED = 207, /* autogen autogen */ - REMOTE_PROC_STORAGE_VOL_UPLOAD = 208, /* skipgen skipgen */ - REMOTE_PROC_STORAGE_VOL_DOWNLOAD = 209, /* skipgen skipgen */ + REMOTE_PROC_STORAGE_VOL_UPLOAD = 208, /* autogen autogen | writestream */ + REMOTE_PROC_STORAGE_VOL_DOWNLOAD = 209, /* autogen autogen | readstream */ REMOTE_PROC_DOMAIN_INJECT_NMI = 210, /* autogen autogen */
- REMOTE_PROC_DOMAIN_SCREENSHOT = 211 /* skipgen skipgen */ + REMOTE_PROC_DOMAIN_SCREENSHOT = 211 /* skipgen autogen | readstream */
Merge conflict due to migration v3.
/* * Notice how the entries are grouped in sets of 10 ? * Nice isn't it. Please keep it this way when adding more. @@ -2205,7 +2208,10 @@ enum remote_procedure {
/* Each function must have a two-word comment. The first word is
Should these two comments (grouping in sets of 10, and details about the comment) be joined into one?
While this patch is accurate as-is, I had enough comments (especially regarding splitting this into two after rebasing onto the latest upstream) that it is worth seeing a v2.
See this series as a v2 with some additions: https://www.redhat.com/archives/libvir-list/2011-May/msg01427.html Matthias

Replace $calls{$_} with $call in the dispatch bodies generator function. No functional change included. --- daemon/remote_generator.pl | 100 ++++++++++++++++++++++--------------------- 1 files changed, 51 insertions(+), 49 deletions(-) diff --git a/daemon/remote_generator.pl b/daemon/remote_generator.pl index c2468b9..5725583 100755 --- a/daemon/remote_generator.pl +++ b/daemon/remote_generator.pl @@ -272,11 +272,13 @@ elsif ($opt_b) { my @keys = sort (keys %calls); foreach (@keys) { + my $call = $calls{$_}; + # skip things which are REMOTE_MESSAGE - next if $calls{$_}->{msg}; + next if $call->{msg}; # skip procedures not on generate list - next if ! exists($generate{$calls{$_}->{ProcName}}); + next if ! exists($generate{$call->{ProcName}}); my $has_node_device = 0; my @vars_list = (); @@ -288,11 +290,11 @@ elsif ($opt_b) { my @free_list_on_error = ("remoteDispatchError(rerr);"); # handle arguments to the function - if ($calls{$_}->{args} ne "void") { + if ($call->{args} ne "void") { # node device is special, as it's identified by name - if ($calls{$_}->{args} =~ m/^remote_node_device_/ and - !($calls{$_}->{args} =~ m/^remote_node_device_lookup_by_name_/) and - !($calls{$_}->{args} =~ m/^remote_node_device_create_xml_/)) { + if ($call->{args} =~ m/^remote_node_device_/ and + !($call->{args} =~ m/^remote_node_device_lookup_by_name_/) and + !($call->{args} =~ m/^remote_node_device_create_xml_/)) { $has_node_device = 1; push(@vars_list, "virNodeDevicePtr dev = NULL"); push(@getters_list, @@ -304,7 +306,7 @@ elsif ($opt_b) { " virNodeDeviceFree(dev);"); } - foreach my $args_member (@{$calls{$_}->{args_members}}) { + foreach my $args_member (@{$call->{args_members}}) { if ($args_member =~ m/^remote_nonnull_string name;/ and $has_node_device) { # ignore the name arg for node devices next @@ -339,9 +341,9 @@ elsif ($opt_b) { push(@args_list, "conn"); } - if ($calls{$_}->{ProcName} eq "SecretSetValue") { + if ($call->{ProcName} eq "SecretSetValue") { push(@args_list, "(const unsigned char *)args->$2.$2_val"); - } elsif ($calls{$_}->{ProcName} eq "CPUBaseline") { + } elsif ($call->{ProcName} eq "CPUBaseline") { push(@args_list, "(const char **)args->$2.$2_val"); } else { push(@args_list, "args->$2.$2_val"); @@ -395,13 +397,13 @@ elsif ($opt_b) { my $single_ret_list_max_define = "undefined"; my $multi_ret = 0; - if ($calls{$_}->{ret} ne "void" and - scalar(@{$calls{$_}->{ret_members}}) > 1) { + if ($call->{ret} ne "void" and + scalar(@{$call->{ret_members}}) > 1) { $multi_ret = 1; } - if ($calls{$_}->{ret} ne "void") { - foreach my $ret_member (@{$calls{$_}->{ret_members}}) { + if ($call->{ret} ne "void") { + foreach my $ret_member (@{$call->{ret_members}}) { if ($multi_ret) { if ($ret_member =~ m/^(unsigned )?(char|short|int|hyper) (\S+)\[\S+\];/) { push(@ret_list, "memcpy(ret->$3, tmp.$3, sizeof ret->$3);"); @@ -422,7 +424,7 @@ elsif ($opt_b) { $single_ret_list_max_var = "max$1"; $single_ret_list_max_define = $2; - if ($calls{$_}->{ProcName} eq "NodeListDevices") { + if ($call->{ProcName} eq "NodeListDevices") { my $conn = shift(@args_list); my $cap = shift(@args_list); unshift(@args_list, "ret->$1.$1_val"); @@ -470,12 +472,12 @@ elsif ($opt_b) { push(@ret_list, "ret->$1 = $1;"); $single_ret_var = $1; - if ($calls{$_}->{ProcName} =~ m/GetAutostart$/) { + if ($call->{ProcName} =~ m/GetAutostart$/) { $single_ret_by_ref = 1; } else { $single_ret_by_ref = 0; - if ($calls{$_}->{ProcName} eq "CPUCompare") { + if ($call->{ProcName} eq "CPUCompare") { $single_ret_check = " == VIR_CPU_COMPARE_ERROR"; } else { $single_ret_check = " < 0"; @@ -493,7 +495,7 @@ elsif ($opt_b) { my $conn = shift(@args_list); - if ($calls{$_}->{ProcName} eq "NodeGetCellsFreeMemory") { + if ($call->{ProcName} eq "NodeGetCellsFreeMemory") { $single_ret_check = " <= 0"; $single_ret_list_max_var = "maxCells"; unshift(@args_list, "(unsigned long long *)ret->$1.$1_val"); @@ -512,7 +514,7 @@ elsif ($opt_b) { $type_name .= "long"; if ($type_name eq "long" and - $calls{$_}->{ProcName} =~ m/^Get(Lib)?Version$/) { + $call->{ProcName} =~ m/^Get(Lib)?Version$/) { # SPECIAL: virConnectGet(Lib)?Version uses unsigned long # in public API but hyper in XDR protocol $type_name = "unsigned long"; @@ -522,8 +524,8 @@ elsif ($opt_b) { push(@ret_list, "ret->$ret_name = $ret_name;"); $single_ret_var = $ret_name; - if ($calls{$_}->{ProcName} eq "DomainGetMaxMemory" or - $calls{$_}->{ProcName} eq "NodeGetFreeMemory") { + if ($call->{ProcName} eq "DomainGetMaxMemory" or + $call->{ProcName} eq "NodeGetFreeMemory") { # SPECIAL: virDomainGetMaxMemory and virNodeGetFreeMemory # return the actual value directly and 0 indicates # an error @@ -546,17 +548,17 @@ elsif ($opt_b) { push(@args_list, "conn"); } - my $struct_name = $calls{$_}->{ProcName}; + my $struct_name = $call->{ProcName}; $struct_name =~ s/Get//; - if ($calls{$_}->{ProcName} eq "DomainGetBlockInfo") { + if ($call->{ProcName} eq "DomainGetBlockInfo") { # SPECIAL: virDomainGetBlockInfo has flags parameter after # the struct parameter in its signature my $flags = pop(@args_list); push(@args_list, "&tmp"); push(@args_list, $flags); - } elsif ($calls{$_}->{ProcName} eq "DomainBlockStats" || - $calls{$_}->{ProcName} eq "DomainInterfaceStats") { + } elsif ($call->{ProcName} eq "DomainBlockStats" || + $call->{ProcName} eq "DomainInterfaceStats") { # SPECIAL: virDomainBlockStats and virDomainInterfaceStats # have a 'Struct' suffix on the actual struct name # and take the struct size as additional argument @@ -570,11 +572,11 @@ elsif ($opt_b) { push(@vars_list, "vir$struct_name tmp"); } - if ($calls{$_}->{streamflag} ne "none") { + if ($call->{streamflag} ne "none") { my $first_arg = shift(@args_list); my $second_arg; - if ($calls{$_}->{ProcName} eq "DomainOpenConsole") { + if ($call->{ProcName} eq "DomainOpenConsole") { # SPECIAL: virDomainOpenConsole differs and takes the stream # as third argument instead of the second $second_arg = shift(@args_list); @@ -597,22 +599,22 @@ elsif ($opt_b) { # print functions signature print "\n"; print "static int\n"; - print "${structprefix}Dispatch$calls{$_}->{ProcName}(\n"; + print "${structprefix}Dispatch$call->{ProcName}(\n"; print " struct qemud_server *server ATTRIBUTE_UNUSED,\n"; print " struct qemud_client *client ATTRIBUTE_UNUSED,\n"; print " virConnectPtr conn,\n"; print " remote_message_header *hdr ATTRIBUTE_UNUSED,\n"; print " remote_error *rerr,\n"; - print " $calls{$_}->{args} *args"; + print " $call->{args} *args"; - if ($calls{$_}->{args} eq "void") { + if ($call->{args} eq "void") { print " ATTRIBUTE_UNUSED" } print ",\n"; - print " $calls{$_}->{ret} *ret"; + print " $call->{ret} *ret"; - if ($calls{$_}->{ret} eq "void") { + if ($call->{ret} eq "void") { print " ATTRIBUTE_UNUSED" } @@ -626,7 +628,7 @@ elsif ($opt_b) { print " $var;\n"; } - if ($calls{$_}->{streamflag} ne "none") { + if ($call->{streamflag} ne "none") { print " struct qemud_client_stream *stream = NULL;\n"; } @@ -660,42 +662,42 @@ elsif ($opt_b) { print "\n"; } - if ($calls{$_}->{streamflag} ne "none") { + if ($call->{streamflag} ne "none") { print " if (!(stream = remoteCreateClientStream(conn, hdr)))\n"; print " goto cleanup;\n"; print "\n"; } - if ($calls{$_}->{ret} eq "void") { - print " if (vir$calls{$_}->{ProcName}("; + if ($call->{ret} eq "void") { + print " if (vir$call->{ProcName}("; print join(', ', @args_list); print ") < 0)\n"; print " goto cleanup;\n"; print "\n"; } elsif (!$multi_ret) { my $prefix = ""; - my $proc_name = $calls{$_}->{ProcName}; + my $proc_name = $call->{ProcName}; if (! @args_list) { push(@args_list, "conn"); - if ($calls{$_}->{ProcName} ne "NodeGetFreeMemory") { + if ($call->{ProcName} ne "NodeGetFreeMemory") { $prefix = "Connect" } } - if ($calls{$_}->{ProcName} eq "GetSysinfo" or - $calls{$_}->{ProcName} eq "GetMaxVcpus" or - $calls{$_}->{ProcName} eq "DomainXMLFromNative" or - $calls{$_}->{ProcName} eq "DomainXMLToNative" or - $calls{$_}->{ProcName} eq "FindStoragePoolSources" or - $calls{$_}->{ProcName} =~ m/^List/) { + if ($call->{ProcName} eq "GetSysinfo" or + $call->{ProcName} eq "GetMaxVcpus" or + $call->{ProcName} eq "DomainXMLFromNative" or + $call->{ProcName} eq "DomainXMLToNative" or + $call->{ProcName} eq "FindStoragePoolSources" or + $call->{ProcName} =~ m/^List/) { $prefix = "Connect" - } elsif ($calls{$_}->{ProcName} eq "SupportsFeature") { + } elsif ($call->{ProcName} eq "SupportsFeature") { $prefix = "Drv" - } elsif ($calls{$_}->{ProcName} eq "CPUBaseline") { + } elsif ($call->{ProcName} eq "CPUBaseline") { $proc_name = "ConnectBaselineCPU" - } elsif ($calls{$_}->{ProcName} eq "CPUCompare") { + } elsif ($call->{ProcName} eq "CPUCompare") { $proc_name = "ConnectCompareCPU" } @@ -729,7 +731,7 @@ elsif ($opt_b) { print join("\n ", @ret_list); print "\n"; } else { - print " if (vir$calls{$_}->{ProcName}("; + print " if (vir$call->{ProcName}("; print join(', ', @args_list); print ") < 0)\n"; print " goto cleanup;\n"; @@ -743,10 +745,10 @@ elsif ($opt_b) { print "\n"; } - if ($calls{$_}->{streamflag} ne "none") { + if ($call->{streamflag} ne "none") { print " if (remoteAddClientStream(client, stream, "; - if ($calls{$_}->{streamflag} eq "write") { + if ($call->{streamflag} eq "write") { print "0"; } else { print "1"; -- 1.7.0.4

On 05/15/2011 12:23 AM, Matthias Bolte wrote:
Replace $calls{$_} with $call in the dispatch bodies generator function.
No functional change included. --- daemon/remote_generator.pl | 100 ++++++++++++++++++++++--------------------- 1 files changed, 51 insertions(+), 49 deletions(-)
diff --git a/daemon/remote_generator.pl b/daemon/remote_generator.pl index c2468b9..5725583 100755 --- a/daemon/remote_generator.pl +++ b/daemon/remote_generator.pl @@ -272,11 +272,13 @@ elsif ($opt_b) { my @keys = sort (keys %calls);
foreach (@keys) { + my $call = $calls{$_}; + # skip things which are REMOTE_MESSAGE - next if $calls{$_}->{msg}; + next if $call->{msg};
ACK. -- Eric Blake eblake@redhat.com +1-801-349-2682 Libvirt virtualization library http://libvirt.org

2011/5/16 Eric Blake <eblake@redhat.com>:
On 05/15/2011 12:23 AM, Matthias Bolte wrote:
Replace $calls{$_} with $call in the dispatch bodies generator function.
No functional change included. --- daemon/remote_generator.pl | 100 ++++++++++++++++++++++--------------------- 1 files changed, 51 insertions(+), 49 deletions(-)
diff --git a/daemon/remote_generator.pl b/daemon/remote_generator.pl index c2468b9..5725583 100755 --- a/daemon/remote_generator.pl +++ b/daemon/remote_generator.pl @@ -272,11 +272,13 @@ elsif ($opt_b) { my @keys = sort (keys %calls);
foreach (@keys) { + my $call = $calls{$_}; + # skip things which are REMOTE_MESSAGE - next if $calls{$_}->{msg}; + next if $call->{msg};
ACK.
Thanks, pushed. Matthias

On Sun, May 15, 2011 at 08:23:29AM +0200, Matthias Bolte wrote:
Move more functions to the generator and cover stream-using functions. As the stream-usage is not detectable from the .x file directly add additional annotations.
daemon/remote.c | 185 --------------------------- daemon/remote_generator.pl | 211 +++++++++++++++++++++++-------- daemon/stream.c | 7 +- src/driver.h | 2 +- src/libvirt.c | 4 +- src/lxc/lxc_driver.c | 2 +- src/qemu/qemu_driver.c | 2 +- src/remote/remote_driver.c | 288 ------------------------------------------ src/remote/remote_protocol.x | 26 +++-- src/uml/uml_driver.c | 2 +- src/xen/xen_driver.c | 2 +- 11 files changed, 188 insertions(+), 543 deletions(-)
I went through the patch set and didn't detected anything suspicious, but it would be better if someone knowing the remote stubs better actually gave the final ACK. Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@veillard.com | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/
participants (3)
-
Daniel Veillard
-
Eric Blake
-
Matthias Bolte