Wed, 09 Aug 2006 14:47:37 +0000
[gaim-migrate @ 16679]
some translation updates. I have questions about gu.po, if someone sees that answered, we might need to revert that part of the change. It is all very confusing. The same person submitted the original gu.po and this update, but he called it gu_IN this timeā¦
| 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
c1397ca0a619
[gaim-migrate @ 8968]
Herman Bloggs <herman@bluedigits.com>
parents:
8240
diff
changeset
|
26 | #include "internal.h" |
| 8231 | 27 | |
|
13156
539a637c61dc
[gaim-migrate @ 15518]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
13131
diff
changeset
|
28 | #ifndef _WIN32 |
|
539a637c61dc
[gaim-migrate @ 15518]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
13131
diff
changeset
|
29 | #include <net/if.h> |
|
539a637c61dc
[gaim-migrate @ 15518]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
13131
diff
changeset
|
30 | #include <sys/ioctl.h> |
|
539a637c61dc
[gaim-migrate @ 15518]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
13131
diff
changeset
|
31 | #endif |
|
539a637c61dc
[gaim-migrate @ 15518]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
13131
diff
changeset
|
32 | |
|
539a637c61dc
[gaim-migrate @ 15518]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
13131
diff
changeset
|
33 | /* Solaris */ |
|
539a637c61dc
[gaim-migrate @ 15518]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
13131
diff
changeset
|
34 | #if defined (__SVR4) && defined (__sun) |
|
539a637c61dc
[gaim-migrate @ 15518]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
13131
diff
changeset
|
35 | #include <sys/sockio.h> |
|
539a637c61dc
[gaim-migrate @ 15518]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
13131
diff
changeset
|
36 | #endif |
|
539a637c61dc
[gaim-migrate @ 15518]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
13131
diff
changeset
|
37 | |
| 8231 | 38 | #include "debug.h" |
| 39 | #include "account.h" | |
| 40 | #include "network.h" | |
| 41 | #include "prefs.h" | |
|
11411
b74834586187
[gaim-migrate @ 13648]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11391
diff
changeset
|
42 | #include "stun.h" |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
11033
diff
changeset
|
43 | #include "upnp.h" |
| 8231 | 44 | |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
45 | typedef struct { |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
46 | int listenfd; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
47 | int socket_type; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
48 | gboolean retry; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
49 | gboolean adding; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
50 | GaimNetworkListenCallback cb; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
51 | gpointer cb_data; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
52 | } ListenUPnPData; |
|
11391
d172e72988cc
[gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents:
11336
diff
changeset
|
53 | |
|
8838
c23227da7b4a
[gaim-migrate @ 9604]
Mark Doliner <markdoliner@pidgin.im>
parents:
8834
diff
changeset
|
54 | const unsigned char * |
|
c23227da7b4a
[gaim-migrate @ 9604]
Mark Doliner <markdoliner@pidgin.im>
parents:
8834
diff
changeset
|
55 | gaim_network_ip_atoi(const char *ip) |
|
c23227da7b4a
[gaim-migrate @ 9604]
Mark Doliner <markdoliner@pidgin.im>
parents:
8834
diff
changeset
|
56 | { |
|
c23227da7b4a
[gaim-migrate @ 9604]
Mark Doliner <markdoliner@pidgin.im>
parents:
8834
diff
changeset
|
57 | static unsigned char ret[4]; |
| 8981 | 58 | gchar *delimiter = "."; |
|
8838
c23227da7b4a
[gaim-migrate @ 9604]
Mark Doliner <markdoliner@pidgin.im>
parents:
8834
diff
changeset
|
59 | gchar **split; |
|
c23227da7b4a
[gaim-migrate @ 9604]
Mark Doliner <markdoliner@pidgin.im>
parents:
8834
diff
changeset
|
60 | int i; |
|
c23227da7b4a
[gaim-migrate @ 9604]
Mark Doliner <markdoliner@pidgin.im>
parents:
8834
diff
changeset
|
61 | |
|
c23227da7b4a
[gaim-migrate @ 9604]
Mark Doliner <markdoliner@pidgin.im>
parents:
8834
diff
changeset
|
62 | g_return_val_if_fail(ip != NULL, NULL); |
|
c23227da7b4a
[gaim-migrate @ 9604]
Mark Doliner <markdoliner@pidgin.im>
parents:
8834
diff
changeset
|
63 | |
| 8981 | 64 | split = g_strsplit(ip, delimiter, 4); |
|
8838
c23227da7b4a
[gaim-migrate @ 9604]
Mark Doliner <markdoliner@pidgin.im>
parents:
8834
diff
changeset
|
65 | for (i = 0; split[i] != NULL; i++) |
|
c23227da7b4a
[gaim-migrate @ 9604]
Mark Doliner <markdoliner@pidgin.im>
parents:
8834
diff
changeset
|
66 | ret[i] = atoi(split[i]); |
|
c23227da7b4a
[gaim-migrate @ 9604]
Mark Doliner <markdoliner@pidgin.im>
parents:
8834
diff
changeset
|
67 | g_strfreev(split); |
|
c23227da7b4a
[gaim-migrate @ 9604]
Mark Doliner <markdoliner@pidgin.im>
parents:
8834
diff
changeset
|
68 | |
|
c23227da7b4a
[gaim-migrate @ 9604]
Mark Doliner <markdoliner@pidgin.im>
parents:
8834
diff
changeset
|
69 | /* i should always be 4 */ |
|
c23227da7b4a
[gaim-migrate @ 9604]
Mark Doliner <markdoliner@pidgin.im>
parents:
8834
diff
changeset
|
70 | if (i != 4) |
|
c23227da7b4a
[gaim-migrate @ 9604]
Mark Doliner <markdoliner@pidgin.im>
parents:
8834
diff
changeset
|
71 | return NULL; |
|
c23227da7b4a
[gaim-migrate @ 9604]
Mark Doliner <markdoliner@pidgin.im>
parents:
8834
diff
changeset
|
72 | |
|
c23227da7b4a
[gaim-migrate @ 9604]
Mark Doliner <markdoliner@pidgin.im>
parents:
8834
diff
changeset
|
73 | return ret; |
|
c23227da7b4a
[gaim-migrate @ 9604]
Mark Doliner <markdoliner@pidgin.im>
parents:
8834
diff
changeset
|
74 | } |
|
c23227da7b4a
[gaim-migrate @ 9604]
Mark Doliner <markdoliner@pidgin.im>
parents:
8834
diff
changeset
|
75 | |
| 8231 | 76 | void |
|
8834
0a798e3d2b84
[gaim-migrate @ 9598]
Mark Doliner <markdoliner@pidgin.im>
parents:
8251
diff
changeset
|
77 | gaim_network_set_public_ip(const char *ip) |
| 8231 | 78 | { |
| 79 | g_return_if_fail(ip != NULL); | |
| 80 | ||
|
8838
c23227da7b4a
[gaim-migrate @ 9604]
Mark Doliner <markdoliner@pidgin.im>
parents:
8834
diff
changeset
|
81 | /* XXX - Ensure the IP address is valid */ |
|
c23227da7b4a
[gaim-migrate @ 9604]
Mark Doliner <markdoliner@pidgin.im>
parents:
8834
diff
changeset
|
82 | |
| 8231 | 83 | gaim_prefs_set_string("/core/network/public_ip", ip); |
| 84 | } | |
| 85 | ||
| 86 | const char * | |
|
8834
0a798e3d2b84
[gaim-migrate @ 9598]
Mark Doliner <markdoliner@pidgin.im>
parents:
8251
diff
changeset
|
87 | gaim_network_get_public_ip(void) |
| 8231 | 88 | { |
|
13130
e9adbdc1546a
[gaim-migrate @ 15491]
Mark Doliner <markdoliner@pidgin.im>
parents:
12917
diff
changeset
|
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 | { | |
|
13346
a024b2b0a160
[gaim-migrate @ 15715]
Mark Doliner <markdoliner@pidgin.im>
parents:
13168
diff
changeset
|
95 | char buffer[1024]; |
|
a024b2b0a160
[gaim-migrate @ 15715]
Mark Doliner <markdoliner@pidgin.im>
parents:
13168
diff
changeset
|
96 | static char ip[16]; |
|
a024b2b0a160
[gaim-migrate @ 15715]
Mark Doliner <markdoliner@pidgin.im>
parents:
13168
diff
changeset
|
97 | char *tmp; |
|
a024b2b0a160
[gaim-migrate @ 15715]
Mark Doliner <markdoliner@pidgin.im>
parents:
13168
diff
changeset
|
98 | struct ifconf ifc; |
|
a024b2b0a160
[gaim-migrate @ 15715]
Mark Doliner <markdoliner@pidgin.im>
parents:
13168
diff
changeset
|
99 | struct ifreq *ifr; |
|
a024b2b0a160
[gaim-migrate @ 15715]
Mark Doliner <markdoliner@pidgin.im>
parents:
13168
diff
changeset
|
100 | struct sockaddr_in *sinptr; |
|
a024b2b0a160
[gaim-migrate @ 15715]
Mark Doliner <markdoliner@pidgin.im>
parents:
13168
diff
changeset
|
101 | guint32 lhost = htonl(127 * 256 * 256 * 256 + 1); |
|
a024b2b0a160
[gaim-migrate @ 15715]
Mark Doliner <markdoliner@pidgin.im>
parents:
13168
diff
changeset
|
102 | long unsigned int add; |
|
a024b2b0a160
[gaim-migrate @ 15715]
Mark Doliner <markdoliner@pidgin.im>
parents:
13168
diff
changeset
|
103 | int source = fd; |
| 8231 | 104 | |
|
13346
a024b2b0a160
[gaim-migrate @ 15715]
Mark Doliner <markdoliner@pidgin.im>
parents:
13168
diff
changeset
|
105 | if (fd < 0) |
|
a024b2b0a160
[gaim-migrate @ 15715]
Mark Doliner <markdoliner@pidgin.im>
parents:
13168
diff
changeset
|
106 | source = socket(PF_INET,SOCK_STREAM, 0); |
| 8231 | 107 | |
|
13346
a024b2b0a160
[gaim-migrate @ 15715]
Mark Doliner <markdoliner@pidgin.im>
parents:
13168
diff
changeset
|
108 | ifc.ifc_len = sizeof(buffer); |
|
a024b2b0a160
[gaim-migrate @ 15715]
Mark Doliner <markdoliner@pidgin.im>
parents:
13168
diff
changeset
|
109 | ifc.ifc_req = (struct ifreq *)buffer; |
|
a024b2b0a160
[gaim-migrate @ 15715]
Mark Doliner <markdoliner@pidgin.im>
parents:
13168
diff
changeset
|
110 | ioctl(source, SIOCGIFCONF, &ifc); |
| 8231 | 111 | |
|
13346
a024b2b0a160
[gaim-migrate @ 15715]
Mark Doliner <markdoliner@pidgin.im>
parents:
13168
diff
changeset
|
112 | if (fd < 0) |
|
a024b2b0a160
[gaim-migrate @ 15715]
Mark Doliner <markdoliner@pidgin.im>
parents:
13168
diff
changeset
|
113 | close(source); |
| 8231 | 114 | |
|
13346
a024b2b0a160
[gaim-migrate @ 15715]
Mark Doliner <markdoliner@pidgin.im>
parents:
13168
diff
changeset
|
115 | tmp = buffer; |
|
a024b2b0a160
[gaim-migrate @ 15715]
Mark Doliner <markdoliner@pidgin.im>
parents:
13168
diff
changeset
|
116 | while (tmp < buffer + ifc.ifc_len) |
|
a024b2b0a160
[gaim-migrate @ 15715]
Mark Doliner <markdoliner@pidgin.im>
parents:
13168
diff
changeset
|
117 | { |
|
a024b2b0a160
[gaim-migrate @ 15715]
Mark Doliner <markdoliner@pidgin.im>
parents:
13168
diff
changeset
|
118 | ifr = (struct ifreq *)tmp; |
|
a024b2b0a160
[gaim-migrate @ 15715]
Mark Doliner <markdoliner@pidgin.im>
parents:
13168
diff
changeset
|
119 | tmp += sizeof(struct ifreq); |
| 8231 | 120 | |
|
13346
a024b2b0a160
[gaim-migrate @ 15715]
Mark Doliner <markdoliner@pidgin.im>
parents:
13168
diff
changeset
|
121 | if (ifr->ifr_addr.sa_family == AF_INET) |
|
a024b2b0a160
[gaim-migrate @ 15715]
Mark Doliner <markdoliner@pidgin.im>
parents:
13168
diff
changeset
|
122 | { |
|
a024b2b0a160
[gaim-migrate @ 15715]
Mark Doliner <markdoliner@pidgin.im>
parents:
13168
diff
changeset
|
123 | sinptr = (struct sockaddr_in *)&ifr->ifr_addr; |
|
a024b2b0a160
[gaim-migrate @ 15715]
Mark Doliner <markdoliner@pidgin.im>
parents:
13168
diff
changeset
|
124 | if (sinptr->sin_addr.s_addr != lhost) |
|
a024b2b0a160
[gaim-migrate @ 15715]
Mark Doliner <markdoliner@pidgin.im>
parents:
13168
diff
changeset
|
125 | { |
|
a024b2b0a160
[gaim-migrate @ 15715]
Mark Doliner <markdoliner@pidgin.im>
parents:
13168
diff
changeset
|
126 | add = ntohl(sinptr->sin_addr.s_addr); |
|
a024b2b0a160
[gaim-migrate @ 15715]
Mark Doliner <markdoliner@pidgin.im>
parents:
13168
diff
changeset
|
127 | g_snprintf(ip, 16, "%lu.%lu.%lu.%lu", |
|
a024b2b0a160
[gaim-migrate @ 15715]
Mark Doliner <markdoliner@pidgin.im>
parents:
13168
diff
changeset
|
128 | ((add >> 24) & 255), |
|
a024b2b0a160
[gaim-migrate @ 15715]
Mark Doliner <markdoliner@pidgin.im>
parents:
13168
diff
changeset
|
129 | ((add >> 16) & 255), |
|
a024b2b0a160
[gaim-migrate @ 15715]
Mark Doliner <markdoliner@pidgin.im>
parents:
13168
diff
changeset
|
130 | ((add >> 8) & 255), |
|
a024b2b0a160
[gaim-migrate @ 15715]
Mark Doliner <markdoliner@pidgin.im>
parents:
13168
diff
changeset
|
131 | add & 255); |
| 8231 | 132 | |
|
13346
a024b2b0a160
[gaim-migrate @ 15715]
Mark Doliner <markdoliner@pidgin.im>
parents:
13168
diff
changeset
|
133 | return ip; |
|
a024b2b0a160
[gaim-migrate @ 15715]
Mark Doliner <markdoliner@pidgin.im>
parents:
13168
diff
changeset
|
134 | } |
|
a024b2b0a160
[gaim-migrate @ 15715]
Mark Doliner <markdoliner@pidgin.im>
parents:
13168
diff
changeset
|
135 | } |
|
a024b2b0a160
[gaim-migrate @ 15715]
Mark Doliner <markdoliner@pidgin.im>
parents:
13168
diff
changeset
|
136 | } |
|
a024b2b0a160
[gaim-migrate @ 15715]
Mark Doliner <markdoliner@pidgin.im>
parents:
13168
diff
changeset
|
137 | |
|
a024b2b0a160
[gaim-migrate @ 15715]
Mark Doliner <markdoliner@pidgin.im>
parents:
13168
diff
changeset
|
138 | return "0.0.0.0"; |
| 8231 | 139 | } |
| 140 | ||
| 141 | const char * | |
|
8838
c23227da7b4a
[gaim-migrate @ 9604]
Mark Doliner <markdoliner@pidgin.im>
parents:
8834
diff
changeset
|
142 | gaim_network_get_my_ip(int fd) |
| 8231 | 143 | { |
|
12686
ec3e7c4ff045
[gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents:
11424
diff
changeset
|
144 | const char *ip = NULL; |
|
ec3e7c4ff045
[gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents:
11424
diff
changeset
|
145 | GaimStunNatDiscovery *stun; |
|
8834
0a798e3d2b84
[gaim-migrate @ 9598]
Mark Doliner <markdoliner@pidgin.im>
parents:
8251
diff
changeset
|
146 | |
|
0a798e3d2b84
[gaim-migrate @ 9598]
Mark Doliner <markdoliner@pidgin.im>
parents:
8251
diff
changeset
|
147 | /* Check if the user specified an IP manually */ |
|
0a798e3d2b84
[gaim-migrate @ 9598]
Mark Doliner <markdoliner@pidgin.im>
parents:
8251
diff
changeset
|
148 | if (!gaim_prefs_get_bool("/core/network/auto_ip")) { |
|
0a798e3d2b84
[gaim-migrate @ 9598]
Mark Doliner <markdoliner@pidgin.im>
parents:
8251
diff
changeset
|
149 | ip = gaim_network_get_public_ip(); |
|
13130
e9adbdc1546a
[gaim-migrate @ 15491]
Mark Doliner <markdoliner@pidgin.im>
parents:
12917
diff
changeset
|
150 | if ((ip != NULL) && (*ip != '\0')) |
|
8834
0a798e3d2b84
[gaim-migrate @ 9598]
Mark Doliner <markdoliner@pidgin.im>
parents:
8251
diff
changeset
|
151 | return ip; |
|
0a798e3d2b84
[gaim-migrate @ 9598]
Mark Doliner <markdoliner@pidgin.im>
parents:
8251
diff
changeset
|
152 | } |
|
0a798e3d2b84
[gaim-migrate @ 9598]
Mark Doliner <markdoliner@pidgin.im>
parents:
8251
diff
changeset
|
153 | |
|
13130
e9adbdc1546a
[gaim-migrate @ 15491]
Mark Doliner <markdoliner@pidgin.im>
parents:
12917
diff
changeset
|
154 | /* Check if STUN discovery was already done */ |
|
e9adbdc1546a
[gaim-migrate @ 15491]
Mark Doliner <markdoliner@pidgin.im>
parents:
12917
diff
changeset
|
155 | stun = gaim_stun_discover(NULL); |
|
e9adbdc1546a
[gaim-migrate @ 15491]
Mark Doliner <markdoliner@pidgin.im>
parents:
12917
diff
changeset
|
156 | if ((stun != NULL) && (stun->status == GAIM_STUN_STATUS_DISCOVERED)) |
|
e9adbdc1546a
[gaim-migrate @ 15491]
Mark Doliner <markdoliner@pidgin.im>
parents:
12917
diff
changeset
|
157 | return stun->publicip; |
|
11424
b0f8535daa74
[gaim-migrate @ 13661]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11411
diff
changeset
|
158 | |
|
13130
e9adbdc1546a
[gaim-migrate @ 15491]
Mark Doliner <markdoliner@pidgin.im>
parents:
12917
diff
changeset
|
159 | /* Attempt to get the IP from a NAT device using UPnP */ |
|
e9adbdc1546a
[gaim-migrate @ 15491]
Mark Doliner <markdoliner@pidgin.im>
parents:
12917
diff
changeset
|
160 | ip = gaim_upnp_get_public_ip(); |
|
e9adbdc1546a
[gaim-migrate @ 15491]
Mark Doliner <markdoliner@pidgin.im>
parents:
12917
diff
changeset
|
161 | if (ip != NULL) |
|
e9adbdc1546a
[gaim-migrate @ 15491]
Mark Doliner <markdoliner@pidgin.im>
parents:
12917
diff
changeset
|
162 | return ip; |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
11033
diff
changeset
|
163 | |
|
8834
0a798e3d2b84
[gaim-migrate @ 9598]
Mark Doliner <markdoliner@pidgin.im>
parents:
8251
diff
changeset
|
164 | /* Just fetch the IP of the local system */ |
|
0a798e3d2b84
[gaim-migrate @ 9598]
Mark Doliner <markdoliner@pidgin.im>
parents:
8251
diff
changeset
|
165 | return gaim_network_get_local_system_ip(fd); |
| 8231 | 166 | } |
| 167 | ||
|
11391
d172e72988cc
[gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents:
11336
diff
changeset
|
168 | |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
169 | static void |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
170 | gaim_network_set_upnp_port_mapping_cb(gboolean success, gpointer data) |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
171 | { |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
172 | ListenUPnPData *ldata = data; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
173 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
174 | if (!success) { |
|
13681
7218b622ce4e
[gaim-migrate @ 16081]
Mark Doliner <markdoliner@pidgin.im>
parents:
13426
diff
changeset
|
175 | gaim_debug_info("network", "Couldn't create UPnP mapping\n"); |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
176 | if (ldata->retry) { |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
177 | ldata->retry = FALSE; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
178 | ldata->adding = FALSE; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
179 | gaim_upnp_remove_port_mapping( |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
180 | gaim_network_get_port_from_fd(ldata->listenfd), |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
181 | (ldata->socket_type == SOCK_STREAM) ? "TCP" : "UDP", |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
182 | gaim_network_set_upnp_port_mapping_cb, ldata); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
183 | return; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
184 | } |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
185 | } else if (!ldata->adding) { |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
186 | /* We've tried successfully to remove the port mapping. |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
187 | * Try to add it again */ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
188 | ldata->adding = TRUE; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
189 | gaim_upnp_set_port_mapping( |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
190 | gaim_network_get_port_from_fd(ldata->listenfd), |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
191 | (ldata->socket_type == SOCK_STREAM) ? "TCP" : "UDP", |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
192 | gaim_network_set_upnp_port_mapping_cb, ldata); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
193 | return; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
194 | } |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
195 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
196 | if (ldata->cb) |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
197 | ldata->cb(ldata->listenfd, ldata->cb_data); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
198 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
199 | g_free(ldata); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
200 | } |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
201 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
202 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
203 | static gboolean |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
204 | gaim_network_do_listen(unsigned short port, int socket_type, GaimNetworkListenCallback cb, gpointer cb_data) |
| 8231 | 205 | { |
|
9452
0e3cdb898d3e
[gaim-migrate @ 10276]
Mark Doliner <markdoliner@pidgin.im>
parents:
9449
diff
changeset
|
206 | int listenfd = -1; |
| 8231 | 207 | const int on = 1; |
|
12917
26da900b6b54
[gaim-migrate @ 15270]
Daniel Atallah <datallah@pidgin.im>
parents:
12909
diff
changeset
|
208 | ListenUPnPData *ld; |
|
13426
032ea2c9ce2d
[gaim-migrate @ 15800]
Daniel Atallah <datallah@pidgin.im>
parents:
13346
diff
changeset
|
209 | #ifdef HAVE_GETADDRINFO |
|
9449
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
210 | int errnum; |
|
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
211 | struct addrinfo hints, *res, *next; |
| 9456 | 212 | char serv[6]; |
| 8231 | 213 | |
|
9449
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
214 | /* |
|
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
215 | * Get a list of addresses on this machine. |
|
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
216 | */ |
|
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
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
f64fdbc34677
[gaim-migrate @ 15074]
Daniel Atallah <datallah@pidgin.im>
parents:
12728
diff
changeset
|
221 | hints.ai_socktype = socket_type; |
|
9449
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
222 | errnum = getaddrinfo(NULL /* any IP */, serv, &hints, &res); |
|
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
223 | if (errnum != 0) { |
|
11221
be3982550ac0
[gaim-migrate @ 13353]
Daniel Atallah <datallah@pidgin.im>
parents:
11215
diff
changeset
|
224 | #ifndef _WIN32 |
|
9449
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
225 | gaim_debug_warning("network", "getaddrinfo: %s\n", gai_strerror(errnum)); |
|
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
226 | if (errnum == EAI_SYSTEM) |
|
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
227 | gaim_debug_warning("network", "getaddrinfo: system error: %s\n", strerror(errno)); |
|
11221
be3982550ac0
[gaim-migrate @ 13353]
Daniel Atallah <datallah@pidgin.im>
parents:
11215
diff
changeset
|
228 | #else |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
229 | gaim_debug_warning("network", "getaddrinfo: Error Code = %d\n", errnum); |
|
11221
be3982550ac0
[gaim-migrate @ 13353]
Daniel Atallah <datallah@pidgin.im>
parents:
11215
diff
changeset
|
230 | #endif |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
231 | return FALSE; |
| 8231 | 232 | } |
|
9449
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
233 | |
|
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
234 | /* |
|
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
235 | * Go through the list of addresses and attempt to listen on |
|
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
236 | * one of them. |
|
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
237 | * XXX - Try IPv6 addresses first? |
|
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
238 | */ |
|
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
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
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
243 | if (setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) != 0) |
|
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
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
f64fdbc34677
[gaim-migrate @ 15074]
Daniel Atallah <datallah@pidgin.im>
parents:
12728
diff
changeset
|
247 | /* XXX - It is unclear to me (datallah) whether we need to be |
|
f64fdbc34677
[gaim-migrate @ 15074]
Daniel Atallah <datallah@pidgin.im>
parents:
12728
diff
changeset
|
248 | using a new socket each time */ |
| 8231 | 249 | close(listenfd); |
|
9449
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
250 | } |
| 8231 | 251 | |
|
9449
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
252 | freeaddrinfo(res); |
| 8231 | 253 | |
|
9449
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
254 | if (next == NULL) |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
255 | return FALSE; |
| 8231 | 256 | #else |
| 257 | struct sockaddr_in sockin; | |
| 258 | ||
|
12730
f64fdbc34677
[gaim-migrate @ 15074]
Daniel Atallah <datallah@pidgin.im>
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
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
261 | return FALSE; |
| 8231 | 262 | } |
| 263 | ||
|
9449
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
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
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
268 | sockin.sin_family = PF_INET; |
|
8251
091ca9b900c1
[gaim-migrate @ 8974]
Mark Doliner <markdoliner@pidgin.im>
parents:
8250
diff
changeset
|
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
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
274 | return FALSE; |
| 8231 | 275 | } |
| 276 | #endif | |
| 277 | ||
|
12730
f64fdbc34677
[gaim-migrate @ 15074]
Daniel Atallah <datallah@pidgin.im>
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
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
281 | return FALSE; |
| 8231 | 282 | } |
| 283 | fcntl(listenfd, F_SETFL, O_NONBLOCK); | |
| 284 | ||
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
285 | gaim_debug_info("network", "Listening on port: %hu\n", gaim_network_get_port_from_fd(listenfd)); |
|
11391
d172e72988cc
[gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents:
11336
diff
changeset
|
286 | |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
287 | ld = g_new0(ListenUPnPData, 1); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
288 | ld->listenfd = listenfd; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
289 | ld->adding = TRUE; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
290 | ld->retry = TRUE; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
291 | ld->cb = cb; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
292 | ld->cb_data = cb_data; |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
11033
diff
changeset
|
293 | |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
294 | gaim_upnp_set_port_mapping( |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
295 | gaim_network_get_port_from_fd(listenfd), |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
296 | (socket_type == SOCK_STREAM) ? "TCP" : "UDP", |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
297 | gaim_network_set_upnp_port_mapping_cb, ld); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
298 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
299 | return TRUE; |
| 8231 | 300 | } |
| 301 | ||
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
302 | gboolean |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
303 | gaim_network_listen(unsigned short port, int socket_type, |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
304 | GaimNetworkListenCallback cb, gpointer cb_data) |
|
8246
c83c0421149a
[gaim-migrate @ 8969]
Mark Doliner <markdoliner@pidgin.im>
parents:
8245
diff
changeset
|
305 | { |
|
8250
e855dcce1fa0
[gaim-migrate @ 8973]
Mark Doliner <markdoliner@pidgin.im>
parents:
8248
diff
changeset
|
306 | g_return_val_if_fail(port != 0, -1); |
|
e855dcce1fa0
[gaim-migrate @ 8973]
Mark Doliner <markdoliner@pidgin.im>
parents:
8248
diff
changeset
|
307 | |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
308 | return gaim_network_do_listen(port, socket_type, cb, cb_data); |
|
8246
c83c0421149a
[gaim-migrate @ 8969]
Mark Doliner <markdoliner@pidgin.im>
parents:
8245
diff
changeset
|
309 | } |
|
c83c0421149a
[gaim-migrate @ 8969]
Mark Doliner <markdoliner@pidgin.im>
parents:
8245
diff
changeset
|
310 | |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
311 | gboolean |
|
12730
f64fdbc34677
[gaim-migrate @ 15074]
Daniel Atallah <datallah@pidgin.im>
parents:
12728
diff
changeset
|
312 | gaim_network_listen_range(unsigned short start, unsigned short end, |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
313 | int socket_type, GaimNetworkListenCallback cb, gpointer cb_data) |
| 8231 | 314 | { |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
315 | gboolean ret = FALSE; |
| 8231 | 316 | |
|
8250
e855dcce1fa0
[gaim-migrate @ 8973]
Mark Doliner <markdoliner@pidgin.im>
parents:
8248
diff
changeset
|
317 | if (gaim_prefs_get_bool("/core/network/ports_range_use")) { |
|
8239
d19f1c66720c
[gaim-migrate @ 8962]
Mark Doliner <markdoliner@pidgin.im>
parents:
8231
diff
changeset
|
318 | start = gaim_prefs_get_int("/core/network/ports_range_start"); |
|
d19f1c66720c
[gaim-migrate @ 8962]
Mark Doliner <markdoliner@pidgin.im>
parents:
8231
diff
changeset
|
319 | end = gaim_prefs_get_int("/core/network/ports_range_end"); |
|
8250
e855dcce1fa0
[gaim-migrate @ 8973]
Mark Doliner <markdoliner@pidgin.im>
parents:
8248
diff
changeset
|
320 | } else { |
|
e855dcce1fa0
[gaim-migrate @ 8973]
Mark Doliner <markdoliner@pidgin.im>
parents:
8248
diff
changeset
|
321 | if (end < start) |
|
e855dcce1fa0
[gaim-migrate @ 8973]
Mark Doliner <markdoliner@pidgin.im>
parents:
8248
diff
changeset
|
322 | end = start; |
|
8239
d19f1c66720c
[gaim-migrate @ 8962]
Mark Doliner <markdoliner@pidgin.im>
parents:
8231
diff
changeset
|
323 | } |
| 8231 | 324 | |
| 325 | for (; start <= end; start++) { | |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
326 | ret = gaim_network_do_listen(start, socket_type, cb, cb_data); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
327 | if (ret) |
| 8231 | 328 | break; |
| 329 | } | |
| 330 | ||
| 331 | return ret; | |
| 332 | } | |
| 333 | ||
|
8834
0a798e3d2b84
[gaim-migrate @ 9598]
Mark Doliner <markdoliner@pidgin.im>
parents:
8251
diff
changeset
|
334 | unsigned short |
|
0a798e3d2b84
[gaim-migrate @ 9598]
Mark Doliner <markdoliner@pidgin.im>
parents:
8251
diff
changeset
|
335 | gaim_network_get_port_from_fd(int fd) |
| 8231 | 336 | { |
| 337 | struct sockaddr_in addr; | |
| 338 | socklen_t len; | |
| 339 | ||
|
9449
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
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
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
360 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
361 | gaim_upnp_discover(NULL, NULL); |
| 8231 | 362 | } |