IO watch for rfkill events needs to be cleaned up on exit.
---
 src/rfkill.c | 23 ++++++++++++-----------
 1 file changed, 12 insertions(+), 11 deletions(-)

diff --git a/src/rfkill.c b/src/rfkill.c
index 960cfea..c6f9674 100644
--- a/src/rfkill.c
+++ b/src/rfkill.c
@@ -153,7 +153,7 @@ static gboolean rfkill_event(GIOChannel *chan, GIOCondition 
cond, gpointer data)
        return TRUE;
 }
 
-static GIOChannel *channel = NULL;
+static guint watch = 0;
 
 int __connman_rfkill_block(enum connman_service_type type, bool block)
 {
@@ -191,6 +191,7 @@ int __connman_rfkill_block(enum connman_service_type type, 
bool block)
 
 int __connman_rfkill_init(void)
 {
+       GIOChannel *channel;
        GIOFlags flags;
        int fd;
 
@@ -215,21 +216,21 @@ int __connman_rfkill_init(void)
        /* Process current RFKILL events sent on device open */
        while (rfkill_process(channel) == G_IO_STATUS_NORMAL);
 
-       g_io_add_watch(channel, G_IO_IN | G_IO_NVAL | G_IO_HUP | G_IO_ERR,
-                                                       rfkill_event, NULL);
+       watch = g_io_add_watch(channel,
+                               G_IO_IN | G_IO_NVAL | G_IO_HUP | G_IO_ERR,
+                               rfkill_event, NULL);
 
-       return 0;
+       g_io_channel_unref(channel);
+
+       return watch ? 0 : -EIO;
 }
 
 void __connman_rfkill_cleanup(void)
 {
        DBG("");
 
-       if (!channel)
-               return;
-
-       g_io_channel_shutdown(channel, TRUE, NULL);
-       g_io_channel_unref(channel);
-
-       channel = NULL;
+       if (watch) {
+               g_source_remove(watch);
+               watch = 0;
+       }
 }
-- 
1.9.1

_______________________________________________
connman mailing list
connman@connman.net
https://lists.connman.net/mailman/listinfo/connman

Reply via email to