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; + } else { + if ((he = gethostbyname(buf)) == NULL) + return - 1; + saddr->sin_addr = *(struct in_addr *)he->h_addr; + } + 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 +2812,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 +5361,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 +5454,7 @@ enum { QEMU_OPTION_acpi, QEMU_OPTION_vncviewer, QEMU_OPTION_vncunused, + QEMU_OPTION_vnclisten, }; typedef struct QEMUOption { @@ -5522,6 +5533,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 +5940,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 +6326,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 +6565,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 13:01:11 2006 -0400 @@ -37,6 +37,8 @@ #include #include #include +#include +#include #include "xenctrl.h" #include "xs.h" #include @@ -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 13:01:11 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 13:01:11 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 13:01:11 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 13:01:11 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]])