[libvirt] [PATCH 03/13] Teach gendispatch how to handle admin dispatching files

Martin Kletzander mkletzan at redhat.com
Tue Jun 16 09:58:20 UTC 2015


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 at 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




More information about the libvir-list mailing list