WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH] implement xl vncviewer

To: Xen Devel <xen-devel@xxxxxxxxxxxxxxxxxxx>
Subject: [Xen-devel] [PATCH] implement xl vncviewer
From: Gianni Tedesco <gianni.tedesco@xxxxxxxxxx>
Date: Tue, 20 Jul 2010 14:58:35 +0100
Cc: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
Delivery-date: Tue, 20 Jul 2010 07:08:43 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
Implement xl vncviewer. The only difference from xm vncviewer is that we
obey the VNCVIEWER environment variable.

Signed-off-by: Gianni Tedesco <gianni.tedesco@xxxxxxxxxx>

 libxl.c       |   63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 libxl.h       |    1 
 libxl_exec.c  |    2 -
 xl.h          |    1 
 xl_cmdimpl.c  |   46 ++++++++++++++++++++++++++++++++++++++++++
 xl_cmdtable.c |    8 +++++++
 6 files changed, 120 insertions(+), 1 deletion(-)

diff -r 22eb4c611b9e tools/libxl/libxl.c
--- a/tools/libxl/libxl.c       Mon Jul 19 18:43:13 2010 +0100
+++ b/tools/libxl/libxl.c       Tue Jul 20 14:57:03 2010 +0100
@@ -834,6 +834,69 @@
     return execl(p, p, domid_s, "--num", cons_num_s, (void *)NULL) == 0 ? 0 : 
ERROR_FAIL;
 }
 
+int libxl_vncviewer_exec(struct libxl_ctx *ctx, uint32_t domid, int autopass)
+{
+    const char *vnc_port, *vfb_back;
+    const char *vnc_listen = NULL, *vnc_pass = NULL;
+    int port = 0, autopass_fd = -1;
+    char *vnc_bin, *args[] = {
+        "vncviewer",
+        NULL, /* hostname:display */
+        NULL, /* -autopass */
+        NULL,
+    };
+
+    vnc_port = libxl_xs_read(ctx, XBT_NULL,
+                            libxl_sprintf(ctx,
+                            "/local/domain/%d/console/vnc-port", domid));
+    if ( vnc_port )
+        port = atoi(vnc_port) - 5900;
+
+    vfb_back = libxl_xs_read(ctx, XBT_NULL,
+                            libxl_sprintf(ctx,
+                            "/local/domain/%d/device/vfb/0/backend", domid));
+    if ( vfb_back ) {
+        vnc_listen = libxl_xs_read(ctx, XBT_NULL,
+                            libxl_sprintf(ctx,
+                            "/local/domain/%d/console/vnc-listen", domid));
+        if ( autopass )
+            vnc_pass = libxl_xs_read(ctx, XBT_NULL,
+                            libxl_sprintf(ctx,
+                            "/local/domain/%d/console/vnc-pass", domid));
+    }
+
+    if ( NULL == vnc_listen )
+        vnc_listen = "localhost";
+
+    if ( (vnc_bin = getenv("VNCVIEWER")) )
+        args[0] = vnc_bin;
+
+    args[1] = libxl_sprintf(ctx, "%s:%d", vnc_listen, port);
+
+    if ( vnc_pass ) {
+        char tmpname[] = "/tmp/vncautopass.XXXXXX";
+        autopass_fd = mkstemp(tmpname);
+        if ( autopass_fd < 0 )
+            goto skip_autopass;
+
+        /* should never happen */
+        if ( unlink(tmpname) )
+            goto skip_autopass;
+
+        if ( libxl_write_exactly(ctx, autopass_fd, vnc_pass, strlen(vnc_pass),
+                                    tmpname, "vnc password") ) {
+            do { close(autopass_fd); } while(errno == EINTR);
+            goto skip_autopass;
+        }
+
+        args[2] = "-autopass";
+    }
+
+skip_autopass:
+    libxl_exec(autopass_fd, -1, -1, args[0], args);
+    return 0;
+}
+
 static char ** libxl_build_device_model_args(struct libxl_ctx *ctx,
                                              libxl_device_model_info *info,
                                              libxl_device_nic *vifs,
diff -r 22eb4c611b9e tools/libxl/libxl.h
--- a/tools/libxl/libxl.h       Mon Jul 19 18:43:13 2010 +0100
+++ b/tools/libxl/libxl.h       Tue Jul 20 14:57:03 2010 +0100
@@ -401,6 +401,7 @@
 int libxl_set_memory_target(struct libxl_ctx *ctx, uint32_t domid, uint32_t 
target_memkb, int enforce);
 
 int libxl_console_exec(struct libxl_ctx *ctx, uint32_t domid, int cons_num);
+int libxl_vncviewer_exec(struct libxl_ctx *ctx, uint32_t domid, int autopass);
 
 int libxl_domain_info(struct libxl_ctx*, struct libxl_dominfo *info_r,
                       uint32_t domid);
diff -r 22eb4c611b9e tools/libxl/libxl_exec.c
--- a/tools/libxl/libxl_exec.c  Mon Jul 19 18:43:13 2010 +0100
+++ b/tools/libxl/libxl_exec.c  Tue Jul 20 14:57:03 2010 +0100
@@ -53,7 +53,7 @@
     /* in case our caller set it to IGN.  subprocesses are entitled
      * to assume they got DFL. */
 
-    execv(arg0, args);
+    execvp(arg0, args);
     _exit(-1);
 }
 
