diff options
| author | Johan Hedberg <johan.hedberg@nokia.com> | 2007-05-26 17:17:34 +0000 | 
|---|---|---|
| committer | Johan Hedberg <johan.hedberg@nokia.com> | 2007-05-26 17:17:34 +0000 | 
| commit | d2d76421ad539e2c6da87e4b4fd2a42493053f49 (patch) | |
| tree | c85b45267649df4a22086fdeba6fd5a17c92782c | |
| parent | 0097d93ac82733bae644a0be3c6ad0eab6cff4db (diff) | |
Move unix socket functionality into unix.c
| -rw-r--r-- | audio/ipc.h | 2 | ||||
| -rw-r--r-- | audio/main.c | 8 | ||||
| -rw-r--r-- | audio/manager.c | 77 | ||||
| -rw-r--r-- | audio/unix.c | 92 | ||||
| -rw-r--r-- | audio/unix.h | 4 | 
5 files changed, 106 insertions, 77 deletions
| diff --git a/audio/ipc.h b/audio/ipc.h index 5b545844..8de85531 100644 --- a/audio/ipc.h +++ b/audio/ipc.h @@ -25,6 +25,8 @@  #define IPC_TYPE_CONNECT  0x0001 +#define IPC_SOCKET_NAME "/org/bluez/audio" +  struct ipc_hdr {  	uint16_t id;  	uint16_t type; diff --git a/audio/main.c b/audio/main.c index 5c44df9b..98dc1d4f 100644 --- a/audio/main.c +++ b/audio/main.c @@ -36,6 +36,7 @@  #include "dbus.h"  #include "logging.h" +#include "unix.h"  #include "manager.h"  #include "headset.h" @@ -73,6 +74,11 @@ int main(int argc, char *argv[])  		exit(1);  	} +	if (unix_init() < 0) { +		error("Unable to setup unix socket"); +		exit(1); +	} +  	if (audio_init(conn) < 0) {  		error("Audio init failed!");  		exit(1); @@ -92,6 +98,8 @@ int main(int argc, char *argv[])  	headset_exit(); +	unix_exit(); +  	dbus_connection_unref(conn);  	g_main_loop_unref(main_loop); diff --git a/audio/manager.c b/audio/manager.c index b7766915..c15d2f5d 100644 --- a/audio/manager.c +++ b/audio/manager.c @@ -31,8 +31,6 @@  #include <unistd.h>  #include <stdint.h>  #include <assert.h> -#include <sys/socket.h> -#include <sys/un.h>  #include <bluetooth/bluetooth.h>  #include <bluetooth/rfcomm.h> @@ -47,16 +45,9 @@  #include "dbus-helper.h"  #include "logging.h" -#include "ipc.h"  #include "headset.h"  #include "manager.h" -#ifndef UNIX_PATH_MAX -#define UNIX_PATH_MAX 108 -#endif - -#define SOCKET_NAME "/org/bluez/audio" -  typedef enum {  		GENERIC_AUDIO = 0,  		ADVANCED_AUDIO, @@ -82,8 +73,6 @@ static audio_device_t *default_hs = NULL;  static GSList *devices = NULL; -static int unix_sock = -1; -  static void get_next_record(struct audio_sdp_data *data);  static DBusHandlerResult get_handles(const char *uuid,  					struct audio_sdp_data *data); @@ -144,35 +133,6 @@ DBusHandlerResult err_failed(DBusConnection *conn, DBusMessage *msg,  	return error_reply(conn, msg, "org.bluez.audio.Error.Failed", dsc);  } -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; -} -  static audio_device_t *find_device(bdaddr_t *bda)  {  	GSList *l; @@ -1077,41 +1037,9 @@ static DBusSignalVTable manager_signals[] = {  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); -  	if (!dbus_connection_create_object_path(conn, AUDIO_MANAGER_PATH,  						NULL, NULL)) {  		error("D-Bus failed to register %s path", AUDIO_MANAGER_PATH); -		close(sk);  		return -1;  	} @@ -1123,7 +1051,6 @@ int audio_init(DBusConnection *conn)  				AUDIO_MANAGER_INTERFACE, AUDIO_MANAGER_PATH);  		dbus_connection_destroy_object_path(conn,  							AUDIO_MANAGER_PATH); -		close(sk);  		return -1;  	} @@ -1134,10 +1061,6 @@ int audio_init(DBusConnection *conn)  void audio_exit(void)  { -	close(unix_sock); - -	unix_sock = -1; -  	g_slist_foreach(devices, (GFunc) remove_device, NULL);  	g_slist_free(devices);  	devices = NULL; diff --git a/audio/unix.c b/audio/unix.c index e61680b2..4f99e5e4 100644 --- a/audio/unix.c +++ b/audio/unix.c @@ -25,4 +25,96 @@  #include <config.h>  #endif +#include <stdio.h> +#include <stdlib.h> +#include <errno.h> +#include <unistd.h> +#include <stdint.h> +#include <assert.h> +#include <sys/socket.h> +#include <sys/un.h> + +#include <glib.h> + +#include "logging.h" +#include "dbus.h" + +#include "ipc.h"  #include "unix.h" + +#ifndef UNIX_PATH_MAX +#define UNIX_PATH_MAX 108 +#endif + +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 unix_init(void) +{ +	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", IPC_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); + +	return 0; +} + +void unix_exit(void) +{ +	close(unix_sock); +	unix_sock = -1; +} diff --git a/audio/unix.h b/audio/unix.h index e87dd676..4f3fc994 100644 --- a/audio/unix.h +++ b/audio/unix.h @@ -20,3 +20,7 @@   *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA   *   */ + +int unix_init(void); + +void unix_exit(void); | 
