Mercurial > pidgin.yaz
annotate src/network.c @ 13352:475214c22abf
[gaim-migrate @ 15724]
SF Patch #1421209 from Sadrul
"Currently, if some inactive conversation causes some
system messages to be written on the gtkconv, that
conversation is made active."
Now, "we don't switch at all for non-send/non-recv
messages".
committer: Tailor Script <tailor@pidgin.im>
author | Richard Laager <rlaager@wiktel.com> |
---|---|
date | Wed, 01 Mar 2006 02:48:09 +0000 |
parents | d7b6e358493d |
children | 95cc25e78ef6 |
rev | line source |
---|---|
8231 | 1 /** |
2 * @file network.c Network Implementation | |
3 * @ingroup core | |
4 * | |
5 * gaim | |
6 * | |
7 * Gaim is the legal property of its developers, whose names are too numerous | |
8 * to list here. Please refer to the COPYRIGHT file distributed with this | |
9 * source distribution. | |
10 * | |
11 * This program is free software; you can redistribute it and/or modify | |
12 * it under the terms of the GNU General Public License as published by | |
13 * the Free Software Foundation; either version 2 of the License, or | |
14 * (at your option) any later version. | |
15 * | |
16 * This program is distributed in the hope that it will be useful, | |
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
19 * GNU General Public License for more details. | |
20 * | |
21 * You should have received a copy of the GNU General Public License | |
22 * along with this program; if not, write to the Free Software | |
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
24 */ | |
25 | |
8245
91c6629b1ee8
[gaim-migrate @ 8968]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
8240
diff
changeset
|
26 #include "internal.h" |
8231 | 27 |
13155 | 28 #ifndef _WIN32 |
29 #include <net/if.h> | |
30 #include <sys/ioctl.h> | |
31 #endif | |
32 | |
33 /* Solaris */ | |
34 #if defined (__SVR4) && defined (__sun) | |
35 #include <sys/sockio.h> | |
36 #endif | |
37 | |
8231 | 38 #include "debug.h" |
39 #include "account.h" | |
40 #include "network.h" | |
41 #include "prefs.h" | |
11411 | 42 #include "stun.h" |
11195 | 43 #include "upnp.h" |
8231 | 44 |
12909
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
45 typedef struct { |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
46 int listenfd; |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
47 int socket_type; |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
48 gboolean retry; |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
49 gboolean adding; |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
50 GaimNetworkListenCallback cb; |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
51 gpointer cb_data; |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
52 } ListenUPnPData; |
11391 | 53 |
8838 | 54 const unsigned char * |
55 gaim_network_ip_atoi(const char *ip) | |
56 { | |
57 static unsigned char ret[4]; | |
8981 | 58 gchar *delimiter = "."; |
8838 | 59 gchar **split; |
60 int i; | |
61 | |
62 g_return_val_if_fail(ip != NULL, NULL); | |
63 | |
8981 | 64 split = g_strsplit(ip, delimiter, 4); |
8838 | 65 for (i = 0; split[i] != NULL; i++) |
66 ret[i] = atoi(split[i]); | |
67 g_strfreev(split); | |
68 | |
69 /* i should always be 4 */ | |
70 if (i != 4) | |
71 return NULL; | |
72 | |
73 return ret; | |
74 } | |
75 | |
8231 | 76 void |
8834 | 77 gaim_network_set_public_ip(const char *ip) |
8231 | 78 { |
79 g_return_if_fail(ip != NULL); | |
80 | |
8838 | 81 /* XXX - Ensure the IP address is valid */ |
82 | |
8231 | 83 gaim_prefs_set_string("/core/network/public_ip", ip); |
84 } | |
85 | |
86 const char * | |
8834 | 87 gaim_network_get_public_ip(void) |
8231 | 88 { |
13129 | 89 return gaim_prefs_get_string("/core/network/public_ip"); |
8231 | 90 } |
91 | |
92 const char * | |
93 gaim_network_get_local_system_ip(int fd) | |
94 { | |
13345 | 95 char buffer[1024]; |
96 static char ip[16]; | |
97 char *tmp; | |
98 struct ifconf ifc; | |
99 struct ifreq *ifr; | |
100 struct sockaddr_in *sinptr; | |
101 guint32 lhost = htonl(127 * 256 * 256 * 256 + 1); | |
102 long unsigned int add; | |
103 int source = fd; | |
8231 | 104 |
13345 | 105 if (fd < 0) |
106 source = socket(PF_INET,SOCK_STREAM, 0); | |
8231 | 107 |
13345 | 108 ifc.ifc_len = sizeof(buffer); |
109 ifc.ifc_req = (struct ifreq *)buffer; | |
110 ioctl(source, SIOCGIFCONF, &ifc); | |
8231 | 111 |
13345 | 112 if (fd < 0) |
113 close(source); | |
8231 | 114 |
13345 | 115 tmp = buffer; |
116 while (tmp < buffer + ifc.ifc_len) | |
117 { | |
118 ifr = (struct ifreq *)tmp; | |
119 tmp += sizeof(struct ifreq); | |
8231 | 120 |
13345 | 121 if (ifr->ifr_addr.sa_family == AF_INET) |
122 { | |
123 sinptr = (struct sockaddr_in *)&ifr->ifr_addr; | |
124 if (sinptr->sin_addr.s_addr != lhost) | |
125 { | |
126 add = ntohl(sinptr->sin_addr.s_addr); | |
127 g_snprintf(ip, 16, "%lu.%lu.%lu.%lu", | |
128 ((add >> 24) & 255), | |
129 ((add >> 16) & 255), | |
130 ((add >> 8) & 255), | |
131 add & 255); | |
8231 | 132 |
13345 | 133 return ip; |
134 } | |
135 } | |
136 } | |
137 | |
138 return "0.0.0.0"; | |
8231 | 139 } |
140 | |
141 const char * | |
8838 | 142 gaim_network_get_my_ip(int fd) |
8231 | 143 { |
12686
5f65a0cca87c
[gaim-migrate @ 15029]
Richard Laager <rlaager@wiktel.com>
parents:
11424
diff
changeset
|
144 const char *ip = NULL; |
5f65a0cca87c
[gaim-migrate @ 15029]
Richard Laager <rlaager@wiktel.com>
parents:
11424
diff
changeset
|
145 GaimStunNatDiscovery *stun; |
8834 | 146 |
147 /* Check if the user specified an IP manually */ | |
148 if (!gaim_prefs_get_bool("/core/network/auto_ip")) { | |
149 ip = gaim_network_get_public_ip(); | |
13129 | 150 if ((ip != NULL) && (*ip != '\0')) |
8834 | 151 return ip; |
152 } | |
153 | |
13129 | 154 /* Check if STUN discovery was already done */ |
155 stun = gaim_stun_discover(NULL); | |
156 if ((stun != NULL) && (stun->status == GAIM_STUN_STATUS_DISCOVERED)) | |
157 return stun->publicip; | |
11424 | 158 |
13129 | 159 /* Attempt to get the IP from a NAT device using UPnP */ |
160 ip = gaim_upnp_get_public_ip(); | |
161 if (ip != NULL) | |
162 return ip; | |
11195 | 163 |
8834 | 164 /* Just fetch the IP of the local system */ |
165 return gaim_network_get_local_system_ip(fd); | |
8231 | 166 } |
167 | |
11391 | 168 |
12909
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
169 static void |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
170 gaim_network_set_upnp_port_mapping_cb(gboolean success, gpointer data) |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
171 { |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
172 ListenUPnPData *ldata = data; |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
173 |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
174 if (!success) { |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
175 gaim_debug_warning("network", "Couldn't create UPnP mapping for...\n"); |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
176 if (ldata->retry) { |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
177 ldata->retry = FALSE; |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
178 ldata->adding = FALSE; |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
179 gaim_upnp_remove_port_mapping( |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
180 gaim_network_get_port_from_fd(ldata->listenfd), |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
181 (ldata->socket_type == SOCK_STREAM) ? "TCP" : "UDP", |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
182 gaim_network_set_upnp_port_mapping_cb, ldata); |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
183 return; |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
184 } |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
185 } else if (!ldata->adding) { |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
186 /* We've tried successfully to remove the port mapping. |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
187 * Try to add it again */ |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
188 ldata->adding = TRUE; |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
189 gaim_upnp_set_port_mapping( |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
190 gaim_network_get_port_from_fd(ldata->listenfd), |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
191 (ldata->socket_type == SOCK_STREAM) ? "TCP" : "UDP", |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
192 gaim_network_set_upnp_port_mapping_cb, ldata); |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
193 return; |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
194 } |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
195 |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
196 if (ldata->cb) |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
197 ldata->cb(ldata->listenfd, ldata->cb_data); |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
198 |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
199 g_free(ldata); |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
200 } |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
201 |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
202 |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
203 static gboolean |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
204 gaim_network_do_listen(unsigned short port, int socket_type, GaimNetworkListenCallback cb, gpointer cb_data) |
8231 | 205 { |
9452 | 206 int listenfd = -1; |
8231 | 207 const int on = 1; |
12917
a85c8c11bfab
[gaim-migrate @ 15270]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12909
diff
changeset
|
208 ListenUPnPData *ld; |
9449 | 209 #if HAVE_GETADDRINFO |
210 int errnum; | |
211 struct addrinfo hints, *res, *next; | |
9456 | 212 char serv[6]; |
8231 | 213 |
9449 | 214 /* |
215 * Get a list of addresses on this machine. | |
216 */ | |
217 snprintf(serv, sizeof(serv), "%hu", port); | |
8231 | 218 memset(&hints, 0, sizeof(struct addrinfo)); |
219 hints.ai_flags = AI_PASSIVE; | |
220 hints.ai_family = AF_UNSPEC; | |
12730
d5b8f4dc1622
[gaim-migrate @ 15074]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12728
diff
changeset
|
221 hints.ai_socktype = socket_type; |
9449 | 222 errnum = getaddrinfo(NULL /* any IP */, serv, &hints, &res); |
223 if (errnum != 0) { | |
11221
5ed33bb06a84
[gaim-migrate @ 13353]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11215
diff
changeset
|
224 #ifndef _WIN32 |
9449 | 225 gaim_debug_warning("network", "getaddrinfo: %s\n", gai_strerror(errnum)); |
226 if (errnum == EAI_SYSTEM) | |
227 gaim_debug_warning("network", "getaddrinfo: system error: %s\n", strerror(errno)); | |
11221
5ed33bb06a84
[gaim-migrate @ 13353]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11215
diff
changeset
|
228 #else |
12909
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
229 gaim_debug_warning("network", "getaddrinfo: Error Code = %d\n", errnum); |
11221
5ed33bb06a84
[gaim-migrate @ 13353]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11215
diff
changeset
|
230 #endif |
12909
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
231 return FALSE; |
8231 | 232 } |
9449 | 233 |
234 /* | |
235 * Go through the list of addresses and attempt to listen on | |
236 * one of them. | |
237 * XXX - Try IPv6 addresses first? | |
238 */ | |
239 for (next = res; next != NULL; next = next->ai_next) { | |
9455 | 240 listenfd = socket(next->ai_family, next->ai_socktype, next->ai_protocol); |
8231 | 241 if (listenfd < 0) |
242 continue; | |
9449 | 243 if (setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) != 0) |
244 gaim_debug_warning("network", "setsockopt: %s\n", strerror(errno)); | |
9455 | 245 if (bind(listenfd, next->ai_addr, next->ai_addrlen) == 0) |
8231 | 246 break; /* success */ |
12730
d5b8f4dc1622
[gaim-migrate @ 15074]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12728
diff
changeset
|
247 /* XXX - It is unclear to me (datallah) whether we need to be |
d5b8f4dc1622
[gaim-migrate @ 15074]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12728
diff
changeset
|
248 using a new socket each time */ |
8231 | 249 close(listenfd); |
9449 | 250 } |
8231 | 251 |
9449 | 252 freeaddrinfo(res); |
8231 | 253 |
9449 | 254 if (next == NULL) |
12909
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
255 return FALSE; |
8231 | 256 #else |
257 struct sockaddr_in sockin; | |
258 | |
12730
d5b8f4dc1622
[gaim-migrate @ 15074]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12728
diff
changeset
|
259 if ((listenfd = socket(AF_INET, socket_type, 0)) < 0) { |
8231 | 260 gaim_debug_warning("network", "socket: %s\n", strerror(errno)); |
12909
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
261 return FALSE; |
8231 | 262 } |
263 | |
9449 | 264 if (setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) != 0) |
8231 | 265 gaim_debug_warning("network", "setsockopt: %s\n", strerror(errno)); |
266 | |
267 memset(&sockin, 0, sizeof(struct sockaddr_in)); | |
9449 | 268 sockin.sin_family = PF_INET; |
8251 | 269 sockin.sin_port = htons(port); |
8231 | 270 |
271 if (bind(listenfd, (struct sockaddr *)&sockin, sizeof(struct sockaddr_in)) != 0) { | |
272 gaim_debug_warning("network", "bind: %s\n", strerror(errno)); | |
273 close(listenfd); | |
12909
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
274 return FALSE; |
8231 | 275 } |
276 #endif | |
277 | |
12730
d5b8f4dc1622
[gaim-migrate @ 15074]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12728
diff
changeset
|
278 if (socket_type == SOCK_STREAM && listen(listenfd, 4) != 0) { |
8231 | 279 gaim_debug_warning("network", "listen: %s\n", strerror(errno)); |
280 close(listenfd); | |
12909
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
281 return FALSE; |
8231 | 282 } |
283 fcntl(listenfd, F_SETFL, O_NONBLOCK); | |
284 | |
12909
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
285 gaim_debug_info("network", "Listening on port: %hu\n", gaim_network_get_port_from_fd(listenfd)); |
11391 | 286 |
12909
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
287 ld = g_new0(ListenUPnPData, 1); |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
288 ld->listenfd = listenfd; |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
289 ld->adding = TRUE; |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
290 ld->retry = TRUE; |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
291 ld->cb = cb; |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
292 ld->cb_data = cb_data; |
11195 | 293 |
12909
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
294 gaim_upnp_set_port_mapping( |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
295 gaim_network_get_port_from_fd(listenfd), |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
296 (socket_type == SOCK_STREAM) ? "TCP" : "UDP", |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
297 gaim_network_set_upnp_port_mapping_cb, ld); |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
298 |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
299 return TRUE; |
8231 | 300 } |
301 | |
12909
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
302 gboolean |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
303 gaim_network_listen(unsigned short port, int socket_type, |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
304 GaimNetworkListenCallback cb, gpointer cb_data) |
8246 | 305 { |
8250 | 306 g_return_val_if_fail(port != 0, -1); |
307 | |
12909
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
308 return gaim_network_do_listen(port, socket_type, cb, cb_data); |
8246 | 309 } |
310 | |
12909
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
311 gboolean |
12730
d5b8f4dc1622
[gaim-migrate @ 15074]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12728
diff
changeset
|
312 gaim_network_listen_range(unsigned short start, unsigned short end, |
12909
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
313 int socket_type, GaimNetworkListenCallback cb, gpointer cb_data) |
8231 | 314 { |
12909
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
315 gboolean ret = FALSE; |
8231 | 316 |
8250 | 317 if (gaim_prefs_get_bool("/core/network/ports_range_use")) { |
8239 | 318 start = gaim_prefs_get_int("/core/network/ports_range_start"); |
319 end = gaim_prefs_get_int("/core/network/ports_range_end"); | |
8250 | 320 } else { |
321 if (end < start) | |
322 end = start; | |
8239 | 323 } |
8231 | 324 |
325 for (; start <= end; start++) { | |
12909
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
326 ret = gaim_network_do_listen(start, socket_type, cb, cb_data); |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
327 if (ret) |
8231 | 328 break; |
329 } | |
330 | |
331 return ret; | |
332 } | |
333 | |
8834 | 334 unsigned short |
335 gaim_network_get_port_from_fd(int fd) | |
8231 | 336 { |
337 struct sockaddr_in addr; | |
338 socklen_t len; | |
339 | |
9449 | 340 g_return_val_if_fail(fd >= 0, 0); |
8231 | 341 |
342 len = sizeof(addr); | |
343 if (getsockname(fd, (struct sockaddr *) &addr, &len) == -1) { | |
344 gaim_debug_warning("network", "getsockname: %s\n", strerror(errno)); | |
345 return 0; | |
346 } | |
347 | |
348 return ntohs(addr.sin_port); | |
349 } | |
350 | |
351 void | |
352 gaim_network_init(void) | |
353 { | |
354 gaim_prefs_add_none ("/core/network"); | |
355 gaim_prefs_add_bool ("/core/network/auto_ip", TRUE); | |
356 gaim_prefs_add_string("/core/network/public_ip", ""); | |
357 gaim_prefs_add_bool ("/core/network/ports_range_use", FALSE); | |
358 gaim_prefs_add_int ("/core/network/ports_range_start", 1024); | |
359 gaim_prefs_add_int ("/core/network/ports_range_end", 2048); | |
12909
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
360 |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12730
diff
changeset
|
361 gaim_upnp_discover(NULL, NULL); |
8231 | 362 } |