annotate src/protocols/oscar/rxqueue.c @ 7806:c86f075b269a

[gaim-migrate @ 8453] I modified some of the libfaim connection stuff. I dunno, it seems cleaner this way. I like to be comfortable with what's going on. It's possible that FT and DC won't work now (although, they should), but I'll get to making them suck less pretty soon. Also upgraded the Doxyfile to 1 version newer. It mostly just moved some things around, but also removed the CGI_BLEH lines from the end. committer: Tailor Script <tailor@pidgin.im>
author Mark Doliner <mark@kingant.net>
date Mon, 08 Dec 2003 05:41:04 +0000
parents 04dc7fe68889
children 92cbf9713795
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1 /*
3952
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 2931
diff changeset
2 * rxqueue.c
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
3 *
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
4 * This file contains the management routines for the receive
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
5 * (incoming packet) queue. The actual packet handlers are in
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
6 * aim_rxhandlers.c.
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
7 */
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
8
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
9 #define FAIM_INTERNAL
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
10 #include <aim.h>
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
11
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
12 #ifndef _WIN32
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
13 #include <sys/socket.h>
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
14 #endif
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
15
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
16 /*
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
17 *
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
18 */
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
19 faim_internal int aim_recv(int fd, void *buf, size_t count)
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
20 {
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
21 int left, cur;
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
22
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
23 for (cur = 0, left = count; left; ) {
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
24 int ret;
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
25
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
26 ret = recv(fd, ((unsigned char *)buf)+cur, left, 0);
2808
e79f30457998 [gaim-migrate @ 2821]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2706
diff changeset
27
e79f30457998 [gaim-migrate @ 2821]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2706
diff changeset
28 /* Of course EOF is an error, only morons disagree with that. */
e79f30457998 [gaim-migrate @ 2821]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2706
diff changeset
29 if (ret <= 0)
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
30 return -1;
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
31
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
32 cur += ret;
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
33 left -= ret;
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
34 }
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
35
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
36 return cur;
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
37 }
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
38
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
39 /*
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
40 * Read into a byte stream. Will not read more than count, but may read
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
41 * less if there is not enough room in the stream buffer.
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
42 */
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
43 faim_internal int aim_bstream_recv(aim_bstream_t *bs, int fd, size_t count)
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
44 {
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
45 int red = 0;
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
46
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
47 if (!bs || (fd < 0) || (count < 0))
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
48 return -1;
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
49
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
50 if (count > (bs->len - bs->offset))
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
51 count = bs->len - bs->offset; /* truncate to remaining space */
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
52
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
53 if (count) {
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
54
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
55 red = aim_recv(fd, bs->data + bs->offset, count);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
56
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
57 if (red <= 0)
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
58 return -1;
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
59 }
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
60
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
61 bs->offset += red;
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
62
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
63 return red;
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
64 }
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
65
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
66 /**
7806
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
67 * Free an aim_frame_t
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
68 *
7806
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
69 * @param frame The frame to free.
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
70 * @return -1 on error; 0 on success.
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
71 */
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
72 faim_internal void aim_frame_destroy(aim_frame_t *frame)
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
73 {
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
74
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
75 free(frame->data.data); /* XXX aim_bstream_free */
3952
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 2931
diff changeset
76 free(frame);
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
77
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
78 return;
3952
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 2931
diff changeset
79 }
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
80
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
81 /*
7806
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
82 * Read a FLAP header from conn into fr, and return the number of
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
83 * bytes in the payload.
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
84 *
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
85 * @return -1 on error, otherwise return the length of the payload.
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
86 */
5414
2d9f7d2e3558 [gaim-migrate @ 5790]
Mark Doliner <mark@kingant.net>
parents: 4617
diff changeset
87 static int aim_get_command_flap(aim_session_t *sess, aim_conn_t *conn, aim_frame_t *fr)
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
88 {
7806
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
89 fu8_t hdr_raw[6];
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
90 aim_bstream_t hdr;
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
91
7806
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
92 fr->hdrtype = AIM_FRAMETYPE_FLAP;
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
93
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
94 /*
7806
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
95 * Read FLAP header. Six bytes total.
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
96 *
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
97 * Byte # | Description
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
98 * -------|-------------
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
99 * 0x00 | Always 0x2a
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
100 * 0x01 | Channel number, usually "2." "1" is used during login,
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
101 * | 4 is used during logoff.
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
102 * 0x02 | Sequence number, 2 bytes.
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
103 * 0x04 | Number of data bytes that follow, 2 bytes.
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
104 */
7806
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
105 aim_bstream_init(&hdr, hdr_raw, sizeof(hdr_raw));
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
106 if (aim_bstream_recv(&hdr, conn->fd, 6) < 6) {
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
107 aim_conn_close(conn);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
108 return -1;
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
109 }
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
110
7806
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
111 aim_bstream_rewind(&hdr);
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
112
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
113 /*
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
114 * This shouldn't happen unless the socket breaks, the server breaks,
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
115 * or we break. We must handle it just in case.
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
116 */
7806
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
117 if (aimbs_get8(&hdr) != 0x2a) {
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
118 faimdprintf(sess, 0, "Invalid FLAP frame received on FLAP connection!");
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
119 aim_conn_close(conn);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
120 return -1;
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
121 }
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
122
7806
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
123 fr->hdr.flap.channel = aimbs_get8(&hdr);
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
124 fr->hdr.flap.seqnum = aimbs_get16(&hdr);
3952
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 2931
diff changeset
125
7806
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
126 return aimbs_get16(&hdr);
3952
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 2931
diff changeset
127 }
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 2931
diff changeset
128
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 2931
diff changeset
129 /*
7806
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
130 * Read a rendezvous header from conn into fr, and return the number of
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
131 * bytes in the payload.
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
132 *
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
133 * @return -1 on error, otherwise return the length of the payload.
3952
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 2931
diff changeset
134 */
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 2931
diff changeset
135 static int aim_get_command_rendezvous(aim_session_t *sess, aim_conn_t *conn, aim_frame_t *fr)
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 2931
diff changeset
136 {
7806
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
137 fu8_t hdr_raw[8];
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
138 aim_bstream_t hdr;
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
139
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
140 fr->hdrtype = AIM_FRAMETYPE_OFT;
3952
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 2931
diff changeset
141
7806
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
142 /*
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
143 * Read rendezvous header
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
144 */
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
145 aim_bstream_init(&hdr, hdr_raw, sizeof(hdr_raw));
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
146 if (aim_bstream_recv(&hdr, conn->fd, 8) < 8) {
3952
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 2931
diff changeset
147 aim_conn_close(conn);
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
148 return -1;
3952
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 2931
diff changeset
149 }
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 2931
diff changeset
150
7806
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
151 aim_bstream_rewind(&hdr);
3952
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 2931
diff changeset
152
7806
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
153 aimbs_getrawbuf(&hdr, fr->hdr.rend.magic, 4);
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
154 fr->hdr.rend.hdrlen = aimbs_get16(&hdr);
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
155 fr->hdr.rend.type = aimbs_get16(&hdr);
3952
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 2931
diff changeset
156
7806
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
157 return fr->hdr.rend.hdrlen - 8;
3952
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 2931
diff changeset
158 }
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
159
3952
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 2931
diff changeset
160 /*
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 2931
diff changeset
161 * Grab a single command sequence off the socket, and enqueue it in the incoming event queue
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 2931
diff changeset
162 * in a separate struct.
7806
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
163 *
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
164 * @return 0 on success, otherwise return the error number.
3952
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 2931
diff changeset
165 */
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 2931
diff changeset
166 faim_export int aim_get_command(aim_session_t *sess, aim_conn_t *conn)
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 2931
diff changeset
167 {
7806
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
168 aim_frame_t *fr;
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
169 int payloadlen;
3952
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 2931
diff changeset
170
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 2931
diff changeset
171 if (!sess || !conn)
4617
858979ab3867 [gaim-migrate @ 4908]
Mark Doliner <mark@kingant.net>
parents: 3960
diff changeset
172 return -EINVAL;
3952
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 2931
diff changeset
173
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 2931
diff changeset
174 if (conn->fd == -1)
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 2931
diff changeset
175 return -1; /* it's an aim_conn_close()'d connection */
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 2931
diff changeset
176
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 2931
diff changeset
177 if (conn->fd < 3) /* can happen when people abuse the interface */
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 2931
diff changeset
178 return -1;
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 2931
diff changeset
179
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 2931
diff changeset
180 if (conn->status & AIM_CONN_STATUS_INPROGRESS)
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 2931
diff changeset
181 return aim_conn_completeconnect(sess, conn);
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 2931
diff changeset
182
7806
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
183 if (!(fr = (aim_frame_t *)calloc(sizeof(aim_frame_t), 1)))
4617
858979ab3867 [gaim-migrate @ 4908]
Mark Doliner <mark@kingant.net>
parents: 3960
diff changeset
184 return -ENOMEM;
3952
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 2931
diff changeset
185
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 2931
diff changeset
186 /*
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 2931
diff changeset
187 * Rendezvous (client to client) connections do not speak FLAP, so this
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 2931
diff changeset
188 * function will break on them.
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 2931
diff changeset
189 */
7806
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
190 if (conn->type == AIM_CONN_TYPE_RENDEZVOUS)
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
191 payloadlen = aim_get_command_rendezvous(sess, conn, fr);
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
192 else if (conn->type == AIM_CONN_TYPE_LISTENER) {
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
193 faimdprintf(sess, 0, "AIM_CONN_TYPE_LISTENER on fd %d\n", conn->fd);
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
194 free(fr);
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
195 return -1;
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
196 } else
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
197 payloadlen = aim_get_command_flap(sess, conn, fr);
5927
04dc7fe68889 [gaim-migrate @ 6367]
Mark Doliner <mark@kingant.net>
parents: 5414
diff changeset
198
7806
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
199 if (payloadlen < 0) {
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
200 free(fr);
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
201 return -1;
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
202 }
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
203
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
204 if (payloadlen > 0) {
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
205 fu8_t *payload = NULL;
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
206
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
207 if (!(payload = (fu8_t *) malloc(payloadlen))) {
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
208 aim_frame_destroy(fr);
5927
04dc7fe68889 [gaim-migrate @ 6367]
Mark Doliner <mark@kingant.net>
parents: 5414
diff changeset
209 return -1;
04dc7fe68889 [gaim-migrate @ 6367]
Mark Doliner <mark@kingant.net>
parents: 5414
diff changeset
210 }
04dc7fe68889 [gaim-migrate @ 6367]
Mark Doliner <mark@kingant.net>
parents: 5414
diff changeset
211
7806
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
212 aim_bstream_init(&fr->data, payload, payloadlen);
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
213
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
214 /* read the payload */
7806
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
215 if (aim_bstream_recv(&fr->data, conn->fd, payloadlen) < payloadlen) {
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
216 aim_frame_destroy(fr); /* free's payload */
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
217 aim_conn_close(conn);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
218 return -1;
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
219 }
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
220 } else
7806
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
221 aim_bstream_init(&fr->data, NULL, 0);
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
222
7806
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
223 aim_bstream_rewind(&fr->data);
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
224
7806
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
225 fr->conn = conn;
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
226
7806
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
227 /* Enqueue this puppy */
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
228 fr->next = NULL; /* this will always be at the bottom */
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
229 if (sess->queue_incoming == NULL)
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
230 sess->queue_incoming = fr;
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
231 else {
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
232 aim_frame_t *cur;
7806
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
233 for (cur = sess->queue_incoming; cur->next; cur = cur->next);
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
234 cur->next = fr;
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
235 }
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
236
7806
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
237 fr->conn->lastactivity = time(NULL);
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
238
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
239 return 0;
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
240 }
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
241
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
242 /*
7806
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
243 * Purge recieve queue of all handled commands (->handled==1).
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
244 *
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
245 */
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
246 faim_export void aim_purge_rxqueue(aim_session_t *sess)
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
247 {
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
248 aim_frame_t *cur, **prev;
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
249
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
250 for (prev = &sess->queue_incoming; (cur = *prev); ) {
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
251 if (cur->handled) {
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
252 *prev = cur->next;
7806
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
253 aim_frame_destroy(cur);
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
254 } else
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
255 prev = &cur->next;
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
256 }
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
257
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
258 return;
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
259 }
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
260
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
261 /*
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
262 * Since aim_get_command will aim_conn_kill dead connections, we need
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
263 * to clean up the rxqueue of unprocessed connections on that socket.
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
264 *
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
265 * XXX: this is something that was handled better in the old connection
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
266 * handling method, but eh.
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
267 */
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
268 faim_internal void aim_rxqueue_cleanbyconn(aim_session_t *sess, aim_conn_t *conn)
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
269 {
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
270 aim_frame_t *currx;
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
271
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
272 for (currx = sess->queue_incoming; currx; currx = currx->next) {
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
273 if ((!currx->handled) && (currx->conn == conn))
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
274 currx->handled = 1;
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
275 }
7806
c86f075b269a [gaim-migrate @ 8453]
Mark Doliner <mark@kingant.net>
parents: 5927
diff changeset
276
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2086
diff changeset
277 return;
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
278 }