Mercurial > pidgin.yaz
annotate src/protocols/gg/libgg.c @ 9265:6a1f2c444ee7
[gaim-migrate @ 10064]
Apparently stdint.h is required on OS X. This now looks to see if
stdint.h exists. and includes it only if it does. If this doesn't fix
whatever platform was broken (KingAnt, what was that?), we'll look for
another solution.
committer: Tailor Script <tailor@pidgin.im>
author | Ethan Blanton <elb@pidgin.im> |
---|---|
date | Fri, 11 Jun 2004 03:58:48 +0000 |
parents | ce90b119b103 |
children | 1c4092217e4a |
rev | line source |
---|---|
9265 | 1 /* $Id: libgg.c 10064 2004-06-11 03:58:48Z eblanton $ */ |
2393 | 2 |
3 /* | |
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
4 * (C) Copyright 2001 Wojtek Kaniewski <wojtekka@irc.pl>, |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
5 * Robert J. Wo¼ny <speedy@ziew.org> |
2393 | 6 * |
7 * This program is free software; you can redistribute it and/or modify | |
8 * it under the terms of the GNU General Public License Version 2 as | |
9 * published by the Free Software Foundation. | |
10 * | |
11 * This program is distributed in the hope that it will be useful, | |
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 * GNU General Public License for more details. | |
15 * | |
16 * You should have received a copy of the GNU General Public License | |
17 * along with this program; if not, write to the Free Software | |
18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |
19 */ | |
20 | |
4016 | 21 #include <sys/types.h> |
3630 | 22 #ifndef _WIN32 |
2393 | 23 #include <sys/socket.h> |
24 #include <netinet/in.h> | |
25 #include <arpa/inet.h> | |
26 #include <sys/ioctl.h> | |
27 #include <sys/wait.h> | |
3630 | 28 #include <netdb.h> |
29 #include <pwd.h> | |
30 #else | |
31 #include <fcntl.h> | |
32 #endif | |
33 | |
34 #include <stdio.h> | |
35 #include <stdlib.h> | |
36 #include <unistd.h> | |
37 #include <stdio.h> | |
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
38 #include <sys/time.h> |
2393 | 39 #include <errno.h> |
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
40 #ifndef _AIX |
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
41 # include <string.h> |
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
42 #endif |
2393 | 43 #include <stdarg.h> |
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
44 #include <time.h> |
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
45 #ifdef sun |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
46 #include <sys/filio.h> |
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
47 #endif |
2399
b2926d21f067
[gaim-migrate @ 2412]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2393
diff
changeset
|
48 #include <glib.h> |
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
49 #if G_BYTE_ORDER == G_BIG_ENDIAN |
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
50 # define WORDS_BIGENDIAN 1 |
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
51 #endif |
9265 | 52 #include "internal.h" |
2393 | 53 #include "libgg.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5681
diff
changeset
|
54 |
3630 | 55 #include "proxy.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5681
diff
changeset
|
56 #include "debug.h" |
2393 | 57 |
3717
988485669631
[gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
3630
diff
changeset
|
58 #ifdef _WIN32 |
988485669631
[gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
3630
diff
changeset
|
59 #include "win32dep.h" |
988485669631
[gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
3630
diff
changeset
|
60 #endif |
988485669631
[gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
3630
diff
changeset
|
61 |
3630 | 62 int gg_debug_level = (GG_DEBUG_NET | GG_DEBUG_TRAFFIC | GG_DEBUG_DUMP | GG_DEBUG_FUNCTION | GG_DEBUG_MISC); |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
63 int gg_http_use_proxy = 0; |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
64 int gg_http_proxy_port = 0; |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
65 char *gg_http_proxy_host = NULL; |
2393 | 66 |
3630 | 67 /* temp -Herman */ |
68 static int ping_outstanding = 0; | |
69 | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
70 #ifndef lint |
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
71 |
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
72 static char rcsid[] |
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
73 #ifdef __GNUC__ |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
74 __attribute__ ((unused)) |
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
75 #endif |
9265 | 76 = "$Id: libgg.c 10064 2004-06-11 03:58:48Z eblanton $"; |
2393 | 77 |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
78 #endif |
2393 | 79 |
80 /* | |
81 * fix32() // funkcja wewnźtrzna | |
82 * | |
83 * dla maszyn big-endianowych zamienia kolejno¶ę bajtów w ,,long''ach. | |
84 */ | |
85 static inline unsigned long fix32(unsigned long x) | |
86 { | |
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
87 #ifndef WORDS_BIGENDIAN |
2393 | 88 return x; |
89 #else | |
2399
b2926d21f067
[gaim-migrate @ 2412]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2393
diff
changeset
|
90 return (unsigned long) |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
91 (((x & (unsigned long) 0x000000ffU) << 24) | |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
92 ((x & (unsigned long) 0x0000ff00U) << 8) | |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
93 ((x & (unsigned long) 0x00ff0000U) >> 8) | |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
94 ((x & (unsigned long) 0xff000000U) >> 24)); |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
95 #endif |
2393 | 96 } |
97 | |
98 /* | |
99 * fix16() // funkcja wewnźtrzna | |
100 * | |
101 * dla maszyn big-endianowych zamienia kolejno¶ę bajtów w ,,short''ach. | |
102 */ | |
4298 | 103 |
2393 | 104 static inline unsigned short fix16(unsigned short x) |
105 { | |
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
106 #ifndef WORDS_BIGENDIAN |
2393 | 107 return x; |
108 #else | |
2399
b2926d21f067
[gaim-migrate @ 2412]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2393
diff
changeset
|
109 return (unsigned short) |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
110 (((x & (unsigned short) 0x00ffU) << 8) | |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
111 ((x & (unsigned short) 0xff00U) >> 8)); |
2399
b2926d21f067
[gaim-migrate @ 2412]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2393
diff
changeset
|
112 #endif |
2393 | 113 } |
114 | |
3630 | 115 #ifndef _WIN32 |
2393 | 116 /* |
117 * gg_resolve() // funkcja wewnźtrzna | |
118 * | |
119 * tworzy pipe'y, forkuje siź i w drugim procesie zaczyna resolvowaę | |
120 * podanego hosta. zapisuje w sesji deskryptor pipe'u. je¶li co¶ tam | |
121 * bździe gotowego, znaczy, æe moæna wczytaę ,,struct in_addr''. je¶li | |
122 * nie znajdzie, zwraca INADDR_NONE. | |
123 * | |
124 * - fd - wska¼nik gdzie wrzucię deskryptor, | |
125 * - pid - gdzie wrzucię pid dzieciaka, | |
126 * - hostname - nazwa hosta do zresolvowania. | |
127 * | |
128 * zwraca 0 je¶li uda³o siź odpalię proces lub -1 w przypadku b³źdu. | |
129 */ | |
130 int gg_resolve(int *fd, int *pid, char *hostname) | |
131 { | |
132 int pipes[2], res; | |
133 struct in_addr a; | |
134 | |
135 gg_debug(GG_DEBUG_FUNCTION, "** gg_resolve(..., \"%s\");\n", hostname); | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
136 |
2393 | 137 if (!fd | !pid) { |
138 errno = EFAULT; | |
139 return -1; | |
140 } | |
141 | |
142 if (pipe(pipes) == -1) | |
143 return -1; | |
144 | |
145 if ((res = fork()) == -1) | |
146 return -1; | |
147 | |
148 if (!res) { | |
149 if ((a.s_addr = inet_addr(hostname)) == INADDR_NONE) { | |
150 struct hostent *he; | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
151 |
2393 | 152 if (!(he = gethostbyname(hostname))) |
153 a.s_addr = INADDR_NONE; | |
154 else | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
155 memcpy((char*) &a, he->h_addr, sizeof(a)); |
2393 | 156 } |
157 | |
158 write(pipes[1], &a, sizeof(a)); | |
159 | |
160 exit(0); | |
161 } | |
162 | |
163 close(pipes[1]); | |
164 | |
165 *fd = pipes[0]; | |
166 *pid = res; | |
167 | |
168 return 0; | |
169 } | |
3630 | 170 #endif /*!_WIN32*/ |
2393 | 171 |
172 /* | |
173 * gg_recv_packet() // funkcja wewnźtrzna | |
174 * | |
175 * odbiera jeden pakiet gg i zwraca wska¼nik do niego. pamiźę po nim | |
176 * wypada³oby uwolnię. | |
177 * | |
178 * - sock - po³±czony socket. | |
179 * | |
180 * je¶li wyst±pi³ b³±d, zwraca NULL. reszta w errno. | |
181 */ | |
182 static void *gg_recv_packet(struct gg_session *sess) | |
183 { | |
184 struct gg_header h; | |
185 char *buf = NULL; | |
186 int ret = 0, offset, size = 0; | |
3630 | 187 int sizeh = sizeof(struct gg_header); |
2393 | 188 |
189 gg_debug(GG_DEBUG_FUNCTION, "** gg_recv_packet(...);\n"); | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
190 |
2393 | 191 if (!sess) { |
192 errno = EFAULT; | |
193 return NULL; | |
194 } | |
195 | |
196 if (sess->recv_left < 1) { | |
3630 | 197 while (ret != sizeh) { |
198 ret = read(sess->fd, &h, sizeh); | |
199 gg_debug(GG_DEBUG_MISC, "-- header recv(..., %d) = %d\n", sizeh, ret); | |
200 if (ret < sizeh) { | |
2393 | 201 if (errno != EINTR) { |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
202 gg_debug(GG_DEBUG_MISC, "-- errno = %d (%s)\n", errno, strerror(errno)); |
2393 | 203 return NULL; |
204 } | |
205 } | |
206 } | |
207 | |
208 h.type = fix32(h.type); | |
209 h.length = fix32(h.length); | |
210 } else { | |
3630 | 211 memcpy(&h, sess->recv_buf, sizeh); |
2393 | 212 } |
213 | |
214 /* jakie¶ sensowne limity na rozmiar pakietu */ | |
215 if (h.length < 0 || h.length > 65535) { | |
216 gg_debug(GG_DEBUG_MISC, "-- invalid packet length (%d)\n", h.length); | |
217 errno = ERANGE; | |
218 return NULL; | |
219 } | |
220 | |
221 if (sess->recv_left > 0) { | |
222 gg_debug(GG_DEBUG_MISC, "-- resuming last gg_recv_packet()\n"); | |
223 size = sess->recv_left; | |
224 offset = sess->recv_done; | |
225 buf = sess->recv_buf; | |
226 } else { | |
3630 | 227 if (!(buf = malloc(sizeh + h.length + 1))) { |
2393 | 228 gg_debug(GG_DEBUG_MISC, "-- not enough memory\n"); |
229 return NULL; | |
230 } | |
231 | |
3630 | 232 memcpy(buf, &h, sizeh); |
2393 | 233 |
234 offset = 0; | |
235 size = h.length; | |
236 } | |
237 | |
238 while (size > 0) { | |
3630 | 239 ret = read(sess->fd, buf + sizeh + offset, size); |
2393 | 240 gg_debug(GG_DEBUG_MISC, "-- body recv(..., %d) = %d\n", size, ret); |
241 if (ret > -1 && ret <= size) { | |
242 offset += ret; | |
243 size -= ret; | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
244 } else if (ret == -1) { |
2393 | 245 gg_debug(GG_DEBUG_MISC, "-- errno = %d (%s)\n", errno, strerror(errno)); |
246 if (errno == EAGAIN) { | |
247 gg_debug(GG_DEBUG_MISC, "-- %d bytes received, %d left\n", offset, size); | |
248 sess->recv_buf = buf; | |
249 sess->recv_left = size; | |
250 sess->recv_done = offset; | |
251 return NULL; | |
252 } | |
253 if (errno != EINTR) { | |
6063 | 254 /* errno = EINVAL; */ |
2393 | 255 free(buf); |
256 return NULL; | |
257 } | |
258 } | |
259 } | |
260 | |
261 sess->recv_left = 0; | |
262 | |
263 if ((gg_debug_level & GG_DEBUG_DUMP)) { | |
264 int i; | |
265 | |
266 gg_debug(GG_DEBUG_DUMP, ">> received packet (type=%.2x):", h.type); | |
3630 | 267 for (i = 0; i < sizeh + h.length; i++) |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
268 gg_debug(GG_DEBUG_DUMP, " %.2x", (unsigned char) buf[i]); |
2393 | 269 gg_debug(GG_DEBUG_DUMP, "\n"); |
270 } | |
271 | |
272 return buf; | |
273 } | |
274 | |
275 /* | |
276 * gg_send_packet() // funkcja wewnźtrzna | |
277 * | |
8775 | 278 * konstruuje pakiet i wysy³a go do serwera. |
2393 | 279 * |
8775 | 280 * - sock - deskryptor gniazda |
281 * - type - typ pakietu | |
282 * - payload_1 - pierwsza czź¶ę pakietu | |
283 * - payload_length_1 - d³ugo¶ę pierwszej czź¶ci | |
284 * - payload_2 - druga czź¶ę pakietu | |
285 * - payload_length_2 - d³ugo¶ę drugiej czź¶ci | |
286 * - ... - kolejne czź¶ci pakietu i ich d³ugo¶ci | |
287 * - NULL - końcowym parametr (konieczny!) | |
2393 | 288 * |
8775 | 289 * je¶li siź powiod³o, zwraca 0, w przypadku b³źdu -1. je¶li errno == ENOMEM, |
290 * zabrak³o pamiźci. inaczej by³ b³±d przy wysy³aniu pakietu. dla errno == 0 | |
2393 | 291 * nie wys³ano ca³ego pakietu. |
292 */ | |
8775 | 293 int gg_send_packet(struct gg_session *sess, int type, ...) |
2393 | 294 { |
295 struct gg_header *h; | |
296 char *tmp; | |
8775 | 297 int tmp_length; |
298 void *payload; | |
299 int payload_length; | |
300 va_list ap; | |
301 int res; | |
2393 | 302 |
8775 | 303 gg_debug(GG_DEBUG_FUNCTION, "** gg_send_packet(%p, 0x%.2x, ...)\n", sess, type); |
2393 | 304 |
8775 | 305 tmp_length = 0; |
306 | |
307 if (!(tmp = malloc(sizeof(struct gg_header)))) { | |
308 gg_debug(GG_DEBUG_MISC, "// gg_send_packet() not enough memory for packet header\n"); | |
2393 | 309 return -1; |
310 } | |
311 | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
312 h = (struct gg_header*) tmp; |
2393 | 313 h->type = fix32(type); |
8775 | 314 h->length = fix32(0); |
315 | |
316 va_start(ap, type); | |
317 | |
318 payload = va_arg(ap, void *); | |
319 | |
320 while (payload) { | |
321 char *tmp2; | |
322 | |
323 payload_length = va_arg(ap, int); | |
2393 | 324 |
8775 | 325 if (payload_length < 0) |
326 gg_debug(GG_DEBUG_MISC, "// gg_send_packet() invalid payload length (%d)\n", payload_length); | |
327 | |
328 if (!(tmp2 = realloc(tmp, sizeof(struct gg_header) + tmp_length + payload_length))) { | |
329 gg_debug(GG_DEBUG_MISC, "// gg_send_packet() not enough memory for payload\n"); | |
330 free(tmp); | |
331 va_end(ap); | |
332 return -1; | |
333 } | |
334 | |
335 tmp = tmp2; | |
336 | |
337 memcpy(tmp + sizeof(struct gg_header) + tmp_length, payload, payload_length); | |
338 tmp_length += payload_length; | |
339 | |
340 payload = va_arg(ap, void *); | |
341 } | |
342 | |
343 va_end(ap); | |
344 | |
345 h = (struct gg_header*) tmp; | |
346 h->length = fix32(tmp_length); | |
2393 | 347 |
348 if ((gg_debug_level & GG_DEBUG_DUMP)) { | |
8775 | 349 unsigned int i; |
350 | |
351 gg_debug(GG_DEBUG_DUMP, "// gg_send_packet(0x%.2x)", fix32(h->type)); | |
352 for (i = 0; i < sizeof(struct gg_header) + fix32(h->length); i++) | |
353 gg_debug(GG_DEBUG_DUMP, " %.2x", (unsigned char) tmp[i]); | |
354 gg_debug(GG_DEBUG_DUMP, "\n"); | |
355 } | |
356 | |
357 tmp_length += sizeof(struct gg_header); | |
358 | |
359 if ((res = gg_write(sess, tmp, tmp_length)) < tmp_length) { | |
360 gg_debug(GG_DEBUG_MISC, "// gg_send_packet() write() failed. res = %d, errno = %d (%s)\n", res, errno, strerror(errno)); | |
2393 | 361 free(tmp); |
362 return -1; | |
363 } | |
8775 | 364 |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
365 free(tmp); |
2393 | 366 return 0; |
367 } | |
368 | |
8775 | 369 /* |
370 * gg_write() // funkcja pomocnicza | |
371 * | |
372 * zapisuje do gniazda okre¶lon± ilo¶ę bajtów. bierze pod uwagź, czy mamy | |
373 * po³±czenie zwyk³e czy TLS. | |
374 * | |
375 * - sess - sesja, | |
376 * - buf - bufor, | |
377 * - length - ilo¶ę bajtów, | |
378 * | |
379 * takie same warto¶ci jak write(). | |
380 */ | |
381 int gg_write(struct gg_session *sess, const char *buf, int length) | |
382 { | |
383 int res; | |
384 | |
385 #ifdef __GG_LIBGADU_HAVE_OPENSSL | |
386 if (sess->ssl) { | |
387 int err; | |
388 | |
389 res = SSL_write(sess->ssl, buf, length); | |
390 | |
391 if (res < 0) { | |
392 err = SSL_get_error(sess->ssl, res); | |
393 | |
394 if (err == SSL_ERROR_WANT_WRITE) | |
395 errno = EAGAIN; | |
396 | |
397 return -1; | |
398 } | |
399 } else | |
400 #endif | |
401 res = write(sess->fd, buf, length); | |
402 | |
403 return res; | |
404 } | |
405 | |
406 | |
3630 | 407 #ifndef _WIN32 |
2393 | 408 /* |
409 * gg_login() | |
410 * | |
411 * rozpoczyna procedurź ³±czenia siź z serwerem. resztź obs³guje siź przez | |
412 * gg_watch_event. | |
413 * | |
414 * - uin - numerek usera, | |
415 * - password - jego hase³ko, | |
416 * - async - ma byę asynchronicznie? | |
417 * | |
418 * UWAGA! program musi obs³uæyę SIGCHLD, je¶li ³±czy siź asynchronicznie, | |
419 * æeby zrobię pogrzeb zmar³emu procesowi resolvera. | |
420 * | |
421 * w przypadku b³źdu zwraca NULL, je¶li idzie dobrze (async) albo posz³o | |
422 * dobrze (sync), zwróci wska¼nik do zaalokowanej struktury `gg_session'. | |
423 */ | |
424 struct gg_session *gg_login(uin_t uin, char *password, int async) | |
425 { | |
426 struct gg_session *sess; | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
427 char *hostname; |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
428 int port; |
2393 | 429 |
430 gg_debug(GG_DEBUG_FUNCTION, "** gg_login(%u, \"...\", %d);\n", uin, async); | |
431 | |
432 if (!(sess = malloc(sizeof(*sess)))) | |
433 return NULL; | |
434 | |
435 sess->uin = uin; | |
436 if (!(sess->password = strdup(password))) { | |
437 free(sess); | |
438 return NULL; | |
439 } | |
440 sess->state = GG_STATE_RESOLVING; | |
441 sess->check = GG_CHECK_READ; | |
442 sess->async = async; | |
443 sess->seq = 0; | |
444 sess->recv_left = 0; | |
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
445 sess->last_pong = 0; |
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
446 sess->server_ip = 0; |
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
447 sess->initial_status = 0; |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
448 sess->type = GG_SESSION_GG; |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
449 |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
450 if (gg_http_use_proxy) { |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
451 hostname = gg_http_proxy_host; |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
452 port = gg_http_proxy_port; |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
453 } else { |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
454 hostname = GG_APPMSG_HOST; |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
455 port = GG_APPMSG_PORT; |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
456 }; |
2393 | 457 |
458 if (async) { | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
459 if (gg_resolve(&sess->fd, &sess->pid, hostname)) { |
2393 | 460 gg_debug(GG_DEBUG_MISC, "-- resolving failed\n"); |
461 free(sess); | |
462 return NULL; | |
463 } | |
464 } else { | |
465 struct in_addr a; | |
466 | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
467 if ((a.s_addr = inet_addr(hostname)) == INADDR_NONE) { |
2393 | 468 struct hostent *he; |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
469 |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
470 if (!(he = gethostbyname(hostname))) { |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
471 gg_debug(GG_DEBUG_MISC, "-- host %s not found\n", hostname); |
2393 | 472 free(sess); |
473 return NULL; | |
474 } else | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
475 memcpy((char*) &a, he->h_addr, sizeof(a)); |
2393 | 476 } |
477 | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
478 if (!(sess->fd = gg_connect(&a, port, 0)) == -1) { |
2393 | 479 gg_debug(GG_DEBUG_MISC, "-- connection failed\n"); |
480 free(sess); | |
481 return NULL; | |
482 } | |
483 | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
484 sess->state = GG_STATE_CONNECTING; |
2393 | 485 |
486 while (sess->state != GG_STATE_CONNECTED) { | |
487 struct gg_event *e; | |
488 | |
489 if (!(e = gg_watch_fd(sess))) { | |
490 gg_debug(GG_DEBUG_MISC, "-- some nasty error in gg_watch_fd()\n"); | |
491 free(sess); | |
492 return NULL; | |
493 } | |
494 | |
495 if (e->type == GG_EVENT_CONN_FAILED) { | |
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
496 errno = EACCES; |
2393 | 497 gg_debug(GG_DEBUG_MISC, "-- could not login\n"); |
498 gg_free_event(e); | |
499 free(sess); | |
500 return NULL; | |
501 } | |
502 | |
503 gg_free_event(e); | |
504 } | |
505 } | |
506 | |
507 return sess; | |
508 } | |
3630 | 509 #endif /*!_WIN32*/ |
2393 | 510 |
511 /* | |
8775 | 512 * gg_login_hash() // funkcja wewnźtrzna |
513 * | |
514 * liczy hash z has³a i danego seeda. | |
515 * | |
516 * - password - has³o do hashowania | |
517 * - seed - warto¶ę podana przez serwer | |
518 * | |
519 * hash. | |
520 */ | |
521 unsigned int gg_login_hash(const unsigned char *password, unsigned int seed) | |
522 { | |
523 unsigned int x, y, z; | |
524 | |
525 y = seed; | |
526 | |
527 for (x = 0; *password; password++) { | |
528 x = (x & 0xffffff00) | *password; | |
529 y ^= x; | |
530 y += x; | |
531 x <<= 8; | |
532 y ^= x; | |
533 x <<= 8; | |
534 y -= x; | |
535 x <<= 8; | |
536 y ^= x; | |
537 | |
538 z = y & 0x1F; | |
539 y = (y << z) | (y >> (32 - z)); | |
540 } | |
541 | |
542 return y; | |
543 } | |
544 | |
545 /* | |
2393 | 546 * gg_free_session() |
547 * | |
548 * zwalnia pamiźę zajmowan± przez opis sesji. | |
549 * | |
550 * - sess - opis sesji. | |
551 * | |
552 * nie zwraca niczego, bo i po co? | |
553 */ | |
554 void gg_free_session(struct gg_session *sess) | |
555 { | |
556 if (!sess) | |
557 return; | |
558 | |
559 free(sess->password); | |
560 free(sess); | |
561 } | |
562 | |
563 /* | |
564 * gg_change_status() | |
565 * | |
566 * zmienia status uæytkownika. przydatne do /away i /busy oraz /quit. | |
567 * | |
568 * - sess - opis sesji, | |
569 * - status - nowy status uæytkownika. | |
570 * | |
571 * je¶li wys³a³ pakiet zwraca 0, je¶li nie uda³o siź, zwraca -1. | |
572 */ | |
573 int gg_change_status(struct gg_session *sess, int status) | |
574 { | |
575 struct gg_new_status p; | |
576 | |
577 if (!sess) { | |
578 errno = EFAULT; | |
579 return -1; | |
580 } | |
581 | |
582 if (sess->state != GG_STATE_CONNECTED) { | |
583 errno = ENOTCONN; | |
584 return -1; | |
585 } | |
586 | |
587 gg_debug(GG_DEBUG_FUNCTION, "** gg_change_status(..., %d);\n", status); | |
588 | |
589 p.status = fix32(status); | |
590 | |
8775 | 591 return gg_send_packet(sess, GG_NEW_STATUS, &p, sizeof(p), NULL, 0); |
2393 | 592 } |
593 | |
594 /* | |
595 * gg_logoff() | |
596 * | |
597 * wylogowuje uæytkownika i zamyka po³±czenie. | |
598 * | |
599 * - sock - deskryptor socketu. | |
600 * | |
601 * nie zwraca b³źdów. skoro siź æegnamy, to olewamy wszystko. | |
602 */ | |
603 void gg_logoff(struct gg_session *sess) | |
604 { | |
605 if (!sess) | |
606 return; | |
607 | |
608 gg_debug(GG_DEBUG_FUNCTION, "** gg_logoff(...);\n"); | |
609 | |
610 if (sess->state == GG_STATE_CONNECTED) | |
611 gg_change_status(sess, GG_STATUS_NOT_AVAIL); | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
612 |
2393 | 613 if (sess->fd) { |
614 shutdown(sess->fd, 2); | |
615 close(sess->fd); | |
616 } | |
617 } | |
618 | |
619 /* | |
620 * gg_send_message() | |
621 * | |
622 * wysy³a wiadomo¶ę do innego uæytkownika. zwraca losowy numer | |
8775 | 623 * sekwencyjny, który moæna zignorowaę albo wykorzystaę do potwierdzenia. |
624 * | |
625 * - sess - opis sesji | |
626 * - msgclass - rodzaj wiadomo¶ci | |
627 * - recipient - numer adresata | |
628 * - message - tre¶ę wiadomo¶ci | |
2393 | 629 * |
8775 | 630 * numer sekwencyjny wiadomo¶ci lub -1 w przypadku b³źdu. |
631 */ | |
632 int gg_send_message(struct gg_session *sess, int msgclass, uin_t recipient, const unsigned char *message) | |
633 { | |
634 gg_debug(GG_DEBUG_FUNCTION, "** gg_send_message(%p, %d, %u, %p)\n", sess, msgclass, recipient, message); | |
635 | |
636 return gg_send_message_richtext(sess, msgclass, recipient, message, NULL, 0); | |
637 } | |
638 | |
639 /* | |
640 * gg_send_message_richtext() | |
2393 | 641 * |
8775 | 642 * wysy³a kolorow± wiadomo¶ę do innego uæytkownika. zwraca losowy numer |
643 * sekwencyjny, który moæna zignorowaę albo wykorzystaę do potwierdzenia. | |
644 * | |
645 * - sess - opis sesji | |
646 * - msgclass - rodzaj wiadomo¶ci | |
647 * - recipient - numer adresata | |
648 * - message - tre¶ę wiadomo¶ci | |
649 * - format - informacje o formatowaniu | |
650 * - formatlen - d³ugo¶ę informacji o formatowaniu | |
651 * | |
652 * numer sekwencyjny wiadomo¶ci lub -1 w przypadku b³źdu. | |
2393 | 653 */ |
8775 | 654 int gg_send_message_richtext(struct gg_session *sess, int msgclass, uin_t recipient, const unsigned char *message, const unsigned char *format, int formatlen) |
2393 | 655 { |
656 struct gg_send_msg s; | |
657 | |
8775 | 658 gg_debug(GG_DEBUG_FUNCTION, "** gg_send_message_richtext(%p, %d, %u, %p, %p, %d);\n", sess, msgclass, recipient, message, format, formatlen); |
659 | |
2393 | 660 if (!sess) { |
661 errno = EFAULT; | |
662 return -1; | |
663 } | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
664 |
2393 | 665 if (sess->state != GG_STATE_CONNECTED) { |
666 errno = ENOTCONN; | |
667 return -1; | |
668 } | |
669 | |
670 s.recipient = fix32(recipient); | |
671 if (!sess->seq) | |
672 sess->seq = 0x01740000 | (rand() & 0xffff); | |
673 s.seq = fix32(sess->seq); | |
674 s.msgclass = fix32(msgclass); | |
675 sess->seq += (rand() % 0x300) + 0x300; | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
676 |
8775 | 677 if (gg_send_packet(sess, GG_SEND_MSG, &s, sizeof(s), message, strlen(message) + 1, format, formatlen, NULL) == -1) |
2393 | 678 return -1; |
679 | |
680 return fix32(s.seq); | |
681 } | |
682 | |
683 /* | |
684 * gg_ping() | |
685 * | |
686 * wysy³a do serwera pakiet typu yeah-i'm-still-alive. | |
687 * | |
688 * - sess - zgadnij. | |
689 * | |
690 * je¶li nie powiod³o siź wys³anie pakietu, zwraca -1. otherwise 0. | |
691 */ | |
692 int gg_ping(struct gg_session *sess) | |
693 { | |
694 if (!sess) { | |
695 errno = EFAULT; | |
696 return -1; | |
697 } | |
698 | |
699 if (sess->state != GG_STATE_CONNECTED) { | |
700 errno = ENOTCONN; | |
701 return -1; | |
702 } | |
703 | |
704 gg_debug(GG_DEBUG_FUNCTION, "** gg_ping(...);\n"); | |
3630 | 705 |
8775 | 706 return gg_send_packet(sess, GG_PING, NULL); |
2393 | 707 } |
708 | |
709 /* | |
710 * gg_free_event() | |
711 * | |
712 * zwalnia pamiźę zajmowan± przez informacjź o zdarzeniu | |
713 * | |
714 * - event - wska¼nik do informacji o zdarzeniu | |
715 * | |
716 * nie ma czego zwracaę. | |
717 */ | |
718 void gg_free_event(struct gg_event *e) | |
719 { | |
720 if (!e) | |
721 return; | |
722 if (e->type == GG_EVENT_MSG) | |
723 free(e->event.msg.message); | |
724 if (e->type == GG_EVENT_NOTIFY) | |
725 free(e->event.notify); | |
726 free(e); | |
727 } | |
728 | |
729 /* | |
730 * gg_notify() | |
731 * | |
732 * wysy³a serwerowi listź ludków, za którymi tźsknimy. | |
733 * | |
734 * - sess - identyfikator sesji, | |
735 * - userlist - wska¼nik do tablicy numerów, | |
736 * - count - ilo¶ę numerków. | |
737 * | |
738 * je¶li uda³o siź, zwraca 0. je¶li b³±d, dostajemy -1. | |
739 */ | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
740 int gg_notify(struct gg_session *sess, uin_t *userlist, int count) |
2393 | 741 { |
742 struct gg_notify *n; | |
743 uin_t *u; | |
744 int i, res = 0; | |
745 | |
746 if (!sess) { | |
747 errno = EFAULT; | |
748 return -1; | |
749 } | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
750 |
2393 | 751 if (sess->state != GG_STATE_CONNECTED) { |
752 errno = ENOTCONN; | |
753 return -1; | |
754 } | |
755 | |
756 gg_debug(GG_DEBUG_FUNCTION, "** gg_notify(..., %d);\n", count); | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
757 |
2393 | 758 if (!userlist || !count) |
759 return 0; | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
760 |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
761 if (!(n = (struct gg_notify*) malloc(sizeof(*n) * count))) |
2393 | 762 return -1; |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
763 |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
764 for (u = userlist, i = 0; i < count; u++, i++) { |
2393 | 765 n[i].uin = fix32(*u); |
766 n[i].dunno1 = 3; | |
767 } | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
768 |
8775 | 769 if (gg_send_packet(sess, GG_NOTIFY, n, sizeof(*n) * count, NULL, 0) == -1) |
2393 | 770 res = -1; |
771 | |
772 free(n); | |
773 | |
774 return res; | |
775 } | |
776 | |
777 /* | |
778 * gg_add_notify() | |
779 * | |
780 * dodaje w locie do listy ukochanych dany numerek. | |
781 * | |
782 * - sess - identyfikator sesji, | |
783 * - uin - numerek ukochanej. | |
784 * | |
785 * je¶li uda³o siź wys³aę, daje 0. inaczej -1. | |
786 */ | |
787 int gg_add_notify(struct gg_session *sess, uin_t uin) | |
788 { | |
789 struct gg_add_remove a; | |
790 | |
791 if (!sess) { | |
792 errno = EFAULT; | |
793 return -1; | |
794 } | |
795 | |
796 if (sess->state != GG_STATE_CONNECTED) { | |
797 errno = ENOTCONN; | |
798 return -1; | |
799 } | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
800 |
2393 | 801 gg_debug(GG_DEBUG_FUNCTION, "** gg_add_notify(..., %u);\n", uin); |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
802 |
2393 | 803 a.uin = fix32(uin); |
804 a.dunno1 = 3; | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
805 |
8775 | 806 return gg_send_packet(sess, GG_ADD_NOTIFY, &a, sizeof(a), NULL); |
2393 | 807 } |
808 | |
809 /* | |
810 * gg_remove_notify() | |
811 * | |
812 * w locie usuwa z listy zainteresowanych. | |
813 * | |
814 * - sess - id sesji, | |
815 * - uin - numerek. | |
816 * | |
817 * zwraca -1 je¶li by³ b³±d, 0 je¶li siź uda³o wys³aę pakiet. | |
818 */ | |
819 int gg_remove_notify(struct gg_session *sess, uin_t uin) | |
820 { | |
821 struct gg_add_remove a; | |
822 | |
823 if (!sess) { | |
824 errno = EFAULT; | |
825 return -1; | |
826 } | |
827 | |
828 if (sess->state != GG_STATE_CONNECTED) { | |
829 errno = ENOTCONN; | |
830 return -1; | |
831 } | |
832 | |
833 gg_debug(GG_DEBUG_FUNCTION, "** gg_remove_notify(..., %u);\n", uin); | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
834 |
2393 | 835 a.uin = fix32(uin); |
836 a.dunno1 = 3; | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
837 |
8775 | 838 return gg_send_packet(sess, GG_REMOVE_NOTIFY, &a, sizeof(a), NULL, 0); |
839 } | |
840 | |
841 /* | |
842 * gg_userlist_request() | |
843 * | |
844 * wysy³a æ±danie/zapytanie listy kontaktów na serwerze. | |
845 * | |
846 * - sess - opis sesji | |
847 * - type - rodzaj zapytania/æ±dania | |
848 * - request - tre¶ę zapytania/æ±dania (moæe byę NULL) | |
849 * | |
850 * 0, -1 | |
851 */ | |
852 int gg_userlist_request(struct gg_session *sess, char type, const char *request) | |
853 { | |
854 int len; | |
855 | |
856 if (!sess) { | |
857 errno = EINVAL; | |
858 return -1; | |
859 } | |
860 | |
861 if (!request) { | |
862 sess->userlist_blocks = 1; | |
863 return gg_send_packet(sess, GG_USERLIST_REQUEST, &type, sizeof(type), NULL); | |
864 } | |
865 | |
866 len = strlen(request); | |
867 | |
868 sess->userlist_blocks = 0; | |
869 | |
870 while (len > 2047) { | |
871 sess->userlist_blocks++; | |
872 | |
873 if (gg_send_packet(sess, GG_USERLIST_REQUEST, &type, sizeof(type), request, 2047, NULL) == -1) | |
874 return -1; | |
875 | |
876 if (type == GG_USERLIST_PUT) | |
877 type = GG_USERLIST_PUT_MORE; | |
878 | |
879 request += 2047; | |
880 len -= 2047; | |
881 } | |
882 | |
883 sess->userlist_blocks++; | |
884 | |
885 return gg_send_packet(sess, GG_USERLIST_REQUEST, &type, sizeof(type), request, len, NULL); | |
2393 | 886 } |
887 | |
888 /* | |
889 * gg_watch_fd_connected() // funkcja wewnźtrzna | |
890 * | |
891 * patrzy na socketa, odbiera pakiet i wype³nia strukturź zdarzenia. | |
892 * | |
893 * - sock - lalala, trudno zgadn±ę. | |
894 * | |
895 * je¶li b³±d -1, je¶li dobrze 0. | |
896 */ | |
897 static int gg_watch_fd_connected(struct gg_session *sess, struct gg_event *e) | |
898 { | |
899 struct gg_header *h; | |
8775 | 900 char *p; |
2393 | 901 |
902 if (!sess) { | |
903 errno = EFAULT; | |
904 return -1; | |
905 } | |
906 | |
907 gg_debug(GG_DEBUG_FUNCTION, "** gg_watch_fd_connected(...);\n"); | |
908 | |
909 if (!(h = gg_recv_packet(sess))) { | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
910 gg_debug(GG_DEBUG_MISC, "-- gg_recv_packet failed. errno = %d (%d)\n", errno, strerror(errno)); |
2393 | 911 return -1; |
912 } | |
913 | |
6247 | 914 p = (void *)h + sizeof(struct gg_header); |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
915 |
8775 | 916 |
917 switch (h->type) { | |
918 case GG_RECV_MSG: | |
919 { | |
920 struct gg_recv_msg *r = (void *)p; | |
2393 | 921 |
922 gg_debug(GG_DEBUG_MISC, "-- received a message\n"); | |
923 | |
924 if (h->length >= sizeof(*r)) { | |
925 e->type = GG_EVENT_MSG; | |
926 e->event.msg.msgclass = fix32(r->msgclass); | |
927 e->event.msg.sender = fix32(r->sender); | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
928 e->event.msg.message = strdup((char*) r + sizeof(*r)); |
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
929 e->event.msg.time = fix32(r->time); |
2393 | 930 } |
8775 | 931 break; |
932 } | |
933 case GG_NOTIFY_REPLY: | |
934 { | |
935 struct gg_notify_reply *n = (void *)p; | |
2399
b2926d21f067
[gaim-migrate @ 2412]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2393
diff
changeset
|
936 int count, i; |
2393 | 937 |
938 gg_debug(GG_DEBUG_MISC, "-- received a notify reply\n"); | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
939 |
2393 | 940 e->type = GG_EVENT_NOTIFY; |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
941 if (!(e->event.notify = (void*) malloc(h->length + 2 * sizeof(*n)))) { |
2393 | 942 gg_debug(GG_DEBUG_MISC, "-- not enough memory\n"); |
943 free(h); | |
944 return -1; | |
945 } | |
2399
b2926d21f067
[gaim-migrate @ 2412]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2393
diff
changeset
|
946 count = h->length / sizeof(*n); |
2393 | 947 memcpy(e->event.notify, p, h->length); |
2399
b2926d21f067
[gaim-migrate @ 2412]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2393
diff
changeset
|
948 e->event.notify[count].uin = 0; |
b2926d21f067
[gaim-migrate @ 2412]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2393
diff
changeset
|
949 for (i = 0; i < count; i++) { |
b2926d21f067
[gaim-migrate @ 2412]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2393
diff
changeset
|
950 e->event.notify[i].uin = fix32(e->event.notify[i].uin); |
b2926d21f067
[gaim-migrate @ 2412]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2393
diff
changeset
|
951 e->event.notify[i].status = fix32(e->event.notify[i].status); |
b2926d21f067
[gaim-migrate @ 2412]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2393
diff
changeset
|
952 } |
8775 | 953 break; |
954 } | |
955 | |
956 case GG_NOTIFY_REPLY60: | |
957 { | |
958 struct gg_notify_reply60 *n = (void*) p; | |
959 unsigned int length = h->length, i = 0; | |
960 | |
961 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd_connected() received a notify reply\n"); | |
962 | |
963 e->type = GG_EVENT_NOTIFY60; | |
964 e->event.notify60 = malloc(sizeof(*e->event.notify60)); | |
965 | |
966 if (!e->event.notify60) { | |
967 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd_connected() not enough memory for notify data\n"); | |
968 goto fail; | |
969 } | |
970 | |
971 e->event.notify60[0].uin = 0; | |
972 | |
973 while (length >= sizeof(struct gg_notify_reply60)) { | |
974 uin_t uin = fix32(n->uin); | |
975 char *tmp; | |
976 | |
977 e->event.notify60[i].uin = uin & 0x00ffffff; | |
978 e->event.notify60[i].status = n->status; | |
979 e->event.notify60[i].remote_ip = n->remote_ip; | |
980 e->event.notify60[i].remote_port = fix16(n->remote_port); | |
981 e->event.notify60[i].version = n->version; | |
982 e->event.notify60[i].image_size = n->image_size; | |
983 e->event.notify60[i].descr = NULL; | |
984 e->event.notify60[i].time = 0; | |
985 | |
986 if (GG_S_D(n->status)) { | |
987 unsigned char descr_len = *((char*) n + sizeof(struct gg_notify_reply60)); | |
2393 | 988 |
8775 | 989 if (descr_len < length) { |
990 if (!(e->event.notify60[i].descr = malloc(descr_len + 1))) { | |
991 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd_connected() not enough memory for notify data\n"); | |
992 goto fail; | |
993 } | |
994 | |
995 memcpy(e->event.notify60[i].descr, (char*) n + sizeof(struct gg_notify_reply60) + 1, descr_len); | |
996 e->event.notify60[i].descr[descr_len] = 0; | |
997 | |
998 /* XXX czas */ | |
999 } | |
1000 | |
1001 length -= sizeof(struct gg_notify_reply60) + descr_len + 1; | |
1002 n = (void*) ((char*) n + sizeof(struct gg_notify_reply60) + descr_len + 1); | |
1003 } else { | |
1004 length -= sizeof(struct gg_notify_reply60); | |
1005 n = (void*) ((char*) n + sizeof(struct gg_notify_reply60)); | |
1006 } | |
1007 | |
1008 if (!(tmp = realloc(e->event.notify60, (i + 2) * sizeof(*e->event.notify60)))) { | |
1009 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd_connected() not enough memory for notify data\n"); | |
1010 free(e->event.notify60); | |
1011 goto fail; | |
1012 } | |
1013 | |
1014 e->event.notify60 = (void*) tmp; | |
1015 e->event.notify60[++i].uin = 0; | |
1016 } | |
1017 | |
1018 break; | |
1019 } | |
1020 | |
1021 case GG_STATUS: | |
1022 { | |
1023 struct gg_status *s = (void *)p; | |
2393 | 1024 |
1025 gg_debug(GG_DEBUG_MISC, "-- received a status change\n"); | |
1026 | |
1027 if (h->length >= sizeof(*s)) { | |
1028 e->type = GG_EVENT_STATUS; | |
1029 memcpy(&e->event.status, p, h->length); | |
2399
b2926d21f067
[gaim-migrate @ 2412]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2393
diff
changeset
|
1030 e->event.status.uin = fix32(e->event.status.uin); |
b2926d21f067
[gaim-migrate @ 2412]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2393
diff
changeset
|
1031 e->event.status.status = fix32(e->event.status.status); |
2393 | 1032 } |
8775 | 1033 break; |
1034 } | |
1035 | |
1036 case GG_STATUS60: | |
1037 { | |
1038 struct gg_status60 *s = (void*) p; | |
1039 uint32_t uin; | |
1040 | |
1041 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd_connected() received a status change\n"); | |
1042 | |
1043 if (h->length < sizeof(*s)) | |
1044 break; | |
1045 | |
1046 uin = fix32(s->uin); | |
1047 | |
1048 e->type = GG_EVENT_STATUS60; | |
1049 e->event.status60.uin = uin & 0x00ffffff; | |
1050 e->event.status60.status = s->status; | |
1051 e->event.status60.remote_ip = s->remote_ip; | |
1052 e->event.status60.remote_port = fix16(s->remote_port); | |
1053 e->event.status60.version = s->version; | |
1054 e->event.status60.image_size = s->image_size; | |
1055 e->event.status60.descr = NULL; | |
1056 e->event.status60.time = 0; | |
2393 | 1057 |
8775 | 1058 if (uin & 0x40000000) |
1059 e->event.status60.version |= GG_HAS_AUDIO_MASK; | |
1060 | |
1061 if (h->length > sizeof(*s)) { | |
1062 int len = h->length - sizeof(*s); | |
1063 char *buf = malloc(len + 1); | |
1064 | |
1065 if (buf) { | |
1066 memcpy(buf, (char*) p + sizeof(*s), len); | |
1067 buf[len] = 0; | |
1068 } | |
1069 | |
1070 e->event.status60.descr = buf; | |
1071 | |
1072 if (len > 4 && p[h->length - 5] == 0) | |
1073 e->event.status60.time = *((int*) (p + h->length - 4)); | |
1074 } | |
1075 | |
1076 break; | |
1077 } | |
1078 | |
1079 case GG_SEND_MSG_ACK: | |
1080 { | |
1081 struct gg_send_msg_ack *s = (void *)p; | |
2393 | 1082 |
1083 gg_debug(GG_DEBUG_MISC, "-- received a message ack\n"); | |
1084 | |
1085 if (h->length >= sizeof(*s)) { | |
1086 e->type = GG_EVENT_ACK; | |
1087 e->event.ack.status = fix32(s->status); | |
1088 e->event.ack.recipient = fix32(s->recipient); | |
1089 e->event.ack.seq = fix32(s->seq); | |
1090 } | |
8775 | 1091 break; |
1092 } | |
2393 | 1093 |
8775 | 1094 case GG_PONG: |
1095 { | |
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
1096 gg_debug(GG_DEBUG_MISC, "-- received a pong\n"); |
3630 | 1097 ping_outstanding = 0; |
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
1098 sess->last_pong = time(NULL); |
8775 | 1099 break; |
1100 } | |
1101 | |
1102 case GG_USERLIST_REPLY: | |
1103 { | |
1104 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd_connected() received userlist reply\n"); | |
1105 | |
1106 if (h->length < 1) | |
1107 break; | |
1108 | |
1109 /* je¶li odpowied¼ na eksport, wywo³aj zdarzenie tylko | |
1110 * gdy otrzymano wszystkie odpowiedzi */ | |
1111 if (p[0] == GG_USERLIST_PUT_REPLY || p[0] == GG_USERLIST_PUT_MORE_REPLY) { | |
1112 if (--sess->userlist_blocks) | |
1113 break; | |
1114 | |
1115 p[0] = GG_USERLIST_PUT_REPLY; | |
1116 } | |
1117 | |
1118 if (h->length > 1) { | |
1119 char *tmp; | |
1120 int len = (sess->userlist_reply) ? strlen(sess->userlist_reply) : 0; | |
1121 | |
1122 gg_debug(GG_DEBUG_MISC, "userlist_reply=%p, len=%d\n", sess->userlist_reply, len); | |
1123 | |
1124 if (!(tmp = realloc(sess->userlist_reply, len + h->length))) { | |
1125 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd_connected() not enough memory for userlist reply\n"); | |
1126 free(sess->userlist_reply); | |
1127 sess->userlist_reply = NULL; | |
1128 goto fail; | |
1129 } | |
1130 | |
1131 sess->userlist_reply = tmp; | |
1132 sess->userlist_reply[len + h->length - 1] = 0; | |
1133 memcpy(sess->userlist_reply + len, p + 1, h->length - 1); | |
1134 } | |
1135 | |
1136 if (p[0] == GG_USERLIST_GET_MORE_REPLY) | |
1137 break; | |
1138 | |
1139 e->type = GG_EVENT_USERLIST; | |
1140 e->event.userlist.type = p[0]; | |
1141 e->event.userlist.reply = sess->userlist_reply; | |
1142 sess->userlist_reply = NULL; | |
1143 | |
1144 break; | |
1145 } | |
1146 | |
1147 default: | |
1148 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd_connected() received unknown packet 0x%.2x\n", h->type); | |
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
1149 } |
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
1150 |
2393 | 1151 free(h); |
1152 | |
1153 return 0; | |
8775 | 1154 |
1155 fail: | |
1156 free(h); | |
1157 return -1; | |
2393 | 1158 } |
1159 | |
1160 /* | |
1161 * gg_watch_fd() | |
1162 * | |
1163 * funkcja wywo³ywana, gdy co¶ siź stanie na obserwowanym deskryptorze. | |
1164 * zwraca klientowi informacjź o tym, co siź dzieje. | |
1165 * | |
1166 * - sess - identyfikator sesji. | |
1167 * | |
1168 * zwraca wska¼nik do struktury gg_event, któr± trzeba zwolnię pó¼niej | |
1169 * za pomoc± gg_free_event(). jesli rodzaj zdarzenia jest równy | |
1170 * GG_EVENT_NONE, naleæy je olaę kompletnie. je¶li zwróci³o NULL, | |
1171 * sta³o siź co¶ niedobrego -- albo brak³o pamiźci albo zerwa³o | |
1172 * po³±czenie albo co¶ takiego. | |
1173 */ | |
1174 struct gg_event *gg_watch_fd(struct gg_session *sess) | |
1175 { | |
1176 struct gg_event *e; | |
1177 int res = 0; | |
3630 | 1178 #ifndef _WIN32 |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1179 int port; |
3630 | 1180 #endif |
2393 | 1181 |
1182 if (!sess) { | |
1183 errno = EFAULT; | |
1184 return NULL; | |
1185 } | |
1186 | |
1187 gg_debug(GG_DEBUG_FUNCTION, "** gg_watch_fd(...);\n"); | |
1188 | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1189 if (!(e = (void*) malloc(sizeof(*e)))) { |
2393 | 1190 gg_debug(GG_DEBUG_MISC, "-- not enough memory\n"); |
1191 return NULL; | |
1192 } | |
1193 | |
1194 e->type = GG_EVENT_NONE; | |
1195 | |
1196 switch (sess->state) { | |
3630 | 1197 #ifndef _WIN32 |
1198 /* Apparantly we will never be in this state as long as we are | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
4298
diff
changeset
|
1199 using gaim_proxy_connect instead of gg_login - Herman */ |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1200 case GG_STATE_RESOLVING: |
2393 | 1201 { |
1202 struct in_addr a; | |
1203 | |
1204 gg_debug(GG_DEBUG_MISC, "== GG_STATE_RESOLVING\n"); | |
1205 | |
1206 if (read(sess->fd, &a, sizeof(a)) < sizeof(a) || a.s_addr == INADDR_NONE) { | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1207 gg_debug(GG_DEBUG_MISC, "-- resolving failed\n"); |
2393 | 1208 |
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
1209 errno = ENOENT; |
2393 | 1210 e->type = GG_EVENT_CONN_FAILED; |
1211 e->event.failure = GG_FAILURE_RESOLVING; | |
1212 sess->state = GG_STATE_IDLE; | |
1213 | |
1214 close(sess->fd); | |
1215 | |
1216 break; | |
1217 } | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1218 |
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
1219 sess->server_ip = a.s_addr; |
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
1220 |
2393 | 1221 close(sess->fd); |
1222 | |
1223 waitpid(sess->pid, NULL, 0); | |
1224 | |
1225 gg_debug(GG_DEBUG_MISC, "-- resolved, now connecting\n"); | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1226 |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1227 if (gg_http_use_proxy) { |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1228 port = gg_http_proxy_port; |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1229 } else { |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1230 port = GG_APPMSG_PORT; |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1231 }; |
2393 | 1232 |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1233 if ((sess->fd = gg_connect(&a, port, sess->async)) == -1) { |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1234 struct in_addr *addr = (struct in_addr*) &sess->server_ip; |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1235 |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1236 gg_debug(GG_DEBUG_MISC, "-- connection failed, trying direct connection\n"); |
2393 | 1237 |
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
1238 if ((sess->fd = gg_connect(addr, GG_DEFAULT_PORT, sess->async)) == -1) { |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1239 gg_debug(GG_DEBUG_MISC, "-- connection failed, trying https connection\n"); |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1240 if ((sess->fd = gg_connect(&a, GG_HTTPS_PORT, sess->async)) == -1) { |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1241 gg_debug(GG_DEBUG_MISC, "-- connect() failed. errno = %d (%s)\n", errno, strerror(errno)); |
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
1242 |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1243 e->type = GG_EVENT_CONN_FAILED; |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1244 e->event.failure = GG_FAILURE_CONNECTING; |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1245 sess->state = GG_STATE_IDLE; |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1246 break; |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1247 } |
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
1248 } |
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
1249 sess->state = GG_STATE_CONNECTING_GG; |
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
1250 sess->check = GG_CHECK_WRITE; |
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
1251 } else { |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1252 sess->state = GG_STATE_CONNECTING; |
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
1253 sess->check = GG_CHECK_WRITE; |
2393 | 1254 } |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1255 |
2393 | 1256 break; |
1257 } | |
3630 | 1258 #endif /* !_WIN32 */ |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1259 case GG_STATE_CONNECTING: |
2393 | 1260 { |
1261 char buf[1024]; | |
6063 | 1262 unsigned int res, res_size = sizeof(res); |
2393 | 1263 |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1264 gg_debug(GG_DEBUG_MISC, "== GG_STATE_CONNECTING\n"); |
2393 | 1265 |
3717
988485669631
[gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
3630
diff
changeset
|
1266 if (sess->async && (getsockopt(sess->fd, SOL_SOCKET, SO_ERROR, &res, &res_size) || res)) { |
3630 | 1267 #if 0 |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1268 struct in_addr *addr = (struct in_addr*) &sess->server_ip; |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1269 gg_debug(GG_DEBUG_MISC, "-- http connection failed, errno = %d (%s), trying direct connection\n", res, strerror(res)); |
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
1270 if ((sess->fd = gg_connect(addr, GG_DEFAULT_PORT, sess->async)) == -1) { |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1271 gg_debug(GG_DEBUG_MISC, "-- connection failed, trying https connection\n"); |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1272 if ((sess->fd = gg_connect(addr, GG_HTTPS_PORT, sess->async)) == -1) { |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1273 gg_debug(GG_DEBUG_MISC, "-- connect() failed. errno = %d (%s)\n", errno, strerror(errno)); |
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
1274 |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1275 e->type = GG_EVENT_CONN_FAILED; |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1276 e->event.failure = GG_FAILURE_CONNECTING; |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1277 sess->state = GG_STATE_IDLE; |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1278 break; |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1279 } |
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
1280 } |
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
1281 |
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
1282 sess->state = GG_STATE_CONNECTING_GG; |
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
1283 sess->check = GG_CHECK_WRITE; |
3630 | 1284 #else |
1285 gg_debug(GG_DEBUG_MISC, "-- http connection failed, errno = %d\n", res); | |
1286 e->type = GG_EVENT_CONN_FAILED; | |
1287 e->event.failure = GG_FAILURE_CONNECTING; | |
1288 sess->state = GG_STATE_IDLE; | |
1289 #endif | |
2393 | 1290 break; |
1291 } | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1292 |
2393 | 1293 gg_debug(GG_DEBUG_MISC, "-- http connection succeded, sending query\n"); |
1294 | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1295 if (gg_http_use_proxy) { |
3630 | 1296 g_snprintf(buf, sizeof(buf) - 1, |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1297 "GET http://" GG_APPMSG_HOST "/appsvc/appmsg.asp?fmnumber=%lu HTTP/1.0\r\n" |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1298 "Host: " GG_APPMSG_HOST "\r\n" |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1299 "User-Agent: " GG_HTTP_USERAGENT "\r\n" |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1300 "Pragma: no-cache\r\n" |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1301 "\r\n", sess->uin); |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1302 } else { |
3630 | 1303 g_snprintf(buf, sizeof(buf) - 1, |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1304 "GET /appsvc/appmsg.asp?fmnumber=%lu HTTP/1.0\r\n" |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1305 "Host: " GG_APPMSG_HOST "\r\n" |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1306 "User-Agent: " GG_HTTP_USERAGENT "\r\n" |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1307 "Pragma: no-cache\r\n" |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1308 "\r\n", sess->uin); |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1309 }; |
2393 | 1310 |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1311 gg_debug(GG_DEBUG_MISC, "=> -----BEGIN-HTTP-QUERY-----\n%s\n=> -----END-HTTP-QUERY-----\n", buf); |
2393 | 1312 if (write(sess->fd, buf, strlen(buf)) < strlen(buf)) { |
1313 gg_debug(GG_DEBUG_MISC, "-- sending query failed\n"); | |
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
1314 errno = EIO; |
2393 | 1315 e->type = GG_EVENT_CONN_FAILED; |
1316 e->event.failure = GG_FAILURE_WRITING; | |
1317 sess->state = GG_STATE_IDLE; | |
1318 break; | |
1319 } | |
1320 | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1321 sess->state = GG_STATE_READING_DATA; |
2393 | 1322 sess->check = GG_CHECK_READ; |
1323 | |
1324 break; | |
1325 } | |
1326 | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1327 case GG_STATE_READING_DATA: |
2393 | 1328 { |
1329 char buf[1024], *tmp, *host; | |
1330 int port = GG_DEFAULT_PORT; | |
1331 struct in_addr a; | |
1332 | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1333 gg_debug(GG_DEBUG_MISC, "== GG_STATE_READING_DATA\n"); |
2393 | 1334 |
1335 gg_read_line(sess->fd, buf, sizeof(buf) - 1); | |
1336 gg_chomp(buf); | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1337 |
2393 | 1338 gg_debug(GG_DEBUG_TRAFFIC, "-- got http response (%s)\n", buf); |
1339 if (strncmp(buf, "HTTP/1.", 7) || strncmp(buf + 9, "200", 3)) { | |
1340 gg_debug(GG_DEBUG_MISC, "-- but that's not what we've expected\n"); | |
1341 | |
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
1342 errno = EINVAL; |
2393 | 1343 e->type = GG_EVENT_CONN_FAILED; |
1344 e->event.failure = GG_FAILURE_INVALID; | |
1345 sess->state = GG_STATE_IDLE; | |
1346 break; | |
1347 } | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1348 |
2393 | 1349 while (strcmp(buf, "\r\n") && strcmp(buf, "")) |
1350 gg_read_line(sess->fd, buf, sizeof(buf) - 1); | |
1351 | |
1352 gg_read_line(sess->fd, buf, sizeof(buf) - 1); | |
1353 gg_chomp(buf); | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1354 |
2393 | 1355 close(sess->fd); |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1356 |
2393 | 1357 gg_debug(GG_DEBUG_TRAFFIC, "-- received http data (%s)\n", buf); |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1358 |
8775 | 1359 /* analizujemy otrzymane dane. */ |
2393 | 1360 tmp = buf; |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1361 |
2393 | 1362 while (*tmp && *tmp != ' ') |
1363 tmp++; | |
1364 while (*tmp && *tmp == ' ') | |
1365 tmp++; | |
1366 while (*tmp && *tmp != ' ') | |
1367 tmp++; | |
1368 while (*tmp && *tmp == ' ') | |
1369 tmp++; | |
1370 while (*tmp && *tmp != ' ') | |
1371 tmp++; | |
1372 while (*tmp && *tmp == ' ') | |
1373 tmp++; | |
1374 host = tmp; | |
1375 while (*tmp && *tmp != ' ') | |
1376 tmp++; | |
1377 *tmp = 0; | |
1378 | |
1379 if ((tmp = strchr(host, ':'))) { | |
1380 *tmp = 0; | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1381 port = atoi(tmp+1); |
2393 | 1382 } |
1383 | |
1384 a.s_addr = inet_addr(host); | |
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
1385 sess->server_ip = a.s_addr; |
8775 | 1386 |
3630 | 1387 #if 0 |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
4298
diff
changeset
|
1388 /* We need to watch this non-blocking socket so lets use gaim_proxy_connect |
3630 | 1389 in gg.c - Herman */ |
1390 if((sess->fd = gg_connect(&a, port, sess->assync)) == -1) { | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1391 gg_debug(GG_DEBUG_MISC, "-- connection failed, trying https connection\n"); |
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
1392 if ((sess->fd = gg_connect(&a, GG_HTTPS_PORT, sess->async)) == -1) { |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1393 gg_debug(GG_DEBUG_MISC, "-- connection failed, errno = %d (%s)\n", errno, strerror(errno)); |
2393 | 1394 |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1395 e->type = GG_EVENT_CONN_FAILED; |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1396 e->event.failure = GG_FAILURE_CONNECTING; |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1397 sess->state = GG_STATE_IDLE; |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1398 break; |
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
1399 } |
2393 | 1400 } |
3630 | 1401 #else |
1402 sess->port = port; | |
1403 #endif | |
2393 | 1404 sess->state = GG_STATE_CONNECTING_GG; |
1405 sess->check = GG_CHECK_WRITE; | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1406 |
2393 | 1407 break; |
1408 } | |
1409 | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1410 case GG_STATE_CONNECTING_GG: |
2393 | 1411 { |
6063 | 1412 unsigned int res, res_size = sizeof(res); |
2393 | 1413 |
1414 gg_debug(GG_DEBUG_MISC, "== GG_STATE_CONNECTING_GG\n"); | |
1415 | |
3717
988485669631
[gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
3630
diff
changeset
|
1416 if (sess->async && (getsockopt(sess->fd, SOL_SOCKET, SO_ERROR, &res, &res_size) || res)) { |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1417 struct in_addr *addr = (struct in_addr*) &sess->server_ip; |
2393 | 1418 |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1419 gg_debug(GG_DEBUG_MISC, "-- connection failed, trying https connection\n"); |
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
1420 if ((sess->fd = gg_connect(addr, GG_HTTPS_PORT, sess->async)) == -1) { |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1421 gg_debug(GG_DEBUG_MISC, "-- connection failed, errno = %d (%s)\n", errno, strerror(errno)); |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1422 |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1423 e->type = GG_EVENT_CONN_FAILED; |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1424 e->event.failure = GG_FAILURE_CONNECTING; |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1425 sess->state = GG_STATE_IDLE; |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1426 break; |
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
1427 } |
2393 | 1428 } |
1429 | |
1430 gg_debug(GG_DEBUG_MISC, "-- connected\n"); | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1431 |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1432 sess->state = GG_STATE_READING_KEY; |
2393 | 1433 sess->check = GG_CHECK_READ; |
1434 | |
1435 break; | |
1436 } | |
1437 | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1438 case GG_STATE_READING_KEY: |
2393 | 1439 { |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1440 struct gg_header *h; |
2393 | 1441 struct gg_welcome *w; |
8775 | 1442 struct gg_login60 l; |
2393 | 1443 unsigned int hash; |
1444 char *password = sess->password; | |
1445 | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1446 gg_debug(GG_DEBUG_MISC, "== GG_STATE_READING_KEY\n"); |
2393 | 1447 |
1448 if (!(h = gg_recv_packet(sess))) { | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1449 gg_debug(GG_DEBUG_MISC, "-- gg_recv_packet() failed. errno = %d (%s)\n", errno, strerror(errno)); |
2393 | 1450 e->type = GG_EVENT_CONN_FAILED; |
1451 e->event.failure = GG_FAILURE_READING; | |
1452 sess->state = GG_STATE_IDLE; | |
1453 close(sess->fd); | |
1454 break; | |
1455 } | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1456 |
2393 | 1457 if (h->type != GG_WELCOME) { |
1458 gg_debug(GG_DEBUG_MISC, "-- invalid packet received\n"); | |
1459 | |
1460 free(h); | |
1461 close(sess->fd); | |
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
1462 errno = EINVAL; |
2393 | 1463 e->type = GG_EVENT_CONN_FAILED; |
1464 e->event.failure = GG_FAILURE_INVALID; | |
1465 sess->state = GG_STATE_IDLE; | |
1466 break; | |
1467 } | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1468 |
6247 | 1469 w = (struct gg_welcome *)((void *)h + sizeof(struct gg_header)); |
2393 | 1470 w->key = fix32(w->key); |
8775 | 1471 |
1472 hash = gg_login_hash(password, w->key); | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1473 |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1474 gg_debug(GG_DEBUG_DUMP, "%%%% klucz serwera %.4x, hash has³a %.8x\n", w->key, hash); |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1475 |
2393 | 1476 free(h); |
1477 | |
1478 free(sess->password); | |
1479 sess->password = NULL; | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1480 |
2393 | 1481 l.uin = fix32(sess->uin); |
1482 l.hash = fix32(hash); | |
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
1483 l.status = fix32(sess->initial_status ? sess->initial_status : GG_STATUS_AVAIL); |
8775 | 1484 l.version = fix32(0x20); |
2393 | 1485 l.local_ip = 0; |
1486 l.local_port = 0; | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1487 |
2393 | 1488 gg_debug(GG_DEBUG_TRAFFIC, "-- sending GG_LOGIN packet\n"); |
1489 | |
8775 | 1490 if (gg_send_packet(sess, GG_LOGIN60, &l, sizeof(l), NULL, 0) == -1) { |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1491 gg_debug(GG_DEBUG_TRAFFIC, "-- oops, failed. errno = %d (%s)\n", errno, strerror(errno)); |
2393 | 1492 |
1493 close(sess->fd); | |
1494 e->type = GG_EVENT_CONN_FAILED; | |
1495 e->event.failure = GG_FAILURE_WRITING; | |
1496 sess->state = GG_STATE_IDLE; | |
1497 break; | |
1498 } | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1499 |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1500 sess->state = GG_STATE_READING_REPLY; |
2393 | 1501 |
1502 break; | |
1503 } | |
1504 | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1505 case GG_STATE_READING_REPLY: |
2393 | 1506 { |
1507 struct gg_header *h; | |
1508 | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1509 gg_debug(GG_DEBUG_MISC, "== GG_STATE_READING_REPLY\n"); |
2393 | 1510 |
1511 if (!(h = gg_recv_packet(sess))) { | |
1512 gg_debug(GG_DEBUG_MISC, "-- recv_packet failed\n"); | |
1513 e->type = GG_EVENT_CONN_FAILED; | |
1514 e->event.failure = GG_FAILURE_READING; | |
1515 sess->state = GG_STATE_IDLE; | |
1516 close(sess->fd); | |
1517 break; | |
1518 } | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1519 |
2393 | 1520 if (h->type == GG_LOGIN_OK) { |
1521 gg_debug(GG_DEBUG_MISC, "-- login succeded\n"); | |
1522 e->type = GG_EVENT_CONN_SUCCESS; | |
1523 sess->state = GG_STATE_CONNECTED; | |
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
1524 free(h); |
2393 | 1525 break; |
1526 } | |
1527 | |
1528 if (h->type == GG_LOGIN_FAILED) { | |
1529 gg_debug(GG_DEBUG_MISC, "-- login failed\n"); | |
1530 e->event.failure = GG_FAILURE_PASSWORD; | |
1531 errno = EACCES; | |
1532 } else { | |
1533 gg_debug(GG_DEBUG_MISC, "-- invalid packet\n"); | |
1534 e->event.failure = GG_FAILURE_INVALID; | |
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
1535 errno = EINVAL; |
2393 | 1536 } |
1537 | |
1538 e->type = GG_EVENT_CONN_FAILED; | |
1539 sess->state = GG_STATE_IDLE; | |
1540 close(sess->fd); | |
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
1541 free(h); |
2393 | 1542 |
1543 break; | |
1544 } | |
1545 | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1546 case GG_STATE_CONNECTED: |
2393 | 1547 { |
1548 gg_debug(GG_DEBUG_MISC, "== GG_STATE_CONNECTED\n"); | |
1549 | |
1550 if ((res = gg_watch_fd_connected(sess, e)) == -1) { | |
1551 | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1552 gg_debug(GG_DEBUG_MISC, "-- watch_fd_connected failed. errno = %d (%s)\n", errno, strerror(errno)); |
2393 | 1553 |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1554 if (errno == EAGAIN) { |
2393 | 1555 e->type = GG_EVENT_NONE; |
1556 res = 0; | |
1557 } else | |
1558 res = -1; | |
1559 } | |
1560 break; | |
1561 } | |
1562 } | |
1563 | |
1564 if (res == -1) { | |
1565 free(e); | |
1566 e = NULL; | |
1567 } | |
1568 | |
1569 return e; | |
1570 } | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1571 |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1572 /* |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1573 * Local variables: |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1574 * c-indentation-style: k&r |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1575 * c-basic-offset: 8 |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1576 * indent-tabs-mode: notnil |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1577 * End: |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1578 * |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1579 * vim: shiftwidth=8: |
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1580 */ |