[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] Spawn vncviewer from qemu-dm.



# HG changeset patch
# User chris@xxxxxxxxxxxxxxxxxxxxxxxx
# Node ID ecb8ff1fcf1fc24561c8bd272a58828592d90806
# Parent  ccf11affc5450df201c566eaf1487fd48b288a5b
Spawn vncviewer from qemu-dm.
- add vncviewer option to qemu-dm to spawn a vncviewer process.
- add the `vncconsole' config parameter which enables qemu-dm's vncviewer
  option.

Based on a patch from: Don Dugger <donald.d.dugger@xxxxxxxxx>
Signed-off-by: Christian Limpach <Christian.Limpach@xxxxxxxxxxxxx>
---
 tools/examples/xmexample.hvm            |    5 +-
 tools/ioemu/patches/series              |    1 
 tools/ioemu/patches/vnc-start-vncviewer |   69 ++++++++++++++++++++++++++++++++
 tools/ioemu/vl.c                        |   10 ++++
 tools/ioemu/vl.h                        |    1 
 tools/ioemu/vnc.c                       |   22 ++++++++++
 tools/python/xen/xend/image.py          |   21 +--------
 tools/python/xen/xm/create.py           |   31 ++++++++------
 8 files changed, 128 insertions(+), 32 deletions(-)

diff -r ccf11affc545 -r ecb8ff1fcf1f tools/examples/xmexample.hvm
--- a/tools/examples/xmexample.hvm      Fri Jul 14 15:59:24 2006 +0100
+++ b/tools/examples/xmexample.hvm      Fri Jul 14 18:53:27 2006 +0100
@@ -134,8 +134,9 @@ vnc=1
 #vncdisplay=1
 
 #----------------------------------------------------------------------------
-# enable spawning vncviewer(only valid when vnc=1), default = 1
-vncviewer=1
+# enable spawning vncviewer for domain's console
+# (only valid when vnc=1), default = 0
+#vncconsole=0
 
 #----------------------------------------------------------------------------
 # no graphics, use serial port
diff -r ccf11affc545 -r ecb8ff1fcf1f tools/ioemu/patches/series
--- a/tools/ioemu/patches/series        Fri Jul 14 15:59:24 2006 +0100
+++ b/tools/ioemu/patches/series        Fri Jul 14 18:53:27 2006 +0100
@@ -30,3 +30,4 @@ acpi-poweroff-support
 acpi-poweroff-support
 vnc-cleanup
 vnc-fixes
+vnc-start-vncviewer
diff -r ccf11affc545 -r ecb8ff1fcf1f tools/ioemu/vl.c
--- a/tools/ioemu/vl.c  Fri Jul 14 15:59:24 2006 +0100
+++ b/tools/ioemu/vl.c  Fri Jul 14 18:53:27 2006 +0100
@@ -121,6 +121,7 @@ int bios_size;
 int bios_size;
 static DisplayState display_state;
 int nographic;
+int vncviewer;
 const char* keyboard_layout = NULL;
 int64_t ticks_per_sec;
 int boot_device = 'c';
@@ -4801,6 +4802,7 @@ void help(void)
 #endif
            "-loadvm file    start right away with a saved state (loadvm in 
monitor)\n"
           "-vnc display    start a VNC server on display\n"
+           "-vncviewer      start a vncviewer process for this domain\n"
            "-timeoffset     time offset (in seconds) from local time\n"
            "\n"
            "During emulation, the following keys are useful:\n"
@@ -4889,6 +4891,7 @@ enum {
     QEMU_OPTION_usbdevice,
     QEMU_OPTION_smp,
     QEMU_OPTION_vnc,
+    QEMU_OPTION_vncviewer,
 
     QEMU_OPTION_d,
     QEMU_OPTION_vcpus,
@@ -4964,6 +4967,7 @@ const QEMUOption qemu_options[] = {
     { "usbdevice", HAS_ARG, QEMU_OPTION_usbdevice },
     { "smp", HAS_ARG, QEMU_OPTION_smp },
     { "vnc", HAS_ARG, QEMU_OPTION_vnc },
+    { "vncviewer", 0, QEMU_OPTION_vncviewer },
     
     /* temporary options */
     { "usb", 0, QEMU_OPTION_usb },
@@ -5294,6 +5298,7 @@ int main(int argc, char **argv)
 #endif
     snapshot = 0;
     nographic = 0;
+    vncviewer = 0;
     kernel_filename = NULL;
     kernel_cmdline = "";
 #ifdef TARGET_PPC
@@ -5663,6 +5668,9 @@ int main(int argc, char **argv)
                    exit(1);
                }
                break;
+            case QEMU_OPTION_vncviewer:
+                vncviewer++;
+                break;
             case QEMU_OPTION_domainname:
                 strncat(domain_name, optarg, sizeof(domain_name) - 20);
                 break;
@@ -5881,6 +5889,8 @@ int main(int argc, char **argv)
         dumb_display_init(ds);
     } else if (vnc_display != -1) {
        vnc_display_init(ds, vnc_display);
+       if (vncviewer)
+           vnc_start_viewer(vnc_display);
     } else {
 #if defined(CONFIG_SDL)
         sdl_display_init(ds, full_screen);
diff -r ccf11affc545 -r ecb8ff1fcf1f tools/ioemu/vl.h
--- a/tools/ioemu/vl.h  Fri Jul 14 15:59:24 2006 +0100
+++ b/tools/ioemu/vl.h  Fri Jul 14 18:53:27 2006 +0100
@@ -732,6 +732,7 @@ void cocoa_display_init(DisplayState *ds
 
 /* vnc.c */
 void vnc_display_init(DisplayState *ds, int display);
+int vnc_start_viewer(int port);
 
 /* ide.c */
 #define MAX_DISKS 4
diff -r ccf11affc545 -r ecb8ff1fcf1f tools/ioemu/vnc.c
--- a/tools/ioemu/vnc.c Fri Jul 14 15:59:24 2006 +0100
+++ b/tools/ioemu/vnc.c Fri Jul 14 18:53:27 2006 +0100
@@ -999,3 +999,25 @@ void vnc_display_init(DisplayState *ds, 
 
     vnc_dpy_resize(vs->ds, 640, 400);
 }
+
+int vnc_start_viewer(int port)
+{
+    int pid;
+    char s[16];
+
+    sprintf(s, ":%d", port);
+
+    switch (pid = fork()) {
+    case -1:
+       fprintf(stderr, "vncviewer failed fork\n");
+       exit(1);
+
+    case 0:    /* child */
+       execlp("vncviewer", "vncviewer", s, 0);
+       fprintf(stderr, "vncviewer execlp failed\n");
+       exit(1);
+
+    default:
+       return pid;
+    }
+}
diff -r ccf11affc545 -r ecb8ff1fcf1f tools/python/xen/xend/image.py
--- a/tools/python/xen/xend/image.py    Fri Jul 14 15:59:24 2006 +0100
+++ b/tools/python/xen/xend/image.py    Fri Jul 14 18:53:27 2006 +0100
@@ -208,6 +208,7 @@ class HVMImageHandler(ImageHandler):
             raise VmError("hvm: missing device model")
         self.display = sxp.child_value(imageConfig, 'display')
         self.xauthority = sxp.child_value(imageConfig, 'xauthority')
+        self.vncconsole = sxp.child_value(imageConfig, 'vncconsole')
 
         self.vm.storeVm(("image/dmargs", " ".join(self.dmargs)),
                         ("image/device-model", self.device_model),
@@ -335,11 +336,7 @@ class HVMImageHandler(ImageHandler):
             return
         # Execute device model.
         #todo: Error handling
-        # XXX RN: note that the order of args matter!
         args = [self.device_model]
-        vnc = self.vncParams()
-        if len(vnc):
-            args = args + vnc
         args = args + ([ "-d",  "%d" % self.vm.getDomid(),
                   "-m", "%s" % (self.vm.getMemoryTarget() / 1024)])
         args = args + self.dmargs
@@ -348,23 +345,11 @@ class HVMImageHandler(ImageHandler):
             env['DISPLAY'] = self.display
         if self.xauthority:
             env['XAUTHORITY'] = self.xauthority
+        if self.vncconsole:
+            args = args + ([ "-vncviewer" ])
         log.info("spawning device models: %s %s", self.device_model, args)
         self.pid = os.spawnve(os.P_NOWAIT, self.device_model, args, env)
         log.info("device model pid: %d", self.pid)
-
-    def vncParams(self):
-        # see if a vncviewer was specified
-        # XXX RN: bit of a hack. should unify this, maybe stick in config space
-        vncconnect=[]
-        args = self.cmdline
-        if args:
-            arg_list = string.split(args)
-            for arg in arg_list:
-                al = string.split(arg, '=')
-                if al[0] == "VNC_VIEWER":
-                    vncconnect=["-vncconnect", "%s" % al[1]]
-                    break
-        return vncconnect
 
     def destroy(self):
         self.unregister_shutdown_watch();
diff -r ccf11affc545 -r ecb8ff1fcf1f tools/python/xen/xm/create.py
--- a/tools/python/xen/xm/create.py     Fri Jul 14 15:59:24 2006 +0100
+++ b/tools/python/xen/xm/create.py     Fri Jul 14 18:53:27 2006 +0100
@@ -109,6 +109,12 @@ gopts.var('vncviewer', val='no|yes',
           The address of the vncviewer is passed to the domain on the kernel 
command
           line using 'VNC_SERVER=<host>:<port>'. The port used by vnc is 5500 
+ DISPLAY.
           A display value with a free port is chosen if possible.
+          Only valid when vnc=1.
+          """)
+
+gopts.var('vncconsole', val='no|yes',
+          fn=set_bool, default=None,
+          use="""Spawn a vncviewer process for the domain's graphical console.
           Only valid when vnc=1.
           """)
 
@@ -625,7 +631,7 @@ def configure_hvm(config_image, vals):
     """
     args = [ 'device_model', 'pae', 'vcpus', 'cdrom', 'boot', 'fda', 'fdb',
              'localtime', 'serial', 'stdvga', 'isa', 'nographic', 'audio',
-             'vnc', 'vncdisplay', 'vncviewer', 'sdl', 'display',
+             'vnc', 'vncdisplay', 'vncconsole', 'sdl', 'display',
              'acpi', 'apic', 'xauthority', 'usb', 'usbdevice' ]
     for a in args:
         if (vals.__dict__[a]):
@@ -854,17 +860,18 @@ def preprocess_vnc(vals):
     """If vnc was specified, spawn a vncviewer in listen mode
     and pass its address to the domain on the kernel command line.
     """
-    if not (vals.vnc and vals.vncviewer) or vals.dryrun: return
-    vnc_display = choose_vnc_display()
-    if not vnc_display:
-        warn("No free vnc display")
-        return
-    print 'VNC=', vnc_display
-    vnc_port = spawn_vnc(vnc_display)
-    if vnc_port > 0:
-        vnc_host = get_host_addr()
-        vnc = 'VNC_VIEWER=%s:%d' % (vnc_host, vnc_port)
-        vals.extra = vnc + ' ' + vals.extra
+    if vals.dryrun: return
+    if vals.vncviewer:
+        vnc_display = choose_vnc_display()
+        if not vnc_display:
+            warn("No free vnc display")
+            return
+        print 'VNC=', vnc_display
+        vnc_port = spawn_vnc(vnc_display)
+        if vnc_port > 0:
+            vnc_host = get_host_addr()
+            vnc = 'VNC_VIEWER=%s:%d' % (vnc_host, vnc_port)
+            vals.extra = vnc + ' ' + vals.extra
     
 def preprocess(vals):
     if not vals.kernel and not vals.bootloader:
diff -r ccf11affc545 -r ecb8ff1fcf1f tools/ioemu/patches/vnc-start-vncviewer
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/ioemu/patches/vnc-start-vncviewer   Fri Jul 14 18:53:27 2006 +0100
@@ -0,0 +1,105 @@
+Index: ioemu/vnc.c
+===================================================================
+--- ioemu.orig/vnc.c   2006-07-14 18:29:36.810169908 +0100
++++ ioemu/vnc.c        2006-07-14 18:30:17.437628819 +0100
+@@ -999,3 +999,25 @@
+ 
+     vnc_dpy_resize(vs->ds, 640, 400);
+ }
++
++int vnc_start_viewer(int port)
++{
++    int pid;
++    char s[16];
++
++    sprintf(s, ":%d", port);
++
++    switch (pid = fork()) {
++    case -1:
++      fprintf(stderr, "vncviewer failed fork\n");
++      exit(1);
++
++    case 0:   /* child */
++      execlp("vncviewer", "vncviewer", s, 0);
++      fprintf(stderr, "vncviewer execlp failed\n");
++      exit(1);
++
++    default:
++      return pid;
++    }
++}
+Index: ioemu/vl.c
+===================================================================
+--- ioemu.orig/vl.c    2006-07-14 18:29:36.809170020 +0100
++++ ioemu/vl.c 2006-07-14 18:30:17.435629043 +0100
+@@ -121,6 +121,7 @@
+ int bios_size;
+ static DisplayState display_state;
+ int nographic;
++int vncviewer;
+ const char* keyboard_layout = NULL;
+ int64_t ticks_per_sec;
+ int boot_device = 'c';
+@@ -4801,6 +4802,7 @@
+ #endif
+            "-loadvm file    start right away with a saved state (loadvm in 
monitor)\n"
+          "-vnc display    start a VNC server on display\n"
++           "-vncviewer      start a vncviewer process for this domain\n"
+            "-timeoffset     time offset (in seconds) from local time\n"
+            "\n"
+            "During emulation, the following keys are useful:\n"
+@@ -4889,6 +4891,7 @@
+     QEMU_OPTION_usbdevice,
+     QEMU_OPTION_smp,
+     QEMU_OPTION_vnc,
++    QEMU_OPTION_vncviewer,
+ 
+     QEMU_OPTION_d,
+     QEMU_OPTION_vcpus,
+@@ -4964,6 +4967,7 @@
+     { "usbdevice", HAS_ARG, QEMU_OPTION_usbdevice },
+     { "smp", HAS_ARG, QEMU_OPTION_smp },
+     { "vnc", HAS_ARG, QEMU_OPTION_vnc },
++    { "vncviewer", 0, QEMU_OPTION_vncviewer },
+     
+     /* temporary options */
+     { "usb", 0, QEMU_OPTION_usb },
+@@ -5294,6 +5298,7 @@
+ #endif
+     snapshot = 0;
+     nographic = 0;
++    vncviewer = 0;
+     kernel_filename = NULL;
+     kernel_cmdline = "";
+ #ifdef TARGET_PPC
+@@ -5663,6 +5668,9 @@
+                   exit(1);
+               }
+               break;
++            case QEMU_OPTION_vncviewer:
++                vncviewer++;
++                break;
+             case QEMU_OPTION_domainname:
+                 strncat(domain_name, optarg, sizeof(domain_name) - 20);
+                 break;
+@@ -5881,6 +5889,8 @@
+         dumb_display_init(ds);
+     } else if (vnc_display != -1) {
+       vnc_display_init(ds, vnc_display);
++      if (vncviewer)
++          vnc_start_viewer(vnc_display);
+     } else {
+ #if defined(CONFIG_SDL)
+         sdl_display_init(ds, full_screen);
+Index: ioemu/vl.h
+===================================================================
+--- ioemu.orig/vl.h    2006-07-14 18:29:36.810169908 +0100
++++ ioemu/vl.h 2006-07-14 18:30:17.436628931 +0100
+@@ -732,6 +732,7 @@
+ 
+ /* vnc.c */
+ void vnc_display_init(DisplayState *ds, int display);
++int vnc_start_viewer(int port);
+ 
+ /* ide.c */
+ #define MAX_DISKS 4

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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.