src/proxy.c

Sun, 02 Mar 2003 18:48:02 +0000

author
Nathan Walp <nwalp@pidgin.im>
date
Sun, 02 Mar 2003 18:48:02 +0000
changeset 4634
c4318fc60090
parent 4499
79339f2e40d9
child 4648
22f8080928e0
permissions
-rw-r--r--

[gaim-migrate @ 4941]
This will let you set up different proxy settings for different accounts.

Mainly useful to the corporate users that need to connect to an internal
jabber server, and still want to connect to "external" stuff through a
proxy, or something along those lines. I'm sure someone will come up with
another use for it.

1
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
1 /*
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
2 * gaim
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
3 *
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
4 * Copyright (C) 1998-1999, Mark Spencer <markster@marko.net>
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
5 *
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
6 * This program is free software; you can redistribute it and/or modify
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
7 * 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
8 * the Free Software Foundation; either version 2 of the License, or
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
9 * (at your option) any later version.
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 distributed in the hope that it will be useful,
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
14 * GNU General Public License for more details.
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 * You should have received a copy of the GNU General Public License
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
17 * along with this program; if not, write to the Free Software
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
19 *
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
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
22 /* this is a little piece of code to handle proxy connection */
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
23 /* it is intended to : 1st handle http proxy, using the CONNECT command
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
24 , 2nd provide an easy way to add socks support */
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
25
349
6f7d28b0f98d [gaim-migrate @ 359]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 338
diff changeset
26 #ifdef HAVE_CONFIG_H
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
27 #include "config.h"
349
6f7d28b0f98d [gaim-migrate @ 359]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 338
diff changeset
28 #endif
1
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
29 #include <stdio.h>
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
30 #include <stdlib.h>
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
31 #include <string.h>
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
32 #include <sys/types.h>
4447
12d26cebd0d9 [gaim-migrate @ 4722]
Luke Schierer <lschiere@pidgin.im>
parents: 4434
diff changeset
33 #include <sys/time.h>
3630
caa952062dc2 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3376
diff changeset
34
caa952062dc2 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3376
diff changeset
35 #ifndef _WIN32
1
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
36 #include <sys/socket.h>
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
37 #include <netdb.h>
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
38 #include <netinet/in.h>
2911
b20669ca1281 [gaim-migrate @ 2924]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2907
diff changeset
39 #include <arpa/inet.h>
1057
0161606a8549 [gaim-migrate @ 1067]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 743
diff changeset
40 #include <unistd.h>
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
41 #include <signal.h>
3630
caa952062dc2 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3376
diff changeset
42 #else
caa952062dc2 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3376
diff changeset
43 #include <winsock.h>
caa952062dc2 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3376
diff changeset
44 #endif
caa952062dc2 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3376
diff changeset
45
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
46 #include <fcntl.h>
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
47 #include <errno.h>
1
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
48 #include "gaim.h"
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
49 #include "proxy.h"
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
50
3630
caa952062dc2 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3376
diff changeset
51 #ifdef _WIN32
caa952062dc2 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3376
diff changeset
52 #include "win32dep.h"
caa952062dc2 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3376
diff changeset
53 #endif
caa952062dc2 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3376
diff changeset
54
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
55 #define GAIM_READ_COND (G_IO_IN | G_IO_HUP | G_IO_ERR)
2229
355ebbe18fe0 [gaim-migrate @ 2239]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2096
diff changeset
56 #define GAIM_WRITE_COND (G_IO_OUT | G_IO_HUP | G_IO_ERR | G_IO_NVAL)
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
57
4634
c4318fc60090 [gaim-migrate @ 4941]
Nathan Walp <nwalp@pidgin.im>
parents: 4499
diff changeset
58 struct gaim_proxy_info global_proxy_info;
1881
bcd5d457cdbb [gaim-migrate @ 1891]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1868
diff changeset
59
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
60 struct PHB {
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
61 GaimInputFunction func;
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
62 gpointer data;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
63 char *host;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
64 int port;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
65 gint inpa;
4634
c4318fc60090 [gaim-migrate @ 4941]
Nathan Walp <nwalp@pidgin.im>
parents: 4499
diff changeset
66 struct gaim_proxy_info *gpi;
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
67 };
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
68
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
69 typedef struct _GaimIOClosure {
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
70 GaimInputFunction function;
2300
06a3c10f4918 [gaim-migrate @ 2310]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2266
diff changeset
71 guint result;
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
72 gpointer data;
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
73 } GaimIOClosure;
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
74
2096
06aacd5e4b2a [gaim-migrate @ 2106]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2090
diff changeset
75 static void gaim_io_destroy(gpointer data)
06aacd5e4b2a [gaim-migrate @ 2106]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2090
diff changeset
76 {
06aacd5e4b2a [gaim-migrate @ 2106]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2090
diff changeset
77 g_free(data);
06aacd5e4b2a [gaim-migrate @ 2106]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2090
diff changeset
78 }
06aacd5e4b2a [gaim-migrate @ 2106]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2090
diff changeset
79
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
80 static gboolean gaim_io_invoke(GIOChannel *source, GIOCondition condition, gpointer data)
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
81 {
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
82 GaimIOClosure *closure = data;
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
83 GaimInputCondition gaim_cond = 0;
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
84
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
85 if (condition & GAIM_READ_COND)
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
86 gaim_cond |= GAIM_INPUT_READ;
2754
1deb656ee517 [gaim-migrate @ 2767]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2477
diff changeset
87 if (condition & GAIM_WRITE_COND)
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
88 gaim_cond |= GAIM_INPUT_WRITE;
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
89
2840
9dfddf45feac [gaim-migrate @ 2853]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2790
diff changeset
90 /*
2300
06a3c10f4918 [gaim-migrate @ 2310]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2266
diff changeset
91 debug_printf("CLOSURE: callback for %d, fd is %d\n",
2372
c24942700dfd [gaim-migrate @ 2385]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2306
diff changeset
92 closure->result, g_io_channel_unix_get_fd(source));
2840
9dfddf45feac [gaim-migrate @ 2853]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2790
diff changeset
93 */
2300
06a3c10f4918 [gaim-migrate @ 2310]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2266
diff changeset
94
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
95 closure->function(closure->data, g_io_channel_unix_get_fd(source), gaim_cond);
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
96
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
97 return TRUE;
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
98 }
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
99
2372
c24942700dfd [gaim-migrate @ 2385]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2306
diff changeset
100 gint gaim_input_add(gint source, GaimInputCondition condition, GaimInputFunction function, gpointer data)
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
101 {
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
102 GaimIOClosure *closure = g_new0(GaimIOClosure, 1);
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
103 GIOChannel *channel;
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
104 GIOCondition cond = 0;
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
105
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
106 closure->function = function;
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
107 closure->data = data;
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
108
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
109 if (condition & GAIM_INPUT_READ)
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
110 cond |= GAIM_READ_COND;
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
111 if (condition & GAIM_INPUT_WRITE)
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
112 cond |= GAIM_WRITE_COND;
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
113
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
114 channel = g_io_channel_unix_new(source);
2300
06a3c10f4918 [gaim-migrate @ 2310]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2266
diff changeset
115 closure->result = g_io_add_watch_full(channel, G_PRIORITY_DEFAULT, cond,
2372
c24942700dfd [gaim-migrate @ 2385]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2306
diff changeset
116 gaim_io_invoke, closure, gaim_io_destroy);
2300
06a3c10f4918 [gaim-migrate @ 2310]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2266
diff changeset
117
2840
9dfddf45feac [gaim-migrate @ 2853]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2790
diff changeset
118 /* debug_printf("CLOSURE: adding input watcher %d for fd %d\n", closure->result, source); */
2300
06a3c10f4918 [gaim-migrate @ 2310]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2266
diff changeset
119
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
120 g_io_channel_unref(channel);
2300
06a3c10f4918 [gaim-migrate @ 2310]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2266
diff changeset
121 return closure->result;
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
122 }
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
123
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
124 void gaim_input_remove(gint tag)
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
125 {
2840
9dfddf45feac [gaim-migrate @ 2853]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2790
diff changeset
126 /* debug_printf("CLOSURE: removing input watcher %d\n", tag); */
2477
e5e8902b54e4 [gaim-migrate @ 2490]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2372
diff changeset
127 if (tag > 0)
e5e8902b54e4 [gaim-migrate @ 2490]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2372
diff changeset
128 g_source_remove(tag);
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
129 }
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
130
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
131
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
132 typedef void (*dns_callback_t)(struct sockaddr *addr, size_t addrlen,
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
133 gpointer data, const char *error_message);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
134
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
135 #ifdef __unix__
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
136
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
137 /* This structure represents both a pending DNS request and
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
138 * a free child process.
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
139 */
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
140 typedef struct {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
141 char *host;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
142 int port;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
143 dns_callback_t callback;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
144 gpointer data;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
145 gint inpa;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
146 int fd_in, fd_out;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
147 pid_t dns_pid;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
148 } pending_dns_request_t;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
149
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
150 static GSList *free_dns_children = NULL;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
151 static GQueue *queued_requests = NULL;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
152
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
153 static int number_of_dns_children = 0;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
154
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
155 const int MAX_DNS_CHILDREN = 2;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
156
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
157 typedef struct {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
158 char hostname[512];
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
159 int port;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
160 } dns_params_t;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
161
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
162 typedef struct {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
163 dns_params_t params;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
164 dns_callback_t callback;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
165 gpointer data;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
166 } queued_dns_request_t;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
167
4434
f7b710c1804f [gaim-migrate @ 4709]
Nathan Walp <nwalp@pidgin.im>
parents: 4394
diff changeset
168 static void req_free(pending_dns_request_t *req)
f7b710c1804f [gaim-migrate @ 4709]
Nathan Walp <nwalp@pidgin.im>
parents: 4394
diff changeset
169 {
f7b710c1804f [gaim-migrate @ 4709]
Nathan Walp <nwalp@pidgin.im>
parents: 4394
diff changeset
170 g_return_if_fail(req != NULL);
f7b710c1804f [gaim-migrate @ 4709]
Nathan Walp <nwalp@pidgin.im>
parents: 4394
diff changeset
171 if(req->host)
f7b710c1804f [gaim-migrate @ 4709]
Nathan Walp <nwalp@pidgin.im>
parents: 4394
diff changeset
172 g_free(req->host);
f7b710c1804f [gaim-migrate @ 4709]
Nathan Walp <nwalp@pidgin.im>
parents: 4394
diff changeset
173 close(req->fd_in);
f7b710c1804f [gaim-migrate @ 4709]
Nathan Walp <nwalp@pidgin.im>
parents: 4394
diff changeset
174 close(req->fd_out);
f7b710c1804f [gaim-migrate @ 4709]
Nathan Walp <nwalp@pidgin.im>
parents: 4394
diff changeset
175 g_free(req);
f7b710c1804f [gaim-migrate @ 4709]
Nathan Walp <nwalp@pidgin.im>
parents: 4394
diff changeset
176 number_of_dns_children--;
f7b710c1804f [gaim-migrate @ 4709]
Nathan Walp <nwalp@pidgin.im>
parents: 4394
diff changeset
177 }
f7b710c1804f [gaim-migrate @ 4709]
Nathan Walp <nwalp@pidgin.im>
parents: 4394
diff changeset
178
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
179 static int send_dns_request_to_child(pending_dns_request_t *req, dns_params_t *dns_params)
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
180 {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
181 char ch;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
182 int rc;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
183
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
184 /* Are you alive? */
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
185 if(kill(req->dns_pid, 0) != 0) {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
186 debug_printf("DNS child %d no longer exists\n", req->dns_pid);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
187 return -1;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
188 }
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
189
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
190 /* Let's contact this lost child! */
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
191 rc = write(req->fd_in, dns_params, sizeof(*dns_params));
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
192 if(rc<0) {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
193 debug_printf("Error writing to DNS child %d: %s\n", req->dns_pid, strerror(errno));
4434
f7b710c1804f [gaim-migrate @ 4709]
Nathan Walp <nwalp@pidgin.im>
parents: 4394
diff changeset
194 close(req->fd_in);
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
195 return -1;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
196 }
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
197
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
198 g_return_val_if_fail(rc == sizeof(*dns_params), -1);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
199
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
200 /* Did you hear me? (This avoids some race conditions) */
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
201 rc = read(req->fd_out, &ch, 1);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
202 if(rc != 1 || ch!='Y') {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
203 debug_printf("DNS child %d not responding: killing it!\n", req->dns_pid);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
204 kill(req->dns_pid, SIGKILL);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
205 return -1;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
206 }
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
207
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
208 debug_printf("Successfuly sent DNS request to child %d\n", req->dns_pid);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
209 return 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
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
212 static void host_resolved(gpointer data, gint source, GaimInputCondition cond);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
213
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
214 static void release_dns_child(pending_dns_request_t *req)
2911
b20669ca1281 [gaim-migrate @ 2924]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2907
diff changeset
215 {
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
216 g_free(req->host);
4434
f7b710c1804f [gaim-migrate @ 4709]
Nathan Walp <nwalp@pidgin.im>
parents: 4394
diff changeset
217 req->host=NULL;
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
218
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
219 if(queued_requests && !g_queue_is_empty(queued_requests)) {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
220 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
221 req->host = g_strdup(r->params.hostname);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
222 req->port = r->params.port;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
223 req->callback = r->callback;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
224 req->data = r->data;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
225
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
226 debug_printf("Processing queued DNS query for '%s' with child %d\n", req->host, req->dns_pid);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
227
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
228 if(send_dns_request_to_child(req, &(r->params)) != 0) {
4434
f7b710c1804f [gaim-migrate @ 4709]
Nathan Walp <nwalp@pidgin.im>
parents: 4394
diff changeset
229 req_free(req);
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
230 req = NULL;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
231 debug_printf("Intent of process queued query of '%s' failed, requeing...\n",
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
232 r->params.hostname);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
233 g_queue_push_head(queued_requests, r);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
234 } else {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
235 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
236 g_free(r);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
237 }
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
238
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
239 } else {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
240 req->host = NULL;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
241 req->callback = NULL;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
242 req->data = NULL;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
243 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
244 }
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
245 }
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
246
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
247 static void host_resolved(gpointer data, gint source, GaimInputCondition cond)
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
248 {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
249 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
250 int rc, err;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
251 struct sockaddr *addr = NULL;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
252 socklen_t addrlen;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
253
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
254 debug_printf("Host '%s' resolved\n", req->host);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
255 gaim_input_remove(req->inpa);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
256
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
257 rc=read(req->fd_out, &err, sizeof(err));
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
258 if((rc==4) && (err!=0)) {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
259 char message[1024];
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
260 g_snprintf(message, sizeof(message), "DNS error: %s (pid=%d)",
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
261 #ifdef HAVE_GETADDRINFO
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
262 gai_strerror(err),
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
263 #else
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
264 hstrerror(err),
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
265 #endif
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
266 req->dns_pid);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
267 debug_printf("%s\n",message);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
268 req->callback(NULL, 0, req->data, message);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
269 release_dns_child(req);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
270 return;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
271 }
4367
e96fd092f723 [gaim-migrate @ 4633]
Mark Doliner <markdoliner@pidgin.im>
parents: 4366
diff changeset
272 if(rc>0) {
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
273 rc=read(req->fd_out, &addrlen, sizeof(addrlen));
4367
e96fd092f723 [gaim-migrate @ 4633]
Mark Doliner <markdoliner@pidgin.im>
parents: 4366
diff changeset
274 if(rc>0) {
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
275 addr=g_malloc(addrlen);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
276 rc=read(req->fd_out, addr, addrlen);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
277 }
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
278 }
4367
e96fd092f723 [gaim-migrate @ 4633]
Mark Doliner <markdoliner@pidgin.im>
parents: 4366
diff changeset
279 if(rc==-1) {
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
280 char message[1024];
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
281 g_snprintf(message, sizeof(message), "Error reading from DNS child: %s",strerror(errno));
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
282 debug_printf("%s\n",message);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
283 req->callback(NULL, 0, req->data, message);
4434
f7b710c1804f [gaim-migrate @ 4709]
Nathan Walp <nwalp@pidgin.im>
parents: 4394
diff changeset
284 req_free(req);
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
285 return;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
286 }
4367
e96fd092f723 [gaim-migrate @ 4633]
Mark Doliner <markdoliner@pidgin.im>
parents: 4366
diff changeset
287 if(rc==0) {
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
288 char message[1024];
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
289 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
290 close(req->fd_out);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
291 debug_printf("%s\n",message);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
292 req->callback(NULL, 0, req->data, message);
4434
f7b710c1804f [gaim-migrate @ 4709]
Nathan Walp <nwalp@pidgin.im>
parents: 4394
diff changeset
293 req_free(req);
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
294 return;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
295 }
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
296
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
297 /* wait4(req->dns_pid, NULL, WNOHANG, NULL); */
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
298
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
299 req->callback(addr, addrlen, req->data, NULL);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
300
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
301 g_free(addr);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
302
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
303 release_dns_child(req);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
304 }
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
305
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
306 static void trap_gdb_bug()
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
307 {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
308 const char *message =
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
309 "Gaim's DNS child got a SIGTRAP signal. \n"
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
310 "This can be caused by trying to run gaim into gdb.\n"
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
311 "There's a known gdb bug which prevent this, supposedly gaim\n"
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
312 "should have detected you were using gdb and use an ugly hack,\n"
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
313 "check cope_with_gdb_brokenness() in proxy.c.\n\n"
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
314 "For more info about the bug check http://sources.redhat.com/ml/gdb/2001-07/msg00349.html\n";
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
315 fputs("\n* * *\n",stderr);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
316 fputs(message,stderr);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
317 fputs("* * *\n\n",stderr);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
318 execlp("xmessage","xmessage","-center", message, NULL);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
319 _exit(1);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
320 }
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
321
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
322 static void cope_with_gdb_brokenness()
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
323 {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
324 static gboolean already_done = FALSE;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
325 char s[300], e[300];
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
326 int n;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
327 pid_t ppid;
2911
b20669ca1281 [gaim-migrate @ 2924]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2907
diff changeset
328
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
329 #ifdef __linux__
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
330 if(already_done)
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
331 return;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
332 already_done = TRUE;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
333 ppid = getppid();
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
334 sprintf(s,"/proc/%d/exe", ppid);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
335 n = readlink(s, e, sizeof(e));
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
336 e[MAX(n,sizeof(e)-1)] = '\0';
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
337
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
338 if(strstr(e,"gdb")) {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
339 debug_printf("Debugger detected, performing useless query...\n");
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
340 gethostbyname("x.x.x.x.x");
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
341 }
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
342 #endif
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
343 }
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
344
4434
f7b710c1804f [gaim-migrate @ 4709]
Nathan Walp <nwalp@pidgin.im>
parents: 4394
diff changeset
345 int 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
346 {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
347 pending_dns_request_t *req = NULL;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
348 dns_params_t dns_params;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
349
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
350 strncpy(dns_params.hostname, hostname, sizeof(dns_params.hostname)-1);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
351 dns_params.hostname[sizeof(dns_params.hostname)-1] = '\0';
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
352 dns_params.port = port;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
353
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
354 /* Is there a free available child? */
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
355 while(free_dns_children && !req) {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
356 GSList *l = free_dns_children;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
357 free_dns_children = g_slist_remove_link(free_dns_children, l);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
358 req = l->data;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
359 g_slist_free(l);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
360
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
361 if(send_dns_request_to_child(req, &dns_params) != 0) {
4434
f7b710c1804f [gaim-migrate @ 4709]
Nathan Walp <nwalp@pidgin.im>
parents: 4394
diff changeset
362 req_free(req);
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
363 req = NULL;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
364 continue;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
365 }
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
367 }
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
368
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
369 if(!req) {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
370 int child_out[2], child_in[2];
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
371
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
372 if(number_of_dns_children >= MAX_DNS_CHILDREN) {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
373 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
374 memcpy(&(r->params), &dns_params, sizeof(dns_params));
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
375 r->callback = callback;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
376 r->data = data;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
377 if(!queued_requests)
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
378 queued_requests = g_queue_new();
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
379 g_queue_push_tail(queued_requests, r);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
380 debug_printf("DNS query for '%s' queued\n", hostname);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
381 return 0;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
382 }
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
383
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
384 if(pipe(child_out) || pipe(child_in)) {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
385 debug_printf("Could not create pipes: %s",strerror(errno));
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
386 return -1;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
387 }
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
388
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
389 /* We need to create a new child. */
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
390 req = g_new(pending_dns_request_t,1);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
391
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
392 cope_with_gdb_brokenness();
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
393
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
394 req->dns_pid=fork();
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
395 if(req->dns_pid==0) {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
396 const int zero = 0;
4394
2fed805518d5 [gaim-migrate @ 4660]
Luke Schierer <lschiere@pidgin.im>
parents: 4367
diff changeset
397 int rc;
2fed805518d5 [gaim-migrate @ 4660]
Luke Schierer <lschiere@pidgin.im>
parents: 4367
diff changeset
398
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
399 #ifdef HAVE_GETADDRINFO
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
400 struct addrinfo hints, *res;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
401 char servname[20];
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
402 #else
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
403 struct sockaddr_in sin;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
404 const socklen_t addrlen = sizeof(sin);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
405 #endif
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
406 #ifdef HAVE_SIGNAL_H
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
407 signal(SIGHUP, SIG_DFL);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
408 signal(SIGINT, SIG_DFL);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
409 signal(SIGQUIT, SIG_DFL);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
410 signal(SIGCHLD, SIG_DFL);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
411 signal(SIGTERM, SIG_DFL);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
412 signal(SIGTRAP, trap_gdb_bug);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
413 #endif
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
414
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
415
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
416 close(child_out[0]);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
417 close(child_in[1]);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
418
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
419 while(1) {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
420 if(dns_params.hostname[0] == '\0') {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
421 const char Y = 'Y';
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
422 fd_set fds;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
423 struct timeval tv = { .tv_sec = 40 , .tv_usec = 0 };
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
424 FD_ZERO(&fds);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
425 FD_SET(child_in[0], &fds);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
426 rc = select(child_in[0]+1, &fds, NULL, NULL, &tv);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
427 if(!rc) {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
428 if(opt_debug)
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
429 fprintf(stderr,"dns[%d]: nobody needs me... =(\n", getpid());
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
430 break;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
431 }
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
432 rc = read(child_in[0], &dns_params, sizeof(dns_params));
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
433 if(rc < 0) {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
434 perror("read()");
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
435 break;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
436 }
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
437 if(rc==0) {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
438 if(opt_debug)
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
439 fprintf(stderr,"dns[%d]: Ops, father has gone, wait for me, wait...!\n", getpid());
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
440 _exit(0);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
441 }
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
442 if(dns_params.hostname[0] == '\0') {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
443 fprintf(stderr, "dns[%d]: hostname = \"\" (port = %d)!!!\n", getpid(), dns_params.port);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
444 _exit(1);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
445 }
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
446 write(child_out[1], &Y, 1);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
447 }
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
448
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
449 #ifdef HAVE_GETADDRINFO
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
450 g_snprintf(servname, sizeof(servname), "%d", dns_params.port);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
451 memset(&hints,0,sizeof(hints));
4434
f7b710c1804f [gaim-migrate @ 4709]
Nathan Walp <nwalp@pidgin.im>
parents: 4394
diff changeset
452
f7b710c1804f [gaim-migrate @ 4709]
Nathan Walp <nwalp@pidgin.im>
parents: 4394
diff changeset
453 /* This is only used to convert a service
f7b710c1804f [gaim-migrate @ 4709]
Nathan Walp <nwalp@pidgin.im>
parents: 4394
diff changeset
454 * name to a port number. As we know we are
f7b710c1804f [gaim-migrate @ 4709]
Nathan Walp <nwalp@pidgin.im>
parents: 4394
diff changeset
455 * passing a number already, we know this
f7b710c1804f [gaim-migrate @ 4709]
Nathan Walp <nwalp@pidgin.im>
parents: 4394
diff changeset
456 * value will not be really used by the C
f7b710c1804f [gaim-migrate @ 4709]
Nathan Walp <nwalp@pidgin.im>
parents: 4394
diff changeset
457 * library.
f7b710c1804f [gaim-migrate @ 4709]
Nathan Walp <nwalp@pidgin.im>
parents: 4394
diff changeset
458 */
f7b710c1804f [gaim-migrate @ 4709]
Nathan Walp <nwalp@pidgin.im>
parents: 4394
diff changeset
459 hints.ai_socktype = SOCK_STREAM;
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
460 rc = getaddrinfo(dns_params.hostname, servname, &hints, &res);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
461 if(rc) {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
462 write(child_out[1], &rc, sizeof(int));
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
463 close(child_out[1]);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
464 if(opt_debug)
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
465 fprintf(stderr,"dns[%d] Error: getaddrinfo returned %d\n",
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
466 getpid(), rc);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
467 dns_params.hostname[0] = '\0';
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
468 continue;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
469 }
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
470 write(child_out[1], &zero, sizeof(zero));
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
471 write(child_out[1], &(res->ai_addrlen), sizeof(res->ai_addrlen));
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
472 write(child_out[1], res->ai_addr, res->ai_addrlen);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
473 freeaddrinfo(res);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
474 #else
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
475 if (!inet_aton(hostname, &sin.sin_addr)) {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
476 struct hostent *hp;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
477 if(!(hp = gethostbyname(dns_params.hostname))) {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
478 write(child_out[1], &h_errno, sizeof(int));
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
479 close(child_out[1]);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
480 if(opt_debug)
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
481 fprintf(stderr,"DNS Error: %s\n",hstrerror(h_errno));
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
482 _exit(0);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
483 }
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
484 memset(&sin, 0, sizeof(struct sockaddr_in));
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
485 memcpy(&sin.sin_addr.s_addr, hp->h_addr, hp->h_length);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
486 sin.sin_family = hp->h_addrtype;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
487 } else
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
488 sin.sin_family = AF_INET;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
489 sin.sin_port = htons(dns_params.port);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
490 write(child_out[1], &zero, sizeof(zero));
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
491 write(child_out[1], &addrlen, sizeof(addrlen));
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
492 write(child_out[1], &sin, addrlen);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
493 #endif
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
494 dns_params.hostname[0] = '\0';
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
495 }
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
496 close(child_out[1]);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
497 close(child_in[0]);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
498 _exit(0);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
499 }
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
500 close(child_out[1]);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
501 close(child_in[0]);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
502 if(req->dns_pid==-1) {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
503 debug_printf("Could not create child process for DNS: %s\n",strerror(errno));
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
504 g_free(req);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
505 return -1;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
506 }
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
507 req->fd_in = child_in[1];
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
508 req->fd_out = child_out[0];
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
509 number_of_dns_children++;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
510 debug_printf("Created new DNS child %d, there are now %d children.\n",
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
511 req->dns_pid, number_of_dns_children);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
512 }
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
513 req->host=g_strdup(hostname);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
514 req->port=port;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
515 req->callback=callback;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
516 req->data=data;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
517 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
518 return 0;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
519 }
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
520 #else
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
521
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
522 typedef struct {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
523 gpointer data;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
524 size_t addrlen;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
525 struct sockaddr *addr;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
526 dns_callback_t callback;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
527 } pending_dns_request_t;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
528
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
529 static gboolean host_resolved(gpointer data)
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
530 {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
531 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
532 req->callback(req->addr, req->addrlen, req->data, NULL);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
533 g_free(req->addr);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
534 g_free(req);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
535 return FALSE;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
536 }
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
537
4434
f7b710c1804f [gaim-migrate @ 4709]
Nathan Walp <nwalp@pidgin.im>
parents: 4394
diff changeset
538 int 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
539 {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
540 struct sockaddr_in sin;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
541 pending_dns_request_t *req;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
542
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
543 if (!inet_aton(hostname, &sin.sin_addr)) {
2911
b20669ca1281 [gaim-migrate @ 2924]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2907
diff changeset
544 struct hostent *hp;
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
545 if(!(hp = gethostbyname(hostname))) {
3283
645563315be3 [gaim-migrate @ 3301]
Sean Egan <seanegan@pidgin.im>
parents: 3098
diff changeset
546 debug_printf("gaim_gethostbyname(\"%s\", %d) failed: %s",
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
547 hostname, port, hstrerror(h_errno));
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
548 return -1;
2911
b20669ca1281 [gaim-migrate @ 2924]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2907
diff changeset
549 }
b20669ca1281 [gaim-migrate @ 2924]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2907
diff changeset
550 memset(&sin, 0, sizeof(struct sockaddr_in));
b20669ca1281 [gaim-migrate @ 2924]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2907
diff changeset
551 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
552 sin.sin_family = hp->h_addrtype;
b20669ca1281 [gaim-migrate @ 2924]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2907
diff changeset
553 } else
b20669ca1281 [gaim-migrate @ 2924]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2907
diff changeset
554 sin.sin_family = AF_INET;
b20669ca1281 [gaim-migrate @ 2924]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2907
diff changeset
555 sin.sin_port = htons(port);
b20669ca1281 [gaim-migrate @ 2924]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2907
diff changeset
556
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
557 req = g_new(pending_dns_request_t, 1);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
558 req->addr = (struct sockaddr*) g_memdup(&sin, sizeof(sin));
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
559 req->addrlen = sizeof(sin);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
560 req->data = data;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
561 req->callback = callback;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
562 g_timeout_add(10, host_resolved, req);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
563 return 0;
2911
b20669ca1281 [gaim-migrate @ 2924]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2907
diff changeset
564 }
b20669ca1281 [gaim-migrate @ 2924]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2907
diff changeset
565
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
566 #endif
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
567
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
568 static void no_one_calls(gpointer data, gint source, GaimInputCondition cond)
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
569 {
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
570 struct PHB *phb = data;
2048
4ac8b9622c9e [gaim-migrate @ 2058]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1881
diff changeset
571 unsigned int len;
4ac8b9622c9e [gaim-migrate @ 2058]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1881
diff changeset
572 int error = ETIMEDOUT;
3717
2fc0789e04e8 [gaim-migrate @ 3850]
Herman Bloggs <herman@bluedigits.com>
parents: 3630
diff changeset
573
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
574 debug_printf("Connected\n");
3717
2fc0789e04e8 [gaim-migrate @ 3850]
Herman Bloggs <herman@bluedigits.com>
parents: 3630
diff changeset
575
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
576 len = sizeof(error);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
577 if (getsockopt(source, SOL_SOCKET, SO_ERROR, &error, &len) < 0) {
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
578 close(source);
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
579 gaim_input_remove(phb->inpa);
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
580 phb->func(phb->data, -1, GAIM_INPUT_READ);
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
581 g_free(phb->host);
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
582 g_free(phb);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
583 return;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
584 }
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
585 fcntl(source, F_SETFL, 0);
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
586 gaim_input_remove(phb->inpa);
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
587 phb->func(phb->data, source, GAIM_INPUT_READ);
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
588 g_free(phb->host);
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
589 g_free(phb);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
590 }
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
591
1868
31b44ef2b061 [gaim-migrate @ 1878]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1844
diff changeset
592 static gboolean clean_connect(gpointer data)
31b44ef2b061 [gaim-migrate @ 1878]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1844
diff changeset
593 {
31b44ef2b061 [gaim-migrate @ 1878]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1844
diff changeset
594 struct PHB *phb = data;
31b44ef2b061 [gaim-migrate @ 1878]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1844
diff changeset
595
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
596 phb->func(phb->data, phb->port, GAIM_INPUT_READ);
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
597 g_free(phb->host);
1868
31b44ef2b061 [gaim-migrate @ 1878]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1844
diff changeset
598 g_free(phb);
31b44ef2b061 [gaim-migrate @ 1878]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1844
diff changeset
599
31b44ef2b061 [gaim-migrate @ 1878]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1844
diff changeset
600 return FALSE;
31b44ef2b061 [gaim-migrate @ 1878]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1844
diff changeset
601 }
31b44ef2b061 [gaim-migrate @ 1878]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1844
diff changeset
602
31b44ef2b061 [gaim-migrate @ 1878]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1844
diff changeset
603
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
604 static int 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
605 {
1087
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
606 int fd = -1;
3717
2fc0789e04e8 [gaim-migrate @ 3850]
Herman Bloggs <herman@bluedigits.com>
parents: 3630
diff changeset
607
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
608 debug_printf("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
609
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
610 if ((fd = socket(addr->sa_family, SOCK_STREAM, 0)) < 0) {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
611 debug_printf("unable to create socket: %s\n", strerror(errno));
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
612 g_free(phb->host);
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
613 g_free(phb);
1087
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
614 return -1;
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
615 }
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
616 fcntl(fd, F_SETFL, O_NONBLOCK);
3717
2fc0789e04e8 [gaim-migrate @ 3850]
Herman Bloggs <herman@bluedigits.com>
parents: 3630
diff changeset
617
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
618 if (connect(fd, (struct sockaddr *)addr, addrlen) < 0) {
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
619 if ((errno == EINPROGRESS) || (errno == EINTR)) {
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
620 debug_printf("Connect would have blocked\n");
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
621 phb->inpa = gaim_input_add(fd, GAIM_INPUT_WRITE, no_one_calls, phb);
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
622 } else {
2896
589a35f05a36 [gaim-migrate @ 2909]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2840
diff changeset
623 debug_printf("connect failed (errno %d)\n", errno);
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
624 close(fd);
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
625 g_free(phb->host);
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
626 g_free(phb);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
627 return -1;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
628 }
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
629 } else {
2048
4ac8b9622c9e [gaim-migrate @ 2058]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1881
diff changeset
630 unsigned int len;
4ac8b9622c9e [gaim-migrate @ 2058]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1881
diff changeset
631 int error = ETIMEDOUT;
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
632 debug_printf("Connect didn't block\n");
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
633 len = sizeof(error);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
634 if (getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &len) < 0) {
2905
6ec1b2d491aa [gaim-migrate @ 2918]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2896
diff changeset
635 debug_printf("getsockopt failed\n");
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
636 close(fd);
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
637 g_free(phb->host);
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
638 g_free(phb);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
639 return -1;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
640 }
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
641 fcntl(fd, F_SETFL, 0);
2372
c24942700dfd [gaim-migrate @ 2385]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2306
diff changeset
642 phb->port = fd; /* bleh */
c24942700dfd [gaim-migrate @ 2385]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2306
diff changeset
643 g_timeout_add(50, clean_connect, phb); /* we do this because we never
c24942700dfd [gaim-migrate @ 2385]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2306
diff changeset
644 want to call our callback
c24942700dfd [gaim-migrate @ 2385]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2306
diff changeset
645 before we return. */
1087
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
646 }
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
647
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
648 return fd;
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
649 }
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
650
3376
9fc15174bd67 [gaim-migrate @ 3395]
Ethan Blanton <elb@pidgin.im>
parents: 3283
diff changeset
651 #define HTTP_GOODSTRING "HTTP/1.0 200"
9fc15174bd67 [gaim-migrate @ 3395]
Ethan Blanton <elb@pidgin.im>
parents: 3283
diff changeset
652 #define HTTP_GOODSTRING2 "HTTP/1.1 200"
1087
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
653
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
654 static void http_canread(gpointer data, gint source, GaimInputCondition cond)
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
655 {
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
656 int nlc = 0;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
657 int pos = 0;
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
658 int minor, major, status, error=0;
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
659 struct PHB *phb = data;
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
660 char inputline[8192], *p;
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
661
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
662 gaim_input_remove(phb->inpa);
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
663
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
664 while ((nlc != 2) && (read(source, &inputline[pos++], 1) == 1)) {
2372
c24942700dfd [gaim-migrate @ 2385]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2306
diff changeset
665 if (inputline[pos - 1] == '\n')
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
666 nlc++;
2372
c24942700dfd [gaim-migrate @ 2385]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2306
diff changeset
667 else if (inputline[pos - 1] != '\r')
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
668 nlc = 0;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
669 }
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
670 inputline[pos] = '\0';
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
671
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
672 error = strncmp(inputline, "HTTP/", 5) != 0;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
673 if(!error) {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
674 p = inputline + 5;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
675 major = strtol(p, &p, 10);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
676 error = (major==0) || (*p != '.');
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
677 if(!error) {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
678 p++;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
679 minor = strtol(p, &p, 10);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
680 error = (*p!=' ');
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
681 if(!error) {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
682 p++;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
683 status = strtol(p, &p, 10);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
684 error = (*p!=' ');
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
685 }
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
686 }
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
687 }
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
688
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
689 if(error) {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
690 debug_printf("Unable to parse proxy's response: %s\n", inputline);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
691 close(source);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
692 source=-1;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
693 } else if(status!=200) {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
694 debug_printf("Proxy reserver replied: (%s)\n", p);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
695 close(source);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
696 source=-1;
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
697 }
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
698
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
699 phb->func(phb->data, source, GAIM_INPUT_READ);
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
700 g_free(phb->host);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
701 g_free(phb);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
702 return;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
703 }
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
704
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
705 static void http_canwrite(gpointer data, gint source, GaimInputCondition cond)
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
706 {
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
707 char request[8192];
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
708 int request_len = 0;
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
709 struct PHB *phb = data;
2048
4ac8b9622c9e [gaim-migrate @ 2058]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1881
diff changeset
710 unsigned int len;
4ac8b9622c9e [gaim-migrate @ 2058]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1881
diff changeset
711 int error = ETIMEDOUT;
3717
2fc0789e04e8 [gaim-migrate @ 3850]
Herman Bloggs <herman@bluedigits.com>
parents: 3630
diff changeset
712
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
713 debug_printf("Connected\n");
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
714 if (phb->inpa > 0)
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
715 gaim_input_remove(phb->inpa);
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
716 len = sizeof(error);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
717 if (getsockopt(source, SOL_SOCKET, SO_ERROR, &error, &len) < 0) {
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
718 close(source);
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
719 phb->func(phb->data, -1, GAIM_INPUT_READ);
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
720 g_free(phb->host);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
721 g_free(phb);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
722 return;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
723 }
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
724 request_len = g_snprintf(request, sizeof(request), "CONNECT %s:%d HTTP/1.1\r\nHost: %s:%d\r\n", phb->host, phb->port,
2372
c24942700dfd [gaim-migrate @ 2385]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2306
diff changeset
725 phb->host, phb->port);
1843
aeeac3ee7ac5 [gaim-migrate @ 1853]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1840
diff changeset
726
4634
c4318fc60090 [gaim-migrate @ 4941]
Nathan Walp <nwalp@pidgin.im>
parents: 4499
diff changeset
727 if (phb->gpi->proxyuser) {
1843
aeeac3ee7ac5 [gaim-migrate @ 1853]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1840
diff changeset
728 char *t1, *t2;
4634
c4318fc60090 [gaim-migrate @ 4941]
Nathan Walp <nwalp@pidgin.im>
parents: 4499
diff changeset
729 t1 = g_strdup_printf("%s:%s", phb->gpi->proxyuser, phb->gpi->proxypass);
1843
aeeac3ee7ac5 [gaim-migrate @ 1853]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1840
diff changeset
730 t2 = tobase64(t1);
aeeac3ee7ac5 [gaim-migrate @ 1853]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1840
diff changeset
731 g_free(t1);
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
732 g_return_if_fail(request_len < sizeof(request));
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
733 request_len += g_snprintf(request + request_len, sizeof(request) - request_len, "Proxy-Authorization: Basic %s\r\n", t2);
1843
aeeac3ee7ac5 [gaim-migrate @ 1853]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1840
diff changeset
734 g_free(t2);
aeeac3ee7ac5 [gaim-migrate @ 1853]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1840
diff changeset
735 }
aeeac3ee7ac5 [gaim-migrate @ 1853]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1840
diff changeset
736
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
737 g_return_if_fail(request_len < sizeof(request));
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
738 strcpy(request + request_len, "\r\n");
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
739 request_len += 2;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
740
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
741 if (write(source, request, request_len) < 0) {
1843
aeeac3ee7ac5 [gaim-migrate @ 1853]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1840
diff changeset
742 close(source);
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
743 phb->func(phb->data, -1, GAIM_INPUT_READ);
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
744 g_free(phb->host);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
745 g_free(phb);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
746 return;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
747 }
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
748
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
749 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
750 }
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
751
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
752 static int 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
753 {
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
754 int fd = -1;
1
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
755
4634
c4318fc60090 [gaim-migrate @ 4941]
Nathan Walp <nwalp@pidgin.im>
parents: 4499
diff changeset
756 debug_printf("connecting to %s:%d via %s:%d using HTTP\n", phb->host, phb->port, phb->gpi->proxyhost, phb->gpi->proxyport);
1087
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
757
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
758 if ((fd = socket(addr->sa_family, SOCK_STREAM, 0)) < 0) {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
759 g_free(phb->host);
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
760 g_free(phb);
1087
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
761 return -1;
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
762 }
1087
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
763
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
764 fcntl(fd, F_SETFL, O_NONBLOCK);
3717
2fc0789e04e8 [gaim-migrate @ 3850]
Herman Bloggs <herman@bluedigits.com>
parents: 3630
diff changeset
765
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
766 if (connect(fd, addr, addrlen) < 0) {
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
767 if ((errno == EINPROGRESS) || (errno == EINTR)) {
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
768 debug_printf("Connect would have blocked\n");
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
769 phb->inpa = gaim_input_add(fd, GAIM_INPUT_WRITE, http_canwrite, phb);
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
770 } else {
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
771 close(fd);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
772 g_free(phb->host);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
773 g_free(phb);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
774 return -1;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
775 }
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
776 } else {
2048
4ac8b9622c9e [gaim-migrate @ 2058]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1881
diff changeset
777 unsigned int len;
4ac8b9622c9e [gaim-migrate @ 2058]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1881
diff changeset
778 int error = ETIMEDOUT;
3717
2fc0789e04e8 [gaim-migrate @ 3850]
Herman Bloggs <herman@bluedigits.com>
parents: 3630
diff changeset
779
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
780 debug_printf("Connect didn't block\n");
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
781 len = sizeof(error);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
782 if (getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &len) < 0) {
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
783 close(fd);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
784 g_free(phb->host);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
785 g_free(phb);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
786 return -1;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
787 }
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
788 fcntl(fd, F_SETFL, 0);
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
789 http_canwrite(phb, fd, GAIM_INPUT_WRITE);
1695
30db76d87de8 [gaim-migrate @ 1705]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1451
diff changeset
790 }
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
791
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
792 return fd;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
793 }
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
794
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
795 static void s4_canread(gpointer data, gint source, GaimInputCondition cond)
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
796 {
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
797 unsigned char packet[12];
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
798 struct PHB *phb = data;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
799
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
800 gaim_input_remove(phb->inpa);
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
801
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
802 memset(packet, 0, sizeof(packet));
3717
2fc0789e04e8 [gaim-migrate @ 3850]
Herman Bloggs <herman@bluedigits.com>
parents: 3630
diff changeset
803
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
804 if (read(source, packet, 9) >= 4 && packet[1] == 90) {
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
805 phb->func(phb->data, source, GAIM_INPUT_READ);
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
806 g_free(phb->host);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
807 g_free(phb);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
808 return;
1695
30db76d87de8 [gaim-migrate @ 1705]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1451
diff changeset
809 }
1087
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
810
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
811 close(source);
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
812 phb->func(phb->data, -1, GAIM_INPUT_READ);
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
813 g_free(phb->host);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
814 g_free(phb);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
815 }
1705
cc63a8819c1c [gaim-migrate @ 1715]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1695
diff changeset
816
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
817 static void s4_canwrite(gpointer data, gint source, GaimInputCondition cond)
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
818 {
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
819 unsigned char packet[12];
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
820 struct hostent *hp;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
821 struct PHB *phb = data;
2048
4ac8b9622c9e [gaim-migrate @ 2058]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1881
diff changeset
822 unsigned int len;
4ac8b9622c9e [gaim-migrate @ 2058]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1881
diff changeset
823 int error = ETIMEDOUT;
3717
2fc0789e04e8 [gaim-migrate @ 3850]
Herman Bloggs <herman@bluedigits.com>
parents: 3630
diff changeset
824
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
825 debug_printf("Connected\n");
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
826 if (phb->inpa > 0)
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
827 gaim_input_remove(phb->inpa);
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
828 len = sizeof(error);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
829 if (getsockopt(source, SOL_SOCKET, SO_ERROR, &error, &len) < 0) {
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
830 close(source);
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
831 phb->func(phb->data, -1, GAIM_INPUT_READ);
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
832 g_free(phb->host);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
833 g_free(phb);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
834 return;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
835 }
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
836 fcntl(source, F_SETFL, 0);
3717
2fc0789e04e8 [gaim-migrate @ 3850]
Herman Bloggs <herman@bluedigits.com>
parents: 3630
diff changeset
837
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
838 /* XXX does socks4 not support host name lookups by the proxy? */
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
839 if (!(hp = gethostbyname(phb->host))) {
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
840 close(source);
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
841 phb->func(phb->data, -1, GAIM_INPUT_READ);
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
842 g_free(phb->host);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
843 g_free(phb);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
844 return;
1087
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
845 }
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
846
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
847 packet[0] = 4;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
848 packet[1] = 1;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
849 packet[2] = phb->port >> 8;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
850 packet[3] = phb->port & 0xff;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
851 packet[4] = (unsigned char)(hp->h_addr_list[0])[0];
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
852 packet[5] = (unsigned char)(hp->h_addr_list[0])[1];
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
853 packet[6] = (unsigned char)(hp->h_addr_list[0])[2];
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
854 packet[7] = (unsigned char)(hp->h_addr_list[0])[3];
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
855 packet[8] = 0;
3717
2fc0789e04e8 [gaim-migrate @ 3850]
Herman Bloggs <herman@bluedigits.com>
parents: 3630
diff changeset
856
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
857 if (write(source, packet, 9) != 9) {
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
858 close(source);
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
859 phb->func(phb->data, -1, GAIM_INPUT_READ);
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
860 g_free(phb->host);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
861 g_free(phb);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
862 return;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
863 }
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
864
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
865 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
866 }
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
867
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
868 static int 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
869 {
1087
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
870 int fd = -1;
1
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
871
4634
c4318fc60090 [gaim-migrate @ 4941]
Nathan Walp <nwalp@pidgin.im>
parents: 4499
diff changeset
872 debug_printf("connecting to %s:%d via %s:%d using SOCKS4\n", phb->host, phb->port, phb->gpi->proxyhost, phb->gpi->proxyport);
1
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
873
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
874 if ((fd = socket(addr->sa_family, SOCK_STREAM, 0)) < 0) {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
875 g_free(phb->host);
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
876 g_free(phb);
1087
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
877 return -1;
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
878 }
1
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
879
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
880 fcntl(fd, F_SETFL, O_NONBLOCK);
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
881 if (connect(fd, addr, addrlen) < 0) {
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
882 if ((errno == EINPROGRESS) || (errno == EINTR)) {
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
883 debug_printf("Connect would have blocked\n");
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
884 phb->inpa = gaim_input_add(fd, GAIM_INPUT_WRITE, s4_canwrite, phb);
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
885 } else {
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
886 close(fd);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
887 g_free(phb->host);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
888 g_free(phb);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
889 return -1;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
890 }
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
891 } else {
2048
4ac8b9622c9e [gaim-migrate @ 2058]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1881
diff changeset
892 unsigned int len;
4ac8b9622c9e [gaim-migrate @ 2058]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1881
diff changeset
893 int error = ETIMEDOUT;
3717
2fc0789e04e8 [gaim-migrate @ 3850]
Herman Bloggs <herman@bluedigits.com>
parents: 3630
diff changeset
894
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
895 debug_printf("Connect didn't block\n");
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
896 len = sizeof(error);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
897 if (getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &len) < 0) {
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
898 close(fd);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
899 g_free(phb->host);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
900 g_free(phb);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
901 return -1;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
902 }
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
903 fcntl(fd, F_SETFL, 0);
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
904 s4_canwrite(phb, fd, GAIM_INPUT_WRITE);
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
905 }
670
1690e6b432ae [gaim-migrate @ 680]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 664
diff changeset
906
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
907 return fd;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
908 }
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
909
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
910 static void s5_canread_again(gpointer data, gint source, GaimInputCondition cond)
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
911 {
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
912 unsigned char buf[512];
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
913 struct PHB *phb = data;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
914
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
915 gaim_input_remove(phb->inpa);
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
916 debug_printf("able to read again\n");
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
917
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
918 if (read(source, buf, 10) < 10) {
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
919 debug_printf("or not...\n");
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
920 close(source);
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
921 phb->func(phb->data, -1, GAIM_INPUT_READ);
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
922 g_free(phb->host);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
923 g_free(phb);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
924 return;
1087
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
925 }
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
926 if ((buf[0] != 0x05) || (buf[1] != 0x00)) {
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
927 debug_printf("bad data\n");
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
928 close(source);
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
929 phb->func(phb->data, -1, GAIM_INPUT_READ);
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
930 g_free(phb->host);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
931 g_free(phb);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
932 return;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
933 }
670
1690e6b432ae [gaim-migrate @ 680]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 664
diff changeset
934
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
935 phb->func(phb->data, source, GAIM_INPUT_READ);
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
936 g_free(phb->host);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
937 g_free(phb);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
938 return;
1
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
939 }
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
940
1844
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
941 static void s5_sendconnect(gpointer data, gint source)
1087
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
942 {
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
943 unsigned char buf[512];
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
944 struct PHB *phb = data;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
945 int hlen = strlen(phb->host);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
946
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
947 buf[0] = 0x05;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
948 buf[1] = 0x01; /* CONNECT */
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
949 buf[2] = 0x00; /* reserved */
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
950 buf[3] = 0x03; /* address type -- host name */
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
951 buf[4] = hlen;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
952 memcpy(buf + 5, phb->host, hlen);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
953 buf[5 + strlen(phb->host)] = phb->port >> 8;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
954 buf[5 + strlen(phb->host) + 1] = phb->port & 0xff;
1087
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
955
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
956 if (write(source, buf, (5 + strlen(phb->host) + 2)) < (5 + strlen(phb->host) + 2)) {
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
957 close(source);
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
958 phb->func(phb->data, -1, GAIM_INPUT_READ);
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
959 g_free(phb->host);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
960 g_free(phb);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
961 return;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
962 }
1087
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
963
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
964 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
965 }
1087
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
966
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
967 static void s5_readauth(gpointer data, gint source, GaimInputCondition cond)
1844
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
968 {
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
969 unsigned char buf[512];
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
970 struct PHB *phb = data;
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
971
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
972 gaim_input_remove(phb->inpa);
1844
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
973 debug_printf("got auth response\n");
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
974
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
975 if (read(source, buf, 2) < 2) {
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
976 close(source);
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
977 phb->func(phb->data, -1, GAIM_INPUT_READ);
1844
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
978 g_free(phb->host);
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
979 g_free(phb);
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
980 return;
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
981 }
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
982
2790
6aed180c94b1 [gaim-migrate @ 2803]
moocow
parents: 2754
diff changeset
983 if ((buf[0] != 0x01) || (buf[1] != 0x00)) {
1844
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
984 close(source);
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
985 phb->func(phb->data, -1, GAIM_INPUT_READ);
1844
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
986 g_free(phb->host);
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
987 g_free(phb);
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
988 return;
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
989 }
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
990
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
991 s5_sendconnect(phb, source);
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
992 }
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
993
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
994 static void s5_canread(gpointer data, gint source, GaimInputCondition cond)
1844
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
995 {
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
996 unsigned char buf[512];
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
997 struct PHB *phb = data;
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
998
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
999 gaim_input_remove(phb->inpa);
1844
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
1000 debug_printf("able to read\n");
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
1001
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
1002 if (read(source, buf, 2) < 2) {
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
1003 close(source);
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
1004 phb->func(phb->data, -1, GAIM_INPUT_READ);
1844
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
1005 g_free(phb->host);
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
1006 g_free(phb);
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
1007 return;
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
1008 }
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
1009
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
1010 if ((buf[0] != 0x05) || (buf[1] == 0xff)) {
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
1011 close(source);
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
1012 phb->func(phb->data, -1, GAIM_INPUT_READ);
1844
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
1013 g_free(phb->host);
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
1014 g_free(phb);
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
1015 return;
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
1016 }
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
1017
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
1018 if (buf[1] == 0x02) {
4634
c4318fc60090 [gaim-migrate @ 4941]
Nathan Walp <nwalp@pidgin.im>
parents: 4499
diff changeset
1019 unsigned int i = strlen(phb->gpi->proxyuser), j = strlen(phb->gpi->proxypass);
2372
c24942700dfd [gaim-migrate @ 2385]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2306
diff changeset
1020 buf[0] = 0x01; /* version 1 */
1844
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
1021 buf[1] = i;
4634
c4318fc60090 [gaim-migrate @ 4941]
Nathan Walp <nwalp@pidgin.im>
parents: 4499
diff changeset
1022 memcpy(buf + 2, phb->gpi->proxyuser, i);
2372
c24942700dfd [gaim-migrate @ 2385]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2306
diff changeset
1023 buf[2 + i] = j;
4634
c4318fc60090 [gaim-migrate @ 4941]
Nathan Walp <nwalp@pidgin.im>
parents: 4499
diff changeset
1024 memcpy(buf + 2 + i + 1, phb->gpi->proxypass, j);
3717
2fc0789e04e8 [gaim-migrate @ 3850]
Herman Bloggs <herman@bluedigits.com>
parents: 3630
diff changeset
1025
2372
c24942700dfd [gaim-migrate @ 2385]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2306
diff changeset
1026 if (write(source, buf, 3 + i + j) < 3 + i + j) {
1844
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
1027 close(source);
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
1028 phb->func(phb->data, -1, GAIM_INPUT_READ);
1844
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
1029 g_free(phb->host);
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
1030 g_free(phb);
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
1031 return;
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
1032 }
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
1033
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
1034 phb->inpa = gaim_input_add(source, GAIM_INPUT_READ, s5_readauth, phb);
1844
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
1035 } else {
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
1036 s5_sendconnect(phb, source);
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
1037 }
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
1038 }
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
1039
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
1040 static void s5_canwrite(gpointer data, gint source, GaimInputCondition cond)
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1041 {
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1042 unsigned char buf[512];
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1043 int i;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1044 struct PHB *phb = data;
2048
4ac8b9622c9e [gaim-migrate @ 2058]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1881
diff changeset
1045 unsigned int len;
4ac8b9622c9e [gaim-migrate @ 2058]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1881
diff changeset
1046 int error = ETIMEDOUT;
3717
2fc0789e04e8 [gaim-migrate @ 3850]
Herman Bloggs <herman@bluedigits.com>
parents: 3630
diff changeset
1047
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1048 debug_printf("Connected\n");
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1049 if (phb->inpa > 0)
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
1050 gaim_input_remove(phb->inpa);
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1051 len = sizeof(error);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1052 if (getsockopt(source, SOL_SOCKET, SO_ERROR, &error, &len) < 0) {
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1053 close(source);
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
1054 phb->func(phb->data, -1, GAIM_INPUT_READ);
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1055 g_free(phb->host);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1056 g_free(phb);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1057 return;
1087
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
1058 }
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1059 fcntl(source, F_SETFL, 0);
1087
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
1060
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
1061 i = 0;
1252
94fbface2d84 [gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1087
diff changeset
1062 buf[0] = 0x05; /* SOCKS version 5 */
4634
c4318fc60090 [gaim-migrate @ 4941]
Nathan Walp <nwalp@pidgin.im>
parents: 4499
diff changeset
1063 if (phb->gpi->proxyuser[0]) {
1844
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
1064 buf[1] = 0x02; /* two methods */
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
1065 buf[2] = 0x00; /* no authentication */
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
1066 buf[3] = 0x02; /* username/password authentication */
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
1067 i = 4;
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
1068 } else {
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
1069 buf[1] = 0x01;
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
1070 buf[2] = 0x00;
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
1071 i = 3;
161c00c36474 [gaim-migrate @ 1854]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1843
diff changeset
1072 }
3717
2fc0789e04e8 [gaim-migrate @ 3850]
Herman Bloggs <herman@bluedigits.com>
parents: 3630
diff changeset
1073
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1074 if (write(source, buf, i) < i) {
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1075 debug_printf("unable to write\n");
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1076 close(source);
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
1077 phb->func(phb->data, -1, GAIM_INPUT_READ);
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1078 g_free(phb->host);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1079 g_free(phb);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1080 return;
1087
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
1081 }
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
1082
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
1083 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
1084 }
1087
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
1085
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1086 static int 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
1087 {
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1088 int fd = -1;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1089
4634
c4318fc60090 [gaim-migrate @ 4941]
Nathan Walp <nwalp@pidgin.im>
parents: 4499
diff changeset
1090 debug_printf("connecting to %s:%d via %s:%d using SOCKS5\n", phb->host, phb->port, phb->gpi->proxyhost, phb->gpi->proxyport);
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1091
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1092 if ((fd = socket(addr->sa_family, SOCK_STREAM, 0)) < 0) {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1093 g_free(phb->host);
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1094 g_free(phb);
1087
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
1095 return -1;
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
1096 }
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
1097
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1098 fcntl(fd, F_SETFL, O_NONBLOCK);
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1099 if (connect(fd, addr, addrlen) < 0) {
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1100 if ((errno == EINPROGRESS) || (errno == EINTR)) {
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1101 debug_printf("Connect would have blocked\n");
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
1102 phb->inpa = gaim_input_add(fd, GAIM_INPUT_WRITE, s5_canwrite, phb);
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1103 } else {
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1104 close(fd);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1105 g_free(phb->host);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1106 g_free(phb);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1107 return -1;
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 } else {
2048
4ac8b9622c9e [gaim-migrate @ 2058]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1881
diff changeset
1110 unsigned int len;
4ac8b9622c9e [gaim-migrate @ 2058]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1881
diff changeset
1111 int error = ETIMEDOUT;
3717
2fc0789e04e8 [gaim-migrate @ 3850]
Herman Bloggs <herman@bluedigits.com>
parents: 3630
diff changeset
1112
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1113 debug_printf("Connect didn't block\n");
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1114 len = sizeof(error);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1115 if (getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &len) < 0) {
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1116 close(fd);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1117 g_free(phb->host);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1118 g_free(phb);
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1119 return -1;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1120 }
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1121 fcntl(fd, F_SETFL, 0);
2090
bab8b7e309db [gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2048
diff changeset
1122 s5_canwrite(phb, fd, GAIM_INPUT_WRITE);
1087
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
1123 }
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
1124
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
1125 return fd;
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
1126 }
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
1127
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1128 static void connection_host_resolved(struct sockaddr *addr, size_t addrlen, gpointer data, const char *error_message)
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1129 {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1130 struct PHB *phb = (struct PHB*)data;
4634
c4318fc60090 [gaim-migrate @ 4941]
Nathan Walp <nwalp@pidgin.im>
parents: 4499
diff changeset
1131
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1132 if(!addr)
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1133 {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1134 phb->func(phb->data, -1, GAIM_INPUT_READ);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1135 return;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1136 }
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1137
4634
c4318fc60090 [gaim-migrate @ 4941]
Nathan Walp <nwalp@pidgin.im>
parents: 4499
diff changeset
1138 switch(phb->gpi->proxytype)
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1139 {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1140 case PROXY_NONE:
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1141 proxy_connect_none(phb, addr, addrlen);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1142 break;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1143 case PROXY_HTTP:
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1144 proxy_connect_http(phb, addr, addrlen);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1145 break;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1146 case PROXY_SOCKS4:
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1147 proxy_connect_socks4(phb, addr, addrlen);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1148 break;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1149 case PROXY_SOCKS5:
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1150 proxy_connect_socks5(phb, addr, addrlen);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1151 break;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1152 }
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1153 }
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1154
4452
1e5d62c19533 [gaim-migrate @ 4727]
Sean Egan <seanegan@pidgin.im>
parents: 4447
diff changeset
1155 int
4634
c4318fc60090 [gaim-migrate @ 4941]
Nathan Walp <nwalp@pidgin.im>
parents: 4499
diff changeset
1156 proxy_connect(struct gaim_account *account, char *host, int port, GaimInputFunction func, gpointer data)
1087
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
1157 {
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1158 char *connecthost = host;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1159 int connectport = port;
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1160 struct PHB *phb = g_new0(struct PHB, 1);
4634
c4318fc60090 [gaim-migrate @ 4941]
Nathan Walp <nwalp@pidgin.im>
parents: 4499
diff changeset
1161 if(!account || !account->gpi)
c4318fc60090 [gaim-migrate @ 4941]
Nathan Walp <nwalp@pidgin.im>
parents: 4499
diff changeset
1162 phb->gpi = &global_proxy_info;
c4318fc60090 [gaim-migrate @ 4941]
Nathan Walp <nwalp@pidgin.im>
parents: 4499
diff changeset
1163 else
c4318fc60090 [gaim-migrate @ 4941]
Nathan Walp <nwalp@pidgin.im>
parents: 4499
diff changeset
1164 phb->gpi = account->gpi;
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1165 phb->func = func;
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1166 phb->data = data;
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1167 phb->host = g_strdup(host);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1168 phb->port = port;
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1169
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1170 if (!host || !port || (port == -1) || !func) {
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1171 if(host)
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1172 g_free(phb->host);
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1173 g_free(phb);
1087
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
1174 return -1;
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1175 }
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1176
4634
c4318fc60090 [gaim-migrate @ 4941]
Nathan Walp <nwalp@pidgin.im>
parents: 4499
diff changeset
1177 if ((phb->gpi->proxytype!=PROXY_NONE) && (!phb->gpi->proxyhost || !phb->gpi->proxyhost[0] || !phb->gpi->proxyport || (phb->gpi->proxyport == -1)))
c4318fc60090 [gaim-migrate @ 4941]
Nathan Walp <nwalp@pidgin.im>
parents: 4499
diff changeset
1178 phb->gpi->proxytype=PROXY_NONE;
1840
770bc15f419c [gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1705
diff changeset
1179
4634
c4318fc60090 [gaim-migrate @ 4941]
Nathan Walp <nwalp@pidgin.im>
parents: 4499
diff changeset
1180 switch(phb->gpi->proxytype)
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1181 {
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1182 case PROXY_NONE:
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1183 break;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1184 case PROXY_HTTP:
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1185 case PROXY_SOCKS4:
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1186 case PROXY_SOCKS5:
4634
c4318fc60090 [gaim-migrate @ 4941]
Nathan Walp <nwalp@pidgin.im>
parents: 4499
diff changeset
1187 connecthost=phb->gpi->proxyhost;
c4318fc60090 [gaim-migrate @ 4941]
Nathan Walp <nwalp@pidgin.im>
parents: 4499
diff changeset
1188 connectport=phb->gpi->proxyport;
4366
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1189 break;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1190 default:
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1191 g_free(phb->host);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1192 g_free(phb);
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1193 return -1;
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1194 }
d2b52a5ff6fc [gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents: 3867
diff changeset
1195
4499
79339f2e40d9 [gaim-migrate @ 4774]
Herman Bloggs <herman@bluedigits.com>
parents: 4452
diff changeset
1196 return gaim_gethostbyname_async(connecthost, connectport, connection_host_resolved, phb);
1087
bc9c6b635358 [gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1057
diff changeset
1197 }

mercurial