Anchor matches at the beginning of a line. Specialize some general matches. Add some comments to special cases. --- daemon/remote_generator.pl | 172 +++++++++++++++++++++++++++----------------- 1 files changed, 105 insertions(+), 67 deletions(-) diff --git a/daemon/remote_generator.pl b/daemon/remote_generator.pl index e6a0e2c..e57f34a 100755 --- a/daemon/remote_generator.pl +++ b/daemon/remote_generator.pl @@ -352,34 +352,49 @@ elsif ($opt_b) { " virDomainSnapshotFree(snapshot);\n" . " if (dom)\n" . " virDomainFree(dom);"); - } elsif ($args_member =~ m/(\S+)<\S+>;/) { + } elsif ($args_member =~ m/^(remote_string|remote_nonnull_string|remote_uuid|opaque) (\S+)<\S+>;/) { if (! @args_list) { push(@args_list, "conn"); } if ($calls{$_}->{ProcName} eq "SecretSetValue") { - push(@args_list, "(const unsigned char *)args->$1.$1_val"); + push(@args_list, "(const unsigned char *)args->$2.$2_val"); } elsif ($calls{$_}->{ProcName} eq "CPUBaseline") { - push(@args_list, "(const char **)args->$1.$1_val"); + push(@args_list, "(const char **)args->$2.$2_val"); } else { - push(@args_list, "args->$1.$1_val"); + push(@args_list, "args->$2.$2_val"); } - push(@args_list, "args->$1.$1_len"); - } elsif ($args_member =~ m/(\S+) (\S+);/) { + push(@args_list, "args->$2.$2_len"); + } elsif ($args_member =~ m/<\S+>;/ or $args_member =~ m/\[\S+\];/) { + # just make all other array types fail + die "unhandled type for argument value: $args_member"; + } elsif ($args_member =~ m/^remote_uuid (\S+);/) { if (! @args_list) { push(@args_list, "conn"); } - if ($1 eq "remote_uuid") { - push(@args_list, "(unsigned char *) args->$2"); - } elsif ($1 eq "remote_string") { - push(@vars_list, "char *$2"); - push(@optionals_list, "$2"); - push(@args_list, "$2"); - } else { - push(@args_list, "args->$2"); + push(@args_list, "(unsigned char *) args->$1"); + } elsif ($args_member =~ m/^remote_string (\S+);/) { + if (! @args_list) { + push(@args_list, "conn"); } + + push(@vars_list, "char *$1"); + push(@optionals_list, "$1"); + push(@args_list, "$1"); + } elsif ($args_member =~ m/^remote_nonnull_string (\S+);/) { + if (! @args_list) { + push(@args_list, "conn"); + } + + push(@args_list, "args->$1"); + } elsif ($args_member =~ m/^(unsigned )?(int|hyper) (\S+);/) { + if (! @args_list) { + push(@args_list, "conn"); + } + + push(@args_list, "args->$3"); } elsif ($args_member =~ m/^(\/)?\*/) { # ignore comments } else { @@ -406,17 +421,14 @@ elsif ($opt_b) { if ($calls{$_}->{ret} ne "void") { foreach my $ret_member (@{$calls{$_}->{ret_members}}) { if ($multi_ret) { - if ($ret_member =~ m/(char|short|int|hyper) (\S+)\[\S+\];/) { - push(@ret_list, "memcpy(ret->$2, tmp.$2, sizeof ret->$2);"); - } elsif ($ret_member =~ m/char (\S+);/ or - $ret_member =~ m/short (\S+);/ or - $ret_member =~ m/int (\S+);/ or - $ret_member =~ m/hyper (\S+);/) { - push(@ret_list, "ret->$1 = tmp.$1;"); + if ($ret_member =~ m/^(unsigned )?(char|short|int|hyper) (\S+)\[\S+\];/) { + push(@ret_list, "memcpy(ret->$3, tmp.$3, sizeof ret->$3);"); + } elsif ($ret_member =~ m/^(unsigned )?(char|short|int|hyper) (\S+);/) { + push(@ret_list, "ret->$3 = tmp.$3;"); } else { die "unhandled type for multi-return-value: $ret_member"; } - } elsif ($ret_member =~ m/remote_nonnull_string (\S+)<(\S+)>;/) { + } elsif ($ret_member =~ m/^remote_nonnull_string (\S+)<(\S+)>;/) { push(@vars_list, "int len"); push(@ret_list, "ret->$1.$1_len = len;"); push(@free_list_on_error, "VIR_FREE(ret->$1.$1_val);"); @@ -439,13 +451,13 @@ elsif ($opt_b) { unshift(@args_list, "ret->$1.$1_val"); unshift(@args_list, $conn); } - } elsif ($ret_member =~ m/remote_nonnull_string (\S+);/) { + } elsif ($ret_member =~ m/^remote_nonnull_string (\S+);/) { push(@vars_list, "char *$1"); push(@ret_list, "ret->$1 = $1;"); $single_ret_var = $1; $single_ret_by_ref = 0; $single_ret_check = " == NULL"; - } elsif ($ret_member =~ m/remote_nonnull_(domain|network|storage_pool|storage_vol|interface|node_device|secret|nwfilter|domain_snapshot) (\S+);/) { + } elsif ($ret_member =~ m/^remote_nonnull_(domain|network|storage_pool|storage_vol|interface|node_device|secret|nwfilter|domain_snapshot) (\S+);/) { my $type_name = name_to_ProcName($1); push(@vars_list, "vir${type_name}Ptr $2 = NULL"); @@ -456,7 +468,7 @@ elsif ($opt_b) { $single_ret_var = $2; $single_ret_by_ref = 0; $single_ret_check = " == NULL"; - } elsif ($ret_member =~ m/int (\S+)<(\S+)>;/) { + } elsif ($ret_member =~ m/^int (\S+)<(\S+)>;/) { push(@vars_list, "int len"); push(@ret_list, "ret->$1.$1_len = len;"); push(@free_list_on_error, "VIR_FREE(ret->$1.$1_val);"); @@ -471,7 +483,7 @@ elsif ($opt_b) { my $conn = shift(@args_list); unshift(@args_list, "ret->$1.$1_val"); unshift(@args_list, $conn); - } elsif ($ret_member =~ m/int (\S+);/) { + } elsif ($ret_member =~ m/^int (\S+);/) { push(@vars_list, "int $1"); push(@ret_list, "ret->$1 = $1;"); $single_ret_var = $1; @@ -487,7 +499,7 @@ elsif ($opt_b) { $single_ret_check = " < 0"; } } - } elsif ($ret_member =~ m/hyper (\S+)<(\S+)>;/) { + } elsif ($ret_member =~ m/^hyper (\S+)<(\S+)>;/) { push(@vars_list, "int len"); push(@ret_list, "ret->$1.$1_len = len;"); push(@free_list_on_error, "VIR_FREE(ret->$1.$1_val);"); @@ -510,13 +522,29 @@ elsif ($opt_b) { } unshift(@args_list, $conn); - } elsif ($ret_member =~ m/hyper (\S+);/) { - push(@vars_list, "unsigned long $1"); - push(@ret_list, "ret->$1 = $1;"); - $single_ret_var = $1; + } elsif ($ret_member =~ m/^(unsigned )?hyper (\S+);/) { + my $type_name; + my $ret_name = $2; + + $type_name = $1 if ($1); + $type_name .= "long"; + + if ($type_name eq "long" and + $calls{$_}->{ProcName} =~ m/^Get(Lib)?Version$/) { + # SPECIAL: virConnectGet(Lib)?Version uses unsigned long + # in public API but hyper in XDR protocol + $type_name = "unsigned long"; + } + + push(@vars_list, "$type_name $ret_name"); + push(@ret_list, "ret->$ret_name = $ret_name;"); + $single_ret_var = $ret_name; if ($calls{$_}->{ProcName} eq "DomainGetMaxMemory" or $calls{$_}->{ProcName} eq "NodeGetFreeMemory") { + # SPECIAL: virDomainGetMaxMemory and virNodeGetFreeMemory + # return the actual value directly and 0 indicates + # an error $single_ret_by_ref = 0; $single_ret_check = " == 0"; } else { @@ -538,14 +566,16 @@ elsif ($opt_b) { $struct_name =~ s/Get//; if ($calls{$_}->{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") { - $struct_name .= "Struct"; - push(@args_list, "&tmp"); - push(@args_list, "sizeof tmp"); - } elsif ($calls{$_}->{ProcName} eq "DomainInterfaceStats") { + } elsif ($calls{$_}->{ProcName} eq "DomainBlockStats" || + $calls{$_}->{ProcName} eq "DomainInterfaceStats") { + # SPECIAL: virDomainBlockStats and virDomainInterfaceStats + # have a 'Struct' suffix on the actual struct name + # and take the struct size as additional argument $struct_name .= "Struct"; push(@args_list, "&tmp"); push(@args_list, "sizeof tmp"); @@ -863,21 +893,25 @@ elsif ($opt_k) { } elsif ($args_member =~ m/^remote_nonnull_string (\S+);/) { push(@args_list, "const char *$1"); push(@setters_list, "args.$1 = (char *)$1;"); - } elsif ($args_member =~ m/(\S+)<(\S+)>;/) { + } elsif ($args_member =~ m/^(remote_string|opaque) (\S+)<(\S+)>;/) { + my $type_name = $1; + my $arg_name = $2; + my $limit = $3; + if ($call->{ProcName} eq "SecretSetValue") { - push(@args_list, "const unsigned char *$1"); - push(@args_list, "size_t ${1}len"); + push(@args_list, "const unsigned char *$arg_name"); + push(@args_list, "size_t ${arg_name}len"); } elsif ($call->{ProcName} eq "DomainPinVcpu") { - push(@args_list, "unsigned char *$1"); - push(@args_list, "int ${1}len"); + push(@args_list, "unsigned char *$arg_name"); + push(@args_list, "int ${arg_name}len"); } else { - push(@args_list, "const char *$1"); - push(@args_list, "int ${1}len"); + push(@args_list, "const char *$arg_name"); + push(@args_list, "int ${arg_name}len"); } - push(@setters_list, "args.$1.${1}_val = (char *)$1;"); - push(@setters_list, "args.$1.${1}_len = ${1}len;"); - push(@args_check_list, { name => "\"$1\"", arg => "${1}len", limit => $2 }); + push(@setters_list, "args.$arg_name.${arg_name}_val = (char *)$arg_name;"); + push(@setters_list, "args.$arg_name.${arg_name}_len = ${arg_name}len;"); + push(@args_check_list, { name => "\"$arg_name\"", arg => "${arg_name}len", limit => $limit }); } elsif ($args_member =~ m/^(unsigned )?(int|hyper) (\S+);/) { my $type_name; my $arg_name = $3; @@ -928,7 +962,8 @@ elsif ($opt_k) { } if ($call->{ProcName} eq "NWFilterDefineXML") { - # fix public API and XDR protocol mismatch + # SPECIAL: virNWFilterDefineXML has a flags parameter in the + # public API that is missing in the XDR protocol push(@args_list, "unsigned int flags ATTRIBUTE_UNUSED"); } @@ -966,17 +1001,17 @@ elsif ($opt_k) { foreach my $ret_member (@{$call->{ret_members}}) { if ($multi_ret) { - if ($ret_member =~ m/(char|short|int|hyper) (\S+)\[\S+\];/) { - push(@ret_list, "memcpy(result->$2, ret.$2, sizeof result->$2);"); - } elsif ($ret_member =~ m/char (\S+);/ or - $ret_member =~ m/short (\S+);/ or - $ret_member =~ m/int (\S+);/ or - $ret_member =~ m/hyper (\S+);/) { - push(@ret_list, "result->$1 = ret.$1;"); + if ($ret_member =~ m/^(unsigned )?(char|short|int|hyper) (\S+)\[\S+\];/) { + push(@ret_list, "memcpy(result->$3, ret.$3, sizeof result->$3);"); + } elsif ($ret_member =~ m/<\S+>;/ or $ret_member =~ m/\[\S+\];/) { + # just make all other array types fail + die "unhandled type for multi-return-value: $ret_member"; + } elsif ($ret_member =~ m/^(unsigned )?(char|short|int|hyper) (\S+);/) { + push(@ret_list, "result->$3 = ret.$3;"); } else { die "unhandled type for multi-return-value: $ret_member"; } - } elsif ($ret_member =~ m/remote_nonnull_string (\S+)<(\S+)>;/) { + } 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"; @@ -1000,11 +1035,11 @@ elsif ($opt_k) { 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+);/) { + } elsif ($ret_member =~ m/^remote_nonnull_string (\S+);/) { push(@ret_list, "rv = 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+);/) { + } 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; my $type_name = name_to_ProcName($name); @@ -1039,7 +1074,12 @@ elsif ($opt_k) { $single_ret_var = "int rv = -1"; $single_ret_type = "int"; - } elsif ($ret_member =~ m/hyper (\S+);/) { + } elsif ($ret_member =~ m/^unsigned hyper (\S+);/) { + my $arg_name = $1; + push(@ret_list, "rv = ret.$arg_name;"); + $single_ret_var = "unsigned long rv = 0"; + $single_ret_type = "unsigned long"; + } elsif ($ret_member =~ m/^hyper (\S+);/) { my $arg_name = $1; if ($call->{ProcName} =~ m/Get(Lib)?Version/) { @@ -1048,16 +1088,12 @@ elsif ($opt_k) { push(@ret_list, "rv = 0;"); $single_ret_var = "int rv = -1"; $single_ret_type = "int"; - } else { + } elsif ($call->{ProcName} eq "NodeGetFreeMemory") { push(@ret_list, "rv = ret.$arg_name;"); - - if ($call->{ProcName} eq "NodeGetFreeMemory") { - $single_ret_var = "unsigned long long rv = 0"; - $single_ret_type = "unsigned long long"; - } else { - $single_ret_var = "unsigned long rv = 0"; - $single_ret_type = "unsigned long"; - } + $single_ret_var = "unsigned long long rv = 0"; + $single_ret_type = "unsigned long long"; + } else { + die "unhandled type for return value: $ret_member"; } } else { die "unhandled type for return value: $ret_member"; @@ -1072,6 +1108,8 @@ elsif ($opt_k) { $struct_name =~ s/Get//; if ($call->{ProcName} eq "DomainGetBlockInfo") { + # SPECIAL: virDomainGetBlockInfo has flags parameter after + # the struct parameter in its signature $last_arg = pop(@args_list); } -- 1.7.0.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list