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 /audio/unix.c | |
parent | 0097d93ac82733bae644a0be3c6ad0eab6cff4db (diff) |
Move unix socket functionality into unix.c
Diffstat (limited to 'audio/unix.c')
-rw-r--r-- | audio/unix.c | 92 |
1 files changed, 92 insertions, 0 deletions
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; +} |