Hi Szymon, > --- > src/shared/io-glib.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++- > 1 file changed, 58 insertions(+), 1 deletion(-) > > diff --git a/src/shared/io-glib.c b/src/shared/io-glib.c > index 77ba19e..a4f982d 100644 > --- a/src/shared/io-glib.c > +++ b/src/shared/io-glib.c > @@ -40,6 +40,10 @@ struct io { > io_callback_func_t write_callback; > io_destroy_func_t write_destroy; > void *write_data; > + guint disconnect_watch; > + io_callback_func_t disconnect_callback; > + io_destroy_func_t disconnect_destroy; > + void *disconnect_data; > }; > > static struct io *io_ref(struct io *io) > @@ -258,8 +262,61 @@ done: > return true; > } > > +static void disconnect_watch_destroy(gpointer user_data) > +{ > + struct io *io = user_data; > + > + if (io->disconnect_destroy) > + io->disconnect_destroy(io->disconnect_data); > + > + io->disconnect_watch = 0; > + io->disconnect_callback = NULL; > + io->disconnect_destroy = NULL; > + io->disconnect_data = NULL; > + > + io_unref(io); > +} > + > +static gboolean disconnect_callback(GIOChannel *channel, GIOCondition cond, > + gpointer user_data) > +{ > + struct io *io = user_data; > + bool result; > + > + if (io->disconnect_callback) > + result = io->disconnect_callback(io, io->disconnect_data); > + else > + result = false; > + > + return result ? TRUE : FALSE; > +} > + > bool io_set_disconnect_handler(struct io *io, io_callback_func_t callback, > void *user_data, io_destroy_func_t destroy) > { > - return false; > + if (!io) > + return false; > + > + if (io->disconnect_watch > 0) { > + g_source_remove(io->disconnect_watch); > + io->disconnect_watch = 0; > + } > + > + if (!callback) > + goto done; > + > + io->disconnect_watch = g_io_add_watch_full(io->channel, > + G_PRIORITY_DEFAULT, > + G_IO_HUP | G_IO_ERR | G_IO_NVAL, If we are using G_IO_HUP here, we should remove it from the other callback handling? > + disconnect_callback, io_ref(io), > + disconnect_watch_destroy); > + if (io->disconnect_watch == 0) > + return false; > + > + io->disconnect_destroy = destroy; > + io->disconnect_data = user_data; we normally have an extra empty line here. You might also fix the previous patch then. > +done: > + io->disconnect_callback = callback; > + > + return true; > } > -- > 1.8.5.3 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html > -- To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html