diff options
Diffstat (limited to 'audio/manager.c')
| -rw-r--r-- | audio/manager.c | 83 | 
1 files changed, 83 insertions, 0 deletions
| diff --git a/audio/manager.c b/audio/manager.c index 32eea81b..a7e3afd9 100644 --- a/audio/manager.c +++ b/audio/manager.c @@ -25,14 +25,93 @@  #include <config.h>  #endif +#include <stdio.h> +#include <errno.h> +#include <unistd.h> +#include <sys/socket.h> +#include <sys/un.h> + +#include <glib.h> +  #include <dbus/dbus.h> +#include "dbus.h" +#include "logging.h" +  #include "manager.h" +#ifndef UNIX_PATH_MAX +#define UNIX_PATH_MAX 108 +#endif + +#define SOCKET_NAME "/org/bluez/audio" +  static DBusConnection *connection = NULL; +static int unix_sock = -1; + +static gboolean unix_event(GIOChannel *chan, GIOCondition cond, gpointer data) +{ +	struct sockaddr_un addr; +	socklen_t addrlen; +	unsigned char buf[128]; +	int sk, len; + +	debug("chan %p cond %td data %p", chan, cond, data); + +	if (cond & G_IO_NVAL) +		return FALSE; + +	if (cond & (G_IO_HUP | G_IO_ERR)) { +		g_io_channel_close(chan); +		return FALSE; +	} + +	sk = g_io_channel_unix_get_fd(chan); + +	memset(&addr, 0, sizeof(addr)); +	addrlen = sizeof(addr); + +	len = recvfrom(sk, buf, sizeof(buf), 0, (struct sockaddr *) &addr, &addrlen); + +	debug("path %s len %d", addr.sun_path + 1, len); + +	return TRUE; +} +  int audio_init(DBusConnection *conn)  { +	GIOChannel *io; +	struct sockaddr_un addr; +	int sk; + +	sk = socket(PF_LOCAL, SOCK_DGRAM, 0); +	if (sk < 0) { +		error("Can't create unix socket: %s (%d)", strerror(errno), errno); +		return -1; +	} + +	memset(&addr, 0, sizeof(addr)); +	addr.sun_family = AF_UNIX; +	snprintf(addr.sun_path + 1, UNIX_PATH_MAX - 2, "%s", SOCKET_NAME); + +	if (bind(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) { +		error("Can't bind unix socket: %s (%d)", strerror(errno), errno); +		close(sk); +		return -1; +	} + +	set_nonblocking(sk); + +	unix_sock = sk; + +	io = g_io_channel_unix_new(sk); + +	g_io_add_watch(io, G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_NVAL, +							unix_event, NULL); + +	g_io_channel_unref(io); +  	connection = dbus_connection_ref(conn);  	return 0; @@ -40,6 +119,10 @@ int audio_init(DBusConnection *conn)  void audio_exit(void)  { +	close(unix_sock); + +	unix_sock = -1; +  	dbus_connection_unref(connection);  	connection = NULL; | 
