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