diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2009-05-29 11:19:24 +0200 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2009-05-29 11:19:24 +0200 |
commit | 784efa53be9485eb951e495306c2e944dcb7ff74 (patch) | |
tree | 2dcb90df4d733d495c953f2a1b477dda39f9979c /src/rfkill.c | |
parent | a922337a31fab30b2f6af5dd96efb9cb338169fb (diff) | |
download | connman-784efa53be9485eb951e495306c2e944dcb7ff74.tar.gz connman-784efa53be9485eb951e495306c2e944dcb7ff74.tar.bz2 connman-784efa53be9485eb951e495306c2e944dcb7ff74.zip |
Add support for reading RFKILL events
Diffstat (limited to 'src/rfkill.c')
-rw-r--r-- | src/rfkill.c | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/src/rfkill.c b/src/rfkill.c index 97a6592a..efe979c7 100644 --- a/src/rfkill.c +++ b/src/rfkill.c @@ -23,4 +23,70 @@ #include <config.h> #endif +#include <stdio.h> +#include <errno.h> +#include <fcntl.h> +#include <unistd.h> +#include <string.h> + #include "connman.h" + +static gboolean rfkill_event(GIOChannel *chan, + GIOCondition cond, gpointer data) +{ + unsigned char buf[32]; + gsize len; + GIOError err; + + if (cond & (G_IO_NVAL | G_IO_HUP | G_IO_ERR)) + return FALSE; + + memset(buf, 0, sizeof(buf)); + + err = g_io_channel_read(chan, (gchar *) buf, sizeof(buf), &len); + if (err) { + if (err == G_IO_ERROR_AGAIN) + return TRUE; + return FALSE; + } + + /* process RFKILL event */ + + return TRUE; +} + +static GIOChannel *channel = NULL; + +int __connman_rfkill_init(void) +{ + int fd; + + DBG(""); + + fd = open("/dev/rfkill", O_RDWR); + if (fd < 0) { + connman_error("Failed to open RFKILL control device"); + return -EIO; + } + + channel = g_io_channel_unix_new(fd); + g_io_channel_set_close_on_unref(channel, TRUE); + + g_io_add_watch(channel, G_IO_IN | G_IO_NVAL | G_IO_HUP | G_IO_ERR, + rfkill_event, NULL); + + return 0; +} + +void __connman_rfkill_cleanup(void) +{ + DBG(""); + + if (channel == NULL) + return; + + g_io_channel_shutdown(channel, TRUE, NULL); + g_io_channel_unref(channel); + + channel = NULL; +} |