src/proxy.c

Wed, 09 Aug 2006 14:47:37 +0000

author
Luke Schierer <lschiere@pidgin.im>
date
Wed, 09 Aug 2006 14:47:37 +0000
changeset 14123
7ae9b90ecf6f
parent 14097
0c340861ab79
child 14151
34427f138b1f
permissions
-rw-r--r--

[gaim-migrate @ 16679]
some translation updates. I have questions about gu.po, if someone sees that answered, we might need to revert that part of the change. It is all very confusing. The same person submitted the original gu.po and this update, but he called it gu_IN this time…

5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1 /**
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2 * @file proxy.c Proxy API
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
3 * @ingroup core
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
4 *
1
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
5 * gaim
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
6 *
8046
c581b20a47d6 [gaim-migrate @ 8730]
Sean Egan <seanegan@pidgin.im>
parents: 7982
diff changeset
7 * Gaim is the legal property of its developers, whose names are too numerous
c581b20a47d6 [gaim-migrate @ 8730]
Sean Egan <seanegan@pidgin.im>
parents: 7982
diff changeset
8 * to list here. Please refer to the COPYRIGHT file distributed with this
c581b20a47d6 [gaim-migrate @ 8730]
Sean Egan <seanegan@pidgin.im>
parents: 7982
diff changeset
9 * source distribution.
1
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
10 *
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
11 * This program is free software; you can redistribute it and/or modify
efe077a7e70d [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
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
13 * the Free Software Foundation; either version 2 of the License, or
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
14 * (at your option) any later version.
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
15 *
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
16 * This program is distributed in the hope that it will be useful,
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
19 * GNU General Public License for more details.
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
20 *
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
21 * You should have received a copy of the GNU General Public License
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
22 * along with this program; if not, write to the Free Software
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
24 *
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
25 */
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
26
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
27 /* this is a little piece of code to handle proxy connection */
efe077a7e70d [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
5ed6b8356ebc [gaim-migrate @ 7401]
Mark Doliner <markdoliner@pidgin.im>
parents: 6621
diff changeset
29 , 2nd provide an easy way to add socks support
5ed6b8356ebc [gaim-migrate @ 7401]
Mark Doliner <markdoliner@pidgin.im>
parents: 6621
diff changeset
30 , 3rd draw women to it like flies to honey */
1
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
31
5872
754c63f29b77 [gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents: 5681
diff changeset
32 #include "internal.h"
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10626
diff changeset
33 #include "cipher.h"
5872
754c63f29b77 [gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents: 5681
diff changeset
34 #include "debug.h"
6621
2a18ef3e5224 [gaim-migrate @ 7145]
Robert McQueen <robot101@debian.org>
parents: 6320
diff changeset
35 #include "notify.h"
12391
2866c00556d9 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
36 #include "ntlm.h"
5872
754c63f29b77 [gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents: 5681
diff changeset
37 #include "prefs.h"
1
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
38 #include "proxy.h"
5872
754c63f29b77 [gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents: 5681
diff changeset
39 #include "util.h"
3630
caa952062dc2 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3376
diff changeset
40
9729
246f126db809 [gaim-migrate @ 10590]
Mark Doliner <markdoliner@pidgin.im>
parents: 9657
diff changeset
41 static GaimProxyInfo *global_proxy_info = NULL;
5872
754c63f29b77 [gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents: 5681
diff changeset
42
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
43 struct PHB {
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
44 GaimInputFunction func;
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
45 gpointer data;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
46 char *host;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
47 int port;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
48 gint inpa;
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
49 GaimProxyInfo *gpi;
5563
d5a7852aa0cb [gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents: 5532
diff changeset
50 GaimAccount *account;
9129
9510867e614f [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
51 GSList *hosts;
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
52 guchar *write_buffer;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
53 gsize write_buf_len;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
54 gsize written_len;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
55 GaimInputFunction read_cb;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
56 guchar *read_buffer;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
57 gsize read_buf_len;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
58 gsize read_len;
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
59 };
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
60
9129
9510867e614f [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
61 static void try_connect(struct PHB *);
9510867e614f [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
62
12246
7af1ef3b1cc4 [gaim-migrate @ 14548]
Mark Doliner <markdoliner@pidgin.im>
parents: 12156
diff changeset
63 static const char *socks5errors[] = {
7982
db8c1b6137eb [gaim-migrate @ 8659]
Gavan Fantom <gavan@users.sourceforge.net>
parents: 7834
diff changeset
64 "succeeded\n",
db8c1b6137eb [gaim-migrate @ 8659]
Gavan Fantom <gavan@users.sourceforge.net>
parents: 7834
diff changeset
65 "general SOCKS server failure\n",
db8c1b6137eb [gaim-migrate @ 8659]
Gavan Fantom <gavan@users.sourceforge.net>
parents: 7834
diff changeset
66 "connection not allowed by ruleset\n",
db8c1b6137eb [gaim-migrate @ 8659]
Gavan Fantom <gavan@users.sourceforge.net>
parents: 7834
diff changeset
67 "Network unreachable\n",
db8c1b6137eb [gaim-migrate @ 8659]
Gavan Fantom <gavan@users.sourceforge.net>
parents: 7834
diff changeset
68 "Host unreachable\n",
db8c1b6137eb [gaim-migrate @ 8659]
Gavan Fantom <gavan@users.sourceforge.net>
parents: 7834
diff changeset
69 "Connection refused\n",
db8c1b6137eb [gaim-migrate @ 8659]
Gavan Fantom <gavan@users.sourceforge.net>
parents: 7834
diff changeset
70 "TTL expired\n",
db8c1b6137eb [gaim-migrate @ 8659]
Gavan Fantom <gavan@users.sourceforge.net>
parents: 7834
diff changeset
71 "Command not supported\n",
db8c1b6137eb [gaim-migrate @ 8659]
Gavan Fantom <gavan@users.sourceforge.net>
parents: 7834
diff changeset
72 "Address type not supported\n"
db8c1b6137eb [gaim-migrate @ 8659]
Gavan Fantom <gavan@users.sourceforge.net>
parents: 7834
diff changeset
73 };
db8c1b6137eb [gaim-migrate @ 8659]
Gavan Fantom <gavan@users.sourceforge.net>
parents: 7834
diff changeset
74
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
75 /**************************************************************************
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
76 * Proxy structure API
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
77 **************************************************************************/
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
78 GaimProxyInfo *
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
79 gaim_proxy_info_new(void)
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
80 {
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
81 return g_new0(GaimProxyInfo, 1);
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
82 }
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
83
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
84 void
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
85 gaim_proxy_info_destroy(GaimProxyInfo *info)
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
86 {
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
87 g_return_if_fail(info != NULL);
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
88
14030
23144f1dc950 [gaim-migrate @ 16525]
Mark Doliner <markdoliner@pidgin.im>
parents: 13991
diff changeset
89 g_free(info->host);
23144f1dc950 [gaim-migrate @ 16525]
Mark Doliner <markdoliner@pidgin.im>
parents: 13991
diff changeset
90 g_free(info->username);
23144f1dc950 [gaim-migrate @ 16525]
Mark Doliner <markdoliner@pidgin.im>
parents: 13991
diff changeset
91 g_free(info->password);
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
92
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
93 g_free(info);
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
94 }
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
95
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
96 void
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
97 gaim_proxy_info_set_type(GaimProxyInfo *info, GaimProxyType type)
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
98 {
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
99 g_return_if_fail(info != NULL);
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
100
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
101 info->type = type;
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
102 }
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
103
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
104 void
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
105 gaim_proxy_info_set_host(GaimProxyInfo *info, const char *host)
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
106 {
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
107 g_return_if_fail(info != NULL);
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
108
14030
23144f1dc950 [gaim-migrate @ 16525]
Mark Doliner <markdoliner@pidgin.im>
parents: 13991
diff changeset
109 g_free(info->host);
14097
0c340861ab79 [gaim-migrate @ 16638]
Mark Doliner <markdoliner@pidgin.im>
parents: 14030
diff changeset
110 info->host = g_strdup(host);
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
111 }
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
112
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
113 void
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
114 gaim_proxy_info_set_port(GaimProxyInfo *info, int port)
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
115 {
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
116 g_return_if_fail(info != NULL);
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
117
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
118 info->port = port;
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
119 }
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
120
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
121 void
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
122 gaim_proxy_info_set_username(GaimProxyInfo *info, const char *username)
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
123 {
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
124 g_return_if_fail(info != NULL);
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
125
14030
23144f1dc950 [gaim-migrate @ 16525]
Mark Doliner <markdoliner@pidgin.im>
parents: 13991
diff changeset
126 g_free(info->username);
14097
0c340861ab79 [gaim-migrate @ 16638]
Mark Doliner <markdoliner@pidgin.im>
parents: 14030
diff changeset
127 info->username = g_strdup(username);
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
128 }
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
129
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
130 void
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
131 gaim_proxy_info_set_password(GaimProxyInfo *info, const char *password)
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
132 {
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
133 g_return_if_fail(info != NULL);
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
134
14030
23144f1dc950 [gaim-migrate @ 16525]
Mark Doliner <markdoliner@pidgin.im>
parents: 13991
diff changeset
135 g_free(info->password);
14097
0c340861ab79 [gaim-migrate @ 16638]
Mark Doliner <markdoliner@pidgin.im>
parents: 14030
diff changeset
136 info->password = g_strdup(password);
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
137 }
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
138
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
139 GaimProxyType
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
140 gaim_proxy_info_get_type(const GaimProxyInfo *info)
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
141 {
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
142 g_return_val_if_fail(info != NULL, GAIM_PROXY_NONE);
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
143
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
144 return info->type;
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
145 }
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
146
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
147 const char *
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
148 gaim_proxy_info_get_host(const GaimProxyInfo *info)
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
149 {
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
150 g_return_val_if_fail(info != NULL, NULL);
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
151
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
152 return info->host;
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
153 }
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
154
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
155 int
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
156 gaim_proxy_info_get_port(const GaimProxyInfo *info)
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
157 {
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
158 g_return_val_if_fail(info != NULL, 0);
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
159
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
160 return info->port;
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
161 }
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
162
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
163 const char *
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
164 gaim_proxy_info_get_username(const GaimProxyInfo *info)
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
165 {
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
166 g_return_val_if_fail(info != NULL, NULL);
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
167
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
168 return info->username;
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
169 }
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
170
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
171 const char *
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
172 gaim_proxy_info_get_password(const GaimProxyInfo *info)
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
173 {
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
174 g_return_val_if_fail(info != NULL, NULL);
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
175
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
176 return info->password;
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
177 }
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
178
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
179 /**************************************************************************
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
180 * Global Proxy API
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
181 **************************************************************************/
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
182 GaimProxyInfo *
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
183 gaim_global_proxy_get_info(void)
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
184 {
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
185 return global_proxy_info;
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
186 }
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
187
12412
8abe3226695e [gaim-migrate @ 14719]
Richard Laager <rlaager@pidgin.im>
parents: 12391
diff changeset
188 static GaimProxyInfo *
11878
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
189 gaim_gnome_proxy_get_info(void)
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
190 {
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
191 static GaimProxyInfo info = {0, NULL, 0, NULL, NULL};
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
192 gchar *path;
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
193 if ((path = g_find_program_in_path("gconftool-2"))) {
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
194 gchar *tmp;
12156
58a027264d6c [gaim-migrate @ 14457]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 11878
diff changeset
195
58a027264d6c [gaim-migrate @ 14457]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 11878
diff changeset
196 g_free(path);
58a027264d6c [gaim-migrate @ 14457]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 11878
diff changeset
197
11878
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
198 /* See whether to use a proxy. */
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
199 if (!g_spawn_command_line_sync("gconftool-2 -g /system/http_proxy/use_http_proxy", &tmp,
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
200 NULL, NULL, NULL))
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
201 return gaim_global_proxy_get_info();
12811
492f9a7ecad2 [gaim-migrate @ 15159]
Daniel Atallah <datallah@pidgin.im>
parents: 12765
diff changeset
202 if (!strcmp(tmp, "false\n")) {
11878
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
203 info.type = GAIM_PROXY_NONE;
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
204 g_free(tmp);
12811
492f9a7ecad2 [gaim-migrate @ 15159]
Daniel Atallah <datallah@pidgin.im>
parents: 12765
diff changeset
205 return &info;
492f9a7ecad2 [gaim-migrate @ 15159]
Daniel Atallah <datallah@pidgin.im>
parents: 12765
diff changeset
206 } else if (strcmp(tmp, "true\n")) {
492f9a7ecad2 [gaim-migrate @ 15159]
Daniel Atallah <datallah@pidgin.im>
parents: 12765
diff changeset
207 g_free(tmp);
11878
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
208 return gaim_global_proxy_get_info();
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
209 }
12156
58a027264d6c [gaim-migrate @ 14457]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 11878
diff changeset
210
11878
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
211 g_free(tmp);
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
212 info.type = GAIM_PROXY_HTTP;
12156
58a027264d6c [gaim-migrate @ 14457]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 11878
diff changeset
213
11878
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
214 /* Free the old fields */
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
215 if (info.host) {
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
216 g_free(info.host);
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
217 info.host = NULL;
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
218 }
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
219 if (info.username) {
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
220 g_free(info.username);
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
221 info.username = NULL;
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
222 }
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
223 if (info.password) {
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
224 g_free(info.password);
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
225 info.password = NULL;
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
226 }
12156
58a027264d6c [gaim-migrate @ 14457]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 11878
diff changeset
227
11878
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
228 /* Get the new ones */
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
229 if (!g_spawn_command_line_sync("gconftool-2 -g /system/http_proxy/host", &info.host,
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
230 NULL, NULL, NULL))
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
231 return gaim_global_proxy_get_info();
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
232 g_strchomp(info.host);
12156
58a027264d6c [gaim-migrate @ 14457]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 11878
diff changeset
233
11878
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
234 if (!g_spawn_command_line_sync("gconftool-2 -g /system/http_proxy/authentication_user", &info.username,
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
235 NULL, NULL, NULL))
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
236 return gaim_global_proxy_get_info();
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
237 g_strchomp(info.username);
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
238
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
239 if (!g_spawn_command_line_sync("gconftool-2 -g /system/http_proxy/authentication_password", &info.password,
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
240 NULL, NULL, NULL))
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
241 return gaim_global_proxy_get_info();
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
242 g_strchomp(info.password);
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
243
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
244 if (!g_spawn_command_line_sync("gconftool-2 -g /system/http_proxy/port", &tmp,
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
245 NULL, NULL, NULL))
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
246 return gaim_global_proxy_get_info();
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
247 info.port = atoi(tmp);
12156
58a027264d6c [gaim-migrate @ 14457]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 11878
diff changeset
248 g_free(tmp);
11878
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
249
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
250 return &info;
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
251 }
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
252 return gaim_global_proxy_get_info();
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
253 }
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
254 /**************************************************************************
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
255 * Proxy API
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
256 **************************************************************************/
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
257
13649
b156749bec5b [gaim-migrate @ 16049]
Evan Schoenberg <evands@pidgin.im>
parents: 13531
diff changeset
258 #if defined(__unix__) || defined(__APPLE__)
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
259
10711
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
260 /*
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
261 * This structure represents both a pending DNS request and
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
262 * a free child process.
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
263 */
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
264 typedef struct {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
265 char *host;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
266 int port;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
267 dns_callback_t callback;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
268 gpointer data;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
269 gint inpa;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
270 int fd_in, fd_out;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
271 pid_t dns_pid;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
272 } pending_dns_request_t;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
273
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
274 static GSList *free_dns_children = NULL;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
275 static GQueue *queued_requests = NULL;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
276
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
277 static int number_of_dns_children = 0;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
278
12246
7af1ef3b1cc4 [gaim-migrate @ 14548]
Mark Doliner <markdoliner@pidgin.im>
parents: 12156
diff changeset
279 static const int MAX_DNS_CHILDREN = 2;
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
280
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
281 typedef struct {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
282 char hostname[512];
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
283 int port;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
284 } dns_params_t;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
285
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
286 typedef struct {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
287 dns_params_t params;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
288 dns_callback_t callback;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
289 gpointer data;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
290 } queued_dns_request_t;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
291
10711
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
292 /*
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
293 * Begin the DNS resolver child process functions.
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
294 */
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
295 #ifdef HAVE_SIGNAL_H
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
296 static void
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
297 trap_gdb_bug()
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
298 {
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
299 const char *message =
14030
23144f1dc950 [gaim-migrate @ 16525]
Mark Doliner <markdoliner@pidgin.im>
parents: 13991
diff changeset
300 "Gaim's DNS child got a SIGTRAP signal.\n"
10711
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
301 "This can be caused by trying to run gaim inside gdb.\n"
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
302 "There is a known gdb bug which prevents this. Supposedly gaim\n"
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
303 "should have detected you were using gdb and used an ugly hack,\n"
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
304 "check cope_with_gdb_brokenness() in proxy.c.\n\n"
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
305 "For more info about this bug, see http://sources.redhat.com/ml/gdb/2001-07/msg00349.html\n";
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
306 fputs("\n* * *\n",stderr);
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
307 fputs(message,stderr);
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
308 fputs("* * *\n\n",stderr);
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
309 execlp("xmessage","xmessage","-center", message, NULL);
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
310 _exit(1);
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
311 }
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
312 #endif
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
313
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
314 static void
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
315 cope_with_gdb_brokenness()
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
316 {
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
317 #ifdef __linux__
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
318 static gboolean already_done = FALSE;
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
319 char s[256], e[512];
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
320 int n;
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
321 pid_t ppid;
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
322
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
323 if(already_done)
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
324 return;
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
325 already_done = TRUE;
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
326 ppid = getppid();
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
327 snprintf(s, sizeof(s), "/proc/%d/exe", ppid);
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
328 n = readlink(s, e, sizeof(e));
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
329 if(n < 0)
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
330 return;
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
331
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
332 e[MIN(n,sizeof(e)-1)] = '\0';
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
333
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
334 if(strstr(e,"gdb")) {
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
335 gaim_debug_info("dns",
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
336 "Debugger detected, performing useless query...\n");
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
337 gethostbyname("x.x.x.x.x");
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
338 }
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
339 #endif
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
340 }
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
341
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
342 static void
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
343 gaim_dns_resolverthread(int child_out, int child_in, gboolean show_debug)
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
344 {
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
345 dns_params_t dns_params;
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
346 const size_t zero = 0;
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
347 int rc;
13426
032ea2c9ce2d [gaim-migrate @ 15800]
Daniel Atallah <datallah@pidgin.im>
parents: 13405
diff changeset
348 #ifdef HAVE_GETADDRINFO
10711
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
349 struct addrinfo hints, *res, *tmp;
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
350 char servname[20];
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
351 #else
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
352 struct sockaddr_in sin;
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
353 const size_t addrlen = sizeof(sin);
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
354 #endif
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
355
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
356 #ifdef HAVE_SIGNAL_H
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
357 signal(SIGHUP, SIG_DFL);
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
358 signal(SIGINT, SIG_DFL);
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
359 signal(SIGQUIT, SIG_DFL);
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
360 signal(SIGCHLD, SIG_DFL);
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
361 signal(SIGTERM, SIG_DFL);
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
362 signal(SIGTRAP, trap_gdb_bug);
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
363 #endif
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
364
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
365 /*
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
366 * We resolve 1 host name for each iteration of this
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
367 * while loop.
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
368 *
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
369 * The top half of this reads in the hostname and port
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
370 * number from the socket with our parent. The bottom
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
371 * half of this resolves the IP (blocking) and sends
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
372 * the result back to our parent, when finished.
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
373 */
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
374 while (1) {
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
375 const char ch = 'Y';
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
376 fd_set fds;
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
377 struct timeval tv = { .tv_sec = 40 , .tv_usec = 0 };
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
378 FD_ZERO(&fds);
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
379 FD_SET(child_in, &fds);
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
380 rc = select(child_in + 1, &fds, NULL, NULL, &tv);
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
381 if (!rc) {
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
382 if (show_debug)
13800
1ea3bfd84fe8 [gaim-migrate @ 16210]
Richard Laager <rlaager@pidgin.im>
parents: 13788
diff changeset
383 printf("dns[%d]: nobody needs me... =(\n", getpid());
10711
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
384 break;
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
385 }
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
386 rc = read(child_in, &dns_params, sizeof(dns_params_t));
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
387 if (rc < 0) {
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
388 perror("read()");
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
389 break;
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
390 }
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
391 if (rc == 0) {
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
392 if (show_debug)
13800
1ea3bfd84fe8 [gaim-migrate @ 16210]
Richard Laager <rlaager@pidgin.im>
parents: 13788
diff changeset
393 printf("dns[%d]: Oops, father has gone, wait for me, wait...!\n", getpid());
10711
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
394 _exit(0);
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
395 }
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
396 if (dns_params.hostname[0] == '\0') {
13800
1ea3bfd84fe8 [gaim-migrate @ 16210]
Richard Laager <rlaager@pidgin.im>
parents: 13788
diff changeset
397 printf("dns[%d]: hostname = \"\" (port = %d)!!!\n", getpid(), dns_params.port);
10711
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
398 _exit(1);
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
399 }
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
400 /* Tell our parent that we read the data successfully */
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
401 write(child_out, &ch, sizeof(ch));
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
402
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
403 /* We have the hostname and port, now resolve the IP */
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
404
13426
032ea2c9ce2d [gaim-migrate @ 15800]
Daniel Atallah <datallah@pidgin.im>
parents: 13405
diff changeset
405 #ifdef HAVE_GETADDRINFO
10711
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
406 g_snprintf(servname, sizeof(servname), "%d", dns_params.port);
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
407 memset(&hints, 0, sizeof(hints));
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
408
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
409 /* This is only used to convert a service
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
410 * name to a port number. As we know we are
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
411 * passing a number already, we know this
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
412 * value will not be really used by the C
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
413 * library.
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
414 */
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
415 hints.ai_socktype = SOCK_STREAM;
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
416 rc = getaddrinfo(dns_params.hostname, servname, &hints, &res);
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
417 write(child_out, &rc, sizeof(rc));
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
418 if (rc != 0) {
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
419 close(child_out);
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
420 if (show_debug)
13800
1ea3bfd84fe8 [gaim-migrate @ 16210]
Richard Laager <rlaager@pidgin.im>
parents: 13788
diff changeset
421 printf("dns[%d] Error: getaddrinfo returned %d\n",
10711
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
422 getpid(), rc);
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
423 dns_params.hostname[0] = '\0';
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
424 continue;
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
425 }
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
426 tmp = res;
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
427 while (res) {
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
428 size_t ai_addrlen = res->ai_addrlen;
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
429 write(child_out, &ai_addrlen, sizeof(ai_addrlen));
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
430 write(child_out, res->ai_addr, res->ai_addrlen);
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
431 res = res->ai_next;
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
432 }
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
433 freeaddrinfo(tmp);
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
434 write(child_out, &zero, sizeof(zero));
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
435 #else
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
436 if (!inet_aton(dns_params.hostname, &sin.sin_addr)) {
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
437 struct hostent *hp;
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
438 if (!(hp = gethostbyname(dns_params.hostname))) {
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
439 write(child_out, &h_errno, sizeof(int));
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
440 close(child_out);
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
441 if (show_debug)
13800
1ea3bfd84fe8 [gaim-migrate @ 16210]
Richard Laager <rlaager@pidgin.im>
parents: 13788
diff changeset
442 printf("DNS Error: %d\n", h_errno);
10711
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
443 _exit(0);
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
444 }
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
445 memset(&sin, 0, sizeof(struct sockaddr_in));
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
446 memcpy(&sin.sin_addr.s_addr, hp->h_addr, hp->h_length);
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
447 sin.sin_family = hp->h_addrtype;
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
448 } else
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
449 sin.sin_family = AF_INET;
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
450
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
451 sin.sin_port = htons(dns_params.port);
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
452 write(child_out, &addrlen, sizeof(addrlen));
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
453 write(child_out, &sin, addrlen);
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
454 write(child_out, &zero, sizeof(zero));
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
455 #endif
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
456 dns_params.hostname[0] = '\0';
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
457 }
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
458
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
459 close(child_out);
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
460 close(child_in);
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
461
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
462 _exit(0);
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
463 }
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
464
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
465 static pending_dns_request_t *
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
466 gaim_dns_new_resolverthread(gboolean show_debug)
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
467 {
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
468 pending_dns_request_t *req;
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
469 int child_out[2], child_in[2];
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
470
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
471 /* Create pipes for communicating with the child process */
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
472 if (pipe(child_out) || pipe(child_in)) {
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
473 gaim_debug_error("dns",
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
474 "Could not create pipes: %s\n", strerror(errno));
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
475 return NULL;
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
476 }
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
477
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
478 req = g_new(pending_dns_request_t, 1);
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
479
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
480 cope_with_gdb_brokenness();
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
481
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
482 /* Fork! */
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
483 req->dns_pid = fork();
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
484
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
485 /* If we are the child process... */
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
486 if (req->dns_pid == 0) {
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
487 /* We should not access the parent's side of the pipes, so close them */
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
488 close(child_out[0]);
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
489 close(child_in[1]);
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
490
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
491 gaim_dns_resolverthread(child_out[1], child_in[0], show_debug);
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
492 /* The thread calls _exit() rather than returning, so we never get here */
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
493 }
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
494
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
495 /* We should not access the child's side of the pipes, so close them */
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
496 close(child_out[1]);
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
497 close(child_in[0]);
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
498 if (req->dns_pid == -1) {
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
499 gaim_debug_error("dns",
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
500 "Could not create child process for DNS: %s\n",
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
501 strerror(errno));
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
502 g_free(req);
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
503 return NULL;
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
504 }
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
505
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
506 req->fd_out = child_out[0];
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
507 req->fd_in = child_in[1];
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
508 number_of_dns_children++;
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
509 gaim_debug_info("dns",
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
510 "Created new DNS child %d, there are now %d children.\n",
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
511 req->dns_pid, number_of_dns_children);
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
512
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
513 return req;
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
514 }
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
515 /*
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
516 * End the DNS resolver child process functions.
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
517 */
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
518
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
519 /*
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
520 * Begin the functions for dealing with the DNS child processes.
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
521 */
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
522 static void
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
523 req_free(pending_dns_request_t *req)
4434
f7b710c1804f [gaim-migrate @ 4709]
Nathan Walp <nwalp@pidgin.im>
parents: 4394
diff changeset
524 {
f7b710c1804f [gaim-migrate @ 4709]
Nathan Walp <nwalp@pidgin.im>
parents: 4394
diff changeset
525 g_return_if_fail(req != NULL);
10707
c8951a5dea41 [gaim-migrate @ 12296]
Mark Doliner <markdoliner@pidgin.im>
parents: 10706
diff changeset
526
4434
f7b710c1804f [gaim-migrate @ 4709]
Nathan Walp <nwalp@pidgin.im>
parents: 4394
diff changeset
527 close(req->fd_in);
f7b710c1804f [gaim-migrate @ 4709]
Nathan Walp <nwalp@pidgin.im>
parents: 4394
diff changeset
528 close(req->fd_out);
10707
c8951a5dea41 [gaim-migrate @ 12296]
Mark Doliner <markdoliner@pidgin.im>
parents: 10706
diff changeset
529
c8951a5dea41 [gaim-migrate @ 12296]
Mark Doliner <markdoliner@pidgin.im>
parents: 10706
diff changeset
530 g_free(req->host);
4434
f7b710c1804f [gaim-migrate @ 4709]
Nathan Walp <nwalp@pidgin.im>
parents: 4394
diff changeset
531 g_free(req);
10707
c8951a5dea41 [gaim-migrate @ 12296]
Mark Doliner <markdoliner@pidgin.im>
parents: 10706
diff changeset
532
4434
f7b710c1804f [gaim-migrate @ 4709]
Nathan Walp <nwalp@pidgin.im>
parents: 4394
diff changeset
533 number_of_dns_children--;
f7b710c1804f [gaim-migrate @ 4709]
Nathan Walp <nwalp@pidgin.im>
parents: 4394
diff changeset
534 }
f7b710c1804f [gaim-migrate @ 4709]
Nathan Walp <nwalp@pidgin.im>
parents: 4394
diff changeset
535
10711
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
536 static int
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
537 send_dns_request_to_child(pending_dns_request_t *req, dns_params_t *dns_params)
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
538 {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
539 char ch;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
540 int rc;
13531
ba11a1070b76 [gaim-migrate @ 15907]
Julien Bossart
parents: 13515
diff changeset
541 pid_t pid;
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
542
13531
ba11a1070b76 [gaim-migrate @ 15907]
Julien Bossart
parents: 13515
diff changeset
543 /* This waitpid might return the child's PID if it has recently
ba11a1070b76 [gaim-migrate @ 15907]
Julien Bossart
parents: 13515
diff changeset
544 * exited, or it might return an error if it exited "long
ba11a1070b76 [gaim-migrate @ 15907]
Julien Bossart
parents: 13515
diff changeset
545 * enough" ago that it has already been reaped; in either
ba11a1070b76 [gaim-migrate @ 15907]
Julien Bossart
parents: 13515
diff changeset
546 * instance, we can't use it. */
ba11a1070b76 [gaim-migrate @ 15907]
Julien Bossart
parents: 13515
diff changeset
547 if ((pid = waitpid (req->dns_pid, NULL, WNOHANG)) > 0) {
10309
073906008cb2 [gaim-migrate @ 11501]
Mark Doliner <markdoliner@pidgin.im>
parents: 10307
diff changeset
548 gaim_debug_warning("dns",
5218
b19d74418232 [gaim-migrate @ 5588]
Christian Hammond <chipx86@chipx86.com>
parents: 5211
diff changeset
549 "DNS child %d no longer exists\n", req->dns_pid);
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
550 return -1;
13531
ba11a1070b76 [gaim-migrate @ 15907]
Julien Bossart
parents: 13515
diff changeset
551 } else if (pid < 0) {
ba11a1070b76 [gaim-migrate @ 15907]
Julien Bossart
parents: 13515
diff changeset
552 gaim_debug_warning("dns",
ba11a1070b76 [gaim-migrate @ 15907]
Julien Bossart
parents: 13515
diff changeset
553 "Wait for DNS child %d failed: %s\n",
ba11a1070b76 [gaim-migrate @ 15907]
Julien Bossart
parents: 13515
diff changeset
554 req->dns_pid, strerror(errno));
ba11a1070b76 [gaim-migrate @ 15907]
Julien Bossart
parents: 13515
diff changeset
555 return -1;
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
556 }
9129
9510867e614f [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
557
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
558 /* Let's contact this lost child! */
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
559 rc = write(req->fd_in, dns_params, sizeof(*dns_params));
10707
c8951a5dea41 [gaim-migrate @ 12296]
Mark Doliner <markdoliner@pidgin.im>
parents: 10706
diff changeset
560 if (rc < 0) {
10309
073906008cb2 [gaim-migrate @ 11501]
Mark Doliner <markdoliner@pidgin.im>
parents: 10307
diff changeset
561 gaim_debug_error("dns",
5211
94d9756c381f [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
562 "Unable to write to DNS child %d: %d\n",
94d9756c381f [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
563 req->dns_pid, strerror(errno));
4434
f7b710c1804f [gaim-migrate @ 4709]
Nathan Walp <nwalp@pidgin.im>
parents: 4394
diff changeset
564 close(req->fd_in);
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
565 return -1;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
566 }
9129
9510867e614f [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
567
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
568 g_return_val_if_fail(rc == sizeof(*dns_params), -1);
9129
9510867e614f [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
569
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
570 /* Did you hear me? (This avoids some race conditions) */
10707
c8951a5dea41 [gaim-migrate @ 12296]
Mark Doliner <markdoliner@pidgin.im>
parents: 10706
diff changeset
571 rc = read(req->fd_out, &ch, sizeof(ch));
c8951a5dea41 [gaim-migrate @ 12296]
Mark Doliner <markdoliner@pidgin.im>
parents: 10706
diff changeset
572 if (rc != 1 || ch != 'Y')
c8951a5dea41 [gaim-migrate @ 12296]
Mark Doliner <markdoliner@pidgin.im>
parents: 10706
diff changeset
573 {
10309
073906008cb2 [gaim-migrate @ 11501]
Mark Doliner <markdoliner@pidgin.im>
parents: 10307
diff changeset
574 gaim_debug_warning("dns",
5211
94d9756c381f [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
575 "DNS child %d not responding. Killing it!\n",
94d9756c381f [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
576 req->dns_pid);
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
577 kill(req->dns_pid, SIGKILL);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
578 return -1;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
579 }
9655
7cfd0424ec23 [gaim-migrate @ 10503]
Luke Schierer <lschiere@pidgin.im>
parents: 9653
diff changeset
580
10309
073906008cb2 [gaim-migrate @ 11501]
Mark Doliner <markdoliner@pidgin.im>
parents: 10307
diff changeset
581 gaim_debug_info("dns",
5211
94d9756c381f [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
582 "Successfully sent DNS request to child %d\n", req->dns_pid);
10707
c8951a5dea41 [gaim-migrate @ 12296]
Mark Doliner <markdoliner@pidgin.im>
parents: 10706
diff changeset
583
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
584 return 0;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
585 }
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
586
10711
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
587 static void
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
588 host_resolved(gpointer data, gint source, GaimInputCondition cond);
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
589
10711
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
590 static void
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
591 release_dns_child(pending_dns_request_t *req)
2911
b20669ca1281 [gaim-migrate @ 2924]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2907
diff changeset
592 {
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
593 g_free(req->host);
10707
c8951a5dea41 [gaim-migrate @ 12296]
Mark Doliner <markdoliner@pidgin.im>
parents: 10706
diff changeset
594 req->host = NULL;
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
595
10707
c8951a5dea41 [gaim-migrate @ 12296]
Mark Doliner <markdoliner@pidgin.im>
parents: 10706
diff changeset
596 if (queued_requests && !g_queue_is_empty(queued_requests)) {
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
597 queued_dns_request_t *r = g_queue_pop_head(queued_requests);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
598 req->host = g_strdup(r->params.hostname);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
599 req->port = r->params.port;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
600 req->callback = r->callback;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
601 req->data = r->data;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
602
10309
073906008cb2 [gaim-migrate @ 11501]
Mark Doliner <markdoliner@pidgin.im>
parents: 10307
diff changeset
603 gaim_debug_info("dns",
5211
94d9756c381f [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
604 "Processing queued DNS query for '%s' with child %d\n",
94d9756c381f [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
605 req->host, req->dns_pid);
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
606
10707
c8951a5dea41 [gaim-migrate @ 12296]
Mark Doliner <markdoliner@pidgin.im>
parents: 10706
diff changeset
607 if (send_dns_request_to_child(req, &(r->params)) != 0) {
4434
f7b710c1804f [gaim-migrate @ 4709]
Nathan Walp <nwalp@pidgin.im>
parents: 4394
diff changeset
608 req_free(req);
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
609 req = NULL;
5211
94d9756c381f [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
610
10309
073906008cb2 [gaim-migrate @ 11501]
Mark Doliner <markdoliner@pidgin.im>
parents: 10307
diff changeset
611 gaim_debug_warning("dns",
5211
94d9756c381f [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
612 "Intent of process queued query of '%s' failed, "
94d9756c381f [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
613 "requeueing...\n", r->params.hostname);
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
614 g_queue_push_head(queued_requests, r);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
615 } else {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
616 req->inpa = gaim_input_add(req->fd_out, GAIM_INPUT_READ, host_resolved, req);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
617 g_free(r);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
618 }
9655
7cfd0424ec23 [gaim-migrate @ 10503]
Luke Schierer <lschiere@pidgin.im>
parents: 9653
diff changeset
619
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
620 } else {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
621 req->host = NULL;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
622 req->callback = NULL;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
623 req->data = NULL;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
624 free_dns_children = g_slist_append(free_dns_children, req);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
625 }
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
626 }
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
627
10711
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
628 static void
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
629 host_resolved(gpointer data, gint source, GaimInputCondition cond)
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
630 {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
631 pending_dns_request_t *req = (pending_dns_request_t*)data;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
632 int rc, err;
4678
4fe99bee3ecc [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
633 GSList *hosts = NULL;
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
634 struct sockaddr *addr = NULL;
8436
9acf659a9338 [gaim-migrate @ 9166]
jarady
parents: 8273
diff changeset
635 size_t addrlen;
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
636
13023
6c85f34839bf [gaim-migrate @ 15376]
Mark Doliner <markdoliner@pidgin.im>
parents: 12991
diff changeset
637 gaim_debug_info("dns", "Got response for '%s'\n", req->host);
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
638 gaim_input_remove(req->inpa);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
639
10707
c8951a5dea41 [gaim-migrate @ 12296]
Mark Doliner <markdoliner@pidgin.im>
parents: 10706
diff changeset
640 rc = read(req->fd_out, &err, sizeof(err));
c8951a5dea41 [gaim-migrate @ 12296]
Mark Doliner <markdoliner@pidgin.im>
parents: 10706
diff changeset
641 if ((rc == 4) && (err != 0))
c8951a5dea41 [gaim-migrate @ 12296]
Mark Doliner <markdoliner@pidgin.im>
parents: 10706
diff changeset
642 {
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
643 char message[1024];
13426
032ea2c9ce2d [gaim-migrate @ 15800]
Daniel Atallah <datallah@pidgin.im>
parents: 13405
diff changeset
644 #ifdef HAVE_GETADDRINFO
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
645 g_snprintf(message, sizeof(message), "DNS error: %s (pid=%d)",
8977
74162f1be34a [gaim-migrate @ 9751]
Mark Doliner <markdoliner@pidgin.im>
parents: 8917
diff changeset
646 gai_strerror(err), req->dns_pid);
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
647 #else
8977
74162f1be34a [gaim-migrate @ 9751]
Mark Doliner <markdoliner@pidgin.im>
parents: 8917
diff changeset
648 g_snprintf(message, sizeof(message), "DNS error: %d (pid=%d)",
74162f1be34a [gaim-migrate @ 9751]
Mark Doliner <markdoliner@pidgin.im>
parents: 8917
diff changeset
649 err, req->dns_pid);
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
650 #endif
10309
073906008cb2 [gaim-migrate @ 11501]
Mark Doliner <markdoliner@pidgin.im>
parents: 10307
diff changeset
651 gaim_debug_error("dns", "%s\n", message);
4678
4fe99bee3ecc [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
652 req->callback(NULL, req->data, message);
4fe99bee3ecc [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
653 release_dns_child(req);
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
654 return;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
655 }
10707
c8951a5dea41 [gaim-migrate @ 12296]
Mark Doliner <markdoliner@pidgin.im>
parents: 10706
diff changeset
656 if (rc > 0)
c8951a5dea41 [gaim-migrate @ 12296]
Mark Doliner <markdoliner@pidgin.im>
parents: 10706
diff changeset
657 {
c8951a5dea41 [gaim-migrate @ 12296]
Mark Doliner <markdoliner@pidgin.im>
parents: 10706
diff changeset
658 while (rc > 0) {
c8951a5dea41 [gaim-migrate @ 12296]
Mark Doliner <markdoliner@pidgin.im>
parents: 10706
diff changeset
659 rc = read(req->fd_out, &addrlen, sizeof(addrlen));
c8951a5dea41 [gaim-migrate @ 12296]
Mark Doliner <markdoliner@pidgin.im>
parents: 10706
diff changeset
660 if (rc > 0 && addrlen > 0) {
c8951a5dea41 [gaim-migrate @ 12296]
Mark Doliner <markdoliner@pidgin.im>
parents: 10706
diff changeset
661 addr = g_malloc(addrlen);
c8951a5dea41 [gaim-migrate @ 12296]
Mark Doliner <markdoliner@pidgin.im>
parents: 10706
diff changeset
662 rc = read(req->fd_out, addr, addrlen);
4678
4fe99bee3ecc [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
663 hosts = g_slist_append(hosts, GINT_TO_POINTER(addrlen));
4fe99bee3ecc [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
664 hosts = g_slist_append(hosts, addr);
4fe99bee3ecc [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
665 } else {
4fe99bee3ecc [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
666 break;
4fe99bee3ecc [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
667 }
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
668 }
10707
c8951a5dea41 [gaim-migrate @ 12296]
Mark Doliner <markdoliner@pidgin.im>
parents: 10706
diff changeset
669 } else if (rc == -1) {
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
670 char message[1024];
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
671 g_snprintf(message, sizeof(message), "Error reading from DNS child: %s",strerror(errno));
10309
073906008cb2 [gaim-migrate @ 11501]
Mark Doliner <markdoliner@pidgin.im>
parents: 10307
diff changeset
672 gaim_debug_error("dns", "%s\n", message);
4678
4fe99bee3ecc [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
673 req->callback(NULL, req->data, message);
4434
f7b710c1804f [gaim-migrate @ 4709]
Nathan Walp <nwalp@pidgin.im>
parents: 4394
diff changeset
674 req_free(req);
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
675 return;
10707
c8951a5dea41 [gaim-migrate @ 12296]
Mark Doliner <markdoliner@pidgin.im>
parents: 10706
diff changeset
676 } else if (rc == 0) {
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
677 char message[1024];
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
678 g_snprintf(message, sizeof(message), "EOF reading from DNS child");
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
679 close(req->fd_out);
10309
073906008cb2 [gaim-migrate @ 11501]
Mark Doliner <markdoliner@pidgin.im>
parents: 10307
diff changeset
680 gaim_debug_error("dns", "%s\n", message);
4678
4fe99bee3ecc [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
681 req->callback(NULL, req->data, message);
4434
f7b710c1804f [gaim-migrate @ 4709]
Nathan Walp <nwalp@pidgin.im>
parents: 4394
diff changeset
682 req_free(req);
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
683 return;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
684 }
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
685
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
686 /* wait4(req->dns_pid, NULL, WNOHANG, NULL); */
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
687
4678
4fe99bee3ecc [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
688 req->callback(hosts, req->data, NULL);
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
689
4678
4fe99bee3ecc [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
690 release_dns_child(req);
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
691 }
10711
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
692 /*
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
693 * End the functions for dealing with the DNS child processes.
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
694 */
9657
aef0dc1d354d [gaim-migrate @ 10505]
Mark Doliner <markdoliner@pidgin.im>
parents: 9656
diff changeset
695
10711
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
696 int
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
697 gaim_gethostbyname_async(const char *hostname, int port, dns_callback_t callback, gpointer data)
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
698 {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
699 pending_dns_request_t *req = NULL;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
700 dns_params_t dns_params;
9656
17f7a689012e [gaim-migrate @ 10504]
Mark Doliner <markdoliner@pidgin.im>
parents: 9655
diff changeset
701 gchar *host_temp;
10307
f3ba80364053 [gaim-migrate @ 11497]
Mark Doliner <markdoliner@pidgin.im>
parents: 10305
diff changeset
702 gboolean show_debug;
f3ba80364053 [gaim-migrate @ 11497]
Mark Doliner <markdoliner@pidgin.im>
parents: 10305
diff changeset
703
f3ba80364053 [gaim-migrate @ 11497]
Mark Doliner <markdoliner@pidgin.im>
parents: 10305
diff changeset
704 show_debug = gaim_debug_is_enabled();
9655
7cfd0424ec23 [gaim-migrate @ 10503]
Luke Schierer <lschiere@pidgin.im>
parents: 9653
diff changeset
705
9656
17f7a689012e [gaim-migrate @ 10504]
Mark Doliner <markdoliner@pidgin.im>
parents: 9655
diff changeset
706 host_temp = g_strstrip(g_strdup(hostname));
17f7a689012e [gaim-migrate @ 10504]
Mark Doliner <markdoliner@pidgin.im>
parents: 9655
diff changeset
707 strncpy(dns_params.hostname, host_temp, sizeof(dns_params.hostname) - 1);
9655
7cfd0424ec23 [gaim-migrate @ 10503]
Luke Schierer <lschiere@pidgin.im>
parents: 9653
diff changeset
708 g_free(host_temp);
9656
17f7a689012e [gaim-migrate @ 10504]
Mark Doliner <markdoliner@pidgin.im>
parents: 9655
diff changeset
709 dns_params.hostname[sizeof(dns_params.hostname) - 1] = '\0';
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
710 dns_params.port = port;
9129
9510867e614f [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
711
9656
17f7a689012e [gaim-migrate @ 10504]
Mark Doliner <markdoliner@pidgin.im>
parents: 9655
diff changeset
712 /*
17f7a689012e [gaim-migrate @ 10504]
Mark Doliner <markdoliner@pidgin.im>
parents: 9655
diff changeset
713 * If we have any children, attempt to have them perform the DNS
17f7a689012e [gaim-migrate @ 10504]
Mark Doliner <markdoliner@pidgin.im>
parents: 9655
diff changeset
714 * query. If we're able to send the query to a child, then req
17f7a689012e [gaim-migrate @ 10504]
Mark Doliner <markdoliner@pidgin.im>
parents: 9655
diff changeset
715 * will be set to the pending_dns_request_t. Otherwise, req will
17f7a689012e [gaim-migrate @ 10504]
Mark Doliner <markdoliner@pidgin.im>
parents: 9655
diff changeset
716 * be NULL and we'll need to create a new DNS request child.
17f7a689012e [gaim-migrate @ 10504]
Mark Doliner <markdoliner@pidgin.im>
parents: 9655
diff changeset
717 */
17f7a689012e [gaim-migrate @ 10504]
Mark Doliner <markdoliner@pidgin.im>
parents: 9655
diff changeset
718 while (free_dns_children != NULL) {
17f7a689012e [gaim-migrate @ 10504]
Mark Doliner <markdoliner@pidgin.im>
parents: 9655
diff changeset
719 req = free_dns_children->data;
17f7a689012e [gaim-migrate @ 10504]
Mark Doliner <markdoliner@pidgin.im>
parents: 9655
diff changeset
720 free_dns_children = g_slist_remove(free_dns_children, req);
9129
9510867e614f [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
721
9656
17f7a689012e [gaim-migrate @ 10504]
Mark Doliner <markdoliner@pidgin.im>
parents: 9655
diff changeset
722 if (send_dns_request_to_child(req, &dns_params) == 0)
17f7a689012e [gaim-migrate @ 10504]
Mark Doliner <markdoliner@pidgin.im>
parents: 9655
diff changeset
723 /* We found an acceptable child, yay */
17f7a689012e [gaim-migrate @ 10504]
Mark Doliner <markdoliner@pidgin.im>
parents: 9655
diff changeset
724 break;
9129
9510867e614f [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
725
9656
17f7a689012e [gaim-migrate @ 10504]
Mark Doliner <markdoliner@pidgin.im>
parents: 9655
diff changeset
726 req_free(req);
9657
aef0dc1d354d [gaim-migrate @ 10505]
Mark Doliner <markdoliner@pidgin.im>
parents: 9656
diff changeset
727 req = NULL;
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
728 }
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
729
9657
aef0dc1d354d [gaim-migrate @ 10505]
Mark Doliner <markdoliner@pidgin.im>
parents: 9656
diff changeset
730 /* We need to create a new DNS request child */
9656
17f7a689012e [gaim-migrate @ 10504]
Mark Doliner <markdoliner@pidgin.im>
parents: 9655
diff changeset
731 if (req == NULL) {
17f7a689012e [gaim-migrate @ 10504]
Mark Doliner <markdoliner@pidgin.im>
parents: 9655
diff changeset
732 if (number_of_dns_children >= MAX_DNS_CHILDREN) {
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
733 queued_dns_request_t *r = g_new(queued_dns_request_t, 1);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
734 memcpy(&(r->params), &dns_params, sizeof(dns_params));
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
735 r->callback = callback;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
736 r->data = data;
9656
17f7a689012e [gaim-migrate @ 10504]
Mark Doliner <markdoliner@pidgin.im>
parents: 9655
diff changeset
737 if (!queued_requests)
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
738 queued_requests = g_queue_new();
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
739 g_queue_push_tail(queued_requests, r);
5211
94d9756c381f [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
740
10309
073906008cb2 [gaim-migrate @ 11501]
Mark Doliner <markdoliner@pidgin.im>
parents: 10307
diff changeset
741 gaim_debug_info("dns",
9656
17f7a689012e [gaim-migrate @ 10504]
Mark Doliner <markdoliner@pidgin.im>
parents: 9655
diff changeset
742 "DNS query for '%s' queued\n", dns_params.hostname);
5211
94d9756c381f [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
743
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
744 return 0;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
745 }
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
746
10711
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
747 req = gaim_dns_new_resolverthread(show_debug);
12977
df1a0ac6266a [gaim-migrate @ 15330]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 12816
diff changeset
748 if (req == NULL)
df1a0ac6266a [gaim-migrate @ 15330]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 12816
diff changeset
749 {
df1a0ac6266a [gaim-migrate @ 15330]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 12816
diff changeset
750 gaim_debug_error("proxy", "oh dear, this is going to explode, I give up\n");
df1a0ac6266a [gaim-migrate @ 15330]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 12816
diff changeset
751 return -1;
df1a0ac6266a [gaim-migrate @ 15330]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 12816
diff changeset
752 }
10711
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
753 send_dns_request_to_child(req, &dns_params);
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
754 }
9656
17f7a689012e [gaim-migrate @ 10504]
Mark Doliner <markdoliner@pidgin.im>
parents: 9655
diff changeset
755
9657
aef0dc1d354d [gaim-migrate @ 10505]
Mark Doliner <markdoliner@pidgin.im>
parents: 9656
diff changeset
756 req->host = g_strdup(hostname);
9656
17f7a689012e [gaim-migrate @ 10504]
Mark Doliner <markdoliner@pidgin.im>
parents: 9655
diff changeset
757 req->port = port;
17f7a689012e [gaim-migrate @ 10504]
Mark Doliner <markdoliner@pidgin.im>
parents: 9655
diff changeset
758 req->callback = callback;
17f7a689012e [gaim-migrate @ 10504]
Mark Doliner <markdoliner@pidgin.im>
parents: 9655
diff changeset
759 req->data = data;
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
760 req->inpa = gaim_input_add(req->fd_out, GAIM_INPUT_READ, host_resolved, req);
9656
17f7a689012e [gaim-migrate @ 10504]
Mark Doliner <markdoliner@pidgin.im>
parents: 9655
diff changeset
761
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
762 return 0;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
763 }
10237
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
764
13649
b156749bec5b [gaim-migrate @ 16049]
Evan Schoenberg <evands@pidgin.im>
parents: 13531
diff changeset
765 #elif defined _WIN32 /* end __unix__ || __APPLE__ */
10237
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
766
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
767 typedef struct _dns_tdata {
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
768 char *hostname;
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
769 int port;
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
770 dns_callback_t callback;
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
771 gpointer data;
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
772 GSList *hosts;
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
773 char *errmsg;
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
774 } dns_tdata;
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
775
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
776 static gboolean dns_main_thread_cb(gpointer data) {
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
777 dns_tdata *td = (dns_tdata*)data;
10562
000641c00f7d [gaim-migrate @ 11942]
Daniel Atallah <datallah@pidgin.im>
parents: 10561
diff changeset
778 if (td->errmsg != NULL) {
000641c00f7d [gaim-migrate @ 11942]
Daniel Atallah <datallah@pidgin.im>
parents: 10561
diff changeset
779 gaim_debug_info("dns", "%s\n", td->errmsg);
000641c00f7d [gaim-migrate @ 11942]
Daniel Atallah <datallah@pidgin.im>
parents: 10561
diff changeset
780 }
10237
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
781 td->callback(td->hosts, td->data, td->errmsg);
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
782 g_free(td->hostname);
10562
000641c00f7d [gaim-migrate @ 11942]
Daniel Atallah <datallah@pidgin.im>
parents: 10561
diff changeset
783 g_free(td->errmsg);
10237
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
784 g_free(td);
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
785 return FALSE;
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
786 }
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
787
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
788 static gpointer dns_thread(gpointer data) {
10619
07ef9839d751 [gaim-migrate @ 12086]
Daniel Atallah <datallah@pidgin.im>
parents: 10613
diff changeset
789
13426
032ea2c9ce2d [gaim-migrate @ 15800]
Daniel Atallah <datallah@pidgin.im>
parents: 13405
diff changeset
790 #ifdef HAVE_GETADDRINFO
10619
07ef9839d751 [gaim-migrate @ 12086]
Daniel Atallah <datallah@pidgin.im>
parents: 10613
diff changeset
791 int rc;
07ef9839d751 [gaim-migrate @ 12086]
Daniel Atallah <datallah@pidgin.im>
parents: 10613
diff changeset
792 struct addrinfo hints, *res, *tmp;
07ef9839d751 [gaim-migrate @ 12086]
Daniel Atallah <datallah@pidgin.im>
parents: 10613
diff changeset
793 char servname[20];
07ef9839d751 [gaim-migrate @ 12086]
Daniel Atallah <datallah@pidgin.im>
parents: 10613
diff changeset
794 #else
10237
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
795 struct sockaddr_in sin;
10619
07ef9839d751 [gaim-migrate @ 12086]
Daniel Atallah <datallah@pidgin.im>
parents: 10613
diff changeset
796 struct hostent *hp;
07ef9839d751 [gaim-migrate @ 12086]
Daniel Atallah <datallah@pidgin.im>
parents: 10613
diff changeset
797 #endif
10237
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
798 dns_tdata *td = (dns_tdata*)data;
10619
07ef9839d751 [gaim-migrate @ 12086]
Daniel Atallah <datallah@pidgin.im>
parents: 10613
diff changeset
799
13426
032ea2c9ce2d [gaim-migrate @ 15800]
Daniel Atallah <datallah@pidgin.im>
parents: 13405
diff changeset
800 #ifdef HAVE_GETADDRINFO
10619
07ef9839d751 [gaim-migrate @ 12086]
Daniel Atallah <datallah@pidgin.im>
parents: 10613
diff changeset
801 g_snprintf(servname, sizeof(servname), "%d", td->port);
07ef9839d751 [gaim-migrate @ 12086]
Daniel Atallah <datallah@pidgin.im>
parents: 10613
diff changeset
802 memset(&hints,0,sizeof(hints));
10237
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
803
10619
07ef9839d751 [gaim-migrate @ 12086]
Daniel Atallah <datallah@pidgin.im>
parents: 10613
diff changeset
804 /* This is only used to convert a service
07ef9839d751 [gaim-migrate @ 12086]
Daniel Atallah <datallah@pidgin.im>
parents: 10613
diff changeset
805 * name to a port number. As we know we are
07ef9839d751 [gaim-migrate @ 12086]
Daniel Atallah <datallah@pidgin.im>
parents: 10613
diff changeset
806 * passing a number already, we know this
07ef9839d751 [gaim-migrate @ 12086]
Daniel Atallah <datallah@pidgin.im>
parents: 10613
diff changeset
807 * value will not be really used by the C
07ef9839d751 [gaim-migrate @ 12086]
Daniel Atallah <datallah@pidgin.im>
parents: 10613
diff changeset
808 * library.
07ef9839d751 [gaim-migrate @ 12086]
Daniel Atallah <datallah@pidgin.im>
parents: 10613
diff changeset
809 */
07ef9839d751 [gaim-migrate @ 12086]
Daniel Atallah <datallah@pidgin.im>
parents: 10613
diff changeset
810 hints.ai_socktype = SOCK_STREAM;
07ef9839d751 [gaim-migrate @ 12086]
Daniel Atallah <datallah@pidgin.im>
parents: 10613
diff changeset
811 if ((rc = getaddrinfo(td->hostname, servname, &hints, &res)) == 0) {
07ef9839d751 [gaim-migrate @ 12086]
Daniel Atallah <datallah@pidgin.im>
parents: 10613
diff changeset
812 tmp = res;
07ef9839d751 [gaim-migrate @ 12086]
Daniel Atallah <datallah@pidgin.im>
parents: 10613
diff changeset
813 while(res) {
07ef9839d751 [gaim-migrate @ 12086]
Daniel Atallah <datallah@pidgin.im>
parents: 10613
diff changeset
814 td->hosts = g_slist_append(td->hosts,
07ef9839d751 [gaim-migrate @ 12086]
Daniel Atallah <datallah@pidgin.im>
parents: 10613
diff changeset
815 GSIZE_TO_POINTER(res->ai_addrlen));
07ef9839d751 [gaim-migrate @ 12086]
Daniel Atallah <datallah@pidgin.im>
parents: 10613
diff changeset
816 td->hosts = g_slist_append(td->hosts,
07ef9839d751 [gaim-migrate @ 12086]
Daniel Atallah <datallah@pidgin.im>
parents: 10613
diff changeset
817 g_memdup(res->ai_addr, res->ai_addrlen));
07ef9839d751 [gaim-migrate @ 12086]
Daniel Atallah <datallah@pidgin.im>
parents: 10613
diff changeset
818 res = res->ai_next;
07ef9839d751 [gaim-migrate @ 12086]
Daniel Atallah <datallah@pidgin.im>
parents: 10613
diff changeset
819 }
07ef9839d751 [gaim-migrate @ 12086]
Daniel Atallah <datallah@pidgin.im>
parents: 10613
diff changeset
820 freeaddrinfo(tmp);
07ef9839d751 [gaim-migrate @ 12086]
Daniel Atallah <datallah@pidgin.im>
parents: 10613
diff changeset
821 } else {
07ef9839d751 [gaim-migrate @ 12086]
Daniel Atallah <datallah@pidgin.im>
parents: 10613
diff changeset
822 td->errmsg = g_strdup_printf("DNS getaddrinfo(\"%s\", \"%s\") error: %d", td->hostname, servname, rc);
07ef9839d751 [gaim-migrate @ 12086]
Daniel Atallah <datallah@pidgin.im>
parents: 10613
diff changeset
823 }
07ef9839d751 [gaim-migrate @ 12086]
Daniel Atallah <datallah@pidgin.im>
parents: 10613
diff changeset
824 #else
10562
000641c00f7d [gaim-migrate @ 11942]
Daniel Atallah <datallah@pidgin.im>
parents: 10561
diff changeset
825 if ((hp = gethostbyname(td->hostname))) {
000641c00f7d [gaim-migrate @ 11942]
Daniel Atallah <datallah@pidgin.im>
parents: 10561
diff changeset
826 memset(&sin, 0, sizeof(struct sockaddr_in));
000641c00f7d [gaim-migrate @ 11942]
Daniel Atallah <datallah@pidgin.im>
parents: 10561
diff changeset
827 memcpy(&sin.sin_addr.s_addr, hp->h_addr, hp->h_length);
000641c00f7d [gaim-migrate @ 11942]
Daniel Atallah <datallah@pidgin.im>
parents: 10561
diff changeset
828 sin.sin_family = hp->h_addrtype;
000641c00f7d [gaim-migrate @ 11942]
Daniel Atallah <datallah@pidgin.im>
parents: 10561
diff changeset
829 sin.sin_port = htons(td->port);
10305
0b8022b3abae [gaim-migrate @ 11490]
Mark Doliner <markdoliner@pidgin.im>
parents: 10264
diff changeset
830
10562
000641c00f7d [gaim-migrate @ 11942]
Daniel Atallah <datallah@pidgin.im>
parents: 10561
diff changeset
831 td->hosts = g_slist_append(td->hosts,
10619
07ef9839d751 [gaim-migrate @ 12086]
Daniel Atallah <datallah@pidgin.im>
parents: 10613
diff changeset
832 GSIZE_TO_POINTER(sizeof(sin)));
10562
000641c00f7d [gaim-migrate @ 11942]
Daniel Atallah <datallah@pidgin.im>
parents: 10561
diff changeset
833 td->hosts = g_slist_append(td->hosts,
000641c00f7d [gaim-migrate @ 11942]
Daniel Atallah <datallah@pidgin.im>
parents: 10561
diff changeset
834 g_memdup(&sin, sizeof(sin)));
000641c00f7d [gaim-migrate @ 11942]
Daniel Atallah <datallah@pidgin.im>
parents: 10561
diff changeset
835 } else {
10619
07ef9839d751 [gaim-migrate @ 12086]
Daniel Atallah <datallah@pidgin.im>
parents: 10613
diff changeset
836 td->errmsg = g_strdup_printf("DNS gethostbyname(\"%s\") error: %d", td->hostname, h_errno);
10562
000641c00f7d [gaim-migrate @ 11942]
Daniel Atallah <datallah@pidgin.im>
parents: 10561
diff changeset
837 }
10619
07ef9839d751 [gaim-migrate @ 12086]
Daniel Atallah <datallah@pidgin.im>
parents: 10613
diff changeset
838 #endif
10237
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
839 /* back to main thread */
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
840 g_idle_add(dns_main_thread_cb, td);
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
841 return 0;
10305
0b8022b3abae [gaim-migrate @ 11490]
Mark Doliner <markdoliner@pidgin.im>
parents: 10264
diff changeset
842 }
10237
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
843
10711
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
844 int
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
845 gaim_gethostbyname_async(const char *hostname, int port,
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
846 dns_callback_t callback, gpointer data)
f6279a730e85 [gaim-migrate @ 12301]
Mark Doliner <markdoliner@pidgin.im>
parents: 10709
diff changeset
847 {
10237
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
848 dns_tdata *td;
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
849 struct sockaddr_in sin;
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
850 GError* err = NULL;
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
851
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
852 if(inet_aton(hostname, &sin.sin_addr)) {
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
853 GSList *hosts = NULL;
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
854 sin.sin_family = AF_INET;
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
855 sin.sin_port = htons(port);
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
856 hosts = g_slist_append(hosts, GINT_TO_POINTER(sizeof(sin)));
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
857 hosts = g_slist_append(hosts, g_memdup(&sin, sizeof(sin)));
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
858 callback(hosts, data, NULL);
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
859 return 0;
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
860 }
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
861
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
862 gaim_debug_info("dns", "DNS Lookup for: %s\n", hostname);
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
863 td = g_new0(dns_tdata, 1);
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
864 td->hostname = g_strdup(hostname);
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
865 td->port = port;
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
866 td->callback = callback;
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
867 td->data = data;
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
868
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
869 if(!g_thread_create(dns_thread, td, FALSE, &err)) {
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
870 gaim_debug_error("dns", "DNS thread create failure: %s\n", err?err->message:"");
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
871 g_error_free(err);
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
872 g_free(td->hostname);
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
873 g_free(td);
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
874 return -1;
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
875 }
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
876 return 0;
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
877 }
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
878
13649
b156749bec5b [gaim-migrate @ 16049]
Evan Schoenberg <evands@pidgin.im>
parents: 13531
diff changeset
879 #else /* not __unix__ or __APPLE__ or _WIN32 */
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
880
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
881 typedef struct {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
882 gpointer data;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
883 size_t addrlen;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
884 struct sockaddr *addr;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
885 dns_callback_t callback;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
886 } pending_dns_request_t;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
887
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
888 static gboolean host_resolved(gpointer data)
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
889 {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
890 pending_dns_request_t *req = (pending_dns_request_t*)data;
4678
4fe99bee3ecc [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
891 GSList *hosts = NULL;
4fe99bee3ecc [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
892 hosts = g_slist_append(hosts, GINT_TO_POINTER(req->addrlen));
4fe99bee3ecc [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
893 hosts = g_slist_append(hosts, req->addr);
4fe99bee3ecc [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
894 req->callback(hosts, req->data, NULL);
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
895 g_free(req);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
896 return FALSE;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
897 }
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
898
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
899 int
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
900 gaim_gethostbyname_async(const char *hostname, int port,
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
901 dns_callback_t callback, gpointer data)
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
902 {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
903 struct sockaddr_in sin;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
904 pending_dns_request_t *req;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
905
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
906 if (!inet_aton(hostname, &sin.sin_addr)) {
2911
b20669ca1281 [gaim-migrate @ 2924]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2907
diff changeset
907 struct hostent *hp;
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
908 if(!(hp = gethostbyname(hostname))) {
10309
073906008cb2 [gaim-migrate @ 11501]
Mark Doliner <markdoliner@pidgin.im>
parents: 10307
diff changeset
909 gaim_debug_error("dns",
8977
74162f1be34a [gaim-migrate @ 9751]
Mark Doliner <markdoliner@pidgin.im>
parents: 8917
diff changeset
910 "gaim_gethostbyname(\"%s\", %d) failed: %d\n",
74162f1be34a [gaim-migrate @ 9751]
Mark Doliner <markdoliner@pidgin.im>
parents: 8917
diff changeset
911 hostname, port, h_errno);
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
912 return -1;
2911
b20669ca1281 [gaim-migrate @ 2924]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2907
diff changeset
913 }
b20669ca1281 [gaim-migrate @ 2924]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2907
diff changeset
914 memset(&sin, 0, sizeof(struct sockaddr_in));
b20669ca1281 [gaim-migrate @ 2924]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2907
diff changeset
915 memcpy(&sin.sin_addr.s_addr, hp->h_addr, hp->h_length);
b20669ca1281 [gaim-migrate @ 2924]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2907
diff changeset
916 sin.sin_family = hp->h_addrtype;
b20669ca1281 [gaim-migrate @ 2924]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2907
diff changeset
917 } else
b20669ca1281 [gaim-migrate @ 2924]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2907
diff changeset
918 sin.sin_family = AF_INET;
b20669ca1281 [gaim-migrate @ 2924]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2907
diff changeset
919 sin.sin_port = htons(port);
b20669ca1281 [gaim-migrate @ 2924]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2907
diff changeset
920
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
921 req = g_new(pending_dns_request_t, 1);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
922 req->addr = (struct sockaddr*) g_memdup(&sin, sizeof(sin));
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
923 req->addrlen = sizeof(sin);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
924 req->data = data;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
925 req->callback = callback;
8273
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents: 8269
diff changeset
926 gaim_timeout_add(10, host_resolved, req);
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
927 return 0;
2911
b20669ca1281 [gaim-migrate @ 2924]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2907
diff changeset
928 }
b20669ca1281 [gaim-migrate @ 2924]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2907
diff changeset
929
13649
b156749bec5b [gaim-migrate @ 16049]
Evan Schoenberg <evands@pidgin.im>
parents: 13531
diff changeset
930 #endif /* not __unix__ or __APPLE__ or _WIN32 */
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
931
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
932 static void
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
933 no_one_calls(gpointer data, gint source, GaimInputCondition cond)
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
934 {
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
935 struct PHB *phb = data;
12991
919acda94433 [gaim-migrate @ 15344]
Tim Mooney
parents: 12977
diff changeset
936 socklen_t len;
8273
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents: 8269
diff changeset
937 int error=0, ret;
3717
2fc0789e04e8 [gaim-migrate @ 3850]
Herman Bloggs <herman@bluedigits.com>
parents: 3630
diff changeset
938
10309
073906008cb2 [gaim-migrate @ 11501]
Mark Doliner <markdoliner@pidgin.im>
parents: 10307
diff changeset
939 gaim_debug_info("proxy", "Connected.\n");
3717
2fc0789e04e8 [gaim-migrate @ 3850]
Herman Bloggs <herman@bluedigits.com>
parents: 3630
diff changeset
940
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
941 len = sizeof(error);
4648
22f8080928e0 [gaim-migrate @ 4959]
Herman Bloggs <herman@bluedigits.com>
parents: 4634
diff changeset
942
8273
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents: 8269
diff changeset
943 /*
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents: 8269
diff changeset
944 * getsockopt after a non-blocking connect returns -1 if something is
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents: 8269
diff changeset
945 * really messed up (bad descriptor, usually). Otherwise, it returns 0 and
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents: 8269
diff changeset
946 * error holds what connect would have returned if it blocked until now.
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents: 8269
diff changeset
947 * Thus, error == 0 is success, error == EINPROGRESS means "try again",
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents: 8269
diff changeset
948 * and anything else is a real error.
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents: 8269
diff changeset
949 *
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents: 8269
diff changeset
950 * (error == EINPROGRESS can happen after a select because the kernel can
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents: 8269
diff changeset
951 * be overly optimistic sometimes. select is just a hint that you might be
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents: 8269
diff changeset
952 * able to do something.)
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents: 8269
diff changeset
953 */
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents: 8269
diff changeset
954 ret = getsockopt(source, SOL_SOCKET, SO_ERROR, &error, &len);
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents: 8269
diff changeset
955 if (ret == 0 && error == EINPROGRESS)
9863
323e4fe28791 [gaim-migrate @ 10742]
Mark Doliner <markdoliner@pidgin.im>
parents: 9792
diff changeset
956 return; /* we'll be called again later */
8273
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents: 8269
diff changeset
957 if (ret < 0 || error != 0) {
9100
f0e4bc963633 [gaim-migrate @ 9877]
Ethan Blanton <elb@pidgin.im>
parents: 8977
diff changeset
958 if(ret!=0) error = errno;
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
959 close(source);
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
960 gaim_input_remove(phb->inpa);
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
961
10309
073906008cb2 [gaim-migrate @ 11501]
Mark Doliner <markdoliner@pidgin.im>
parents: 10307
diff changeset
962 gaim_debug_error("proxy",
9100
f0e4bc963633 [gaim-migrate @ 9877]
Ethan Blanton <elb@pidgin.im>
parents: 8977
diff changeset
963 "getsockopt SO_ERROR check: %s\n", strerror(error));
9129
9510867e614f [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
964
9510867e614f [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
965 try_connect(phb);
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
966 return;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
967 }
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
968
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
969 gaim_input_remove(phb->inpa);
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
970
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
971 if (phb->account == NULL ||
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
972 gaim_account_get_connection(phb->account) != NULL) {
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
973
4993
33aee03d1e24 [gaim-migrate @ 5328]
Nathan Walp <nwalp@pidgin.im>
parents: 4679
diff changeset
974 phb->func(phb->data, source, GAIM_INPUT_READ);
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
975 }
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
976
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
977 g_free(phb->host);
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
978 g_free(phb);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
979 }
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
980
1868
31b44ef2b061 [gaim-migrate @ 1878]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1844
diff changeset
981 static gboolean clean_connect(gpointer data)
31b44ef2b061 [gaim-migrate @ 1878]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1844
diff changeset
982 {
31b44ef2b061 [gaim-migrate @ 1878]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1844
diff changeset
983 struct PHB *phb = data;
31b44ef2b061 [gaim-migrate @ 1878]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1844
diff changeset
984
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
985 if (phb->account == NULL ||
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
986 gaim_account_get_connection(phb->account) != NULL) {
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
987
4993
33aee03d1e24 [gaim-migrate @ 5328]
Nathan Walp <nwalp@pidgin.im>
parents: 4679
diff changeset
988 phb->func(phb->data, phb->port, GAIM_INPUT_READ);
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
989 }
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
990
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
991 g_free(phb->host);
1868
31b44ef2b061 [gaim-migrate @ 1878]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1844
diff changeset
992 g_free(phb);
31b44ef2b061 [gaim-migrate @ 1878]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1844
diff changeset
993
31b44ef2b061 [gaim-migrate @ 1878]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1844
diff changeset
994 return FALSE;
31b44ef2b061 [gaim-migrate @ 1878]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1844
diff changeset
995 }
31b44ef2b061 [gaim-migrate @ 1878]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1844
diff changeset
996
31b44ef2b061 [gaim-migrate @ 1878]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1844
diff changeset
997
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
998 static int
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
999 proxy_connect_none(struct PHB *phb, struct sockaddr *addr, socklen_t addrlen)
1
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
1000 {
1087
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
1001 int fd = -1;
3717
2fc0789e04e8 [gaim-migrate @ 3850]
Herman Bloggs <herman@bluedigits.com>
parents: 3630
diff changeset
1002
10309
073906008cb2 [gaim-migrate @ 11501]
Mark Doliner <markdoliner@pidgin.im>
parents: 10307
diff changeset
1003 gaim_debug_info("proxy",
5211
94d9756c381f [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
1004 "Connecting to %s:%d with no proxy\n", phb->host, phb->port);
1087
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
1005
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1006 if ((fd = socket(addr->sa_family, SOCK_STREAM, 0)) < 0) {
10309
073906008cb2 [gaim-migrate @ 11501]
Mark Doliner <markdoliner@pidgin.im>
parents: 10307
diff changeset
1007 gaim_debug_error("proxy",
5211
94d9756c381f [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
1008 "Unable to create socket: %s\n", strerror(errno));
1087
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
1009 return -1;
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1010 }
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1011 fcntl(fd, F_SETFL, O_NONBLOCK);
10172
8400788b226c [gaim-migrate @ 11275]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10170
diff changeset
1012 #ifndef _WIN32
10170
4ea971904ef5 [gaim-migrate @ 11262]
Ethan Blanton <elb@pidgin.im>
parents: 10087
diff changeset
1013 fcntl(fd, F_SETFD, FD_CLOEXEC);
10172
8400788b226c [gaim-migrate @ 11275]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10170
diff changeset
1014 #endif
3717
2fc0789e04e8 [gaim-migrate @ 3850]
Herman Bloggs <herman@bluedigits.com>
parents: 3630
diff changeset
1015
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1016 if (connect(fd, (struct sockaddr *)addr, addrlen) < 0) {
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1017 if ((errno == EINPROGRESS) || (errno == EINTR)) {
13991
105653359626 [gaim-migrate @ 16456]
Ethan Blanton <elb@pidgin.im>
parents: 13800
diff changeset
1018 /* This just confuses people. */
105653359626 [gaim-migrate @ 16456]
Ethan Blanton <elb@pidgin.im>
parents: 13800
diff changeset
1019 /* gaim_debug_warning("proxy",
105653359626 [gaim-migrate @ 16456]
Ethan Blanton <elb@pidgin.im>
parents: 13800
diff changeset
1020 "Connect would have blocked.\n"); */
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
1021 phb->inpa = gaim_input_add(fd, GAIM_INPUT_WRITE, no_one_calls, phb);
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1022 }
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1023 else {
10309
073906008cb2 [gaim-migrate @ 11501]
Mark Doliner <markdoliner@pidgin.im>
parents: 10307
diff changeset
1024 gaim_debug_error("proxy",
9100
f0e4bc963633 [gaim-migrate @ 9877]
Ethan Blanton <elb@pidgin.im>
parents: 8977
diff changeset
1025 "Connect failed: %s\n", strerror(errno));
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1026 close(fd);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1027 return -1;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1028 }
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1029 }
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1030 else {
12991
919acda94433 [gaim-migrate @ 15344]
Tim Mooney
parents: 12977
diff changeset
1031 socklen_t len;
2048
4ac8b9622c9e [gaim-migrate @ 2058]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1881
diff changeset
1032 int error = ETIMEDOUT;
10309
073906008cb2 [gaim-migrate @ 11501]
Mark Doliner <markdoliner@pidgin.im>
parents: 10307
diff changeset
1033 gaim_debug_misc("proxy", "Connect didn't block.\n");
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1034 len = sizeof(error);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1035 if (getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &len) < 0) {
10309
073906008cb2 [gaim-migrate @ 11501]
Mark Doliner <markdoliner@pidgin.im>
parents: 10307
diff changeset
1036 gaim_debug_error("proxy", "getsockopt failed.\n");
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1037 close(fd);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1038 return -1;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1039 }
2372
c24942700dfd [gaim-migrate @ 2385]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2306
diff changeset
1040 phb->port = fd; /* bleh */
8273
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents: 8269
diff changeset
1041 gaim_timeout_add(50, clean_connect, phb); /* we do this because we never
2372
c24942700dfd [gaim-migrate @ 2385]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2306
diff changeset
1042 want to call our callback
c24942700dfd [gaim-migrate @ 2385]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2306
diff changeset
1043 before we return. */
1087
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
1044 }
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
1045
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
1046 return fd;
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
1047 }
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
1048
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1049 static void
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1050 proxy_do_write(gpointer data, gint source, GaimInputCondition cond)
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1051 {
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1052 struct PHB *phb = data;
13387
c6be7551b0a6 [gaim-migrate @ 15759]
Mark Doliner <markdoliner@pidgin.im>
parents: 13313
diff changeset
1053 const guchar *request = phb->write_buffer + phb->written_len;
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1054 gsize request_len = phb->write_buf_len - phb->written_len;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1055
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1056 int ret = write(source, request, request_len);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1057
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1058 if(ret < 0 && errno == EAGAIN)
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1059 return;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1060 else if(ret < 0) {
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1061 gaim_input_remove(phb->inpa);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1062 close(source);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1063 g_free(phb->write_buffer);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1064 phb->write_buffer = NULL;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1065 try_connect(phb);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1066 return;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1067 } else if (ret < request_len) {
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1068 phb->written_len += ret;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1069 return;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1070 }
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1071
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1072 gaim_input_remove(phb->inpa);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1073 g_free(phb->write_buffer);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1074 phb->write_buffer = NULL;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1075
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1076 /* register the response handler for the response */
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1077 phb->inpa = gaim_input_add(source, GAIM_INPUT_READ, phb->read_cb, phb);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1078 }
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1079
3376
9fc15174bd67 [gaim-migrate @ 3395]
Ethan Blanton <elb@pidgin.im>
parents: 3283
diff changeset
1080 #define HTTP_GOODSTRING "HTTP/1.0 200"
9fc15174bd67 [gaim-migrate @ 3395]
Ethan Blanton <elb@pidgin.im>
parents: 3283
diff changeset
1081 #define HTTP_GOODSTRING2 "HTTP/1.1 200"
1087
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
1082
7834
6a092463d774 [gaim-migrate @ 8487]
Mike Hearn <mike@theoretic.com>
parents: 7652
diff changeset
1083 static void
6a092463d774 [gaim-migrate @ 8487]
Mike Hearn <mike@theoretic.com>
parents: 7652
diff changeset
1084 http_complete(struct PHB *phb, gint source)
6a092463d774 [gaim-migrate @ 8487]
Mike Hearn <mike@theoretic.com>
parents: 7652
diff changeset
1085 {
10309
073906008cb2 [gaim-migrate @ 11501]
Mark Doliner <markdoliner@pidgin.im>
parents: 10307
diff changeset
1086 gaim_debug_info("http proxy", "proxy connection established\n");
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1087 if(!phb->account || phb->account->gc) {
7834
6a092463d774 [gaim-migrate @ 8487]
Mike Hearn <mike@theoretic.com>
parents: 7652
diff changeset
1088 phb->func(phb->data, source, GAIM_INPUT_READ);
9129
9510867e614f [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1089 }
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1090 g_free(phb->host);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1091 g_free(phb);
7834
6a092463d774 [gaim-migrate @ 8487]
Mike Hearn <mike@theoretic.com>
parents: 7652
diff changeset
1092 }
6a092463d774 [gaim-migrate @ 8487]
Mike Hearn <mike@theoretic.com>
parents: 7652
diff changeset
1093
6a092463d774 [gaim-migrate @ 8487]
Mike Hearn <mike@theoretic.com>
parents: 7652
diff changeset
1094
6a092463d774 [gaim-migrate @ 8487]
Mike Hearn <mike@theoretic.com>
parents: 7652
diff changeset
1095 /* read the response to the CONNECT request, if we are requesting a non-port-80 tunnel */
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1096 static void
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1097 http_canread(gpointer data, gint source, GaimInputCondition cond)
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1098 {
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1099 int len, headers_len, status = 0;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1100 gboolean error;
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1101 struct PHB *phb = data;
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1102 guchar *p;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1103 gsize max_read;
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1104
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1105 if(phb->read_buffer == NULL) {
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1106 phb->read_buf_len = 8192;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1107 phb->read_buffer = g_malloc(phb->read_buf_len);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1108 phb->read_len = 0;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1109 }
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1110
13289
a05b7dc08bc2 [gaim-migrate @ 15654]
Daniel Atallah <datallah@pidgin.im>
parents: 13209
diff changeset
1111 p = phb->read_buffer + phb->read_len;
a05b7dc08bc2 [gaim-migrate @ 15654]
Daniel Atallah <datallah@pidgin.im>
parents: 13209
diff changeset
1112 max_read = phb->read_buf_len - phb->read_len - 1;
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1113
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1114 len = read(source, p, max_read);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1115 if(len < 0 && errno == EAGAIN)
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1116 return;
13788
019bc2080927 [gaim-migrate @ 16198]
Daniel Atallah <datallah@pidgin.im>
parents: 13754
diff changeset
1117 else if(len <= 0) {
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1118 close(source);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1119 source = -1;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1120 g_free(phb->read_buffer);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1121 phb->read_buffer = NULL;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1122 gaim_input_remove(phb->inpa);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1123 phb->inpa = 0;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1124 http_complete(phb, source);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1125 return;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1126 } else {
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1127 phb->read_len += len;
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1128 }
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1129 p[len] = '\0';
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1130
13387
c6be7551b0a6 [gaim-migrate @ 15759]
Mark Doliner <markdoliner@pidgin.im>
parents: 13313
diff changeset
1131 if((p = (guchar *)g_strstr_len((const gchar *)phb->read_buffer, phb->read_len, "\r\n\r\n"))) {
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1132 *p = '\0';
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1133 headers_len = (p - phb->read_buffer) + 4;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1134 } else if(len == max_read)
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1135 headers_len = len;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1136 else
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1137 return;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1138
13387
c6be7551b0a6 [gaim-migrate @ 15759]
Mark Doliner <markdoliner@pidgin.im>
parents: 13313
diff changeset
1139 error = strncmp((const char *)phb->read_buffer, "HTTP/", 5) != 0;
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1140 if(!error) {
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1141 int major;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1142 p = phb->read_buffer + 5;
13387
c6be7551b0a6 [gaim-migrate @ 15759]
Mark Doliner <markdoliner@pidgin.im>
parents: 13313
diff changeset
1143 major = strtol((const char *)p, (char **)&p, 10);
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1144 error = (major == 0) || (*p != '.');
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1145 if(!error) {
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1146 int minor;
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1147 p++;
13387
c6be7551b0a6 [gaim-migrate @ 15759]
Mark Doliner <markdoliner@pidgin.im>
parents: 13313
diff changeset
1148 minor = strtol((const char *)p, (char **)&p, 10);
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1149 error = (*p != ' ');
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1150 if(!error) {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1151 p++;
13387
c6be7551b0a6 [gaim-migrate @ 15759]
Mark Doliner <markdoliner@pidgin.im>
parents: 13313
diff changeset
1152 status = strtol((const char *)p, (char **)&p, 10);
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1153 error = (*p != ' ');
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1154 }
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1155 }
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1156 }
9129
9510867e614f [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1157
12391
2866c00556d9 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
1158 /* Read the contents */
13387
c6be7551b0a6 [gaim-migrate @ 15759]
Mark Doliner <markdoliner@pidgin.im>
parents: 13313
diff changeset
1159 p = (guchar *)g_strrstr((const gchar *)phb->read_buffer, "Content-Length: ");
12440
d468e6ecf65a [gaim-migrate @ 14747]
Richard Laager <rlaager@pidgin.im>
parents: 12412
diff changeset
1160 if(p != NULL) {
12391
2866c00556d9 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
1161 gchar *tmp;
2866c00556d9 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
1162 int len = 0;
2866c00556d9 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
1163 char tmpc;
2866c00556d9 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
1164 p += strlen("Content-Length: ");
13387
c6be7551b0a6 [gaim-migrate @ 15759]
Mark Doliner <markdoliner@pidgin.im>
parents: 13313
diff changeset
1165 tmp = strchr((const char *)p, '\r');
13405
9abc78d6db91 [gaim-migrate @ 15779]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 13387
diff changeset
1166 if(tmp)
9abc78d6db91 [gaim-migrate @ 15779]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 13387
diff changeset
1167 *tmp = '\0';
13387
c6be7551b0a6 [gaim-migrate @ 15759]
Mark Doliner <markdoliner@pidgin.im>
parents: 13313
diff changeset
1168 len = atoi((const char *)p);
13405
9abc78d6db91 [gaim-migrate @ 15779]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 13387
diff changeset
1169 if(tmp)
9abc78d6db91 [gaim-migrate @ 15779]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 13387
diff changeset
1170 *tmp = '\r';
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1171
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1172 /* Compensate for what has already been read */
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1173 len -= phb->read_len - headers_len;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1174 /* I'm assuming that we're doing this to prevent the server from
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1175 complaining / breaking since we don't read the whole page */
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1176 while(len--) {
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1177 /* TODO: deal with EAGAIN (and other errors) better */
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1178 if (read(source, &tmpc, 1) < 0 && errno != EAGAIN)
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1179 break;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1180 }
12391
2866c00556d9 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
1181 }
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1182
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1183 if(error) {
10309
073906008cb2 [gaim-migrate @ 11501]
Mark Doliner <markdoliner@pidgin.im>
parents: 10307
diff changeset
1184 gaim_debug_error("proxy",
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1185 "Unable to parse proxy's response: %s\n",
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1186 phb->read_buffer);
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1187 close(source);
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1188 source = -1;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1189 g_free(phb->read_buffer);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1190 phb->read_buffer = NULL;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1191 gaim_input_remove(phb->inpa);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1192 phb->inpa = 0;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1193 http_complete(phb, source);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1194 return;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1195 } else if(status != 200) {
10309
073906008cb2 [gaim-migrate @ 11501]
Mark Doliner <markdoliner@pidgin.im>
parents: 10307
diff changeset
1196 gaim_debug_error("proxy",
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1197 "Proxy server replied with:\n%s\n",
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1198 phb->read_buffer);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1199
9129
9510867e614f [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1200
9510867e614f [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1201 /* XXX: why in the hell are we calling gaim_connection_error() here? */
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1202 if(status == 407 /* Proxy Auth */) {
12391
2866c00556d9 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
1203 gchar *ntlm;
13387
c6be7551b0a6 [gaim-migrate @ 15759]
Mark Doliner <markdoliner@pidgin.im>
parents: 13313
diff changeset
1204 if((ntlm = g_strrstr((const gchar *)phb->read_buffer, "Proxy-Authenticate: NTLM "))) { /* Check for Type-2 */
13700
ad7bca3b4240 [gaim-migrate @ 16101]
Mark Doliner <markdoliner@pidgin.im>
parents: 13649
diff changeset
1205 gchar *tmp = ntlm;
ad7bca3b4240 [gaim-migrate @ 16101]
Mark Doliner <markdoliner@pidgin.im>
parents: 13649
diff changeset
1206 guint8 *nonce;
12391
2866c00556d9 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
1207 gchar *domain = (gchar*)gaim_proxy_info_get_username(phb->gpi);
2866c00556d9 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
1208 gchar *username;
2866c00556d9 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
1209 gchar *request;
2866c00556d9 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
1210 gchar *response;
2866c00556d9 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
1211 if(!(username = strchr(domain, '\\'))) {
2866c00556d9 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
1212 char *msg = g_strdup_printf(_("Proxy connection error %d"), status);
2866c00556d9 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
1213 close(source);
2866c00556d9 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
1214 source = -1;
13313
17e205ae9859 [gaim-migrate @ 15678]
Daniel Atallah <datallah@pidgin.im>
parents: 13289
diff changeset
1215 if(phb->account)
17e205ae9859 [gaim-migrate @ 15678]
Daniel Atallah <datallah@pidgin.im>
parents: 13289
diff changeset
1216 gaim_connection_error(phb->account->gc, msg);
17e205ae9859 [gaim-migrate @ 15678]
Daniel Atallah <datallah@pidgin.im>
parents: 13289
diff changeset
1217 else
17e205ae9859 [gaim-migrate @ 15678]
Daniel Atallah <datallah@pidgin.im>
parents: 13289
diff changeset
1218 gaim_debug_error("http proxy", "%s\n", msg);
12391
2866c00556d9 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
1219 g_free(msg);
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1220 gaim_input_remove(phb->inpa);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1221 g_free(phb->read_buffer);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1222 g_free(phb->host);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1223 g_free(phb);
12391
2866c00556d9 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
1224 return;
2866c00556d9 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
1225 }
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1226 *username = '\0';
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1227 username++;
12391
2866c00556d9 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
1228 ntlm += strlen("Proxy-Authenticate: NTLM ");
13700
ad7bca3b4240 [gaim-migrate @ 16101]
Mark Doliner <markdoliner@pidgin.im>
parents: 13649
diff changeset
1229 while(*tmp != '\r' && *tmp != '\0') tmp++;
ad7bca3b4240 [gaim-migrate @ 16101]
Mark Doliner <markdoliner@pidgin.im>
parents: 13649
diff changeset
1230 *tmp = '\0';
13085
c80913901342 [gaim-migrate @ 15446]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 13023
diff changeset
1231 nonce = gaim_ntlm_parse_type2(ntlm, NULL);
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1232 response = gaim_ntlm_gen_type3(username,
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1233 (gchar*) gaim_proxy_info_get_password(phb->gpi),
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1234 (gchar*) gaim_proxy_info_get_host(phb->gpi),
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1235 domain, nonce, NULL);
12391
2866c00556d9 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
1236 username--;
2866c00556d9 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
1237 *username = '\\';
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1238 request = g_strdup_printf(
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1239 "CONNECT %s:%d HTTP/1.1\r\n"
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1240 "Host: %s:%d\r\n"
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1241 "Proxy-Authorization: NTLM %s\r\n"
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1242 "Proxy-Connection: Keep-Alive\r\n\r\n",
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1243 phb->host, phb->port, phb->host,
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1244 phb->port, response);
12391
2866c00556d9 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
1245 g_free(response);
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1246
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1247 gaim_input_remove(phb->inpa);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1248 g_free(phb->read_buffer);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1249 phb->read_buffer = NULL;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1250
13387
c6be7551b0a6 [gaim-migrate @ 15759]
Mark Doliner <markdoliner@pidgin.im>
parents: 13313
diff changeset
1251 phb->write_buffer = (guchar *)request;
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1252 phb->write_buf_len = strlen(request);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1253 phb->written_len = 0;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1254
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1255 phb->read_cb = http_canread;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1256
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1257 phb->inpa = gaim_input_add(source,
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1258 GAIM_INPUT_WRITE, proxy_do_write, phb);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1259
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1260 proxy_do_write(phb, source, cond);
12391
2866c00556d9 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
1261 return;
13387
c6be7551b0a6 [gaim-migrate @ 15759]
Mark Doliner <markdoliner@pidgin.im>
parents: 13313
diff changeset
1262 } else if((ntlm = g_strrstr((const char *)phb->read_buffer, "Proxy-Authenticate: NTLM"))) { /* Empty message */
12391
2866c00556d9 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
1263 gchar request[2048];
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1264 gchar *domain = (gchar*) gaim_proxy_info_get_username(phb->gpi);
12391
2866c00556d9 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
1265 gchar *username;
2866c00556d9 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
1266 int request_len;
2866c00556d9 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
1267 if(!(username = strchr(domain, '\\'))) {
2866c00556d9 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
1268 char *msg = g_strdup_printf(_("Proxy connection error %d"), status);
2866c00556d9 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
1269 close(source);
2866c00556d9 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
1270 source = -1;
13313
17e205ae9859 [gaim-migrate @ 15678]
Daniel Atallah <datallah@pidgin.im>
parents: 13289
diff changeset
1271 if(phb->account)
17e205ae9859 [gaim-migrate @ 15678]
Daniel Atallah <datallah@pidgin.im>
parents: 13289
diff changeset
1272 gaim_connection_error(phb->account->gc, msg);
17e205ae9859 [gaim-migrate @ 15678]
Daniel Atallah <datallah@pidgin.im>
parents: 13289
diff changeset
1273 else
17e205ae9859 [gaim-migrate @ 15678]
Daniel Atallah <datallah@pidgin.im>
parents: 13289
diff changeset
1274 gaim_debug_error("http proxy", "%s\n", msg);
12391
2866c00556d9 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
1275 g_free(msg);
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1276 gaim_input_remove(phb->inpa);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1277 g_free(phb->read_buffer);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1278 g_free(phb->host);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1279 g_free(phb);
12391
2866c00556d9 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
1280 return;
2866c00556d9 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
1281 }
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1282 *username = '\0';
12391
2866c00556d9 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
1283
2866c00556d9 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
1284 request_len = g_snprintf(request, sizeof(request),
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1285 "CONNECT %s:%d HTTP/1.1\r\n"
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1286 "Host: %s:%d\r\n",
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1287 phb->host, phb->port,
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1288 phb->host, phb->port);
12391
2866c00556d9 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
1289
2866c00556d9 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
1290 g_return_if_fail(request_len < sizeof(request));
2866c00556d9 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
1291 request_len += g_snprintf(request + request_len,
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1292 sizeof(request) - request_len,
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1293 "Proxy-Authorization: NTLM %s\r\n"
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1294 "Proxy-Connection: Keep-Alive\r\n\r\n",
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1295 gaim_ntlm_gen_type1(
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1296 (gchar*) gaim_proxy_info_get_host(phb->gpi),
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1297 domain));
12391
2866c00556d9 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
1298 *username = '\\';
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1299
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1300 gaim_input_remove(phb->inpa);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1301 g_free(phb->read_buffer);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1302 phb->read_buffer = NULL;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1303
13387
c6be7551b0a6 [gaim-migrate @ 15759]
Mark Doliner <markdoliner@pidgin.im>
parents: 13313
diff changeset
1304 phb->write_buffer = g_memdup(request, request_len);
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1305 phb->write_buf_len = request_len;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1306 phb->written_len = 0;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1307
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1308 phb->read_cb = http_canread;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1309
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1310 phb->inpa = gaim_input_add(source,
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1311 GAIM_INPUT_WRITE, proxy_do_write, phb);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1312
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1313 proxy_do_write(phb, source, cond);
12391
2866c00556d9 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
1314 return;
2866c00556d9 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
1315 } else {
2866c00556d9 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
1316 char *msg = g_strdup_printf(_("Proxy connection error %d"), status);
2866c00556d9 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
1317 close(source);
2866c00556d9 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
1318 source = -1;
13313
17e205ae9859 [gaim-migrate @ 15678]
Daniel Atallah <datallah@pidgin.im>
parents: 13289
diff changeset
1319 if(phb->account)
17e205ae9859 [gaim-migrate @ 15678]
Daniel Atallah <datallah@pidgin.im>
parents: 13289
diff changeset
1320 gaim_connection_error(phb->account->gc, msg);
17e205ae9859 [gaim-migrate @ 15678]
Daniel Atallah <datallah@pidgin.im>
parents: 13289
diff changeset
1321 else
17e205ae9859 [gaim-migrate @ 15678]
Daniel Atallah <datallah@pidgin.im>
parents: 13289
diff changeset
1322 gaim_debug_error("http proxy", "%s\n", msg);
12391
2866c00556d9 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
1323 g_free(msg);
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1324 gaim_input_remove(phb->inpa);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1325 g_free(phb->read_buffer);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1326 g_free(phb->host);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1327 g_free(phb);
13209
439ad2dad2e1 [gaim-migrate @ 15572]
Daniel Atallah <datallah@pidgin.im>
parents: 13201
diff changeset
1328 return;
12391
2866c00556d9 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
1329 }
2866c00556d9 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
1330 }
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1331 if(status == 403 /* Forbidden */ ) {
8917
1301b17bc141 [gaim-migrate @ 9687]
Mark Doliner <markdoliner@pidgin.im>
parents: 8889
diff changeset
1332 gchar *msg = g_strdup_printf(_("Access denied: proxy server forbids port %d tunnelling."), phb->port);
13313
17e205ae9859 [gaim-migrate @ 15678]
Daniel Atallah <datallah@pidgin.im>
parents: 13289
diff changeset
1333 if(phb->account)
17e205ae9859 [gaim-migrate @ 15678]
Daniel Atallah <datallah@pidgin.im>
parents: 13289
diff changeset
1334 gaim_connection_error(phb->account->gc, msg);
17e205ae9859 [gaim-migrate @ 15678]
Daniel Atallah <datallah@pidgin.im>
parents: 13289
diff changeset
1335 else
17e205ae9859 [gaim-migrate @ 15678]
Daniel Atallah <datallah@pidgin.im>
parents: 13289
diff changeset
1336 gaim_debug_error("http proxy", "%s\n", msg);
8917
1301b17bc141 [gaim-migrate @ 9687]
Mark Doliner <markdoliner@pidgin.im>
parents: 8889
diff changeset
1337 g_free(msg);
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1338 gaim_input_remove(phb->inpa);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1339 g_free(phb->read_buffer);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1340 g_free(phb->host);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1341 g_free(phb);
8917
1301b17bc141 [gaim-migrate @ 9687]
Mark Doliner <markdoliner@pidgin.im>
parents: 8889
diff changeset
1342 } else {
7834
6a092463d774 [gaim-migrate @ 8487]
Mike Hearn <mike@theoretic.com>
parents: 7652
diff changeset
1343 char *msg = g_strdup_printf(_("Proxy connection error %d"), status);
13313
17e205ae9859 [gaim-migrate @ 15678]
Daniel Atallah <datallah@pidgin.im>
parents: 13289
diff changeset
1344 if(phb->account)
17e205ae9859 [gaim-migrate @ 15678]
Daniel Atallah <datallah@pidgin.im>
parents: 13289
diff changeset
1345 gaim_connection_error(phb->account->gc, msg);
17e205ae9859 [gaim-migrate @ 15678]
Daniel Atallah <datallah@pidgin.im>
parents: 13289
diff changeset
1346 else
17e205ae9859 [gaim-migrate @ 15678]
Daniel Atallah <datallah@pidgin.im>
parents: 13289
diff changeset
1347 gaim_debug_error("http proxy", "%s\n", msg);
7834
6a092463d774 [gaim-migrate @ 8487]
Mike Hearn <mike@theoretic.com>
parents: 7652
diff changeset
1348 g_free(msg);
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1349 gaim_input_remove(phb->inpa);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1350 g_free(phb->read_buffer);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1351 g_free(phb->host);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1352 g_free(phb);
7834
6a092463d774 [gaim-migrate @ 8487]
Mike Hearn <mike@theoretic.com>
parents: 7652
diff changeset
1353 }
6a092463d774 [gaim-migrate @ 8487]
Mike Hearn <mike@theoretic.com>
parents: 7652
diff changeset
1354 } else {
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1355 gaim_input_remove(phb->inpa);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1356 g_free(phb->read_buffer);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1357 phb->read_buffer = NULL;
7834
6a092463d774 [gaim-migrate @ 8487]
Mike Hearn <mike@theoretic.com>
parents: 7652
diff changeset
1358 http_complete(phb, source);
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1359 return;
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1360 }
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1361 }
9129
9510867e614f [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1362
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1363
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1364
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1365 static void
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1366 http_canwrite(gpointer data, gint source, GaimInputCondition cond)
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1367 {
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1368 char request[8192];
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1369 int request_len = 0;
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1370 struct PHB *phb = data;
12991
919acda94433 [gaim-migrate @ 15344]
Tim Mooney
parents: 12977
diff changeset
1371 socklen_t len;
2048
4ac8b9622c9e [gaim-migrate @ 2058]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1881
diff changeset
1372 int error = ETIMEDOUT;
3717
2fc0789e04e8 [gaim-migrate @ 3850]
Herman Bloggs <herman@bluedigits.com>
parents: 3630
diff changeset
1373
10309
073906008cb2 [gaim-migrate @ 11501]
Mark Doliner <markdoliner@pidgin.im>
parents: 10307
diff changeset
1374 gaim_debug_info("http proxy", "Connected.\n");
5211
94d9756c381f [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
1375
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1376 if (phb->inpa > 0)
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
1377 gaim_input_remove(phb->inpa);
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1378
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1379 len = sizeof(error);
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1380
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1381 if (getsockopt(source, SOL_SOCKET, SO_ERROR, &error, &len) < 0) {
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1382 close(source);
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1383
9129
9510867e614f [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1384 try_connect(phb);
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1385 return;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1386 }
7834
6a092463d774 [gaim-migrate @ 8487]
Mike Hearn <mike@theoretic.com>
parents: 7652
diff changeset
1387
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1388 gaim_debug_info("proxy", "using CONNECT tunnelling for %s:%d\n",
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1389 phb->host, phb->port);
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1390 request_len = g_snprintf(request, sizeof(request),
7834
6a092463d774 [gaim-migrate @ 8487]
Mike Hearn <mike@theoretic.com>
parents: 7652
diff changeset
1391 "CONNECT %s:%d HTTP/1.1\r\nHost: %s:%d\r\n",
6a092463d774 [gaim-migrate @ 8487]
Mike Hearn <mike@theoretic.com>
parents: 7652
diff changeset
1392 phb->host, phb->port, phb->host, phb->port);
1843
aeeac3ee7ac5 [gaim-migrate @ 1853]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1840
diff changeset
1393
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1394 if (gaim_proxy_info_get_username(phb->gpi) != NULL) {
1843
aeeac3ee7ac5 [gaim-migrate @ 1853]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1840
diff changeset
1395 char *t1, *t2;
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1396 t1 = g_strdup_printf("%s:%s",
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1397 gaim_proxy_info_get_username(phb->gpi),
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1398 gaim_proxy_info_get_password(phb->gpi) ?
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1399 gaim_proxy_info_get_password(phb->gpi) : "");
11143
f606fb334190 [gaim-migrate @ 13207]
Mark Doliner <markdoliner@pidgin.im>
parents: 11033
diff changeset
1400 t2 = gaim_base64_encode((const guchar *)t1, strlen(t1));
1843
aeeac3ee7ac5 [gaim-migrate @ 1853]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1840
diff changeset
1401 g_free(t1);
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1402 g_return_if_fail(request_len < sizeof(request));
13387
c6be7551b0a6 [gaim-migrate @ 15759]
Mark Doliner <markdoliner@pidgin.im>
parents: 13313
diff changeset
1403
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1404 request_len += g_snprintf(request + request_len,
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1405 sizeof(request) - request_len,
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1406 "Proxy-Authorization: Basic %s\r\n"
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1407 "Proxy-Authorization: NTLM %s\r\n"
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1408 "Proxy-Connection: Keep-Alive\r\n", t2,
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1409 gaim_ntlm_gen_type1(
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1410 (gchar*)gaim_proxy_info_get_host(phb->gpi),""));
1843
aeeac3ee7ac5 [gaim-migrate @ 1853]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1840
diff changeset
1411 g_free(t2);
aeeac3ee7ac5 [gaim-migrate @ 1853]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1840
diff changeset
1412 }
aeeac3ee7ac5 [gaim-migrate @ 1853]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1840
diff changeset
1413
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1414 g_return_if_fail(request_len < sizeof(request));
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1415 strcpy(request + request_len, "\r\n");
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1416 request_len += 2;
13387
c6be7551b0a6 [gaim-migrate @ 15759]
Mark Doliner <markdoliner@pidgin.im>
parents: 13313
diff changeset
1417 phb->write_buffer = g_memdup(request, request_len);
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1418 phb->write_buf_len = request_len;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1419 phb->written_len = 0;
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1420
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1421 phb->read_cb = http_canread;
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1422
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1423 phb->inpa = gaim_input_add(source, GAIM_INPUT_WRITE, proxy_do_write,
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1424 phb);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1425
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1426 proxy_do_write(phb, source, cond);
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1427 }
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1428
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1429 static int
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1430 proxy_connect_http(struct PHB *phb, struct sockaddr *addr, socklen_t addrlen)
1087
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
1431 {
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
1432 int fd = -1;
1
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
1433
10309
073906008cb2 [gaim-migrate @ 11501]
Mark Doliner <markdoliner@pidgin.im>
parents: 10307
diff changeset
1434 gaim_debug_info("http proxy",
5211
94d9756c381f [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
1435 "Connecting to %s:%d via %s:%d using HTTP\n",
12273
e81f70df6280 [gaim-migrate @ 14575]
Evan Schoenberg <evands@pidgin.im>
parents: 12246
diff changeset
1436 (phb->host ? phb->host : "(null)"), phb->port,
e81f70df6280 [gaim-migrate @ 14575]
Evan Schoenberg <evands@pidgin.im>
parents: 12246
diff changeset
1437 (gaim_proxy_info_get_host(phb->gpi) ? gaim_proxy_info_get_host(phb->gpi) : "(null)"),
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1438 gaim_proxy_info_get_port(phb->gpi));
1087
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
1439
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1440 if ((fd = socket(addr->sa_family, SOCK_STREAM, 0)) < 0) {
1087
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
1441 return -1;
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1442 }
1087
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
1443
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1444 fcntl(fd, F_SETFL, O_NONBLOCK);
10172
8400788b226c [gaim-migrate @ 11275]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10170
diff changeset
1445 #ifndef _WIN32
10170
4ea971904ef5 [gaim-migrate @ 11262]
Ethan Blanton <elb@pidgin.im>
parents: 10087
diff changeset
1446 fcntl(fd, F_SETFD, FD_CLOEXEC);
10172
8400788b226c [gaim-migrate @ 11275]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10170
diff changeset
1447 #endif
3717
2fc0789e04e8 [gaim-migrate @ 3850]
Herman Bloggs <herman@bluedigits.com>
parents: 3630
diff changeset
1448
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1449 if (connect(fd, addr, addrlen) < 0) {
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1450 if ((errno == EINPROGRESS) || (errno == EINTR)) {
10309
073906008cb2 [gaim-migrate @ 11501]
Mark Doliner <markdoliner@pidgin.im>
parents: 10307
diff changeset
1451 gaim_debug_warning("http proxy",
5211
94d9756c381f [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
1452 "Connect would have blocked.\n");
9655
7cfd0424ec23 [gaim-migrate @ 10503]
Luke Schierer <lschiere@pidgin.im>
parents: 9653
diff changeset
1453
7834
6a092463d774 [gaim-migrate @ 8487]
Mike Hearn <mike@theoretic.com>
parents: 7652
diff changeset
1454 if (phb->port != 80) {
6a092463d774 [gaim-migrate @ 8487]
Mike Hearn <mike@theoretic.com>
parents: 7652
diff changeset
1455 /* we need to do CONNECT first */
6a092463d774 [gaim-migrate @ 8487]
Mike Hearn <mike@theoretic.com>
parents: 7652
diff changeset
1456 phb->inpa = gaim_input_add(fd, GAIM_INPUT_WRITE,
6a092463d774 [gaim-migrate @ 8487]
Mike Hearn <mike@theoretic.com>
parents: 7652
diff changeset
1457 http_canwrite, phb);
6a092463d774 [gaim-migrate @ 8487]
Mike Hearn <mike@theoretic.com>
parents: 7652
diff changeset
1458 } else {
6a092463d774 [gaim-migrate @ 8487]
Mike Hearn <mike@theoretic.com>
parents: 7652
diff changeset
1459 http_complete(phb, fd);
6a092463d774 [gaim-migrate @ 8487]
Mike Hearn <mike@theoretic.com>
parents: 7652
diff changeset
1460 }
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1461 } else {
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1462 close(fd);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1463 return -1;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1464 }
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1465 }
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1466 else {
12991
919acda94433 [gaim-migrate @ 15344]
Tim Mooney
parents: 12977
diff changeset
1467 socklen_t len;
2048
4ac8b9622c9e [gaim-migrate @ 2058]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1881
diff changeset
1468 int error = ETIMEDOUT;
3717
2fc0789e04e8 [gaim-migrate @ 3850]
Herman Bloggs <herman@bluedigits.com>
parents: 3630
diff changeset
1469
10309
073906008cb2 [gaim-migrate @ 11501]
Mark Doliner <markdoliner@pidgin.im>
parents: 10307
diff changeset
1470 gaim_debug_misc("http proxy",
5211
94d9756c381f [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
1471 "Connect didn't block.\n");
94d9756c381f [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
1472
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1473 len = sizeof(error);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1474 if (getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &len) < 0) {
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1475 close(fd);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1476 return -1;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1477 }
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
1478 http_canwrite(phb, fd, GAIM_INPUT_WRITE);
1695
30db76d87de8 [gaim-migrate @ 1705]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1451
diff changeset
1479 }
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1480
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1481 return fd;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1482 }
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1483
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1484
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1485 static void
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1486 s4_canread(gpointer data, gint source, GaimInputCondition cond)
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1487 {
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1488 struct PHB *phb = data;
13387
c6be7551b0a6 [gaim-migrate @ 15759]
Mark Doliner <markdoliner@pidgin.im>
parents: 13313
diff changeset
1489 guchar *buf;
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1490 int len, max_read;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1491
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1492 /* This is really not going to block under normal circumstances, but to
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1493 * be correct, we deal with the unlikely scenario */
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1494
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1495 if (phb->read_buffer == NULL) {
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1496 phb->read_buf_len = 12;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1497 phb->read_buffer = g_malloc(phb->read_buf_len);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1498 phb->read_len = 0;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1499 }
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1500
13289
a05b7dc08bc2 [gaim-migrate @ 15654]
Daniel Atallah <datallah@pidgin.im>
parents: 13209
diff changeset
1501 buf = phb->read_buffer + phb->read_len;
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1502 max_read = phb->read_buf_len - phb->read_len;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1503
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1504 len = read(source, buf, max_read);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1505
13788
019bc2080927 [gaim-migrate @ 16198]
Daniel Atallah <datallah@pidgin.im>
parents: 13754
diff changeset
1506 if ((len < 0 && errno == EAGAIN) || (len > 0 && len + phb->read_len < 4))
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1507 return;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1508 else if (len + phb->read_len >= 4) {
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1509 if (phb->read_buffer[1] == 90) {
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1510 if (phb->account == NULL ||
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1511 gaim_account_get_connection(phb->account) != NULL) {
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1512
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1513 phb->func(phb->data, source, GAIM_INPUT_READ);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1514 }
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1515
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1516 gaim_input_remove(phb->inpa);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1517 g_free(phb->read_buffer);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1518 g_free(phb->host);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1519 g_free(phb);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1520 return;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1521 }
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1522 }
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1523
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
1524 gaim_input_remove(phb->inpa);
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1525 g_free(phb->read_buffer);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1526 phb->read_buffer = NULL;
1087
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
1527
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1528 close(source);
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1529
9129
9510867e614f [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1530 try_connect(phb);
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1531 }
1705
cc63a8819c1c [gaim-migrate @ 1715]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1695
diff changeset
1532
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1533 static void
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1534 s4_canwrite(gpointer data, gint source, GaimInputCondition cond)
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1535 {
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1536 unsigned char packet[9];
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1537 struct hostent *hp;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1538 struct PHB *phb = data;
12991
919acda94433 [gaim-migrate @ 15344]
Tim Mooney
parents: 12977
diff changeset
1539 socklen_t len;
2048
4ac8b9622c9e [gaim-migrate @ 2058]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1881
diff changeset
1540 int error = ETIMEDOUT;
3717
2fc0789e04e8 [gaim-migrate @ 3850]
Herman Bloggs <herman@bluedigits.com>
parents: 3630
diff changeset
1541
11033
dc68e074f10d [gaim-migrate @ 12919]
Etan Reisner <deryni@pidgin.im>
parents: 10917
diff changeset
1542 gaim_debug_info("socks4 proxy", "Connected.\n");
5211
94d9756c381f [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
1543
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1544 if (phb->inpa > 0)
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
1545 gaim_input_remove(phb->inpa);
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1546
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1547 len = sizeof(error);
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1548
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1549 if (getsockopt(source, SOL_SOCKET, SO_ERROR, &error, &len) < 0) {
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1550 close(source);
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1551
9129
9510867e614f [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1552 try_connect(phb);
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1553 return;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1554 }
3717
2fc0789e04e8 [gaim-migrate @ 3850]
Herman Bloggs <herman@bluedigits.com>
parents: 3630
diff changeset
1555
10561
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1556 /*
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1557 * The socks4 spec doesn't include support for doing host name
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1558 * lookups by the proxy. Some socks4 servers do this via
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1559 * extensions to the protocol. Since we don't know if a
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1560 * server supports this, it would need to be implemented
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1561 * with an option, or some detection mechanism - in the
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1562 * meantime, stick with plain old SOCKS4.
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1563 */
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1564 if (!(hp = gethostbyname(phb->host))) {
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1565 close(source);
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1566
9129
9510867e614f [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1567 try_connect(phb);
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1568 return;
1087
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
1569 }
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
1570
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1571 packet[0] = 4;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1572 packet[1] = 1;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1573 packet[2] = phb->port >> 8;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1574 packet[3] = phb->port & 0xff;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1575 packet[4] = (unsigned char)(hp->h_addr_list[0])[0];
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1576 packet[5] = (unsigned char)(hp->h_addr_list[0])[1];
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1577 packet[6] = (unsigned char)(hp->h_addr_list[0])[2];
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1578 packet[7] = (unsigned char)(hp->h_addr_list[0])[3];
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1579 packet[8] = 0;
3717
2fc0789e04e8 [gaim-migrate @ 3850]
Herman Bloggs <herman@bluedigits.com>
parents: 3630
diff changeset
1580
13387
c6be7551b0a6 [gaim-migrate @ 15759]
Mark Doliner <markdoliner@pidgin.im>
parents: 13313
diff changeset
1581 phb->write_buffer = g_memdup(packet, sizeof(packet));
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1582 phb->write_buf_len = sizeof(packet);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1583 phb->written_len = 0;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1584 phb->read_cb = s4_canread;
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1585
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1586 phb->inpa = gaim_input_add(source, GAIM_INPUT_WRITE, proxy_do_write, phb);
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1587
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1588 proxy_do_write(phb, source, cond);
1
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
1589 }
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
1590
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1591 static int
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1592 proxy_connect_socks4(struct PHB *phb, struct sockaddr *addr, socklen_t addrlen)
1
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
1593 {
1087
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
1594 int fd = -1;
1
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
1595
10309
073906008cb2 [gaim-migrate @ 11501]
Mark Doliner <markdoliner@pidgin.im>
parents: 10307
diff changeset
1596 gaim_debug_info("socks4 proxy",
5211
94d9756c381f [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
1597 "Connecting to %s:%d via %s:%d using SOCKS4\n",
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1598 phb->host, phb->port,
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1599 gaim_proxy_info_get_host(phb->gpi),
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1600 gaim_proxy_info_get_port(phb->gpi));
1
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
1601
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1602 if ((fd = socket(addr->sa_family, SOCK_STREAM, 0)) < 0)
1087
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
1603 return -1;
1
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
1604
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1605 fcntl(fd, F_SETFL, O_NONBLOCK);
10172
8400788b226c [gaim-migrate @ 11275]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10170
diff changeset
1606 #ifndef _WIN32
10170
4ea971904ef5 [gaim-migrate @ 11262]
Ethan Blanton <elb@pidgin.im>
parents: 10087
diff changeset
1607 fcntl(fd, F_SETFD, FD_CLOEXEC);
10172
8400788b226c [gaim-migrate @ 11275]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10170
diff changeset
1608 #endif
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1609
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1610 if (connect(fd, addr, addrlen) < 0) {
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1611 if ((errno == EINPROGRESS) || (errno == EINTR)) {
10309
073906008cb2 [gaim-migrate @ 11501]
Mark Doliner <markdoliner@pidgin.im>
parents: 10307
diff changeset
1612 gaim_debug_warning("socks4 proxy",
5211
94d9756c381f [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
1613 "Connect would have blocked.\n");
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
1614 phb->inpa = gaim_input_add(fd, GAIM_INPUT_WRITE, s4_canwrite, phb);
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1615 }
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1616 else {
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1617 close(fd);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1618 return -1;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1619 }
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1620 } else {
12991
919acda94433 [gaim-migrate @ 15344]
Tim Mooney
parents: 12977
diff changeset
1621 socklen_t len;
2048
4ac8b9622c9e [gaim-migrate @ 2058]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1881
diff changeset
1622 int error = ETIMEDOUT;
3717
2fc0789e04e8 [gaim-migrate @ 3850]
Herman Bloggs <herman@bluedigits.com>
parents: 3630
diff changeset
1623
10309
073906008cb2 [gaim-migrate @ 11501]
Mark Doliner <markdoliner@pidgin.im>
parents: 10307
diff changeset
1624 gaim_debug_misc("socks4 proxy",
5211
94d9756c381f [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
1625 "Connect didn't block.\n");
94d9756c381f [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
1626
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1627 len = sizeof(error);
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1628
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1629 if (getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &len) < 0) {
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1630 close(fd);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1631 return -1;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1632 }
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1633
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
1634 s4_canwrite(phb, fd, GAIM_INPUT_WRITE);
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1635 }
670
1690e6b432ae [gaim-migrate @ 680]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 664
diff changeset
1636
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1637 return fd;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1638 }
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1639
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1640 static void
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1641 s5_canread_again(gpointer data, gint source, GaimInputCondition cond)
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1642 {
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1643 guchar *dest, *buf;
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1644 struct PHB *phb = data;
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1645 int len;
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1646
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1647 if (phb->read_buffer == NULL) {
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1648 phb->read_buf_len = 512;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1649 phb->read_buffer = g_malloc(phb->read_buf_len);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1650 phb->read_len = 0;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1651 }
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1652
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1653 dest = phb->read_buffer + phb->read_len;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1654 buf = phb->read_buffer;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1655
10309
073906008cb2 [gaim-migrate @ 11501]
Mark Doliner <markdoliner@pidgin.im>
parents: 10307
diff changeset
1656 gaim_debug_info("socks5 proxy", "Able to read again.\n");
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1657
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1658 len = read(source, dest, (phb->read_buf_len - phb->read_len));
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1659 if(len < 0 && errno == EAGAIN)
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1660 return;
13788
019bc2080927 [gaim-migrate @ 16198]
Daniel Atallah <datallah@pidgin.im>
parents: 13754
diff changeset
1661 else if(len <= 0) {
10309
073906008cb2 [gaim-migrate @ 11501]
Mark Doliner <markdoliner@pidgin.im>
parents: 10307
diff changeset
1662 gaim_debug_warning("socks5 proxy", "or not...\n");
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1663 close(source);
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1664 gaim_input_remove(phb->inpa);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1665 g_free(phb->read_buffer);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1666 phb->read_buffer = NULL;
9129
9510867e614f [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1667 try_connect(phb);
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1668 return;
1087
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
1669 }
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1670 phb->read_len += len;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1671
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1672 if(phb->read_len < 4)
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1673 return;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1674
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1675 if ((buf[0] != 0x05) || (buf[1] != 0x00)) {
7982
db8c1b6137eb [gaim-migrate @ 8659]
Gavan Fantom <gavan@users.sourceforge.net>
parents: 7834
diff changeset
1676 if ((buf[0] == 0x05) && (buf[1] < 0x09))
10309
073906008cb2 [gaim-migrate @ 11501]
Mark Doliner <markdoliner@pidgin.im>
parents: 10307
diff changeset
1677 gaim_debug_error("socks5 proxy", socks5errors[buf[1]]);
7982
db8c1b6137eb [gaim-migrate @ 8659]
Gavan Fantom <gavan@users.sourceforge.net>
parents: 7834
diff changeset
1678 else
10309
073906008cb2 [gaim-migrate @ 11501]
Mark Doliner <markdoliner@pidgin.im>
parents: 10307
diff changeset
1679 gaim_debug_error("socks5 proxy", "Bad data.\n");
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1680 close(source);
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1681 gaim_input_remove(phb->inpa);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1682 g_free(phb->read_buffer);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1683 phb->read_buffer = NULL;
9129
9510867e614f [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1684 try_connect(phb);
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1685 return;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1686 }
670
1690e6b432ae [gaim-migrate @ 680]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 664
diff changeset
1687
8262
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1688 /* Skip past BND.ADDR */
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1689 switch(buf[3]) {
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1690 case 0x01: /* the address is a version-4 IP address, with a length of 4 octets */
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1691 if(phb->read_len < 4 + 4)
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1692 return;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1693 buf += 4 + 4;
8262
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1694 break;
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1695 case 0x03: /* the address field contains a fully-qualified domain name. The first
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1696 octet of the address field contains the number of octets of name that
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1697 follow, there is no terminating NUL octet. */
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1698 if(phb->read_len < 4 + 1)
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1699 return;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1700 buf += 4 + 1;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1701 if(phb->read_len < 4 + 1 + buf[0])
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1702 return;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1703 buf += buf[0];
8262
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1704 break;
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1705 case 0x04: /* the address is a version-6 IP address, with a length of 16 octets */
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1706 if(phb->read_len < 4 + 16)
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1707 return;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1708 buf += 4 + 16;
8262
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1709 break;
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1710 }
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1711
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1712 if(phb->read_len < (buf - phb->read_buffer) + 2)
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1713 return;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1714
8262
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1715 /* Skip past BND.PORT */
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1716 buf += 2;
8262
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1717
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1718 if (phb->account == NULL ||
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1719 gaim_account_get_connection(phb->account) != NULL) {
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1720
4993
33aee03d1e24 [gaim-migrate @ 5328]
Nathan Walp <nwalp@pidgin.im>
parents: 4679
diff changeset
1721 phb->func(phb->data, source, GAIM_INPUT_READ);
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1722 }
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1723
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1724 gaim_input_remove(phb->inpa);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1725 g_free(phb->read_buffer);
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1726 g_free(phb->host);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1727 g_free(phb);
1
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
1728 }
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
1729
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1730 static void
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1731 s5_sendconnect(gpointer data, gint source)
1087
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
1732 {
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1733 struct PHB *phb = data;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1734 int hlen = strlen(phb->host);
13754
2cf98ca202fc [gaim-migrate @ 16163]
Greg <gonufer@users.sourceforge.net>
parents: 13700
diff changeset
1735 phb->write_buf_len = 5 + hlen + 2;
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1736 phb->write_buffer = g_malloc(phb->write_buf_len);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1737 phb->written_len = 0;
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1738
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1739 phb->write_buffer[0] = 0x05;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1740 phb->write_buffer[1] = 0x01; /* CONNECT */
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1741 phb->write_buffer[2] = 0x00; /* reserved */
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1742 phb->write_buffer[3] = 0x03; /* address type -- host name */
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1743 phb->write_buffer[4] = hlen;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1744 memcpy(phb->write_buffer + 5, phb->host, hlen);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1745 phb->write_buffer[5 + hlen] = phb->port >> 8;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1746 phb->write_buffer[5 + hlen + 1] = phb->port & 0xff;
1087
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
1747
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1748 phb->read_cb = s5_canread_again;
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1749
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1750 phb->inpa = gaim_input_add(source, GAIM_INPUT_WRITE, proxy_do_write, phb);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1751 proxy_do_write(phb, source, GAIM_INPUT_WRITE);
1087
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
1752
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1753 }
1087
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
1754
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1755 static void
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1756 s5_readauth(gpointer data, gint source, GaimInputCondition cond)
1844
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
1757 {
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
1758 struct PHB *phb = data;
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1759 int len;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1760
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1761 if (phb->read_buffer == NULL) {
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1762 phb->read_buf_len = 2;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1763 phb->read_buffer = g_malloc(phb->read_buf_len);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1764 phb->read_len = 0;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1765 }
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1766
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1767 gaim_debug_info("socks5 proxy", "Got auth response.\n");
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1768
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1769 len = read(source, phb->read_buffer + phb->read_len,
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1770 phb->read_buf_len - phb->read_len);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1771 if(len < 0 && errno == EAGAIN)
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1772 return;
13788
019bc2080927 [gaim-migrate @ 16198]
Daniel Atallah <datallah@pidgin.im>
parents: 13754
diff changeset
1773 else if(len <= 0) {
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1774 close(source);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1775 gaim_input_remove(phb->inpa);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1776 g_free(phb->read_buffer);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1777 phb->read_buffer = NULL;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1778 try_connect(phb);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1779 return;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1780 }
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1781 phb->read_len += len;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1782
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1783 if (phb->read_len < 2)
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1784 return;
1844
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
1785
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
1786 gaim_input_remove(phb->inpa);
1844
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
1787
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1788 if ((phb->read_buffer[0] != 0x01) || (phb->read_buffer[1] != 0x00)) {
1844
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
1789 close(source);
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1790 g_free(phb->read_buffer);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1791 phb->read_buffer = NULL;
9129
9510867e614f [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1792 try_connect(phb);
1844
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
1793 return;
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
1794 }
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
1795
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1796 g_free(phb->read_buffer);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1797 phb->read_buffer = NULL;
1844
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
1798
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
1799 s5_sendconnect(phb, source);
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
1800 }
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
1801
10561
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1802 static void hmacmd5_chap(const unsigned char * challenge, int challen, const char * passwd, unsigned char * response)
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1803 {
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10626
diff changeset
1804 GaimCipher *cipher;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10626
diff changeset
1805 GaimCipherContext *ctx;
10561
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1806 int i;
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1807 unsigned char Kxoripad[65];
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1808 unsigned char Kxoropad[65];
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1809 int pwlen;
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1810
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10626
diff changeset
1811 cipher = gaim_ciphers_find_cipher("md5");
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10626
diff changeset
1812 ctx = gaim_cipher_context_new(cipher, NULL);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10626
diff changeset
1813
12765
0c1580860d16 [gaim-migrate @ 15112]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 12758
diff changeset
1814 memset(Kxoripad,0,sizeof(Kxoripad));
0c1580860d16 [gaim-migrate @ 15112]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 12758
diff changeset
1815 memset(Kxoropad,0,sizeof(Kxoropad));
0c1580860d16 [gaim-migrate @ 15112]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 12758
diff changeset
1816
10561
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1817 pwlen=strlen(passwd);
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1818 if (pwlen>64) {
11183
be87fe695c93 [gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents: 11143
diff changeset
1819 gaim_cipher_context_append(ctx, (const guchar *)passwd, strlen(passwd));
12765
0c1580860d16 [gaim-migrate @ 15112]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 12758
diff changeset
1820 gaim_cipher_context_digest(ctx, sizeof(Kxoripad), Kxoripad, NULL);
10561
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1821 pwlen=16;
12765
0c1580860d16 [gaim-migrate @ 15112]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 12758
diff changeset
1822 } else {
0c1580860d16 [gaim-migrate @ 15112]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 12758
diff changeset
1823 memcpy(Kxoripad, passwd, pwlen);
10561
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1824 }
12765
0c1580860d16 [gaim-migrate @ 15112]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 12758
diff changeset
1825 memcpy(Kxoropad,Kxoripad,pwlen);
10561
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1826
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1827 for (i=0;i<64;i++) {
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1828 Kxoripad[i]^=0x36;
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1829 Kxoropad[i]^=0x5c;
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1830 }
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10626
diff changeset
1831
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10626
diff changeset
1832 gaim_cipher_context_reset(ctx, NULL);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10626
diff changeset
1833 gaim_cipher_context_append(ctx, Kxoripad, 64);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10626
diff changeset
1834 gaim_cipher_context_append(ctx, challenge, challen);
10687
5ac4b470bee8 [gaim-migrate @ 12235]
Etan Reisner <deryni@pidgin.im>
parents: 10684
diff changeset
1835 gaim_cipher_context_digest(ctx, sizeof(Kxoripad), Kxoripad, NULL);
10561
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1836
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10626
diff changeset
1837 gaim_cipher_context_reset(ctx, NULL);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10626
diff changeset
1838 gaim_cipher_context_append(ctx, Kxoropad, 64);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10626
diff changeset
1839 gaim_cipher_context_append(ctx, Kxoripad, 16);
12765
0c1580860d16 [gaim-migrate @ 15112]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 12758
diff changeset
1840 gaim_cipher_context_digest(ctx, 16, response, NULL);
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10626
diff changeset
1841
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10626
diff changeset
1842 gaim_cipher_context_destroy(ctx);
10561
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1843 }
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1844
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1845 static void
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1846 s5_readchap(gpointer data, gint source, GaimInputCondition cond)
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1847 {
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1848 guchar *cmdbuf, *buf;
10561
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1849 struct PHB *phb = data;
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1850 int len, navas, currentav;
10561
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1851
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1852 gaim_debug(GAIM_DEBUG_INFO, "socks5 proxy", "Got CHAP response.\n");
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1853
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1854 if (phb->read_buffer == NULL) {
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1855 phb->read_buf_len = 20;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1856 phb->read_buffer = g_malloc(phb->read_buf_len);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1857 phb->read_len = 0;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1858 }
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1859
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1860 len = read(source, phb->read_buffer + phb->read_len,
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1861 phb->read_buf_len - phb->read_len);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1862
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1863 if(len < 0 && errno == EAGAIN)
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1864 return;
13788
019bc2080927 [gaim-migrate @ 16198]
Daniel Atallah <datallah@pidgin.im>
parents: 13754
diff changeset
1865 else if(len <= 0) {
10561
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1866 close(source);
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1867 gaim_input_remove(phb->inpa);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1868 g_free(phb->read_buffer);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1869 phb->read_buffer = NULL;
10561
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1870 try_connect(phb);
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1871 return;
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1872 }
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1873 phb->read_len += len;
10561
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1874
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1875 if (phb->read_len < 2)
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1876 return;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1877
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1878 cmdbuf = phb->read_buffer;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1879
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1880 if (*cmdbuf != 0x01) {
10561
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1881 close(source);
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1882 gaim_input_remove(phb->inpa);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1883 g_free(phb->read_buffer);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1884 phb->read_buffer = NULL;
10561
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1885 try_connect(phb);
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1886 return;
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1887 }
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1888 cmdbuf++;
10561
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1889
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1890 navas = *cmdbuf;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1891 cmdbuf++;
10561
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1892
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1893 for (currentav = 0; currentav < navas; currentav++) {
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1894 if (phb->read_len - (cmdbuf - phb->read_buffer) < 2)
10561
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1895 return;
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1896 if (phb->read_len - (cmdbuf - phb->read_buffer) < cmdbuf[1])
10561
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1897 return;
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1898 buf = cmdbuf + 2;
10561
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1899 switch (cmdbuf[0]) {
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1900 case 0x00:
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1901 /* Did auth work? */
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1902 if (buf[0] == 0x00) {
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1903 gaim_input_remove(phb->inpa);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1904 g_free(phb->read_buffer);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1905 phb->read_buffer = NULL;
10561
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1906 /* Success */
10613
33c94d9a9e89 [gaim-migrate @ 12072]
Torrey McMahon <tmcmahon2@users.sourceforge.net>
parents: 10562
diff changeset
1907 s5_sendconnect(phb, source);
33c94d9a9e89 [gaim-migrate @ 12072]
Torrey McMahon <tmcmahon2@users.sourceforge.net>
parents: 10562
diff changeset
1908 return;
10561
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1909 } else {
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1910 /* Failure */
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1911 gaim_debug_warning("proxy",
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1912 "socks5 CHAP authentication "
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1913 "failed. Disconnecting...");
10561
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1914 close(source);
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1915 gaim_input_remove(phb->inpa);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1916 g_free(phb->read_buffer);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1917 phb->read_buffer = NULL;
10561
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1918 try_connect(phb);
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1919 return;
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1920 }
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1921 break;
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1922 case 0x03:
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1923 /* Server wants our credentials */
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1924
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1925 phb->write_buf_len = 16 + 4;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1926 phb->write_buffer = g_malloc(phb->write_buf_len);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1927 phb->written_len = 0;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1928
10561
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1929 hmacmd5_chap(buf, cmdbuf[1],
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1930 gaim_proxy_info_get_password(phb->gpi),
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1931 phb->write_buffer + 4);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1932 phb->write_buffer[0] = 0x01;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1933 phb->write_buffer[1] = 0x01;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1934 phb->write_buffer[2] = 0x04;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1935 phb->write_buffer[3] = 0x10;
10561
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1936
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1937 gaim_input_remove(phb->inpa);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1938 g_free(phb->read_buffer);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1939 phb->read_buffer = NULL;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1940
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1941 phb->read_cb = s5_readchap;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1942
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1943 phb->inpa = gaim_input_add(source,
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1944 GAIM_INPUT_WRITE, proxy_do_write, phb);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1945
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1946 proxy_do_write(phb, source, GAIM_INPUT_WRITE);
10561
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1947 break;
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1948 case 0x11:
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1949 /* Server wants to select an algorithm */
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1950 if (buf[0] != 0x85) {
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1951 /* Only currently support HMAC-MD5 */
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1952 gaim_debug_warning("proxy",
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1953 "Server tried to select an "
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1954 "algorithm that we did not advertise "
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1955 "as supporting. This is a violation "
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1956 "of the socks5 CHAP specification. "
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1957 "Disconnecting...");
10561
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1958 close(source);
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1959 gaim_input_remove(phb->inpa);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1960 g_free(phb->read_buffer);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1961 phb->read_buffer = NULL;
10561
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1962 try_connect(phb);
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1963 return;
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1964 }
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1965 break;
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1966 }
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1967 cmdbuf = buf + cmdbuf[1];
10561
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1968 }
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1969 /* Fell through. We ran out of CHAP events to process, but haven't
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1970 * succeeded or failed authentication - there may be more to come.
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1971 * If this is the case, come straight back here. */
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1972 }
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
1973
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1974 static void
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1975 s5_canread(gpointer data, gint source, GaimInputCondition cond)
1844
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
1976 {
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
1977 struct PHB *phb = data;
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1978 int len;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1979
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1980 if (phb->read_buffer == NULL) {
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1981 phb->read_buf_len = 2;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1982 phb->read_buffer = g_malloc(phb->read_buf_len);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1983 phb->read_len = 0;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1984 }
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1985
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1986 gaim_debug_info("socks5 proxy", "Able to read.\n");
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1987
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1988 len = read(source, phb->read_buffer + phb->read_len,
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1989 phb->read_buf_len - phb->read_len);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1990 if(len < 0 && errno == EAGAIN)
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1991 return;
13788
019bc2080927 [gaim-migrate @ 16198]
Daniel Atallah <datallah@pidgin.im>
parents: 13754
diff changeset
1992 else if(len <= 0) {
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1993 close(source);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1994 gaim_input_remove(phb->inpa);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1995 g_free(phb->read_buffer);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1996 phb->read_buffer = NULL;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1997 try_connect(phb);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1998 return;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
1999 }
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2000 phb->read_len += len;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2001
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2002 if (phb->read_len < 2)
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2003 return;
1844
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
2004
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
2005 gaim_input_remove(phb->inpa);
1844
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
2006
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2007 if ((phb->read_buffer[0] != 0x05) || (phb->read_buffer[1] == 0xff)) {
1844
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
2008 close(source);
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2009 g_free(phb->read_buffer);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2010 phb->read_buffer = NULL;
9129
9510867e614f [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
2011 try_connect(phb);
1844
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
2012 return;
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
2013 }
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
2014
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2015 if (phb->read_buffer[1] == 0x02) {
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2016 gsize i, j;
10912
ec7c127a435b [gaim-migrate @ 12667]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10711
diff changeset
2017 const char *u, *p;
9129
9510867e614f [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
2018
10912
ec7c127a435b [gaim-migrate @ 12667]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10711
diff changeset
2019 u = gaim_proxy_info_get_username(phb->gpi);
ec7c127a435b [gaim-migrate @ 12667]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10711
diff changeset
2020 p = gaim_proxy_info_get_password(phb->gpi);
ec7c127a435b [gaim-migrate @ 12667]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10711
diff changeset
2021
ec7c127a435b [gaim-migrate @ 12667]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10711
diff changeset
2022 i = (u == NULL) ? 0 : strlen(u);
ec7c127a435b [gaim-migrate @ 12667]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10711
diff changeset
2023 j = (p == NULL) ? 0 : strlen(p);
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2024
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2025 phb->write_buf_len = 1 + 1 + i + 1 + j;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2026 phb->write_buffer = g_malloc(phb->write_buf_len);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2027 phb->written_len = 0;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2028
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2029 phb->write_buffer[0] = 0x01; /* version 1 */
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2030 phb->write_buffer[1] = i;
10917
f32ea2da503b [gaim-migrate @ 12678]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10912
diff changeset
2031 if (u != NULL)
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2032 memcpy(phb->write_buffer + 2, u, i);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2033 phb->write_buffer[2 + i] = j;
10917
f32ea2da503b [gaim-migrate @ 12678]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10912
diff changeset
2034 if (p != NULL)
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2035 memcpy(phb->write_buffer + 2 + i + 1, p, j);
3717
2fc0789e04e8 [gaim-migrate @ 3850]
Herman Bloggs <herman@bluedigits.com>
parents: 3630
diff changeset
2036
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2037 g_free(phb->read_buffer);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2038 phb->read_buffer = NULL;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2039
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2040 phb->read_cb = s5_readauth;
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2041
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2042 phb->inpa = gaim_input_add(source, GAIM_INPUT_WRITE,
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2043 proxy_do_write, phb);
1844
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
2044
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2045 proxy_do_write(phb, source, GAIM_INPUT_WRITE);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2046
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2047 return;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2048 } else if (phb->read_buffer[1] == 0x03) {
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2049 gsize userlen;
10561
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
2050 userlen = strlen(gaim_proxy_info_get_username(phb->gpi));
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2051
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2052 phb->write_buf_len = 7 + userlen;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2053 phb->write_buffer = g_malloc(phb->write_buf_len);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2054 phb->written_len = 0;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2055
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2056 phb->write_buffer[0] = 0x01;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2057 phb->write_buffer[1] = 0x02;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2058 phb->write_buffer[2] = 0x11;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2059 phb->write_buffer[3] = 0x01;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2060 phb->write_buffer[4] = 0x85;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2061 phb->write_buffer[5] = 0x02;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2062 phb->write_buffer[6] = userlen;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2063 memcpy(phb->write_buffer + 7,
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2064 gaim_proxy_info_get_username(phb->gpi), userlen);
10561
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
2065
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2066 g_free(phb->read_buffer);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2067 phb->read_buffer = NULL;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2068
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2069 phb->read_cb = s5_readchap;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2070
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2071 phb->inpa = gaim_input_add(source, GAIM_INPUT_WRITE,
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2072 proxy_do_write, phb);
10561
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
2073
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2074 proxy_do_write(phb, source, GAIM_INPUT_WRITE);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2075
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2076 return;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2077 } else {
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2078 g_free(phb->read_buffer);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2079 phb->read_buffer = NULL;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2080
1844
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
2081 s5_sendconnect(phb, source);
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
2082 }
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
2083 }
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
2084
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2085 static void
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2086 s5_canwrite(gpointer data, gint source, GaimInputCondition cond)
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
2087 {
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2088 unsigned char buf[5];
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
2089 int i;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
2090 struct PHB *phb = data;
12991
919acda94433 [gaim-migrate @ 15344]
Tim Mooney
parents: 12977
diff changeset
2091 socklen_t len;
2048
4ac8b9622c9e [gaim-migrate @ 2058]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1881
diff changeset
2092 int error = ETIMEDOUT;
3717
2fc0789e04e8 [gaim-migrate @ 3850]
Herman Bloggs <herman@bluedigits.com>
parents: 3630
diff changeset
2093
10309
073906008cb2 [gaim-migrate @ 11501]
Mark Doliner <markdoliner@pidgin.im>
parents: 10307
diff changeset
2094 gaim_debug_info("socks5 proxy", "Connected.\n");
5211
94d9756c381f [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
2095
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
2096 if (phb->inpa > 0)
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
2097 gaim_input_remove(phb->inpa);
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2098
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
2099 len = sizeof(error);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
2100 if (getsockopt(source, SOL_SOCKET, SO_ERROR, &error, &len) < 0) {
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
2101 close(source);
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2102
9129
9510867e614f [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
2103 try_connect(phb);
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
2104 return;
1087
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
2105 }
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
2106
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
2107 i = 0;
1252
94fbface2d84 [gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1087
diff changeset
2108 buf[0] = 0x05; /* SOCKS version 5 */
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2109
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2110 if (gaim_proxy_info_get_username(phb->gpi) != NULL) {
10561
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
2111 buf[1] = 0x03; /* three methods */
1844
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
2112 buf[2] = 0x00; /* no authentication */
10561
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
2113 buf[3] = 0x03; /* CHAP authentication */
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
2114 buf[4] = 0x02; /* username/password authentication */
948b707577e9 [gaim-migrate @ 11939]
Malcolm Smith
parents: 10534
diff changeset
2115 i = 5;
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2116 }
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2117 else {
1844
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
2118 buf[1] = 0x01;
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
2119 buf[2] = 0x00;
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
2120 i = 3;
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
2121 }
3717
2fc0789e04e8 [gaim-migrate @ 3850]
Herman Bloggs <herman@bluedigits.com>
parents: 3630
diff changeset
2122
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2123 phb->write_buf_len = i;
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2124 phb->write_buffer = g_malloc(phb->write_buf_len);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2125 memcpy(phb->write_buffer, buf, i);
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2126
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2127 phb->read_cb = s5_canread;
1087
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
2128
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2129 phb->inpa = gaim_input_add(source, GAIM_INPUT_WRITE, proxy_do_write, phb);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2130 proxy_do_write(phb, source, GAIM_INPUT_WRITE);
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
2131 }
1087
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
2132
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2133 static int
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2134 proxy_connect_socks5(struct PHB *phb, struct sockaddr *addr, socklen_t addrlen)
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
2135 {
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
2136 int fd = -1;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
2137
10309
073906008cb2 [gaim-migrate @ 11501]
Mark Doliner <markdoliner@pidgin.im>
parents: 10307
diff changeset
2138 gaim_debug_info("socks5 proxy",
5211
94d9756c381f [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
2139 "Connecting to %s:%d via %s:%d using SOCKS5\n",
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2140 phb->host, phb->port,
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2141 gaim_proxy_info_get_host(phb->gpi),
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2142 gaim_proxy_info_get_port(phb->gpi));
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
2143
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2144 if ((fd = socket(addr->sa_family, SOCK_STREAM, 0)) < 0)
1087
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
2145 return -1;
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
2146
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
2147 fcntl(fd, F_SETFL, O_NONBLOCK);
10172
8400788b226c [gaim-migrate @ 11275]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10170
diff changeset
2148 #ifndef _WIN32
10170
4ea971904ef5 [gaim-migrate @ 11262]
Ethan Blanton <elb@pidgin.im>
parents: 10087
diff changeset
2149 fcntl(fd, F_SETFD, FD_CLOEXEC);
10172
8400788b226c [gaim-migrate @ 11275]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10170
diff changeset
2150 #endif
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2151
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
2152 if (connect(fd, addr, addrlen) < 0) {
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
2153 if ((errno == EINPROGRESS) || (errno == EINTR)) {
10309
073906008cb2 [gaim-migrate @ 11501]
Mark Doliner <markdoliner@pidgin.im>
parents: 10307
diff changeset
2154 gaim_debug_warning("socks5 proxy",
5211
94d9756c381f [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
2155 "Connect would have blocked.\n");
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2156
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
2157 phb->inpa = gaim_input_add(fd, GAIM_INPUT_WRITE, s5_canwrite, phb);
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2158 }
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2159 else {
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
2160 close(fd);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
2161 return -1;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
2162 }
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2163 }
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2164 else {
12991
919acda94433 [gaim-migrate @ 15344]
Tim Mooney
parents: 12977
diff changeset
2165 socklen_t len;
2048
4ac8b9622c9e [gaim-migrate @ 2058]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1881
diff changeset
2166 int error = ETIMEDOUT;
3717
2fc0789e04e8 [gaim-migrate @ 3850]
Herman Bloggs <herman@bluedigits.com>
parents: 3630
diff changeset
2167
10309
073906008cb2 [gaim-migrate @ 11501]
Mark Doliner <markdoliner@pidgin.im>
parents: 10307
diff changeset
2168 gaim_debug_misc("socks5 proxy",
5211
94d9756c381f [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
2169 "Connect didn't block.\n");
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2170
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
2171 len = sizeof(error);
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2172
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
2173 if (getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &len) < 0) {
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
2174 close(fd);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
2175 return -1;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
2176 }
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2177
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
2178 s5_canwrite(phb, fd, GAIM_INPUT_WRITE);
1087
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
2179 }
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
2180
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
2181 return fd;
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
2182 }
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
2183
9129
9510867e614f [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
2184 static void try_connect(struct PHB *phb)
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
2185 {
4678
4fe99bee3ecc [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
2186 size_t addrlen;
4fe99bee3ecc [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
2187 struct sockaddr *addr;
4fe99bee3ecc [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
2188 int ret = -1;
4634
c4318fc60090 [gaim-migrate @ 4941]
Nathan Walp <nwalp@pidgin.im>
parents: 4499
diff changeset
2189
9129
9510867e614f [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
2190 while (phb->hosts) {
9510867e614f [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
2191 addrlen = GPOINTER_TO_INT(phb->hosts->data);
9510867e614f [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
2192 phb->hosts = g_slist_remove(phb->hosts, phb->hosts->data);
9510867e614f [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
2193 addr = phb->hosts->data;
9510867e614f [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
2194 phb->hosts = g_slist_remove(phb->hosts, phb->hosts->data);
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
2195
9129
9510867e614f [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
2196 switch (gaim_proxy_info_get_type(phb->gpi)) {
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2197 case GAIM_PROXY_NONE:
4678
4fe99bee3ecc [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
2198 ret = proxy_connect_none(phb, addr, addrlen);
4fe99bee3ecc [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
2199 break;
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2200
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2201 case GAIM_PROXY_HTTP:
4678
4fe99bee3ecc [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
2202 ret = proxy_connect_http(phb, addr, addrlen);
4fe99bee3ecc [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
2203 break;
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2204
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2205 case GAIM_PROXY_SOCKS4:
4678
4fe99bee3ecc [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
2206 ret = proxy_connect_socks4(phb, addr, addrlen);
4fe99bee3ecc [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
2207 break;
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2208
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2209 case GAIM_PROXY_SOCKS5:
4678
4fe99bee3ecc [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
2210 ret = proxy_connect_socks5(phb, addr, addrlen);
4fe99bee3ecc [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
2211 break;
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2212
6621
2a18ef3e5224 [gaim-migrate @ 7145]
Robert McQueen <robot101@debian.org>
parents: 6320
diff changeset
2213 case GAIM_PROXY_USE_ENVVAR:
2a18ef3e5224 [gaim-migrate @ 7145]
Robert McQueen <robot101@debian.org>
parents: 6320
diff changeset
2214 ret = proxy_connect_http(phb, addr, addrlen);
2a18ef3e5224 [gaim-migrate @ 7145]
Robert McQueen <robot101@debian.org>
parents: 6320
diff changeset
2215 break;
2a18ef3e5224 [gaim-migrate @ 7145]
Robert McQueen <robot101@debian.org>
parents: 6320
diff changeset
2216
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2217 default:
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2218 break;
4678
4fe99bee3ecc [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
2219 }
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2220
9129
9510867e614f [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
2221 g_free(addr);
9510867e614f [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
2222
4678
4fe99bee3ecc [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
2223 if (ret > 0)
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
2224 break;
4678
4fe99bee3ecc [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
2225 }
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2226
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2227 if (ret < 0) {
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2228 if (phb->account == NULL ||
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2229 gaim_account_get_connection(phb->account) != NULL) {
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2230
4993
33aee03d1e24 [gaim-migrate @ 5328]
Nathan Walp <nwalp@pidgin.im>
parents: 4679
diff changeset
2231 phb->func(phb->data, -1, GAIM_INPUT_READ);
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2232 }
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2233
4678
4fe99bee3ecc [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
2234 g_free(phb->host);
4fe99bee3ecc [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
2235 g_free(phb);
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
2236 }
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
2237 }
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
2238
9129
9510867e614f [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
2239 static void
9510867e614f [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
2240 connection_host_resolved(GSList *hosts, gpointer data,
9510867e614f [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
2241 const char *error_message)
9510867e614f [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
2242 {
9510867e614f [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
2243 struct PHB *phb = (struct PHB*)data;
9510867e614f [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
2244
9510867e614f [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
2245 phb->hosts = hosts;
9510867e614f [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
2246
9510867e614f [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
2247 try_connect(phb);
9510867e614f [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
2248 }
9510867e614f [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
2249
13515
0cea461e904c [gaim-migrate @ 15890]
Bartosz Oler <bartosz@pidgin.im>
parents: 13426
diff changeset
2250 GaimProxyInfo *
0cea461e904c [gaim-migrate @ 15890]
Bartosz Oler <bartosz@pidgin.im>
parents: 13426
diff changeset
2251 gaim_proxy_get_setup(GaimAccount *account)
1087
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
2252 {
13515
0cea461e904c [gaim-migrate @ 15890]
Bartosz Oler <bartosz@pidgin.im>
parents: 13426
diff changeset
2253 GaimProxyInfo *gpi;
6621
2a18ef3e5224 [gaim-migrate @ 7145]
Robert McQueen <robot101@debian.org>
parents: 6320
diff changeset
2254 const gchar *tmp;
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2255
11878
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
2256 if (account && gaim_account_get_proxy_info(account) != NULL)
13515
0cea461e904c [gaim-migrate @ 15890]
Bartosz Oler <bartosz@pidgin.im>
parents: 13426
diff changeset
2257 gpi = gaim_account_get_proxy_info(account);
11878
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
2258 else if (gaim_running_gnome())
13515
0cea461e904c [gaim-migrate @ 15890]
Bartosz Oler <bartosz@pidgin.im>
parents: 13426
diff changeset
2259 gpi = gaim_gnome_proxy_get_info();
11878
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11428
diff changeset
2260 else
13515
0cea461e904c [gaim-migrate @ 15890]
Bartosz Oler <bartosz@pidgin.im>
parents: 13426
diff changeset
2261 gpi = gaim_global_proxy_get_info();
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2262
13515
0cea461e904c [gaim-migrate @ 15890]
Bartosz Oler <bartosz@pidgin.im>
parents: 13426
diff changeset
2263 if (gaim_proxy_info_get_type(gpi) == GAIM_PROXY_USE_ENVVAR) {
6621
2a18ef3e5224 [gaim-migrate @ 7145]
Robert McQueen <robot101@debian.org>
parents: 6320
diff changeset
2264 if ((tmp = g_getenv("HTTP_PROXY")) != NULL ||
2a18ef3e5224 [gaim-migrate @ 7145]
Robert McQueen <robot101@debian.org>
parents: 6320
diff changeset
2265 (tmp = g_getenv("http_proxy")) != NULL ||
10534
c28eef1b882a [gaim-migrate @ 11866]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10320
diff changeset
2266 (tmp = g_getenv("HTTPPROXY")) != NULL) {
9227
95c28297b72c [gaim-migrate @ 10023]
Don Seiler <rizzo@gentoo.org>
parents: 9148
diff changeset
2267 char *proxyhost,*proxypath,*proxyuser,*proxypasswd;
7652
d60ba2565661 [gaim-migrate @ 8296]
Björn Voigt <bjoern@cs.tu-berlin.de>
parents: 7475
diff changeset
2268 int proxyport;
6621
2a18ef3e5224 [gaim-migrate @ 7145]
Robert McQueen <robot101@debian.org>
parents: 6320
diff changeset
2269
9129
9510867e614f [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
2270 /* http_proxy-format:
9227
95c28297b72c [gaim-migrate @ 10023]
Don Seiler <rizzo@gentoo.org>
parents: 9148
diff changeset
2271 * export http_proxy="http://user:passwd@your.proxy.server:port/"
7652
d60ba2565661 [gaim-migrate @ 8296]
Björn Voigt <bjoern@cs.tu-berlin.de>
parents: 7475
diff changeset
2272 */
9227
95c28297b72c [gaim-migrate @ 10023]
Don Seiler <rizzo@gentoo.org>
parents: 9148
diff changeset
2273 if(gaim_url_parse(tmp, &proxyhost, &proxyport, &proxypath, &proxyuser, &proxypasswd)) {
13515
0cea461e904c [gaim-migrate @ 15890]
Bartosz Oler <bartosz@pidgin.im>
parents: 13426
diff changeset
2274 gaim_proxy_info_set_host(gpi, proxyhost);
7652
d60ba2565661 [gaim-migrate @ 8296]
Björn Voigt <bjoern@cs.tu-berlin.de>
parents: 7475
diff changeset
2275 g_free(proxyhost);
d60ba2565661 [gaim-migrate @ 8296]
Björn Voigt <bjoern@cs.tu-berlin.de>
parents: 7475
diff changeset
2276 g_free(proxypath);
9227
95c28297b72c [gaim-migrate @ 10023]
Don Seiler <rizzo@gentoo.org>
parents: 9148
diff changeset
2277 if (proxyuser != NULL) {
13515
0cea461e904c [gaim-migrate @ 15890]
Bartosz Oler <bartosz@pidgin.im>
parents: 13426
diff changeset
2278 gaim_proxy_info_set_username(gpi, proxyuser);
9227
95c28297b72c [gaim-migrate @ 10023]
Don Seiler <rizzo@gentoo.org>
parents: 9148
diff changeset
2279 g_free(proxyuser);
95c28297b72c [gaim-migrate @ 10023]
Don Seiler <rizzo@gentoo.org>
parents: 9148
diff changeset
2280 }
95c28297b72c [gaim-migrate @ 10023]
Don Seiler <rizzo@gentoo.org>
parents: 9148
diff changeset
2281 if (proxypasswd != NULL) {
13515
0cea461e904c [gaim-migrate @ 15890]
Bartosz Oler <bartosz@pidgin.im>
parents: 13426
diff changeset
2282 gaim_proxy_info_set_password(gpi, proxypasswd);
9227
95c28297b72c [gaim-migrate @ 10023]
Don Seiler <rizzo@gentoo.org>
parents: 9148
diff changeset
2283 g_free(proxypasswd);
95c28297b72c [gaim-migrate @ 10023]
Don Seiler <rizzo@gentoo.org>
parents: 9148
diff changeset
2284 }
7652
d60ba2565661 [gaim-migrate @ 8296]
Björn Voigt <bjoern@cs.tu-berlin.de>
parents: 7475
diff changeset
2285
d60ba2565661 [gaim-migrate @ 8296]
Björn Voigt <bjoern@cs.tu-berlin.de>
parents: 7475
diff changeset
2286 /* only for backward compatibility */
9129
9510867e614f [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
2287 if (proxyport == 80 &&
7652
d60ba2565661 [gaim-migrate @ 8296]
Björn Voigt <bjoern@cs.tu-berlin.de>
parents: 7475
diff changeset
2288 ((tmp = g_getenv("HTTP_PROXY_PORT")) != NULL ||
d60ba2565661 [gaim-migrate @ 8296]
Björn Voigt <bjoern@cs.tu-berlin.de>
parents: 7475
diff changeset
2289 (tmp = g_getenv("http_proxy_port")) != NULL ||
d60ba2565661 [gaim-migrate @ 8296]
Björn Voigt <bjoern@cs.tu-berlin.de>
parents: 7475
diff changeset
2290 (tmp = g_getenv("HTTPPROXYPORT")) != NULL))
d60ba2565661 [gaim-migrate @ 8296]
Björn Voigt <bjoern@cs.tu-berlin.de>
parents: 7475
diff changeset
2291 proxyport = atoi(tmp);
9129
9510867e614f [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
2292
13515
0cea461e904c [gaim-migrate @ 15890]
Bartosz Oler <bartosz@pidgin.im>
parents: 13426
diff changeset
2293 gaim_proxy_info_set_port(gpi, proxyport);
7652
d60ba2565661 [gaim-migrate @ 8296]
Björn Voigt <bjoern@cs.tu-berlin.de>
parents: 7475
diff changeset
2294 }
10534
c28eef1b882a [gaim-migrate @ 11866]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10320
diff changeset
2295 } else {
c28eef1b882a [gaim-migrate @ 11866]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10320
diff changeset
2296 /* no proxy environment variable found, don't use a proxy */
c28eef1b882a [gaim-migrate @ 11866]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10320
diff changeset
2297 gaim_debug_info("proxy", "No environment settings found, not using a proxy\n");
13515
0cea461e904c [gaim-migrate @ 15890]
Bartosz Oler <bartosz@pidgin.im>
parents: 13426
diff changeset
2298 gaim_proxy_info_set_type(gpi, GAIM_PROXY_NONE);
6621
2a18ef3e5224 [gaim-migrate @ 7145]
Robert McQueen <robot101@debian.org>
parents: 6320
diff changeset
2299 }
2a18ef3e5224 [gaim-migrate @ 7145]
Robert McQueen <robot101@debian.org>
parents: 6320
diff changeset
2300
9227
95c28297b72c [gaim-migrate @ 10023]
Don Seiler <rizzo@gentoo.org>
parents: 9148
diff changeset
2301 /* XXX: Do we want to skip this step if user/password were part of url? */
6621
2a18ef3e5224 [gaim-migrate @ 7145]
Robert McQueen <robot101@debian.org>
parents: 6320
diff changeset
2302 if ((tmp = g_getenv("HTTP_PROXY_USER")) != NULL ||
2a18ef3e5224 [gaim-migrate @ 7145]
Robert McQueen <robot101@debian.org>
parents: 6320
diff changeset
2303 (tmp = g_getenv("http_proxy_user")) != NULL ||
2a18ef3e5224 [gaim-migrate @ 7145]
Robert McQueen <robot101@debian.org>
parents: 6320
diff changeset
2304 (tmp = g_getenv("HTTPPROXYUSER")) != NULL)
13515
0cea461e904c [gaim-migrate @ 15890]
Bartosz Oler <bartosz@pidgin.im>
parents: 13426
diff changeset
2305 gaim_proxy_info_set_username(gpi, tmp);
6621
2a18ef3e5224 [gaim-migrate @ 7145]
Robert McQueen <robot101@debian.org>
parents: 6320
diff changeset
2306
2a18ef3e5224 [gaim-migrate @ 7145]
Robert McQueen <robot101@debian.org>
parents: 6320
diff changeset
2307 if ((tmp = g_getenv("HTTP_PROXY_PASS")) != NULL ||
2a18ef3e5224 [gaim-migrate @ 7145]
Robert McQueen <robot101@debian.org>
parents: 6320
diff changeset
2308 (tmp = g_getenv("http_proxy_pass")) != NULL ||
2a18ef3e5224 [gaim-migrate @ 7145]
Robert McQueen <robot101@debian.org>
parents: 6320
diff changeset
2309 (tmp = g_getenv("HTTPPROXYPASS")) != NULL)
13515
0cea461e904c [gaim-migrate @ 15890]
Bartosz Oler <bartosz@pidgin.im>
parents: 13426
diff changeset
2310 gaim_proxy_info_set_password(gpi, tmp);
6621
2a18ef3e5224 [gaim-migrate @ 7145]
Robert McQueen <robot101@debian.org>
parents: 6320
diff changeset
2311 }
2a18ef3e5224 [gaim-migrate @ 7145]
Robert McQueen <robot101@debian.org>
parents: 6320
diff changeset
2312
13515
0cea461e904c [gaim-migrate @ 15890]
Bartosz Oler <bartosz@pidgin.im>
parents: 13426
diff changeset
2313 return gpi;
0cea461e904c [gaim-migrate @ 15890]
Bartosz Oler <bartosz@pidgin.im>
parents: 13426
diff changeset
2314 }
0cea461e904c [gaim-migrate @ 15890]
Bartosz Oler <bartosz@pidgin.im>
parents: 13426
diff changeset
2315
14030
23144f1dc950 [gaim-migrate @ 16525]
Mark Doliner <markdoliner@pidgin.im>
parents: 13991
diff changeset
2316 /*
23144f1dc950 [gaim-migrate @ 16525]
Mark Doliner <markdoliner@pidgin.im>
parents: 13991
diff changeset
2317 * TODO: It would be really good if this returned some sort of handle
23144f1dc950 [gaim-migrate @ 16525]
Mark Doliner <markdoliner@pidgin.im>
parents: 13991
diff changeset
2318 * that we could use to cancel the connection. As it is now,
23144f1dc950 [gaim-migrate @ 16525]
Mark Doliner <markdoliner@pidgin.im>
parents: 13991
diff changeset
2319 * each callback has to check to make sure gc is still valid.
23144f1dc950 [gaim-migrate @ 16525]
Mark Doliner <markdoliner@pidgin.im>
parents: 13991
diff changeset
2320 * And that is ugly.
23144f1dc950 [gaim-migrate @ 16525]
Mark Doliner <markdoliner@pidgin.im>
parents: 13991
diff changeset
2321 */
13515
0cea461e904c [gaim-migrate @ 15890]
Bartosz Oler <bartosz@pidgin.im>
parents: 13426
diff changeset
2322 int
0cea461e904c [gaim-migrate @ 15890]
Bartosz Oler <bartosz@pidgin.im>
parents: 13426
diff changeset
2323 gaim_proxy_connect(GaimAccount *account, const char *host, int port,
0cea461e904c [gaim-migrate @ 15890]
Bartosz Oler <bartosz@pidgin.im>
parents: 13426
diff changeset
2324 GaimInputFunction func, gpointer data)
0cea461e904c [gaim-migrate @ 15890]
Bartosz Oler <bartosz@pidgin.im>
parents: 13426
diff changeset
2325 {
0cea461e904c [gaim-migrate @ 15890]
Bartosz Oler <bartosz@pidgin.im>
parents: 13426
diff changeset
2326 const char *connecthost = host;
0cea461e904c [gaim-migrate @ 15890]
Bartosz Oler <bartosz@pidgin.im>
parents: 13426
diff changeset
2327 int connectport = port;
0cea461e904c [gaim-migrate @ 15890]
Bartosz Oler <bartosz@pidgin.im>
parents: 13426
diff changeset
2328 struct PHB *phb;
0cea461e904c [gaim-migrate @ 15890]
Bartosz Oler <bartosz@pidgin.im>
parents: 13426
diff changeset
2329
0cea461e904c [gaim-migrate @ 15890]
Bartosz Oler <bartosz@pidgin.im>
parents: 13426
diff changeset
2330 g_return_val_if_fail(host != NULL, -1);
0cea461e904c [gaim-migrate @ 15890]
Bartosz Oler <bartosz@pidgin.im>
parents: 13426
diff changeset
2331 g_return_val_if_fail(port != 0 && port != -1, -1);
0cea461e904c [gaim-migrate @ 15890]
Bartosz Oler <bartosz@pidgin.im>
parents: 13426
diff changeset
2332 g_return_val_if_fail(func != NULL, -1);
0cea461e904c [gaim-migrate @ 15890]
Bartosz Oler <bartosz@pidgin.im>
parents: 13426
diff changeset
2333
0cea461e904c [gaim-migrate @ 15890]
Bartosz Oler <bartosz@pidgin.im>
parents: 13426
diff changeset
2334 phb = g_new0(struct PHB, 1);
0cea461e904c [gaim-migrate @ 15890]
Bartosz Oler <bartosz@pidgin.im>
parents: 13426
diff changeset
2335
0cea461e904c [gaim-migrate @ 15890]
Bartosz Oler <bartosz@pidgin.im>
parents: 13426
diff changeset
2336 phb->func = func;
0cea461e904c [gaim-migrate @ 15890]
Bartosz Oler <bartosz@pidgin.im>
parents: 13426
diff changeset
2337 phb->data = data;
0cea461e904c [gaim-migrate @ 15890]
Bartosz Oler <bartosz@pidgin.im>
parents: 13426
diff changeset
2338 phb->host = g_strdup(host);
0cea461e904c [gaim-migrate @ 15890]
Bartosz Oler <bartosz@pidgin.im>
parents: 13426
diff changeset
2339 phb->port = port;
0cea461e904c [gaim-migrate @ 15890]
Bartosz Oler <bartosz@pidgin.im>
parents: 13426
diff changeset
2340 phb->account = account;
0cea461e904c [gaim-migrate @ 15890]
Bartosz Oler <bartosz@pidgin.im>
parents: 13426
diff changeset
2341 phb->gpi = gaim_proxy_get_setup(account);
0cea461e904c [gaim-migrate @ 15890]
Bartosz Oler <bartosz@pidgin.im>
parents: 13426
diff changeset
2342
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2343 if ((gaim_proxy_info_get_type(phb->gpi) != GAIM_PROXY_NONE) &&
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2344 (gaim_proxy_info_get_host(phb->gpi) == NULL ||
6621
2a18ef3e5224 [gaim-migrate @ 7145]
Robert McQueen <robot101@debian.org>
parents: 6320
diff changeset
2345 gaim_proxy_info_get_port(phb->gpi) <= 0)) {
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2346
6621
2a18ef3e5224 [gaim-migrate @ 7145]
Robert McQueen <robot101@debian.org>
parents: 6320
diff changeset
2347 gaim_notify_error(NULL, NULL, _("Invalid proxy settings"), _("Either the host name or port number specified for your given proxy type is invalid."));
2a18ef3e5224 [gaim-migrate @ 7145]
Robert McQueen <robot101@debian.org>
parents: 6320
diff changeset
2348 g_free(phb->host);
2a18ef3e5224 [gaim-migrate @ 7145]
Robert McQueen <robot101@debian.org>
parents: 6320
diff changeset
2349 g_free(phb);
2a18ef3e5224 [gaim-migrate @ 7145]
Robert McQueen <robot101@debian.org>
parents: 6320
diff changeset
2350 return -1;
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
2351 }
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
2352
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2353 switch (gaim_proxy_info_get_type(phb->gpi))
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
2354 {
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2355 case GAIM_PROXY_NONE:
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
2356 break;
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2357
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2358 case GAIM_PROXY_HTTP:
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2359 case GAIM_PROXY_SOCKS4:
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2360 case GAIM_PROXY_SOCKS5:
6621
2a18ef3e5224 [gaim-migrate @ 7145]
Robert McQueen <robot101@debian.org>
parents: 6320
diff changeset
2361 case GAIM_PROXY_USE_ENVVAR:
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2362 connecthost = gaim_proxy_info_get_host(phb->gpi);
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2363 connectport = gaim_proxy_info_get_port(phb->gpi);
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
2364 break;
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2365
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
2366 default:
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
2367 g_free(phb->host);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
2368 g_free(phb);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
2369 return -1;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
2370 }
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2371
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2372 return gaim_gethostbyname_async(connecthost, connectport,
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2373 connection_host_resolved, phb);
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2374 }
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2375
8262
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
2376 int
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
2377 gaim_proxy_connect_socks5(GaimProxyInfo *gpi, const char *host, int port,
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
2378 GaimInputFunction func, gpointer data)
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
2379 {
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
2380 struct PHB *phb;
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
2381
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
2382 phb = g_new0(struct PHB, 1);
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
2383 phb->gpi = gpi;
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
2384 phb->func = func;
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
2385 phb->data = data;
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
2386 phb->host = g_strdup(host);
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
2387 phb->port = port;
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
2388
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2389 return gaim_gethostbyname_async(gaim_proxy_info_get_host(gpi),
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2390 gaim_proxy_info_get_port(gpi), connection_host_resolved, phb);
8262
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
2391 }
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
2392
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
2393
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2394 static void
12816
5f93e09fa9a6 [gaim-migrate @ 15164]
Mark Doliner <markdoliner@pidgin.im>
parents: 12811
diff changeset
2395 proxy_pref_cb(const char *name, GaimPrefType type,
5f93e09fa9a6 [gaim-migrate @ 15164]
Mark Doliner <markdoliner@pidgin.im>
parents: 12811
diff changeset
2396 gconstpointer value, gpointer data)
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2397 {
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2398 GaimProxyInfo *info = gaim_global_proxy_get_info();
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2399
6001
1abbeff6571c [gaim-migrate @ 6449]
Mark Doliner <markdoliner@pidgin.im>
parents: 5970
diff changeset
2400 if (!strcmp(name, "/core/proxy/type")) {
1abbeff6571c [gaim-migrate @ 6449]
Mark Doliner <markdoliner@pidgin.im>
parents: 5970
diff changeset
2401 int proxytype;
12816
5f93e09fa9a6 [gaim-migrate @ 15164]
Mark Doliner <markdoliner@pidgin.im>
parents: 12811
diff changeset
2402 const char *type = value;
6001
1abbeff6571c [gaim-migrate @ 6449]
Mark Doliner <markdoliner@pidgin.im>
parents: 5970
diff changeset
2403
1abbeff6571c [gaim-migrate @ 6449]
Mark Doliner <markdoliner@pidgin.im>
parents: 5970
diff changeset
2404 if (!strcmp(type, "none"))
1abbeff6571c [gaim-migrate @ 6449]
Mark Doliner <markdoliner@pidgin.im>
parents: 5970
diff changeset
2405 proxytype = GAIM_PROXY_NONE;
1abbeff6571c [gaim-migrate @ 6449]
Mark Doliner <markdoliner@pidgin.im>
parents: 5970
diff changeset
2406 else if (!strcmp(type, "http"))
1abbeff6571c [gaim-migrate @ 6449]
Mark Doliner <markdoliner@pidgin.im>
parents: 5970
diff changeset
2407 proxytype = GAIM_PROXY_HTTP;
1abbeff6571c [gaim-migrate @ 6449]
Mark Doliner <markdoliner@pidgin.im>
parents: 5970
diff changeset
2408 else if (!strcmp(type, "socks4"))
1abbeff6571c [gaim-migrate @ 6449]
Mark Doliner <markdoliner@pidgin.im>
parents: 5970
diff changeset
2409 proxytype = GAIM_PROXY_SOCKS4;
1abbeff6571c [gaim-migrate @ 6449]
Mark Doliner <markdoliner@pidgin.im>
parents: 5970
diff changeset
2410 else if (!strcmp(type, "socks5"))
1abbeff6571c [gaim-migrate @ 6449]
Mark Doliner <markdoliner@pidgin.im>
parents: 5970
diff changeset
2411 proxytype = GAIM_PROXY_SOCKS5;
6621
2a18ef3e5224 [gaim-migrate @ 7145]
Robert McQueen <robot101@debian.org>
parents: 6320
diff changeset
2412 else if (!strcmp(type, "envvar"))
2a18ef3e5224 [gaim-migrate @ 7145]
Robert McQueen <robot101@debian.org>
parents: 6320
diff changeset
2413 proxytype = GAIM_PROXY_USE_ENVVAR;
6001
1abbeff6571c [gaim-migrate @ 6449]
Mark Doliner <markdoliner@pidgin.im>
parents: 5970
diff changeset
2414 else
1abbeff6571c [gaim-migrate @ 6449]
Mark Doliner <markdoliner@pidgin.im>
parents: 5970
diff changeset
2415 proxytype = -1;
1abbeff6571c [gaim-migrate @ 6449]
Mark Doliner <markdoliner@pidgin.im>
parents: 5970
diff changeset
2416
1abbeff6571c [gaim-migrate @ 6449]
Mark Doliner <markdoliner@pidgin.im>
parents: 5970
diff changeset
2417 gaim_proxy_info_set_type(info, proxytype);
1abbeff6571c [gaim-migrate @ 6449]
Mark Doliner <markdoliner@pidgin.im>
parents: 5970
diff changeset
2418 } else if (!strcmp(name, "/core/proxy/host"))
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2419 gaim_proxy_info_set_host(info, value);
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2420 else if (!strcmp(name, "/core/proxy/port"))
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2421 gaim_proxy_info_set_port(info, GPOINTER_TO_INT(value));
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2422 else if (!strcmp(name, "/core/proxy/username"))
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2423 gaim_proxy_info_set_username(info, value);
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2424 else if (!strcmp(name, "/core/proxy/password"))
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2425 gaim_proxy_info_set_password(info, value);
1087
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
2426 }
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2427
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2428 void
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2429 gaim_proxy_init(void)
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2430 {
10087
e5b80a38939d [gaim-migrate @ 11098]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9863
diff changeset
2431 void *handle;
e5b80a38939d [gaim-migrate @ 11098]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9863
diff changeset
2432
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2433 /* Initialize a default proxy info struct. */
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2434 global_proxy_info = gaim_proxy_info_new();
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2435
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2436 /* Proxy */
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2437 gaim_prefs_add_none("/core/proxy");
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2438 gaim_prefs_add_string("/core/proxy/type", "none");
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2439 gaim_prefs_add_string("/core/proxy/host", "");
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2440 gaim_prefs_add_int("/core/proxy/port", 0);
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2441 gaim_prefs_add_string("/core/proxy/username", "");
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2442 gaim_prefs_add_string("/core/proxy/password", "");
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2443
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2444 /* Setup callbacks for the preferences. */
10087
e5b80a38939d [gaim-migrate @ 11098]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9863
diff changeset
2445 handle = gaim_proxy_get_handle();
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2446 gaim_prefs_connect_callback(handle, "/core/proxy/type", proxy_pref_cb,
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2447 NULL);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2448 gaim_prefs_connect_callback(handle, "/core/proxy/host", proxy_pref_cb,
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2449 NULL);
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2450 gaim_prefs_connect_callback(handle, "/core/proxy/port", proxy_pref_cb,
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2451 NULL);
10087
e5b80a38939d [gaim-migrate @ 11098]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9863
diff changeset
2452 gaim_prefs_connect_callback(handle, "/core/proxy/username",
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2453 proxy_pref_cb, NULL);
10087
e5b80a38939d [gaim-migrate @ 11098]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9863
diff changeset
2454 gaim_prefs_connect_callback(handle, "/core/proxy/password",
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13085
diff changeset
2455 proxy_pref_cb, NULL);
10626
659572951067 [gaim-migrate @ 12101]
Daniel Atallah <datallah@pidgin.im>
parents: 10619
diff changeset
2456 #ifdef _WIN32
10237
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
2457 if(!g_thread_supported())
93c682ab4b27 [gaim-migrate @ 11373]
Herman Bloggs <herman@bluedigits.com>
parents: 10172
diff changeset
2458 g_thread_init(NULL);
10626
659572951067 [gaim-migrate @ 12101]
Daniel Atallah <datallah@pidgin.im>
parents: 10619
diff changeset
2459 #endif
5681
514fbc5374dc [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2460 }
10087
e5b80a38939d [gaim-migrate @ 11098]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9863
diff changeset
2461
e5b80a38939d [gaim-migrate @ 11098]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9863
diff changeset
2462 void *
e5b80a38939d [gaim-migrate @ 11098]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9863
diff changeset
2463 gaim_proxy_get_handle()
e5b80a38939d [gaim-migrate @ 11098]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9863
diff changeset
2464 {
e5b80a38939d [gaim-migrate @ 11098]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9863
diff changeset
2465 static int handle;
e5b80a38939d [gaim-migrate @ 11098]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9863
diff changeset
2466
e5b80a38939d [gaim-migrate @ 11098]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9863
diff changeset
2467 return &handle;
e5b80a38939d [gaim-migrate @ 11098]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9863
diff changeset
2468 }

mercurial