src/proxy.c

Fri, 30 Sep 2005 04:56:25 +0000

author
Mark Doliner <markdoliner@pidgin.im>
date
Fri, 30 Sep 2005 04:56:25 +0000
changeset 11579
1ff537bd2e92
parent 11428
b3a4026f2811
child 11878
4c2661df91bb
permissions
-rw-r--r--

[gaim-migrate @ 13849]
Autodetect Howl and enable the Bonjour PRPL if the Howl libs and header
files are found.

This is my first real forray into configure.ac, so someone smart may
want to look through it.

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

mercurial