All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Daniel P. Berrange" <berrange@redhat.com>
To: Anthony Liguori <aliguori@us.ibm.com>
Cc: Ian Pratt <m+Ian.Pratt@cl.cam.ac.uk>,
	xen-devel <xen-devel@lists.xensource.com>,
	Jeremy Katz <katzj@redhat.com>
Subject: Re: [PATCH] vnclisten for HVM vnc
Date: Fri, 29 Sep 2006 20:43:35 +0100	[thread overview]
Message-ID: <20060929194335.GB8564@redhat.com> (raw)
In-Reply-To: <451D5FD6.7090307@us.ibm.com>

[-- Attachment #1: Type: text/plain, Size: 3859 bytes --]

Attached is a 3rd iteration of the patch which changes address lookup so 
that gethostbyname is tried first, then falling back to inet_ntoa. Tested
it working with a variety of hostnames, some starting with digits, and 
tested with 0.0.0.0, 127.0.0.1 and a non-localhost IP.

    Signed-off-by:  Daniel P. Berrange <berrange@redhat.com>

Regards,
Dan.

On Fri, Sep 29, 2006 at 01:03:02PM -0500, Anthony Liguori wrote:
> 
> >Ok, attached is an adaptation of Jeremy's initial patch to do this. 
> >
> >The logic for determining which interface to listen on goes like this:
> >
> > - If 'vnclisten' is set in guest config, use that (can use 0.0.0.0 to
> >   indicate all interfaces)
> > - If 'vnc-listen' is set in /etc/xen/xend-config.sxp, use that
> >   (again can set it to 0.0.0.0 to listen on all interfaces by
> >    default)
> > - Else  use 127.0.0.1  
> >
> >So, this makes VNC local only by default using 127.0.0.1. Anyone who wants
> >the old behaviour can just change xend-config.sxp setting...
> >
> >   (vnc-listen '0.0.0.0')
> >
> >...which will affect all guests without an explicit setting. 
> >
> >  Signed-off-by:  Daniel P. Berrange <berrange@redhat.com>
> >
> >Regards,
> >Dan.
> >  
> >------------------------------------------------------------------------
> >
> >diff -r 593b5623a0d2 tools/examples/xend-config.sxp
> >--- a/tools/examples/xend-config.sxp	Fri Sep 29 15:40:35 2006 +0100
> >+++ b/tools/examples/xend-config.sxp	Fri Sep 29 13:01:11 2006 -0400
> >@@ -130,3 +130,8 @@
> > 
> > # The tool used for initiating virtual TPM migration
> > #(external-migration-tool '')
> >+
> >+# The interface for VNC servers to listen on. Defaults
> >+# to 127.0.0.1  To restore old 'listen everywhere' behaviour
> >+# set this to 0.0.0.0
> >+#(vnc-listen '127.0.0.1')
> >diff -r 593b5623a0d2 tools/examples/xmexample.hvm
> >--- a/tools/examples/xmexample.hvm	Fri Sep 29 15:40:35 2006 +0100
> >+++ b/tools/examples/xmexample.hvm	Fri Sep 29 13:01:11 2006 -0400
> >@@ -132,6 +132,11 @@ vnc=1
> > vnc=1
> > 
> > #----------------------------------------------------------------------------
> >+# address that should be listened on for the VNC server if vnc is set.
> >+# default is to use 'vnc-listen' setting from /etc/xen/xend-config.sxp
> >+#vnclisten="127.0.0.1"
> >+
> >+#----------------------------------------------------------------------------
> > # set VNC display number, default = domid
> > #vncdisplay=1
> > 
> >diff -r 593b5623a0d2 tools/ioemu/vl.c
> >--- a/tools/ioemu/vl.c	Fri Sep 29 15:40:35 2006 +0100
> >+++ b/tools/ioemu/vl.c	Fri Sep 29 13:01:11 2006 -0400
> >@@ -122,6 +122,7 @@ int nographic;
> > int nographic;
> > int vncviewer;
> > int vncunused;
> >+struct sockaddr_in vnclisten_addr;
> > const char* keyboard_layout = NULL;
> > int64_t ticks_per_sec;
> > char *boot_device = NULL;
> >@@ -2783,10 +2784,24 @@ fail:
> >     return -1;
> > }
> > 
> >+int parse_host(struct sockaddr_in *saddr, const char *buf)
> >+{
> >+    struct hostent *he;
> >+
> >+    if (isdigit(buf[0])) {
> >+        if (!inet_aton(buf, &saddr->sin_addr))
> >+            return -1;
> >  
> 
> Valid hostnames can begin with a digit as long as there are non-digits 
> in the name.  What I normally do is try inet_aton() iff gethostbyname 
> fails first.
> 
> Regards,
> 
> Anthony Liguori
> 
> >------------------------------------------------------------------------
> >
> >_______________________________________________
> >Xen-devel mailing list
> >Xen-devel@lists.xensource.com
> >http://lists.xensource.com/xen-devel
> >  
> 

-- 
|=- Red Hat, Engineering, Emerging Technologies, Boston.  +1 978 392 2496 -=|
|=-           Perl modules: http://search.cpan.org/~danberr/              -=|
|=-               Projects: http://freshmeat.net/~danielpb/               -=|
|=-  GnuPG: 7D3B9505   F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505  -=| 

[-- Attachment #2: xen-vnclisten-3.patch --]
[-- Type: text/plain, Size: 8810 bytes --]

diff -r 593b5623a0d2 tools/examples/xend-config.sxp
--- a/tools/examples/xend-config.sxp	Fri Sep 29 15:40:35 2006 +0100
+++ b/tools/examples/xend-config.sxp	Fri Sep 29 15:37:30 2006 -0400
@@ -130,3 +130,8 @@
 
 # The tool used for initiating virtual TPM migration
 #(external-migration-tool '')
+
+# The interface for VNC servers to listen on. Defaults
+# to 127.0.0.1  To restore old 'listen everywhere' behaviour
+# set this to 0.0.0.0
+#(vnc-listen '127.0.0.1')
diff -r 593b5623a0d2 tools/examples/xmexample.hvm
--- a/tools/examples/xmexample.hvm	Fri Sep 29 15:40:35 2006 +0100
+++ b/tools/examples/xmexample.hvm	Fri Sep 29 15:37:30 2006 -0400
@@ -132,6 +132,11 @@ vnc=1
 vnc=1
 
 #----------------------------------------------------------------------------
+# address that should be listened on for the VNC server if vnc is set.
+# default is to use 'vnc-listen' setting from /etc/xen/xend-config.sxp
+#vnclisten="127.0.0.1"
+
+#----------------------------------------------------------------------------
 # set VNC display number, default = domid
 #vncdisplay=1
 
diff -r 593b5623a0d2 tools/ioemu/vl.c
--- a/tools/ioemu/vl.c	Fri Sep 29 15:40:35 2006 +0100
+++ b/tools/ioemu/vl.c	Fri Sep 29 15:37:30 2006 -0400
@@ -122,6 +122,7 @@ int nographic;
 int nographic;
 int vncviewer;
 int vncunused;
+struct sockaddr_in vnclisten_addr;
 const char* keyboard_layout = NULL;
 int64_t ticks_per_sec;
 char *boot_device = NULL;
@@ -2783,10 +2784,22 @@ fail:
     return -1;
 }
 
+int parse_host(struct sockaddr_in *saddr, const char *buf)
+{
+    struct hostent *he;
+
+    if ((he = gethostbyname(buf)) != NULL) {
+        saddr->sin_addr = *(struct in_addr *)he->h_addr;
+    } else {
+        if (!inet_aton(buf, &saddr->sin_addr))
+            return -1;
+    }
+    return 0;
+}
+
 int parse_host_port(struct sockaddr_in *saddr, const char *str)
 {
     char buf[512];
-    struct hostent *he;
     const char *p, *r;
     int port;
 
@@ -2797,14 +2810,8 @@ int parse_host_port(struct sockaddr_in *
     if (buf[0] == '\0') {
         saddr->sin_addr.s_addr = 0;
     } else {
-        if (isdigit(buf[0])) {
-            if (!inet_aton(buf, &saddr->sin_addr))
-                return -1;
-        } else {
-            if ((he = gethostbyname(buf)) == NULL)
-                return - 1;
-            saddr->sin_addr = *(struct in_addr *)he->h_addr;
-        }
+        if (parse_host(&saddr, buf) == -1)
+            return -1;
     }
     port = strtol(p, (char **)&r, 0);
     if (r == p)
@@ -5352,6 +5359,7 @@ void help(void)
 	   "-vnc display    start a VNC server on display\n"
            "-vncviewer      start a vncviewer process for this domain\n"
            "-vncunused      bind the VNC server to an unused port\n"
+           "-vnclisten      bind the VNC server to this address\n"
            "-timeoffset     time offset (in seconds) from local time\n"
            "-acpi           disable or enable ACPI of HVM domain \n"
            "\n"
@@ -5444,6 +5452,7 @@ enum {
     QEMU_OPTION_acpi,
     QEMU_OPTION_vncviewer,
     QEMU_OPTION_vncunused,
+    QEMU_OPTION_vnclisten,
 };
 
 typedef struct QEMUOption {
@@ -5522,6 +5531,7 @@ const QEMUOption qemu_options[] = {
     { "vnc", HAS_ARG, QEMU_OPTION_vnc },
     { "vncviewer", 0, QEMU_OPTION_vncviewer },
     { "vncunused", 0, QEMU_OPTION_vncunused },
+    { "vnclisten", HAS_ARG, QEMU_OPTION_vnclisten },
     
     /* temporary options */
     { "usb", 0, QEMU_OPTION_usb },
@@ -5928,6 +5938,8 @@ int main(int argc, char **argv)
 
     nb_nics = 0;
     /* default mac address of the first network interface */
+
+    memset(&vnclisten_addr.sin_addr, 0, sizeof(vnclisten_addr.sin_addr));
     
     /* init debug */
     sprintf(qemu_dm_logfilename, "/var/log/xen/qemu-dm.%d.log", getpid());
@@ -6312,6 +6324,9 @@ int main(int argc, char **argv)
                 if (vnc_display == -1)
                     vnc_display = -2;
                 break;
+            case QEMU_OPTION_vnclisten:
+                parse_host(&vnclisten_addr, optarg);
+                break;
             }
         }
     }
@@ -6548,7 +6563,7 @@ int main(int argc, char **argv)
     if (nographic) {
         dumb_display_init(ds);
     } else if (vnc_display != -1) {
-	vnc_display = vnc_display_init(ds, vnc_display, vncunused);
+	vnc_display = vnc_display_init(ds, vnc_display, vncunused, &vnclisten_addr);
 	if (vncviewer)
 	    vnc_start_viewer(vnc_display);
 	xenstore_write_vncport(vnc_display);
diff -r 593b5623a0d2 tools/ioemu/vl.h
--- a/tools/ioemu/vl.h	Fri Sep 29 15:40:35 2006 +0100
+++ b/tools/ioemu/vl.h	Fri Sep 29 15:37:30 2006 -0400
@@ -37,6 +37,8 @@
 #include <unistd.h>
 #include <fcntl.h>
 #include <sys/stat.h>
+#include <sys/socket.h>
+#include <sys/types.h>
 #include "xenctrl.h"
 #include "xs.h"
 #include <xen/hvm/e820.h>
@@ -786,7 +788,7 @@ void cocoa_display_init(DisplayState *ds
 void cocoa_display_init(DisplayState *ds, int full_screen);
 
 /* vnc.c */
-int vnc_display_init(DisplayState *ds, int display, int find_unused);
+int vnc_display_init(DisplayState *ds, int display, int find_unused, struct sockaddr_in *addr);
 int vnc_start_viewer(int port);
 
 /* ide.c */
diff -r 593b5623a0d2 tools/ioemu/vnc.c
--- a/tools/ioemu/vnc.c	Fri Sep 29 15:40:35 2006 +0100
+++ b/tools/ioemu/vnc.c	Fri Sep 29 15:37:30 2006 -0400
@@ -1250,9 +1250,8 @@ static void vnc_listen_read(void *opaque
     }
 }
 
-int vnc_display_init(DisplayState *ds, int display, int find_unused)
-{
-    struct sockaddr_in addr;
+int vnc_display_init(DisplayState *ds, int display, int find_unused, struct sockaddr_in *addr)
+{
     int reuse_addr, ret;
     VncState *vs;
 
@@ -1290,11 +1289,10 @@ int vnc_display_init(DisplayState *ds, i
     }
 
  retry:
-    addr.sin_family = AF_INET;
-    addr.sin_port = htons(5900 + display);
-    memset(&addr.sin_addr, 0, sizeof(addr.sin_addr));
-
-    if (bind(vs->lsock, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
+    addr->sin_family = AF_INET;
+    addr->sin_port = htons(5900 + display);
+
+    if (bind(vs->lsock, (struct sockaddr *)addr, sizeof(struct sockaddr_in)) == -1) {
 	if (find_unused && errno == EADDRINUSE) {
 	    display++;
 	    goto retry;
diff -r 593b5623a0d2 tools/python/xen/xend/XendRoot.py
--- a/tools/python/xen/xend/XendRoot.py	Fri Sep 29 15:40:35 2006 +0100
+++ b/tools/python/xen/xend/XendRoot.py	Fri Sep 29 15:37:30 2006 -0400
@@ -95,6 +95,9 @@ class XendRoot:
     dom0_min_mem_default = '0'
 
     dom0_vcpus_default = '0'
+
+    """Default interface to listen for VNC connections on"""
+    xend_vnc_listen_default = '127.0.0.1'
 
     components = {}
 
@@ -272,6 +275,9 @@ class XendRoot:
     def get_console_limit(self):
         return self.get_config_int('console-limit', 1024)
 
+    def get_vnclisten_address(self):
+        return self.get_config_value('vnc-listen', self.xend_vnc_listen_default)
+
 def instance():
     """Get an instance of XendRoot.
     Use this instead of the constructor.
diff -r 593b5623a0d2 tools/python/xen/xend/image.py
--- a/tools/python/xen/xend/image.py	Fri Sep 29 15:40:35 2006 +0100
+++ b/tools/python/xen/xend/image.py	Fri Sep 29 15:37:30 2006 -0400
@@ -358,6 +358,11 @@ class HVMImageHandler(ImageHandler):
             vncunused = sxp.child_value(config, 'vncunused')
             if vncunused:
                 ret += ['-vncunused']
+            vnclisten = sxp.child_value(config, 'vnclisten')
+            if not(vnclisten):
+                vnclisten = xen.xend.XendRoot.instance().get_vnclisten_address()
+            if vnclisten:
+                ret += ['-vnclisten', vnclisten]
         return ret
 
     def createDeviceModel(self):
diff -r 593b5623a0d2 tools/python/xen/xm/create.py
--- a/tools/python/xen/xm/create.py	Fri Sep 29 15:40:35 2006 +0100
+++ b/tools/python/xen/xm/create.py	Fri Sep 29 15:37:30 2006 -0400
@@ -414,6 +414,10 @@ gopts.var('vncdisplay', val='',
 gopts.var('vncdisplay', val='',
           fn=set_value, default=None,
           use="""VNC display to use""")
+
+gopts.var('vnclisten', val='',
+          fn=set_value, default=None,
+          use="""Address for VNC server to listen on.""")
 
 gopts.var('vncunused', val='',
           fn=set_bool, default=1,
@@ -633,8 +637,9 @@ def configure_hvm(config_image, vals):
     """
     args = [ 'device_model', 'pae', 'vcpus', 'boot', 'fda', 'fdb',
              'localtime', 'serial', 'stdvga', 'isa', 'nographic', 'soundhw',
-             'vnc', 'vncdisplay', 'vncunused', 'vncconsole', 'sdl', 'display',
-             'acpi', 'apic', 'xauthority', 'usb', 'usbdevice' ]
+             'vnc', 'vncdisplay', 'vncunused', 'vncconsole', 'vnclisten',
+             'sdl', 'display', 'xauthority',
+             'acpi', 'apic', 'usb', 'usbdevice' ]
     for a in args:
         if (vals.__dict__[a]):
             config_image.append([a, vals.__dict__[a]])

[-- Attachment #3: Type: text/plain, Size: 138 bytes --]

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

      parent reply	other threads:[~2006-09-29 19:43 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-09-02 16:55 [PATCH] vnclisten for HVM vnc Jeremy Katz
2006-09-27 19:36 ` Jeremy Katz
2006-09-27 19:42   ` Daniel P. Berrange
2006-09-27 19:57     ` Jeremy Katz
2006-09-27 20:02       ` Daniel P. Berrange
2006-09-27 20:40         ` Ian Pratt
2006-09-29 17:24           ` Daniel P. Berrange
2006-09-29 18:03             ` Anthony Liguori
2006-09-29 19:02               ` Daniel P. Berrange
2006-09-29 19:43               ` Daniel P. Berrange [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20060929194335.GB8564@redhat.com \
    --to=berrange@redhat.com \
    --cc=aliguori@us.ibm.com \
    --cc=katzj@redhat.com \
    --cc=m+Ian.Pratt@cl.cam.ac.uk \
    --cc=xen-devel@lists.xensource.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.