diff options
Diffstat (limited to 'hcid/security.c')
-rw-r--r-- | hcid/security.c | 20 |
1 files changed, 8 insertions, 12 deletions
diff --git a/hcid/security.c b/hcid/security.c index b5eca651..ebdc130c 100644 --- a/hcid/security.c +++ b/hcid/security.c @@ -657,23 +657,21 @@ static inline void conn_request(int dev, bdaddr_t *sba, void *ptr) static gboolean io_security_event(GIOChannel *chan, GIOCondition cond, gpointer data) { unsigned char buf[HCI_MAX_EVENT_SIZE], *ptr = buf; - struct hci_dev_info *di = (void *) data; + struct hci_dev_info *di = data; int type, dev; size_t len; hci_event_hdr *eh; GIOError err; if (cond & (G_IO_NVAL | G_IO_HUP | G_IO_ERR)) { - g_io_channel_close(chan); - free(data); + g_io_channel_unref(chan); return FALSE; } if ((err = g_io_channel_read(chan, (gchar *) buf, sizeof(buf), &len))) { if (err == G_IO_ERROR_AGAIN) return TRUE; - g_io_channel_close(chan); - free(data); + g_io_channel_unref(chan); return FALSE; } @@ -836,9 +834,10 @@ void start_security_manager(int hdev) } chan = g_io_channel_unix_new(dev); - io_data[hdev].watch_id = g_io_add_watch(chan, G_IO_IN | G_IO_NVAL | G_IO_HUP | G_IO_ERR, - io_security_event, (void *) di); - + g_io_channel_set_close_on_unref(chan, TRUE); + io_data[hdev].watch_id = g_io_add_watch_full(chan, 0, + G_IO_IN | G_IO_NVAL | G_IO_HUP | G_IO_ERR, + io_security_event, di, (GDestroyNotify)free); io_data[hdev].channel = chan; io_data[hdev].pin_length = -1; @@ -861,11 +860,8 @@ void stop_security_manager(int hdev) info("Stopping security manager %d", hdev); - /* this is a bit sneaky. closing the fd will cause the event - loop to call us right back with G_IO_NVAL set, at which - point we will see it and clean things up */ - close(g_io_channel_unix_get_fd(chan)); g_io_remove_watch(io_data[hdev].watch_id); + g_io_channel_unref(io_data[hdev].channel); io_data[hdev].watch_id = -1; io_data[hdev].channel = NULL; io_data[hdev].pin_length = -1; |