# HG changeset patch # User Elliott Sales de Andrade # Date 1605672315 21600 # Node ID f2f4d445ff7bb0e9ab163b5f7d62532167e02f0a # Parent 22d3e966281b65040060f5dd8b5039cfc1e6b8e7 Use gio for bonjour xfer closing. Just one more thing I missed because it used `recv` unlike everything else. Testing Done: Send/receive with bonjour on the same machine, checking debug window for errors. Reviewed at https://reviews.imfreedom.org/r/228/ diff -r 22d3e966281b -r f2f4d445ff7b libpurple/protocols/bonjour/bonjour_ft.c --- a/libpurple/protocols/bonjour/bonjour_ft.c Tue Nov 17 21:59:59 2020 -0600 +++ b/libpurple/protocols/bonjour/bonjour_ft.c Tue Nov 17 22:05:15 2020 -0600 @@ -148,40 +148,16 @@ g_cancellable_cancel(xf->cancellable); } -struct socket_cleanup { - int fd; - guint handle; -}; - -static void -_wait_for_socket_close(gpointer data, gint source, PurpleInputCondition cond) -{ - struct socket_cleanup *sc = data; - char buf[1]; - int ret; - - ret = recv(source, buf, 1, 0); - - if (ret == 0 || (ret == -1 && !(errno == EAGAIN || errno == EWOULDBLOCK))) { - purple_debug_info("bonjour", "Client completed recieving; closing server socket.\n"); - purple_input_remove(sc->handle); - close(sc->fd); - g_free(sc); - } -} - static void bonjour_xfer_end(PurpleXfer *xfer) { - purple_debug_info("bonjour", "Bonjour-xfer-end.\n"); + purple_debug_info("bonjour", "Bonjour-xfer-end for xfer %p", xfer); /* We can't allow the server side to close the connection until the client is complete, * otherwise there is a RST resulting in an error on the client side */ if (purple_xfer_get_xfer_type(xfer) == PURPLE_XFER_TYPE_SEND && purple_xfer_is_completed(xfer)) { - struct socket_cleanup *sc = g_new0(struct socket_cleanup, 1); - sc->fd = purple_xfer_get_fd(xfer); + XepXfer *xf = XEP_XFER(xfer); + g_io_stream_close_async(G_IO_STREAM(xf->conn), G_PRIORITY_DEFAULT, xf->cancellable, NULL, NULL); purple_xfer_set_fd(xfer, -1); - sc->handle = purple_input_add(sc->fd, PURPLE_INPUT_READ, - _wait_for_socket_close, sc); } }