/pidgin/main: 392525df2d0a: Merged in CMaiku/pidgin/purple-proxy...
Gary Kramlich <[email protected]>
| Newsgroups | gmane.comp.gnome.gaim.cvs |
|---|---|
| Message-ID | <[email protected]> |
Changeset: 392525df2d0ab74f1c28e2bdd156ec7833239ac0 Author: Gary Kramlich <[email protected]> Date: 2016-01-14 19:42 -0600 Branch: default URL: https://hg.pidgin.im/pidgin/main/rev/392525df2d0a Description: Merged in CMaiku/pidgin/purple-proxy-to-gio (pull request #9) Port libpurple proxy code to use Gio internally diffstat: libpurple/proxy.c | 2067 +++++++--------------------------------------------- libpurple/proxy.h | 46 +- 2 files changed, 297 insertions(+), 1816 deletions(-) diffs (truncated from 2301 to 300 lines): diff --git a/libpurple/proxy.c b/libpurple/proxy.c --- a/libpurple/proxy.c +++ b/libpurple/proxy.c @@ -55,32 +55,9 @@ struct _PurpleProxyConnectData { gchar *host; int port; int fd; - int socket_type; - guint inpa; PurpleProxyInfo *gpi; GCancellable *cancellable; - - /* - * This list contains GInetAddress and they should be freed with - * g_resolver_free_addresses when done with. - */ - GList *hosts; - - PurpleProxyConnectData *child; - - /* - * All of the following variables are used when establishing a - * connection through a proxy. - */ - guchar *write_buffer; - gsize write_buf_len; - gsize written_len; - PurpleInputFunction read_cb; - guchar *read_buffer; - gsize read_buf_len; - gsize read_len; - PurpleAccount *account; }; static const char * const socks5errors[] = { @@ -99,8 +76,6 @@ static PurpleProxyInfo *global_proxy_inf static GSList *handles = NULL; -static void try_connect(PurpleProxyConnectData *connect_data); - /* * TODO: Eventually (GObjectification) this bad boy will be removed, because it is * a gross fix for a crashy problem. @@ -584,8 +559,6 @@ purple_proxy_connect_data_destroy(Purple connect_data->cancellable = NULL; } - g_resolver_free_addresses(connect_data->hosts); - g_free(connect_data->host); g_free(connect_data); } @@ -602,72 +575,29 @@ purple_proxy_connect_data_destroy(Purple * to another IP address. * * If an error message is passed in, then we know the connection - * attempt failed. If the connection attempt failed and - * connect_data->hosts is not empty then we try the next IP address. - * If the connection attempt failed and we have no more hosts - * try try then we call the callback with the given error message, - * then destroy the connect_data. + * attempt failed. If so, we call the callback with the given + * error message, then destroy the connect_data. */ static void purple_proxy_connect_data_disconnect(PurpleProxyConnectData *connect_data, const gchar *error_message) { - if (connect_data->child != NULL) - { - purple_proxy_connect_cancel(connect_data->child); - connect_data->child = NULL; - } - - if (connect_data->inpa > 0) - { - purple_input_remove(connect_data->inpa); - connect_data->inpa = 0; - } - if (connect_data->fd >= 0) { close(connect_data->fd); connect_data->fd = -1; } - g_free(connect_data->write_buffer); - connect_data->write_buffer = NULL; - - g_free(connect_data->read_buffer); - connect_data->read_buffer = NULL; - if (error_message != NULL) { purple_debug_error("proxy", "Connection attempt failed: %s\n", error_message); - if (connect_data->hosts != NULL) - try_connect(connect_data); - else - { - /* Everything failed! Tell the originator of the request. */ - connect_data->connect_cb(connect_data->data, -1, error_message); - purple_proxy_connect_data_destroy(connect_data); - } + + /* Everything failed! Tell the originator of the request. */ + connect_data->connect_cb(connect_data->data, -1, error_message); + purple_proxy_connect_data_destroy(connect_data); } } -/* - * This calls purple_proxy_connect_data_disconnect(), but it lets you - * specify the error_message using a printf()-like syntax. - */ -static void -purple_proxy_connect_data_disconnect_formatted(PurpleProxyConnectData *connect_data, const char *format, ...) -{ - va_list args; - gchar *tmp; - - va_start(args, format); - tmp = g_strdup_vprintf(format, args); - va_end(args); - - purple_proxy_connect_data_disconnect(connect_data, tmp); - g_free(tmp); -} - static void purple_proxy_connect_data_connected(PurpleProxyConnectData *connect_data) { @@ -687,1572 +617,6 @@ purple_proxy_connect_data_connected(Purp purple_proxy_connect_data_destroy(connect_data); } -static void -socket_ready_cb(gpointer data, gint source, PurpleInputCondition cond) -{ - PurpleProxyConnectData *connect_data = data; - int error = 0; - int ret; - - /* If the socket-connected message had already been triggered when connect_data - * was destroyed via purple_proxy_connect_cancel(), we may get here with a freed connect_data. - */ - if (!PURPLE_PROXY_CONNECT_DATA_IS_VALID(connect_data)) - return; - - purple_debug_info("proxy", "Connecting to %s:%d.\n", - connect_data->host, connect_data->port); - - /* - * purple_input_get_error after a non-blocking connect returns -1 if something is - * really messed up (bad descriptor, usually). Otherwise, it returns 0 and - * error holds what connect would have returned if it blocked until now. - * Thus, error == 0 is success, error == EINPROGRESS means "try again", - * and anything else is a real error. - * - * (error == EINPROGRESS can happen after a select because the kernel can - * be overly optimistic sometimes. select is just a hint that you might be - * able to do something.) - */ - ret = purple_input_get_error(connect_data->fd, &error); - - if (ret == 0 && error == EINPROGRESS) { - /* No worries - we'll be called again later */ - /* TODO: Does this ever happen? */ - purple_debug_info("proxy", "(ret == 0 && error == EINPROGRESS)\n"); - return; - } - - if (ret != 0 || error != 0) { - if (ret != 0) - error = errno; - purple_debug_error("proxy", "Error connecting to %s:%d (%s).\n", - connect_data->host, connect_data->port, g_strerror(error)); - - purple_proxy_connect_data_disconnect(connect_data, g_strerror(error)); - return; - } - - purple_proxy_connect_data_connected(connect_data); -} - -static gboolean -clean_connect(gpointer data) -{ - purple_proxy_connect_data_connected(data); - - return FALSE; -} - -static void -proxy_connect_udp_none(PurpleProxyConnectData *connect_data, common_sockaddr_t *addr, socklen_t addrlen) -{ - purple_debug_info("proxy", "UDP Connecting to %s:%d with no proxy\n", - connect_data->host, connect_data->port); - - connect_data->fd = socket(addr->sa.sa_family, SOCK_DGRAM, 0); - if (connect_data->fd < 0) - { - purple_proxy_connect_data_disconnect_formatted(connect_data, - _("Unable to create socket: %s"), g_strerror(errno)); - return; - } - _purple_network_set_common_socket_flags(connect_data->fd); - - if (connect(connect_data->fd, &addr->sa, addrlen) != 0) - { - if ((errno == EINPROGRESS) || (errno == EINTR)) - { - purple_debug_info("proxy", "UDP connection in progress\n"); - connect_data->inpa = purple_input_add(connect_data->fd, - PURPLE_INPUT_WRITE, socket_ready_cb, connect_data); - } - else - { - purple_proxy_connect_data_disconnect(connect_data, g_strerror(errno)); - } - } - else - { - /* - * The connection happened IMMEDIATELY... strange, but whatever. - */ - int error = ETIMEDOUT; - int ret; - - purple_debug_info("proxy", "UDP Connected immediately.\n"); - - ret = purple_input_get_error(connect_data->fd, &error); - if ((ret != 0) || (error != 0)) - { - if (ret != 0) - error = errno; - purple_proxy_connect_data_disconnect(connect_data, g_strerror(error)); - return; - } - - /* - * We want to call the "connected" callback eventually, but we - * don't want to call it before we return, just in case. - */ - purple_timeout_add(10, clean_connect, connect_data); - } -} - -static void -proxy_connect_none(PurpleProxyConnectData *connect_data, common_sockaddr_t *addr, socklen_t addrlen) -{ - purple_debug_info("proxy", "Connecting to %s:%d with no proxy\n", - connect_data->host, connect_data->port); - - connect_data->fd = socket(addr->sa.sa_family, SOCK_STREAM, 0); - if (connect_data->fd < 0) - { - purple_proxy_connect_data_disconnect_formatted(connect_data, - _("Unable to create socket: %s"), g_strerror(errno)); - return; - } - _purple_network_set_common_socket_flags(connect_data->fd); - - if (connect(connect_data->fd, &addr->sa, addrlen) != 0) - { - if ((errno == EINPROGRESS) || (errno == EINTR)) - { - purple_debug_info("proxy", "Connection in progress\n"); - connect_data->inpa = purple_input_add(connect_data->fd, - PURPLE_INPUT_WRITE, socket_ready_cb, connect_data); - } - else - { - purple_proxy_connect_data_disconnect(connect_data, g_strerror(errno)); - } - } - else - { - /* - * The connection happened IMMEDIATELY... strange, but whatever. - */ - int error = ETIMEDOUT; - int ret; - - purple_debug_info("proxy", "Connected immediately.\n"); - - ret = purple_input_get_error(connect_data->fd, &error); - if ((ret != 0) || (error != 0)) - { - if (ret != 0) - error = errno; - purple_proxy_connect_data_disconnect(connect_data, g_strerror(error)); - return; - } - - /* - * We want to call the "connected" callback eventually, but we - * don't want to call it before we return, just in case. - */ _______________________________________________ Commits mailing list [email protected] https://pidgin.im/cgi-bin/mailman/listinfo/commits