comparison libpurple/proxy.c @ 23391:5c70d953a497

propagate from branch 'im.pidgin.pidgin.2.4.3' (head 709ec9c29e9d76eebbded25061107ef0a2a2b148) to branch 'im.pidgin.pidgin' (head e8d624d4b86e9505bb225f2a6e7b29ec6c8affed)
author Richard Laager <rlaager@wiktel.com>
date Thu, 26 Jun 2008 09:07:56 +0000
parents 8a1798bcddc6 242fd82b5fe6
children 64585aab233a
comparison
equal deleted inserted replaced
23057:d04d24b1db9b 23391:5c70d953a497
1141 guchar *dest, *buf; 1141 guchar *dest, *buf;
1142 PurpleProxyConnectData *connect_data = data; 1142 PurpleProxyConnectData *connect_data = data;
1143 int len; 1143 int len;
1144 1144
1145 if (connect_data->read_buffer == NULL) { 1145 if (connect_data->read_buffer == NULL) {
1146 connect_data->read_buf_len = 4; 1146 connect_data->read_buf_len = 5;
1147 connect_data->read_buffer = g_malloc(connect_data->read_buf_len); 1147 connect_data->read_buffer = g_malloc(connect_data->read_buf_len);
1148 connect_data->read_len = 0; 1148 connect_data->read_len = 0;
1149 } 1149 }
1150 1150
1151 dest = connect_data->read_buffer + connect_data->read_len; 1151 dest = connect_data->read_buffer + connect_data->read_len;
1210 case 0x04: /* the address is a version-6 IP address, with a length of 16 octets */ 1210 case 0x04: /* the address is a version-6 IP address, with a length of 16 octets */
1211 if(!s5_ensure_buffer_length(connect_data, 4 + 16)) 1211 if(!s5_ensure_buffer_length(connect_data, 4 + 16))
1212 return; 1212 return;
1213 buf += 4 + 16; 1213 buf += 4 + 16;
1214 break; 1214 break;
1215 default:
1216 purple_debug_error("socks5 proxy", "Invalid ATYP received (0x%X)\n", buf[3]);
1217 purple_proxy_connect_data_disconnect(connect_data,
1218 _("Received invalid data on connection with server."));
1219 return;
1215 } 1220 }
1216 1221
1217 /* Skip past BND.PORT */ 1222 /* Skip past BND.PORT */
1218 if(!s5_ensure_buffer_length(connect_data, (buf - connect_data->read_buffer) + 2)) 1223 if(!s5_ensure_buffer_length(connect_data, (buf - connect_data->read_buffer) + 2))
1219 return; 1224 return;
1726 * of IP addresses returned to us by purple_dnsquery_a() and attemps 1731 * of IP addresses returned to us by purple_dnsquery_a() and attemps
1727 * to connect to each one. This is called after the hostname is 1732 * to connect to each one. This is called after the hostname is
1728 * resolved, and each time a connection attempt fails (assuming there 1733 * resolved, and each time a connection attempt fails (assuming there
1729 * is another IP address to try). 1734 * is another IP address to try).
1730 */ 1735 */
1736 #ifndef INET6_ADDRSTRLEN
1737 #define INET6_ADDRSTRLEN 46
1738 #endif
1739
1731 static void try_connect(PurpleProxyConnectData *connect_data) 1740 static void try_connect(PurpleProxyConnectData *connect_data)
1732 { 1741 {
1733 size_t addrlen; 1742 size_t addrlen;
1734 struct sockaddr *addr; 1743 struct sockaddr *addr;
1735 char ipaddr[INET6_ADDRSTRLEN]; 1744 char ipaddr[INET6_ADDRSTRLEN];
1736 1745
1737 addrlen = GPOINTER_TO_INT(connect_data->hosts->data); 1746 addrlen = GPOINTER_TO_INT(connect_data->hosts->data);
1738 connect_data->hosts = g_slist_remove(connect_data->hosts, connect_data->hosts->data); 1747 connect_data->hosts = g_slist_remove(connect_data->hosts, connect_data->hosts->data);
1739 addr = connect_data->hosts->data; 1748 addr = connect_data->hosts->data;
1740 connect_data->hosts = g_slist_remove(connect_data->hosts, connect_data->hosts->data); 1749 connect_data->hosts = g_slist_remove(connect_data->hosts, connect_data->hosts->data);
1741 1750 #ifdef HAVE_INET_NTOP
1742 inet_ntop(addr->sa_family, &((struct sockaddr_in *)addr)->sin_addr, 1751 inet_ntop(addr->sa_family, &((struct sockaddr_in *)addr)->sin_addr,
1743 ipaddr, sizeof(ipaddr)); 1752 ipaddr, sizeof(ipaddr));
1753 #else
1754 memcpy(ipaddr,inet_ntoa(((struct sockaddr_in *)addr)->sin_addr),
1755 sizeof(ipaddr));
1756 #endif
1744 purple_debug_info("proxy", "Attempting connection to %s\n", ipaddr); 1757 purple_debug_info("proxy", "Attempting connection to %s\n", ipaddr);
1745 1758
1746 switch (purple_proxy_info_get_type(connect_data->gpi)) { 1759 switch (purple_proxy_info_get_type(connect_data->gpi)) {
1747 case PURPLE_PROXY_NONE: 1760 case PURPLE_PROXY_NONE:
1748 proxy_connect_none(connect_data, addr, addrlen); 1761 proxy_connect_none(connect_data, addr, addrlen);