Mercurial > pidgin
annotate src/protocols/gg/libgg.c @ 4076:91c4bd698d39
[gaim-migrate @ 4291]
I went ape on ICQ's i18n stuff for offline messages/channel 4 messages. I'm
pretty sure accented characters and what not should work like a charm, now.
Thanks to Mr. McQueen and Mr. Blanton. Also, I changed some stuff with handling
these types of messages, so we actually delimit the message at the delimiters.
So, uh, hopefully no one will complain about funky "?" symbols in their
authorization requests.
Stuff to look out for would be authorization requests and replies not working.
I still haven't been able to get icqnum@pager.icq.com to work reliably enough
to test it.
And also, I'd like to take this moment to say that lobsters are really neat.
Yeah. Lobsters.
committer: Tailor Script <tailor@pidgin.im>
| author | Mark Doliner <mark@kingant.net> |
|---|---|
| date | Sun, 15 Dec 2002 06:15:27 +0000 |
| parents | ad31c79c18b7 |
| children | cddb50734169 |
| rev | line source |
|---|---|
| 4016 | 1 /* $Id: libgg.c 4216 2002-11-29 12:48:01Z lschiere $ */ |
| 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 |
| 2393 | 52 #include "libgg.h" |
|
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
53 #include "config.h" |
| 3630 | 54 #include "gaim.h" |
| 55 #include "proxy.h" | |
| 2393 | 56 |
|
3717
988485669631
[gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
3630
diff
changeset
|
57 #ifdef _WIN32 |
|
988485669631
[gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
3630
diff
changeset
|
58 #include "win32dep.h" |
|
988485669631
[gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
3630
diff
changeset
|
59 #endif |
|
988485669631
[gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
3630
diff
changeset
|
60 |
| 3630 | 61 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
|
62 int gg_http_use_proxy = 0; |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
63 int gg_http_proxy_port = 0; |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
64 char *gg_http_proxy_host = NULL; |
| 2393 | 65 |
| 3630 | 66 /* temp -Herman */ |
| 67 static int ping_outstanding = 0; | |
| 68 | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
69 #ifndef lint |
|
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
70 |
|
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
71 static char rcsid[] |
|
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
72 #ifdef __GNUC__ |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
73 __attribute__ ((unused)) |
|
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
74 #endif |
| 4016 | 75 = "$Id: libgg.c 4216 2002-11-29 12:48:01Z lschiere $"; |
| 2393 | 76 |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
77 #endif |
| 2393 | 78 |
| 79 /* | |
| 80 * fix32() // funkcja wewnętrzna | |
| 81 * | |
| 82 * dla maszyn big-endianowych zamienia kolejność bajtów w ,,long''ach. | |
| 83 */ | |
| 84 static inline unsigned long fix32(unsigned long x) | |
| 85 { | |
|
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
86 #ifndef WORDS_BIGENDIAN |
| 2393 | 87 return x; |
| 88 #else | |
|
2399
b2926d21f067
[gaim-migrate @ 2412]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2393
diff
changeset
|
89 return (unsigned long) |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
90 (((x & (unsigned long) 0x000000ffU) << 24) | |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
91 ((x & (unsigned long) 0x0000ff00U) << 8) | |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
92 ((x & (unsigned long) 0x00ff0000U) >> 8) | |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
93 ((x & (unsigned long) 0xff000000U) >> 24)); |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
94 #endif |
| 2393 | 95 } |
| 96 | |
| 97 /* | |
| 98 * fix16() // funkcja wewnętrzna | |
| 99 * | |
| 100 * dla maszyn big-endianowych zamienia kolejność bajtów w ,,short''ach. | |
| 101 */ | |
| 102 static inline unsigned short fix16(unsigned short x) | |
| 103 { | |
|
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
104 #ifndef WORDS_BIGENDIAN |
| 2393 | 105 return x; |
| 106 #else | |
|
2399
b2926d21f067
[gaim-migrate @ 2412]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2393
diff
changeset
|
107 return (unsigned short) |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
108 (((x & (unsigned short) 0x00ffU) << 8) | |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
109 ((x & (unsigned short) 0xff00U) >> 8)); |
|
2399
b2926d21f067
[gaim-migrate @ 2412]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2393
diff
changeset
|
110 #endif |
| 2393 | 111 } |
| 112 | |
| 3630 | 113 #ifndef _WIN32 |
| 2393 | 114 /* |
| 115 * gg_resolve() // funkcja wewnętrzna | |
| 116 * | |
| 117 * tworzy pipe'y, forkuje się i w drugim procesie zaczyna resolvować | |
| 118 * podanego hosta. zapisuje w sesji deskryptor pipe'u. jeśli coś tam | |
| 119 * będzie gotowego, znaczy, że można wczytać ,,struct in_addr''. jeśli | |
| 120 * nie znajdzie, zwraca INADDR_NONE. | |
| 121 * | |
| 122 * - fd - wskaźnik gdzie wrzucić deskryptor, | |
| 123 * - pid - gdzie wrzucić pid dzieciaka, | |
| 124 * - hostname - nazwa hosta do zresolvowania. | |
| 125 * | |
| 126 * zwraca 0 jeśli udało się odpalić proces lub -1 w przypadku błędu. | |
| 127 */ | |
| 128 int gg_resolve(int *fd, int *pid, char *hostname) | |
| 129 { | |
| 130 int pipes[2], res; | |
| 131 struct in_addr a; | |
| 132 | |
| 133 gg_debug(GG_DEBUG_FUNCTION, "** gg_resolve(..., \"%s\");\n", hostname); | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
134 |
| 2393 | 135 if (!fd | !pid) { |
| 136 errno = EFAULT; | |
| 137 return -1; | |
| 138 } | |
| 139 | |
| 140 if (pipe(pipes) == -1) | |
| 141 return -1; | |
| 142 | |
| 143 if ((res = fork()) == -1) | |
| 144 return -1; | |
| 145 | |
| 146 if (!res) { | |
| 147 if ((a.s_addr = inet_addr(hostname)) == INADDR_NONE) { | |
| 148 struct hostent *he; | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
149 |
| 2393 | 150 if (!(he = gethostbyname(hostname))) |
| 151 a.s_addr = INADDR_NONE; | |
| 152 else | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
153 memcpy((char*) &a, he->h_addr, sizeof(a)); |
| 2393 | 154 } |
| 155 | |
| 156 write(pipes[1], &a, sizeof(a)); | |
| 157 | |
| 158 exit(0); | |
| 159 } | |
| 160 | |
| 161 close(pipes[1]); | |
| 162 | |
| 163 *fd = pipes[0]; | |
| 164 *pid = res; | |
| 165 | |
| 166 return 0; | |
| 167 } | |
| 3630 | 168 #endif /*!_WIN32*/ |
| 2393 | 169 |
| 170 /* | |
| 171 * gg_recv_packet() // funkcja wewnętrzna | |
| 172 * | |
| 173 * odbiera jeden pakiet gg i zwraca wskaźnik do niego. pamięć po nim | |
| 174 * wypadałoby uwolnić. | |
| 175 * | |
| 176 * - sock - połączony socket. | |
| 177 * | |
| 178 * jeśli wystąpił błąd, zwraca NULL. reszta w errno. | |
| 179 */ | |
| 180 static void *gg_recv_packet(struct gg_session *sess) | |
| 181 { | |
| 182 struct gg_header h; | |
| 183 char *buf = NULL; | |
| 184 int ret = 0, offset, size = 0; | |
| 3630 | 185 int sizeh = sizeof(struct gg_header); |
| 2393 | 186 |
| 187 gg_debug(GG_DEBUG_FUNCTION, "** gg_recv_packet(...);\n"); | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
188 |
| 2393 | 189 if (!sess) { |
| 190 errno = EFAULT; | |
| 191 return NULL; | |
| 192 } | |
| 193 | |
| 194 if (sess->recv_left < 1) { | |
| 3630 | 195 while (ret != sizeh) { |
| 196 ret = read(sess->fd, &h, sizeh); | |
| 197 gg_debug(GG_DEBUG_MISC, "-- header recv(..., %d) = %d\n", sizeh, ret); | |
| 198 if (ret < sizeh) { | |
| 2393 | 199 if (errno != EINTR) { |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
200 gg_debug(GG_DEBUG_MISC, "-- errno = %d (%s)\n", errno, strerror(errno)); |
| 2393 | 201 return NULL; |
| 202 } | |
| 203 } | |
| 204 } | |
| 205 | |
| 206 h.type = fix32(h.type); | |
| 207 h.length = fix32(h.length); | |
| 208 } else { | |
| 3630 | 209 memcpy(&h, sess->recv_buf, sizeh); |
| 2393 | 210 } |
| 211 | |
| 212 /* jakieś sensowne limity na rozmiar pakietu */ | |
| 213 if (h.length < 0 || h.length > 65535) { | |
| 214 gg_debug(GG_DEBUG_MISC, "-- invalid packet length (%d)\n", h.length); | |
| 215 errno = ERANGE; | |
| 216 return NULL; | |
| 217 } | |
| 218 | |
| 219 if (sess->recv_left > 0) { | |
| 220 gg_debug(GG_DEBUG_MISC, "-- resuming last gg_recv_packet()\n"); | |
| 221 size = sess->recv_left; | |
| 222 offset = sess->recv_done; | |
| 223 buf = sess->recv_buf; | |
| 224 } else { | |
| 3630 | 225 if (!(buf = malloc(sizeh + h.length + 1))) { |
| 2393 | 226 gg_debug(GG_DEBUG_MISC, "-- not enough memory\n"); |
| 227 return NULL; | |
| 228 } | |
| 229 | |
| 3630 | 230 memcpy(buf, &h, sizeh); |
| 2393 | 231 |
| 232 offset = 0; | |
| 233 size = h.length; | |
| 234 } | |
| 235 | |
| 236 while (size > 0) { | |
| 3630 | 237 ret = read(sess->fd, buf + sizeh + offset, size); |
| 2393 | 238 gg_debug(GG_DEBUG_MISC, "-- body recv(..., %d) = %d\n", size, ret); |
| 239 if (ret > -1 && ret <= size) { | |
| 240 offset += ret; | |
| 241 size -= ret; | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
242 } else if (ret == -1) { |
| 2393 | 243 gg_debug(GG_DEBUG_MISC, "-- errno = %d (%s)\n", errno, strerror(errno)); |
| 244 if (errno == EAGAIN) { | |
| 245 gg_debug(GG_DEBUG_MISC, "-- %d bytes received, %d left\n", offset, size); | |
| 246 sess->recv_buf = buf; | |
| 247 sess->recv_left = size; | |
| 248 sess->recv_done = offset; | |
| 249 return NULL; | |
| 250 } | |
| 251 if (errno != EINTR) { | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
252 // errno = EINVAL; |
| 2393 | 253 free(buf); |
| 254 return NULL; | |
| 255 } | |
| 256 } | |
| 257 } | |
| 258 | |
| 259 sess->recv_left = 0; | |
| 260 | |
| 261 if ((gg_debug_level & GG_DEBUG_DUMP)) { | |
| 262 int i; | |
| 263 | |
| 264 gg_debug(GG_DEBUG_DUMP, ">> received packet (type=%.2x):", h.type); | |
| 3630 | 265 for (i = 0; i < sizeh + h.length; i++) |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
266 gg_debug(GG_DEBUG_DUMP, " %.2x", (unsigned char) buf[i]); |
| 2393 | 267 gg_debug(GG_DEBUG_DUMP, "\n"); |
| 268 } | |
| 269 | |
| 270 return buf; | |
| 271 } | |
| 272 | |
| 273 /* | |
| 274 * gg_send_packet() // funkcja wewnętrzna | |
| 275 * | |
| 276 * konstruuje pakiet i wysyła go w do serwera. | |
| 277 * | |
| 278 * - sock - połączony socket, | |
| 279 * - type - typ pakietu, | |
| 280 * - packet - wskaźnik do struktury pakietu, | |
| 281 * - length - długość struktury pakietu, | |
| 282 * - payload - dodatkowy tekst doklejany do pakietu (np. wiadomość), | |
| 283 * - payload_length - długość dodatkowego tekstu. | |
| 284 * | |
| 285 * jeśli poszło dobrze, zwraca 0. w przypadku błędu -1. jeśli errno=ENOMEM, | |
| 286 * zabrakło pamięci. inaczej był błąd przy wysyłaniu pakietu. dla errno=0 | |
| 287 * nie wysłano całego pakietu. | |
| 288 */ | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
289 static int gg_send_packet(int sock, int type, void *packet, int length, void *payload, int payload_length) |
| 2393 | 290 { |
| 291 struct gg_header *h; | |
| 292 int res, plen; | |
| 293 char *tmp; | |
| 294 | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
295 gg_debug(GG_DEBUG_FUNCTION, "** gg_send_packet(0x%.2x, %d, %d);\n", type, length, payload_length); |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
296 |
| 2393 | 297 if (length < 0 || payload_length < 0) { |
| 298 gg_debug(GG_DEBUG_MISC, "-- invalid packet/payload length\n"); | |
| 299 errno = ERANGE; | |
| 300 return -1; | |
| 301 } | |
| 302 | |
| 303 if (!(tmp = malloc(sizeof(struct gg_header) + length + payload_length))) { | |
| 304 gg_debug(GG_DEBUG_MISC, "-- not enough memory\n"); | |
| 305 return -1; | |
| 306 } | |
| 307 | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
308 h = (struct gg_header*) tmp; |
| 2393 | 309 h->type = fix32(type); |
| 310 h->length = fix32(length + payload_length); | |
| 311 | |
| 312 if (packet) | |
| 313 memcpy(tmp + sizeof(struct gg_header), packet, length); | |
| 314 if (payload) | |
| 315 memcpy(tmp + sizeof(struct gg_header) + length, payload, payload_length); | |
| 316 | |
| 317 if ((gg_debug_level & GG_DEBUG_DUMP)) { | |
| 318 int i; | |
| 319 | |
| 320 gg_debug(GG_DEBUG_DUMP, "%%%% sending packet (type=%.2x):", fix32(h->type)); | |
| 321 for (i = 0; i < sizeof(struct gg_header) + fix32(h->length); i++) | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
322 gg_debug(GG_DEBUG_DUMP, " %.2x", (unsigned char) tmp[i]); |
| 2393 | 323 gg_debug(GG_DEBUG_DUMP, "\n"); |
| 324 } | |
| 325 | |
| 326 plen = sizeof(struct gg_header) + length + payload_length; | |
| 327 if ((res = write(sock, tmp, plen)) < plen) { | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
328 gg_debug(GG_DEBUG_MISC, "-- write() failed. res = %d, errno = %d (%s)\n", res, errno, strerror(errno)); |
| 2393 | 329 free(tmp); |
| 330 return -1; | |
| 331 } | |
| 332 | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
333 free(tmp); |
| 2393 | 334 return 0; |
| 335 } | |
| 336 | |
| 3630 | 337 #ifndef _WIN32 |
| 2393 | 338 /* |
| 339 * gg_login() | |
| 340 * | |
| 341 * rozpoczyna procedurę łączenia się z serwerem. resztę obsłguje się przez | |
| 342 * gg_watch_event. | |
| 343 * | |
| 344 * - uin - numerek usera, | |
| 345 * - password - jego hasełko, | |
| 346 * - async - ma być asynchronicznie? | |
| 347 * | |
| 348 * UWAGA! program musi obsłużyć SIGCHLD, jeśli łączy się asynchronicznie, | |
| 349 * żeby zrobić pogrzeb zmarłemu procesowi resolvera. | |
| 350 * | |
| 351 * w przypadku błędu zwraca NULL, jeśli idzie dobrze (async) albo poszło | |
| 352 * dobrze (sync), zwróci wskaźnik do zaalokowanej struktury `gg_session'. | |
| 353 */ | |
| 354 struct gg_session *gg_login(uin_t uin, char *password, int async) | |
| 355 { | |
| 356 struct gg_session *sess; | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
357 char *hostname; |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
358 int port; |
| 2393 | 359 |
| 360 gg_debug(GG_DEBUG_FUNCTION, "** gg_login(%u, \"...\", %d);\n", uin, async); | |
| 361 | |
| 362 if (!(sess = malloc(sizeof(*sess)))) | |
| 363 return NULL; | |
| 364 | |
| 365 sess->uin = uin; | |
| 366 if (!(sess->password = strdup(password))) { | |
| 367 free(sess); | |
| 368 return NULL; | |
| 369 } | |
| 370 sess->state = GG_STATE_RESOLVING; | |
| 371 sess->check = GG_CHECK_READ; | |
| 372 sess->async = async; | |
| 373 sess->seq = 0; | |
| 374 sess->recv_left = 0; | |
|
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
375 sess->last_pong = 0; |
|
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
376 sess->server_ip = 0; |
|
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
377 sess->initial_status = 0; |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
378 sess->type = GG_SESSION_GG; |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
379 |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
380 if (gg_http_use_proxy) { |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
381 hostname = gg_http_proxy_host; |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
382 port = gg_http_proxy_port; |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
383 } else { |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
384 hostname = GG_APPMSG_HOST; |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
385 port = GG_APPMSG_PORT; |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
386 }; |
| 2393 | 387 |
| 388 if (async) { | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
389 if (gg_resolve(&sess->fd, &sess->pid, hostname)) { |
| 2393 | 390 gg_debug(GG_DEBUG_MISC, "-- resolving failed\n"); |
| 391 free(sess); | |
| 392 return NULL; | |
| 393 } | |
| 394 } else { | |
| 395 struct in_addr a; | |
| 396 | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
397 if ((a.s_addr = inet_addr(hostname)) == INADDR_NONE) { |
| 2393 | 398 struct hostent *he; |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
399 |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
400 if (!(he = gethostbyname(hostname))) { |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
401 gg_debug(GG_DEBUG_MISC, "-- host %s not found\n", hostname); |
| 2393 | 402 free(sess); |
| 403 return NULL; | |
| 404 } else | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
405 memcpy((char*) &a, he->h_addr, sizeof(a)); |
| 2393 | 406 } |
| 407 | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
408 if (!(sess->fd = gg_connect(&a, port, 0)) == -1) { |
| 2393 | 409 gg_debug(GG_DEBUG_MISC, "-- connection failed\n"); |
| 410 free(sess); | |
| 411 return NULL; | |
| 412 } | |
| 413 | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
414 sess->state = GG_STATE_CONNECTING; |
| 2393 | 415 |
| 416 while (sess->state != GG_STATE_CONNECTED) { | |
| 417 struct gg_event *e; | |
| 418 | |
| 419 if (!(e = gg_watch_fd(sess))) { | |
| 420 gg_debug(GG_DEBUG_MISC, "-- some nasty error in gg_watch_fd()\n"); | |
| 421 free(sess); | |
| 422 return NULL; | |
| 423 } | |
| 424 | |
| 425 if (e->type == GG_EVENT_CONN_FAILED) { | |
|
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
426 errno = EACCES; |
| 2393 | 427 gg_debug(GG_DEBUG_MISC, "-- could not login\n"); |
| 428 gg_free_event(e); | |
| 429 free(sess); | |
| 430 return NULL; | |
| 431 } | |
| 432 | |
| 433 gg_free_event(e); | |
| 434 } | |
| 435 } | |
| 436 | |
| 437 return sess; | |
| 438 } | |
| 3630 | 439 #endif /*!_WIN32*/ |
| 2393 | 440 |
| 441 /* | |
| 442 * gg_free_session() | |
| 443 * | |
| 444 * zwalnia pamięć zajmowaną przez opis sesji. | |
| 445 * | |
| 446 * - sess - opis sesji. | |
| 447 * | |
| 448 * nie zwraca niczego, bo i po co? | |
| 449 */ | |
| 450 void gg_free_session(struct gg_session *sess) | |
| 451 { | |
| 452 if (!sess) | |
| 453 return; | |
| 454 | |
| 455 free(sess->password); | |
| 456 free(sess); | |
| 457 } | |
| 458 | |
| 459 /* | |
| 460 * gg_change_status() | |
| 461 * | |
| 462 * zmienia status użytkownika. przydatne do /away i /busy oraz /quit. | |
| 463 * | |
| 464 * - sess - opis sesji, | |
| 465 * - status - nowy status użytkownika. | |
| 466 * | |
| 467 * jeśli wysłał pakiet zwraca 0, jeśli nie udało się, zwraca -1. | |
| 468 */ | |
| 469 int gg_change_status(struct gg_session *sess, int status) | |
| 470 { | |
| 471 struct gg_new_status p; | |
| 472 | |
| 473 if (!sess) { | |
| 474 errno = EFAULT; | |
| 475 return -1; | |
| 476 } | |
| 477 | |
| 478 if (sess->state != GG_STATE_CONNECTED) { | |
| 479 errno = ENOTCONN; | |
| 480 return -1; | |
| 481 } | |
| 482 | |
| 483 gg_debug(GG_DEBUG_FUNCTION, "** gg_change_status(..., %d);\n", status); | |
| 484 | |
| 485 p.status = fix32(status); | |
| 486 | |
| 487 return gg_send_packet(sess->fd, GG_NEW_STATUS, &p, sizeof(p), NULL, 0); | |
| 488 } | |
| 489 | |
| 490 /* | |
| 491 * gg_logoff() | |
| 492 * | |
| 493 * wylogowuje użytkownika i zamyka połączenie. | |
| 494 * | |
| 495 * - sock - deskryptor socketu. | |
| 496 * | |
| 497 * nie zwraca błędów. skoro się żegnamy, to olewamy wszystko. | |
| 498 */ | |
| 499 void gg_logoff(struct gg_session *sess) | |
| 500 { | |
| 501 if (!sess) | |
| 502 return; | |
| 503 | |
| 504 gg_debug(GG_DEBUG_FUNCTION, "** gg_logoff(...);\n"); | |
| 505 | |
| 506 if (sess->state == GG_STATE_CONNECTED) | |
| 507 gg_change_status(sess, GG_STATUS_NOT_AVAIL); | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
508 |
| 2393 | 509 if (sess->fd) { |
| 510 shutdown(sess->fd, 2); | |
| 511 close(sess->fd); | |
| 512 } | |
| 513 } | |
| 514 | |
| 515 /* | |
| 516 * gg_send_message() | |
| 517 * | |
| 518 * wysyła wiadomość do innego użytkownika. zwraca losowy numer | |
| 519 * sekwencyjny, który można olać albo wykorzystać do potwierdzenia. | |
| 520 * | |
| 521 * - sess - opis sesji, | |
| 522 * - msgclass - rodzaj wiadomości, | |
| 523 * - recipient - numer adresata, | |
| 524 * - message - treść wiadomości. | |
| 525 * | |
| 526 * w przypadku błędu zwraca -1, inaczej numer sekwencyjny. | |
| 527 */ | |
| 528 int gg_send_message(struct gg_session *sess, int msgclass, uin_t recipient, unsigned char *message) | |
| 529 { | |
| 530 struct gg_send_msg s; | |
| 531 | |
| 532 if (!sess) { | |
| 533 errno = EFAULT; | |
| 534 return -1; | |
| 535 } | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
536 |
| 2393 | 537 if (sess->state != GG_STATE_CONNECTED) { |
| 538 errno = ENOTCONN; | |
| 539 return -1; | |
| 540 } | |
| 541 | |
| 542 gg_debug(GG_DEBUG_FUNCTION, "** gg_send_message(..., %d, %u, \"...\");\n", msgclass, recipient); | |
| 543 | |
| 544 s.recipient = fix32(recipient); | |
| 545 if (!sess->seq) | |
| 546 sess->seq = 0x01740000 | (rand() & 0xffff); | |
| 547 s.seq = fix32(sess->seq); | |
| 548 s.msgclass = fix32(msgclass); | |
| 549 sess->seq += (rand() % 0x300) + 0x300; | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
550 |
| 2393 | 551 if (gg_send_packet(sess->fd, GG_SEND_MSG, &s, sizeof(s), message, strlen(message) + 1) == -1) |
| 552 return -1; | |
| 553 | |
| 554 return fix32(s.seq); | |
| 555 } | |
| 556 | |
| 557 /* | |
| 558 * gg_ping() | |
| 559 * | |
| 560 * wysyła do serwera pakiet typu yeah-i'm-still-alive. | |
| 561 * | |
| 562 * - sess - zgadnij. | |
| 563 * | |
| 564 * jeśli nie powiodło się wysłanie pakietu, zwraca -1. otherwise 0. | |
| 565 */ | |
| 566 int gg_ping(struct gg_session *sess) | |
| 567 { | |
| 568 if (!sess) { | |
| 569 errno = EFAULT; | |
| 570 return -1; | |
| 571 } | |
| 572 | |
| 573 if (sess->state != GG_STATE_CONNECTED) { | |
| 574 errno = ENOTCONN; | |
| 575 return -1; | |
| 576 } | |
| 577 | |
| 578 gg_debug(GG_DEBUG_FUNCTION, "** gg_ping(...);\n"); | |
| 3630 | 579 |
| 580 if(ping_outstanding) { | |
| 581 debug_printf("Trying to send ping, when we havn't been ponged on last ping\n"); | |
| 582 return 1; | |
| 583 } | |
| 584 else { | |
| 585 ping_outstanding = 1; | |
| 586 return gg_send_packet(sess->fd, GG_PING, NULL, 0, NULL, 0); | |
| 587 } | |
| 2393 | 588 } |
| 589 | |
| 590 /* | |
| 591 * gg_free_event() | |
| 592 * | |
| 593 * zwalnia pamięć zajmowaną przez informację o zdarzeniu | |
| 594 * | |
| 595 * - event - wskaźnik do informacji o zdarzeniu | |
| 596 * | |
| 597 * nie ma czego zwracać. | |
| 598 */ | |
| 599 void gg_free_event(struct gg_event *e) | |
| 600 { | |
| 601 if (!e) | |
| 602 return; | |
| 603 if (e->type == GG_EVENT_MSG) | |
| 604 free(e->event.msg.message); | |
| 605 if (e->type == GG_EVENT_NOTIFY) | |
| 606 free(e->event.notify); | |
| 607 free(e); | |
| 608 } | |
| 609 | |
| 610 /* | |
| 611 * gg_notify() | |
| 612 * | |
| 613 * wysyła serwerowi listę ludków, za którymi tęsknimy. | |
| 614 * | |
| 615 * - sess - identyfikator sesji, | |
| 616 * - userlist - wskaźnik do tablicy numerów, | |
| 617 * - count - ilość numerków. | |
| 618 * | |
| 619 * jeśli udało się, zwraca 0. jeśli błąd, dostajemy -1. | |
| 620 */ | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
621 int gg_notify(struct gg_session *sess, uin_t *userlist, int count) |
| 2393 | 622 { |
| 623 struct gg_notify *n; | |
| 624 uin_t *u; | |
| 625 int i, res = 0; | |
| 626 | |
| 627 if (!sess) { | |
| 628 errno = EFAULT; | |
| 629 return -1; | |
| 630 } | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
631 |
| 2393 | 632 if (sess->state != GG_STATE_CONNECTED) { |
| 633 errno = ENOTCONN; | |
| 634 return -1; | |
| 635 } | |
| 636 | |
| 637 gg_debug(GG_DEBUG_FUNCTION, "** gg_notify(..., %d);\n", count); | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
638 |
| 2393 | 639 if (!userlist || !count) |
| 640 return 0; | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
641 |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
642 if (!(n = (struct gg_notify*) malloc(sizeof(*n) * count))) |
| 2393 | 643 return -1; |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
644 |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
645 for (u = userlist, i = 0; i < count; u++, i++) { |
| 2393 | 646 n[i].uin = fix32(*u); |
| 647 n[i].dunno1 = 3; | |
| 648 } | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
649 |
| 2393 | 650 if (gg_send_packet(sess->fd, GG_NOTIFY, n, sizeof(*n) * count, NULL, 0) == -1) |
| 651 res = -1; | |
| 652 | |
| 653 free(n); | |
| 654 | |
| 655 return res; | |
| 656 } | |
| 657 | |
| 658 /* | |
| 659 * gg_add_notify() | |
| 660 * | |
| 661 * dodaje w locie do listy ukochanych dany numerek. | |
| 662 * | |
| 663 * - sess - identyfikator sesji, | |
| 664 * - uin - numerek ukochanej. | |
| 665 * | |
| 666 * jeśli udało się wysłać, daje 0. inaczej -1. | |
| 667 */ | |
| 668 int gg_add_notify(struct gg_session *sess, uin_t uin) | |
| 669 { | |
| 670 struct gg_add_remove a; | |
| 671 | |
| 672 if (!sess) { | |
| 673 errno = EFAULT; | |
| 674 return -1; | |
| 675 } | |
| 676 | |
| 677 if (sess->state != GG_STATE_CONNECTED) { | |
| 678 errno = ENOTCONN; | |
| 679 return -1; | |
| 680 } | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
681 |
| 2393 | 682 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
|
683 |
| 2393 | 684 a.uin = fix32(uin); |
| 685 a.dunno1 = 3; | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
686 |
| 2393 | 687 return gg_send_packet(sess->fd, GG_ADD_NOTIFY, &a, sizeof(a), NULL, 0); |
| 688 } | |
| 689 | |
| 690 /* | |
| 691 * gg_remove_notify() | |
| 692 * | |
| 693 * w locie usuwa z listy zainteresowanych. | |
| 694 * | |
| 695 * - sess - id sesji, | |
| 696 * - uin - numerek. | |
| 697 * | |
| 698 * zwraca -1 jeśli był błąd, 0 jeśli się udało wysłać pakiet. | |
| 699 */ | |
| 700 int gg_remove_notify(struct gg_session *sess, uin_t uin) | |
| 701 { | |
| 702 struct gg_add_remove a; | |
| 703 | |
| 704 if (!sess) { | |
| 705 errno = EFAULT; | |
| 706 return -1; | |
| 707 } | |
| 708 | |
| 709 if (sess->state != GG_STATE_CONNECTED) { | |
| 710 errno = ENOTCONN; | |
| 711 return -1; | |
| 712 } | |
| 713 | |
| 714 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
|
715 |
| 2393 | 716 a.uin = fix32(uin); |
| 717 a.dunno1 = 3; | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
718 |
| 2393 | 719 return gg_send_packet(sess->fd, GG_REMOVE_NOTIFY, &a, sizeof(a), NULL, 0); |
| 720 } | |
| 721 | |
| 722 /* | |
| 723 * gg_watch_fd_connected() // funkcja wewnętrzna | |
| 724 * | |
| 725 * patrzy na socketa, odbiera pakiet i wypełnia strukturę zdarzenia. | |
| 726 * | |
| 727 * - sock - lalala, trudno zgadnąć. | |
| 728 * | |
| 729 * jeśli błąd -1, jeśli dobrze 0. | |
| 730 */ | |
| 731 static int gg_watch_fd_connected(struct gg_session *sess, struct gg_event *e) | |
| 732 { | |
| 733 struct gg_header *h; | |
| 734 void *p; | |
| 735 | |
| 736 if (!sess) { | |
| 737 errno = EFAULT; | |
| 738 return -1; | |
| 739 } | |
| 740 | |
| 741 gg_debug(GG_DEBUG_FUNCTION, "** gg_watch_fd_connected(...);\n"); | |
| 742 | |
| 743 if (!(h = gg_recv_packet(sess))) { | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
744 gg_debug(GG_DEBUG_MISC, "-- gg_recv_packet failed. errno = %d (%d)\n", errno, strerror(errno)); |
| 2393 | 745 return -1; |
| 746 } | |
| 747 | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
748 p = (void*) h + sizeof(struct gg_header); |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
749 |
| 2393 | 750 if (h->type == GG_RECV_MSG) { |
| 751 struct gg_recv_msg *r = p; | |
| 752 | |
| 753 gg_debug(GG_DEBUG_MISC, "-- received a message\n"); | |
| 754 | |
| 755 if (h->length >= sizeof(*r)) { | |
| 756 e->type = GG_EVENT_MSG; | |
| 757 e->event.msg.msgclass = fix32(r->msgclass); | |
| 758 e->event.msg.sender = fix32(r->sender); | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
759 e->event.msg.message = strdup((char*) r + sizeof(*r)); |
|
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
760 e->event.msg.time = fix32(r->time); |
| 2393 | 761 } |
| 762 } | |
| 763 | |
| 764 if (h->type == GG_NOTIFY_REPLY) { | |
| 765 struct gg_notify_reply *n = p; | |
|
2399
b2926d21f067
[gaim-migrate @ 2412]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2393
diff
changeset
|
766 int count, i; |
| 2393 | 767 |
| 768 gg_debug(GG_DEBUG_MISC, "-- received a notify reply\n"); | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
769 |
| 2393 | 770 e->type = GG_EVENT_NOTIFY; |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
771 if (!(e->event.notify = (void*) malloc(h->length + 2 * sizeof(*n)))) { |
| 2393 | 772 gg_debug(GG_DEBUG_MISC, "-- not enough memory\n"); |
| 773 free(h); | |
| 774 return -1; | |
| 775 } | |
|
2399
b2926d21f067
[gaim-migrate @ 2412]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2393
diff
changeset
|
776 count = h->length / sizeof(*n); |
| 2393 | 777 memcpy(e->event.notify, p, h->length); |
|
2399
b2926d21f067
[gaim-migrate @ 2412]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2393
diff
changeset
|
778 e->event.notify[count].uin = 0; |
|
b2926d21f067
[gaim-migrate @ 2412]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2393
diff
changeset
|
779 for (i = 0; i < count; i++) { |
|
b2926d21f067
[gaim-migrate @ 2412]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2393
diff
changeset
|
780 e->event.notify[i].uin = fix32(e->event.notify[i].uin); |
|
b2926d21f067
[gaim-migrate @ 2412]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2393
diff
changeset
|
781 e->event.notify[i].status = fix32(e->event.notify[i].status); |
|
b2926d21f067
[gaim-migrate @ 2412]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2393
diff
changeset
|
782 } |
| 2393 | 783 } |
| 784 | |
| 785 if (h->type == GG_STATUS) { | |
| 786 struct gg_status *s = p; | |
| 787 | |
| 788 gg_debug(GG_DEBUG_MISC, "-- received a status change\n"); | |
| 789 | |
| 790 if (h->length >= sizeof(*s)) { | |
| 791 e->type = GG_EVENT_STATUS; | |
| 792 memcpy(&e->event.status, p, h->length); | |
|
2399
b2926d21f067
[gaim-migrate @ 2412]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2393
diff
changeset
|
793 e->event.status.uin = fix32(e->event.status.uin); |
|
b2926d21f067
[gaim-migrate @ 2412]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2393
diff
changeset
|
794 e->event.status.status = fix32(e->event.status.status); |
| 2393 | 795 } |
| 796 } | |
| 797 | |
| 798 if (h->type == GG_SEND_MSG_ACK) { | |
| 799 struct gg_send_msg_ack *s = p; | |
| 800 | |
| 801 gg_debug(GG_DEBUG_MISC, "-- received a message ack\n"); | |
| 802 | |
| 803 if (h->length >= sizeof(*s)) { | |
| 804 e->type = GG_EVENT_ACK; | |
| 805 e->event.ack.status = fix32(s->status); | |
| 806 e->event.ack.recipient = fix32(s->recipient); | |
| 807 e->event.ack.seq = fix32(s->seq); | |
| 808 } | |
| 809 } | |
| 810 | |
|
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
811 if (h->type == GG_PONG) { |
|
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
812 gg_debug(GG_DEBUG_MISC, "-- received a pong\n"); |
| 3630 | 813 ping_outstanding = 0; |
|
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
814 sess->last_pong = time(NULL); |
|
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
815 } |
|
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
816 |
| 2393 | 817 free(h); |
| 818 | |
| 819 return 0; | |
| 820 } | |
| 821 | |
| 822 /* | |
| 823 * gg_watch_fd() | |
| 824 * | |
| 825 * funkcja wywoływana, gdy coś się stanie na obserwowanym deskryptorze. | |
| 826 * zwraca klientowi informację o tym, co się dzieje. | |
| 827 * | |
| 828 * - sess - identyfikator sesji. | |
| 829 * | |
| 830 * zwraca wskaźnik do struktury gg_event, którą trzeba zwolnić później | |
| 831 * za pomocą gg_free_event(). jesli rodzaj zdarzenia jest równy | |
| 832 * GG_EVENT_NONE, należy je olać kompletnie. jeśli zwróciło NULL, | |
| 833 * stało się coś niedobrego -- albo brakło pamięci albo zerwało | |
| 834 * połączenie albo coś takiego. | |
| 835 */ | |
| 836 struct gg_event *gg_watch_fd(struct gg_session *sess) | |
| 837 { | |
| 838 struct gg_event *e; | |
| 839 int res = 0; | |
| 3630 | 840 #ifndef _WIN32 |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
841 int port; |
| 3630 | 842 #endif |
| 2393 | 843 |
| 844 if (!sess) { | |
| 845 errno = EFAULT; | |
| 846 return NULL; | |
| 847 } | |
| 848 | |
| 849 gg_debug(GG_DEBUG_FUNCTION, "** gg_watch_fd(...);\n"); | |
| 850 | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
851 if (!(e = (void*) malloc(sizeof(*e)))) { |
| 2393 | 852 gg_debug(GG_DEBUG_MISC, "-- not enough memory\n"); |
| 853 return NULL; | |
| 854 } | |
| 855 | |
| 856 e->type = GG_EVENT_NONE; | |
| 857 | |
| 858 switch (sess->state) { | |
| 3630 | 859 #ifndef _WIN32 |
| 860 /* Apparantly we will never be in this state as long as we are | |
| 861 using proxy_connect instead of gg_login - Herman */ | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
862 case GG_STATE_RESOLVING: |
| 2393 | 863 { |
| 864 struct in_addr a; | |
| 865 | |
| 866 gg_debug(GG_DEBUG_MISC, "== GG_STATE_RESOLVING\n"); | |
| 867 | |
| 868 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
|
869 gg_debug(GG_DEBUG_MISC, "-- resolving failed\n"); |
| 2393 | 870 |
|
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
871 errno = ENOENT; |
| 2393 | 872 e->type = GG_EVENT_CONN_FAILED; |
| 873 e->event.failure = GG_FAILURE_RESOLVING; | |
| 874 sess->state = GG_STATE_IDLE; | |
| 875 | |
| 876 close(sess->fd); | |
| 877 | |
| 878 break; | |
| 879 } | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
880 |
|
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
881 sess->server_ip = a.s_addr; |
|
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
882 |
| 2393 | 883 close(sess->fd); |
| 884 | |
| 885 waitpid(sess->pid, NULL, 0); | |
| 886 | |
| 887 gg_debug(GG_DEBUG_MISC, "-- resolved, now connecting\n"); | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
888 |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
889 if (gg_http_use_proxy) { |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
890 port = gg_http_proxy_port; |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
891 } else { |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
892 port = GG_APPMSG_PORT; |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
893 }; |
| 2393 | 894 |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
895 if ((sess->fd = gg_connect(&a, port, sess->async)) == -1) { |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
896 struct in_addr *addr = (struct in_addr*) &sess->server_ip; |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
897 |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
898 gg_debug(GG_DEBUG_MISC, "-- connection failed, trying direct connection\n"); |
| 2393 | 899 |
|
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
900 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
|
901 gg_debug(GG_DEBUG_MISC, "-- connection failed, trying https connection\n"); |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
902 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
|
903 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
|
904 |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
905 e->type = GG_EVENT_CONN_FAILED; |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
906 e->event.failure = GG_FAILURE_CONNECTING; |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
907 sess->state = GG_STATE_IDLE; |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
908 break; |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
909 } |
|
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
910 } |
|
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
911 sess->state = GG_STATE_CONNECTING_GG; |
|
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
912 sess->check = GG_CHECK_WRITE; |
|
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
913 } else { |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
914 sess->state = GG_STATE_CONNECTING; |
|
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
915 sess->check = GG_CHECK_WRITE; |
| 2393 | 916 } |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
917 |
| 2393 | 918 break; |
| 919 } | |
| 3630 | 920 #endif /* !_WIN32 */ |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
921 case GG_STATE_CONNECTING: |
| 2393 | 922 { |
| 923 char buf[1024]; | |
| 924 int res, res_size = sizeof(res); | |
| 925 | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
926 gg_debug(GG_DEBUG_MISC, "== GG_STATE_CONNECTING\n"); |
| 2393 | 927 |
|
3717
988485669631
[gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
3630
diff
changeset
|
928 if (sess->async && (getsockopt(sess->fd, SOL_SOCKET, SO_ERROR, &res, &res_size) || res)) { |
| 3630 | 929 #if 0 |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
930 struct in_addr *addr = (struct in_addr*) &sess->server_ip; |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
931 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
|
932 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
|
933 gg_debug(GG_DEBUG_MISC, "-- connection failed, trying https connection\n"); |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
934 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
|
935 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
|
936 |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
937 e->type = GG_EVENT_CONN_FAILED; |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
938 e->event.failure = GG_FAILURE_CONNECTING; |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
939 sess->state = GG_STATE_IDLE; |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
940 break; |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
941 } |
|
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
942 } |
|
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
943 |
|
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
944 sess->state = GG_STATE_CONNECTING_GG; |
|
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
945 sess->check = GG_CHECK_WRITE; |
| 3630 | 946 #else |
| 947 gg_debug(GG_DEBUG_MISC, "-- http connection failed, errno = %d\n", res); | |
| 948 e->type = GG_EVENT_CONN_FAILED; | |
| 949 e->event.failure = GG_FAILURE_CONNECTING; | |
| 950 sess->state = GG_STATE_IDLE; | |
| 951 #endif | |
| 2393 | 952 break; |
| 953 } | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
954 |
| 2393 | 955 gg_debug(GG_DEBUG_MISC, "-- http connection succeded, sending query\n"); |
| 956 | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
957 if (gg_http_use_proxy) { |
| 3630 | 958 g_snprintf(buf, sizeof(buf) - 1, |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
959 "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
|
960 "Host: " GG_APPMSG_HOST "\r\n" |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
961 "User-Agent: " GG_HTTP_USERAGENT "\r\n" |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
962 "Pragma: no-cache\r\n" |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
963 "\r\n", sess->uin); |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
964 } else { |
| 3630 | 965 g_snprintf(buf, sizeof(buf) - 1, |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
966 "GET /appsvc/appmsg.asp?fmnumber=%lu HTTP/1.0\r\n" |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
967 "Host: " GG_APPMSG_HOST "\r\n" |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
968 "User-Agent: " GG_HTTP_USERAGENT "\r\n" |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
969 "Pragma: no-cache\r\n" |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
970 "\r\n", sess->uin); |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
971 }; |
| 2393 | 972 |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
973 gg_debug(GG_DEBUG_MISC, "=> -----BEGIN-HTTP-QUERY-----\n%s\n=> -----END-HTTP-QUERY-----\n", buf); |
| 2393 | 974 if (write(sess->fd, buf, strlen(buf)) < strlen(buf)) { |
| 975 gg_debug(GG_DEBUG_MISC, "-- sending query failed\n"); | |
|
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
976 errno = EIO; |
| 2393 | 977 e->type = GG_EVENT_CONN_FAILED; |
| 978 e->event.failure = GG_FAILURE_WRITING; | |
| 979 sess->state = GG_STATE_IDLE; | |
| 980 break; | |
| 981 } | |
| 982 | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
983 sess->state = GG_STATE_READING_DATA; |
| 2393 | 984 sess->check = GG_CHECK_READ; |
| 985 | |
| 986 break; | |
| 987 } | |
| 988 | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
989 case GG_STATE_READING_DATA: |
| 2393 | 990 { |
| 991 char buf[1024], *tmp, *host; | |
| 992 int port = GG_DEFAULT_PORT; | |
| 993 struct in_addr a; | |
| 994 | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
995 gg_debug(GG_DEBUG_MISC, "== GG_STATE_READING_DATA\n"); |
| 2393 | 996 |
| 997 gg_read_line(sess->fd, buf, sizeof(buf) - 1); | |
| 998 gg_chomp(buf); | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
999 |
| 2393 | 1000 gg_debug(GG_DEBUG_TRAFFIC, "-- got http response (%s)\n", buf); |
| 1001 if (strncmp(buf, "HTTP/1.", 7) || strncmp(buf + 9, "200", 3)) { | |
| 1002 gg_debug(GG_DEBUG_MISC, "-- but that's not what we've expected\n"); | |
| 1003 | |
|
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
1004 errno = EINVAL; |
| 2393 | 1005 e->type = GG_EVENT_CONN_FAILED; |
| 1006 e->event.failure = GG_FAILURE_INVALID; | |
| 1007 sess->state = GG_STATE_IDLE; | |
| 1008 break; | |
| 1009 } | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1010 |
| 2393 | 1011 while (strcmp(buf, "\r\n") && strcmp(buf, "")) |
| 1012 gg_read_line(sess->fd, buf, sizeof(buf) - 1); | |
| 1013 | |
| 1014 gg_read_line(sess->fd, buf, sizeof(buf) - 1); | |
| 1015 gg_chomp(buf); | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1016 |
| 2393 | 1017 close(sess->fd); |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1018 |
| 2393 | 1019 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
|
1020 |
| 2393 | 1021 tmp = buf; |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1022 |
| 2393 | 1023 while (*tmp && *tmp != ' ') |
| 1024 tmp++; | |
| 1025 while (*tmp && *tmp == ' ') | |
| 1026 tmp++; | |
| 1027 while (*tmp && *tmp != ' ') | |
| 1028 tmp++; | |
| 1029 while (*tmp && *tmp == ' ') | |
| 1030 tmp++; | |
| 1031 while (*tmp && *tmp != ' ') | |
| 1032 tmp++; | |
| 1033 while (*tmp && *tmp == ' ') | |
| 1034 tmp++; | |
| 1035 host = tmp; | |
| 1036 while (*tmp && *tmp != ' ') | |
| 1037 tmp++; | |
| 1038 *tmp = 0; | |
| 1039 | |
| 1040 if ((tmp = strchr(host, ':'))) { | |
| 1041 *tmp = 0; | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1042 port = atoi(tmp+1); |
| 2393 | 1043 } |
| 1044 | |
| 1045 a.s_addr = inet_addr(host); | |
|
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
1046 sess->server_ip = a.s_addr; |
| 3630 | 1047 #if 0 |
| 1048 /* We need to watch this non-blocking socket so lets use proxy_connect | |
| 1049 in gg.c - Herman */ | |
| 1050 if((sess->fd = gg_connect(&a, port, sess->assync)) == -1) { | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1051 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
|
1052 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
|
1053 gg_debug(GG_DEBUG_MISC, "-- connection failed, errno = %d (%s)\n", errno, strerror(errno)); |
| 2393 | 1054 |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1055 e->type = GG_EVENT_CONN_FAILED; |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1056 e->event.failure = GG_FAILURE_CONNECTING; |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1057 sess->state = GG_STATE_IDLE; |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1058 break; |
|
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
1059 } |
| 2393 | 1060 } |
| 3630 | 1061 #else |
| 1062 sess->port = port; | |
| 1063 #endif | |
| 2393 | 1064 sess->state = GG_STATE_CONNECTING_GG; |
| 1065 sess->check = GG_CHECK_WRITE; | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1066 |
| 2393 | 1067 break; |
| 1068 } | |
| 1069 | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1070 case GG_STATE_CONNECTING_GG: |
| 2393 | 1071 { |
| 1072 int res, res_size = sizeof(res); | |
| 1073 | |
| 1074 gg_debug(GG_DEBUG_MISC, "== GG_STATE_CONNECTING_GG\n"); | |
| 1075 | |
|
3717
988485669631
[gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
3630
diff
changeset
|
1076 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
|
1077 struct in_addr *addr = (struct in_addr*) &sess->server_ip; |
| 2393 | 1078 |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1079 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
|
1080 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
|
1081 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
|
1082 |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1083 e->type = GG_EVENT_CONN_FAILED; |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1084 e->event.failure = GG_FAILURE_CONNECTING; |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1085 sess->state = GG_STATE_IDLE; |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1086 break; |
|
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
1087 } |
| 2393 | 1088 } |
| 1089 | |
| 1090 gg_debug(GG_DEBUG_MISC, "-- connected\n"); | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1091 |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1092 sess->state = GG_STATE_READING_KEY; |
| 2393 | 1093 sess->check = GG_CHECK_READ; |
| 1094 | |
| 1095 break; | |
| 1096 } | |
| 1097 | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1098 case GG_STATE_READING_KEY: |
| 2393 | 1099 { |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1100 struct gg_header *h; |
| 2393 | 1101 struct gg_welcome *w; |
| 1102 struct gg_login l; | |
| 1103 unsigned int hash; | |
| 1104 char *password = sess->password; | |
| 1105 | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1106 gg_debug(GG_DEBUG_MISC, "== GG_STATE_READING_KEY\n"); |
| 2393 | 1107 |
| 1108 if (!(h = gg_recv_packet(sess))) { | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1109 gg_debug(GG_DEBUG_MISC, "-- gg_recv_packet() failed. errno = %d (%s)\n", errno, strerror(errno)); |
| 2393 | 1110 e->type = GG_EVENT_CONN_FAILED; |
| 1111 e->event.failure = GG_FAILURE_READING; | |
| 1112 sess->state = GG_STATE_IDLE; | |
| 1113 close(sess->fd); | |
| 1114 break; | |
| 1115 } | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1116 |
| 2393 | 1117 if (h->type != GG_WELCOME) { |
| 1118 gg_debug(GG_DEBUG_MISC, "-- invalid packet received\n"); | |
| 1119 | |
| 1120 free(h); | |
| 1121 close(sess->fd); | |
|
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
1122 errno = EINVAL; |
| 2393 | 1123 e->type = GG_EVENT_CONN_FAILED; |
| 1124 e->event.failure = GG_FAILURE_INVALID; | |
| 1125 sess->state = GG_STATE_IDLE; | |
| 1126 break; | |
| 1127 } | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1128 |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1129 w = (void*) h + sizeof(struct gg_header); |
| 2393 | 1130 w->key = fix32(w->key); |
| 1131 | |
| 1132 for (hash = 1; *password; password++) | |
| 1133 hash *= (*password) + 1; | |
| 1134 hash *= w->key; | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1135 |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1136 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
|
1137 |
| 2393 | 1138 free(h); |
| 1139 | |
| 1140 free(sess->password); | |
| 1141 sess->password = NULL; | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1142 |
| 2393 | 1143 l.uin = fix32(sess->uin); |
| 1144 l.hash = fix32(hash); | |
|
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
1145 l.status = fix32(sess->initial_status ? sess->initial_status : GG_STATUS_AVAIL); |
| 2393 | 1146 l.dunno = fix32(0x0b); |
| 1147 l.local_ip = 0; | |
| 1148 l.local_port = 0; | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1149 |
| 2393 | 1150 gg_debug(GG_DEBUG_TRAFFIC, "-- sending GG_LOGIN packet\n"); |
| 1151 | |
| 1152 if (gg_send_packet(sess->fd, GG_LOGIN, &l, sizeof(l), NULL, 0) == -1) { | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1153 gg_debug(GG_DEBUG_TRAFFIC, "-- oops, failed. errno = %d (%s)\n", errno, strerror(errno)); |
| 2393 | 1154 |
| 1155 close(sess->fd); | |
| 1156 e->type = GG_EVENT_CONN_FAILED; | |
| 1157 e->event.failure = GG_FAILURE_WRITING; | |
| 1158 sess->state = GG_STATE_IDLE; | |
| 1159 break; | |
| 1160 } | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1161 |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1162 sess->state = GG_STATE_READING_REPLY; |
| 2393 | 1163 |
| 1164 break; | |
| 1165 } | |
| 1166 | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1167 case GG_STATE_READING_REPLY: |
| 2393 | 1168 { |
| 1169 struct gg_header *h; | |
| 1170 | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1171 gg_debug(GG_DEBUG_MISC, "== GG_STATE_READING_REPLY\n"); |
| 2393 | 1172 |
| 1173 if (!(h = gg_recv_packet(sess))) { | |
| 1174 gg_debug(GG_DEBUG_MISC, "-- recv_packet failed\n"); | |
| 1175 e->type = GG_EVENT_CONN_FAILED; | |
| 1176 e->event.failure = GG_FAILURE_READING; | |
| 1177 sess->state = GG_STATE_IDLE; | |
| 1178 close(sess->fd); | |
| 1179 break; | |
| 1180 } | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1181 |
| 2393 | 1182 if (h->type == GG_LOGIN_OK) { |
| 1183 gg_debug(GG_DEBUG_MISC, "-- login succeded\n"); | |
| 1184 e->type = GG_EVENT_CONN_SUCCESS; | |
| 1185 sess->state = GG_STATE_CONNECTED; | |
|
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
1186 free(h); |
| 2393 | 1187 break; |
| 1188 } | |
| 1189 | |
| 1190 if (h->type == GG_LOGIN_FAILED) { | |
| 1191 gg_debug(GG_DEBUG_MISC, "-- login failed\n"); | |
| 1192 e->event.failure = GG_FAILURE_PASSWORD; | |
| 1193 errno = EACCES; | |
| 1194 } else { | |
| 1195 gg_debug(GG_DEBUG_MISC, "-- invalid packet\n"); | |
| 1196 e->event.failure = GG_FAILURE_INVALID; | |
|
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
1197 errno = EINVAL; |
| 2393 | 1198 } |
| 1199 | |
| 1200 e->type = GG_EVENT_CONN_FAILED; | |
| 1201 sess->state = GG_STATE_IDLE; | |
| 1202 close(sess->fd); | |
|
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2595
diff
changeset
|
1203 free(h); |
| 2393 | 1204 |
| 1205 break; | |
| 1206 } | |
| 1207 | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1208 case GG_STATE_CONNECTED: |
| 2393 | 1209 { |
| 1210 gg_debug(GG_DEBUG_MISC, "== GG_STATE_CONNECTED\n"); | |
| 1211 | |
| 1212 if ((res = gg_watch_fd_connected(sess, e)) == -1) { | |
| 1213 | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1214 gg_debug(GG_DEBUG_MISC, "-- watch_fd_connected failed. errno = %d (%s)\n", errno, strerror(errno)); |
| 2393 | 1215 |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1216 if (errno == EAGAIN) { |
| 2393 | 1217 e->type = GG_EVENT_NONE; |
| 1218 res = 0; | |
| 1219 } else | |
| 1220 res = -1; | |
| 1221 } | |
| 1222 break; | |
| 1223 } | |
| 1224 } | |
| 1225 | |
| 1226 if (res == -1) { | |
| 1227 free(e); | |
| 1228 e = NULL; | |
| 1229 } | |
| 1230 | |
| 1231 return e; | |
| 1232 } | |
|
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1233 |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1234 /* |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1235 * Local variables: |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1236 * c-indentation-style: k&r |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1237 * c-basic-offset: 8 |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1238 * indent-tabs-mode: notnil |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1239 * End: |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1240 * |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1241 * vim: shiftwidth=8: |
|
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
1242 */ |
