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.
+