return DBUS_HANDLER_RESULT_HANDLED;
}
- pa_client_conf_free(conf);
-
if (conf->default_dbus_server) {
- if (!(address = dbus_address_escape_value(conf->default_dbus_server)))
- goto oom;
+ address = pa_xstrdup(conf->default_dbus_server);
} else {
if (!(address = pa_get_dbus_address_from_server_type(sl->core->server_type))) {
- if (!(reply = dbus_message_new_error(msg, DBUS_ERROR_FAILED, "get_dbus_server_from_type() failed.")))
+ if (!(reply = dbus_message_new_error(msg, DBUS_ERROR_FAILED, "PulseAudio internal error: get_dbus_server_from_type() failed.")))
goto fail;
if (!dbus_connection_send(conn, reply, NULL))
goto oom;
if (!dbus_connection_send(conn, reply, NULL))
goto oom;
- pa_log_debug("handle_get_dbus_address(): Sent reply with address '%s'.", address);
-
+ pa_client_conf_free(conf);
pa_xfree(address);
-
dbus_message_unref(reply);
return DBUS_HANDLER_RESULT_HANDLED;
#define CLEANUP_INTERVAL 10 /* seconds */
+enum server_type {
+ SERVER_TYPE_LOCAL,
+ SERVER_TYPE_TCP
+};
+
struct server;
struct connection;
struct server {
struct userdata *userdata;
+ enum server_type type;
DBusServer *dbus_server;
};
pa_log_info("Connection killed.");
}
+static dbus_bool_t user_check_cb(DBusConnection *connection, unsigned long uid, void *data) {
+ pa_log_debug("Allowing connection by user %lu.", uid);
+
+ return TRUE;
+}
+
/* Called by D-Bus when a new client connection is received. */
static void connection_new_cb(DBusServer *dbus_server, DBusConnection *new_connection, void *data) {
struct server *s = data;
client = pa_client_new(s->userdata->module->core, &new_data);
pa_client_new_data_done(&new_data);
- if (!client)
+ if (!client) {
+ dbus_connection_close(new_connection);
return;
+ }
+
+ if (s->type == SERVER_TYPE_TCP) {
+ /* FIXME: Here we allow anyone from anywhere to access the server,
+ * anonymously. Access control should be configurable. */
+ dbus_connection_set_unix_user_function(new_connection, user_check_cb, NULL, NULL);
+ dbus_connection_set_allow_anonymous(new_connection, TRUE);
+ }
c = pa_xnew(struct connection, 1);
c->server = s;
pa_xfree(s);
}
-static struct server *start_server(struct userdata *u, const char *address) {
+static struct server *start_server(struct userdata *u, const char *address, enum server_type type) {
/* XXX: We assume that when we unref the DBusServer instance at module
* shutdown, nobody else holds any references to it. If we stop assuming
* that someday, dbus_server_set_new_connection_function,
address = pa_get_dbus_address_from_server_type(u->module->core->server_type);
- s = start_server(u, address); /* May return NULL */
+ s = start_server(u, address, SERVER_TYPE_LOCAL); /* May return NULL */
pa_xfree(address);
}
static struct server *start_tcp_server(struct userdata *u) {
- pa_log("start_tcp_server(): Not implemented!");
- return NULL;
+ struct server *s = NULL;
+ char *address = NULL;
+
+ pa_assert(u);
+
+ address = pa_sprintf_malloc("tcp:host=127.0.0.1,port=%u", u->tcp_port);
+
+ s = start_server(u, address, SERVER_TYPE_TCP); /* May return NULL */
+
+ pa_xfree(address);
+
+ return s;
}
static int get_access_arg(pa_modargs *ma, pa_bool_t *local_access, pa_bool_t *remote_access) {
*remote_access = TRUE;
} else if (!strcmp(value, "local,remote")) {
*local_access = TRUE;
- *local_access = TRUE;
+ *remote_access = TRUE;
} else
return -1;