Thu, 17 Apr 2003 05:34:16 +0000
[gaim-migrate @ 5513]
Hmm.
So I couldn't really find out what was wrong with lround, so I just wrote
a function in oscar.c to round to the nearest integer from a double and
return an int. My man page for lround says it's in math.h, and it
compiled fine, and it ran fine, but it gave me a function undeclared
warning or whatever for lround, which made me unhappy. I tried including
math.h and tgmath.h to no avail.
If anyone wants to find out what's up with that, or just tell me about
some new and trendy round function, please be a doll and do so.
Until then, this is ace reporter Mark "The Spark Plug" Doliner, signing
off.
| 2086 | 1 | /* |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
2 | * Oscar File transfer (OFT) and Oscar Direct Connect (ODC). |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
3 | * (ODC is also referred to as DirectIM and IM Image.) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
4 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
5 | * There are a few static helper functions at the top, then |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
6 | * ODC stuff, then ft stuff. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
7 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
8 | * I feel like this is a good place to explain OFT, so I'm going to |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
9 | * do just that. Each OFT packet has a header type. I guess this |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
10 | * is pretty similar to the subtype of a SNAC packet. The type |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
11 | * basically tells the other client the meaning of the OFT packet. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
12 | * There are two distinct types of file transfer, which I usually |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
13 | * call "sendfile" and "getfile." Sendfile is when you send a file |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
14 | * to another AIM user. Getfile is when you share a group of files, |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
15 | * and other users request that you send them the files. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
16 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
17 | * A typical sendfile file transfer goes like this: |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
18 | * 1) Sender sends a channel 2 ICBM telling the other user that |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
19 | * we want to send them a file. At the same time, we open a |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
20 | * listener socket (this should be done before sending the |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
21 | * ICBM) on some port, and wait for them to connect to us. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
22 | * The ICBM we sent should contain our IP address and the port |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
23 | * number that we're listening on. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
24 | * 2) The receiver connects to the sender on the given IP address |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
25 | * and port. After the connection is established, the receiver |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
26 | * sends an ICBM signifying that we are ready and waiting. |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
27 | * 3) The sender sends an OFT PROMPT message over the OFT |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
28 | * connection. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
29 | * 4) The receiver of the file sends back an exact copy of this |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
30 | * OFT packet, except the cookie is filled in with the cookie |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
31 | * from the ICBM. I think this might be an attempt to verify |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
32 | * that the user that is connected is actually the guy that |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
33 | * we sent the ICBM to. Oh, I've been calling this the ACK. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
34 | * 5) The sender starts sending raw data across the connection |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
35 | * until the entire file has been sent. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
36 | * 6) The receiver knows the file is finished because the sender |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
37 | * sent the file size in an earlier OFT packet. So then the |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
38 | * receiver sends the DONE thingy (after filling in the |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
39 | * "received" checksum and size) and closes the connection. |
| 2086 | 40 | */ |
| 41 | ||
| 42 | #define FAIM_INTERNAL | |
| 2931 | 43 | |
|
2711
48250db2892e
[gaim-migrate @ 2724]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2675
diff
changeset
|
44 | #ifdef HAVE_CONFIG_H |
|
48250db2892e
[gaim-migrate @ 2724]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2675
diff
changeset
|
45 | #include <config.h> |
|
48250db2892e
[gaim-migrate @ 2724]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2675
diff
changeset
|
46 | #endif |
| 2086 | 47 | #include <aim.h> |
| 48 | ||
| 49 | #ifndef _WIN32 | |
| 50 | #include <netdb.h> | |
| 51 | #include <sys/socket.h> | |
| 52 | #include <netinet/in.h> | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
53 | #include <sys/utsname.h> /* for aim_odc_initiate */ |
| 3630 | 54 | #include <arpa/inet.h> /* for inet_ntoa */ |
|
3960
462a9dbc934a
[gaim-migrate @ 4142]
Mark Doliner <markdoliner@pidgin.im>
parents:
3953
diff
changeset
|
55 | #define G_DIR_SEPARATOR '/' |
|
3646
ebf17642064a
[gaim-migrate @ 3770]
Herman Bloggs <herman@bluedigits.com>
parents:
3630
diff
changeset
|
56 | #endif |
|
ebf17642064a
[gaim-migrate @ 3770]
Herman Bloggs <herman@bluedigits.com>
parents:
3630
diff
changeset
|
57 | |
|
ebf17642064a
[gaim-migrate @ 3770]
Herman Bloggs <herman@bluedigits.com>
parents:
3630
diff
changeset
|
58 | #ifdef _WIN32 |
| 3630 | 59 | #include "win32dep.h" |
| 60 | #endif | |
| 2086 | 61 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
62 | struct aim_odc_intdata { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
63 | fu8_t cookie[8]; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
64 | char sn[MAXSNLEN+1]; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
65 | char ip[22]; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
66 | }; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
67 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
68 | /** |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
69 | * Convert the directory separator from / (0x2f) to ^A (0x01) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
70 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
71 | * @param name The filename to convert. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
72 | */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
73 | static void aim_oft_dirconvert_tostupid(char *name) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
74 | { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
75 | while (name[0]) { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
76 | if (name[0] == 0x01) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
77 | name[0] = G_DIR_SEPARATOR; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
78 | name++; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
79 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
80 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
81 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
82 | /** |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
83 | * Convert the directory separator from ^A (0x01) to / (0x2f) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
84 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
85 | * @param name The filename to convert. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
86 | */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
87 | static void aim_oft_dirconvert_fromstupid(char *name) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
88 | { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
89 | while (name[0]) { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
90 | if (name[0] == G_DIR_SEPARATOR) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
91 | name[0] = 0x01; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
92 | name++; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
93 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
94 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
95 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
96 | /** |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
97 | * Calculate oft checksum of buffer |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
98 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
99 | * Prevcheck should be 0xFFFF0000 when starting a checksum of a file. The |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
100 | * checksum is kind of a rolling checksum thing, so each time you get bytes |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
101 | * of a file you just call this puppy and it updates the checksum. You can |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
102 | * calculate the checksum of an entire file by calling this in a while or a |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
103 | * for loop, or something. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
104 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
105 | * Thanks to Graham Booker for providing this improved checksum routine, |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
106 | * which is simpler and should be more accurate than Josh Myer's original |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
107 | * code. -- wtm |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
108 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
109 | * This algorithim works every time I have tried it. The other fails |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
110 | * sometimes. So, AOL who thought this up? It has got to be the weirdest |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
111 | * checksum I have ever seen. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
112 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
113 | * @param buffer Buffer of data to checksum. Man I'd like to buff her... |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
114 | * @param bufsize Size of buffer. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
115 | * @param prevcheck Previous checksum. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
116 | */ |
|
4763
7313e8049f0e
[gaim-migrate @ 5081]
Mark Doliner <markdoliner@pidgin.im>
parents:
4650
diff
changeset
|
117 | faim_export fu32_t aim_oft_checksum_chunk(const fu8_t *buffer, int bufferlen, fu32_t prevcheck) |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
118 | { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
119 | fu32_t check = (prevcheck >> 16) & 0xffff, oldcheck; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
120 | int i; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
121 | unsigned short val; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
122 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
123 | for (i=0; i<bufferlen; i++) { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
124 | oldcheck = check; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
125 | if (i&1) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
126 | val = buffer[i]; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
127 | else |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
128 | val = buffer[i] << 8; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
129 | check -= val; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
130 | /* |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
131 | * The following appears to be necessary.... It happens |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
132 | * every once in a while and the checksum doesn't fail. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
133 | */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
134 | if (check > oldcheck) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
135 | check--; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
136 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
137 | check = ((check & 0x0000ffff) + (check >> 16)); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
138 | check = ((check & 0x0000ffff) + (check >> 16)); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
139 | return check << 16; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
140 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
141 | |
|
4650
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
142 | faim_export fu32_t aim_oft_checksum_file(char *filename) { |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
143 | FILE *fd; |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
144 | fu32_t checksum = 0xffff0000; |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
145 | |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
146 | if ((fd = fopen(filename, "rb"))) { |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
147 | int bytes; |
|
4763
7313e8049f0e
[gaim-migrate @ 5081]
Mark Doliner <markdoliner@pidgin.im>
parents:
4650
diff
changeset
|
148 | fu8_t buffer[1024]; |
|
4650
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
149 | |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
150 | while ((bytes = fread(buffer, 1, 1024, fd))) |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
151 | checksum = aim_oft_checksum_chunk(buffer, bytes, checksum); |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
152 | fclose(fd); |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
153 | } |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
154 | |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
155 | return checksum; |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
156 | } |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
157 | |
| 2086 | 158 | /** |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
159 | * Create a listening socket on a given port. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
160 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
161 | * XXX - Give the client author the responsibility of setting up a |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
162 | * listener, then we no longer have a libfaim problem with broken |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
163 | * solaris *innocent smile* -- jbm |
| 2086 | 164 | * |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
165 | * @param portnum The port number to bind to. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
166 | * @return The file descriptor of the listening socket. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
167 | */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
168 | static int listenestablish(fu16_t portnum) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
169 | { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
170 | #if HAVE_GETADDRINFO |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
171 | int listenfd; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
172 | const int on = 1; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
173 | struct addrinfo hints, *res, *ressave; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
174 | char serv[5]; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
175 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
176 | snprintf(serv, sizeof(serv), "%d", portnum); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
177 | memset(&hints, 0, sizeof(struct addrinfo)); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
178 | hints.ai_flags = AI_PASSIVE; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
179 | hints.ai_family = AF_UNSPEC; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
180 | hints.ai_socktype = SOCK_STREAM; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
181 | if (getaddrinfo(NULL /* any IP */, serv, &hints, &res) != 0) { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
182 | perror("getaddrinfo"); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
183 | return -1; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
184 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
185 | ressave = res; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
186 | do { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
187 | listenfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
188 | if (listenfd < 0) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
189 | continue; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
190 | setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
191 | if (bind(listenfd, res->ai_addr, res->ai_addrlen) == 0) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
192 | break; /* success */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
193 | close(listenfd); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
194 | } while ( (res = res->ai_next) ); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
195 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
196 | if (!res) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
197 | return -1; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
198 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
199 | freeaddrinfo(ressave); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
200 | #else |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
201 | int listenfd; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
202 | const int on = 1; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
203 | struct sockaddr_in sockin; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
204 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
205 | if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
206 | perror("socket"); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
207 | return -1; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
208 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
209 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
210 | if (setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)) != 0) { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
211 | perror("setsockopt"); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
212 | close(listenfd); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
213 | return -1; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
214 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
215 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
216 | memset(&sockin, 0, sizeof(struct sockaddr_in)); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
217 | sockin.sin_family = AF_INET; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
218 | sockin.sin_port = htons(portnum); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
219 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
220 | if (bind(listenfd, (struct sockaddr *)&sockin, sizeof(struct sockaddr_in)) != 0) { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
221 | perror("bind"); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
222 | close(listenfd); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
223 | return -1; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
224 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
225 | #endif |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
226 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
227 | if (listen(listenfd, 4) != 0) { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
228 | perror("listen"); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
229 | close(listenfd); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
230 | return -1; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
231 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
232 | fcntl(listenfd, F_SETFL, O_NONBLOCK); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
233 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
234 | return listenfd; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
235 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
236 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
237 | /** |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
238 | * After establishing a listening socket, this is called to accept a connection. It |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
239 | * clones the conn used by the listener, and passes both of these to a signal handler. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
240 | * The signal handler should close the listener conn and keep track of the new conn, |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
241 | * since this is what is used for file transfers and what not. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
242 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
243 | * @param sess The session. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
244 | * @param cur The conn the incoming connection is on. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
245 | * @return Return 0 if no errors, otherwise return the error number. |
| 2086 | 246 | */ |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
247 | faim_export int aim_handlerendconnect(aim_session_t *sess, aim_conn_t *cur) |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
248 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
249 | int acceptfd = 0; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
250 | struct sockaddr addr; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
251 | socklen_t addrlen = sizeof(addr); |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
252 | int ret = 0; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
253 | aim_conn_t *newconn; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
254 | char ip[20]; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
255 | int port; |
| 2086 | 256 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
257 | if ((acceptfd = accept(cur->fd, &addr, &addrlen)) == -1) |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
258 | return 0; /* not an error */ |
| 2086 | 259 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
260 | if (addr.sa_family != AF_INET) { /* just in case IPv6 really is happening */ |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
261 | close(acceptfd); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
262 | aim_conn_close(cur); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
263 | return -1; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
264 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
265 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
266 | strncpy(ip, inet_ntoa(((struct sockaddr_in *)&addr)->sin_addr), sizeof(ip)); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
267 | port = ntohs(((struct sockaddr_in *)&addr)->sin_port); |
| 2086 | 268 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
269 | if (!(newconn = aim_cloneconn(sess, cur))) { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
270 | close(acceptfd); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
271 | aim_conn_close(cur); |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
272 | return -ENOMEM; |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
273 | } |
| 2086 | 274 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
275 | newconn->type = AIM_CONN_TYPE_RENDEZVOUS; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
276 | newconn->fd = acceptfd; |
| 2086 | 277 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
278 | if (newconn->subtype == AIM_CONN_SUBTYPE_OFT_DIRECTIM) { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
279 | aim_rxcallback_t userfunc; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
280 | struct aim_odc_intdata *priv; |
| 2086 | 281 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
282 | priv = (struct aim_odc_intdata *)(newconn->internal = cur->internal); |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
283 | cur->internal = NULL; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
284 | snprintf(priv->ip, sizeof(priv->ip), "%s:%u", ip, port); |
| 2086 | 285 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
286 | if ((userfunc = aim_callhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIM_ESTABLISHED))) |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
287 | ret = userfunc(sess, NULL, newconn, cur); |
| 2086 | 288 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
289 | } else if (newconn->subtype == AIM_CONN_SUBTYPE_OFT_GETFILE) { |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
290 | } else if (newconn->subtype == AIM_CONN_SUBTYPE_OFT_SENDFILE) { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
291 | aim_rxcallback_t userfunc; |
| 2086 | 292 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
293 | if ((userfunc = aim_callhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_ESTABLISHED))) |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
294 | ret = userfunc(sess, NULL, newconn, cur); |
| 3630 | 295 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
296 | } else { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
297 | faimdprintf(sess, 1,"Got a connection on a listener that's not rendezvous. Closing connection.\n"); |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
298 | aim_conn_close(newconn); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
299 | ret = -1; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
300 | } |
| 2086 | 301 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
302 | return ret; |
| 2086 | 303 | } |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
304 | |
| 2086 | 305 | /** |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
306 | * Send client-to-client typing notification over an established direct connection. |
| 2086 | 307 | * |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
308 | * @param sess The session. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
309 | * @param conn The already-connected ODC connection. |
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
310 | * @param typing If 0x0002, sends a "typing" message, 0x0001 sends "typed," and |
|
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
311 | * 0x0000 sends "stopped." |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
312 | * @return Return 0 if no errors, otherwise return the error number. |
| 2086 | 313 | */ |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
314 | faim_export int aim_odc_send_typing(aim_session_t *sess, aim_conn_t *conn, int typing) |
| 2086 | 315 | { |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
316 | struct aim_odc_intdata *intdata = (struct aim_odc_intdata *)conn->internal; |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
317 | aim_frame_t *fr; |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
318 | aim_bstream_t *hdrbs; |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
319 | fu8_t *hdr; |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
320 | int hdrlen = 0x44; |
| 2086 | 321 | |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
322 | if (!sess || !conn || (conn->type != AIM_CONN_TYPE_RENDEZVOUS)) |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
323 | return -EINVAL; |
| 2086 | 324 | |
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
325 | if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_OFT, 0x0001, 0))) |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
326 | return -ENOMEM; |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
327 | memcpy(fr->hdr.rend.magic, "ODC2", 4); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
328 | fr->hdr.rend.hdrlen = hdrlen; |
| 2086 | 329 | |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
330 | if (!(hdr = calloc(1, hdrlen))) { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
331 | aim_frame_destroy(fr); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
332 | return -ENOMEM; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
333 | } |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
334 | |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
335 | hdrbs = &(fr->data); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
336 | aim_bstream_init(hdrbs, hdr, hdrlen); |
| 2086 | 337 | |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
338 | aimbs_put16(hdrbs, 0x0006); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
339 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
340 | aimbs_putraw(hdrbs, intdata->cookie, 8); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
341 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
342 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
343 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
344 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
345 | aimbs_put32(hdrbs, 0x00000000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
346 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
347 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
348 | aimbs_put16(hdrbs, 0x0000); |
| 2086 | 349 | |
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
350 | if (typing == 0x0002) |
|
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
351 | aimbs_put16(hdrbs, 0x0002 | 0x0008); |
|
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
352 | else if (typing == 0x0001) |
|
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
353 | aimbs_put16(hdrbs, 0x0002 | 0x0004); |
|
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
354 | else |
|
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
355 | aimbs_put16(hdrbs, 0x0002); |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
356 | |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
357 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
358 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
359 | aimbs_putraw(hdrbs, sess->sn, strlen(sess->sn)); |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
360 | |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
361 | aim_bstream_setpos(hdrbs, 52); /* bleeehh */ |
| 2086 | 362 | |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
363 | aimbs_put8(hdrbs, 0x00); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
364 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
365 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
366 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
367 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
368 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
369 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
370 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
371 | aimbs_put8(hdrbs, 0x00); |
| 2086 | 372 | |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
373 | /* end of hdr */ |
| 2086 | 374 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
375 | aim_tx_enqueue(sess, fr); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
376 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
377 | return 0; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
378 | } |
| 2086 | 379 | |
| 2993 | 380 | /** |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
381 | * Send client-to-client IM over an established direct connection. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
382 | * Call this just like you would aim_send_im, to send a directim. |
| 2993 | 383 | * |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
384 | * @param sess The session. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
385 | * @param conn The already-connected ODC connection. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
386 | * @param msg Null-terminated string to send. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
387 | * @param len The length of the message to send, including binary data. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
388 | * @param encoding 0 for ascii, 2 for Unicode, 3 for ISO 8859-1. |
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
389 | * @param isawaymsg 0 if this is not an auto-response, 1 if it is. |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
390 | * @return Return 0 if no errors, otherwise return the error number. |
| 2993 | 391 | */ |
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
392 | faim_export int aim_odc_send_im(aim_session_t *sess, aim_conn_t *conn, const char *msg, int len, int encoding, int isawaymsg) |
| 2993 | 393 | { |
| 394 | aim_frame_t *fr; | |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
395 | aim_bstream_t *hdrbs; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
396 | struct aim_odc_intdata *intdata = (struct aim_odc_intdata *)conn->internal; |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
397 | int hdrlen = 0x44; |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
398 | fu8_t *hdr; |
| 2993 | 399 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
400 | if (!sess || !conn || (conn->type != AIM_CONN_TYPE_RENDEZVOUS) || !msg) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
401 | return -EINVAL; |
| 2993 | 402 | |
|
4875
3aefead7212b
[gaim-migrate @ 5205]
Mark Doliner <markdoliner@pidgin.im>
parents:
4870
diff
changeset
|
403 | if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_OFT, 0x01, 0))) |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
404 | return -ENOMEM; |
| 2993 | 405 | |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
406 | memcpy(fr->hdr.rend.magic, "ODC2", 4); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
407 | fr->hdr.rend.hdrlen = hdrlen; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
408 | |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
409 | if (!(hdr = calloc(1, hdrlen + len))) { |
| 2993 | 410 | aim_frame_destroy(fr); |
| 411 | return -ENOMEM; | |
| 412 | } | |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
413 | |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
414 | hdrbs = &(fr->data); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
415 | aim_bstream_init(hdrbs, hdr, hdrlen + len); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
416 | |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
417 | aimbs_put16(hdrbs, 0x0006); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
418 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
419 | aimbs_putraw(hdrbs, intdata->cookie, 8); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
420 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
421 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
422 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
423 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
424 | aimbs_put32(hdrbs, len); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
425 | aimbs_put16(hdrbs, encoding); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
426 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
427 | aimbs_put16(hdrbs, 0x0000); |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
428 | |
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
429 | /* flags - used for typing notification and to mark if this is an away message */ |
|
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
430 | aimbs_put16(hdrbs, 0x0000 | isawaymsg); |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
431 | |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
432 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
433 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
434 | aimbs_putraw(hdrbs, sess->sn, strlen(sess->sn)); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
435 | |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
436 | aim_bstream_setpos(hdrbs, 52); /* bleeehh */ |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
437 | |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
438 | aimbs_put8(hdrbs, 0x00); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
439 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
440 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
441 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
442 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
443 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
444 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
445 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
446 | aimbs_put8(hdrbs, 0x00); |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
447 | |
| 2993 | 448 | /* end of hdr2 */ |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
449 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
450 | #if 0 /* XXX - this is how you send buddy icon info... */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
451 | aimbs_put16(hdrbs, 0x0008); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
452 | aimbs_put16(hdrbs, 0x000c); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
453 | aimbs_put16(hdrbs, 0x0000); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
454 | aimbs_put16(hdrbs, 0x1466); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
455 | aimbs_put16(hdrbs, 0x0001); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
456 | aimbs_put16(hdrbs, 0x2e0f); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
457 | aimbs_put16(hdrbs, 0x393e); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
458 | aimbs_put16(hdrbs, 0xcac8); |
| 2993 | 459 | #endif |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
460 | aimbs_putraw(hdrbs, msg, len); |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
461 | |
| 2993 | 462 | aim_tx_enqueue(sess, fr); |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
463 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
464 | return 0; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
465 | } |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
466 | |
| 2086 | 467 | /** |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
468 | * Get the screen name of the peer of a direct connection. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
469 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
470 | * @param conn The ODC connection. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
471 | * @return The screen name of the dude, or NULL if there was an anomaly. |
| 2086 | 472 | */ |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
473 | faim_export const char *aim_odc_getsn(aim_conn_t *conn) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
474 | { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
475 | struct aim_odc_intdata *intdata; |
| 3630 | 476 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
477 | if (!conn || !conn->internal) |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
478 | return NULL; |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
479 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
480 | if ((conn->type != AIM_CONN_TYPE_RENDEZVOUS) || |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
481 | (conn->subtype != AIM_CONN_SUBTYPE_OFT_DIRECTIM)) |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
482 | return NULL; |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
483 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
484 | intdata = (struct aim_odc_intdata *)conn->internal; |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
485 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
486 | return intdata->sn; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
487 | } |
| 2086 | 488 | |
| 489 | /** | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
490 | * Find the conn of a direct connection with the given buddy. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
491 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
492 | * @param sess The session. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
493 | * @param sn The screen name of the buddy whose direct connection you want to find. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
494 | * @return The conn for the direct connection with the given buddy, or NULL if no |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
495 | * connection was found. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
496 | */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
497 | faim_export aim_conn_t *aim_odc_getconn(aim_session_t *sess, const char *sn) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
498 | { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
499 | aim_conn_t *cur; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
500 | struct aim_odc_intdata *intdata; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
501 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
502 | if (!sess || !sn || !strlen(sn)) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
503 | return NULL; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
504 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
505 | for (cur = sess->connlist; cur; cur = cur->next) { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
506 | if ((cur->type == AIM_CONN_TYPE_RENDEZVOUS) && (cur->subtype == AIM_CONN_SUBTYPE_OFT_DIRECTIM)) { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
507 | intdata = cur->internal; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
508 | if (!aim_sncmp(intdata->sn, sn)) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
509 | return cur; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
510 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
511 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
512 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
513 | return NULL; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
514 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
515 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
516 | /** |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
517 | * For those times when we want to open up the direct connection channel ourselves. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
518 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
519 | * You'll want to set up some kind of watcher on this socket. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
520 | * When the state changes, call aim_handlerendconnection with |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
521 | * the connection returned by this. aim_handlerendconnection |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
522 | * will accept the pending connection and stop listening. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
523 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
524 | * @param sess The session |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
525 | * @param sn The screen name to connect to. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
526 | * @return The new connection. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
527 | */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
528 | faim_export aim_conn_t *aim_odc_initiate(aim_session_t *sess, const char *sn) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
529 | { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
530 | aim_conn_t *newconn; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
531 | aim_msgcookie_t *cookie; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
532 | struct aim_odc_intdata *priv; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
533 | int listenfd; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
534 | fu16_t port = 4443; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
535 | fu8_t localip[4]; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
536 | fu8_t ck[8]; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
537 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
538 | if (aim_util_getlocalip(localip) == -1) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
539 | return NULL; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
540 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
541 | if ((listenfd = listenestablish(port)) == -1) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
542 | return NULL; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
543 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
544 | aim_im_sendch2_odcrequest(sess, ck, sn, localip, port); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
545 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
546 | cookie = (aim_msgcookie_t *)calloc(1, sizeof(aim_msgcookie_t)); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
547 | memcpy(cookie->cookie, ck, 8); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
548 | cookie->type = AIM_COOKIETYPE_OFTIM; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
549 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
550 | /* this one is for the cookie */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
551 | priv = (struct aim_odc_intdata *)calloc(1, sizeof(struct aim_odc_intdata)); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
552 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
553 | memcpy(priv->cookie, ck, 8); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
554 | strncpy(priv->sn, sn, sizeof(priv->sn)); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
555 | cookie->data = priv; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
556 | aim_cachecookie(sess, cookie); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
557 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
558 | /* XXX - switch to aim_cloneconn()? */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
559 | if (!(newconn = aim_newconn(sess, AIM_CONN_TYPE_LISTENER, NULL))) { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
560 | close(listenfd); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
561 | return NULL; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
562 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
563 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
564 | /* this one is for the conn */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
565 | priv = (struct aim_odc_intdata *)calloc(1, sizeof(struct aim_odc_intdata)); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
566 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
567 | memcpy(priv->cookie, ck, 8); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
568 | strncpy(priv->sn, sn, sizeof(priv->sn)); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
569 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
570 | newconn->fd = listenfd; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
571 | newconn->subtype = AIM_CONN_SUBTYPE_OFT_DIRECTIM; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
572 | newconn->internal = priv; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
573 | newconn->lastactivity = time(NULL); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
574 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
575 | return newconn; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
576 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
577 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
578 | /** |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
579 | * Connect directly to the given buddy for directim. |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
580 | * |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
581 | * This is a wrapper for aim_newconn. |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
582 | * |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
583 | * If addr is NULL, the socket is not created, but the connection is |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
584 | * allocated and setup to connect. |
| 2086 | 585 | * |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
586 | * @param sess The Godly session. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
587 | * @param sn The screen name we're connecting to. I hope it's a girl... |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
588 | * @param addr Address to connect to. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
589 | * @return The new connection. |
| 2086 | 590 | */ |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
591 | faim_export aim_conn_t *aim_odc_connect(aim_session_t *sess, const char *sn, const char *addr, const fu8_t *cookie) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
592 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
593 | aim_conn_t *newconn; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
594 | struct aim_odc_intdata *intdata; |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
595 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
596 | if (!sess || !sn) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
597 | return NULL; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
598 | |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
599 | if (!(intdata = calloc(1, sizeof(struct aim_odc_intdata)))) |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
600 | return NULL; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
601 | memcpy(intdata->cookie, cookie, 8); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
602 | strncpy(intdata->sn, sn, sizeof(intdata->sn)); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
603 | if (addr) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
604 | strncpy(intdata->ip, addr, sizeof(intdata->ip)); |
| 2086 | 605 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
606 | /* XXX - verify that non-blocking connects actually work */ |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
607 | if (!(newconn = aim_newconn(sess, AIM_CONN_TYPE_RENDEZVOUS, addr))) { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
608 | free(intdata); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
609 | return NULL; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
610 | } |
| 2086 | 611 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
612 | newconn->internal = intdata; |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
613 | newconn->subtype = AIM_CONN_SUBTYPE_OFT_DIRECTIM; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
614 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
615 | return newconn; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
616 | } |
| 2086 | 617 | |
| 618 | /** | |
|
4826
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
619 | * Sometimes you just don't know with these kinds of people. |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
620 | * |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
621 | * @param sess The session. |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
622 | * @param conn The ODC connection of the incoming data. |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
623 | * @param frr The frame allocated for the incoming data. |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
624 | * @param bs It stands for "bologna sandwich." |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
625 | * @return Return 0 if no errors, otherwise return the error number. |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
626 | */ |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
627 | static int handlehdr_odc(aim_session_t *sess, aim_conn_t *conn, aim_frame_t *frr, aim_bstream_t *bs) |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
628 | { |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
629 | aim_frame_t fr; |
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
630 | int ret = 0; |
|
4826
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
631 | aim_rxcallback_t userfunc; |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
632 | fu32_t payloadlength; |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
633 | fu16_t flags, encoding; |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
634 | char *snptr = NULL; |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
635 | |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
636 | fr.conn = conn; |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
637 | |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
638 | /* AAA - ugly */ |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
639 | aim_bstream_setpos(bs, 20); |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
640 | payloadlength = aimbs_get32(bs); |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
641 | |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
642 | aim_bstream_setpos(bs, 24); |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
643 | encoding = aimbs_get16(bs); |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
644 | |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
645 | aim_bstream_setpos(bs, 30); |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
646 | flags = aimbs_get16(bs); |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
647 | |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
648 | aim_bstream_setpos(bs, 36); |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
649 | /* XXX - create an aimbs_getnullstr function? */ |
|
4913
c58b53024da4
[gaim-migrate @ 5247]
Mark Doliner <markdoliner@pidgin.im>
parents:
4895
diff
changeset
|
650 | snptr = aimbs_getstr(bs, 32); /* Next 32 bytes contain the sn, padded with null chars */ |
|
4826
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
651 | |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
652 | faimdprintf(sess, 2, "faim: OFT frame: handlehdr_odc: %04x / %04x / %s\n", payloadlength, flags, snptr); |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
653 | |
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
654 | if (flags & 0x0008) { |
|
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
655 | if ((userfunc = aim_callhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMTYPING))) |
|
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
656 | ret = userfunc(sess, &fr, snptr, 2); |
|
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
657 | } else if (flags & 0x0004) { |
|
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
658 | if ((userfunc = aim_callhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMTYPING))) |
|
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
659 | ret = userfunc(sess, &fr, snptr, 1); |
|
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
660 | } else { |
|
4826
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
661 | if ((userfunc = aim_callhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMTYPING))) |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
662 | ret = userfunc(sess, &fr, snptr, 0); |
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
663 | } |
|
4826
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
664 | |
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
665 | if (payloadlength) { |
|
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
666 | char *msg; |
|
4826
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
667 | int recvd = 0; |
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
668 | int i, isawaymsg; |
|
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
669 | |
|
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
670 | isawaymsg = flags & 0x0001; |
|
4826
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
671 | |
| 4895 | 672 | if (!(msg = calloc(1, payloadlength+1))) { |
| 673 | free(snptr); | |
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
674 | return -ENOMEM; |
| 4895 | 675 | } |
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
676 | |
|
4826
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
677 | while (payloadlength - recvd) { |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
678 | if (payloadlength - recvd >= 1024) |
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
679 | i = aim_recv(conn->fd, &msg[recvd], 1024); |
|
4826
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
680 | else |
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
681 | i = aim_recv(conn->fd, &msg[recvd], payloadlength - recvd); |
|
4826
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
682 | if (i <= 0) { |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
683 | free(msg); |
| 4895 | 684 | free(snptr); |
|
4826
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
685 | return -1; |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
686 | } |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
687 | recvd = recvd + i; |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
688 | if ((userfunc = aim_callhandler(sess, conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_IMAGETRANSFER))) |
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
689 | ret = userfunc(sess, &fr, snptr, (double)recvd / payloadlength); |
|
4826
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
690 | } |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
691 | |
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
692 | if ((userfunc = aim_callhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMINCOMING))) |
|
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
693 | ret = userfunc(sess, &fr, snptr, msg, payloadlength, encoding, isawaymsg); |
|
4826
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
694 | |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
695 | free(msg); |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
696 | } |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
697 | |
| 4895 | 698 | free(snptr); |
| 699 | ||
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
700 | return ret; |
|
4826
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
701 | } |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
702 | |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
703 | faim_export struct aim_oft_info *aim_oft_createinfo(aim_session_t *sess, const fu8_t *cookie, const char *sn, const char *ip, fu16_t port, fu32_t size, fu32_t modtime, char *filename) |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
704 | { |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
705 | struct aim_oft_info *new; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
706 | |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
707 | if (!sess) |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
708 | return NULL; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
709 | |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
710 | if (!(new = (struct aim_oft_info *)calloc(1, sizeof(struct aim_oft_info)))) |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
711 | return NULL; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
712 | |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
713 | new->sess = sess; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
714 | if (cookie) |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
715 | memcpy(new->cookie, cookie, 8); |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
716 | if (ip) |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
717 | new->clientip = strdup(ip); |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
718 | if (sn) |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
719 | new->sn = strdup(sn); |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
720 | new->port = port; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
721 | new->fh.totfiles = 1; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
722 | new->fh.filesleft = 1; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
723 | new->fh.totparts = 1; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
724 | new->fh.partsleft = 1; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
725 | new->fh.totsize = size; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
726 | new->fh.size = size; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
727 | new->fh.modtime = modtime; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
728 | new->fh.checksum = 0xffff0000; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
729 | new->fh.rfrcsum = 0xffff0000; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
730 | new->fh.rfcsum = 0xffff0000; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
731 | new->fh.recvcsum = 0xffff0000; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
732 | strncpy(new->fh.idstring, "OFT_Windows ICBMFT V1.1 32", 31); |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
733 | if (filename) |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
734 | strncpy(new->fh.name, filename, 63); |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
735 | |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
736 | new->next = sess->oft_info; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
737 | sess->oft_info = new; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
738 | |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
739 | return new; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
740 | } |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
741 | |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
742 | /** |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
743 | * Remove the given oft_info struct from the oft_info linked list, and |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
744 | * then free its memory. |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
745 | * |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
746 | * @param sess The session. |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
747 | * @param oft_info The aim_oft_info struct that we're destroying. |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
748 | * @return Return 0 if no errors, otherwise return the error number. |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
749 | */ |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
750 | faim_export int aim_oft_destroyinfo(struct aim_oft_info *oft_info) |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
751 | { |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
752 | aim_session_t *sess; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
753 | |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
754 | if (!oft_info || !(sess = oft_info->sess)) |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
755 | return -EINVAL; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
756 | |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
757 | if (sess->oft_info && (sess->oft_info == oft_info)) { |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
758 | sess->oft_info = sess->oft_info->next; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
759 | } else { |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
760 | struct aim_oft_info *cur; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
761 | for (cur=sess->oft_info; (cur->next && (cur->next!=oft_info)); cur=cur->next); |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
762 | if (cur->next) |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
763 | cur->next = cur->next->next; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
764 | } |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
765 | |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
766 | free(oft_info->sn); |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
767 | free(oft_info->proxyip); |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
768 | free(oft_info->clientip); |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
769 | free(oft_info->verifiedip); |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
770 | free(oft_info); |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
771 | |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
772 | return 0; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
773 | } |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
774 | |
|
4826
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
775 | /** |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
776 | * Creates a listener socket so the other dude can connect to us. |
| 2086 | 777 | * |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
778 | * You'll want to set up some kind of watcher on this socket. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
779 | * When the state changes, call aim_handlerendconnection with |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
780 | * the connection returned by this. aim_handlerendconnection |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
781 | * will accept the pending connection and stop listening. |
| 2086 | 782 | * |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
783 | * @param sess The session. |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
784 | * @param oft_info File transfer information associated with this |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
785 | * connection. |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
786 | * @return Return 0 if no errors, otherwise return the error number. |
| 2086 | 787 | */ |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
788 | faim_export int aim_sendfile_listen(aim_session_t *sess, struct aim_oft_info *oft_info) |
| 2086 | 789 | { |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
790 | int listenfd; |
| 2086 | 791 | |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
792 | if (!oft_info) |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
793 | return -EINVAL; |
| 2086 | 794 | |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
795 | if ((listenfd = listenestablish(oft_info->port)) == -1) |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
796 | return 1; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
797 | |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
798 | if (!(oft_info->conn = aim_newconn(sess, AIM_CONN_TYPE_LISTENER, NULL))) { |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
799 | close(listenfd); |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
800 | return -ENOMEM; |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
801 | } |
| 3630 | 802 | |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
803 | oft_info->conn->fd = listenfd; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
804 | oft_info->conn->subtype = AIM_CONN_SUBTYPE_OFT_SENDFILE; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
805 | oft_info->conn->lastactivity = time(NULL); |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
806 | |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
807 | return 0; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
808 | } |
| 3630 | 809 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
810 | /** |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
811 | * Extract an &aim_fileheader_t from the given buffer. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
812 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
813 | * @param bs The should be from an incoming rendezvous packet. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
814 | * @return A pointer to new struct on success, or NULL on error. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
815 | */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
816 | static struct aim_fileheader_t *aim_oft_getheader(aim_bstream_t *bs) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
817 | { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
818 | struct aim_fileheader_t *fh; |
| 3630 | 819 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
820 | if (!(fh = calloc(1, sizeof(struct aim_fileheader_t)))) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
821 | return NULL; |
| 3630 | 822 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
823 | /* The bstream should be positioned after the hdrtype. */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
824 | aimbs_getrawbuf(bs, fh->bcookie, 8); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
825 | fh->encrypt = aimbs_get16(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
826 | fh->compress = aimbs_get16(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
827 | fh->totfiles = aimbs_get16(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
828 | fh->filesleft = aimbs_get16(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
829 | fh->totparts = aimbs_get16(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
830 | fh->partsleft = aimbs_get16(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
831 | fh->totsize = aimbs_get32(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
832 | fh->size = aimbs_get32(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
833 | fh->modtime = aimbs_get32(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
834 | fh->checksum = aimbs_get32(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
835 | fh->rfrcsum = aimbs_get32(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
836 | fh->rfsize = aimbs_get32(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
837 | fh->cretime = aimbs_get32(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
838 | fh->rfcsum = aimbs_get32(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
839 | fh->nrecvd = aimbs_get32(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
840 | fh->recvcsum = aimbs_get32(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
841 | aimbs_getrawbuf(bs, fh->idstring, 32); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
842 | fh->flags = aimbs_get8(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
843 | fh->lnameoffset = aimbs_get8(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
844 | fh->lsizeoffset = aimbs_get8(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
845 | aimbs_getrawbuf(bs, fh->dummy, 69); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
846 | aimbs_getrawbuf(bs, fh->macfileinfo, 16); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
847 | fh->nencode = aimbs_get16(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
848 | fh->nlanguage = aimbs_get16(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
849 | aimbs_getrawbuf(bs, fh->name, 64); /* XXX - filenames longer than 64B */ |
| 2086 | 850 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
851 | return fh; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
852 | } |
| 3630 | 853 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
854 | /** |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
855 | * Fills a buffer with network-order fh data |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
856 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
857 | * @param bs A bstream to fill -- automatically initialized |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
858 | * @param fh A struct aim_fileheader_t to get data from. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
859 | * @return Return non-zero on error. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
860 | */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
861 | static int aim_oft_buildheader(aim_bstream_t *bs, struct aim_fileheader_t *fh) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
862 | { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
863 | fu8_t *hdr; |
| 3630 | 864 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
865 | if (!bs || !fh) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
866 | return -EINVAL; |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
867 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
868 | if (!(hdr = (unsigned char *)calloc(1, 0x100 - 8))) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
869 | return -ENOMEM; |
| 3630 | 870 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
871 | aim_bstream_init(bs, hdr, 0x100 - 8); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
872 | aimbs_putraw(bs, fh->bcookie, 8); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
873 | aimbs_put16(bs, fh->encrypt); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
874 | aimbs_put16(bs, fh->compress); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
875 | aimbs_put16(bs, fh->totfiles); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
876 | aimbs_put16(bs, fh->filesleft); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
877 | aimbs_put16(bs, fh->totparts); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
878 | aimbs_put16(bs, fh->partsleft); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
879 | aimbs_put32(bs, fh->totsize); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
880 | aimbs_put32(bs, fh->size); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
881 | aimbs_put32(bs, fh->modtime); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
882 | aimbs_put32(bs, fh->checksum); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
883 | aimbs_put32(bs, fh->rfrcsum); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
884 | aimbs_put32(bs, fh->rfsize); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
885 | aimbs_put32(bs, fh->cretime); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
886 | aimbs_put32(bs, fh->rfcsum); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
887 | aimbs_put32(bs, fh->nrecvd); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
888 | aimbs_put32(bs, fh->recvcsum); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
889 | aimbs_putraw(bs, fh->idstring, 32); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
890 | aimbs_put8(bs, fh->flags); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
891 | aimbs_put8(bs, fh->lnameoffset); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
892 | aimbs_put8(bs, fh->lsizeoffset); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
893 | aimbs_putraw(bs, fh->dummy, 69); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
894 | aimbs_putraw(bs, fh->macfileinfo, 16); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
895 | aimbs_put16(bs, fh->nencode); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
896 | aimbs_put16(bs, fh->nlanguage); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
897 | aimbs_putraw(bs, fh->name, 64); /* XXX - filenames longer than 64B */ |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
898 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
899 | return 0; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
900 | } |
| 2086 | 901 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
902 | /** |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
903 | * Create an OFT packet based on the given information, and send it on its merry way. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
904 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
905 | * @param sess The session. |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
906 | * @param type The subtype of the OFT packet we're sending. |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
907 | * @param oft_info The aim_oft_info struct with the connection and OFT |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
908 | * info we're sending. |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
909 | * @return Return 0 if no errors, otherwise return the error number. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
910 | */ |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
911 | faim_export int aim_oft_sendheader(aim_session_t *sess, fu16_t type, struct aim_oft_info *oft_info) |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
912 | { |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
913 | aim_frame_t *fr; |
| 2086 | 914 | |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
915 | if (!sess || !oft_info || !oft_info->conn || (oft_info->conn->type != AIM_CONN_TYPE_RENDEZVOUS)) |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
916 | return -EINVAL; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
917 | |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
918 | #if 0 |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
919 | /* |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
920 | * If you are receiving a file, the cookie should be null, if you are sending a |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
921 | * file, the cookie should be the same as the one used in the ICBM negotiation |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
922 | * SNACs. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
923 | */ |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
924 | fh->lnameoffset = 0x1a; |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
925 | fh->lsizeoffset = 0x10; |
| 2086 | 926 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
927 | /* apparently 0 is ASCII, 2 is UCS-2 */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
928 | /* it is likely that 3 is ISO 8859-1 */ |
|
4826
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
929 | /* I think "nlanguage" might be the same thing as "subenc" in im.c */ |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
930 | fh->nencode = 0x0000; |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
931 | fh->nlanguage = 0x0000; |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
932 | #endif |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
933 | |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
934 | aim_oft_dirconvert_tostupid(oft_info->fh.name); |
| 2086 | 935 | |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
936 | if (!(fr = aim_tx_new(sess, oft_info->conn, AIM_FRAMETYPE_OFT, type, 0))) |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
937 | return -ENOMEM; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
938 | |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
939 | if (aim_oft_buildheader(&fr->data, &oft_info->fh) == -1) { |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
940 | aim_frame_destroy(fr); |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
941 | return -ENOMEM; |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
942 | } |
| 2086 | 943 | |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
944 | memcpy(fr->hdr.rend.magic, "OFT2", 4); |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
945 | fr->hdr.rend.hdrlen = aim_bstream_curpos(&fr->data); |
| 2086 | 946 | |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
947 | aim_tx_enqueue(sess, fr); |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
948 | |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
949 | return 0; |
| 2086 | 950 | } |
| 951 | ||
| 952 | /** | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
953 | * Handle incoming data on a rendezvous connection. This is analogous to the |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
954 | * consumesnac function in rxhandlers.c, and I really think this should probably |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
955 | * be in rxhandlers.c as well, but I haven't finished cleaning everything up yet. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
956 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
957 | * @param sess The session. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
958 | * @param fr The frame allocated for the incoming data. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
959 | * @return Return 0 if the packet was handled correctly, otherwise return the |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
960 | * error number. |
| 3771 | 961 | */ |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
962 | faim_internal int aim_rxdispatch_rendezvous(aim_session_t *sess, aim_frame_t *fr) |
| 2086 | 963 | { |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
964 | aim_conn_t *conn = fr->conn; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
965 | int ret = 1; |
| 2086 | 966 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
967 | if (conn->subtype == AIM_CONN_SUBTYPE_OFT_DIRECTIM) { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
968 | if (fr->hdr.rend.type == 0x0001) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
969 | ret = handlehdr_odc(sess, conn, fr, &fr->data); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
970 | else |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
971 | faimdprintf(sess, 0, "faim: ODC directim frame unknown, type is %04x\n", fr->hdr.rend.type); |
| 2086 | 972 | |
|
4826
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
973 | } else { |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
974 | aim_rxcallback_t userfunc; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
975 | struct aim_fileheader_t *header = aim_oft_getheader(&fr->data); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
976 | aim_oft_dirconvert_fromstupid(header->name); /* XXX - This should be client-side */ |
| 3771 | 977 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
978 | if ((userfunc = aim_callhandler(sess, conn, AIM_CB_FAM_OFT, fr->hdr.rend.type))) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
979 | ret = userfunc(sess, fr, conn, header->bcookie, header); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
980 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
981 | free(header); |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
982 | } |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
983 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
984 | if (ret == -1) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
985 | aim_conn_close(conn); |
| 2086 | 986 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
987 | return ret; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
988 | } |