From b5041a49ecd18077ad65361571d147249a7157e5 Mon Sep 17 00:00:00 2001 From: Matthias Bolte Date: Sat, 23 Apr 2011 23:00:26 +0200 Subject: [PATCH] remote generator, client: Handle functions that return lists --- cfg.mk | 6 + daemon/remote_generator.pl | 93 +++- po/POTFILES.in | 1 + src/remote/remote_client_bodies.c | 786 +++++++++++++++++++++++++++++- src/remote/remote_driver.c | 758 ---------------------------- 5 files changed, 858 insertions(+), 786 deletions(-) diff --git a/cfg.mk b/cfg.mk index ab9db5f672..d80f3d50fc 100644 --- a/cfg.mk +++ b/cfg.mk @@ -590,6 +590,9 @@ exclude_file_name_regexp--sc_avoid_write = \ exclude_file_name_regexp--sc_bindtextdomain = ^(tests|examples)/ +exclude_file_name_regexp--sc_libvirt_unmarked_diagnostics = \ + ^daemon/remote_generator\.pl$$ + exclude_file_name_regexp--sc_po_check = ^(docs/|daemon/remote_generator\.pl$$) exclude_file_name_regexp--sc_prohibit_VIR_ERR_NO_MEMORY = \ @@ -621,6 +624,9 @@ exclude_file_name_regexp--sc_prohibit_gethostname = ^src/util/util\.c$$ exclude_file_name_regexp--sc_prohibit_gettext_noop = ^docs/ +exclude_file_name_regexp--sc_prohibit_newline_at_end_of_diagnostic = \ + ^daemon/remote_generator\.pl$$ + exclude_file_name_regexp--sc_prohibit_nonreentrant = \ ^((po|docs|tests)/|tools/(virsh|console)\.c$$) diff --git a/daemon/remote_generator.pl b/daemon/remote_generator.pl index 163a1b2d56..f104e2115d 100755 --- a/daemon/remote_generator.pl +++ b/daemon/remote_generator.pl @@ -758,29 +758,16 @@ elsif ($opt_k) { "NWFilterDefineXML", # public API and XDR protocol mismatch "DomainMigratePerform", "DomainMigrateFinish2", - "DomainSnapshotListNames", "FindStoragePoolSources", "IsSecure", - "ListDefinedDomains", - "ListDefinedInterfaces", - "ListNWFilters", "SupportsFeature", - "NodeListDevices", "NodeGetCellsFreeMemory", - "ListDefinedNetworks", - "StoragePoolListVolumes", "ListDomains", - "ListStoragePools", "SecretSetValue", "GetURI", - "ListInterfaces", - "ListDefinedStoragePools", "NodeDeviceDettach", - "ListNetworks", - "NodeDeviceListCaps", "NodeDeviceReset", "NodeDeviceReAttach", - "ListSecrets", "DomainBlockPeek", "DomainCreateWithFlags", @@ -928,8 +915,9 @@ elsif ($opt_k) { # fix priv_name for the NumOf* functions if ($priv_name eq "privateData" and - !($call->{ProcName} =~ m/Domains/) and - $call->{ProcName} =~ m/NumOf(Defined|Domain)*(\S+)s/) { + !($call->{ProcName} =~ m/(Domains|DomainSnapshot)/) and + ($call->{ProcName} =~ m/NumOf(Defined|Domain)*(\S+)s/ or + $call->{ProcName} =~ m/List(Defined|Domain)*(\S+)s/)) { my $prefix = lc $2; $prefix =~ s/(pool|vol)$//; $priv_name = "${prefix}PrivateData"; @@ -940,6 +928,11 @@ elsif ($opt_k) { my $call_ret = "&ret"; my $single_ret_var = "int rv = -1"; my $single_ret_type = "int"; + my $single_ret_as_list = 0; + my $single_ret_list_error_msg_type = "undefined"; + my $single_ret_list_name = "undefined"; + my $single_ret_list_max_var = "undefined"; + my $single_ret_list_max_define = "undefined"; my $multi_ret = 0; if ($call->{ret} ne "void" and @@ -964,6 +957,30 @@ elsif ($opt_k) { } else { die "unhandled type for multi-return-value: $ret_member"; } + } elsif ($ret_member =~ m/remote_nonnull_string (\S+)<(\S+)>;/) { + $single_ret_as_list = 1; + $single_ret_list_name = $1; + $single_ret_list_max_var = "max$1"; + $single_ret_list_max_define = $2; + + my $first_arg = shift(@args_list); + my $second_arg; + + if ($call->{ProcName} eq "NodeListDevices") { + $second_arg = shift(@args_list); + } + + unshift(@args_list, "char **const $1"); + + if (defined $second_arg) { + unshift(@args_list, $second_arg); + } + + unshift(@args_list, $first_arg); + + push(@ret_list, "rv = ret.$1.$1_len;"); + $single_ret_var = "int rv = -1"; + $single_ret_type = "int"; } elsif ($ret_member =~ m/remote_nonnull_string (\S+);/) { push(@ret_list, "rv = ret.$1;"); $single_ret_var = "char *rv = NULL"; @@ -1062,9 +1079,23 @@ elsif ($opt_k) { print " $var;\n"; } + if ($single_ret_as_list) { + print " int i;\n"; + } + print "\n"; print " remoteDriverLock(priv);\n"; + if ($single_ret_as_list) { + print "\n"; + print " if ($single_ret_list_max_var > $single_ret_list_max_define) {\n"; + print " remoteError(VIR_ERR_RPC,\n"; + print " _(\"too many remote ${single_ret_list_error_msg_type}s: %d > %d\"),\n"; + print " $single_ret_list_max_var, $single_ret_list_max_define);\n"; + print " goto done;\n"; + print " }\n"; + } + if (@setters_list) { print "\n"; print " "; @@ -1088,6 +1119,32 @@ elsif ($opt_k) { print " goto done;\n"; print "\n"; + if ($single_ret_as_list) { + print " if (ret.$single_ret_list_name.${single_ret_list_name}_len > $single_ret_list_max_var) {\n"; + print " remoteError(VIR_ERR_RPC,\n"; + print " _(\"too many remote ${single_ret_list_error_msg_type}s: %d > %d\"),\n"; + print " ret.$single_ret_list_name.${single_ret_list_name}_len, $single_ret_list_max_var);\n"; + print " goto cleanup;\n"; + print " }\n"; + print "\n"; + print " /* This call is caller-frees (although that isn't clear from\n"; + print " * the documentation). However xdr_free will free up both the\n"; + print " * names and the list of pointers, so we have to strdup the\n"; + print " * names here. */\n"; + print " for (i = 0; i < ret.$single_ret_list_name.${single_ret_list_name}_len; ++i) {\n"; + print " ${single_ret_list_name}[i] = strdup(ret.$single_ret_list_name.${single_ret_list_name}_val[i]);\n"; + print "\n"; + print " if (${single_ret_list_name}[i] == NULL) {\n"; + print " for (--i; i >= 0; --i)\n"; + print " VIR_FREE(${single_ret_list_name}[i]);\n"; + print "\n"; + print " virReportOOMError();\n"; + print " goto cleanup;\n"; + print " }\n"; + print " }\n"; + print "\n"; + } + if (@ret_list) { print " "; print join("\n ", @ret_list); @@ -1098,6 +1155,12 @@ elsif ($opt_k) { print " rv = 0;\n"; } + if ($single_ret_as_list) { + print "\n"; + print "cleanup:\n"; + print " xdr_free((xdrproc_t)xdr_remote_$call->{name}_ret, (char *)&ret);\n"; + } + print "\n"; print "done:\n"; print " remoteDriverUnlock(priv);\n"; diff --git a/po/POTFILES.in b/po/POTFILES.in index a3347bf7c6..8ecb6a0bed 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -64,6 +64,7 @@ src/qemu/qemu_monitor.c src/qemu/qemu_monitor_json.c src/qemu/qemu_monitor_text.c src/qemu/qemu_process.c +src/remote/remote_client_bodies.c src/remote/remote_driver.c src/secret/secret_driver.c src/security/security_apparmor.c diff --git a/src/remote/remote_client_bodies.c b/src/remote/remote_client_bodies.c index ef08b9cbb3..d00b62967c 100644 --- a/src/remote/remote_client_bodies.c +++ b/src/remote/remote_client_bodies.c @@ -1330,7 +1330,67 @@ done: return rv; } -/* remoteDispatchDomainSnapshotListNames has to be implemented manually */ +static int +remoteDomainSnapshotListNames(virDomainPtr dom, char **const names, int maxnames, unsigned int flags) +{ + int rv = -1; + struct private_data *priv = dom->conn->privateData; + remote_domain_snapshot_list_names_args args; + remote_domain_snapshot_list_names_ret ret; + int i; + + remoteDriverLock(priv); + + if (maxnames > REMOTE_DOMAIN_SNAPSHOT_LIST_NAMES_MAX) { + remoteError(VIR_ERR_RPC, + _("too many remote undefined names: %d > %d"), + maxnames, REMOTE_DOMAIN_SNAPSHOT_LIST_NAMES_MAX); + goto done; + } + + make_nonnull_domain(&args.dom, dom); + args.maxnames = maxnames; + args.flags = flags; + + memset(&ret, 0, sizeof ret); + + if (call(dom->conn, priv, 0, REMOTE_PROC_DOMAIN_SNAPSHOT_LIST_NAMES, + (xdrproc_t)xdr_remote_domain_snapshot_list_names_args, (char *)&args, + (xdrproc_t)xdr_remote_domain_snapshot_list_names_ret, (char *)&ret) == -1) + goto done; + + if (ret.names.names_len > maxnames) { + remoteError(VIR_ERR_RPC, + _("too many remote undefineds: %d > %d"), + ret.names.names_len, maxnames); + goto cleanup; + } + + /* This call is caller-frees (although that isn't clear from + * the documentation). However xdr_free will free up both the + * names and the list of pointers, so we have to strdup the + * names here. */ + for (i = 0; i < ret.names.names_len; ++i) { + names[i] = strdup(ret.names.names_val[i]); + + if (names[i] == NULL) { + for (--i; i >= 0; --i) + VIR_FREE(names[i]); + + virReportOOMError(); + goto cleanup; + } + } + + rv = ret.names.names_len; + +cleanup: + xdr_free((xdrproc_t)xdr_remote_domain_snapshot_list_names_ret, (char *)&ret); + +done: + remoteDriverUnlock(priv); + return rv; +} static virDomainSnapshotPtr remoteDomainSnapshotLookupByName(virDomainPtr dom, const char *name, unsigned int flags) @@ -1875,25 +1935,547 @@ done: /* remoteDispatchIsSecure has to be implemented manually */ -/* remoteDispatchListDefinedDomains has to be implemented manually */ +static int +remoteListDefinedDomains(virConnectPtr conn, char **const names, int maxnames) +{ + int rv = -1; + struct private_data *priv = conn->privateData; + remote_list_defined_domains_args args; + remote_list_defined_domains_ret ret; + int i; -/* remoteDispatchListDefinedInterfaces has to be implemented manually */ + remoteDriverLock(priv); -/* remoteDispatchListDefinedNetworks has to be implemented manually */ + if (maxnames > REMOTE_DOMAIN_NAME_LIST_MAX) { + remoteError(VIR_ERR_RPC, + _("too many remote undefined names: %d > %d"), + maxnames, REMOTE_DOMAIN_NAME_LIST_MAX); + goto done; + } -/* remoteDispatchListDefinedStoragePools has to be implemented manually */ + args.maxnames = maxnames; + + memset(&ret, 0, sizeof ret); + + if (call(conn, priv, 0, REMOTE_PROC_LIST_DEFINED_DOMAINS, + (xdrproc_t)xdr_remote_list_defined_domains_args, (char *)&args, + (xdrproc_t)xdr_remote_list_defined_domains_ret, (char *)&ret) == -1) + goto done; + + if (ret.names.names_len > maxnames) { + remoteError(VIR_ERR_RPC, + _("too many remote undefineds: %d > %d"), + ret.names.names_len, maxnames); + goto cleanup; + } + + /* This call is caller-frees (although that isn't clear from + * the documentation). However xdr_free will free up both the + * names and the list of pointers, so we have to strdup the + * names here. */ + for (i = 0; i < ret.names.names_len; ++i) { + names[i] = strdup(ret.names.names_val[i]); + + if (names[i] == NULL) { + for (--i; i >= 0; --i) + VIR_FREE(names[i]); + + virReportOOMError(); + goto cleanup; + } + } + + rv = ret.names.names_len; + +cleanup: + xdr_free((xdrproc_t)xdr_remote_list_defined_domains_ret, (char *)&ret); + +done: + remoteDriverUnlock(priv); + return rv; +} + +static int +remoteListDefinedInterfaces(virConnectPtr conn, char **const names, int maxnames) +{ + int rv = -1; + struct private_data *priv = conn->interfacePrivateData; + remote_list_defined_interfaces_args args; + remote_list_defined_interfaces_ret ret; + int i; + + remoteDriverLock(priv); + + if (maxnames > REMOTE_DEFINED_INTERFACE_NAME_LIST_MAX) { + remoteError(VIR_ERR_RPC, + _("too many remote undefined names: %d > %d"), + maxnames, REMOTE_DEFINED_INTERFACE_NAME_LIST_MAX); + goto done; + } + + args.maxnames = maxnames; + + memset(&ret, 0, sizeof ret); + + if (call(conn, priv, 0, REMOTE_PROC_LIST_DEFINED_INTERFACES, + (xdrproc_t)xdr_remote_list_defined_interfaces_args, (char *)&args, + (xdrproc_t)xdr_remote_list_defined_interfaces_ret, (char *)&ret) == -1) + goto done; + + if (ret.names.names_len > maxnames) { + remoteError(VIR_ERR_RPC, + _("too many remote undefineds: %d > %d"), + ret.names.names_len, maxnames); + goto cleanup; + } + + /* This call is caller-frees (although that isn't clear from + * the documentation). However xdr_free will free up both the + * names and the list of pointers, so we have to strdup the + * names here. */ + for (i = 0; i < ret.names.names_len; ++i) { + names[i] = strdup(ret.names.names_val[i]); + + if (names[i] == NULL) { + for (--i; i >= 0; --i) + VIR_FREE(names[i]); + + virReportOOMError(); + goto cleanup; + } + } + + rv = ret.names.names_len; + +cleanup: + xdr_free((xdrproc_t)xdr_remote_list_defined_interfaces_ret, (char *)&ret); + +done: + remoteDriverUnlock(priv); + return rv; +} + +static int +remoteListDefinedNetworks(virConnectPtr conn, char **const names, int maxnames) +{ + int rv = -1; + struct private_data *priv = conn->networkPrivateData; + remote_list_defined_networks_args args; + remote_list_defined_networks_ret ret; + int i; + + remoteDriverLock(priv); + + if (maxnames > REMOTE_NETWORK_NAME_LIST_MAX) { + remoteError(VIR_ERR_RPC, + _("too many remote undefined names: %d > %d"), + maxnames, REMOTE_NETWORK_NAME_LIST_MAX); + goto done; + } + + args.maxnames = maxnames; + + memset(&ret, 0, sizeof ret); + + if (call(conn, priv, 0, REMOTE_PROC_LIST_DEFINED_NETWORKS, + (xdrproc_t)xdr_remote_list_defined_networks_args, (char *)&args, + (xdrproc_t)xdr_remote_list_defined_networks_ret, (char *)&ret) == -1) + goto done; + + if (ret.names.names_len > maxnames) { + remoteError(VIR_ERR_RPC, + _("too many remote undefineds: %d > %d"), + ret.names.names_len, maxnames); + goto cleanup; + } + + /* This call is caller-frees (although that isn't clear from + * the documentation). However xdr_free will free up both the + * names and the list of pointers, so we have to strdup the + * names here. */ + for (i = 0; i < ret.names.names_len; ++i) { + names[i] = strdup(ret.names.names_val[i]); + + if (names[i] == NULL) { + for (--i; i >= 0; --i) + VIR_FREE(names[i]); + + virReportOOMError(); + goto cleanup; + } + } + + rv = ret.names.names_len; + +cleanup: + xdr_free((xdrproc_t)xdr_remote_list_defined_networks_ret, (char *)&ret); + +done: + remoteDriverUnlock(priv); + return rv; +} + +static int +remoteListDefinedStoragePools(virConnectPtr conn, char **const names, int maxnames) +{ + int rv = -1; + struct private_data *priv = conn->storagePrivateData; + remote_list_defined_storage_pools_args args; + remote_list_defined_storage_pools_ret ret; + int i; + + remoteDriverLock(priv); + + if (maxnames > REMOTE_STORAGE_POOL_NAME_LIST_MAX) { + remoteError(VIR_ERR_RPC, + _("too many remote undefined names: %d > %d"), + maxnames, REMOTE_STORAGE_POOL_NAME_LIST_MAX); + goto done; + } + + args.maxnames = maxnames; + + memset(&ret, 0, sizeof ret); + + if (call(conn, priv, 0, REMOTE_PROC_LIST_DEFINED_STORAGE_POOLS, + (xdrproc_t)xdr_remote_list_defined_storage_pools_args, (char *)&args, + (xdrproc_t)xdr_remote_list_defined_storage_pools_ret, (char *)&ret) == -1) + goto done; + + if (ret.names.names_len > maxnames) { + remoteError(VIR_ERR_RPC, + _("too many remote undefineds: %d > %d"), + ret.names.names_len, maxnames); + goto cleanup; + } + + /* This call is caller-frees (although that isn't clear from + * the documentation). However xdr_free will free up both the + * names and the list of pointers, so we have to strdup the + * names here. */ + for (i = 0; i < ret.names.names_len; ++i) { + names[i] = strdup(ret.names.names_val[i]); + + if (names[i] == NULL) { + for (--i; i >= 0; --i) + VIR_FREE(names[i]); + + virReportOOMError(); + goto cleanup; + } + } + + rv = ret.names.names_len; + +cleanup: + xdr_free((xdrproc_t)xdr_remote_list_defined_storage_pools_ret, (char *)&ret); + +done: + remoteDriverUnlock(priv); + return rv; +} /* remoteDispatchListDomains has to be implemented manually */ -/* remoteDispatchListInterfaces has to be implemented manually */ +static int +remoteListInterfaces(virConnectPtr conn, char **const names, int maxnames) +{ + int rv = -1; + struct private_data *priv = conn->interfacePrivateData; + remote_list_interfaces_args args; + remote_list_interfaces_ret ret; + int i; -/* remoteDispatchListNetworks has to be implemented manually */ + remoteDriverLock(priv); -/* remoteDispatchListNWFilters has to be implemented manually */ + if (maxnames > REMOTE_INTERFACE_NAME_LIST_MAX) { + remoteError(VIR_ERR_RPC, + _("too many remote undefined names: %d > %d"), + maxnames, REMOTE_INTERFACE_NAME_LIST_MAX); + goto done; + } -/* remoteDispatchListSecrets has to be implemented manually */ + args.maxnames = maxnames; -/* remoteDispatchListStoragePools has to be implemented manually */ + memset(&ret, 0, sizeof ret); + + if (call(conn, priv, 0, REMOTE_PROC_LIST_INTERFACES, + (xdrproc_t)xdr_remote_list_interfaces_args, (char *)&args, + (xdrproc_t)xdr_remote_list_interfaces_ret, (char *)&ret) == -1) + goto done; + + if (ret.names.names_len > maxnames) { + remoteError(VIR_ERR_RPC, + _("too many remote undefineds: %d > %d"), + ret.names.names_len, maxnames); + goto cleanup; + } + + /* This call is caller-frees (although that isn't clear from + * the documentation). However xdr_free will free up both the + * names and the list of pointers, so we have to strdup the + * names here. */ + for (i = 0; i < ret.names.names_len; ++i) { + names[i] = strdup(ret.names.names_val[i]); + + if (names[i] == NULL) { + for (--i; i >= 0; --i) + VIR_FREE(names[i]); + + virReportOOMError(); + goto cleanup; + } + } + + rv = ret.names.names_len; + +cleanup: + xdr_free((xdrproc_t)xdr_remote_list_interfaces_ret, (char *)&ret); + +done: + remoteDriverUnlock(priv); + return rv; +} + +static int +remoteListNetworks(virConnectPtr conn, char **const names, int maxnames) +{ + int rv = -1; + struct private_data *priv = conn->networkPrivateData; + remote_list_networks_args args; + remote_list_networks_ret ret; + int i; + + remoteDriverLock(priv); + + if (maxnames > REMOTE_NETWORK_NAME_LIST_MAX) { + remoteError(VIR_ERR_RPC, + _("too many remote undefined names: %d > %d"), + maxnames, REMOTE_NETWORK_NAME_LIST_MAX); + goto done; + } + + args.maxnames = maxnames; + + memset(&ret, 0, sizeof ret); + + if (call(conn, priv, 0, REMOTE_PROC_LIST_NETWORKS, + (xdrproc_t)xdr_remote_list_networks_args, (char *)&args, + (xdrproc_t)xdr_remote_list_networks_ret, (char *)&ret) == -1) + goto done; + + if (ret.names.names_len > maxnames) { + remoteError(VIR_ERR_RPC, + _("too many remote undefineds: %d > %d"), + ret.names.names_len, maxnames); + goto cleanup; + } + + /* This call is caller-frees (although that isn't clear from + * the documentation). However xdr_free will free up both the + * names and the list of pointers, so we have to strdup the + * names here. */ + for (i = 0; i < ret.names.names_len; ++i) { + names[i] = strdup(ret.names.names_val[i]); + + if (names[i] == NULL) { + for (--i; i >= 0; --i) + VIR_FREE(names[i]); + + virReportOOMError(); + goto cleanup; + } + } + + rv = ret.names.names_len; + +cleanup: + xdr_free((xdrproc_t)xdr_remote_list_networks_ret, (char *)&ret); + +done: + remoteDriverUnlock(priv); + return rv; +} + +static int +remoteListNWFilters(virConnectPtr conn, char **const names, int maxnames) +{ + int rv = -1; + struct private_data *priv = conn->nwfilterPrivateData; + remote_list_nwfilters_args args; + remote_list_nwfilters_ret ret; + int i; + + remoteDriverLock(priv); + + if (maxnames > REMOTE_NWFILTER_NAME_LIST_MAX) { + remoteError(VIR_ERR_RPC, + _("too many remote undefined names: %d > %d"), + maxnames, REMOTE_NWFILTER_NAME_LIST_MAX); + goto done; + } + + args.maxnames = maxnames; + + memset(&ret, 0, sizeof ret); + + if (call(conn, priv, 0, REMOTE_PROC_LIST_NWFILTERS, + (xdrproc_t)xdr_remote_list_nwfilters_args, (char *)&args, + (xdrproc_t)xdr_remote_list_nwfilters_ret, (char *)&ret) == -1) + goto done; + + if (ret.names.names_len > maxnames) { + remoteError(VIR_ERR_RPC, + _("too many remote undefineds: %d > %d"), + ret.names.names_len, maxnames); + goto cleanup; + } + + /* This call is caller-frees (although that isn't clear from + * the documentation). However xdr_free will free up both the + * names and the list of pointers, so we have to strdup the + * names here. */ + for (i = 0; i < ret.names.names_len; ++i) { + names[i] = strdup(ret.names.names_val[i]); + + if (names[i] == NULL) { + for (--i; i >= 0; --i) + VIR_FREE(names[i]); + + virReportOOMError(); + goto cleanup; + } + } + + rv = ret.names.names_len; + +cleanup: + xdr_free((xdrproc_t)xdr_remote_list_nwfilters_ret, (char *)&ret); + +done: + remoteDriverUnlock(priv); + return rv; +} + +static int +remoteListSecrets(virConnectPtr conn, char **const uuids, int maxuuids) +{ + int rv = -1; + struct private_data *priv = conn->secretPrivateData; + remote_list_secrets_args args; + remote_list_secrets_ret ret; + int i; + + remoteDriverLock(priv); + + if (maxuuids > REMOTE_SECRET_UUID_LIST_MAX) { + remoteError(VIR_ERR_RPC, + _("too many remote undefined uuids: %d > %d"), + maxuuids, REMOTE_SECRET_UUID_LIST_MAX); + goto done; + } + + args.maxuuids = maxuuids; + + memset(&ret, 0, sizeof ret); + + if (call(conn, priv, 0, REMOTE_PROC_LIST_SECRETS, + (xdrproc_t)xdr_remote_list_secrets_args, (char *)&args, + (xdrproc_t)xdr_remote_list_secrets_ret, (char *)&ret) == -1) + goto done; + + if (ret.uuids.uuids_len > maxuuids) { + remoteError(VIR_ERR_RPC, + _("too many remote undefineds: %d > %d"), + ret.uuids.uuids_len, maxuuids); + goto cleanup; + } + + /* This call is caller-frees (although that isn't clear from + * the documentation). However xdr_free will free up both the + * names and the list of pointers, so we have to strdup the + * names here. */ + for (i = 0; i < ret.uuids.uuids_len; ++i) { + uuids[i] = strdup(ret.uuids.uuids_val[i]); + + if (uuids[i] == NULL) { + for (--i; i >= 0; --i) + VIR_FREE(uuids[i]); + + virReportOOMError(); + goto cleanup; + } + } + + rv = ret.uuids.uuids_len; + +cleanup: + xdr_free((xdrproc_t)xdr_remote_list_secrets_ret, (char *)&ret); + +done: + remoteDriverUnlock(priv); + return rv; +} + +static int +remoteListStoragePools(virConnectPtr conn, char **const names, int maxnames) +{ + int rv = -1; + struct private_data *priv = conn->storagePrivateData; + remote_list_storage_pools_args args; + remote_list_storage_pools_ret ret; + int i; + + remoteDriverLock(priv); + + if (maxnames > REMOTE_STORAGE_POOL_NAME_LIST_MAX) { + remoteError(VIR_ERR_RPC, + _("too many remote undefined names: %d > %d"), + maxnames, REMOTE_STORAGE_POOL_NAME_LIST_MAX); + goto done; + } + + args.maxnames = maxnames; + + memset(&ret, 0, sizeof ret); + + if (call(conn, priv, 0, REMOTE_PROC_LIST_STORAGE_POOLS, + (xdrproc_t)xdr_remote_list_storage_pools_args, (char *)&args, + (xdrproc_t)xdr_remote_list_storage_pools_ret, (char *)&ret) == -1) + goto done; + + if (ret.names.names_len > maxnames) { + remoteError(VIR_ERR_RPC, + _("too many remote undefineds: %d > %d"), + ret.names.names_len, maxnames); + goto cleanup; + } + + /* This call is caller-frees (although that isn't clear from + * the documentation). However xdr_free will free up both the + * names and the list of pointers, so we have to strdup the + * names here. */ + for (i = 0; i < ret.names.names_len; ++i) { + names[i] = strdup(ret.names.names_val[i]); + + if (names[i] == NULL) { + for (--i; i >= 0; --i) + VIR_FREE(names[i]); + + virReportOOMError(); + goto cleanup; + } + } + + rv = ret.names.names_len; + +cleanup: + xdr_free((xdrproc_t)xdr_remote_list_storage_pools_ret, (char *)&ret); + +done: + remoteDriverUnlock(priv); + return rv; +} static int remoteNetworkCreate(virNetworkPtr net) @@ -2310,7 +2892,66 @@ done: /* remoteDispatchNodeDeviceGetParent has to be implemented manually */ -/* remoteDispatchNodeDeviceListCaps has to be implemented manually */ +static int +remoteNodeDeviceListCaps(virNodeDevicePtr dev, char **const names, int maxnames) +{ + int rv = -1; + struct private_data *priv = dev->conn->devMonPrivateData; + remote_node_device_list_caps_args args; + remote_node_device_list_caps_ret ret; + int i; + + remoteDriverLock(priv); + + if (maxnames > REMOTE_NODE_DEVICE_CAPS_LIST_MAX) { + remoteError(VIR_ERR_RPC, + _("too many remote undefined names: %d > %d"), + maxnames, REMOTE_NODE_DEVICE_CAPS_LIST_MAX); + goto done; + } + + args.name = dev->name; + args.maxnames = maxnames; + + memset(&ret, 0, sizeof ret); + + if (call(dev->conn, priv, 0, REMOTE_PROC_NODE_DEVICE_LIST_CAPS, + (xdrproc_t)xdr_remote_node_device_list_caps_args, (char *)&args, + (xdrproc_t)xdr_remote_node_device_list_caps_ret, (char *)&ret) == -1) + goto done; + + if (ret.names.names_len > maxnames) { + remoteError(VIR_ERR_RPC, + _("too many remote undefineds: %d > %d"), + ret.names.names_len, maxnames); + goto cleanup; + } + + /* This call is caller-frees (although that isn't clear from + * the documentation). However xdr_free will free up both the + * names and the list of pointers, so we have to strdup the + * names here. */ + for (i = 0; i < ret.names.names_len; ++i) { + names[i] = strdup(ret.names.names_val[i]); + + if (names[i] == NULL) { + for (--i; i >= 0; --i) + VIR_FREE(names[i]); + + virReportOOMError(); + goto cleanup; + } + } + + rv = ret.names.names_len; + +cleanup: + xdr_free((xdrproc_t)xdr_remote_node_device_list_caps_ret, (char *)&ret); + +done: + remoteDriverUnlock(priv); + return rv; +} static virNodeDevicePtr remoteNodeDeviceLookupByName(virConnectPtr conn, const char *name) @@ -2427,7 +3068,67 @@ done: /* remoteDispatchNodeGetSecurityModel has to be implemented manually */ -/* remoteDispatchNodeListDevices has to be implemented manually */ +static int +remoteNodeListDevices(virConnectPtr conn, const char *cap, char **const names, int maxnames, unsigned int flags) +{ + int rv = -1; + struct private_data *priv = conn->devMonPrivateData; + remote_node_list_devices_args args; + remote_node_list_devices_ret ret; + int i; + + remoteDriverLock(priv); + + if (maxnames > REMOTE_NODE_DEVICE_NAME_LIST_MAX) { + remoteError(VIR_ERR_RPC, + _("too many remote undefined names: %d > %d"), + maxnames, REMOTE_NODE_DEVICE_NAME_LIST_MAX); + goto done; + } + + args.cap = cap ? (char **)&cap : NULL; + args.maxnames = maxnames; + args.flags = flags; + + memset(&ret, 0, sizeof ret); + + if (call(conn, priv, 0, REMOTE_PROC_NODE_LIST_DEVICES, + (xdrproc_t)xdr_remote_node_list_devices_args, (char *)&args, + (xdrproc_t)xdr_remote_node_list_devices_ret, (char *)&ret) == -1) + goto done; + + if (ret.names.names_len > maxnames) { + remoteError(VIR_ERR_RPC, + _("too many remote undefineds: %d > %d"), + ret.names.names_len, maxnames); + goto cleanup; + } + + /* This call is caller-frees (although that isn't clear from + * the documentation). However xdr_free will free up both the + * names and the list of pointers, so we have to strdup the + * names here. */ + for (i = 0; i < ret.names.names_len; ++i) { + names[i] = strdup(ret.names.names_val[i]); + + if (names[i] == NULL) { + for (--i; i >= 0; --i) + VIR_FREE(names[i]); + + virReportOOMError(); + goto cleanup; + } + } + + rv = ret.names.names_len; + +cleanup: + xdr_free((xdrproc_t)xdr_remote_node_list_devices_ret, (char *)&ret); + +done: + remoteDriverUnlock(priv); + return rv; +} static int remoteNodeNumOfDevices(virConnectPtr conn, const char *cap, unsigned int flags) @@ -3218,7 +3919,66 @@ done: return rv; } -/* remoteDispatchStoragePoolListVolumes has to be implemented manually */ +static int +remoteStoragePoolListVolumes(virStoragePoolPtr pool, char **const names, int maxnames) +{ + int rv = -1; + struct private_data *priv = pool->conn->storagePrivateData; + remote_storage_pool_list_volumes_args args; + remote_storage_pool_list_volumes_ret ret; + int i; + + remoteDriverLock(priv); + + if (maxnames > REMOTE_STORAGE_VOL_NAME_LIST_MAX) { + remoteError(VIR_ERR_RPC, + _("too many remote undefined names: %d > %d"), + maxnames, REMOTE_STORAGE_VOL_NAME_LIST_MAX); + goto done; + } + + make_nonnull_storage_pool(&args.pool, pool); + args.maxnames = maxnames; + + memset(&ret, 0, sizeof ret); + + if (call(pool->conn, priv, 0, REMOTE_PROC_STORAGE_POOL_LIST_VOLUMES, + (xdrproc_t)xdr_remote_storage_pool_list_volumes_args, (char *)&args, + (xdrproc_t)xdr_remote_storage_pool_list_volumes_ret, (char *)&ret) == -1) + goto done; + + if (ret.names.names_len > maxnames) { + remoteError(VIR_ERR_RPC, + _("too many remote undefineds: %d > %d"), + ret.names.names_len, maxnames); + goto cleanup; + } + + /* This call is caller-frees (although that isn't clear from + * the documentation). However xdr_free will free up both the + * names and the list of pointers, so we have to strdup the + * names here. */ + for (i = 0; i < ret.names.names_len; ++i) { + names[i] = strdup(ret.names.names_val[i]); + + if (names[i] == NULL) { + for (--i; i >= 0; --i) + VIR_FREE(names[i]); + + virReportOOMError(); + goto cleanup; + } + } + + rv = ret.names.names_len; + +cleanup: + xdr_free((xdrproc_t)xdr_remote_storage_pool_list_volumes_ret, (char *)&ret); + +done: + remoteDriverUnlock(priv); + return rv; +} static virStoragePoolPtr remoteStoragePoolLookupByName(virConnectPtr conn, const char *name) diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c index fd9b859393..e78adf0af6 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -2606,65 +2606,6 @@ done: return ddom; } -static int -remoteListDefinedDomains (virConnectPtr conn, char **const names, int maxnames) -{ - int rv = -1; - int i; - remote_list_defined_domains_args args; - remote_list_defined_domains_ret ret; - struct private_data *priv = conn->privateData; - - remoteDriverLock(priv); - - if (maxnames > REMOTE_DOMAIN_NAME_LIST_MAX) { - remoteError(VIR_ERR_RPC, - _("too many remote domain names: %d > %d"), - maxnames, REMOTE_DOMAIN_NAME_LIST_MAX); - goto done; - } - args.maxnames = maxnames; - - memset (&ret, 0, sizeof ret); - if (call (conn, priv, 0, REMOTE_PROC_LIST_DEFINED_DOMAINS, - (xdrproc_t) xdr_remote_list_defined_domains_args, (char *) &args, - (xdrproc_t) xdr_remote_list_defined_domains_ret, (char *) &ret) == -1) - goto done; - - if (ret.names.names_len > maxnames) { - remoteError(VIR_ERR_RPC, - _("too many remote domain names: %d > %d"), - ret.names.names_len, maxnames); - goto cleanup; - } - - /* This call is caller-frees (although that isn't clear from - * the documentation). However xdr_free will free up both the - * names and the list of pointers, so we have to strdup the - * names here. - */ - for (i = 0; i < ret.names.names_len; ++i) { - names[i] = strdup (ret.names.names_val[i]); - - if (names[i] == NULL) { - for (--i; i >= 0; --i) - VIR_FREE(names[i]); - - virReportOOMError(); - goto cleanup; - } - } - - rv = ret.names.names_len; - -cleanup: - xdr_free ((xdrproc_t) xdr_remote_list_defined_domains_ret, (char *) &ret); - -done: - remoteDriverUnlock(priv); - return rv; -} - static int remoteDomainCreate (virDomainPtr domain) { @@ -3122,125 +3063,6 @@ remoteNetworkClose(virConnectPtr conn) return remoteGenericClose(conn, &conn->networkPrivateData); } -static int -remoteListNetworks (virConnectPtr conn, char **const names, int maxnames) -{ - int rv = -1; - int i; - remote_list_networks_args args; - remote_list_networks_ret ret; - struct private_data *priv = conn->networkPrivateData; - - remoteDriverLock(priv); - - if (maxnames > REMOTE_NETWORK_NAME_LIST_MAX) { - remoteError(VIR_ERR_RPC, - _("too many remote networks: %d > %d"), - maxnames, REMOTE_NETWORK_NAME_LIST_MAX); - goto done; - } - args.maxnames = maxnames; - - memset (&ret, 0, sizeof ret); - if (call (conn, priv, 0, REMOTE_PROC_LIST_NETWORKS, - (xdrproc_t) xdr_remote_list_networks_args, (char *) &args, - (xdrproc_t) xdr_remote_list_networks_ret, (char *) &ret) == -1) - goto done; - - if (ret.names.names_len > maxnames) { - remoteError(VIR_ERR_RPC, - _("too many remote networks: %d > %d"), - ret.names.names_len, maxnames); - goto cleanup; - } - - /* This call is caller-frees (although that isn't clear from - * the documentation). However xdr_free will free up both the - * names and the list of pointers, so we have to strdup the - * names here. - */ - for (i = 0; i < ret.names.names_len; ++i) { - names[i] = strdup (ret.names.names_val[i]); - - if (names[i] == NULL) { - for (--i; i >= 0; --i) - VIR_FREE(names[i]); - - virReportOOMError(); - goto cleanup; - } - } - - rv = ret.names.names_len; - -cleanup: - xdr_free ((xdrproc_t) xdr_remote_list_networks_ret, (char *) &ret); - -done: - remoteDriverUnlock(priv); - return rv; -} - -static int -remoteListDefinedNetworks (virConnectPtr conn, - char **const names, int maxnames) -{ - int rv = -1; - int i; - remote_list_defined_networks_args args; - remote_list_defined_networks_ret ret; - struct private_data *priv = conn->networkPrivateData; - - remoteDriverLock(priv); - - if (maxnames > REMOTE_NETWORK_NAME_LIST_MAX) { - remoteError(VIR_ERR_RPC, - _("too many remote networks: %d > %d"), - maxnames, REMOTE_NETWORK_NAME_LIST_MAX); - goto done; - } - args.maxnames = maxnames; - - memset (&ret, 0, sizeof ret); - if (call (conn, priv, 0, REMOTE_PROC_LIST_DEFINED_NETWORKS, - (xdrproc_t) xdr_remote_list_defined_networks_args, (char *) &args, - (xdrproc_t) xdr_remote_list_defined_networks_ret, (char *) &ret) == -1) - goto done; - - if (ret.names.names_len > maxnames) { - remoteError(VIR_ERR_RPC, - _("too many remote networks: %d > %d"), - ret.names.names_len, maxnames); - goto cleanup; - } - - /* This call is caller-frees (although that isn't clear from - * the documentation). However xdr_free will free up both the - * names and the list of pointers, so we have to strdup the - * names here. - */ - for (i = 0; i < ret.names.names_len; ++i) { - names[i] = strdup (ret.names.names_val[i]); - - if (names[i] == NULL) { - for (--i; i >= 0; --i) - VIR_FREE(names[i]); - - virReportOOMError(); - goto cleanup; - } - } - - rv = ret.names.names_len; - -cleanup: - xdr_free ((xdrproc_t) xdr_remote_list_defined_networks_ret, (char *) &ret); - -done: - remoteDriverUnlock(priv); - return rv; -} - /*----------------------------------------------------------------------*/ static virDrvOpenStatus ATTRIBUTE_NONNULL (1) @@ -3255,124 +3077,6 @@ remoteInterfaceClose(virConnectPtr conn) return remoteGenericClose(conn, &conn->interfacePrivateData); } -static int -remoteListInterfaces (virConnectPtr conn, char **const names, int maxnames) -{ - int rv = -1; - int i; - remote_list_interfaces_args args; - remote_list_interfaces_ret ret; - struct private_data *priv = conn->interfacePrivateData; - - remoteDriverLock(priv); - - if (maxnames > REMOTE_INTERFACE_NAME_LIST_MAX) { - remoteError(VIR_ERR_RPC, - _("too many remote interfaces: %d > %d"), - maxnames, REMOTE_INTERFACE_NAME_LIST_MAX); - goto done; - } - args.maxnames = maxnames; - - memset (&ret, 0, sizeof ret); - if (call (conn, priv, 0, REMOTE_PROC_LIST_INTERFACES, - (xdrproc_t) xdr_remote_list_interfaces_args, (char *) &args, - (xdrproc_t) xdr_remote_list_interfaces_ret, (char *) &ret) == -1) - goto done; - - if (ret.names.names_len > maxnames) { - remoteError(VIR_ERR_RPC, - _("too many remote interfaces: %d > %d"), - ret.names.names_len, maxnames); - goto cleanup; - } - - /* This call is caller-frees (although that isn't clear from - * the documentation). However xdr_free will free up both the - * names and the list of pointers, so we have to strdup the - * names here. - */ - for (i = 0; i < ret.names.names_len; ++i) { - names[i] = strdup (ret.names.names_val[i]); - - if (names[i] == NULL) { - for (--i; i >= 0; --i) - VIR_FREE(names[i]); - - virReportOOMError(); - goto cleanup; - } - } - - rv = ret.names.names_len; - -cleanup: - xdr_free ((xdrproc_t) xdr_remote_list_interfaces_ret, (char *) &ret); - -done: - remoteDriverUnlock(priv); - return rv; -} - -static int -remoteListDefinedInterfaces (virConnectPtr conn, char **const names, int maxnames) -{ - int rv = -1; - int i; - remote_list_defined_interfaces_args args; - remote_list_defined_interfaces_ret ret; - struct private_data *priv = conn->interfacePrivateData; - - remoteDriverLock(priv); - - if (maxnames > REMOTE_DEFINED_INTERFACE_NAME_LIST_MAX) { - remoteError(VIR_ERR_RPC, - _("too many remote interfaces: %d > %d"), - maxnames, REMOTE_DEFINED_INTERFACE_NAME_LIST_MAX); - goto done; - } - args.maxnames = maxnames; - - memset (&ret, 0, sizeof ret); - if (call (conn, priv, 0, REMOTE_PROC_LIST_DEFINED_INTERFACES, - (xdrproc_t) xdr_remote_list_defined_interfaces_args, (char *) &args, - (xdrproc_t) xdr_remote_list_defined_interfaces_ret, (char *) &ret) == -1) - goto done; - - if (ret.names.names_len > maxnames) { - remoteError(VIR_ERR_RPC, - _("too many remote interfaces: %d > %d"), - ret.names.names_len, maxnames); - goto cleanup; - } - - /* This call is caller-frees (although that isn't clear from - * the documentation). However xdr_free will free up both the - * names and the list of pointers, so we have to strdup the - * names here. - */ - for (i = 0; i < ret.names.names_len; ++i) { - names[i] = strdup (ret.names.names_val[i]); - - if (names[i] == NULL) { - for (--i; i >= 0; --i) - VIR_FREE(names[i]); - - virReportOOMError(); - goto cleanup; - } - } - - rv = ret.names.names_len; - -cleanup: - xdr_free ((xdrproc_t) xdr_remote_list_defined_interfaces_ret, (char *) &ret); - -done: - remoteDriverUnlock(priv); - return rv; -} - /*----------------------------------------------------------------------*/ static virDrvOpenStatus ATTRIBUTE_NONNULL (1) @@ -3387,117 +3091,6 @@ remoteStorageClose(virConnectPtr conn) return remoteGenericClose(conn, &conn->storagePrivateData); } -static int -remoteListStoragePools (virConnectPtr conn, char **const names, int maxnames) -{ - int rv = -1; - int i; - remote_list_storage_pools_args args; - remote_list_storage_pools_ret ret; - struct private_data *priv = conn->storagePrivateData; - - remoteDriverLock(priv); - - if (maxnames > REMOTE_STORAGE_POOL_NAME_LIST_MAX) { - remoteError(VIR_ERR_RPC, "%s", _("too many storage pools requested")); - goto done; - } - args.maxnames = maxnames; - - memset (&ret, 0, sizeof ret); - if (call (conn, priv, 0, REMOTE_PROC_LIST_STORAGE_POOLS, - (xdrproc_t) xdr_remote_list_storage_pools_args, (char *) &args, - (xdrproc_t) xdr_remote_list_storage_pools_ret, (char *) &ret) == -1) - goto done; - - if (ret.names.names_len > maxnames) { - remoteError(VIR_ERR_RPC, "%s", _("too many storage pools received")); - goto cleanup; - } - - /* This call is caller-frees (although that isn't clear from - * the documentation). However xdr_free will free up both the - * names and the list of pointers, so we have to strdup the - * names here. - */ - for (i = 0; i < ret.names.names_len; ++i) { - names[i] = strdup (ret.names.names_val[i]); - - if (names[i] == NULL) { - for (--i; i >= 0; --i) - VIR_FREE(names[i]); - - virReportOOMError(); - goto cleanup; - } - } - - rv = ret.names.names_len; - -cleanup: - xdr_free ((xdrproc_t) xdr_remote_list_storage_pools_ret, (char *) &ret); - -done: - remoteDriverUnlock(priv); - return rv; -} - -static int -remoteListDefinedStoragePools (virConnectPtr conn, - char **const names, int maxnames) -{ - int rv = -1; - int i; - remote_list_defined_storage_pools_args args; - remote_list_defined_storage_pools_ret ret; - struct private_data *priv = conn->storagePrivateData; - - remoteDriverLock(priv); - - if (maxnames > REMOTE_STORAGE_POOL_NAME_LIST_MAX) { - remoteError(VIR_ERR_RPC, "%s", _("too many storage pools requested")); - goto done; - } - args.maxnames = maxnames; - - memset (&ret, 0, sizeof ret); - if (call (conn, priv, 0, REMOTE_PROC_LIST_DEFINED_STORAGE_POOLS, - (xdrproc_t) xdr_remote_list_defined_storage_pools_args, (char *) &args, - (xdrproc_t) xdr_remote_list_defined_storage_pools_ret, (char *) &ret) == -1) - goto done; - - if (ret.names.names_len > maxnames) { - remoteError(VIR_ERR_RPC, "%s", _("too many storage pools received")); - goto cleanup; - } - - /* This call is caller-frees (although that isn't clear from - * the documentation). However xdr_free will free up both the - * names and the list of pointers, so we have to strdup the - * names here. - */ - for (i = 0; i < ret.names.names_len; ++i) { - names[i] = strdup (ret.names.names_val[i]); - - if (names[i] == NULL) { - for (--i; i >= 0; --i) - VIR_FREE(names[i]); - - virReportOOMError(); - goto cleanup; - } - } - - rv = ret.names.names_len; - -cleanup: - xdr_free ((xdrproc_t) xdr_remote_list_defined_storage_pools_ret, (char *) &ret); - -done: - remoteDriverUnlock(priv); - return rv; -} - static char * remoteFindStoragePoolSources (virConnectPtr conn, const char *type, @@ -3543,62 +3136,6 @@ done: return rv; } -static int -remoteStoragePoolListVolumes (virStoragePoolPtr pool, char **const names, int maxnames) -{ - int rv = -1; - int i; - remote_storage_pool_list_volumes_args args; - remote_storage_pool_list_volumes_ret ret; - struct private_data *priv = pool->conn->storagePrivateData; - - remoteDriverLock(priv); - - if (maxnames > REMOTE_STORAGE_VOL_NAME_LIST_MAX) { - remoteError(VIR_ERR_RPC, "%s", _("too many storage volumes requested")); - goto done; - } - args.maxnames = maxnames; - make_nonnull_storage_pool(&args.pool, pool); - - memset (&ret, 0, sizeof ret); - if (call (pool->conn, priv, 0, REMOTE_PROC_STORAGE_POOL_LIST_VOLUMES, - (xdrproc_t) xdr_remote_storage_pool_list_volumes_args, (char *) &args, - (xdrproc_t) xdr_remote_storage_pool_list_volumes_ret, (char *) &ret) == -1) - goto done; - - if (ret.names.names_len > maxnames) { - remoteError(VIR_ERR_RPC, "%s", _("too many storage volumes received")); - goto cleanup; - } - - /* This call is caller-frees (although that isn't clear from - * the documentation). However xdr_free will free up both the - * names and the list of pointers, so we have to strdup the - * names here. - */ - for (i = 0; i < ret.names.names_len; ++i) { - names[i] = strdup (ret.names.names_val[i]); - - if (names[i] == NULL) { - for (--i; i >= 0; --i) - VIR_FREE(names[i]); - - virReportOOMError(); - goto cleanup; - } - } - - rv = ret.names.names_len; - -cleanup: - xdr_free ((xdrproc_t) xdr_remote_storage_pool_list_volumes_ret, (char *) &ret); - -done: - remoteDriverUnlock(priv); - return rv; -} - /*----------------------------------------------------------------------*/ static virDrvOpenStatus ATTRIBUTE_NONNULL (1) @@ -3613,66 +3150,6 @@ remoteDevMonClose(virConnectPtr conn) return remoteGenericClose(conn, &conn->devMonPrivateData); } -static int remoteNodeListDevices(virConnectPtr conn, - const char *cap, - char **const names, - int maxnames, - unsigned int flags) -{ - int rv = -1; - int i; - remote_node_list_devices_args args; - remote_node_list_devices_ret ret; - struct private_data *priv = conn->devMonPrivateData; - - remoteDriverLock(priv); - - if (maxnames > REMOTE_NODE_DEVICE_NAME_LIST_MAX) { - remoteError(VIR_ERR_RPC, "%s", _("too many device names requested")); - goto done; - } - args.cap = cap ? (char **)&cap : NULL; - args.maxnames = maxnames; - args.flags = flags; - - memset (&ret, 0, sizeof ret); - if (call (conn, priv, 0, REMOTE_PROC_NODE_LIST_DEVICES, - (xdrproc_t) xdr_remote_node_list_devices_args, (char *) &args, - (xdrproc_t) xdr_remote_node_list_devices_ret, (char *) &ret) == -1) - goto done; - - if (ret.names.names_len > maxnames) { - remoteError(VIR_ERR_RPC, "%s", _("too many device names received")); - goto cleanup; - } - - /* This call is caller-frees (although that isn't clear from - * the documentation). However xdr_free will free up both the - * names and the list of pointers, so we have to strdup the - * names here. - */ - for (i = 0; i < ret.names.names_len; ++i) { - names[i] = strdup (ret.names.names_val[i]); - - if (names[i] == NULL) { - for (--i; i >= 0; --i) - VIR_FREE(names[i]); - - virReportOOMError(); - goto cleanup; - } - } - - rv = ret.names.names_len; - -cleanup: - xdr_free ((xdrproc_t) xdr_remote_node_list_devices_ret, (char *) &ret); - -done: - remoteDriverUnlock(priv); - return rv; -} - static char *remoteNodeDeviceGetParent(virNodeDevicePtr dev) { char *rv = NULL; @@ -3699,63 +3176,6 @@ done: return rv; } -static int remoteNodeDeviceListCaps(virNodeDevicePtr dev, - char **const names, - int maxnames) -{ - int rv = -1; - int i; - remote_node_device_list_caps_args args; - remote_node_device_list_caps_ret ret; - struct private_data *priv = dev->conn->devMonPrivateData; - - remoteDriverLock(priv); - - if (maxnames > REMOTE_NODE_DEVICE_CAPS_LIST_MAX) { - remoteError(VIR_ERR_RPC, "%s", _("too many capability names requested")); - goto done; - } - args.maxnames = maxnames; - args.name = dev->name; - - memset (&ret, 0, sizeof ret); - if (call (dev->conn, priv, 0, REMOTE_PROC_NODE_DEVICE_LIST_CAPS, - (xdrproc_t) xdr_remote_node_device_list_caps_args, (char *) &args, - (xdrproc_t) xdr_remote_node_device_list_caps_ret, (char *) &ret) == -1) - goto done; - - if (ret.names.names_len > maxnames) { - remoteError(VIR_ERR_RPC, "%s", _("too many capability names received")); - goto cleanup; - } - - /* This call is caller-frees (although that isn't clear from - * the documentation). However xdr_free will free up both the - * names and the list of pointers, so we have to strdup the - * names here. - */ - for (i = 0; i < ret.names.names_len; ++i) { - names[i] = strdup (ret.names.names_val[i]); - - if (names[i] == NULL) { - for (--i; i >= 0; --i) - VIR_FREE(names[i]); - - virReportOOMError(); - goto cleanup; - } - } - - rv = ret.names.names_len; - -cleanup: - xdr_free ((xdrproc_t) xdr_remote_node_device_list_caps_ret, (char *) &ret); - -done: - remoteDriverUnlock(priv); - return rv; -} - static int remoteNodeDeviceDettach (virNodeDevicePtr dev) { @@ -3872,65 +3292,6 @@ done: return net; } -static int -remoteListNWFilters (virConnectPtr conn, char **const names, int maxnames) -{ - int rv = -1; - int i; - remote_list_nwfilters_args args; - remote_list_nwfilters_ret ret; - struct private_data *priv = conn->nwfilterPrivateData; - - remoteDriverLock(priv); - - if (maxnames > REMOTE_NWFILTER_NAME_LIST_MAX) { - remoteError(VIR_ERR_RPC, - _("too many remote nwfilters: %d > %d"), - maxnames, REMOTE_NWFILTER_NAME_LIST_MAX); - goto done; - } - args.maxnames = maxnames; - - memset (&ret, 0, sizeof ret); - if (call (conn, priv, 0, REMOTE_PROC_LIST_NWFILTERS, - (xdrproc_t) xdr_remote_list_nwfilters_args, (char *) &args, - (xdrproc_t) xdr_remote_list_nwfilters_ret, (char *) &ret) == -1) - goto done; - - if (ret.names.names_len > maxnames) { - remoteError(VIR_ERR_RPC, - _("too many remote nwfilters: %d > %d"), - ret.names.names_len, maxnames); - goto cleanup; - } - - /* This call is caller-frees (although that isn't clear from - * the documentation). However xdr_free will free up both the - * names and the list of pointers, so we have to strdup the - * names here. - */ - for (i = 0; i < ret.names.names_len; ++i) { - names[i] = strdup (ret.names.names_val[i]); - - if (names[i] == NULL) { - for (--i; i >= 0; --i) - VIR_FREE(names[i]); - - virReportOOMError(); - goto cleanup; - } - } - - rv = ret.names.names_len; - -cleanup: - xdr_free ((xdrproc_t) xdr_remote_list_nwfilters_ret, (char *) &ret); - -done: - remoteDriverUnlock(priv); - return rv; -} - /*----------------------------------------------------------------------*/ static int @@ -4937,62 +4298,6 @@ remoteSecretClose (virConnectPtr conn) return remoteGenericClose(conn, &conn->secretPrivateData); } -static int -remoteListSecrets (virConnectPtr conn, char **uuids, int maxuuids) -{ - int rv = -1; - int i; - remote_list_secrets_args args; - remote_list_secrets_ret ret; - struct private_data *priv = conn->secretPrivateData; - - remoteDriverLock(priv); - - if (maxuuids > REMOTE_SECRET_UUID_LIST_MAX) { - remoteError(VIR_ERR_RPC, _("too many remote secret UUIDs: %d > %d"), - maxuuids, REMOTE_SECRET_UUID_LIST_MAX); - goto done; - } - args.maxuuids = maxuuids; - - memset (&ret, 0, sizeof ret); - if (call (conn, priv, 0, REMOTE_PROC_LIST_SECRETS, - (xdrproc_t) xdr_remote_list_secrets_args, (char *) &args, - (xdrproc_t) xdr_remote_list_secrets_ret, (char *) &ret) == -1) - goto done; - - if (ret.uuids.uuids_len > maxuuids) { - remoteError(VIR_ERR_RPC, _("too many remote secret UUIDs: %d > %d"), - ret.uuids.uuids_len, maxuuids); - goto cleanup; - } - - /* This call is caller-frees. However xdr_free will free up both the - * names and the list of pointers, so we have to strdup the - * names here. - */ - for (i = 0; i < ret.uuids.uuids_len; ++i) { - uuids[i] = strdup (ret.uuids.uuids_val[i]); - - if (uuids[i] == NULL) { - for (--i; i >= 0; --i) - VIR_FREE(uuids[i]); - - virReportOOMError(); - goto cleanup; - } - } - - rv = ret.uuids.uuids_len; - -cleanup: - xdr_free ((xdrproc_t) xdr_remote_list_secrets_ret, (char *) &ret); - -done: - remoteDriverUnlock(priv); - return rv; -} - static int remoteSecretSetValue (virSecretPtr secret, const unsigned char *value, size_t value_size, unsigned int flags) @@ -5626,69 +4931,6 @@ done: return cpu; } -static int -remoteDomainSnapshotListNames (virDomainPtr domain, char **const names, - int maxnames, unsigned int flags) -{ - int rv = -1; - int i; - remote_domain_snapshot_list_names_args args; - remote_domain_snapshot_list_names_ret ret; - struct private_data *priv = domain->conn->privateData; - - remoteDriverLock(priv); - - if (maxnames > REMOTE_DOMAIN_SNAPSHOT_LIST_NAMES_MAX) { - remoteError(VIR_ERR_RPC, - _("too many remote domain snapshot names: %d > %d"), - maxnames, REMOTE_DOMAIN_SNAPSHOT_LIST_NAMES_MAX); - goto done; - } - - make_nonnull_domain(&args.dom, domain); - args.maxnames = maxnames; - args.flags = flags; - - memset (&ret, 0, sizeof ret); - if (call (domain->conn, priv, 0, REMOTE_PROC_DOMAIN_SNAPSHOT_LIST_NAMES, - (xdrproc_t) xdr_remote_domain_snapshot_list_names_args, (char *) &args, - (xdrproc_t) xdr_remote_domain_snapshot_list_names_ret, (char *) &ret) == -1) - goto done; - - if (ret.names.names_len > maxnames) { - remoteError(VIR_ERR_RPC, - _("too many remote domain snapshots: %d > %d"), - ret.names.names_len, maxnames); - goto cleanup; - } - - /* This call is caller-frees (although that isn't clear from - * the documentation). However xdr_free will free up both the - * names and the list of pointers, so we have to strdup the - * names here. - */ - for (i = 0; i < ret.names.names_len; ++i) { - names[i] = strdup (ret.names.names_val[i]); - - if (names[i] == NULL) { - for (--i; i >= 0; --i) - VIR_FREE(names[i]); - - virReportOOMError(); - goto cleanup; - } - } - - rv = ret.names.names_len; - -cleanup: - xdr_free ((xdrproc_t) xdr_remote_domain_snapshot_list_names_ret, (char *) &ret); - -done: - remoteDriverUnlock(priv); - return rv; -} - static int remoteDomainEventRegisterAny(virConnectPtr conn, virDomainPtr dom, int eventID,