src/protocols/oscar/rxqueue.c

Tue, 13 Jan 2004 05:44:37 +0000

author
Mark Doliner <markdoliner@pidgin.im>
date
Tue, 13 Jan 2004 05:44:37 +0000
changeset 8092
ba92ce841814
parent 7806
072628543b7d
child 8735
01248ea222d3
permissions
-rw-r--r--

[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
007508451e2c [gaim-migrate @ 2096]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
1 /*
3952
d13e1fde68d8 [gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents: 2931
diff changeset
2 * rxqueue.c
2086
007508451e2c [gaim-migrate @ 2096]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
3 *
007508451e2c [gaim-migrate @ 2096]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
4 * This file contains the management routines for the receive
007508451e2c [gaim-migrate @ 2096]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
5 * (incoming packet) queue. The actual packet handlers are in
007508451e2c [gaim-migrate @ 2096]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
6 * aim_rxhandlers.c.
007508451e2c [gaim-migrate @ 2096]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
7 */
007508451e2c [gaim-migrate @ 2096]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
8
007508451e2c [gaim-migrate @ 2096]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
9 #define FAIM_INTERNAL
007508451e2c [gaim-migrate @ 2096]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
10 #include <aim.h>
007508451e2c [gaim-migrate @ 2096]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
11
007508451e2c [gaim-migrate @ 2096]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
12 #ifndef _WIN32
007508451e2c [gaim-migrate @ 2096]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
13 #include <sys/socket.h>
007508451e2c [gaim-migrate @ 2096]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
14 #endif
007508451e2c [gaim-migrate @ 2096]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
15
007508451e2c [gaim-migrate @ 2096]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
16 /*
007508451e2c [gaim-migrate @ 2096]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
17 *
007508451e2c [gaim-migrate @ 2096]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
18 */
007508451e2c [gaim-migrate @ 2096]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
19 faim_internal int aim_recv(int fd, void *buf, size_t count)
007508451e2c [gaim-migrate @ 2096]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
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
007508451e2c [gaim-migrate @ 2096]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
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
007508451e2c [gaim-migrate @ 2096]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
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
007508451e2c [gaim-migrate @ 2096]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
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
007508451e2c [gaim-migrate @ 2096]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
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
007508451e2c [gaim-migrate @ 2096]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
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
007508451e2c [gaim-migrate @ 2096]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
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
007508451e2c [gaim-migrate @ 2096]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
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
f83c9f4afb60 [gaim-migrate @ 6367]
Ryan McCabe
parents: 5414
diff changeset
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
f83c9f4afb60 [gaim-migrate @ 6367]
Ryan McCabe
parents: 5414
diff changeset
209 return -1;
f83c9f4afb60 [gaim-migrate @ 6367]
Ryan McCabe
parents: 5414
diff changeset
210 }
f83c9f4afb60 [gaim-migrate @ 6367]
Ryan McCabe
parents: 5414
diff changeset
211
7806
072628543b7d [gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents: 5927
diff changeset
212 aim_bstream_init(&fr->data, payload, payloadlen);
2086
007508451e2c [gaim-migrate @ 2096]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
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
007508451e2c [gaim-migrate @ 2096]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
222
7806
072628543b7d [gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents: 5927
diff changeset
223 aim_bstream_rewind(&fr->data);
2086
007508451e2c [gaim-migrate @ 2096]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
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
007508451e2c [gaim-migrate @ 2096]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
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
007508451e2c [gaim-migrate @ 2096]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
240 }
007508451e2c [gaim-migrate @ 2096]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
241
007508451e2c [gaim-migrate @ 2096]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
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
007508451e2c [gaim-migrate @ 2096]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
244 *
007508451e2c [gaim-migrate @ 2096]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
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
007508451e2c [gaim-migrate @ 2096]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
247 {
2246
8ade8b7421af [gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2086
diff changeset
248 aim_frame_t *cur, **prev;
2086
007508451e2c [gaim-migrate @ 2096]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
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
007508451e2c [gaim-migrate @ 2096]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
257
2246
8ade8b7421af [gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2086
diff changeset
258 return;
2086
007508451e2c [gaim-migrate @ 2096]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
259 }
007508451e2c [gaim-migrate @ 2096]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
260
007508451e2c [gaim-migrate @ 2096]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
261 /*
007508451e2c [gaim-migrate @ 2096]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
262 * Since aim_get_command will aim_conn_kill dead connections, we need
007508451e2c [gaim-migrate @ 2096]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
263 * to clean up the rxqueue of unprocessed connections on that socket.
007508451e2c [gaim-migrate @ 2096]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
264 *
007508451e2c [gaim-migrate @ 2096]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
265 * XXX: this is something that was handled better in the old connection
007508451e2c [gaim-migrate @ 2096]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
266 * handling method, but eh.
007508451e2c [gaim-migrate @ 2096]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
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
007508451e2c [gaim-migrate @ 2096]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
269 {
2246
8ade8b7421af [gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2086
diff changeset
270 aim_frame_t *currx;
2086
007508451e2c [gaim-migrate @ 2096]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
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
007508451e2c [gaim-migrate @ 2096]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
278 }

mercurial