From 784efa53be9485eb951e495306c2e944dcb7ff74 Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Fri, 29 May 2009 11:19:24 +0200 Subject: [PATCH] Add support for reading RFKILL events --- src/connman.h | 3 +++ src/element.c | 2 ++ src/rfkill.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 71 insertions(+) diff --git a/src/connman.h b/src/connman.h index 98014b8..86f1793 100644 --- a/src/connman.h +++ b/src/connman.h @@ -93,6 +93,9 @@ enum connman_ipv4_method __connman_ipv4_string2method(const char *method); #include +int __connman_rfkill_init(void); +void __connman_rfkill_cleanup(void); + #include #include diff --git a/src/element.c b/src/element.c index ec27d69..e670864 100644 --- a/src/element.c +++ b/src/element.c @@ -1405,12 +1405,14 @@ void __connman_element_start(void) __connman_connection_init(); __connman_ipv4_init(); __connman_detect_init(); + __connman_rfkill_init(); } void __connman_element_stop(void) { DBG(""); + __connman_rfkill_cleanup(); __connman_detect_cleanup(); __connman_ipv4_cleanup(); __connman_connection_cleanup(); diff --git a/src/rfkill.c b/src/rfkill.c index 97a6592..efe979c 100644 --- a/src/rfkill.c +++ b/src/rfkill.c @@ -23,4 +23,70 @@ #include #endif +#include +#include +#include +#include +#include + #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; +} -- 2.7.4