diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2007-04-09 01:14:21 +0000 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2007-04-09 01:14:21 +0000 |
commit | 67d220c148f13abca61977b3036ea9f356db9205 (patch) | |
tree | 9dc7371a42bf4336a0914495ead2d51dac138a2c /audio/manager.c | |
parent | 353376a06677af64fc6e81d3118adc2e059516b8 (diff) |
Simple process communication
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; |