--- bluez-utils-cvs.orig/common/glib-ectomy.c 2006-02-16 09:17:41.000000000 -0200 +++ bluez-utils-cvs-watches/common/glib-ectomy.c 2006-02-17 09:20:15.000000000 -0200 @@ -92,7 +92,7 @@ { struct watch *w, *p; - for (p = &watch_head, w = watch_head.next; w; w = w->next) + for (p = &watch_head, w = watch_head.next; w; p = w, w = w->next) if (w->id == id) { p->next = w->next; free (w); @@ -181,5 +181,12 @@ void g_main_loop_quit(GMainLoop *loop) { + struct watch *w; + loop->bail = 1; + + for (w = watch_head.next; w; w = w->next) { + watch_head.next = w->next; + free (w); + } } --- bluez-utils-cvs.orig/hcid/security.c 2006-02-16 09:17:41.000000000 -0200 +++ bluez-utils-cvs-watches/hcid/security.c 2006-02-17 09:26:03.000000000 -0200 @@ -51,7 +51,12 @@ #include "hcid.h" #include "lib.h" -static GIOChannel *io_chan[HCI_MAX_DEV]; +struct g_io_info { + GIOChannel *channel; + int watch_id; +}; +static struct g_io_info io_data[HCI_MAX_DEV]; + static int pairing; @@ -701,7 +706,7 @@ void start_security_manager(int hdev) { - GIOChannel *chan = io_chan[hdev]; + GIOChannel *chan = io_data[hdev].channel; struct hci_dev_info *di; struct hci_filter flt; read_stored_link_key_cp cp; @@ -761,10 +766,10 @@ } chan = g_io_channel_unix_new(dev); - g_io_add_watch(chan, G_IO_IN | G_IO_NVAL | G_IO_HUP | G_IO_ERR, - io_security_event, (void *) di); + 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); - io_chan[hdev] = chan; + io_data[hdev].channel = chan; if (hci_test_bit(HCI_RAW, &di->flags)) return; @@ -778,7 +783,7 @@ void stop_security_manager(int hdev) { - GIOChannel *chan = io_chan[hdev]; + GIOChannel *chan = io_data[hdev].channel; if (!chan) return; @@ -789,7 +794,9 @@ 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)); - io_chan[hdev] = NULL; + g_io_remove_watch(io_data[hdev].watch_id); + io_data[hdev].watch_id = -1; + io_data[hdev].channel = NULL; } void init_security_data(void) --- bluez-utils-cvs.orig/hcid/main.c 2006-02-16 09:17:41.000000000 -0200 +++ bluez-utils-cvs-watches/hcid/main.c 2006-02-17 07:06:38.000000000 -0200 @@ -666,6 +666,7 @@ set_title("processing events"); ctl_io = g_io_channel_unix_new(hcid.sock); + g_io_add_watch(ctl_io, G_IO_IN, io_stack_event, NULL); /* Start event processor */