diff --git a/docs/reference/gtk/broadwayd.xml b/docs/reference/gtk/broadwayd.xml
index 14f7064c0c..207b6c9f2f 100644
--- a/docs/reference/gtk/broadwayd.xml
+++ b/docs/reference/gtk/broadwayd.xml
@@ -32,6 +32,7 @@
broadwayd
--port PORT
--address ADDRESS
+--unixsocket ADDRESS
:DISPLAY
@@ -80,6 +81,13 @@ openssl passwd -1 > ~/.config/broadway.passwd
address, instead of the default http://127.0.0.1:PORT.
+
+ --unixsocket
+ Use ADDRESS as the unix domain socket
+ address. This option overrides --address and --port.
+ It is available only on Unix-like systems.
+
+
diff --git a/gdk/broadway/broadway-server.c b/gdk/broadway/broadway-server.c
index fc97bf416c..86c6920e9c 100644
--- a/gdk/broadway/broadway-server.c
+++ b/gdk/broadway/broadway-server.c
@@ -1270,6 +1270,52 @@ broadway_server_new (char *address, int port, GError **error)
return server;
}
+BroadwayServer *
+broadway_server_on_unix_socket_new (char *address, GError **error)
+{
+ BroadwayServer *server;
+ GSocketAddress *socket_address;
+
+ server = g_object_new (BROADWAY_TYPE_SERVER, NULL);
+ server->port = -1;
+ server->address = g_strdup (address);
+
+ if (address == NULL)
+ {
+ g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_DATA, "Unspecified unix domain socket address");
+ g_object_unref (server);
+ return NULL;
+ }
+ else
+ {
+ socket_address = g_unix_socket_address_new (address);
+ if (socket_address == NULL)
+ {
+ g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_DATA, "Invalid unix domain socket address %s: ", address);
+ g_object_unref (server);
+ return NULL;
+ }
+ if (!g_socket_listener_add_address (G_SOCKET_LISTENER (server->service),
+ socket_address,
+ G_SOCKET_TYPE_STREAM,
+ G_SOCKET_PROTOCOL_DEFAULT,
+ G_OBJECT (server),
+ NULL,
+ error))
+ {
+ g_prefix_error (error, "Unable to listen to %s: ", server->address);
+ g_object_unref (socket_address);
+ g_object_unref (server);
+ return NULL;
+ }
+ g_object_unref (socket_address);
+ }
+
+ g_signal_connect (server->service, "incoming",
+ G_CALLBACK (handle_incoming_connection), NULL);
+ return server;
+}
+
guint32
broadway_server_get_last_seen_time (BroadwayServer *server)
{
diff --git a/gdk/broadway/broadway-server.h b/gdk/broadway/broadway-server.h
index 1021e44451..cbe656ed28 100644
--- a/gdk/broadway/broadway-server.h
+++ b/gdk/broadway/broadway-server.h
@@ -22,6 +22,8 @@ typedef struct _BroadwayServerClass BroadwayServerClass;
BroadwayServer *broadway_server_new (char *address,
int port,
GError **error);
+BroadwayServer *broadway_server_on_unix_socket_new (char *address,
+ GError **error);
gboolean broadway_server_has_client (BroadwayServer *server);
void broadway_server_flush (BroadwayServer *server);
void broadway_server_sync (BroadwayServer *server);
diff --git a/gdk/broadway/broadwayd.c b/gdk/broadway/broadwayd.c
index 84f95eee3e..30448ac76f 100644
--- a/gdk/broadway/broadwayd.c
+++ b/gdk/broadway/broadwayd.c
@@ -417,12 +417,16 @@ main (int argc, char *argv[])
GSocketService *listener;
char *path, *basename;
char *http_address = NULL;
+ char *unixsocket_address = NULL;
int http_port = 0;
char *display;
int port = 0;
const GOptionEntry entries[] = {
{ "port", 'p', 0, G_OPTION_ARG_INT, &http_port, "Httpd port", "PORT" },
{ "address", 'a', 0, G_OPTION_ARG_STRING, &http_address, "Ip address to bind to ", "ADDRESS" },
+#ifdef G_OS_UNIX
+ { "unixsocket", 'u', 0, G_OPTION_ARG_STRING, &unixsocket_address, "Unix domain socket address", "ADDRESS" },
+#endif
{ NULL }
};
@@ -486,7 +490,11 @@ main (int argc, char *argv[])
if (http_port == 0)
http_port = 8080 + port;
- server = broadway_server_new (http_address, http_port, &error);
+ if (unixsocket_address != NULL)
+ server = broadway_server_on_unix_socket_new (unixsocket_address, &error);
+ else
+ server = broadway_server_new (http_address, http_port, &error);
+
if (server == NULL)
{
g_printerr ("%s\n", error->message);