Fri, 11 Mar 2005 13:05:31 +0000
[gaim-migrate @ 12231]
the cipher api that grim has been working on for ages is finally done!! big
congrats and thanks to him!!
lots of modified files in this commit. it builds here.
moved the md5 files to src/protocols/oscar so that it continues to depend
on nothing in gaim. everything else uses the new centralized cipher api.
I'm not sure if src/md5.* needs to be removed or not, so I left it there.
someone let me know or do it directly.
someone check if these need to be added to potfiles.in
and let there be much rejoicing!
| 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 | |
| 28 | #include "debug.h" | |
| 29 | #include "account.h" | |
| 30 | #include "network.h" | |
| 31 | #include "prefs.h" | |
| 32 | ||
|
8838
c23227da7b4a
[gaim-migrate @ 9604]
Mark Doliner <markdoliner@pidgin.im>
parents:
8834
diff
changeset
|
33 | const unsigned char * |
|
c23227da7b4a
[gaim-migrate @ 9604]
Mark Doliner <markdoliner@pidgin.im>
parents:
8834
diff
changeset
|
34 | gaim_network_ip_atoi(const char *ip) |
|
c23227da7b4a
[gaim-migrate @ 9604]
Mark Doliner <markdoliner@pidgin.im>
parents:
8834
diff
changeset
|
35 | { |
|
c23227da7b4a
[gaim-migrate @ 9604]
Mark Doliner <markdoliner@pidgin.im>
parents:
8834
diff
changeset
|
36 | static unsigned char ret[4]; |
| 8981 | 37 | gchar *delimiter = "."; |
|
8838
c23227da7b4a
[gaim-migrate @ 9604]
Mark Doliner <markdoliner@pidgin.im>
parents:
8834
diff
changeset
|
38 | gchar **split; |
|
c23227da7b4a
[gaim-migrate @ 9604]
Mark Doliner <markdoliner@pidgin.im>
parents:
8834
diff
changeset
|
39 | int i; |
|
c23227da7b4a
[gaim-migrate @ 9604]
Mark Doliner <markdoliner@pidgin.im>
parents:
8834
diff
changeset
|
40 | |
|
c23227da7b4a
[gaim-migrate @ 9604]
Mark Doliner <markdoliner@pidgin.im>
parents:
8834
diff
changeset
|
41 | g_return_val_if_fail(ip != NULL, NULL); |
|
c23227da7b4a
[gaim-migrate @ 9604]
Mark Doliner <markdoliner@pidgin.im>
parents:
8834
diff
changeset
|
42 | |
| 8981 | 43 | split = g_strsplit(ip, delimiter, 4); |
|
8838
c23227da7b4a
[gaim-migrate @ 9604]
Mark Doliner <markdoliner@pidgin.im>
parents:
8834
diff
changeset
|
44 | for (i = 0; split[i] != NULL; i++) |
|
c23227da7b4a
[gaim-migrate @ 9604]
Mark Doliner <markdoliner@pidgin.im>
parents:
8834
diff
changeset
|
45 | ret[i] = atoi(split[i]); |
|
c23227da7b4a
[gaim-migrate @ 9604]
Mark Doliner <markdoliner@pidgin.im>
parents:
8834
diff
changeset
|
46 | g_strfreev(split); |
|
c23227da7b4a
[gaim-migrate @ 9604]
Mark Doliner <markdoliner@pidgin.im>
parents:
8834
diff
changeset
|
47 | |
|
c23227da7b4a
[gaim-migrate @ 9604]
Mark Doliner <markdoliner@pidgin.im>
parents:
8834
diff
changeset
|
48 | /* i should always be 4 */ |
|
c23227da7b4a
[gaim-migrate @ 9604]
Mark Doliner <markdoliner@pidgin.im>
parents:
8834
diff
changeset
|
49 | if (i != 4) |
|
c23227da7b4a
[gaim-migrate @ 9604]
Mark Doliner <markdoliner@pidgin.im>
parents:
8834
diff
changeset
|
50 | return NULL; |
|
c23227da7b4a
[gaim-migrate @ 9604]
Mark Doliner <markdoliner@pidgin.im>
parents:
8834
diff
changeset
|
51 | |
|
c23227da7b4a
[gaim-migrate @ 9604]
Mark Doliner <markdoliner@pidgin.im>
parents:
8834
diff
changeset
|
52 | return ret; |
|
c23227da7b4a
[gaim-migrate @ 9604]
Mark Doliner <markdoliner@pidgin.im>
parents:
8834
diff
changeset
|
53 | } |
|
c23227da7b4a
[gaim-migrate @ 9604]
Mark Doliner <markdoliner@pidgin.im>
parents:
8834
diff
changeset
|
54 | |
| 8231 | 55 | void |
|
8834
0a798e3d2b84
[gaim-migrate @ 9598]
Mark Doliner <markdoliner@pidgin.im>
parents:
8251
diff
changeset
|
56 | gaim_network_set_public_ip(const char *ip) |
| 8231 | 57 | { |
| 58 | g_return_if_fail(ip != NULL); | |
| 59 | ||
|
8838
c23227da7b4a
[gaim-migrate @ 9604]
Mark Doliner <markdoliner@pidgin.im>
parents:
8834
diff
changeset
|
60 | /* XXX - Ensure the IP address is valid */ |
|
c23227da7b4a
[gaim-migrate @ 9604]
Mark Doliner <markdoliner@pidgin.im>
parents:
8834
diff
changeset
|
61 | |
| 8231 | 62 | gaim_prefs_set_string("/core/network/public_ip", ip); |
| 63 | } | |
| 64 | ||
| 65 | const char * | |
|
8834
0a798e3d2b84
[gaim-migrate @ 9598]
Mark Doliner <markdoliner@pidgin.im>
parents:
8251
diff
changeset
|
66 | gaim_network_get_public_ip(void) |
| 8231 | 67 | { |
| 68 | const char *ip; | |
| 69 | ||
| 70 | ip = gaim_prefs_get_string("/core/network/public_ip"); | |
| 71 | ||
| 72 | if (ip == NULL || *ip == '\0') | |
| 73 | return NULL; | |
| 74 | ||
| 75 | return ip; | |
| 76 | } | |
| 77 | ||
| 78 | static const char * | |
| 79 | gaim_network_get_local_ip_from_fd(int fd) | |
| 80 | { | |
| 81 | struct sockaddr_in addr; | |
| 82 | socklen_t len; | |
| 83 | static char ip[16]; | |
| 84 | const char *tmp; | |
| 85 | ||
|
8840
414e20c7c010
[gaim-migrate @ 9607]
Mark Doliner <markdoliner@pidgin.im>
parents:
8838
diff
changeset
|
86 | g_return_val_if_fail(fd >= 0, NULL); |
| 8231 | 87 | |
| 88 | len = sizeof(addr); | |
| 89 | if (getsockname(fd, (struct sockaddr *) &addr, &len) == -1) { | |
| 90 | gaim_debug_warning("network", "getsockname: %s\n", strerror(errno)); | |
| 91 | return NULL; | |
| 92 | } | |
| 93 | ||
| 94 | tmp = inet_ntoa(addr.sin_addr); | |
| 95 | strncpy(ip, tmp, sizeof(ip)); | |
|
8838
c23227da7b4a
[gaim-migrate @ 9604]
Mark Doliner <markdoliner@pidgin.im>
parents:
8834
diff
changeset
|
96 | |
| 8231 | 97 | return ip; |
| 98 | } | |
| 99 | ||
| 100 | const char * | |
| 101 | gaim_network_get_local_system_ip(int fd) | |
| 102 | { | |
| 103 | struct hostent *host; | |
| 104 | char localhost[129]; | |
| 105 | long unsigned add; | |
| 106 | static char ip[46]; | |
| 107 | const char *tmp = NULL; | |
| 108 | ||
|
8840
414e20c7c010
[gaim-migrate @ 9607]
Mark Doliner <markdoliner@pidgin.im>
parents:
8838
diff
changeset
|
109 | if (fd >= 0) |
| 8231 | 110 | tmp = gaim_network_get_local_ip_from_fd(fd); |
| 111 | ||
| 112 | if (tmp) | |
| 113 | return tmp; | |
| 114 | ||
| 115 | if (gethostname(localhost, 128) < 0) | |
| 116 | return NULL; | |
| 117 | ||
| 118 | if ((host = gethostbyname(localhost)) == NULL) | |
| 119 | return NULL; | |
| 120 | ||
| 121 | memcpy(&add, host->h_addr_list[0], 4); | |
| 122 | add = htonl(add); | |
| 123 | ||
| 124 | g_snprintf(ip, 16, "%lu.%lu.%lu.%lu", | |
| 125 | ((add >> 24) & 255), | |
| 126 | ((add >> 16) & 255), | |
| 127 | ((add >> 8) & 255), | |
| 128 | add & 255); | |
| 129 | ||
| 130 | return ip; | |
| 131 | } | |
| 132 | ||
| 133 | const char * | |
|
8838
c23227da7b4a
[gaim-migrate @ 9604]
Mark Doliner <markdoliner@pidgin.im>
parents:
8834
diff
changeset
|
134 | gaim_network_get_my_ip(int fd) |
| 8231 | 135 | { |
|
8834
0a798e3d2b84
[gaim-migrate @ 9598]
Mark Doliner <markdoliner@pidgin.im>
parents:
8251
diff
changeset
|
136 | const char *ip = NULL; |
|
0a798e3d2b84
[gaim-migrate @ 9598]
Mark Doliner <markdoliner@pidgin.im>
parents:
8251
diff
changeset
|
137 | |
|
0a798e3d2b84
[gaim-migrate @ 9598]
Mark Doliner <markdoliner@pidgin.im>
parents:
8251
diff
changeset
|
138 | /* Check if the user specified an IP manually */ |
|
0a798e3d2b84
[gaim-migrate @ 9598]
Mark Doliner <markdoliner@pidgin.im>
parents:
8251
diff
changeset
|
139 | if (!gaim_prefs_get_bool("/core/network/auto_ip")) { |
|
0a798e3d2b84
[gaim-migrate @ 9598]
Mark Doliner <markdoliner@pidgin.im>
parents:
8251
diff
changeset
|
140 | ip = gaim_network_get_public_ip(); |
|
0a798e3d2b84
[gaim-migrate @ 9598]
Mark Doliner <markdoliner@pidgin.im>
parents:
8251
diff
changeset
|
141 | if (ip != NULL) |
|
0a798e3d2b84
[gaim-migrate @ 9598]
Mark Doliner <markdoliner@pidgin.im>
parents:
8251
diff
changeset
|
142 | return ip; |
|
0a798e3d2b84
[gaim-migrate @ 9598]
Mark Doliner <markdoliner@pidgin.im>
parents:
8251
diff
changeset
|
143 | } |
|
0a798e3d2b84
[gaim-migrate @ 9598]
Mark Doliner <markdoliner@pidgin.im>
parents:
8251
diff
changeset
|
144 | |
|
0a798e3d2b84
[gaim-migrate @ 9598]
Mark Doliner <markdoliner@pidgin.im>
parents:
8251
diff
changeset
|
145 | /* Just fetch the IP of the local system */ |
|
0a798e3d2b84
[gaim-migrate @ 9598]
Mark Doliner <markdoliner@pidgin.im>
parents:
8251
diff
changeset
|
146 | return gaim_network_get_local_system_ip(fd); |
| 8231 | 147 | } |
| 148 | ||
|
8834
0a798e3d2b84
[gaim-migrate @ 9598]
Mark Doliner <markdoliner@pidgin.im>
parents:
8251
diff
changeset
|
149 | static int |
|
0a798e3d2b84
[gaim-migrate @ 9598]
Mark Doliner <markdoliner@pidgin.im>
parents:
8251
diff
changeset
|
150 | gaim_network_do_listen(unsigned short port) |
| 8231 | 151 | { |
|
9452
0e3cdb898d3e
[gaim-migrate @ 10276]
Mark Doliner <markdoliner@pidgin.im>
parents:
9449
diff
changeset
|
152 | int listenfd = -1; |
| 8231 | 153 | const int on = 1; |
|
9449
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
154 | #if HAVE_GETADDRINFO |
|
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
155 | int errnum; |
|
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
156 | struct addrinfo hints, *res, *next; |
| 9456 | 157 | char serv[6]; |
| 8231 | 158 | |
|
9449
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
159 | /* |
|
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
160 | * Get a list of addresses on this machine. |
|
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
161 | */ |
|
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
162 | snprintf(serv, sizeof(serv), "%hu", port); |
| 8231 | 163 | memset(&hints, 0, sizeof(struct addrinfo)); |
| 164 | hints.ai_flags = AI_PASSIVE; | |
| 165 | hints.ai_family = AF_UNSPEC; | |
| 166 | hints.ai_socktype = SOCK_STREAM; | |
|
9449
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
167 | errnum = getaddrinfo(NULL /* any IP */, serv, &hints, &res); |
|
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
168 | if (errnum != 0) { |
|
10671
293575b18c36
[gaim-migrate @ 12211]
Daniel Atallah <datallah@pidgin.im>
parents:
9456
diff
changeset
|
169 | #ifndef _WIN32 |
|
9449
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
170 | gaim_debug_warning("network", "getaddrinfo: %s\n", gai_strerror(errnum)); |
|
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
171 | if (errnum == EAI_SYSTEM) |
|
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
172 | gaim_debug_warning("network", "getaddrinfo: system error: %s\n", strerror(errno)); |
|
10671
293575b18c36
[gaim-migrate @ 12211]
Daniel Atallah <datallah@pidgin.im>
parents:
9456
diff
changeset
|
173 | #else |
|
293575b18c36
[gaim-migrate @ 12211]
Daniel Atallah <datallah@pidgin.im>
parents:
9456
diff
changeset
|
174 | gaim_debug_warning("network", "getaddrinfo: Error Code = %d\n", errnum); |
|
293575b18c36
[gaim-migrate @ 12211]
Daniel Atallah <datallah@pidgin.im>
parents:
9456
diff
changeset
|
175 | #endif |
| 8231 | 176 | return -1; |
| 177 | } | |
|
9449
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
178 | |
|
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
179 | /* |
|
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
180 | * Go through the list of addresses and attempt to listen on |
|
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
181 | * one of them. |
|
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
182 | * XXX - Try IPv6 addresses first? |
|
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
183 | */ |
|
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
184 | for (next = res; next != NULL; next = next->ai_next) { |
| 9455 | 185 | listenfd = socket(next->ai_family, next->ai_socktype, next->ai_protocol); |
| 8231 | 186 | if (listenfd < 0) |
| 187 | continue; | |
|
9449
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
188 | if (setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) != 0) |
|
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
189 | gaim_debug_warning("network", "setsockopt: %s\n", strerror(errno)); |
| 9455 | 190 | if (bind(listenfd, next->ai_addr, next->ai_addrlen) == 0) |
| 8231 | 191 | break; /* success */ |
| 192 | close(listenfd); | |
|
9449
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
193 | } |
| 8231 | 194 | |
|
9449
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
195 | freeaddrinfo(res); |
| 8231 | 196 | |
|
9449
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
197 | if (next == NULL) |
|
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
198 | return -1; |
| 8231 | 199 | #else |
| 200 | struct sockaddr_in sockin; | |
| 201 | ||
| 202 | if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { | |
| 203 | gaim_debug_warning("network", "socket: %s\n", strerror(errno)); | |
| 204 | return -1; | |
| 205 | } | |
| 206 | ||
|
9449
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
207 | if (setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) != 0) |
| 8231 | 208 | gaim_debug_warning("network", "setsockopt: %s\n", strerror(errno)); |
| 209 | ||
| 210 | memset(&sockin, 0, sizeof(struct sockaddr_in)); | |
|
9449
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
211 | sockin.sin_family = PF_INET; |
|
8251
091ca9b900c1
[gaim-migrate @ 8974]
Mark Doliner <markdoliner@pidgin.im>
parents:
8250
diff
changeset
|
212 | sockin.sin_port = htons(port); |
| 8231 | 213 | |
| 214 | if (bind(listenfd, (struct sockaddr *)&sockin, sizeof(struct sockaddr_in)) != 0) { | |
| 215 | gaim_debug_warning("network", "bind: %s\n", strerror(errno)); | |
| 216 | close(listenfd); | |
| 217 | return -1; | |
| 218 | } | |
| 219 | #endif | |
| 220 | ||
| 221 | if (listen(listenfd, 4) != 0) { | |
| 222 | gaim_debug_warning("network", "listen: %s\n", strerror(errno)); | |
| 223 | close(listenfd); | |
| 224 | return -1; | |
| 225 | } | |
| 226 | fcntl(listenfd, F_SETFL, O_NONBLOCK); | |
| 227 | ||
| 228 | gaim_debug_info("network", "Listening on port: %hu\n", gaim_network_get_port_from_fd(listenfd)); | |
| 229 | return listenfd; | |
| 230 | } | |
| 231 | ||
|
8834
0a798e3d2b84
[gaim-migrate @ 9598]
Mark Doliner <markdoliner@pidgin.im>
parents:
8251
diff
changeset
|
232 | int |
|
0a798e3d2b84
[gaim-migrate @ 9598]
Mark Doliner <markdoliner@pidgin.im>
parents:
8251
diff
changeset
|
233 | gaim_network_listen(unsigned short port) |
|
8246
c83c0421149a
[gaim-migrate @ 8969]
Mark Doliner <markdoliner@pidgin.im>
parents:
8245
diff
changeset
|
234 | { |
|
8250
e855dcce1fa0
[gaim-migrate @ 8973]
Mark Doliner <markdoliner@pidgin.im>
parents:
8248
diff
changeset
|
235 | g_return_val_if_fail(port != 0, -1); |
|
e855dcce1fa0
[gaim-migrate @ 8973]
Mark Doliner <markdoliner@pidgin.im>
parents:
8248
diff
changeset
|
236 | |
|
8246
c83c0421149a
[gaim-migrate @ 8969]
Mark Doliner <markdoliner@pidgin.im>
parents:
8245
diff
changeset
|
237 | return gaim_network_do_listen(port); |
|
c83c0421149a
[gaim-migrate @ 8969]
Mark Doliner <markdoliner@pidgin.im>
parents:
8245
diff
changeset
|
238 | } |
|
c83c0421149a
[gaim-migrate @ 8969]
Mark Doliner <markdoliner@pidgin.im>
parents:
8245
diff
changeset
|
239 | |
|
8834
0a798e3d2b84
[gaim-migrate @ 9598]
Mark Doliner <markdoliner@pidgin.im>
parents:
8251
diff
changeset
|
240 | int |
|
0a798e3d2b84
[gaim-migrate @ 9598]
Mark Doliner <markdoliner@pidgin.im>
parents:
8251
diff
changeset
|
241 | gaim_network_listen_range(unsigned short start, unsigned short end) |
| 8231 | 242 | { |
|
8240
2e5f97ed575d
[gaim-migrate @ 8963]
Mark Doliner <markdoliner@pidgin.im>
parents:
8239
diff
changeset
|
243 | int ret = -1; |
| 8231 | 244 | |
|
8250
e855dcce1fa0
[gaim-migrate @ 8973]
Mark Doliner <markdoliner@pidgin.im>
parents:
8248
diff
changeset
|
245 | if (gaim_prefs_get_bool("/core/network/ports_range_use")) { |
|
8239
d19f1c66720c
[gaim-migrate @ 8962]
Mark Doliner <markdoliner@pidgin.im>
parents:
8231
diff
changeset
|
246 | start = gaim_prefs_get_int("/core/network/ports_range_start"); |
|
d19f1c66720c
[gaim-migrate @ 8962]
Mark Doliner <markdoliner@pidgin.im>
parents:
8231
diff
changeset
|
247 | end = gaim_prefs_get_int("/core/network/ports_range_end"); |
|
8250
e855dcce1fa0
[gaim-migrate @ 8973]
Mark Doliner <markdoliner@pidgin.im>
parents:
8248
diff
changeset
|
248 | } else { |
|
e855dcce1fa0
[gaim-migrate @ 8973]
Mark Doliner <markdoliner@pidgin.im>
parents:
8248
diff
changeset
|
249 | if (end < start) |
|
e855dcce1fa0
[gaim-migrate @ 8973]
Mark Doliner <markdoliner@pidgin.im>
parents:
8248
diff
changeset
|
250 | end = start; |
|
8239
d19f1c66720c
[gaim-migrate @ 8962]
Mark Doliner <markdoliner@pidgin.im>
parents:
8231
diff
changeset
|
251 | } |
| 8231 | 252 | |
| 253 | for (; start <= end; start++) { | |
| 254 | ret = gaim_network_do_listen(start); | |
| 255 | if (ret >= 0) | |
| 256 | break; | |
| 257 | } | |
| 258 | ||
| 259 | return ret; | |
| 260 | } | |
| 261 | ||
|
8834
0a798e3d2b84
[gaim-migrate @ 9598]
Mark Doliner <markdoliner@pidgin.im>
parents:
8251
diff
changeset
|
262 | unsigned short |
|
0a798e3d2b84
[gaim-migrate @ 9598]
Mark Doliner <markdoliner@pidgin.im>
parents:
8251
diff
changeset
|
263 | gaim_network_get_port_from_fd(int fd) |
| 8231 | 264 | { |
| 265 | struct sockaddr_in addr; | |
| 266 | socklen_t len; | |
| 267 | ||
|
9449
8c5a1697bca6
[gaim-migrate @ 10273]
Mark Doliner <markdoliner@pidgin.im>
parents:
8981
diff
changeset
|
268 | g_return_val_if_fail(fd >= 0, 0); |
| 8231 | 269 | |
| 270 | len = sizeof(addr); | |
| 271 | if (getsockname(fd, (struct sockaddr *) &addr, &len) == -1) { | |
| 272 | gaim_debug_warning("network", "getsockname: %s\n", strerror(errno)); | |
| 273 | return 0; | |
| 274 | } | |
| 275 | ||
| 276 | return ntohs(addr.sin_port); | |
| 277 | } | |
| 278 | ||
| 279 | void | |
| 280 | gaim_network_init(void) | |
| 281 | { | |
| 282 | gaim_prefs_add_none ("/core/network"); | |
| 283 | gaim_prefs_add_bool ("/core/network/auto_ip", TRUE); | |
| 284 | gaim_prefs_add_string("/core/network/public_ip", ""); | |
| 285 | gaim_prefs_add_bool ("/core/network/ports_range_use", FALSE); | |
| 286 | gaim_prefs_add_int ("/core/network/ports_range_start", 1024); | |
| 287 | gaim_prefs_add_int ("/core/network/ports_range_end", 2048); | |
| 288 | } |