This modifies the internal io structure inside io-ell to retain correct user data associated with write and read handlers and to return these data with the corresponding callbacks. --- src/shared/io-ell.c | 54 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 50 insertions(+), 4 deletions(-) diff --git a/src/shared/io-ell.c b/src/shared/io-ell.c index c4a115478..485c613e0 100644 --- a/src/shared/io-ell.c +++ b/src/shared/io-ell.c @@ -22,8 +22,48 @@ struct io { struct l_io *l_io; + io_callback_func_t read_cb; + io_destroy_func_t read_destroy; + void *read_data; + io_callback_func_t write_cb; + io_destroy_func_t write_destroy; + void *write_data; }; +static bool read_callback(struct l_io *l_io, void *user_data) +{ + struct io *io = user_data; + bool result = false; + + if (!io) + return false; + + if (io->read_cb) + result = io->read_cb(io, io->read_data); + + if (io->read_destroy) + io->read_destroy(io->read_data); + + return result; +} + +static bool write_callback(struct l_io *l_io, void *user_data) +{ + struct io *io = user_data; + bool result = false; + + if (!io) + return false; + + if (io->write_cb) + result = io->write_cb(io, io->write_data); + + if (io->write_destroy) + io->write_destroy(io->write_data); + + return result; +} + struct io *io_new(int fd) { struct io *io; @@ -80,8 +120,11 @@ bool io_set_read_handler(struct io *io, io_callback_func_t callback, if (!io || !io->l_io) return false; - return l_io_set_read_handler(io->l_io, (l_io_read_cb_t) callback, - user_data, destroy); + io->read_cb = callback; + io->read_data = user_data; + io->read_destroy = destroy; + + return l_io_set_read_handler(io->l_io, read_callback, io, NULL); } bool io_set_write_handler(struct io *io, io_callback_func_t callback, @@ -90,8 +133,11 @@ bool io_set_write_handler(struct io *io, io_callback_func_t callback, if (!io || !io->l_io) return false; - return l_io_set_write_handler(io->l_io, (l_io_write_cb_t) callback, - user_data, destroy); + io->write_cb = callback; + io->write_data = user_data; + io->write_destroy = destroy; + + return l_io_set_write_handler(io->l_io, write_callback, io, NULL); } bool io_set_disconnect_handler(struct io *io, io_callback_func_t callback, -- 2.26.2