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