diff -r 22eb4c611b9e tools/libxl/xl.h
--- a/tools/libxl/xl.h  Mon Jul 19 18:43:13 2010 +0100
+++ b/tools/libxl/xl.h  Tue Jul 20 14:57:03 2010 +0100
@@ -30,6 +30,7 @@
 int main_cd_eject(int argc, char **argv);
 int main_cd_insert(int argc, char **argv);
 int main_console(int argc, char **argv);
+int main_vncviewer(int argc, char **argv);
 int main_pcilist(int argc, char **argv);
 int main_pcidetach(int argc, char **argv);
 int main_pciattach(int argc, char **argv);
diff -r 22eb4c611b9e tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c  Mon Jul 19 18:43:13 2010 +0100
+++ b/tools/libxl/xl_cmdimpl.c  Tue Jul 20 14:57:03 2010 +0100
@@ -1652,6 +1652,52 @@
     return 1;
 }
 
+static int vncviewer(const char *domain_spec, int autopass)
+{
+    find_domain(domain_spec);
+    libxl_vncviewer_exec(&ctx, domid, autopass);
+    fprintf(stderr, "Unable to execute vncviewer\n");
+    return 1;
+}
+
+int main_vncviewer(int argc, char **argv)
+{
+    static const struct option long_options[] = {
+        {"autopass", 0, 0, 'a'},
+        {"vncviewer-autopass", 0, 0, 'a'},
+        {"help", 0, 0, 'h'},
+        {0, 0, 0, 0}
+    };
+    int opt, autopass = 0;
+
+    while (1) {
+        opt = getopt_long(argc, argv, "ah", long_options, NULL);
+        if (opt == -1)
+            break;
+
+        switch (opt) {
+        case 'a':
+            autopass = 1;
+            break;
+        case 'h':
+            help("vncviewer");
+            exit(0);
+        default:
+            fprintf(stderr, "option not supported\n");
+            break;
+        }
+    }
+
+    if (argc - optind != 1) {
+        help("vncviewer");
+        exit(2);
+    }
+
+    if (vncviewer(argv[optind], autopass))
+        exit(1);
+    exit(0);
+}
+
 void pcilist(char *dom)
 {
     libxl_device_pci *pcidevs;
diff -r 22eb4c611b9e tools/libxl/xl_cmdtable.c
--- a/tools/libxl/xl_cmdtable.c Mon Jul 19 18:43:13 2010 +0100
+++ b/tools/libxl/xl_cmdtable.c Tue Jul 20 14:57:03 2010 +0100
@@ -83,6 +83,14 @@
       "Attach to domain's console",
       "<Domain>",
     },
+    { "vncviewer",
+      &main_vncviewer,
+      "Attach to domain's VNC server.",
+      "[options] <Domain>\n"
+      "--autopass               Pass VNC password to viewer via stdin and\n"
+      "                         -autopass\n"
+      "--vncviewer-autopass     (consistency alias for --autopass)"
+    },
     { "save",
       &main_save,
       "Save a domain state to restore later",



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

<Prev in Thread] Current Thread [Next in Thread>