annotate src/proxy.c @ 10738:55af3fa46329

[gaim-migrate @ 12340] Lots of changes here. A lot of it stems from chaning gaim_account_connect() so that it DOES NOT have the GaimStatus parameter. It will attempt to use the GaimStatus of your account from the last time it was connected (which doesn't work quite right yet). My goal here was to save and load each account's GaimStatuses to accounts.xml, so if you were "away" when you signed off then you'll be "away" when you sign back on. Not quite there yet. committer: Tailor Script <tailor@pidgin.im>
author Mark Doliner <mark@kingant.net>
date Sat, 26 Mar 2005 20:08:43 +0000
parents 00483ba950bf
children dcbc56eb3f37
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1 /**
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2 * @file proxy.c Proxy API
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
3 * @ingroup core
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
4 *
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
5 * gaim
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
6 *
8046
fa6395637e2c [gaim-migrate @ 8730]
Sean Egan <seanegan@gmail.com>
parents: 7982
diff changeset
7 * Gaim is the legal property of its developers, whose names are too numerous
fa6395637e2c [gaim-migrate @ 8730]
Sean Egan <seanegan@gmail.com>
parents: 7982
diff changeset
8 * to list here. Please refer to the COPYRIGHT file distributed with this
fa6395637e2c [gaim-migrate @ 8730]
Sean Egan <seanegan@gmail.com>
parents: 7982
diff changeset
9 * source distribution.
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
10 *
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
11 * This program is free software; you can redistribute it and/or modify
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
12 * it under the terms of the GNU General Public License as published by
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
13 * the Free Software Foundation; either version 2 of the License, or
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
14 * (at your option) any later version.
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
15 *
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
16 * This program is distributed in the hope that it will be useful,
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
19 * GNU General Public License for more details.
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
20 *
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
21 * You should have received a copy of the GNU General Public License
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
22 * along with this program; if not, write to the Free Software
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
24 *
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
25 */
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
26
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
27 /* this is a little piece of code to handle proxy connection */
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
28 /* it is intended to : 1st handle http proxy, using the CONNECT command
6856
a14200b24371 [gaim-migrate @ 7401]
Mark Doliner <mark@kingant.net>
parents: 6621
diff changeset
29 , 2nd provide an easy way to add socks support
a14200b24371 [gaim-migrate @ 7401]
Mark Doliner <mark@kingant.net>
parents: 6621
diff changeset
30 , 3rd draw women to it like flies to honey */
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
31
5872
059d95c67cda [gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents: 5681
diff changeset
32 #include "internal.h"
10684
72a5babfa8b4 [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10626
diff changeset
33 #include "cipher.h"
5872
059d95c67cda [gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents: 5681
diff changeset
34 #include "debug.h"
6621
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
35 #include "notify.h"
5872
059d95c67cda [gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents: 5681
diff changeset
36 #include "prefs.h"
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
37 #include "proxy.h"
5872
059d95c67cda [gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents: 5681
diff changeset
38 #include "util.h"
3630
9682c0e022c6 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3376
diff changeset
39
9729
f44ae9331afc [gaim-migrate @ 10590]
Mark Doliner <mark@kingant.net>
parents: 9657
diff changeset
40 static GaimProxyInfo *global_proxy_info = NULL;
5872
059d95c67cda [gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents: 5681
diff changeset
41
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
42 struct PHB {
2090
b66aca8e8dce [gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2048
diff changeset
43 GaimInputFunction func;
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
44 gpointer data;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
45 char *host;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
46 int port;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
47 gint inpa;
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
48 GaimProxyInfo *gpi;
5563
9eb5b13fd412 [gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents: 5532
diff changeset
49 GaimAccount *account;
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
50 GSList *hosts;
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
51 };
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
52
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
53 static void try_connect(struct PHB *);
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
54
7982
58af482c89f7 [gaim-migrate @ 8659]
Luke Schierer <lschiere@pidgin.im>
parents: 7834
diff changeset
55 const char* socks5errors[] = {
58af482c89f7 [gaim-migrate @ 8659]
Luke Schierer <lschiere@pidgin.im>
parents: 7834
diff changeset
56 "succeeded\n",
58af482c89f7 [gaim-migrate @ 8659]
Luke Schierer <lschiere@pidgin.im>
parents: 7834
diff changeset
57 "general SOCKS server failure\n",
58af482c89f7 [gaim-migrate @ 8659]
Luke Schierer <lschiere@pidgin.im>
parents: 7834
diff changeset
58 "connection not allowed by ruleset\n",
58af482c89f7 [gaim-migrate @ 8659]
Luke Schierer <lschiere@pidgin.im>
parents: 7834
diff changeset
59 "Network unreachable\n",
58af482c89f7 [gaim-migrate @ 8659]
Luke Schierer <lschiere@pidgin.im>
parents: 7834
diff changeset
60 "Host unreachable\n",
58af482c89f7 [gaim-migrate @ 8659]
Luke Schierer <lschiere@pidgin.im>
parents: 7834
diff changeset
61 "Connection refused\n",
58af482c89f7 [gaim-migrate @ 8659]
Luke Schierer <lschiere@pidgin.im>
parents: 7834
diff changeset
62 "TTL expired\n",
58af482c89f7 [gaim-migrate @ 8659]
Luke Schierer <lschiere@pidgin.im>
parents: 7834
diff changeset
63 "Command not supported\n",
58af482c89f7 [gaim-migrate @ 8659]
Luke Schierer <lschiere@pidgin.im>
parents: 7834
diff changeset
64 "Address type not supported\n"
58af482c89f7 [gaim-migrate @ 8659]
Luke Schierer <lschiere@pidgin.im>
parents: 7834
diff changeset
65 };
58af482c89f7 [gaim-migrate @ 8659]
Luke Schierer <lschiere@pidgin.im>
parents: 7834
diff changeset
66
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
67 /**************************************************************************
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
68 * Proxy structure API
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
69 **************************************************************************/
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
70 GaimProxyInfo *
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
71 gaim_proxy_info_new(void)
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
72 {
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
73 return g_new0(GaimProxyInfo, 1);
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
74 }
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
75
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
76 void
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
77 gaim_proxy_info_destroy(GaimProxyInfo *info)
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
78 {
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
79 g_return_if_fail(info != NULL);
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
80
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
81 if (info->host != NULL) g_free(info->host);
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
82 if (info->username != NULL) g_free(info->username);
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
83 if (info->password != NULL) g_free(info->password);
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
84
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
85 g_free(info);
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
86 }
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
87
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
88 void
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
89 gaim_proxy_info_set_type(GaimProxyInfo *info, GaimProxyType type)
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
90 {
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
91 g_return_if_fail(info != NULL);
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
92
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
93 info->type = type;
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
94 }
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
95
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
96 void
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
97 gaim_proxy_info_set_host(GaimProxyInfo *info, const char *host)
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
98 {
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
99 g_return_if_fail(info != NULL);
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
100
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
101 if (info->host != NULL)
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
102 g_free(info->host);
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
103
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
104 info->host = (host == NULL ? NULL : g_strdup(host));
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
105 }
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
106
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
107 void
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
108 gaim_proxy_info_set_port(GaimProxyInfo *info, int port)
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
109 {
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
110 g_return_if_fail(info != NULL);
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
111
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
112 info->port = port;
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
113 }
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
114
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
115 void
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
116 gaim_proxy_info_set_username(GaimProxyInfo *info, const char *username)
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
117 {
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
118 g_return_if_fail(info != NULL);
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
119
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
120 if (info->username != NULL)
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
121 g_free(info->username);
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
122
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
123 info->username = (username == NULL ? NULL : g_strdup(username));
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
124 }
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
125
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
126 void
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
127 gaim_proxy_info_set_password(GaimProxyInfo *info, const char *password)
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
128 {
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
129 g_return_if_fail(info != NULL);
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
130
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
131 if (info->password != NULL)
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
132 g_free(info->password);
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
133
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
134 info->password = (password == NULL ? NULL : g_strdup(password));
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
135 }
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
136
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
137 GaimProxyType
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
138 gaim_proxy_info_get_type(const GaimProxyInfo *info)
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
139 {
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
140 g_return_val_if_fail(info != NULL, GAIM_PROXY_NONE);
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
141
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
142 return info->type;
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
143 }
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
144
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
145 const char *
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
146 gaim_proxy_info_get_host(const GaimProxyInfo *info)
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
147 {
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
148 g_return_val_if_fail(info != NULL, NULL);
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
149
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
150 return info->host;
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
151 }
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
152
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
153 int
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
154 gaim_proxy_info_get_port(const GaimProxyInfo *info)
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
155 {
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
156 g_return_val_if_fail(info != NULL, 0);
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
157
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
158 return info->port;
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
159 }
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
160
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
161 const char *
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
162 gaim_proxy_info_get_username(const GaimProxyInfo *info)
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
163 {
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
164 g_return_val_if_fail(info != NULL, NULL);
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
165
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
166 return info->username;
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
167 }
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
168
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
169 const char *
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
170 gaim_proxy_info_get_password(const GaimProxyInfo *info)
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
171 {
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
172 g_return_val_if_fail(info != NULL, NULL);
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
173
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
174 return info->password;
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
175 }
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
176
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
177 /**************************************************************************
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
178 * Global Proxy API
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
179 **************************************************************************/
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
180 GaimProxyInfo *
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
181 gaim_global_proxy_get_info(void)
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
182 {
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
183 return global_proxy_info;
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
184 }
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
185
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
186 /**************************************************************************
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
187 * Proxy API
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
188 **************************************************************************/
4678
9ce3c698ff5e [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
189 typedef void (*dns_callback_t)(GSList *hosts, gpointer data,
9ce3c698ff5e [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
190 const char *error_message);
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
191
10626
06f5cc17cddc [gaim-migrate @ 12101]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10619
diff changeset
192 #ifdef __unix__
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
193
10711
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
194 /*
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
195 * This structure represents both a pending DNS request and
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
196 * a free child process.
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
197 */
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
198 typedef struct {
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
199 char *host;
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
200 int port;
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
201 dns_callback_t callback;
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
202 gpointer data;
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
203 gint inpa;
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
204 int fd_in, fd_out;
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
205 pid_t dns_pid;
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
206 } pending_dns_request_t;
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
207
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
208 static GSList *free_dns_children = NULL;
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
209 static GQueue *queued_requests = NULL;
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
210
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
211 static int number_of_dns_children = 0;
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
212
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
213 const int MAX_DNS_CHILDREN = 2;
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
214
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
215 typedef struct {
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
216 char hostname[512];
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
217 int port;
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
218 } dns_params_t;
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
219
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
220 typedef struct {
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
221 dns_params_t params;
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
222 dns_callback_t callback;
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
223 gpointer data;
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
224 } queued_dns_request_t;
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
225
10711
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
226 /*
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
227 * Begin the DNS resolver child process functions.
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
228 */
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
229 #ifdef HAVE_SIGNAL_H
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
230 static void
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
231 trap_gdb_bug()
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
232 {
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
233 const char *message =
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
234 "Gaim's DNS child got a SIGTRAP signal. \n"
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
235 "This can be caused by trying to run gaim inside gdb.\n"
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
236 "There is a known gdb bug which prevents this. Supposedly gaim\n"
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
237 "should have detected you were using gdb and used an ugly hack,\n"
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
238 "check cope_with_gdb_brokenness() in proxy.c.\n\n"
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
239 "For more info about this bug, see http://sources.redhat.com/ml/gdb/2001-07/msg00349.html\n";
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
240 fputs("\n* * *\n",stderr);
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
241 fputs(message,stderr);
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
242 fputs("* * *\n\n",stderr);
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
243 execlp("xmessage","xmessage","-center", message, NULL);
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
244 _exit(1);
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
245 }
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
246 #endif
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
247
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
248 static void
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
249 cope_with_gdb_brokenness()
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
250 {
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
251 #ifdef __linux__
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
252 static gboolean already_done = FALSE;
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
253 char s[256], e[512];
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
254 int n;
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
255 pid_t ppid;
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
256
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
257 if(already_done)
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
258 return;
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
259 already_done = TRUE;
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
260 ppid = getppid();
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
261 snprintf(s, sizeof(s), "/proc/%d/exe", ppid);
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
262 n = readlink(s, e, sizeof(e));
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
263 if(n < 0)
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
264 return;
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
265
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
266 e[MIN(n,sizeof(e)-1)] = '\0';
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
267
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
268 if(strstr(e,"gdb")) {
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
269 gaim_debug_info("dns",
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
270 "Debugger detected, performing useless query...\n");
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
271 gethostbyname("x.x.x.x.x");
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
272 }
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
273 #endif
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
274 }
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
275
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
276 static void
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
277 gaim_dns_resolverthread(int child_out, int child_in, gboolean show_debug)
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
278 {
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
279 dns_params_t dns_params;
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
280 const size_t zero = 0;
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
281 int rc;
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
282 #if HAVE_GETADDRINFO
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
283 struct addrinfo hints, *res, *tmp;
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
284 char servname[20];
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
285 #else
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
286 struct sockaddr_in sin;
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
287 const size_t addrlen = sizeof(sin);
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
288 #endif
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
289
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
290 #ifdef HAVE_SIGNAL_H
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
291 signal(SIGHUP, SIG_DFL);
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
292 signal(SIGINT, SIG_DFL);
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
293 signal(SIGQUIT, SIG_DFL);
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
294 signal(SIGCHLD, SIG_DFL);
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
295 signal(SIGTERM, SIG_DFL);
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
296 signal(SIGTRAP, trap_gdb_bug);
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
297 #endif
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
298
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
299 /*
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
300 * We resolve 1 host name for each iteration of this
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
301 * while loop.
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
302 *
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
303 * The top half of this reads in the hostname and port
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
304 * number from the socket with our parent. The bottom
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
305 * half of this resolves the IP (blocking) and sends
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
306 * the result back to our parent, when finished.
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
307 */
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
308 while (1) {
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
309 const char ch = 'Y';
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
310 fd_set fds;
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
311 struct timeval tv = { .tv_sec = 40 , .tv_usec = 0 };
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
312 FD_ZERO(&fds);
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
313 FD_SET(child_in, &fds);
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
314 rc = select(child_in + 1, &fds, NULL, NULL, &tv);
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
315 if (!rc) {
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
316 if (show_debug)
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
317 fprintf(stderr,"dns[%d]: nobody needs me... =(\n", getpid());
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
318 break;
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
319 }
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
320 rc = read(child_in, &dns_params, sizeof(dns_params_t));
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
321 if (rc < 0) {
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
322 perror("read()");
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
323 break;
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
324 }
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
325 if (rc == 0) {
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
326 if (show_debug)
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
327 fprintf(stderr,"dns[%d]: Oops, father has gone, wait for me, wait...!\n", getpid());
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
328 _exit(0);
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
329 }
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
330 if (dns_params.hostname[0] == '\0') {
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
331 fprintf(stderr, "dns[%d]: hostname = \"\" (port = %d)!!!\n", getpid(), dns_params.port);
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
332 _exit(1);
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
333 }
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
334 /* Tell our parent that we read the data successfully */
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
335 write(child_out, &ch, sizeof(ch));
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
336
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
337 /* We have the hostname and port, now resolve the IP */
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
338
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
339 #if HAVE_GETADDRINFO
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
340 g_snprintf(servname, sizeof(servname), "%d", dns_params.port);
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
341 memset(&hints, 0, sizeof(hints));
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
342
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
343 /* This is only used to convert a service
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
344 * name to a port number. As we know we are
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
345 * passing a number already, we know this
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
346 * value will not be really used by the C
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
347 * library.
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
348 */
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
349 hints.ai_socktype = SOCK_STREAM;
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
350 rc = getaddrinfo(dns_params.hostname, servname, &hints, &res);
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
351 write(child_out, &rc, sizeof(rc));
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
352 if (rc != 0) {
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
353 close(child_out);
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
354 if (show_debug)
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
355 fprintf(stderr,"dns[%d] Error: getaddrinfo returned %d\n",
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
356 getpid(), rc);
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
357 dns_params.hostname[0] = '\0';
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
358 continue;
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
359 }
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
360 tmp = res;
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
361 while (res) {
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
362 size_t ai_addrlen = res->ai_addrlen;
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
363 write(child_out, &ai_addrlen, sizeof(ai_addrlen));
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
364 write(child_out, res->ai_addr, res->ai_addrlen);
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
365 res = res->ai_next;
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
366 }
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
367 freeaddrinfo(tmp);
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
368 write(child_out, &zero, sizeof(zero));
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
369 #else
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
370 if (!inet_aton(dns_params.hostname, &sin.sin_addr)) {
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
371 struct hostent *hp;
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
372 if (!(hp = gethostbyname(dns_params.hostname))) {
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
373 write(child_out, &h_errno, sizeof(int));
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
374 close(child_out);
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
375 if (show_debug)
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
376 fprintf(stderr,"DNS Error: %d\n", h_errno);
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
377 _exit(0);
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
378 }
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
379 memset(&sin, 0, sizeof(struct sockaddr_in));
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
380 memcpy(&sin.sin_addr.s_addr, hp->h_addr, hp->h_length);
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
381 sin.sin_family = hp->h_addrtype;
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
382 } else
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
383 sin.sin_family = AF_INET;
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
384
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
385 sin.sin_port = htons(dns_params.port);
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
386 write(child_out, &addrlen, sizeof(addrlen));
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
387 write(child_out, &sin, addrlen);
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
388 write(child_out, &zero, sizeof(zero));
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
389 #endif
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
390 dns_params.hostname[0] = '\0';
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
391 }
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
392
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
393 close(child_out);
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
394 close(child_in);
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
395
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
396 _exit(0);
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
397 }
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
398
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
399 static pending_dns_request_t *
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
400 gaim_dns_new_resolverthread(gboolean show_debug)
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
401 {
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
402 pending_dns_request_t *req;
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
403 int child_out[2], child_in[2];
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
404
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
405 /* Create pipes for communicating with the child process */
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
406 if (pipe(child_out) || pipe(child_in)) {
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
407 gaim_debug_error("dns",
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
408 "Could not create pipes: %s\n", strerror(errno));
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
409 return NULL;
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
410 }
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
411
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
412 req = g_new(pending_dns_request_t, 1);
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
413
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
414 cope_with_gdb_brokenness();
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
415
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
416 /* Fork! */
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
417 req->dns_pid = fork();
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
418
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
419 /* If we are the child process... */
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
420 if (req->dns_pid == 0) {
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
421 /* We should not access the parent's side of the pipes, so close them */
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
422 close(child_out[0]);
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
423 close(child_in[1]);
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
424
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
425 gaim_dns_resolverthread(child_out[1], child_in[0], show_debug);
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
426 /* The thread calls _exit() rather than returning, so we never get here */
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
427 }
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
428
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
429 /* We should not access the child's side of the pipes, so close them */
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
430 close(child_out[1]);
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
431 close(child_in[0]);
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
432 if (req->dns_pid == -1) {
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
433 gaim_debug_error("dns",
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
434 "Could not create child process for DNS: %s\n",
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
435 strerror(errno));
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
436 g_free(req);
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
437 return NULL;
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
438 }
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
439
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
440 req->fd_out = child_out[0];
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
441 req->fd_in = child_in[1];
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
442 number_of_dns_children++;
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
443 gaim_debug_info("dns",
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
444 "Created new DNS child %d, there are now %d children.\n",
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
445 req->dns_pid, number_of_dns_children);
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
446
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
447 return req;
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
448 }
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
449 /*
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
450 * End the DNS resolver child process functions.
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
451 */
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
452
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
453 /*
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
454 * Begin the functions for dealing with the DNS child processes.
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
455 */
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
456 static void
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
457 req_free(pending_dns_request_t *req)
4434
6b83a532eeb2 [gaim-migrate @ 4709]
Nathan Walp <nwalp@pidgin.im>
parents: 4394
diff changeset
458 {
6b83a532eeb2 [gaim-migrate @ 4709]
Nathan Walp <nwalp@pidgin.im>
parents: 4394
diff changeset
459 g_return_if_fail(req != NULL);
10707
7672a83c04da [gaim-migrate @ 12296]
Mark Doliner <mark@kingant.net>
parents: 10706
diff changeset
460
4434
6b83a532eeb2 [gaim-migrate @ 4709]
Nathan Walp <nwalp@pidgin.im>
parents: 4394
diff changeset
461 close(req->fd_in);
6b83a532eeb2 [gaim-migrate @ 4709]
Nathan Walp <nwalp@pidgin.im>
parents: 4394
diff changeset
462 close(req->fd_out);
10707
7672a83c04da [gaim-migrate @ 12296]
Mark Doliner <mark@kingant.net>
parents: 10706
diff changeset
463
7672a83c04da [gaim-migrate @ 12296]
Mark Doliner <mark@kingant.net>
parents: 10706
diff changeset
464 g_free(req->host);
4434
6b83a532eeb2 [gaim-migrate @ 4709]
Nathan Walp <nwalp@pidgin.im>
parents: 4394
diff changeset
465 g_free(req);
10707
7672a83c04da [gaim-migrate @ 12296]
Mark Doliner <mark@kingant.net>
parents: 10706
diff changeset
466
4434
6b83a532eeb2 [gaim-migrate @ 4709]
Nathan Walp <nwalp@pidgin.im>
parents: 4394
diff changeset
467 number_of_dns_children--;
6b83a532eeb2 [gaim-migrate @ 4709]
Nathan Walp <nwalp@pidgin.im>
parents: 4394
diff changeset
468 }
6b83a532eeb2 [gaim-migrate @ 4709]
Nathan Walp <nwalp@pidgin.im>
parents: 4394
diff changeset
469
10711
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
470 static int
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
471 send_dns_request_to_child(pending_dns_request_t *req, dns_params_t *dns_params)
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
472 {
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
473 char ch;
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
474 int rc;
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
475
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
476 /* Are you alive? */
10707
7672a83c04da [gaim-migrate @ 12296]
Mark Doliner <mark@kingant.net>
parents: 10706
diff changeset
477 if (kill(req->dns_pid, 0) != 0) {
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
478 gaim_debug_warning("dns",
5218
4ee151ad8233 [gaim-migrate @ 5588]
Christian Hammond <chipx86@chipx86.com>
parents: 5211
diff changeset
479 "DNS child %d no longer exists\n", req->dns_pid);
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
480 return -1;
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
481 }
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
482
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
483 /* Let's contact this lost child! */
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
484 rc = write(req->fd_in, dns_params, sizeof(*dns_params));
10707
7672a83c04da [gaim-migrate @ 12296]
Mark Doliner <mark@kingant.net>
parents: 10706
diff changeset
485 if (rc < 0) {
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
486 gaim_debug_error("dns",
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
487 "Unable to write to DNS child %d: %d\n",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
488 req->dns_pid, strerror(errno));
4434
6b83a532eeb2 [gaim-migrate @ 4709]
Nathan Walp <nwalp@pidgin.im>
parents: 4394
diff changeset
489 close(req->fd_in);
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
490 return -1;
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
491 }
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
492
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
493 g_return_val_if_fail(rc == sizeof(*dns_params), -1);
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
494
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
495 /* Did you hear me? (This avoids some race conditions) */
10707
7672a83c04da [gaim-migrate @ 12296]
Mark Doliner <mark@kingant.net>
parents: 10706
diff changeset
496 rc = read(req->fd_out, &ch, sizeof(ch));
7672a83c04da [gaim-migrate @ 12296]
Mark Doliner <mark@kingant.net>
parents: 10706
diff changeset
497 if (rc != 1 || ch != 'Y')
7672a83c04da [gaim-migrate @ 12296]
Mark Doliner <mark@kingant.net>
parents: 10706
diff changeset
498 {
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
499 gaim_debug_warning("dns",
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
500 "DNS child %d not responding. Killing it!\n",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
501 req->dns_pid);
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
502 kill(req->dns_pid, SIGKILL);
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
503 return -1;
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
504 }
9655
00f96f4cc775 [gaim-migrate @ 10503]
Luke Schierer <lschiere@pidgin.im>
parents: 9653
diff changeset
505
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
506 gaim_debug_info("dns",
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
507 "Successfully sent DNS request to child %d\n", req->dns_pid);
10707
7672a83c04da [gaim-migrate @ 12296]
Mark Doliner <mark@kingant.net>
parents: 10706
diff changeset
508
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
509 return 0;
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
510 }
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
511
10711
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
512 static void
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
513 host_resolved(gpointer data, gint source, GaimInputCondition cond);
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
514
10711
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
515 static void
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
516 release_dns_child(pending_dns_request_t *req)
2911
4790fb1272a1 [gaim-migrate @ 2924]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2907
diff changeset
517 {
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
518 g_free(req->host);
10707
7672a83c04da [gaim-migrate @ 12296]
Mark Doliner <mark@kingant.net>
parents: 10706
diff changeset
519 req->host = NULL;
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
520
10707
7672a83c04da [gaim-migrate @ 12296]
Mark Doliner <mark@kingant.net>
parents: 10706
diff changeset
521 if (queued_requests && !g_queue_is_empty(queued_requests)) {
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
522 queued_dns_request_t *r = g_queue_pop_head(queued_requests);
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
523 req->host = g_strdup(r->params.hostname);
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
524 req->port = r->params.port;
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
525 req->callback = r->callback;
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
526 req->data = r->data;
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
527
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
528 gaim_debug_info("dns",
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
529 "Processing queued DNS query for '%s' with child %d\n",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
530 req->host, req->dns_pid);
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
531
10707
7672a83c04da [gaim-migrate @ 12296]
Mark Doliner <mark@kingant.net>
parents: 10706
diff changeset
532 if (send_dns_request_to_child(req, &(r->params)) != 0) {
4434
6b83a532eeb2 [gaim-migrate @ 4709]
Nathan Walp <nwalp@pidgin.im>
parents: 4394
diff changeset
533 req_free(req);
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
534 req = NULL;
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
535
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
536 gaim_debug_warning("dns",
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
537 "Intent of process queued query of '%s' failed, "
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
538 "requeueing...\n", r->params.hostname);
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
539 g_queue_push_head(queued_requests, r);
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
540 } else {
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
541 req->inpa = gaim_input_add(req->fd_out, GAIM_INPUT_READ, host_resolved, req);
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
542 g_free(r);
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
543 }
9655
00f96f4cc775 [gaim-migrate @ 10503]
Luke Schierer <lschiere@pidgin.im>
parents: 9653
diff changeset
544
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
545 } else {
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
546 req->host = NULL;
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
547 req->callback = NULL;
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
548 req->data = NULL;
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
549 free_dns_children = g_slist_append(free_dns_children, req);
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
550 }
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
551 }
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
552
10711
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
553 static void
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
554 host_resolved(gpointer data, gint source, GaimInputCondition cond)
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
555 {
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
556 pending_dns_request_t *req = (pending_dns_request_t*)data;
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
557 int rc, err;
4678
9ce3c698ff5e [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
558 GSList *hosts = NULL;
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
559 struct sockaddr *addr = NULL;
8436
4bb3d8dc717e [gaim-migrate @ 9166]
Luke Schierer <lschiere@pidgin.im>
parents: 8273
diff changeset
560 size_t addrlen;
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
561
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
562 gaim_debug_info("dns", "Host '%s' resolved\n", req->host);
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
563 gaim_input_remove(req->inpa);
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
564
10707
7672a83c04da [gaim-migrate @ 12296]
Mark Doliner <mark@kingant.net>
parents: 10706
diff changeset
565 rc = read(req->fd_out, &err, sizeof(err));
7672a83c04da [gaim-migrate @ 12296]
Mark Doliner <mark@kingant.net>
parents: 10706
diff changeset
566 if ((rc == 4) && (err != 0))
7672a83c04da [gaim-migrate @ 12296]
Mark Doliner <mark@kingant.net>
parents: 10706
diff changeset
567 {
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
568 char message[1024];
8977
52fba1dafe0e [gaim-migrate @ 9751]
Mark Doliner <mark@kingant.net>
parents: 8917
diff changeset
569 #if HAVE_GETADDRINFO
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
570 g_snprintf(message, sizeof(message), "DNS error: %s (pid=%d)",
8977
52fba1dafe0e [gaim-migrate @ 9751]
Mark Doliner <mark@kingant.net>
parents: 8917
diff changeset
571 gai_strerror(err), req->dns_pid);
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
572 #else
8977
52fba1dafe0e [gaim-migrate @ 9751]
Mark Doliner <mark@kingant.net>
parents: 8917
diff changeset
573 g_snprintf(message, sizeof(message), "DNS error: %d (pid=%d)",
52fba1dafe0e [gaim-migrate @ 9751]
Mark Doliner <mark@kingant.net>
parents: 8917
diff changeset
574 err, req->dns_pid);
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
575 #endif
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
576 gaim_debug_error("dns", "%s\n", message);
4678
9ce3c698ff5e [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
577 req->callback(NULL, req->data, message);
9ce3c698ff5e [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
578 release_dns_child(req);
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
579 return;
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
580 }
10707
7672a83c04da [gaim-migrate @ 12296]
Mark Doliner <mark@kingant.net>
parents: 10706
diff changeset
581 if (rc > 0)
7672a83c04da [gaim-migrate @ 12296]
Mark Doliner <mark@kingant.net>
parents: 10706
diff changeset
582 {
7672a83c04da [gaim-migrate @ 12296]
Mark Doliner <mark@kingant.net>
parents: 10706
diff changeset
583 while (rc > 0) {
7672a83c04da [gaim-migrate @ 12296]
Mark Doliner <mark@kingant.net>
parents: 10706
diff changeset
584 rc = read(req->fd_out, &addrlen, sizeof(addrlen));
7672a83c04da [gaim-migrate @ 12296]
Mark Doliner <mark@kingant.net>
parents: 10706
diff changeset
585 if (rc > 0 && addrlen > 0) {
7672a83c04da [gaim-migrate @ 12296]
Mark Doliner <mark@kingant.net>
parents: 10706
diff changeset
586 addr = g_malloc(addrlen);
7672a83c04da [gaim-migrate @ 12296]
Mark Doliner <mark@kingant.net>
parents: 10706
diff changeset
587 rc = read(req->fd_out, addr, addrlen);
4678
9ce3c698ff5e [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
588 hosts = g_slist_append(hosts, GINT_TO_POINTER(addrlen));
9ce3c698ff5e [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
589 hosts = g_slist_append(hosts, addr);
9ce3c698ff5e [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
590 } else {
9ce3c698ff5e [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
591 break;
9ce3c698ff5e [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
592 }
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
593 }
10707
7672a83c04da [gaim-migrate @ 12296]
Mark Doliner <mark@kingant.net>
parents: 10706
diff changeset
594 } else if (rc == -1) {
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
595 char message[1024];
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
596 g_snprintf(message, sizeof(message), "Error reading from DNS child: %s",strerror(errno));
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
597 gaim_debug_error("dns", "%s\n", message);
4678
9ce3c698ff5e [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
598 req->callback(NULL, req->data, message);
4434
6b83a532eeb2 [gaim-migrate @ 4709]
Nathan Walp <nwalp@pidgin.im>
parents: 4394
diff changeset
599 req_free(req);
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
600 return;
10707
7672a83c04da [gaim-migrate @ 12296]
Mark Doliner <mark@kingant.net>
parents: 10706
diff changeset
601 } else if (rc == 0) {
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
602 char message[1024];
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
603 g_snprintf(message, sizeof(message), "EOF reading from DNS child");
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
604 close(req->fd_out);
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
605 gaim_debug_error("dns", "%s\n", message);
4678
9ce3c698ff5e [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
606 req->callback(NULL, req->data, message);
4434
6b83a532eeb2 [gaim-migrate @ 4709]
Nathan Walp <nwalp@pidgin.im>
parents: 4394
diff changeset
607 req_free(req);
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
608 return;
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
609 }
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
610
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
611 /* wait4(req->dns_pid, NULL, WNOHANG, NULL); */
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
612
4678
9ce3c698ff5e [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
613 req->callback(hosts, req->data, NULL);
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
614
4678
9ce3c698ff5e [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
615 release_dns_child(req);
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
616 }
10711
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
617 /*
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
618 * End the functions for dealing with the DNS child processes.
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
619 */
9657
51464cbbdc1a [gaim-migrate @ 10505]
Mark Doliner <mark@kingant.net>
parents: 9656
diff changeset
620
10711
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
621 int
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
622 gaim_gethostbyname_async(const char *hostname, int port, dns_callback_t callback, gpointer data)
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
623 {
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
624 pending_dns_request_t *req = NULL;
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
625 dns_params_t dns_params;
9656
2ea77e275b85 [gaim-migrate @ 10504]
Mark Doliner <mark@kingant.net>
parents: 9655
diff changeset
626 gchar *host_temp;
10307
2ac21bf20e04 [gaim-migrate @ 11497]
Mark Doliner <mark@kingant.net>
parents: 10305
diff changeset
627 gboolean show_debug;
2ac21bf20e04 [gaim-migrate @ 11497]
Mark Doliner <mark@kingant.net>
parents: 10305
diff changeset
628
2ac21bf20e04 [gaim-migrate @ 11497]
Mark Doliner <mark@kingant.net>
parents: 10305
diff changeset
629 show_debug = gaim_debug_is_enabled();
9655
00f96f4cc775 [gaim-migrate @ 10503]
Luke Schierer <lschiere@pidgin.im>
parents: 9653
diff changeset
630
9656
2ea77e275b85 [gaim-migrate @ 10504]
Mark Doliner <mark@kingant.net>
parents: 9655
diff changeset
631 host_temp = g_strstrip(g_strdup(hostname));
2ea77e275b85 [gaim-migrate @ 10504]
Mark Doliner <mark@kingant.net>
parents: 9655
diff changeset
632 strncpy(dns_params.hostname, host_temp, sizeof(dns_params.hostname) - 1);
9655
00f96f4cc775 [gaim-migrate @ 10503]
Luke Schierer <lschiere@pidgin.im>
parents: 9653
diff changeset
633 g_free(host_temp);
9656
2ea77e275b85 [gaim-migrate @ 10504]
Mark Doliner <mark@kingant.net>
parents: 9655
diff changeset
634 dns_params.hostname[sizeof(dns_params.hostname) - 1] = '\0';
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
635 dns_params.port = port;
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
636
9656
2ea77e275b85 [gaim-migrate @ 10504]
Mark Doliner <mark@kingant.net>
parents: 9655
diff changeset
637 /*
2ea77e275b85 [gaim-migrate @ 10504]
Mark Doliner <mark@kingant.net>
parents: 9655
diff changeset
638 * If we have any children, attempt to have them perform the DNS
2ea77e275b85 [gaim-migrate @ 10504]
Mark Doliner <mark@kingant.net>
parents: 9655
diff changeset
639 * query. If we're able to send the query to a child, then req
2ea77e275b85 [gaim-migrate @ 10504]
Mark Doliner <mark@kingant.net>
parents: 9655
diff changeset
640 * will be set to the pending_dns_request_t. Otherwise, req will
2ea77e275b85 [gaim-migrate @ 10504]
Mark Doliner <mark@kingant.net>
parents: 9655
diff changeset
641 * be NULL and we'll need to create a new DNS request child.
2ea77e275b85 [gaim-migrate @ 10504]
Mark Doliner <mark@kingant.net>
parents: 9655
diff changeset
642 */
2ea77e275b85 [gaim-migrate @ 10504]
Mark Doliner <mark@kingant.net>
parents: 9655
diff changeset
643 while (free_dns_children != NULL) {
2ea77e275b85 [gaim-migrate @ 10504]
Mark Doliner <mark@kingant.net>
parents: 9655
diff changeset
644 req = free_dns_children->data;
2ea77e275b85 [gaim-migrate @ 10504]
Mark Doliner <mark@kingant.net>
parents: 9655
diff changeset
645 free_dns_children = g_slist_remove(free_dns_children, req);
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
646
9656
2ea77e275b85 [gaim-migrate @ 10504]
Mark Doliner <mark@kingant.net>
parents: 9655
diff changeset
647 if (send_dns_request_to_child(req, &dns_params) == 0)
2ea77e275b85 [gaim-migrate @ 10504]
Mark Doliner <mark@kingant.net>
parents: 9655
diff changeset
648 /* We found an acceptable child, yay */
2ea77e275b85 [gaim-migrate @ 10504]
Mark Doliner <mark@kingant.net>
parents: 9655
diff changeset
649 break;
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
650
9656
2ea77e275b85 [gaim-migrate @ 10504]
Mark Doliner <mark@kingant.net>
parents: 9655
diff changeset
651 req_free(req);
9657
51464cbbdc1a [gaim-migrate @ 10505]
Mark Doliner <mark@kingant.net>
parents: 9656
diff changeset
652 req = NULL;
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
653 }
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
654
9657
51464cbbdc1a [gaim-migrate @ 10505]
Mark Doliner <mark@kingant.net>
parents: 9656
diff changeset
655 /* We need to create a new DNS request child */
9656
2ea77e275b85 [gaim-migrate @ 10504]
Mark Doliner <mark@kingant.net>
parents: 9655
diff changeset
656 if (req == NULL) {
2ea77e275b85 [gaim-migrate @ 10504]
Mark Doliner <mark@kingant.net>
parents: 9655
diff changeset
657 if (number_of_dns_children >= MAX_DNS_CHILDREN) {
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
658 queued_dns_request_t *r = g_new(queued_dns_request_t, 1);
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
659 memcpy(&(r->params), &dns_params, sizeof(dns_params));
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
660 r->callback = callback;
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
661 r->data = data;
9656
2ea77e275b85 [gaim-migrate @ 10504]
Mark Doliner <mark@kingant.net>
parents: 9655
diff changeset
662 if (!queued_requests)
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
663 queued_requests = g_queue_new();
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
664 g_queue_push_tail(queued_requests, r);
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
665
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
666 gaim_debug_info("dns",
9656
2ea77e275b85 [gaim-migrate @ 10504]
Mark Doliner <mark@kingant.net>
parents: 9655
diff changeset
667 "DNS query for '%s' queued\n", dns_params.hostname);
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
668
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
669 return 0;
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
670 }
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
671
10711
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
672 req = gaim_dns_new_resolverthread(show_debug);
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
673 send_dns_request_to_child(req, &dns_params);
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
674 }
9656
2ea77e275b85 [gaim-migrate @ 10504]
Mark Doliner <mark@kingant.net>
parents: 9655
diff changeset
675
9657
51464cbbdc1a [gaim-migrate @ 10505]
Mark Doliner <mark@kingant.net>
parents: 9656
diff changeset
676 req->host = g_strdup(hostname);
9656
2ea77e275b85 [gaim-migrate @ 10504]
Mark Doliner <mark@kingant.net>
parents: 9655
diff changeset
677 req->port = port;
2ea77e275b85 [gaim-migrate @ 10504]
Mark Doliner <mark@kingant.net>
parents: 9655
diff changeset
678 req->callback = callback;
2ea77e275b85 [gaim-migrate @ 10504]
Mark Doliner <mark@kingant.net>
parents: 9655
diff changeset
679 req->data = data;
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
680 req->inpa = gaim_input_add(req->fd_out, GAIM_INPUT_READ, host_resolved, req);
9656
2ea77e275b85 [gaim-migrate @ 10504]
Mark Doliner <mark@kingant.net>
parents: 9655
diff changeset
681
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
682 return 0;
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
683 }
10237
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
684
10626
06f5cc17cddc [gaim-migrate @ 12101]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10619
diff changeset
685 #elif defined _WIN32 /* end __unix__ */
10237
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
686
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
687 typedef struct _dns_tdata {
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
688 char *hostname;
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
689 int port;
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
690 dns_callback_t callback;
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
691 gpointer data;
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
692 GSList *hosts;
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
693 char *errmsg;
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
694 } dns_tdata;
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
695
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
696 static gboolean dns_main_thread_cb(gpointer data) {
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
697 dns_tdata *td = (dns_tdata*)data;
10562
e06da39b467c [gaim-migrate @ 11942]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10561
diff changeset
698 if (td->errmsg != NULL) {
e06da39b467c [gaim-migrate @ 11942]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10561
diff changeset
699 gaim_debug_info("dns", "%s\n", td->errmsg);
e06da39b467c [gaim-migrate @ 11942]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10561
diff changeset
700 }
10237
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
701 td->callback(td->hosts, td->data, td->errmsg);
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
702 g_free(td->hostname);
10562
e06da39b467c [gaim-migrate @ 11942]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10561
diff changeset
703 g_free(td->errmsg);
10237
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
704 g_free(td);
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
705 return FALSE;
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
706 }
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
707
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
708 static gpointer dns_thread(gpointer data) {
10619
4ab7dec04c38 [gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10613
diff changeset
709
4ab7dec04c38 [gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10613
diff changeset
710 #if HAVE_GETADDRINFO
4ab7dec04c38 [gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10613
diff changeset
711 int rc;
4ab7dec04c38 [gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10613
diff changeset
712 struct addrinfo hints, *res, *tmp;
4ab7dec04c38 [gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10613
diff changeset
713 char servname[20];
4ab7dec04c38 [gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10613
diff changeset
714 #else
10237
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
715 struct sockaddr_in sin;
10619
4ab7dec04c38 [gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10613
diff changeset
716 struct hostent *hp;
4ab7dec04c38 [gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10613
diff changeset
717 #endif
10237
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
718 dns_tdata *td = (dns_tdata*)data;
10619
4ab7dec04c38 [gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10613
diff changeset
719
4ab7dec04c38 [gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10613
diff changeset
720 #if HAVE_GETADDRINFO
4ab7dec04c38 [gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10613
diff changeset
721 g_snprintf(servname, sizeof(servname), "%d", td->port);
4ab7dec04c38 [gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10613
diff changeset
722 memset(&hints,0,sizeof(hints));
10237
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
723
10619
4ab7dec04c38 [gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10613
diff changeset
724 /* This is only used to convert a service
4ab7dec04c38 [gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10613
diff changeset
725 * name to a port number. As we know we are
4ab7dec04c38 [gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10613
diff changeset
726 * passing a number already, we know this
4ab7dec04c38 [gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10613
diff changeset
727 * value will not be really used by the C
4ab7dec04c38 [gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10613
diff changeset
728 * library.
4ab7dec04c38 [gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10613
diff changeset
729 */
4ab7dec04c38 [gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10613
diff changeset
730 hints.ai_socktype = SOCK_STREAM;
4ab7dec04c38 [gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10613
diff changeset
731 if ((rc = getaddrinfo(td->hostname, servname, &hints, &res)) == 0) {
4ab7dec04c38 [gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10613
diff changeset
732 tmp = res;
4ab7dec04c38 [gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10613
diff changeset
733 while(res) {
4ab7dec04c38 [gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10613
diff changeset
734 td->hosts = g_slist_append(td->hosts,
4ab7dec04c38 [gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10613
diff changeset
735 GSIZE_TO_POINTER(res->ai_addrlen));
4ab7dec04c38 [gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10613
diff changeset
736 td->hosts = g_slist_append(td->hosts,
4ab7dec04c38 [gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10613
diff changeset
737 g_memdup(res->ai_addr, res->ai_addrlen));
4ab7dec04c38 [gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10613
diff changeset
738 res = res->ai_next;
4ab7dec04c38 [gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10613
diff changeset
739 }
4ab7dec04c38 [gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10613
diff changeset
740 freeaddrinfo(tmp);
4ab7dec04c38 [gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10613
diff changeset
741 } else {
4ab7dec04c38 [gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10613
diff changeset
742 td->errmsg = g_strdup_printf("DNS getaddrinfo(\"%s\", \"%s\") error: %d", td->hostname, servname, rc);
4ab7dec04c38 [gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10613
diff changeset
743 }
4ab7dec04c38 [gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10613
diff changeset
744 #else
10562
e06da39b467c [gaim-migrate @ 11942]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10561
diff changeset
745 if ((hp = gethostbyname(td->hostname))) {
e06da39b467c [gaim-migrate @ 11942]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10561
diff changeset
746 memset(&sin, 0, sizeof(struct sockaddr_in));
e06da39b467c [gaim-migrate @ 11942]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10561
diff changeset
747 memcpy(&sin.sin_addr.s_addr, hp->h_addr, hp->h_length);
e06da39b467c [gaim-migrate @ 11942]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10561
diff changeset
748 sin.sin_family = hp->h_addrtype;
e06da39b467c [gaim-migrate @ 11942]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10561
diff changeset
749 sin.sin_port = htons(td->port);
10305
9bfcb5eb12bd [gaim-migrate @ 11490]
Mark Doliner <mark@kingant.net>
parents: 10264
diff changeset
750
10562
e06da39b467c [gaim-migrate @ 11942]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10561
diff changeset
751 td->hosts = g_slist_append(td->hosts,
10619
4ab7dec04c38 [gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10613
diff changeset
752 GSIZE_TO_POINTER(sizeof(sin)));
10562
e06da39b467c [gaim-migrate @ 11942]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10561
diff changeset
753 td->hosts = g_slist_append(td->hosts,
e06da39b467c [gaim-migrate @ 11942]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10561
diff changeset
754 g_memdup(&sin, sizeof(sin)));
e06da39b467c [gaim-migrate @ 11942]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10561
diff changeset
755 } else {
10619
4ab7dec04c38 [gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10613
diff changeset
756 td->errmsg = g_strdup_printf("DNS gethostbyname(\"%s\") error: %d", td->hostname, h_errno);
10562
e06da39b467c [gaim-migrate @ 11942]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10561
diff changeset
757 }
10619
4ab7dec04c38 [gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10613
diff changeset
758 #endif
10237
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
759 /* back to main thread */
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
760 g_idle_add(dns_main_thread_cb, td);
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
761 return 0;
10305
9bfcb5eb12bd [gaim-migrate @ 11490]
Mark Doliner <mark@kingant.net>
parents: 10264
diff changeset
762 }
10237
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
763
10711
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
764 int
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
765 gaim_gethostbyname_async(const char *hostname, int port,
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
766 dns_callback_t callback, gpointer data)
00483ba950bf [gaim-migrate @ 12301]
Mark Doliner <mark@kingant.net>
parents: 10709
diff changeset
767 {
10237
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
768 dns_tdata *td;
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
769 struct sockaddr_in sin;
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
770 GError* err = NULL;
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
771
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
772 if(inet_aton(hostname, &sin.sin_addr)) {
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
773 GSList *hosts = NULL;
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
774 sin.sin_family = AF_INET;
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
775 sin.sin_port = htons(port);
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
776 hosts = g_slist_append(hosts, GINT_TO_POINTER(sizeof(sin)));
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
777 hosts = g_slist_append(hosts, g_memdup(&sin, sizeof(sin)));
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
778 callback(hosts, data, NULL);
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
779 return 0;
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
780 }
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
781
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
782 gaim_debug_info("dns", "DNS Lookup for: %s\n", hostname);
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
783 td = g_new0(dns_tdata, 1);
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
784 td->hostname = g_strdup(hostname);
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
785 td->port = port;
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
786 td->callback = callback;
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
787 td->data = data;
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
788
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
789 if(!g_thread_create(dns_thread, td, FALSE, &err)) {
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
790 gaim_debug_error("dns", "DNS thread create failure: %s\n", err?err->message:"");
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
791 g_error_free(err);
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
792 g_free(td->hostname);
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
793 g_free(td);
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
794 return -1;
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
795 }
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
796 return 0;
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
797 }
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
798
10626
06f5cc17cddc [gaim-migrate @ 12101]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10619
diff changeset
799 #else /* not __unix__ or _WIN32 */
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
800
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
801 typedef struct {
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
802 gpointer data;
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
803 size_t addrlen;
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
804 struct sockaddr *addr;
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
805 dns_callback_t callback;
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
806 } pending_dns_request_t;
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
807
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
808 static gboolean host_resolved(gpointer data)
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
809 {
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
810 pending_dns_request_t *req = (pending_dns_request_t*)data;
4678
9ce3c698ff5e [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
811 GSList *hosts = NULL;
9ce3c698ff5e [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
812 hosts = g_slist_append(hosts, GINT_TO_POINTER(req->addrlen));
9ce3c698ff5e [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
813 hosts = g_slist_append(hosts, req->addr);
9ce3c698ff5e [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
814 req->callback(hosts, req->data, NULL);
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
815 g_free(req);
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
816 return FALSE;
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
817 }
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
818
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
819 int
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
820 gaim_gethostbyname_async(const char *hostname, int port,
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
821 dns_callback_t callback, gpointer data)
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
822 {
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
823 struct sockaddr_in sin;
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
824 pending_dns_request_t *req;
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
825
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
826 if (!inet_aton(hostname, &sin.sin_addr)) {
2911
4790fb1272a1 [gaim-migrate @ 2924]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2907
diff changeset
827 struct hostent *hp;
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
828 if(!(hp = gethostbyname(hostname))) {
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
829 gaim_debug_error("dns",
8977
52fba1dafe0e [gaim-migrate @ 9751]
Mark Doliner <mark@kingant.net>
parents: 8917
diff changeset
830 "gaim_gethostbyname(\"%s\", %d) failed: %d\n",
52fba1dafe0e [gaim-migrate @ 9751]
Mark Doliner <mark@kingant.net>
parents: 8917
diff changeset
831 hostname, port, h_errno);
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
832 return -1;
2911
4790fb1272a1 [gaim-migrate @ 2924]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2907
diff changeset
833 }
4790fb1272a1 [gaim-migrate @ 2924]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2907
diff changeset
834 memset(&sin, 0, sizeof(struct sockaddr_in));
4790fb1272a1 [gaim-migrate @ 2924]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2907
diff changeset
835 memcpy(&sin.sin_addr.s_addr, hp->h_addr, hp->h_length);
4790fb1272a1 [gaim-migrate @ 2924]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2907
diff changeset
836 sin.sin_family = hp->h_addrtype;
4790fb1272a1 [gaim-migrate @ 2924]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2907
diff changeset
837 } else
4790fb1272a1 [gaim-migrate @ 2924]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2907
diff changeset
838 sin.sin_family = AF_INET;
4790fb1272a1 [gaim-migrate @ 2924]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2907
diff changeset
839 sin.sin_port = htons(port);
4790fb1272a1 [gaim-migrate @ 2924]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2907
diff changeset
840
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
841 req = g_new(pending_dns_request_t, 1);
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
842 req->addr = (struct sockaddr*) g_memdup(&sin, sizeof(sin));
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
843 req->addrlen = sizeof(sin);
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
844 req->data = data;
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
845 req->callback = callback;
8273
f24172f53650 [gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents: 8269
diff changeset
846 gaim_timeout_add(10, host_resolved, req);
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
847 return 0;
2911
4790fb1272a1 [gaim-migrate @ 2924]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2907
diff changeset
848 }
4790fb1272a1 [gaim-migrate @ 2924]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2907
diff changeset
849
10237
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
850 #endif /* not __unix__ or _WIN32 */
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
851
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
852 static void
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
853 no_one_calls(gpointer data, gint source, GaimInputCondition cond)
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
854 {
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
855 struct PHB *phb = data;
2048
3366311426df [gaim-migrate @ 2058]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1881
diff changeset
856 unsigned int len;
8273
f24172f53650 [gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents: 8269
diff changeset
857 int error=0, ret;
3717
988485669631 [gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 3630
diff changeset
858
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
859 gaim_debug_info("proxy", "Connected.\n");
3717
988485669631 [gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 3630
diff changeset
860
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
861 len = sizeof(error);
4648
4bb99cdfd837 [gaim-migrate @ 4959]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 4634
diff changeset
862
8273
f24172f53650 [gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents: 8269
diff changeset
863 /*
f24172f53650 [gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents: 8269
diff changeset
864 * getsockopt after a non-blocking connect returns -1 if something is
f24172f53650 [gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents: 8269
diff changeset
865 * really messed up (bad descriptor, usually). Otherwise, it returns 0 and
f24172f53650 [gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents: 8269
diff changeset
866 * error holds what connect would have returned if it blocked until now.
f24172f53650 [gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents: 8269
diff changeset
867 * Thus, error == 0 is success, error == EINPROGRESS means "try again",
f24172f53650 [gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents: 8269
diff changeset
868 * and anything else is a real error.
f24172f53650 [gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents: 8269
diff changeset
869 *
f24172f53650 [gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents: 8269
diff changeset
870 * (error == EINPROGRESS can happen after a select because the kernel can
f24172f53650 [gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents: 8269
diff changeset
871 * be overly optimistic sometimes. select is just a hint that you might be
f24172f53650 [gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents: 8269
diff changeset
872 * able to do something.)
f24172f53650 [gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents: 8269
diff changeset
873 */
f24172f53650 [gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents: 8269
diff changeset
874 ret = getsockopt(source, SOL_SOCKET, SO_ERROR, &error, &len);
f24172f53650 [gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents: 8269
diff changeset
875 if (ret == 0 && error == EINPROGRESS)
9863
0e3a84f18467 [gaim-migrate @ 10742]
Mark Doliner <mark@kingant.net>
parents: 9792
diff changeset
876 return; /* we'll be called again later */
8273
f24172f53650 [gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents: 8269
diff changeset
877 if (ret < 0 || error != 0) {
9100
4b3e5a5063f9 [gaim-migrate @ 9877]
Ethan Blanton <elb@pidgin.im>
parents: 8977
diff changeset
878 if(ret!=0) error = errno;
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
879 close(source);
2090
b66aca8e8dce [gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2048
diff changeset
880 gaim_input_remove(phb->inpa);
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
881
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
882 gaim_debug_error("proxy",
9100
4b3e5a5063f9 [gaim-migrate @ 9877]
Ethan Blanton <elb@pidgin.im>
parents: 8977
diff changeset
883 "getsockopt SO_ERROR check: %s\n", strerror(error));
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
884
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
885 try_connect(phb);
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
886 return;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
887 }
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
888
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
889 fcntl(source, F_SETFL, 0);
2090
b66aca8e8dce [gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2048
diff changeset
890 gaim_input_remove(phb->inpa);
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
891
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
892 if (phb->account == NULL ||
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
893 gaim_account_get_connection(phb->account) != NULL) {
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
894
4993
de84c1de2f66 [gaim-migrate @ 5328]
Nathan Walp <nwalp@pidgin.im>
parents: 4679
diff changeset
895 phb->func(phb->data, source, GAIM_INPUT_READ);
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
896 }
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
897
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
898 g_free(phb->host);
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
899 g_free(phb);
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
900 }
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
901
1868
a49ed23b3c02 [gaim-migrate @ 1878]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1844
diff changeset
902 static gboolean clean_connect(gpointer data)
a49ed23b3c02 [gaim-migrate @ 1878]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1844
diff changeset
903 {
a49ed23b3c02 [gaim-migrate @ 1878]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1844
diff changeset
904 struct PHB *phb = data;
a49ed23b3c02 [gaim-migrate @ 1878]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1844
diff changeset
905
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
906 if (phb->account == NULL ||
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
907 gaim_account_get_connection(phb->account) != NULL) {
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
908
4993
de84c1de2f66 [gaim-migrate @ 5328]
Nathan Walp <nwalp@pidgin.im>
parents: 4679
diff changeset
909 phb->func(phb->data, phb->port, GAIM_INPUT_READ);
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
910 }
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
911
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
912 g_free(phb->host);
1868
a49ed23b3c02 [gaim-migrate @ 1878]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1844
diff changeset
913 g_free(phb);
a49ed23b3c02 [gaim-migrate @ 1878]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1844
diff changeset
914
a49ed23b3c02 [gaim-migrate @ 1878]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1844
diff changeset
915 return FALSE;
a49ed23b3c02 [gaim-migrate @ 1878]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1844
diff changeset
916 }
a49ed23b3c02 [gaim-migrate @ 1878]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1844
diff changeset
917
a49ed23b3c02 [gaim-migrate @ 1878]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1844
diff changeset
918
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
919 static int
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
920 proxy_connect_none(struct PHB *phb, struct sockaddr *addr, socklen_t addrlen)
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
921 {
1087
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
922 int fd = -1;
3717
988485669631 [gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 3630
diff changeset
923
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
924 gaim_debug_info("proxy",
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
925 "Connecting to %s:%d with no proxy\n", phb->host, phb->port);
1087
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
926
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
927 if ((fd = socket(addr->sa_family, SOCK_STREAM, 0)) < 0) {
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
928 gaim_debug_error("proxy",
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
929 "Unable to create socket: %s\n", strerror(errno));
1087
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
930 return -1;
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
931 }
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
932 fcntl(fd, F_SETFL, O_NONBLOCK);
10172
374d63326461 [gaim-migrate @ 11275]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10170
diff changeset
933 #ifndef _WIN32
10170
3c88c2f1b732 [gaim-migrate @ 11262]
Ethan Blanton <elb@pidgin.im>
parents: 10087
diff changeset
934 fcntl(fd, F_SETFD, FD_CLOEXEC);
10172
374d63326461 [gaim-migrate @ 11275]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10170
diff changeset
935 #endif
3717
988485669631 [gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 3630
diff changeset
936
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
937 if (connect(fd, (struct sockaddr *)addr, addrlen) < 0) {
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
938 if ((errno == EINPROGRESS) || (errno == EINTR)) {
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
939 gaim_debug_warning("proxy",
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
940 "Connect would have blocked.\n");
2090
b66aca8e8dce [gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2048
diff changeset
941 phb->inpa = gaim_input_add(fd, GAIM_INPUT_WRITE, no_one_calls, phb);
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
942 }
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
943 else {
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
944 gaim_debug_error("proxy",
9100
4b3e5a5063f9 [gaim-migrate @ 9877]
Ethan Blanton <elb@pidgin.im>
parents: 8977
diff changeset
945 "Connect failed: %s\n", strerror(errno));
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
946 close(fd);
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
947 return -1;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
948 }
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
949 }
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
950 else {
2048
3366311426df [gaim-migrate @ 2058]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1881
diff changeset
951 unsigned int len;
3366311426df [gaim-migrate @ 2058]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1881
diff changeset
952 int error = ETIMEDOUT;
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
953 gaim_debug_misc("proxy", "Connect didn't block.\n");
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
954 len = sizeof(error);
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
955 if (getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &len) < 0) {
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
956 gaim_debug_error("proxy", "getsockopt failed.\n");
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
957 close(fd);
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
958 return -1;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
959 }
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
960 fcntl(fd, F_SETFL, 0);
2372
2927c2c26fe6 [gaim-migrate @ 2385]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2306
diff changeset
961 phb->port = fd; /* bleh */
8273
f24172f53650 [gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents: 8269
diff changeset
962 gaim_timeout_add(50, clean_connect, phb); /* we do this because we never
2372
2927c2c26fe6 [gaim-migrate @ 2385]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2306
diff changeset
963 want to call our callback
2927c2c26fe6 [gaim-migrate @ 2385]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2306
diff changeset
964 before we return. */
1087
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
965 }
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
966
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
967 return fd;
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
968 }
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
969
3376
8d0fa912ecaf [gaim-migrate @ 3395]
Sean Egan <seanegan@gmail.com>
parents: 3283
diff changeset
970 #define HTTP_GOODSTRING "HTTP/1.0 200"
8d0fa912ecaf [gaim-migrate @ 3395]
Sean Egan <seanegan@gmail.com>
parents: 3283
diff changeset
971 #define HTTP_GOODSTRING2 "HTTP/1.1 200"
1087
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
972
7834
99ffabc6ce73 [gaim-migrate @ 8487]
Christian Hammond <chipx86@chipx86.com>
parents: 7652
diff changeset
973 static void
99ffabc6ce73 [gaim-migrate @ 8487]
Christian Hammond <chipx86@chipx86.com>
parents: 7652
diff changeset
974 http_complete(struct PHB *phb, gint source)
99ffabc6ce73 [gaim-migrate @ 8487]
Christian Hammond <chipx86@chipx86.com>
parents: 7652
diff changeset
975 {
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
976 gaim_debug_info("http proxy", "proxy connection established\n");
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
977 if(source < 0) {
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
978 try_connect(phb);
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
979 } else if(!phb->account || phb->account->gc) {
7834
99ffabc6ce73 [gaim-migrate @ 8487]
Christian Hammond <chipx86@chipx86.com>
parents: 7652
diff changeset
980 phb->func(phb->data, source, GAIM_INPUT_READ);
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
981 g_free(phb->host);
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
982 g_free(phb);
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
983 }
7834
99ffabc6ce73 [gaim-migrate @ 8487]
Christian Hammond <chipx86@chipx86.com>
parents: 7652
diff changeset
984 }
99ffabc6ce73 [gaim-migrate @ 8487]
Christian Hammond <chipx86@chipx86.com>
parents: 7652
diff changeset
985
99ffabc6ce73 [gaim-migrate @ 8487]
Christian Hammond <chipx86@chipx86.com>
parents: 7652
diff changeset
986
99ffabc6ce73 [gaim-migrate @ 8487]
Christian Hammond <chipx86@chipx86.com>
parents: 7652
diff changeset
987 /* read the response to the CONNECT request, if we are requesting a non-port-80 tunnel */
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
988 static void
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
989 http_canread(gpointer data, gint source, GaimInputCondition cond)
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
990 {
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
991 int nlc = 0;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
992 int pos = 0;
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
993 int minor, major, status, error=0;
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
994 struct PHB *phb = data;
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
995 char inputline[8192], *p;
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
996
2090
b66aca8e8dce [gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2048
diff changeset
997 gaim_input_remove(phb->inpa);
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
998
8118
52089b055c12 [gaim-migrate @ 8822]
Luke Schierer <lschiere@pidgin.im>
parents: 8046
diff changeset
999 while ((pos < sizeof(inputline)-1) && (nlc != 2) && (read(source, &inputline[pos++], 1) == 1)) {
2372
2927c2c26fe6 [gaim-migrate @ 2385]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2306
diff changeset
1000 if (inputline[pos - 1] == '\n')
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1001 nlc++;
2372
2927c2c26fe6 [gaim-migrate @ 2385]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2306
diff changeset
1002 else if (inputline[pos - 1] != '\r')
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1003 nlc = 0;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1004 }
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1005 inputline[pos] = '\0';
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1006
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1007 error = strncmp(inputline, "HTTP/", 5) != 0;
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1008 if(!error) {
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1009 p = inputline + 5;
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1010 major = strtol(p, &p, 10);
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1011 error = (major==0) || (*p != '.');
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1012 if(!error) {
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1013 p++;
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1014 minor = strtol(p, &p, 10);
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1015 error = (*p!=' ');
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1016 if(!error) {
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1017 p++;
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1018 status = strtol(p, &p, 10);
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1019 error = (*p!=' ');
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1020 }
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1021 }
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1022 }
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1023
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1024 if(error) {
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
1025 gaim_debug_error("proxy",
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
1026 "Unable to parse proxy's response: %s\n", inputline);
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1027 close(source);
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1028 source=-1;
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1029 }
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1030 else if(status!=200) {
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
1031 gaim_debug_error("proxy",
7834
99ffabc6ce73 [gaim-migrate @ 8487]
Christian Hammond <chipx86@chipx86.com>
parents: 7652
diff changeset
1032 "Proxy server replied with:\n%s\n", p);
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1033 close(source);
7834
99ffabc6ce73 [gaim-migrate @ 8487]
Christian Hammond <chipx86@chipx86.com>
parents: 7652
diff changeset
1034 source = -1;
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1035
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1036 /* XXX: why in the hell are we calling gaim_connection_error() here? */
8917
189ee7356c59 [gaim-migrate @ 9687]
Mark Doliner <mark@kingant.net>
parents: 8889
diff changeset
1037 if ( status == 403 /* Forbidden */ ) {
189ee7356c59 [gaim-migrate @ 9687]
Mark Doliner <mark@kingant.net>
parents: 8889
diff changeset
1038 gchar *msg = g_strdup_printf(_("Access denied: proxy server forbids port %d tunnelling."), phb->port);
189ee7356c59 [gaim-migrate @ 9687]
Mark Doliner <mark@kingant.net>
parents: 8889
diff changeset
1039 gaim_connection_error(phb->account->gc, msg);
189ee7356c59 [gaim-migrate @ 9687]
Mark Doliner <mark@kingant.net>
parents: 8889
diff changeset
1040 g_free(msg);
189ee7356c59 [gaim-migrate @ 9687]
Mark Doliner <mark@kingant.net>
parents: 8889
diff changeset
1041 } else {
7834
99ffabc6ce73 [gaim-migrate @ 8487]
Christian Hammond <chipx86@chipx86.com>
parents: 7652
diff changeset
1042 char *msg = g_strdup_printf(_("Proxy connection error %d"), status);
99ffabc6ce73 [gaim-migrate @ 8487]
Christian Hammond <chipx86@chipx86.com>
parents: 7652
diff changeset
1043 gaim_connection_error(phb->account->gc, msg);
99ffabc6ce73 [gaim-migrate @ 8487]
Christian Hammond <chipx86@chipx86.com>
parents: 7652
diff changeset
1044 g_free(msg);
99ffabc6ce73 [gaim-migrate @ 8487]
Christian Hammond <chipx86@chipx86.com>
parents: 7652
diff changeset
1045 }
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1046
7834
99ffabc6ce73 [gaim-migrate @ 8487]
Christian Hammond <chipx86@chipx86.com>
parents: 7652
diff changeset
1047 } else {
99ffabc6ce73 [gaim-migrate @ 8487]
Christian Hammond <chipx86@chipx86.com>
parents: 7652
diff changeset
1048 http_complete(phb, source);
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1049 }
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1050
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1051 return;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1052 }
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1053
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1054 static void
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1055 http_canwrite(gpointer data, gint source, GaimInputCondition cond)
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1056 {
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1057 char request[8192];
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1058 int request_len = 0;
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1059 struct PHB *phb = data;
2048
3366311426df [gaim-migrate @ 2058]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1881
diff changeset
1060 unsigned int len;
3366311426df [gaim-migrate @ 2058]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1881
diff changeset
1061 int error = ETIMEDOUT;
3717
988485669631 [gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 3630
diff changeset
1062
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
1063 gaim_debug_info("http proxy", "Connected.\n");
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
1064
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1065 if (phb->inpa > 0)
2090
b66aca8e8dce [gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2048
diff changeset
1066 gaim_input_remove(phb->inpa);
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1067
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1068 len = sizeof(error);
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1069
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1070 if (getsockopt(source, SOL_SOCKET, SO_ERROR, &error, &len) < 0) {
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1071 close(source);
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1072
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1073 try_connect(phb);
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1074 return;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1075 }
7834
99ffabc6ce73 [gaim-migrate @ 8487]
Christian Hammond <chipx86@chipx86.com>
parents: 7652
diff changeset
1076
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
1077 gaim_debug_info("proxy", "using CONNECT tunnelling for %s:%d\n", phb->host, phb->port);
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1078 request_len = g_snprintf(request, sizeof(request),
7834
99ffabc6ce73 [gaim-migrate @ 8487]
Christian Hammond <chipx86@chipx86.com>
parents: 7652
diff changeset
1079 "CONNECT %s:%d HTTP/1.1\r\nHost: %s:%d\r\n",
99ffabc6ce73 [gaim-migrate @ 8487]
Christian Hammond <chipx86@chipx86.com>
parents: 7652
diff changeset
1080 phb->host, phb->port, phb->host, phb->port);
1843
4dbd8533d209 [gaim-migrate @ 1853]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1840
diff changeset
1081
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1082 if (gaim_proxy_info_get_username(phb->gpi) != NULL) {
1843
4dbd8533d209 [gaim-migrate @ 1853]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1840
diff changeset
1083 char *t1, *t2;
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1084 t1 = g_strdup_printf("%s:%s",
7834
99ffabc6ce73 [gaim-migrate @ 8487]
Christian Hammond <chipx86@chipx86.com>
parents: 7652
diff changeset
1085 gaim_proxy_info_get_username(phb->gpi),
99ffabc6ce73 [gaim-migrate @ 8487]
Christian Hammond <chipx86@chipx86.com>
parents: 7652
diff changeset
1086 gaim_proxy_info_get_password(phb->gpi) ?
99ffabc6ce73 [gaim-migrate @ 8487]
Christian Hammond <chipx86@chipx86.com>
parents: 7652
diff changeset
1087 gaim_proxy_info_get_password(phb->gpi) : "");
7106
db6bd3e794d8 [gaim-migrate @ 7671]
Christian Hammond <chipx86@chipx86.com>
parents: 6856
diff changeset
1088 t2 = gaim_base64_encode(t1, strlen(t1));
1843
4dbd8533d209 [gaim-migrate @ 1853]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1840
diff changeset
1089 g_free(t1);
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1090 g_return_if_fail(request_len < sizeof(request));
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1091 request_len += g_snprintf(request + request_len,
7834
99ffabc6ce73 [gaim-migrate @ 8487]
Christian Hammond <chipx86@chipx86.com>
parents: 7652
diff changeset
1092 sizeof(request) - request_len,
99ffabc6ce73 [gaim-migrate @ 8487]
Christian Hammond <chipx86@chipx86.com>
parents: 7652
diff changeset
1093 "Proxy-Authorization: Basic %s\r\n", t2);
1843
4dbd8533d209 [gaim-migrate @ 1853]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1840
diff changeset
1094 g_free(t2);
4dbd8533d209 [gaim-migrate @ 1853]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1840
diff changeset
1095 }
4dbd8533d209 [gaim-migrate @ 1853]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1840
diff changeset
1096
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1097 g_return_if_fail(request_len < sizeof(request));
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1098 strcpy(request + request_len, "\r\n");
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1099 request_len += 2;
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1100
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1101 if (write(source, request, request_len) < 0) {
1843
4dbd8533d209 [gaim-migrate @ 1853]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1840
diff changeset
1102 close(source);
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1103
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1104 try_connect(phb);
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1105 return;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1106 }
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1107
7834
99ffabc6ce73 [gaim-migrate @ 8487]
Christian Hammond <chipx86@chipx86.com>
parents: 7652
diff changeset
1108 /* register the response handler for the CONNECT request */
2090
b66aca8e8dce [gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2048
diff changeset
1109 phb->inpa = gaim_input_add(source, GAIM_INPUT_READ, http_canread, phb);
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1110 }
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1111
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1112 static int
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1113 proxy_connect_http(struct PHB *phb, struct sockaddr *addr, socklen_t addrlen)
1087
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
1114 {
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
1115 int fd = -1;
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
1116
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
1117 gaim_debug_info("http proxy",
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
1118 "Connecting to %s:%d via %s:%d using HTTP\n",
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1119 phb->host, phb->port,
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1120 gaim_proxy_info_get_host(phb->gpi),
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1121 gaim_proxy_info_get_port(phb->gpi));
1087
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
1122
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1123 if ((fd = socket(addr->sa_family, SOCK_STREAM, 0)) < 0) {
1087
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
1124 return -1;
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1125 }
1087
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
1126
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1127 fcntl(fd, F_SETFL, O_NONBLOCK);
10172
374d63326461 [gaim-migrate @ 11275]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10170
diff changeset
1128 #ifndef _WIN32
10170
3c88c2f1b732 [gaim-migrate @ 11262]
Ethan Blanton <elb@pidgin.im>
parents: 10087
diff changeset
1129 fcntl(fd, F_SETFD, FD_CLOEXEC);
10172
374d63326461 [gaim-migrate @ 11275]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10170
diff changeset
1130 #endif
3717
988485669631 [gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 3630
diff changeset
1131
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1132 if (connect(fd, addr, addrlen) < 0) {
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1133 if ((errno == EINPROGRESS) || (errno == EINTR)) {
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
1134 gaim_debug_warning("http proxy",
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
1135 "Connect would have blocked.\n");
9655
00f96f4cc775 [gaim-migrate @ 10503]
Luke Schierer <lschiere@pidgin.im>
parents: 9653
diff changeset
1136
7834
99ffabc6ce73 [gaim-migrate @ 8487]
Christian Hammond <chipx86@chipx86.com>
parents: 7652
diff changeset
1137 if (phb->port != 80) {
99ffabc6ce73 [gaim-migrate @ 8487]
Christian Hammond <chipx86@chipx86.com>
parents: 7652
diff changeset
1138 /* we need to do CONNECT first */
99ffabc6ce73 [gaim-migrate @ 8487]
Christian Hammond <chipx86@chipx86.com>
parents: 7652
diff changeset
1139 phb->inpa = gaim_input_add(fd, GAIM_INPUT_WRITE,
99ffabc6ce73 [gaim-migrate @ 8487]
Christian Hammond <chipx86@chipx86.com>
parents: 7652
diff changeset
1140 http_canwrite, phb);
99ffabc6ce73 [gaim-migrate @ 8487]
Christian Hammond <chipx86@chipx86.com>
parents: 7652
diff changeset
1141 } else {
99ffabc6ce73 [gaim-migrate @ 8487]
Christian Hammond <chipx86@chipx86.com>
parents: 7652
diff changeset
1142 http_complete(phb, fd);
99ffabc6ce73 [gaim-migrate @ 8487]
Christian Hammond <chipx86@chipx86.com>
parents: 7652
diff changeset
1143 }
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1144 } else {
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1145 close(fd);
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1146 return -1;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1147 }
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1148 }
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1149 else {
2048
3366311426df [gaim-migrate @ 2058]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1881
diff changeset
1150 unsigned int len;
3366311426df [gaim-migrate @ 2058]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1881
diff changeset
1151 int error = ETIMEDOUT;
3717
988485669631 [gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 3630
diff changeset
1152
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
1153 gaim_debug_misc("http proxy",
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
1154 "Connect didn't block.\n");
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
1155
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1156 len = sizeof(error);
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1157 if (getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &len) < 0) {
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1158 close(fd);
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1159 return -1;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1160 }
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1161 fcntl(fd, F_SETFL, 0);
2090
b66aca8e8dce [gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2048
diff changeset
1162 http_canwrite(phb, fd, GAIM_INPUT_WRITE);
1695
c0ab844d4790 [gaim-migrate @ 1705]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1451
diff changeset
1163 }
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1164
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1165 return fd;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1166 }
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1167
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1168 static void
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1169 s4_canread(gpointer data, gint source, GaimInputCondition cond)
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1170 {
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1171 unsigned char packet[12];
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1172 struct PHB *phb = data;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1173
2090
b66aca8e8dce [gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2048
diff changeset
1174 gaim_input_remove(phb->inpa);
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1175
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1176 memset(packet, 0, sizeof(packet));
3717
988485669631 [gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 3630
diff changeset
1177
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1178 if (read(source, packet, 9) >= 4 && packet[1] == 90) {
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1179 if (phb->account == NULL ||
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1180 gaim_account_get_connection(phb->account) != NULL) {
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1181
6017
968a00c9f230 [gaim-migrate @ 6467]
Mark Doliner <mark@kingant.net>
parents: 6001
diff changeset
1182 phb->func(phb->data, source, GAIM_INPUT_READ);
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1183 }
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1184
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1185 g_free(phb->host);
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1186 g_free(phb);
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1187 return;
1695
c0ab844d4790 [gaim-migrate @ 1705]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1451
diff changeset
1188 }
1087
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
1189
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1190 close(source);
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1191
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1192 try_connect(phb);
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1193 }
1705
b4d454e5ee31 [gaim-migrate @ 1715]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1695
diff changeset
1194
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1195 static void
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1196 s4_canwrite(gpointer data, gint source, GaimInputCondition cond)
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1197 {
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1198 unsigned char packet[12];
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1199 struct hostent *hp;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1200 struct PHB *phb = data;
2048
3366311426df [gaim-migrate @ 2058]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1881
diff changeset
1201 unsigned int len;
3366311426df [gaim-migrate @ 2058]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1881
diff changeset
1202 int error = ETIMEDOUT;
3717
988485669631 [gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 3630
diff changeset
1203
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
1204 gaim_debug_info("s4 proxy", "Connected.\n");
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
1205
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1206 if (phb->inpa > 0)
2090
b66aca8e8dce [gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2048
diff changeset
1207 gaim_input_remove(phb->inpa);
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1208
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1209 len = sizeof(error);
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1210
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1211 if (getsockopt(source, SOL_SOCKET, SO_ERROR, &error, &len) < 0) {
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1212 close(source);
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1213
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1214 try_connect(phb);
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1215 return;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1216 }
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1217 fcntl(source, F_SETFL, 0);
3717
988485669631 [gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 3630
diff changeset
1218
10561
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1219 /*
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1220 * The socks4 spec doesn't include support for doing host name
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1221 * lookups by the proxy. Some socks4 servers do this via
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1222 * extensions to the protocol. Since we don't know if a
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1223 * server supports this, it would need to be implemented
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1224 * with an option, or some detection mechanism - in the
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1225 * meantime, stick with plain old SOCKS4.
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1226 */
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1227 if (!(hp = gethostbyname(phb->host))) {
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1228 close(source);
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1229
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1230 try_connect(phb);
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1231 return;
1087
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
1232 }
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
1233
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1234 packet[0] = 4;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1235 packet[1] = 1;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1236 packet[2] = phb->port >> 8;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1237 packet[3] = phb->port & 0xff;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1238 packet[4] = (unsigned char)(hp->h_addr_list[0])[0];
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1239 packet[5] = (unsigned char)(hp->h_addr_list[0])[1];
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1240 packet[6] = (unsigned char)(hp->h_addr_list[0])[2];
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1241 packet[7] = (unsigned char)(hp->h_addr_list[0])[3];
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1242 packet[8] = 0;
3717
988485669631 [gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 3630
diff changeset
1243
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1244 if (write(source, packet, 9) != 9) {
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1245 close(source);
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1246
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1247 try_connect(phb);
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1248 return;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1249 }
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1250
2090
b66aca8e8dce [gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2048
diff changeset
1251 phb->inpa = gaim_input_add(source, GAIM_INPUT_READ, s4_canread, phb);
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
1252 }
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
1253
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1254 static int
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1255 proxy_connect_socks4(struct PHB *phb, struct sockaddr *addr, socklen_t addrlen)
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
1256 {
1087
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
1257 int fd = -1;
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
1258
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
1259 gaim_debug_info("socks4 proxy",
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
1260 "Connecting to %s:%d via %s:%d using SOCKS4\n",
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1261 phb->host, phb->port,
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1262 gaim_proxy_info_get_host(phb->gpi),
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1263 gaim_proxy_info_get_port(phb->gpi));
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
1264
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1265 if ((fd = socket(addr->sa_family, SOCK_STREAM, 0)) < 0)
1087
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
1266 return -1;
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
1267
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1268 fcntl(fd, F_SETFL, O_NONBLOCK);
10172
374d63326461 [gaim-migrate @ 11275]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10170
diff changeset
1269 #ifndef _WIN32
10170
3c88c2f1b732 [gaim-migrate @ 11262]
Ethan Blanton <elb@pidgin.im>
parents: 10087
diff changeset
1270 fcntl(fd, F_SETFD, FD_CLOEXEC);
10172
374d63326461 [gaim-migrate @ 11275]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10170
diff changeset
1271 #endif
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1272
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1273 if (connect(fd, addr, addrlen) < 0) {
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1274 if ((errno == EINPROGRESS) || (errno == EINTR)) {
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
1275 gaim_debug_warning("socks4 proxy",
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
1276 "Connect would have blocked.\n");
2090
b66aca8e8dce [gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2048
diff changeset
1277 phb->inpa = gaim_input_add(fd, GAIM_INPUT_WRITE, s4_canwrite, phb);
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1278 }
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1279 else {
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1280 close(fd);
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1281 return -1;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1282 }
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1283 } else {
2048
3366311426df [gaim-migrate @ 2058]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1881
diff changeset
1284 unsigned int len;
3366311426df [gaim-migrate @ 2058]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1881
diff changeset
1285 int error = ETIMEDOUT;
3717
988485669631 [gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 3630
diff changeset
1286
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
1287 gaim_debug_misc("socks4 proxy",
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
1288 "Connect didn't block.\n");
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
1289
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1290 len = sizeof(error);
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1291
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1292 if (getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &len) < 0) {
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1293 close(fd);
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1294 return -1;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1295 }
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1296
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1297 fcntl(fd, F_SETFL, 0);
2090
b66aca8e8dce [gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2048
diff changeset
1298 s4_canwrite(phb, fd, GAIM_INPUT_WRITE);
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1299 }
670
9e51c1a4abba [gaim-migrate @ 680]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 664
diff changeset
1300
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1301 return fd;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1302 }
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1303
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1304 static void
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1305 s5_canread_again(gpointer data, gint source, GaimInputCondition cond)
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1306 {
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1307 unsigned char buf[512];
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1308 struct PHB *phb = data;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1309
2090
b66aca8e8dce [gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2048
diff changeset
1310 gaim_input_remove(phb->inpa);
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
1311 gaim_debug_info("socks5 proxy", "Able to read again.\n");
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1312
8262
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1313 if (read(source, buf, 4) < 4) {
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
1314 gaim_debug_warning("socks5 proxy", "or not...\n");
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1315 close(source);
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1316
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1317 try_connect(phb);
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1318 return;
1087
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
1319 }
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1320 if ((buf[0] != 0x05) || (buf[1] != 0x00)) {
7982
58af482c89f7 [gaim-migrate @ 8659]
Luke Schierer <lschiere@pidgin.im>
parents: 7834
diff changeset
1321 if ((buf[0] == 0x05) && (buf[1] < 0x09))
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
1322 gaim_debug_error("socks5 proxy", socks5errors[buf[1]]);
7982
58af482c89f7 [gaim-migrate @ 8659]
Luke Schierer <lschiere@pidgin.im>
parents: 7834
diff changeset
1323 else
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
1324 gaim_debug_error("socks5 proxy", "Bad data.\n");
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1325 close(source);
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1326
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1327 try_connect(phb);
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1328 return;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1329 }
670
9e51c1a4abba [gaim-migrate @ 680]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 664
diff changeset
1330
8262
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1331 /* Skip past BND.ADDR */
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1332 switch(buf[3]) {
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1333 case 0x01: /* the address is a version-4 IP address, with a length of 4 octets */
8269
79b834d7c2a2 [gaim-migrate @ 8992]
Nathan Walp <nwalp@pidgin.im>
parents: 8262
diff changeset
1334 read(source, buf, 4);
8262
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1335 break;
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1336 case 0x03: /* the address field contains a fully-qualified domain name. The first
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1337 octet of the address field contains the number of octets of name that
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1338 follow, there is no terminating NUL octet. */
8269
79b834d7c2a2 [gaim-migrate @ 8992]
Nathan Walp <nwalp@pidgin.im>
parents: 8262
diff changeset
1339 read(source, buf, 1);
79b834d7c2a2 [gaim-migrate @ 8992]
Nathan Walp <nwalp@pidgin.im>
parents: 8262
diff changeset
1340 read(source, buf, buf[0]);
8262
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1341 break;
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1342 case 0x04: /* the address is a version-6 IP address, with a length of 16 octets */
8269
79b834d7c2a2 [gaim-migrate @ 8992]
Nathan Walp <nwalp@pidgin.im>
parents: 8262
diff changeset
1343 read(source, buf, 16);
8262
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1344 break;
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1345 }
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1346
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1347 /* Skip past BND.PORT */
8269
79b834d7c2a2 [gaim-migrate @ 8992]
Nathan Walp <nwalp@pidgin.im>
parents: 8262
diff changeset
1348 read(source, buf, 2);
8262
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1349
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1350 if (phb->account == NULL ||
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1351 gaim_account_get_connection(phb->account) != NULL) {
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1352
4993
de84c1de2f66 [gaim-migrate @ 5328]
Nathan Walp <nwalp@pidgin.im>
parents: 4679
diff changeset
1353 phb->func(phb->data, source, GAIM_INPUT_READ);
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1354 }
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1355
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1356 g_free(phb->host);
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1357 g_free(phb);
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
1358 }
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
1359
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1360 static void
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1361 s5_sendconnect(gpointer data, gint source)
1087
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
1362 {
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
1363 unsigned char buf[512];
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1364 struct PHB *phb = data;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1365 int hlen = strlen(phb->host);
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1366
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1367 buf[0] = 0x05;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1368 buf[1] = 0x01; /* CONNECT */
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1369 buf[2] = 0x00; /* reserved */
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1370 buf[3] = 0x03; /* address type -- host name */
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1371 buf[4] = hlen;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1372 memcpy(buf + 5, phb->host, hlen);
10561
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1373 buf[5 + hlen] = phb->port >> 8;
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1374 buf[5 + hlen + 1] = phb->port & 0xff;
1087
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
1375
10561
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1376 if (write(source, buf, (5 + hlen + 2)) < (5 + hlen + 2)) {
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1377 close(source);
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1378
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1379 try_connect(phb);
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1380 return;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1381 }
1087
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
1382
2090
b66aca8e8dce [gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2048
diff changeset
1383 phb->inpa = gaim_input_add(source, GAIM_INPUT_READ, s5_canread_again, phb);
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1384 }
1087
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
1385
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1386 static void
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1387 s5_readauth(gpointer data, gint source, GaimInputCondition cond)
1844
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1388 {
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1389 unsigned char buf[512];
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1390 struct PHB *phb = data;
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1391
2090
b66aca8e8dce [gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2048
diff changeset
1392 gaim_input_remove(phb->inpa);
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
1393 gaim_debug_info("socks5 proxy", "Got auth response.\n");
1844
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1394
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1395 if (read(source, buf, 2) < 2) {
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1396 close(source);
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1397
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1398 try_connect(phb);
1844
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1399 return;
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1400 }
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1401
2790
0148422dff4d [gaim-migrate @ 2803]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2754
diff changeset
1402 if ((buf[0] != 0x01) || (buf[1] != 0x00)) {
1844
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1403 close(source);
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1404
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1405 try_connect(phb);
1844
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1406 return;
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1407 }
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1408
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1409 s5_sendconnect(phb, source);
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1410 }
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1411
10561
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1412 static void hmacmd5_chap(const unsigned char * challenge, int challen, const char * passwd, unsigned char * response)
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1413 {
10684
72a5babfa8b4 [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10626
diff changeset
1414 GaimCipher *cipher;
72a5babfa8b4 [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10626
diff changeset
1415 GaimCipherContext *ctx;
10561
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1416 int i;
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1417 unsigned char Kxoripad[65];
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1418 unsigned char Kxoropad[65];
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1419 int pwlen;
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1420 char * pwinput;
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1421 char md5buf[16];
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1422
10684
72a5babfa8b4 [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10626
diff changeset
1423 cipher = gaim_ciphers_find_cipher("md5");
72a5babfa8b4 [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10626
diff changeset
1424 ctx = gaim_cipher_context_new(cipher, NULL);
72a5babfa8b4 [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10626
diff changeset
1425
10561
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1426 pwinput=(char *)passwd;
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1427 pwlen=strlen(passwd);
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1428 if (pwlen>64) {
10684
72a5babfa8b4 [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10626
diff changeset
1429 gaim_cipher_context_append(ctx, passwd, strlen(passwd));
10687
b256ce6b85b8 [gaim-migrate @ 12235]
Etan Reisner <pidgin@unreliablesource.net>
parents: 10684
diff changeset
1430 gaim_cipher_context_digest(ctx, sizeof(md5buf), md5buf, NULL);
10561
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1431 pwinput=(char *)md5buf;
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1432 pwlen=16;
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1433 }
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1434
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1435 memset(Kxoripad,0,sizeof(Kxoripad));
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1436 memset(Kxoropad,0,sizeof(Kxoropad));
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1437 memcpy(Kxoripad,pwinput,pwlen);
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1438 memcpy(Kxoropad,pwinput,pwlen);
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1439 for (i=0;i<64;i++) {
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1440 Kxoripad[i]^=0x36;
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1441 Kxoropad[i]^=0x5c;
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1442 }
10684
72a5babfa8b4 [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10626
diff changeset
1443
72a5babfa8b4 [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10626
diff changeset
1444 gaim_cipher_context_reset(ctx, NULL);
72a5babfa8b4 [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10626
diff changeset
1445 gaim_cipher_context_append(ctx, Kxoripad, 64);
72a5babfa8b4 [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10626
diff changeset
1446 gaim_cipher_context_append(ctx, challenge, challen);
10687
b256ce6b85b8 [gaim-migrate @ 12235]
Etan Reisner <pidgin@unreliablesource.net>
parents: 10684
diff changeset
1447 gaim_cipher_context_digest(ctx, sizeof(Kxoripad), Kxoripad, NULL);
10561
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1448
10684
72a5babfa8b4 [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10626
diff changeset
1449 gaim_cipher_context_reset(ctx, NULL);
72a5babfa8b4 [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10626
diff changeset
1450 gaim_cipher_context_append(ctx, Kxoropad, 64);
72a5babfa8b4 [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10626
diff changeset
1451 gaim_cipher_context_append(ctx, Kxoripad, 16);
10687
b256ce6b85b8 [gaim-migrate @ 12235]
Etan Reisner <pidgin@unreliablesource.net>
parents: 10684
diff changeset
1452 gaim_cipher_context_digest(ctx, sizeof(response), response, NULL);
10684
72a5babfa8b4 [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10626
diff changeset
1453
72a5babfa8b4 [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10626
diff changeset
1454 gaim_cipher_context_destroy(ctx);
10561
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1455 }
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1456
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1457 static void
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1458 s5_readchap(gpointer data, gint source, GaimInputCondition cond)
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1459 {
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1460 unsigned char buf[260];
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1461 unsigned char cmdbuf[20];
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1462 struct PHB *phb = data;
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1463
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1464 int navas, currentav;
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1465
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1466 gaim_input_remove(phb->inpa);
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1467 gaim_debug(GAIM_DEBUG_INFO, "socks5 proxy", "Got CHAP response.\n");
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1468
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1469 if (read(source, cmdbuf, 2) < 2) {
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1470 close(source);
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1471
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1472 try_connect(phb);
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1473 return;
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1474 }
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1475
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1476 if (cmdbuf[0] != 0x01) {
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1477 close(source);
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1478
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1479 try_connect(phb);
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1480 return;
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1481 }
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1482
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1483 navas = cmdbuf[1];
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1484
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1485 for (currentav = 0; currentav < navas; currentav++) {
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1486 if (read(source, cmdbuf, 2) < 2) {
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1487 close(source);
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1488
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1489 try_connect(phb);
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1490 return;
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1491 }
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1492 if (read(source, buf, cmdbuf[1]) < cmdbuf[1]) {
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1493 close(source);
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1494
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1495 try_connect(phb);
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1496 return;
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1497 }
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1498 switch (cmdbuf[0]) {
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1499 case 0x00:
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1500 /* Did auth work? */
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1501 if (buf[0] == 0x00) {
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1502 /* Success */
10613
351449bb5a74 [gaim-migrate @ 12072]
Mark Doliner <mark@kingant.net>
parents: 10562
diff changeset
1503 s5_sendconnect(phb, source);
351449bb5a74 [gaim-migrate @ 12072]
Mark Doliner <mark@kingant.net>
parents: 10562
diff changeset
1504 return;
10561
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1505 } else {
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1506 /* Failure */
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1507 gaim_debug_warning("proxy", "socks5 CHAP authentication "
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1508 "failed. Disconnecting...");
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1509 close(source);
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1510
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1511 try_connect(phb);
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1512 return;
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1513 }
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1514 break;
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1515 case 0x03:
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1516 /* Server wants our credentials */
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1517 hmacmd5_chap(buf, cmdbuf[1],
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1518 gaim_proxy_info_get_password(phb->gpi),
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1519 buf + 4);
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1520 buf[0] = 0x01;
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1521 buf[1] = 0x01;
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1522 buf[2] = 0x04;
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1523 buf[3] = 0x10;
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1524 if (write(source, buf, 20) < 20) {
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1525 close(source);
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1526
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1527 try_connect(phb);
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1528 return;
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1529 }
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1530 break;
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1531 case 0x11:
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1532 /* Server wants to select an algorithm */
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1533 if (buf[0] != 0x85) {
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1534 /* Only currently support HMAC-MD5 */
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1535 gaim_debug_warning("proxy", "Server tried to select an "
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1536 "algorithm that we did not advertise "
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1537 "as supporting. This is a violation "
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1538 "of the socks5 CHAP specification. "
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1539 "Disconnecting...");
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1540 close(source);
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1541
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1542 try_connect(phb);
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1543 return;
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1544 }
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1545 break;
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1546 }
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1547 }
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1548 /* Fell through. We ran out of CHAP events to process, but haven't
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1549 * succeeded or failed authentication - there may be more to come.
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1550 * If this is the case, come straight back here. */
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1551 phb->inpa = gaim_input_add(source, GAIM_INPUT_READ, s5_readchap, phb);
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1552 }
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1553
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1554 static void
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1555 s5_canread(gpointer data, gint source, GaimInputCondition cond)
1844
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1556 {
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1557 unsigned char buf[512];
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1558 struct PHB *phb = data;
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1559
2090
b66aca8e8dce [gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2048
diff changeset
1560 gaim_input_remove(phb->inpa);
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
1561 gaim_debug_info("socks5 proxy", "Able to read.\n");
1844
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1562
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1563 if (read(source, buf, 2) < 2) {
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1564 close(source);
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1565
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1566 try_connect(phb);
1844
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1567 return;
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1568 }
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1569
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1570 if ((buf[0] != 0x05) || (buf[1] == 0xff)) {
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1571 close(source);
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1572
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1573 try_connect(phb);
1844
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1574 return;
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1575 }
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1576
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1577 if (buf[1] == 0x02) {
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1578 unsigned int i, j;
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1579
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1580 i = strlen(gaim_proxy_info_get_username(phb->gpi));
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1581 j = strlen(gaim_proxy_info_get_password(phb->gpi));
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1582
2372
2927c2c26fe6 [gaim-migrate @ 2385]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2306
diff changeset
1583 buf[0] = 0x01; /* version 1 */
1844
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1584 buf[1] = i;
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1585 memcpy(buf + 2, gaim_proxy_info_get_username(phb->gpi), i);
2372
2927c2c26fe6 [gaim-migrate @ 2385]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2306
diff changeset
1586 buf[2 + i] = j;
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1587 memcpy(buf + 2 + i + 1, gaim_proxy_info_get_password(phb->gpi), j);
3717
988485669631 [gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 3630
diff changeset
1588
2372
2927c2c26fe6 [gaim-migrate @ 2385]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2306
diff changeset
1589 if (write(source, buf, 3 + i + j) < 3 + i + j) {
1844
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1590 close(source);
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1591
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1592 try_connect(phb);
1844
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1593 return;
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1594 }
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1595
2090
b66aca8e8dce [gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2048
diff changeset
1596 phb->inpa = gaim_input_add(source, GAIM_INPUT_READ, s5_readauth, phb);
10561
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1597 } else if (buf[1] == 0x03) {
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1598 unsigned int userlen;
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1599 userlen = strlen(gaim_proxy_info_get_username(phb->gpi));
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1600 buf[0] = 0x01;
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1601 buf[1] = 0x02;
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1602 buf[2] = 0x11;
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1603 buf[3] = 0x01;
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1604 buf[4] = 0x85;
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1605 buf[5] = 0x02;
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1606 buf[6] = userlen;
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1607 memcpy(buf + 7, gaim_proxy_info_get_username(phb->gpi), userlen);
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1608 if (write(source, buf, 7 + userlen) < 7 + userlen) {
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1609 close(source);
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1610
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1611 try_connect(phb);
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1612 return;
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1613 }
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1614
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1615 phb->inpa = gaim_input_add(source, GAIM_INPUT_READ, s5_readchap, phb);
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1616 }
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1617 else {
1844
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1618 s5_sendconnect(phb, source);
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1619 }
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1620 }
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1621
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1622 static void
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1623 s5_canwrite(gpointer data, gint source, GaimInputCondition cond)
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1624 {
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1625 unsigned char buf[512];
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1626 int i;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1627 struct PHB *phb = data;
2048
3366311426df [gaim-migrate @ 2058]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1881
diff changeset
1628 unsigned int len;
3366311426df [gaim-migrate @ 2058]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1881
diff changeset
1629 int error = ETIMEDOUT;
3717
988485669631 [gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 3630
diff changeset
1630
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
1631 gaim_debug_info("socks5 proxy", "Connected.\n");
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
1632
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1633 if (phb->inpa > 0)
2090
b66aca8e8dce [gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2048
diff changeset
1634 gaim_input_remove(phb->inpa);
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1635
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1636 len = sizeof(error);
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1637 if (getsockopt(source, SOL_SOCKET, SO_ERROR, &error, &len) < 0) {
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1638 close(source);
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1639
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1640 try_connect(phb);
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1641 return;
1087
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
1642 }
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1643 fcntl(source, F_SETFL, 0);
1087
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
1644
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
1645 i = 0;
1252
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1087
diff changeset
1646 buf[0] = 0x05; /* SOCKS version 5 */
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1647
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1648 if (gaim_proxy_info_get_username(phb->gpi) != NULL) {
10561
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1649 buf[1] = 0x03; /* three methods */
1844
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1650 buf[2] = 0x00; /* no authentication */
10561
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1651 buf[3] = 0x03; /* CHAP authentication */
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1652 buf[4] = 0x02; /* username/password authentication */
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1653 i = 5;
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1654 }
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1655 else {
1844
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1656 buf[1] = 0x01;
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1657 buf[2] = 0x00;
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1658 i = 3;
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1659 }
3717
988485669631 [gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 3630
diff changeset
1660
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1661 if (write(source, buf, i) < i) {
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
1662 gaim_debug_error("socks5 proxy", "Unable to write\n");
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1663 close(source);
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1664
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1665 try_connect(phb);
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1666 return;
1087
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
1667 }
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
1668
2090
b66aca8e8dce [gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2048
diff changeset
1669 phb->inpa = gaim_input_add(source, GAIM_INPUT_READ, s5_canread, phb);
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1670 }
1087
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
1671
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1672 static int
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1673 proxy_connect_socks5(struct PHB *phb, struct sockaddr *addr, socklen_t addrlen)
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1674 {
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1675 int fd = -1;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1676
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
1677 gaim_debug_info("socks5 proxy",
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
1678 "Connecting to %s:%d via %s:%d using SOCKS5\n",
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1679 phb->host, phb->port,
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1680 gaim_proxy_info_get_host(phb->gpi),
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1681 gaim_proxy_info_get_port(phb->gpi));
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1682
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1683 if ((fd = socket(addr->sa_family, SOCK_STREAM, 0)) < 0)
1087
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
1684 return -1;
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
1685
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1686 fcntl(fd, F_SETFL, O_NONBLOCK);
10172
374d63326461 [gaim-migrate @ 11275]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10170
diff changeset
1687 #ifndef _WIN32
10170
3c88c2f1b732 [gaim-migrate @ 11262]
Ethan Blanton <elb@pidgin.im>
parents: 10087
diff changeset
1688 fcntl(fd, F_SETFD, FD_CLOEXEC);
10172
374d63326461 [gaim-migrate @ 11275]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10170
diff changeset
1689 #endif
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1690
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1691 if (connect(fd, addr, addrlen) < 0) {
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1692 if ((errno == EINPROGRESS) || (errno == EINTR)) {
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
1693 gaim_debug_warning("socks5 proxy",
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
1694 "Connect would have blocked.\n");
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1695
2090
b66aca8e8dce [gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2048
diff changeset
1696 phb->inpa = gaim_input_add(fd, GAIM_INPUT_WRITE, s5_canwrite, phb);
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1697 }
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1698 else {
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1699 close(fd);
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1700 return -1;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1701 }
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1702 }
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1703 else {
2048
3366311426df [gaim-migrate @ 2058]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1881
diff changeset
1704 unsigned int len;
3366311426df [gaim-migrate @ 2058]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1881
diff changeset
1705 int error = ETIMEDOUT;
3717
988485669631 [gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 3630
diff changeset
1706
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
1707 gaim_debug_misc("socks5 proxy",
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
1708 "Connect didn't block.\n");
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1709
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1710 len = sizeof(error);
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1711
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1712 if (getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &len) < 0) {
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1713 close(fd);
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1714 return -1;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1715 }
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1716
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1717 fcntl(fd, F_SETFL, 0);
2090
b66aca8e8dce [gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2048
diff changeset
1718 s5_canwrite(phb, fd, GAIM_INPUT_WRITE);
1087
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
1719 }
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
1720
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
1721 return fd;
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
1722 }
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
1723
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1724 static void try_connect(struct PHB *phb)
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1725 {
4678
9ce3c698ff5e [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
1726 size_t addrlen;
9ce3c698ff5e [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
1727 struct sockaddr *addr;
9ce3c698ff5e [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
1728 int ret = -1;
4634
d19872836812 [gaim-migrate @ 4941]
Nathan Walp <nwalp@pidgin.im>
parents: 4499
diff changeset
1729
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1730 while (phb->hosts) {
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1731 addrlen = GPOINTER_TO_INT(phb->hosts->data);
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1732 phb->hosts = g_slist_remove(phb->hosts, phb->hosts->data);
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1733 addr = phb->hosts->data;
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1734 phb->hosts = g_slist_remove(phb->hosts, phb->hosts->data);
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1735
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1736 switch (gaim_proxy_info_get_type(phb->gpi)) {
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1737 case GAIM_PROXY_NONE:
4678
9ce3c698ff5e [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
1738 ret = proxy_connect_none(phb, addr, addrlen);
9ce3c698ff5e [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
1739 break;
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1740
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1741 case GAIM_PROXY_HTTP:
4678
9ce3c698ff5e [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
1742 ret = proxy_connect_http(phb, addr, addrlen);
9ce3c698ff5e [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
1743 break;
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1744
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1745 case GAIM_PROXY_SOCKS4:
4678
9ce3c698ff5e [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
1746 ret = proxy_connect_socks4(phb, addr, addrlen);
9ce3c698ff5e [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
1747 break;
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1748
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1749 case GAIM_PROXY_SOCKS5:
4678
9ce3c698ff5e [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
1750 ret = proxy_connect_socks5(phb, addr, addrlen);
9ce3c698ff5e [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
1751 break;
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1752
6621
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
1753 case GAIM_PROXY_USE_ENVVAR:
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
1754 ret = proxy_connect_http(phb, addr, addrlen);
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
1755 break;
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
1756
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1757 default:
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1758 break;
4678
9ce3c698ff5e [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
1759 }
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1760
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1761 g_free(addr);
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1762
4678
9ce3c698ff5e [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
1763 if (ret > 0)
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1764 break;
4678
9ce3c698ff5e [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
1765 }
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1766
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1767 if (ret < 0) {
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1768 if (phb->account == NULL ||
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1769 gaim_account_get_connection(phb->account) != NULL) {
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1770
4993
de84c1de2f66 [gaim-migrate @ 5328]
Nathan Walp <nwalp@pidgin.im>
parents: 4679
diff changeset
1771 phb->func(phb->data, -1, GAIM_INPUT_READ);
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1772 }
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1773
4678
9ce3c698ff5e [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
1774 g_free(phb->host);
9ce3c698ff5e [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
1775 g_free(phb);
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1776 }
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1777 }
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1778
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1779 static void
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1780 connection_host_resolved(GSList *hosts, gpointer data,
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1781 const char *error_message)
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1782 {
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1783 struct PHB *phb = (struct PHB*)data;
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1784
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1785 phb->hosts = hosts;
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1786
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1787 try_connect(phb);
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1788 }
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1789
4452
2afc0f845e74 [gaim-migrate @ 4727]
Sean Egan <seanegan@gmail.com>
parents: 4447
diff changeset
1790 int
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1791 gaim_proxy_connect(GaimAccount *account, const char *host, int port,
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1792 GaimInputFunction func, gpointer data)
1087
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
1793 {
5580
86456ec3ca25 [gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents: 5572
diff changeset
1794 const char *connecthost = host;
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1795 int connectport = port;
6040
80e3641ee9eb [gaim-migrate @ 6490]
Mark Doliner <mark@kingant.net>
parents: 6017
diff changeset
1796 struct PHB *phb;
6621
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
1797 const gchar *tmp;
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1798
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1799 g_return_val_if_fail(host != NULL, -1);
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1800 g_return_val_if_fail(port != 0 && port != -1, -1);
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1801 g_return_val_if_fail(func != NULL, -1);
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1802
6040
80e3641ee9eb [gaim-migrate @ 6490]
Mark Doliner <mark@kingant.net>
parents: 6017
diff changeset
1803 phb = g_new0(struct PHB, 1);
80e3641ee9eb [gaim-migrate @ 6490]
Mark Doliner <mark@kingant.net>
parents: 6017
diff changeset
1804
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1805 if (account == NULL || gaim_account_get_proxy_info(account) == NULL)
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1806 phb->gpi = gaim_global_proxy_get_info();
4634
d19872836812 [gaim-migrate @ 4941]
Nathan Walp <nwalp@pidgin.im>
parents: 4499
diff changeset
1807 else
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1808 phb->gpi = gaim_account_get_proxy_info(account);
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1809
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1810 phb->func = func;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1811 phb->data = data;
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1812 phb->host = g_strdup(host);
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1813 phb->port = port;
4993
de84c1de2f66 [gaim-migrate @ 5328]
Nathan Walp <nwalp@pidgin.im>
parents: 4679
diff changeset
1814 phb->account = account;
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1815
6621
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
1816 if (gaim_proxy_info_get_type(phb->gpi) == GAIM_PROXY_USE_ENVVAR) {
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
1817 if ((tmp = g_getenv("HTTP_PROXY")) != NULL ||
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
1818 (tmp = g_getenv("http_proxy")) != NULL ||
10534
975c2e66cd53 [gaim-migrate @ 11866]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10320
diff changeset
1819 (tmp = g_getenv("HTTPPROXY")) != NULL) {
9227
9171e528d7e5 [gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents: 9148
diff changeset
1820 char *proxyhost,*proxypath,*proxyuser,*proxypasswd;
7652
ac6b2b3a9a1f [gaim-migrate @ 8296]
Luke Schierer <lschiere@pidgin.im>
parents: 7475
diff changeset
1821 int proxyport;
6621
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
1822
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1823 /* http_proxy-format:
9227
9171e528d7e5 [gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents: 9148
diff changeset
1824 * export http_proxy="http://user:passwd@your.proxy.server:port/"
7652
ac6b2b3a9a1f [gaim-migrate @ 8296]
Luke Schierer <lschiere@pidgin.im>
parents: 7475
diff changeset
1825 */
9227
9171e528d7e5 [gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents: 9148
diff changeset
1826 if(gaim_url_parse(tmp, &proxyhost, &proxyport, &proxypath, &proxyuser, &proxypasswd)) {
7652
ac6b2b3a9a1f [gaim-migrate @ 8296]
Luke Schierer <lschiere@pidgin.im>
parents: 7475
diff changeset
1827 gaim_proxy_info_set_host(phb->gpi, proxyhost);
ac6b2b3a9a1f [gaim-migrate @ 8296]
Luke Schierer <lschiere@pidgin.im>
parents: 7475
diff changeset
1828 g_free(proxyhost);
ac6b2b3a9a1f [gaim-migrate @ 8296]
Luke Schierer <lschiere@pidgin.im>
parents: 7475
diff changeset
1829 g_free(proxypath);
9227
9171e528d7e5 [gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents: 9148
diff changeset
1830 if (proxyuser != NULL) {
9171e528d7e5 [gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents: 9148
diff changeset
1831 gaim_proxy_info_set_username(phb->gpi, proxyuser);
9171e528d7e5 [gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents: 9148
diff changeset
1832 g_free(proxyuser);
9171e528d7e5 [gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents: 9148
diff changeset
1833 }
9171e528d7e5 [gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents: 9148
diff changeset
1834 if (proxypasswd != NULL) {
9171e528d7e5 [gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents: 9148
diff changeset
1835 gaim_proxy_info_set_password(phb->gpi, proxypasswd);
9171e528d7e5 [gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents: 9148
diff changeset
1836 g_free(proxypasswd);
9171e528d7e5 [gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents: 9148
diff changeset
1837 }
7652
ac6b2b3a9a1f [gaim-migrate @ 8296]
Luke Schierer <lschiere@pidgin.im>
parents: 7475
diff changeset
1838
ac6b2b3a9a1f [gaim-migrate @ 8296]
Luke Schierer <lschiere@pidgin.im>
parents: 7475
diff changeset
1839 /* only for backward compatibility */
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1840 if (proxyport == 80 &&
7652
ac6b2b3a9a1f [gaim-migrate @ 8296]
Luke Schierer <lschiere@pidgin.im>
parents: 7475
diff changeset
1841 ((tmp = g_getenv("HTTP_PROXY_PORT")) != NULL ||
ac6b2b3a9a1f [gaim-migrate @ 8296]
Luke Schierer <lschiere@pidgin.im>
parents: 7475
diff changeset
1842 (tmp = g_getenv("http_proxy_port")) != NULL ||
ac6b2b3a9a1f [gaim-migrate @ 8296]
Luke Schierer <lschiere@pidgin.im>
parents: 7475
diff changeset
1843 (tmp = g_getenv("HTTPPROXYPORT")) != NULL))
ac6b2b3a9a1f [gaim-migrate @ 8296]
Luke Schierer <lschiere@pidgin.im>
parents: 7475
diff changeset
1844 proxyport = atoi(tmp);
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1845
7652
ac6b2b3a9a1f [gaim-migrate @ 8296]
Luke Schierer <lschiere@pidgin.im>
parents: 7475
diff changeset
1846 gaim_proxy_info_set_port(phb->gpi, proxyport);
ac6b2b3a9a1f [gaim-migrate @ 8296]
Luke Schierer <lschiere@pidgin.im>
parents: 7475
diff changeset
1847 }
10534
975c2e66cd53 [gaim-migrate @ 11866]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10320
diff changeset
1848 } else {
975c2e66cd53 [gaim-migrate @ 11866]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10320
diff changeset
1849 /* no proxy environment variable found, don't use a proxy */
975c2e66cd53 [gaim-migrate @ 11866]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10320
diff changeset
1850 gaim_debug_info("proxy", "No environment settings found, not using a proxy\n");
975c2e66cd53 [gaim-migrate @ 11866]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10320
diff changeset
1851 gaim_proxy_info_set_type(phb->gpi, GAIM_PROXY_NONE);
6621
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
1852 }
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
1853
9227
9171e528d7e5 [gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents: 9148
diff changeset
1854 /* XXX: Do we want to skip this step if user/password were part of url? */
6621
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
1855 if ((tmp = g_getenv("HTTP_PROXY_USER")) != NULL ||
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
1856 (tmp = g_getenv("http_proxy_user")) != NULL ||
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
1857 (tmp = g_getenv("HTTPPROXYUSER")) != NULL)
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
1858 gaim_proxy_info_set_username(phb->gpi, tmp);
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
1859
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
1860 if ((tmp = g_getenv("HTTP_PROXY_PASS")) != NULL ||
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
1861 (tmp = g_getenv("http_proxy_pass")) != NULL ||
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
1862 (tmp = g_getenv("HTTPPROXYPASS")) != NULL)
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
1863 gaim_proxy_info_set_password(phb->gpi, tmp);
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
1864 }
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
1865
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1866 if ((gaim_proxy_info_get_type(phb->gpi) != GAIM_PROXY_NONE) &&
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1867 (gaim_proxy_info_get_host(phb->gpi) == NULL ||
6621
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
1868 gaim_proxy_info_get_port(phb->gpi) <= 0)) {
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1869
6621
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
1870 gaim_notify_error(NULL, NULL, _("Invalid proxy settings"), _("Either the host name or port number specified for your given proxy type is invalid."));
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
1871 g_free(phb->host);
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
1872 g_free(phb);
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
1873 return -1;
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1874 }
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1875
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1876 switch (gaim_proxy_info_get_type(phb->gpi))
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1877 {
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1878 case GAIM_PROXY_NONE:
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1879 break;
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1880
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1881 case GAIM_PROXY_HTTP:
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1882 case GAIM_PROXY_SOCKS4:
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1883 case GAIM_PROXY_SOCKS5:
6621
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
1884 case GAIM_PROXY_USE_ENVVAR:
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1885 connecthost = gaim_proxy_info_get_host(phb->gpi);
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1886 connectport = gaim_proxy_info_get_port(phb->gpi);
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1887 break;
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1888
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1889 default:
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1890 g_free(phb->host);
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1891 g_free(phb);
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1892 return -1;
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1893 }
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1894
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1895 return gaim_gethostbyname_async(connecthost, connectport,
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1896 connection_host_resolved, phb);
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1897 }
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1898
8262
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1899 int
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1900 gaim_proxy_connect_socks5(GaimProxyInfo *gpi, const char *host, int port,
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1901 GaimInputFunction func, gpointer data)
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1902 {
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1903 struct PHB *phb;
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1904
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1905 phb = g_new0(struct PHB, 1);
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1906 phb->gpi = gpi;
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1907 phb->func = func;
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1908 phb->data = data;
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1909 phb->host = g_strdup(host);
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1910 phb->port = port;
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1911
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1912 return gaim_gethostbyname_async(gaim_proxy_info_get_host(gpi), gaim_proxy_info_get_port(gpi),
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1913 connection_host_resolved, phb);
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1914 }
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1915
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1916
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1917 static void
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1918 proxy_pref_cb(const char *name, GaimPrefType type, gpointer value,
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1919 gpointer data)
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1920 {
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1921 GaimProxyInfo *info = gaim_global_proxy_get_info();
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1922
6001
5e9364e9b29e [gaim-migrate @ 6449]
Mark Doliner <mark@kingant.net>
parents: 5970
diff changeset
1923 if (!strcmp(name, "/core/proxy/type")) {
5e9364e9b29e [gaim-migrate @ 6449]
Mark Doliner <mark@kingant.net>
parents: 5970
diff changeset
1924 int proxytype;
5e9364e9b29e [gaim-migrate @ 6449]
Mark Doliner <mark@kingant.net>
parents: 5970
diff changeset
1925 char *type = value;
5e9364e9b29e [gaim-migrate @ 6449]
Mark Doliner <mark@kingant.net>
parents: 5970
diff changeset
1926
5e9364e9b29e [gaim-migrate @ 6449]
Mark Doliner <mark@kingant.net>
parents: 5970
diff changeset
1927 if (!strcmp(type, "none"))
5e9364e9b29e [gaim-migrate @ 6449]
Mark Doliner <mark@kingant.net>
parents: 5970
diff changeset
1928 proxytype = GAIM_PROXY_NONE;
5e9364e9b29e [gaim-migrate @ 6449]
Mark Doliner <mark@kingant.net>
parents: 5970
diff changeset
1929 else if (!strcmp(type, "http"))
5e9364e9b29e [gaim-migrate @ 6449]
Mark Doliner <mark@kingant.net>
parents: 5970
diff changeset
1930 proxytype = GAIM_PROXY_HTTP;
5e9364e9b29e [gaim-migrate @ 6449]
Mark Doliner <mark@kingant.net>
parents: 5970
diff changeset
1931 else if (!strcmp(type, "socks4"))
5e9364e9b29e [gaim-migrate @ 6449]
Mark Doliner <mark@kingant.net>
parents: 5970
diff changeset
1932 proxytype = GAIM_PROXY_SOCKS4;
5e9364e9b29e [gaim-migrate @ 6449]
Mark Doliner <mark@kingant.net>
parents: 5970
diff changeset
1933 else if (!strcmp(type, "socks5"))
5e9364e9b29e [gaim-migrate @ 6449]
Mark Doliner <mark@kingant.net>
parents: 5970
diff changeset
1934 proxytype = GAIM_PROXY_SOCKS5;
6621
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
1935 else if (!strcmp(type, "envvar"))
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
1936 proxytype = GAIM_PROXY_USE_ENVVAR;
6001
5e9364e9b29e [gaim-migrate @ 6449]
Mark Doliner <mark@kingant.net>
parents: 5970
diff changeset
1937 else
5e9364e9b29e [gaim-migrate @ 6449]
Mark Doliner <mark@kingant.net>
parents: 5970
diff changeset
1938 proxytype = -1;
5e9364e9b29e [gaim-migrate @ 6449]
Mark Doliner <mark@kingant.net>
parents: 5970
diff changeset
1939
5e9364e9b29e [gaim-migrate @ 6449]
Mark Doliner <mark@kingant.net>
parents: 5970
diff changeset
1940 gaim_proxy_info_set_type(info, proxytype);
5e9364e9b29e [gaim-migrate @ 6449]
Mark Doliner <mark@kingant.net>
parents: 5970
diff changeset
1941 } else if (!strcmp(name, "/core/proxy/host"))
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1942 gaim_proxy_info_set_host(info, value);
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1943 else if (!strcmp(name, "/core/proxy/port"))
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1944 gaim_proxy_info_set_port(info, GPOINTER_TO_INT(value));
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1945 else if (!strcmp(name, "/core/proxy/username"))
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1946 gaim_proxy_info_set_username(info, value);
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1947 else if (!strcmp(name, "/core/proxy/password"))
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1948 gaim_proxy_info_set_password(info, value);
1087
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
1949 }
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1950
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1951 void
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1952 gaim_proxy_init(void)
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1953 {
10087
9fdbfe832fac [gaim-migrate @ 11098]
Stu Tomlinson <stu@nosnilmot.com>
parents: 9863
diff changeset
1954 void *handle;
9fdbfe832fac [gaim-migrate @ 11098]
Stu Tomlinson <stu@nosnilmot.com>
parents: 9863
diff changeset
1955
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1956 /* Initialize a default proxy info struct. */
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1957 global_proxy_info = gaim_proxy_info_new();
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1958
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1959 /* Proxy */
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1960 gaim_prefs_add_none("/core/proxy");
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1961 gaim_prefs_add_string("/core/proxy/type", "none");
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1962 gaim_prefs_add_string("/core/proxy/host", "");
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1963 gaim_prefs_add_int("/core/proxy/port", 0);
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1964 gaim_prefs_add_string("/core/proxy/username", "");
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1965 gaim_prefs_add_string("/core/proxy/password", "");
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1966
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1967 /* Setup callbacks for the preferences. */
10087
9fdbfe832fac [gaim-migrate @ 11098]
Stu Tomlinson <stu@nosnilmot.com>
parents: 9863
diff changeset
1968 handle = gaim_proxy_get_handle();
9fdbfe832fac [gaim-migrate @ 11098]
Stu Tomlinson <stu@nosnilmot.com>
parents: 9863
diff changeset
1969 gaim_prefs_connect_callback(handle, "/core/proxy/type",
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1970 proxy_pref_cb, NULL);
10087
9fdbfe832fac [gaim-migrate @ 11098]
Stu Tomlinson <stu@nosnilmot.com>
parents: 9863
diff changeset
1971 gaim_prefs_connect_callback(handle, "/core/proxy/host",
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1972 proxy_pref_cb, NULL);
10087
9fdbfe832fac [gaim-migrate @ 11098]
Stu Tomlinson <stu@nosnilmot.com>
parents: 9863
diff changeset
1973 gaim_prefs_connect_callback(handle, "/core/proxy/port",
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1974 proxy_pref_cb, NULL);
10087
9fdbfe832fac [gaim-migrate @ 11098]
Stu Tomlinson <stu@nosnilmot.com>
parents: 9863
diff changeset
1975 gaim_prefs_connect_callback(handle, "/core/proxy/username",
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1976 proxy_pref_cb, NULL);
10087
9fdbfe832fac [gaim-migrate @ 11098]
Stu Tomlinson <stu@nosnilmot.com>
parents: 9863
diff changeset
1977 gaim_prefs_connect_callback(handle, "/core/proxy/password",
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1978 proxy_pref_cb, NULL);
10626
06f5cc17cddc [gaim-migrate @ 12101]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10619
diff changeset
1979 #ifdef _WIN32
10237
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
1980 if(!g_thread_supported())
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
1981 g_thread_init(NULL);
10626
06f5cc17cddc [gaim-migrate @ 12101]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10619
diff changeset
1982 #endif
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1983 }
10087
9fdbfe832fac [gaim-migrate @ 11098]
Stu Tomlinson <stu@nosnilmot.com>
parents: 9863
diff changeset
1984
9fdbfe832fac [gaim-migrate @ 11098]
Stu Tomlinson <stu@nosnilmot.com>
parents: 9863
diff changeset
1985 void *
9fdbfe832fac [gaim-migrate @ 11098]
Stu Tomlinson <stu@nosnilmot.com>
parents: 9863
diff changeset
1986 gaim_proxy_get_handle()
9fdbfe832fac [gaim-migrate @ 11098]
Stu Tomlinson <stu@nosnilmot.com>
parents: 9863
diff changeset
1987 {
9fdbfe832fac [gaim-migrate @ 11098]
Stu Tomlinson <stu@nosnilmot.com>
parents: 9863
diff changeset
1988 static int handle;
9fdbfe832fac [gaim-migrate @ 11098]
Stu Tomlinson <stu@nosnilmot.com>
parents: 9863
diff changeset
1989
9fdbfe832fac [gaim-migrate @ 11098]
Stu Tomlinson <stu@nosnilmot.com>
parents: 9863
diff changeset
1990 return &handle;
9fdbfe832fac [gaim-migrate @ 11098]
Stu Tomlinson <stu@nosnilmot.com>
parents: 9863
diff changeset
1991 }