
On Thu, Mar 10, 2016 at 05:54:04AM +0100, Martin Kletzander wrote:
Let's call it modern_ret_as_list as opposed to single_ret_as_list. The latter was able to return list of things. However the new, more modern, version came and it is used since listAllDomains till nowadays in ListServers.
Signed-off-by: Martin Kletzander <mkletzan@redhat.com> --- src/rpc/gendispatch.pl | 200 ++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 172 insertions(+), 28 deletions(-)
@@ -1277,6 +1348,9 @@ elsif ($mode eq "client") { my $single_ret_list_max_define = "undefined"; my $single_ret_cleanup = 0; my $multi_ret = 0; + my $modern_ret_as_list = 0;
+ my $modern_ret_struct_name = 0;
The other strings use "undefined" as the initializer.
+ my $modern_ret_var_type = "undefined";
if ($rettype ne "void" and scalar(@{$call->{ret_members}}) > 1) { @@ -1296,6 +1370,20 @@ elsif ($mode eq "client") { }
push(@ret_list, "memcpy(result->$3, ret.$3, sizeof(result->$3));"); + } elsif ($ret_member =~ m/admin_nonnull_(server) (\S+)<(\S+)>;/) { + my $proc_name = name_to_TypeName($1); + + if ($structprefix eq "admin") { + $modern_ret_var_type = "virAdm${proc_name}Ptr"; + } else { + $modern_ret_var_type = "vir${proc_name}Ptr"; + } + + $modern_ret_struct_name = $1;
This should also set: $single_ret_list_error_msg_type = $1; Otherwise the commit after this generates a funny error in remoteAdminConnectListServers: + if (ret.servers.servers_len > ADMIN_SERVER_LIST_MAX) { + virReportError(VIR_ERR_RPC, + _("too many remote undefineds: %d > %d"), + ret.servers.servers_len, ADMIN_SERVER_LIST_MAX); + goto cleanup; + }
+ $single_ret_list_name = $2; + $single_ret_list_max_var = $3; + + $modern_ret_as_list = 1; } elsif ($ret_member =~ m/<\S+>;/ or $ret_member =~ m/\[\S+\];/) { # just make all other array types fail die "unhandled type for multi-return-value for " .
- my $struct_name = $call->{ProcName}; - $struct_name =~ s/Get//; + if ($modern_ret_as_list) { + $struct_name = name_to_TypeName($modern_ret_struct_name); + + $struct_name .= "Ptr **"; + if ($structprefix eq "admin") { + $struct_name = "Adm${struct_name}"; + } + } else { + $struct_name = $call->{ProcName};
- splice(@args_list, $call->{ret_offset}, 0, ("vir${struct_name}Ptr result")); + $struct_name =~ s/Get//; + $struct_name = "${struct_name}Ptr " + } + splice(@args_list, $call->{ret_offset}, 0, ("vir$struct_name result"));
There's an extra space between ${struct_name} and result.
}
if ($call->{streamflag} ne "none") { @@ -1482,7 +1594,8 @@ elsif ($mode eq "client") { print " $var;\n"; }
- if ($single_ret_as_list) { + if ($single_ret_as_list or + $modern_ret_as_list) { print " size_t i;\n"; }
ACK with the nits fixed. Jan