Index: vino/server/vino-server.h =================================================================== --- vino.orig/server/vino-server.h 2006-10-13 08:41:47.000000000 +0100 +++ vino.orig/server/vino-server.h 2006-10-13 08:41:47.000000000 +0100 @@ -28,6 +28,11 @@ G_BEGIN_DECLS +#define VINO_SERVER_DEFAULT_PORT 5900 +#define VINO_SERVER_MIN_PORT 5000 +#define VINO_SERVER_MAX_PORT 50000 +#define VINO_SERVER_VALID_PORT(p) ((p) > VINO_SERVER_MIN_PORT && (p) < VINO_SERVER_MAX_PORT) + #define VINO_TYPE_SERVER (vino_server_get_type ()) #define VINO_SERVER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), VINO_TYPE_SERVER, VinoServer)) #define VINO_SERVER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), VINO_TYPE_SERVER, VinoServerClass)) @@ -71,6 +76,12 @@ void vino_server_set_pro gboolean vino_server_get_prompt_enabled (VinoServer *server); void vino_server_set_view_only (VinoServer *server, gboolean view_only); +gboolean vino_server_get_use_alternative_port (VinoServer *server); +void vino_server_set_use_alternative_port (VinoServer *server, + gboolean use_alternative_port); +int vino_server_get_alternative_port (VinoServer *server); +void vino_server_set_alternative_port (VinoServer *server, + int alternative_port); gboolean vino_server_get_view_only (VinoServer *server); void vino_server_set_local_only (VinoServer *server, gboolean local_only); Index: vino/server/vino-server.schemas.in =================================================================== --- vino.orig/server/vino-server.schemas.in 2006-10-13 08:40:53.000000000 +0100 +++ vino.orig/server/vino-server.schemas.in 2006-10-13 08:40:53.000000000 +0100 @@ -69,6 +69,38 @@ + /schemas/desktop/gnome/remote_access/use_alternative_port + /desktop/gnome/remote_access/use_alternative_port + gnome + bool + false + + Listen an alternative port + + If true, the server will listen another port, instead of + default (5900). The port must be specified in 'alternative_port' + key. + + + + + + /schemas/desktop/gnome/remote_access/alternative_port + /desktop/gnome/remote_access/alternative_port + gnome + int + 5900 + + Alternative port number + + The port which the server will listen to if the + 'use_alternative_port' key is set to true. + Valid values are in the range from 5000 to 50000. + + + + + /schemas/desktop/gnome/remote_access/require_encryption /desktop/gnome/remote_access/require_encryption gnome Index: vino/server/vino-prefs.c =================================================================== --- vino.orig/server/vino-prefs.c 2006-10-13 08:41:47.000000000 +0100 +++ vino.orig/server/vino-prefs.c 2006-10-13 08:41:47.000000000 +0100 @@ -33,11 +33,13 @@ #define VINO_PREFS_PROMPT_ENABLED VINO_PREFS_DIR "/prompt_enabled" #define VINO_PREFS_VIEW_ONLY VINO_PREFS_DIR "/view_only" #define VINO_PREFS_LOCAL_ONLY VINO_PREFS_DIR "/local_only" +#define VINO_PREFS_USE_ALTERNATIVE_PORT VINO_PREFS_DIR "/use_alternative_port" +#define VINO_PREFS_ALTERNATIVE_PORT VINO_PREFS_DIR "/alternative_port" #define VINO_PREFS_REQUIRE_ENCRYPTION VINO_PREFS_DIR "/require_encryption" #define VINO_PREFS_AUTHENTICATION_METHODS VINO_PREFS_DIR "/authentication_methods" #define VINO_PREFS_VNC_PASSWORD VINO_PREFS_DIR "/vnc_password" -#define VINO_N_LISTENERS 7 +#define VINO_N_LISTENERS 9 static GConfClient *vino_client = NULL; static GSList *vino_servers = NULL; @@ -50,6 +52,8 @@ static gboolean vino_local_only static gboolean vino_require_encryption = FALSE; static VinoAuthMethod vino_auth_methods = VINO_AUTH_VNC; static char *vino_vnc_password = NULL; +static gboolean vino_use_alternative_port = FALSE; +static int vino_alternative_port = VINO_SERVER_DEFAULT_PORT; static void @@ -259,6 +263,55 @@ vino_prefs_vnc_password_changed (GConfCl vino_server_set_vnc_password (l->data, vnc_password); } +static void +vino_prefs_use_alternative_port_changed (GConfClient *client, + guint cnxn_id, + GConfEntry *entry) +{ + gboolean enabled; + GSList *l; + + if (!entry->value || entry->value->type != GCONF_VALUE_BOOL) + return; + + enabled = gconf_value_get_bool (entry->value) != FALSE; + + if (vino_use_alternative_port == enabled) + return; + + vino_use_alternative_port = enabled; + + dprintf (PREFS, "Use alternative port changed: %s\n", + vino_use_alternative_port ? "(true)" : "(false)"); + + for (l = vino_servers; l; l = l->next) + vino_server_set_use_alternative_port (l->data, vino_use_alternative_port); +} + +static void +vino_prefs_alternative_port_changed (GConfClient *client, + guint cnxn_id, + GConfEntry *entry) +{ + GSList *l; + int port; + + if (!entry->value || entry->value->type != GCONF_VALUE_INT) + return; + + port = gconf_value_get_int (entry->value); + + if (vino_alternative_port == port || !VINO_SERVER_VALID_PORT (port)) + return; + + vino_alternative_port = port; + + dprintf (PREFS, "Alternative port changed: %d\n", vino_alternative_port); + + for (l = vino_servers; l; l = l->next) + vino_server_set_alternative_port (l->data, vino_alternative_port); +} + void vino_prefs_create_server (GdkScreen *screen) { @@ -268,6 +321,8 @@ vino_prefs_create_server (GdkScreen *scr "prompt-enabled", vino_prompt_enabled, "view-only", vino_view_only, "local-only", vino_local_only, + "use-alternative-port", vino_use_alternative_port, + "alternative-port", vino_alternative_port, "auth-methods", vino_auth_methods, "require-encryption", vino_require_encryption, "vnc-password", vino_vnc_password, @@ -316,6 +371,19 @@ vino_prefs_init (gboolean view_only) NULL); dprintf (PREFS, "Local only: %s\n", vino_local_only ? "(true)" : "(false)"); + vino_use_alternative_port = gconf_client_get_bool (vino_client, + VINO_PREFS_USE_ALTERNATIVE_PORT, + NULL); + dprintf (PREFS, "Use alternative port: %s\n", + vino_use_alternative_port ? "(true)" : "(false)"); + + vino_alternative_port = gconf_client_get_int (vino_client, + VINO_PREFS_ALTERNATIVE_PORT, + NULL); + if (!VINO_SERVER_VALID_PORT (vino_alternative_port)) + vino_alternative_port = VINO_SERVER_DEFAULT_PORT; + dprintf (PREFS, "Alternative port: %d\n", vino_alternative_port); + vino_require_encryption = gconf_client_get_bool (vino_client, VINO_PREFS_REQUIRE_ENCRYPTION, NULL); @@ -372,6 +440,21 @@ vino_prefs_init (gboolean view_only) vino_listeners [i] = gconf_client_notify_add (vino_client, + VINO_PREFS_USE_ALTERNATIVE_PORT, + (GConfClientNotifyFunc) vino_prefs_use_alternative_port_changed, + NULL, NULL, NULL); + i++; + + + vino_listeners [i] = + gconf_client_notify_add (vino_client, + VINO_PREFS_ALTERNATIVE_PORT, + (GConfClientNotifyFunc) vino_prefs_alternative_port_changed, + NULL, NULL, NULL); + i++; + + vino_listeners [i] = + gconf_client_notify_add (vino_client, VINO_PREFS_REQUIRE_ENCRYPTION, (GConfClientNotifyFunc) vino_prefs_require_encryption_changed, NULL, NULL, NULL); Index: vino/server/vino-server.c =================================================================== --- vino.orig/server/vino-server.c 2006-10-13 08:40:53.000000000 +0100 +++ vino.orig/server/vino-server.c 2006-10-13 08:40:53.000000000 +0100 @@ -63,12 +63,15 @@ struct _VinoServerPrivate VinoHTTP *http; #endif + int alternative_port; + guint on_hold : 1; guint local_only : 1; guint prompt_enabled : 1; guint view_only : 1; guint require_encryption : 1; guint last_auth_failed : 1; + guint use_alternative_port : 1; }; typedef struct @@ -92,6 +95,8 @@ enum PROP_PROMPT_ENABLED, PROP_VIEW_ONLY, PROP_LOCAL_ONLY, + PROP_USE_ALTERNATIVE_PORT, + PROP_ALTERNATIVE_PORT, PROP_REQUIRE_ENCRYPTION, PROP_AUTH_METHODS, PROP_VNC_PASSWORD @@ -673,8 +678,15 @@ vino_server_init_from_screen (VinoServer rfb_screen->rfbDeferUpdateTime = 0; rfb_screen->localOnly = server->priv->local_only; rfb_screen->autoPort = TRUE; + rfb_screen->rfbPort = VINO_SERVER_DEFAULT_PORT; rfb_screen->rfbAlwaysShared = TRUE; + if (server->priv->use_alternative_port) + { + rfb_screen->autoPort = FALSE; + rfb_screen->rfbPort = server->priv->alternative_port; + } + rfbInitServer (rfb_screen); /* libvncserver NOTE: @@ -803,6 +815,12 @@ vino_server_set_property (GObject * case PROP_VNC_PASSWORD: vino_server_set_vnc_password (server, g_value_get_string (value)); break; + case PROP_USE_ALTERNATIVE_PORT: + vino_server_set_use_alternative_port (server, g_value_get_boolean (value)); + break; + case PROP_ALTERNATIVE_PORT: + vino_server_set_alternative_port (server, g_value_get_int (value)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -843,6 +861,12 @@ vino_server_get_property (GObject *ob case PROP_VNC_PASSWORD: g_value_set_string (value, server->priv->vnc_password); break; + case PROP_USE_ALTERNATIVE_PORT: + g_value_set_boolean (value, server->priv->use_alternative_port); + break; + case PROP_ALTERNATIVE_PORT: + g_value_set_int (value, server->priv->alternative_port); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -930,6 +954,24 @@ vino_server_class_init (VinoServerClass _("The password (base64 encoded) used to authenticate types using the VncAuth method"), NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); + + g_object_class_install_property (gobject_class, + PROP_USE_ALTERNATIVE_PORT, + g_param_spec_boolean ("use-alternative-port", + _("Use an alternative port"), + _("Listen on the port specified by the 'alternative-port' property"), + FALSE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); + + g_object_class_install_property (gobject_class, + PROP_ALTERNATIVE_PORT, + g_param_spec_int ("alternative-port", + _("Alternative port number"), + _("Listen on the specified port number if the 'use-alternative-port' property is TRUE"), + VINO_SERVER_MIN_PORT, + VINO_SERVER_MAX_PORT, + VINO_SERVER_DEFAULT_PORT, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); } GType @@ -1034,6 +1076,66 @@ vino_server_set_local_only (VinoServer * } gboolean +vino_server_get_use_alternative_port (VinoServer *server) +{ + g_return_val_if_fail (VINO_IS_SERVER (server), FALSE); + + return server->priv->use_alternative_port; +} + +void +vino_server_set_use_alternative_port (VinoServer *server, + gboolean use_alternative_port) +{ + g_return_if_fail (VINO_IS_SERVER (server)); + + use_alternative_port = use_alternative_port != FALSE; + + if (server->priv->use_alternative_port != use_alternative_port) + { + server->priv->use_alternative_port = use_alternative_port; + + if (server->priv->rfb_screen) + { + if (server->priv->use_alternative_port) + rfbSetPort (server->priv->rfb_screen, + server->priv->alternative_port); + + rfbSetAutoPort (server->priv->rfb_screen, + !server->priv->use_alternative_port); + } + + g_object_notify (G_OBJECT (server), "use-alternative-port"); + } +} + +gint +vino_server_get_alternative_port (VinoServer *server) +{ + g_return_val_if_fail (VINO_IS_SERVER (server), FALSE); + + return server->priv->alternative_port; +} + +void +vino_server_set_alternative_port (VinoServer *server, + int alternative_port) +{ + g_return_if_fail (VINO_IS_SERVER (server)); + + if (server->priv->alternative_port != alternative_port) + { + server->priv->alternative_port = alternative_port; + + if (server->priv->rfb_screen && + server->priv->use_alternative_port) + rfbSetPort (server->priv->rfb_screen, server->priv->alternative_port); + + g_object_notify (G_OBJECT (server), "alternative-port"); + } +} + +gboolean vino_server_get_on_hold (VinoServer *server) { g_return_val_if_fail (VINO_IS_SERVER (server), FALSE); Index: vino/server/libvncserver/CHANGES =================================================================== --- vino.orig/server/libvncserver/CHANGES 2006-10-13 07:44:33.000000000 +0100 +++ vino.orig/server/libvncserver/CHANGES 2006-10-13 07:44:33.000000000 +0100 @@ -34,6 +34,8 @@ connections from localhost. Useful for people who use SSH tunnels. + + Added rfbSetAutoPort() and rfbSetPort() + + Removed defaultNewClientHook and made accept new clients by default. Index: vino/server/libvncserver/rfb/rfb.h =================================================================== --- vino.orig/server/libvncserver/rfb/rfb.h 2006-10-13 08:40:53.000000000 +0100 +++ vino.orig/server/libvncserver/rfb/rfb.h 2006-10-13 08:40:53.000000000 +0100 @@ -469,6 +469,8 @@ extern char rfbEndianTest; extern int rfbMaxClientWait; extern void rfbInitSockets(rfbScreenInfoPtr rfbScreen); +extern void rfbSetAutoPort(rfbScreenInfoPtr rfbScreen, rfbBool autoPort); +extern void rfbSetPort(rfbScreenInfoPtr rfbScreen, int Port); extern void rfbSetLocalOnly(rfbScreenInfoPtr rfbScreen, rfbBool localOnly); extern void rfbCloseClient(rfbClientPtr cl); extern int ReadExact(rfbClientPtr cl, char *buf, int len); Index: vino/server/libvncserver/sockets.c =================================================================== --- vino.orig/server/libvncserver/sockets.c 2006-10-13 08:41:29.000000000 +0100 +++ vino.orig/server/libvncserver/sockets.c 2006-10-13 08:41:29.000000000 +0100 @@ -104,6 +104,8 @@ int rfbMaxClientWait = 20000; /* time * connections. It does nothing if called again. */ +static void rfbInitListenSock(rfbScreenInfoPtr rfbScreen); + void rfbInitSockets(rfbScreenInfoPtr rfbScreen) { @@ -134,6 +136,12 @@ rfbInitSockets(rfbScreenInfoPtr rfbScree return; } + rfbInitListenSock(rfbScreen); +} + +static void +rfbInitListenSock(rfbScreenInfoPtr rfbScreen) +{ if(rfbScreen->autoPort) { int i; rfbLog("Autoprobing TCP port \n"); @@ -170,6 +178,46 @@ rfbInitSockets(rfbScreenInfoPtr rfbScree } void +rfbSetAutoPort(rfbScreenInfoPtr rfbScreen, rfbBool autoPort) +{ + if (rfbScreen->autoPort == autoPort) + return; + + rfbScreen->autoPort = autoPort; + + if (!rfbScreen->socketInitDone) + return; + + if (rfbScreen->rfbListenSock > 0) { + FD_CLR(rfbScreen->rfbListenSock, &(rfbScreen->allFds)); + close(rfbScreen->rfbListenSock); + rfbScreen->rfbListenSock = -1; + } + + rfbInitListenSock(rfbScreen); +} + +void +rfbSetPort(rfbScreenInfoPtr rfbScreen, int port) +{ + if (rfbScreen->rfbPort == port) + return; + + rfbScreen->rfbPort = port; + + if (!rfbScreen->socketInitDone || rfbScreen->autoPort) + return; + + if (rfbScreen->rfbListenSock > 0) { + FD_CLR(rfbScreen->rfbListenSock, &(rfbScreen->allFds)); + close(rfbScreen->rfbListenSock); + rfbScreen->rfbListenSock = -1; + } + + rfbInitListenSock(rfbScreen); +} + +void rfbSetLocalOnly(rfbScreenInfoPtr rfbScreen, rfbBool localOnly) { if (rfbScreen->localOnly == localOnly) Index: vino/ChangeLog =================================================================== --- vino.orig/ChangeLog 2006-10-13 08:08:46.000000000 +0100 +++ vino.orig/ChangeLog 2006-10-13 08:08:46.000000000 +0100 @@ -0,0 +1,38 @@ +2006-10-13 Mark McLoughlin + + Add "use_alternative_port" and "alternative_port" GConf + keys, allowing people to specify a specific port to listen + on. + + Based on patch from John Wendell + in bug #333752. + + * vino/server/vino-server.schemas.in: add new keys. + + * vino/server/vino-prefs.c: + (vino_prefs_use_alternative_port_changed), + (vino_prefs_alternative_port_changed): handle changes to new keys + (vino_prefs_create_server): create server with new props + (vino_prefs_init): read new keys and set up notify handlers + + * vino/server/vino-server.[ch]: + (vino_server_init_from_screen): explictly set port and turn + off autoPort if use_alternative_port is set. + (vino_server_set_property), (vino_server_get_property), + (vino_server_class_init): add new properties. + (vino_server_get_use_alternative_port), + (vino_server_set_use_alternative_port), + (vino_server_get_alternative_port), + (vino_server_set_alternative_port): add accessors - re-init + the listening port if things change after the server is running. + + * vino/server/libvncserver/sockets.c: + (rfbInitSockets): split out some of this into + (rfbInitListenSock): this. + (rfbSetAutoPort), (rfbSetPort): add these two. + + * vino/server/libvncserver/rfb/rfb.h: add rfbSetAutoPort() + and rfbSetPort(). + + * vino/server/libvncserver/CHANGES: add note. +