Since this is just a new option for gendispatch, it looks more like a
cleanup. The only differences handled by it are connect pointers,
private pointers and API naming customs.
Signed-off-by: Martin Kletzander <mkletzan(a)redhat.com>
---
src/rpc/gendispatch.pl | 254 +++++++++++++++++++++++++++----------------------
1 file changed, 141 insertions(+), 113 deletions(-)
diff --git a/src/rpc/gendispatch.pl b/src/rpc/gendispatch.pl
index cb8e15791977..b6d50f393ba1 100755
--- a/src/rpc/gendispatch.pl
+++ b/src/rpc/gendispatch.pl
@@ -49,6 +49,8 @@ my $procprefix = shift or die "missing procedure prefix
argument";
my $protocol = shift or die "missing protocol argument";
my @autogen;
+my $connect_ptr = $structprefix eq "admin" ? "virAdmConnectPtr" :
"virConnectPtr";
+my $prefix = ($structprefix eq "admin") ? "adm" : "vir";
sub fixup_name {
my $name = shift;
@@ -78,9 +80,12 @@ sub fixup_name {
# Convert name_of_call to NameOfCall.
sub name_to_ProcName {
my $name = shift;
+ my $forcefix = $structprefix eq "admin";
my @elems;
- if ($name =~ /_/ || (lc $name) eq "open" || (lc $name) eq
"close") {
+
+ if ($forcefix || $name =~ /_/ ||
+ (lc $name) eq "open" || (lc $name) eq "close") {
@elems = split /_/, $name;
@elems = map lc, @elems;
@elems = map ucfirst, @elems;
@@ -104,6 +109,19 @@ sub name_to_TypeName {
return $typename;
}
+sub push_privconn {
+ my $args = shift;
+
+ if (!@$args) {
+ if ($structprefix eq "admin") {
+ push(@$args, "priv->dmn");
+ } else {
+ push(@$args, "priv->conn");
+ }
+ }
+}
+
+
# 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, %calls, @calls, %opts);
@@ -505,21 +523,16 @@ elsif ($mode eq "server") {
push(@free_list,
" virObjectUnref(snapshot);\n" .
" virObjectUnref(dom);");
- } elsif ($args_member =~ m/^(?:remote_string|remote_uuid)
(\S+)<\S+>;/) {
- if (! @args_list) {
- push(@args_list, "priv->conn");
- }
-
- push(@args_list, "args->$1.$1_val");
- push(@args_list, "args->$1.$1_len");
- } elsif ($args_member =~ m/^(?:opaque|remote_nonnull_string)
(\S+)<\S+>;(.*)$/) {
- if (! @args_list) {
- push(@args_list, "priv->conn");
- }
+ } elsif ($args_member =~ m/^(?:(admin|remote)_string|remote_uuid)
(\S+)<\S+>;/) {
+ push_privconn(\@args_list);
+ push(@args_list, "args->$2.$2_val");
+ push(@args_list, "args->$2.$2_len");
+ } elsif ($args_member =~ m/^(?:opaque|(admin|remote)_nonnull_string)
(\S+)<\S+>;(.*)$/) {
+ push_privconn(\@args_list);
my $cast = "";
- my $arg_name = $1;
- my $annotation = $2;
+ my $arg_name = $2;
+ my $annotation = $3;
if ($annotation ne "") {
if ($annotation =~ m/\s*\/\*\s*(.*)\s*\*\//) {
@@ -532,9 +545,7 @@ elsif ($mode eq "server") {
push(@args_list,
"${cast}args->$arg_name.${arg_name}_val");
push(@args_list, "args->$arg_name.${arg_name}_len");
} elsif ($args_member =~ m/^(?:unsigned )?int (\S+)<\S+>;/) {
- if (! @args_list) {
- push(@args_list, "priv->conn");
- }
+ push_privconn(\@args_list);
push(@args_list, "args->$1.$1_val");
push(@args_list, "args->$1.$1_len");
@@ -556,35 +567,25 @@ elsif ($mode eq "server") {
# 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, "priv->conn");
- }
+ push_privconn(\@args_list);
push(@args_list, "(unsigned char *) args->$1");
- } elsif ($args_member =~ m/^remote_string (\S+);/) {
- if (! @args_list) {
- push(@args_list, "priv->conn");
- }
+ } elsif ($args_member =~ m/^(admin|remote)_string (\S+);/) {
+ push_privconn(\@args_list);
- 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, "priv->conn");
- }
+ push(@vars_list, "char *$2");
+ push(@optionals_list, "$2");
+ push(@args_list, "$2");
+ } elsif ($args_member =~ m/^(admin|remote)_nonnull_string (\S+);/) {
+ push_privconn(\@args_list);
- push(@args_list, "args->$1");
+ push(@args_list, "args->$2");
} elsif ($args_member =~ m/^(unsigned )?int (\S+);/) {
- if (! @args_list) {
- push(@args_list, "priv->conn");
- }
+ push_privconn(\@args_list);
push(@args_list, "args->$2");
} elsif ($args_member =~ m/^(unsigned )?hyper (\S+);/) {
- if (! @args_list) {
- push(@args_list, "priv->conn");
- }
+ push_privconn(\@args_list);
my $arg_name = $2;
@@ -635,52 +636,52 @@ elsif ($mode eq "server") {
} else {
die "unhandled type for multi-return-value:
$ret_member";
}
- } elsif ($ret_member =~ m/^remote_nonnull_string
(\S+)<(\S+)>;\s*\/\*\s*insert@(\d+)\s*\*\//) {
+ } elsif ($ret_member =~ m/^(admin|remote)_nonnull_string
(\S+)<(\S+)>;\s*\/\*\s*insert@(\d+)\s*\*\//) {
push(@vars_list, "int len");
- splice(@args_list, int($3), 0, ("ret->$1.$1_val"));
- push(@ret_list, "ret->$1.$1_len = len;");
- push(@free_list_on_error, "VIR_FREE(ret->$1.$1_val);");
+ splice(@args_list, int($4), 0, ("ret->$2.$2_val"));
+ push(@ret_list, "ret->$2.$2_len = len;");
+ push(@free_list_on_error, "VIR_FREE(ret->$2.$2_val);");
$single_ret_var = "len";
$single_ret_by_ref = 0;
$single_ret_check = " < 0";
$single_ret_as_list = 1;
- $single_ret_list_name = $1;
- $single_ret_list_max_var = "max$1";
- $single_ret_list_max_define = $2;
- } elsif ($ret_member =~ m/^remote_nonnull_string (\S+)<\S+>;/) {
+ $single_ret_list_name = $2;
+ $single_ret_list_max_var = "max$2";
+ $single_ret_list_max_define = $3;
+ } elsif ($ret_member =~ m/^(admin|remote)_nonnull_string
(\S+)<\S+>;/) {
# error out on unannotated arrays
- die "remote_nonnull_string array without insert@<offset>
annotation: $ret_member";
- } elsif ($ret_member =~ m/^remote_nonnull_string (\S+);/) {
+ die "$1_nonnull_string array without insert@<offset>
annotation: $ret_member";
+ } elsif ($ret_member =~ m/^(admin|remote)_nonnull_string (\S+);/) {
if ($call->{ProcName} eq "ConnectGetType") {
# SPECIAL: virConnectGetType returns a constant string that must
# not be freed. Therefore, duplicate the string here.
- push(@vars_list, "const char *$1");
+ push(@vars_list, "const char *$2");
push(@ret_list, "/* We have to VIR_STRDUP because
remoteDispatchClientRequest will");
push(@ret_list, " * free this string after it's been
serialised. */");
push(@ret_list, "if (VIR_STRDUP(ret->type, type) <
0)");
push(@ret_list, " goto cleanup;");
} else {
- push(@vars_list, "char *$1");
- push(@ret_list, "ret->$1 = $1;");
+ push(@vars_list, "char *$2");
+ push(@ret_list, "ret->$2 = $2;");
}
- $single_ret_var = $1;
+ $single_ret_var = $2;
$single_ret_by_ref = 0;
$single_ret_check = " == NULL";
- } elsif ($ret_member =~ m/^remote_string (\S+);/) {
- push(@vars_list, "char *$1 = NULL");
- push(@vars_list, "char **$1_p = NULL");
- push(@ret_list, "ret->$1 = $1_p;");
- push(@free_list, " VIR_FREE($1);");
- push(@free_list_on_error, "VIR_FREE($1_p);");
+ } elsif ($ret_member =~ m/^(admin|remote)_string (\S+);/) {
+ push(@vars_list, "char *$2 = NULL");
+ push(@vars_list, "char **$2_p = NULL");
+ push(@ret_list, "ret->$2 = $2_p;");
+ push(@free_list, " VIR_FREE($2);");
+ push(@free_list_on_error, "VIR_FREE($2_p);");
push(@prepare_ret_list,
- "if (VIR_ALLOC($1_p) < 0)\n" .
+ "if (VIR_ALLOC($2_p) < 0)\n" .
" goto cleanup;\n" .
" \n" .
- " if (VIR_STRDUP(*$1_p, $1) < 0)\n".
+ " if (VIR_STRDUP(*$2_p, $2) < 0)\n".
" goto cleanup;\n");
- $single_ret_var = $1;
+ $single_ret_var = $2;
$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+);/) {
@@ -819,9 +820,7 @@ elsif ($mode eq "server") {
die "multi-return-value without insert@<offset> annotation:
$call->{ret}";
}
- if (! @args_list) {
- push(@args_list, "priv->conn");
- }
+ push_privconn(\@args_list);
my $struct_name = $call->{ProcName};
$struct_name =~ s/Get//;
@@ -871,7 +870,12 @@ elsif ($mode eq "server") {
foreach my $var (@vars_list) {
print " $var;\n";
}
- print " struct daemonClientPrivate *priv =\n";
+
+ if ($structprefix eq "admin") {
+ print " struct daemonAdmClientPrivate *priv =\n";
+ } else {
+ print " struct daemonClientPrivate *priv =\n";
+ }
print " virNetServerClientGetPrivateData(client);\n";
if ($call->{streamflag} ne "none") {
@@ -880,7 +884,13 @@ elsif ($mode eq "server") {
}
print "\n";
- print " if (!priv->conn) {\n";
+
+ if ($structprefix eq "admin") {
+ print " if (!priv->dmn) {\n";
+ } else {
+ print " if (!priv->conn) {\n";
+ }
+
print " virReportError(VIR_ERR_INTERNAL_ERROR, \"%s\",
_(\"connection not open\"));\n";
print " goto cleanup;\n";
print " }\n";
@@ -919,18 +929,15 @@ elsif ($mode eq "server") {
}
if ($rettype eq "void") {
- print " if (vir$call->{ProcName}(";
+ print " if ($prefix$call->{ProcName}(";
print join(', ', @args_list);
print ") < 0)\n";
print " goto cleanup;\n";
print "\n";
} elsif (!$multi_ret) {
- my $prefix = "";
my $proc_name = $call->{ProcName};
- if (! @args_list) {
- push(@args_list, "priv->conn");
- }
+ push_privconn(\@args_list);
if ($structprefix eq "qemu" &&
$call->{ProcName} =~ /^(Connect)?Domain/) {
@@ -949,7 +956,7 @@ elsif ($mode eq "server") {
}
if ($single_ret_by_ref) {
- print " if (vir$prefix$proc_name(";
+ print " if ($prefix$proc_name(";
print join(', ', @args_list);
if (defined $single_ret_var) {
@@ -958,7 +965,7 @@ elsif ($mode eq "server") {
print ") < 0)\n";
} else {
- print " if (($single_ret_var = vir$prefix$proc_name(";
+ print " if (($single_ret_var = $prefix$proc_name(";
print join(', ', @args_list);
print "))$single_ret_check)\n";
}
@@ -1132,14 +1139,14 @@ elsif ($mode eq "client") {
} elsif ($args_member =~ m/^remote_uuid (\S+);/) {
push(@args_list, "const unsigned char *$1");
push(@setters_list, "memcpy(args.$1, $1,
VIR_UUID_BUFLEN);");
- } elsif ($args_member =~ m/^remote_string (\S+);/) {
- push(@args_list, "const char *$1");
- push(@setters_list, "args.$1 = $1 ? (char **)&$1 :
NULL;");
- } elsif ($args_member =~ m/^remote_nonnull_string
(\S+)<(\S+)>;(.*)$/) {
+ } elsif ($args_member =~ m/^(admin|remote)_string (\S+);/) {
+ push(@args_list, "const char *$2");
+ push(@setters_list, "args.$2 = $2 ? (char **)&$2 :
NULL;");
+ } elsif ($args_member =~ m/^(admin|remote)_nonnull_string
(\S+)<(\S+)>;(.*)$/) {
my $type_name = "const char **";
- my $arg_name = $1;
- my $limit = $2;
- my $annotation = $3;
+ my $arg_name = $2;
+ my $limit = $3;
+ my $annotation = $4;
if ($annotation ne "") {
if ($annotation =~ m/\s*\/\*\s*\((.*)\)\s*\*\//) {
@@ -1153,10 +1160,10 @@ elsif ($mode eq "client") {
push(@args_list, "unsigned int ${arg_name}len");
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 => $2
});
- } elsif ($args_member =~ m/^remote_nonnull_string (\S+);/) {
- push(@args_list, "const char *$1");
- push(@setters_list, "args.$1 = (char *)$1;");
+ push(@args_check_list, { name =>
"\"$arg_name\"", arg => "${arg_name}len", limit => $3
});
+ } elsif ($args_member =~ m/^(admin|remote)_nonnull_string (\S+);/) {
+ push(@args_list, "const char *$2");
+ push(@setters_list, "args.$2 = (char *)$2;");
} elsif ($args_member =~ m/^opaque (\S+)<(\S+)>;(.*)$/) {
my $type_name = "const char *";
my $arg_name = $1;
@@ -1183,9 +1190,9 @@ elsif ($mode eq "client") {
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/^remote_string (\S+)<(\S+)>;/) {
- my $arg_name = $1;
- my $limit = $2;
+ } elsif ($args_member =~ m/^(admin|remote)_string (\S+)<(\S+)>;/)
{
+ my $arg_name = $2;
+ my $limit = $3;
push(@args_list, "const char *$arg_name");
push(@args_list, "int ${arg_name}len");
@@ -1241,15 +1248,15 @@ elsif ($mode eq "client") {
}
if ($is_first_arg and $priv_src eq "conn") {
- unshift(@args_list, "virConnectPtr conn");
+ unshift(@args_list, "$connect_ptr conn");
}
$is_first_arg = 0;
}
}
- if (! @args_list) {
- push(@args_list, "virConnectPtr conn");
+ if (!@args_list) {
+ push(@args_list, "$connect_ptr conn");
}
# handle return values of the function
@@ -1300,25 +1307,25 @@ elsif ($mode eq "client") {
die "unhandled type for multi-return-value for " .
"procedure $call->{name}: $ret_member";
}
- } elsif ($ret_member =~ m/^remote_nonnull_string
(\S+)<(\S+)>;\s*\/\*\s*insert@(\d+)\s*\*\//) {
- splice(@args_list, int($3), 0, ("char **const $1"));
- push(@ret_list, "rv = ret.$1.$1_len;");
+ } elsif ($ret_member =~ m/^(admin|remote)_nonnull_string
(\S+)<(\S+)>;\s*\/\*\s*insert@(\d+)\s*\*\//) {
+ splice(@args_list, int($4), 0, ("char **const $2"));
+ push(@ret_list, "rv = ret.$2.$2_len;");
$single_ret_var = "int rv = -1";
$single_ret_type = "int";
$single_ret_as_list = 1;
- $single_ret_list_name = $1;
- $single_ret_list_max_var = "max$1";
- $single_ret_list_max_define = $2;
- } elsif ($ret_member =~ m/^remote_nonnull_string (\S+)<\S+>;/) {
+ $single_ret_list_name = $2;
+ $single_ret_list_max_var = "max$2";
+ $single_ret_list_max_define = $3;
+ } elsif ($ret_member =~ m/^(admin|remote)_nonnull_string
(\S+)<\S+>;/) {
# error out on unannotated arrays
- die "remote_nonnull_string array without insert@<offset>
annotation: $ret_member";
- } elsif ($ret_member =~ m/^remote_nonnull_string (\S+);/) {
- push(@ret_list, "rv = ret.$1;");
+ die "$1_nonnull_string array without insert@<offset>
annotation: $ret_member";
+ } elsif ($ret_member =~ m/^(admin|remote)_nonnull_string (\S+);/) {
+ push(@ret_list, "rv = ret.$2;");
$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);");
+ } elsif ($ret_member =~ m/^(admin|remote)_string (\S+);/) {
+ push(@ret_list, "rv = ret.$2 ? *ret.$2 : NULL;");
+ push(@ret_list, "VIR_FREE(ret.$2);");
$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+);/) {
@@ -1442,7 +1449,11 @@ elsif ($mode eq "client") {
my $proc = $call->{ProcName};
my $extra = $structprefix;
$extra =~ s/^(\w)/uc $1/e;
- $proc =~ s/^(Domain)(.*)/$1 . $extra . $2/e;
+ if ($structprefix eq "admin") {
+ $proc = $extra . $proc;
+ } else {
+ $proc =~ s/^(Domain)(.*)/$1 . $extra . $2/e;
+ }
print "remote$proc(";
}
@@ -1451,7 +1462,11 @@ elsif ($mode eq "client") {
print ")\n";
print "{\n";
print " $single_ret_var;\n";
- print " struct private_data *priv = $priv_src->privateData;\n";
+ if ($structprefix eq "admin") {
+ print " remoteAdminPrivPtr priv =
$priv_src->privateData;\n";
+ } else {
+ print " struct private_data *priv =
$priv_src->privateData;\n";
+ }
foreach my $var (@vars_list) {
print " $var;\n";
@@ -1466,7 +1481,11 @@ elsif ($mode eq "client") {
}
print "\n";
- print " remoteDriverLock(priv);\n";
+ if ($structprefix eq "admin") {
+ print " virObjectLock(priv);\n";
+ } else {
+ print " remoteDriverLock(priv);\n";
+ }
if ($call->{streamflag} ne "none") {
print "\n";
@@ -1546,8 +1565,12 @@ elsif ($mode eq "client") {
$callflags = "REMOTE_CALL_LXC";
}
+ if ($structprefix ne "admin") {
+ $priv_src = "$priv_src, priv";
+ }
+
print "\n";
- print " if (call($priv_src, priv, $callflags,
$call->{constname},\n";
+ print " if (call($priv_src, $callflags, $call->{constname},\n";
print " (xdrproc_t)xdr_$argtype, (char *)$call_args,\n";
print " (xdrproc_t)xdr_$rettype, (char *)$call_ret) == -1)
{\n";
@@ -1622,7 +1645,12 @@ elsif ($mode eq "client") {
print join("\n", @free_list);
- print " remoteDriverUnlock(priv);\n";
+ if ($structprefix eq "admin") {
+ print " virObjectUnlock(priv);\n";
+ } else {
+ print " remoteDriverUnlock(priv);\n";
+ }
+
print " return rv;\n";
print "}\n";
}
@@ -1682,7 +1710,7 @@ elsif ($mode eq "client") {
next if $call->{acl}->[0] eq "none";
if ($mode eq "aclsym") {
- my $apiname = "vir" . $call->{ProcName};
+ my $apiname = $prefix . $call->{ProcName};
if ($structprefix eq "qemu") {
$apiname =~ s/(vir(Connect)?Domain)/${1}Qemu/;
} elsif ($structprefix eq "lxc") {
@@ -1722,7 +1750,7 @@ elsif ($mode eq "client") {
}
}
- my $apiname = "vir" . $call->{ProcName};
+ my $apiname = $prefix . $call->{ProcName};
if ($structprefix eq "qemu") {
$apiname =~ s/(vir(Connect)?Domain)/${1}Qemu/;
} elsif ($structprefix eq "lxc") {
@@ -1735,7 +1763,7 @@ elsif ($mode eq "client") {
$object =~ s/^(\w)/uc $1/e;
$object =~ s/_(\w)/uc $1/e;
$object =~ s/Nwfilter/NWFilter/;
- my $objecttype = "vir" . $object . "DefPtr";
+ my $objecttype = $prefix . $object . "DefPtr";
$apiname .= $action . "ACL";
if ($arg eq "interface") {
@@ -1743,7 +1771,7 @@ elsif ($mode eq "client") {
}
my @argdecls;
- push @argdecls, "virConnectPtr conn";
+ push @argdecls, "$connect_ptr conn";
if ($object ne "Connect") {
if ($object eq "StorageVol") {
push @argdecls, "virStoragePoolDefPtr pool";
@@ -1834,7 +1862,7 @@ elsif ($mode eq "client") {
sub generate_aclapi {
my $call = shift;
- my $apiname = "vir" . $call->{ProcName};
+ my $apiname = $prefix . $call->{ProcName};
if ($structprefix eq "qemu") {
$apiname =~ s/(vir(Connect)?Domain)/${1}Qemu/;
} elsif ($structprefix eq "lxc") {
--
2.4.3