Mercurial > pidgin.yaz
annotate libfaim/aim_tlv.c @ 1068:ed28707debdc
[gaim-migrate @ 1078]
tooltips for one connection. need to figure out how to do it for multiple connections.
committer: Tailor Script <tailor@pidgin.im>
author | Eric Warmenhoven <eric@warmenhoven.org> |
---|---|
date | Sat, 04 Nov 2000 22:35:05 +0000 |
parents | 1d8f05ea6bdf |
children | efcacae6acdb |
rev | line source |
---|---|
283
0f14e6d8a51b
[gaim-migrate @ 293]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
237
diff
changeset
|
1 #include <faim/aim.h> |
2 | 2 |
840
595ac7759563
[gaim-migrate @ 850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
818
diff
changeset
|
3 faim_internal struct aim_tlvlist_t *aim_readtlvchain(u_char *buf, int maxlen) |
237 | 4 { |
5 int pos; | |
6 struct aim_tlvlist_t *list; | |
7 struct aim_tlvlist_t *cur; | |
8 | |
9 u_short type; | |
10 u_short length; | |
11 | |
12 if (!buf) | |
13 return NULL; | |
14 | |
15 list = NULL; | |
16 | |
17 pos = 0; | |
18 | |
19 while (pos < maxlen) | |
20 { | |
21 type = aimutil_get16(buf+pos); | |
22 pos += 2; | |
23 | |
24 if (pos < maxlen) | |
25 { | |
26 length = aimutil_get16(buf+pos); | |
27 pos += 2; | |
28 | |
29 if ((pos+length) <= maxlen) | |
30 { | |
446
6d78b988b479
[gaim-migrate @ 456]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
31 /* |
6d78b988b479
[gaim-migrate @ 456]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
32 * Okay, so now AOL has decided that any TLV of |
6d78b988b479
[gaim-migrate @ 456]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
33 * type 0x0013 can only be two bytes, despite |
6d78b988b479
[gaim-migrate @ 456]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
34 * what the actual given length is. So here |
6d78b988b479
[gaim-migrate @ 456]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
35 * we dump any invalid TLVs of that sort. Hopefully |
6d78b988b479
[gaim-migrate @ 456]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
36 * theres no special cases to this special case. |
6d78b988b479
[gaim-migrate @ 456]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
37 * - mid (30jun2000) |
6d78b988b479
[gaim-migrate @ 456]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
38 */ |
6d78b988b479
[gaim-migrate @ 456]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
39 if ((type == 0x0013) && (length != 0x0002)) { |
6d78b988b479
[gaim-migrate @ 456]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
40 printf("faim: skipping TLV t(0013) with invalid length (0x%04x)\n", length); |
6d78b988b479
[gaim-migrate @ 456]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
41 length = 0x0002; |
6d78b988b479
[gaim-migrate @ 456]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
42 } else { |
6d78b988b479
[gaim-migrate @ 456]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
43 cur = (struct aim_tlvlist_t *)malloc(sizeof(struct aim_tlvlist_t)); |
6d78b988b479
[gaim-migrate @ 456]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
44 memset(cur, 0x00, sizeof(struct aim_tlvlist_t)); |
237 | 45 |
446
6d78b988b479
[gaim-migrate @ 456]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
46 cur->tlv = aim_createtlv(); |
6d78b988b479
[gaim-migrate @ 456]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
47 cur->tlv->type = type; |
818
f425f51a3db8
[gaim-migrate @ 828]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
771
diff
changeset
|
48 cur->tlv->length = length; |
f425f51a3db8
[gaim-migrate @ 828]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
771
diff
changeset
|
49 if (length) { |
f425f51a3db8
[gaim-migrate @ 828]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
771
diff
changeset
|
50 cur->tlv->value = (unsigned char *)malloc(length); |
f425f51a3db8
[gaim-migrate @ 828]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
771
diff
changeset
|
51 memcpy(cur->tlv->value, buf+pos, length); |
f425f51a3db8
[gaim-migrate @ 828]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
771
diff
changeset
|
52 } |
771
72e556f6b99d
[gaim-migrate @ 781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
446
diff
changeset
|
53 |
446
6d78b988b479
[gaim-migrate @ 456]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
54 cur->next = list; |
6d78b988b479
[gaim-migrate @ 456]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
55 list = cur; |
6d78b988b479
[gaim-migrate @ 456]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
56 } |
237 | 57 pos += length; |
58 } | |
59 } | |
60 } | |
61 | |
62 return list; | |
63 } | |
64 | |
840
595ac7759563
[gaim-migrate @ 850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
818
diff
changeset
|
65 faim_internal void aim_freetlvchain(struct aim_tlvlist_t **list) |
237 | 66 { |
67 struct aim_tlvlist_t *cur, *cur2; | |
68 | |
69 if (!list || !(*list)) | |
70 return; | |
71 | |
72 cur = *list; | |
73 while (cur) | |
74 { | |
75 aim_freetlv(&cur->tlv); | |
76 cur2 = cur->next; | |
77 free(cur); | |
78 cur = cur2; | |
79 } | |
80 list = NULL; | |
81 return; | |
82 } | |
83 | |
840
595ac7759563
[gaim-migrate @ 850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
818
diff
changeset
|
84 faim_internal int aim_counttlvchain(struct aim_tlvlist_t **list) |
237 | 85 { |
86 struct aim_tlvlist_t *cur; | |
87 int count = 0; | |
88 | |
89 if (!list || !(*list)) | |
90 return 0; | |
91 | |
92 for (cur = *list; cur; cur = cur->next) | |
93 count++; | |
94 | |
95 return count; | |
96 } | |
97 | |
1002
1d8f05ea6bdf
[gaim-migrate @ 1012]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
900
diff
changeset
|
98 faim_export int aim_sizetlvchain(struct aim_tlvlist_t **list) |
1d8f05ea6bdf
[gaim-migrate @ 1012]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
900
diff
changeset
|
99 { |
1d8f05ea6bdf
[gaim-migrate @ 1012]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
900
diff
changeset
|
100 struct aim_tlvlist_t *cur; |
1d8f05ea6bdf
[gaim-migrate @ 1012]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
900
diff
changeset
|
101 int size = 0; |
1d8f05ea6bdf
[gaim-migrate @ 1012]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
900
diff
changeset
|
102 |
1d8f05ea6bdf
[gaim-migrate @ 1012]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
900
diff
changeset
|
103 if (!list || !(*list)) |
1d8f05ea6bdf
[gaim-migrate @ 1012]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
900
diff
changeset
|
104 return 0; |
1d8f05ea6bdf
[gaim-migrate @ 1012]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
900
diff
changeset
|
105 |
1d8f05ea6bdf
[gaim-migrate @ 1012]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
900
diff
changeset
|
106 for (cur = *list; cur; cur = cur->next) |
1d8f05ea6bdf
[gaim-migrate @ 1012]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
900
diff
changeset
|
107 size += (4 + cur->tlv->length); |
1d8f05ea6bdf
[gaim-migrate @ 1012]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
900
diff
changeset
|
108 |
1d8f05ea6bdf
[gaim-migrate @ 1012]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
900
diff
changeset
|
109 return size; |
1d8f05ea6bdf
[gaim-migrate @ 1012]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
900
diff
changeset
|
110 } |
1d8f05ea6bdf
[gaim-migrate @ 1012]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
900
diff
changeset
|
111 |
1d8f05ea6bdf
[gaim-migrate @ 1012]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
900
diff
changeset
|
112 |
840
595ac7759563
[gaim-migrate @ 850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
818
diff
changeset
|
113 faim_internal int aim_addtlvtochain_str(struct aim_tlvlist_t **list, unsigned short type, char *str, int len) |
237 | 114 { |
900
e18815f5a4e9
[gaim-migrate @ 910]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
889
diff
changeset
|
115 struct aim_tlvlist_t *newtlv; |
237 | 116 struct aim_tlvlist_t *cur; |
117 | |
118 if (!list) | |
119 return 0; | |
120 | |
900
e18815f5a4e9
[gaim-migrate @ 910]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
889
diff
changeset
|
121 newtlv = (struct aim_tlvlist_t *)malloc(sizeof(struct aim_tlvlist_t)); |
e18815f5a4e9
[gaim-migrate @ 910]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
889
diff
changeset
|
122 memset(newtlv, 0x00, sizeof(struct aim_tlvlist_t)); |
237 | 123 |
900
e18815f5a4e9
[gaim-migrate @ 910]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
889
diff
changeset
|
124 newtlv->tlv = aim_createtlv(); |
e18815f5a4e9
[gaim-migrate @ 910]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
889
diff
changeset
|
125 newtlv->tlv->type = type; |
e18815f5a4e9
[gaim-migrate @ 910]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
889
diff
changeset
|
126 newtlv->tlv->length = len; |
e18815f5a4e9
[gaim-migrate @ 910]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
889
diff
changeset
|
127 newtlv->tlv->value = (unsigned char *)malloc(newtlv->tlv->length*sizeof(unsigned char)); |
e18815f5a4e9
[gaim-migrate @ 910]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
889
diff
changeset
|
128 memcpy(newtlv->tlv->value, str, newtlv->tlv->length); |
237 | 129 |
900
e18815f5a4e9
[gaim-migrate @ 910]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
889
diff
changeset
|
130 newtlv->next = NULL; |
237 | 131 |
132 if (*list == NULL) { | |
900
e18815f5a4e9
[gaim-migrate @ 910]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
889
diff
changeset
|
133 *list = newtlv; |
237 | 134 } else if ((*list)->next == NULL) { |
900
e18815f5a4e9
[gaim-migrate @ 910]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
889
diff
changeset
|
135 (*list)->next = newtlv; |
237 | 136 } else { |
137 for(cur = *list; cur->next; cur = cur->next) | |
138 ; | |
900
e18815f5a4e9
[gaim-migrate @ 910]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
889
diff
changeset
|
139 cur->next = newtlv; |
237 | 140 } |
900
e18815f5a4e9
[gaim-migrate @ 910]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
889
diff
changeset
|
141 return newtlv->tlv->length; |
237 | 142 } |
143 | |
840
595ac7759563
[gaim-migrate @ 850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
818
diff
changeset
|
144 faim_internal int aim_addtlvtochain16(struct aim_tlvlist_t **list, unsigned short type, unsigned short val) |
237 | 145 { |
900
e18815f5a4e9
[gaim-migrate @ 910]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
889
diff
changeset
|
146 struct aim_tlvlist_t *newtl; |
237 | 147 struct aim_tlvlist_t *cur; |
148 | |
149 if (!list) | |
150 return 0; | |
151 | |
900
e18815f5a4e9
[gaim-migrate @ 910]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
889
diff
changeset
|
152 newtl = (struct aim_tlvlist_t *)malloc(sizeof(struct aim_tlvlist_t)); |
e18815f5a4e9
[gaim-migrate @ 910]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
889
diff
changeset
|
153 memset(newtl, 0x00, sizeof(struct aim_tlvlist_t)); |
237 | 154 |
900
e18815f5a4e9
[gaim-migrate @ 910]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
889
diff
changeset
|
155 newtl->tlv = aim_createtlv(); |
e18815f5a4e9
[gaim-migrate @ 910]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
889
diff
changeset
|
156 newtl->tlv->type = type; |
e18815f5a4e9
[gaim-migrate @ 910]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
889
diff
changeset
|
157 newtl->tlv->length = 2; |
e18815f5a4e9
[gaim-migrate @ 910]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
889
diff
changeset
|
158 newtl->tlv->value = (unsigned char *)malloc(newtl->tlv->length*sizeof(unsigned char)); |
e18815f5a4e9
[gaim-migrate @ 910]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
889
diff
changeset
|
159 aimutil_put16(newtl->tlv->value, val); |
237 | 160 |
900
e18815f5a4e9
[gaim-migrate @ 910]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
889
diff
changeset
|
161 newtl->next = NULL; |
237 | 162 |
163 if (*list == NULL) { | |
900
e18815f5a4e9
[gaim-migrate @ 910]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
889
diff
changeset
|
164 *list = newtl; |
237 | 165 } else if ((*list)->next == NULL) { |
900
e18815f5a4e9
[gaim-migrate @ 910]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
889
diff
changeset
|
166 (*list)->next = newtl; |
237 | 167 } else { |
168 for(cur = *list; cur->next; cur = cur->next) | |
169 ; | |
900
e18815f5a4e9
[gaim-migrate @ 910]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
889
diff
changeset
|
170 cur->next = newtl; |
237 | 171 } |
172 return 2; | |
173 } | |
174 | |
840
595ac7759563
[gaim-migrate @ 850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
818
diff
changeset
|
175 faim_internal int aim_addtlvtochain32(struct aim_tlvlist_t **list, unsigned short type, unsigned long val) |
237 | 176 { |
900
e18815f5a4e9
[gaim-migrate @ 910]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
889
diff
changeset
|
177 struct aim_tlvlist_t *newtl; |
237 | 178 struct aim_tlvlist_t *cur; |
179 | |
180 if (!list) | |
181 return 0; | |
182 | |
900
e18815f5a4e9
[gaim-migrate @ 910]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
889
diff
changeset
|
183 newtl = (struct aim_tlvlist_t *)malloc(sizeof(struct aim_tlvlist_t)); |
e18815f5a4e9
[gaim-migrate @ 910]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
889
diff
changeset
|
184 memset(newtl, 0x00, sizeof(struct aim_tlvlist_t)); |
237 | 185 |
900
e18815f5a4e9
[gaim-migrate @ 910]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
889
diff
changeset
|
186 newtl->tlv = aim_createtlv(); |
e18815f5a4e9
[gaim-migrate @ 910]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
889
diff
changeset
|
187 newtl->tlv->type = type; |
e18815f5a4e9
[gaim-migrate @ 910]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
889
diff
changeset
|
188 newtl->tlv->length = 4; |
e18815f5a4e9
[gaim-migrate @ 910]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
889
diff
changeset
|
189 newtl->tlv->value = (unsigned char *)malloc(newtl->tlv->length*sizeof(unsigned char)); |
e18815f5a4e9
[gaim-migrate @ 910]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
889
diff
changeset
|
190 aimutil_put32(newtl->tlv->value, val); |
237 | 191 |
900
e18815f5a4e9
[gaim-migrate @ 910]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
889
diff
changeset
|
192 newtl->next = NULL; |
237 | 193 |
194 if (*list == NULL) { | |
900
e18815f5a4e9
[gaim-migrate @ 910]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
889
diff
changeset
|
195 *list = newtl; |
237 | 196 } else if ((*list)->next == NULL) { |
900
e18815f5a4e9
[gaim-migrate @ 910]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
889
diff
changeset
|
197 (*list)->next = newtl; |
237 | 198 } else { |
199 for(cur = *list; cur->next; cur = cur->next) | |
200 ; | |
900
e18815f5a4e9
[gaim-migrate @ 910]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
889
diff
changeset
|
201 cur->next = newtl; |
237 | 202 } |
203 return 4; | |
204 } | |
205 | |
1002
1d8f05ea6bdf
[gaim-migrate @ 1012]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
900
diff
changeset
|
206 faim_internal int aim_addtlvtochain_caps(struct aim_tlvlist_t **list, unsigned short type, unsigned short caps) |
1d8f05ea6bdf
[gaim-migrate @ 1012]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
900
diff
changeset
|
207 { |
1d8f05ea6bdf
[gaim-migrate @ 1012]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
900
diff
changeset
|
208 unsigned char buf[128]; /* icky fixed length buffer */ |
1d8f05ea6bdf
[gaim-migrate @ 1012]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
900
diff
changeset
|
209 struct aim_tlvlist_t *newtl; |
1d8f05ea6bdf
[gaim-migrate @ 1012]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
900
diff
changeset
|
210 struct aim_tlvlist_t *cur; |
1d8f05ea6bdf
[gaim-migrate @ 1012]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
900
diff
changeset
|
211 |
1d8f05ea6bdf
[gaim-migrate @ 1012]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
900
diff
changeset
|
212 if(!list) |
1d8f05ea6bdf
[gaim-migrate @ 1012]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
900
diff
changeset
|
213 return 0; |
1d8f05ea6bdf
[gaim-migrate @ 1012]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
900
diff
changeset
|
214 |
1d8f05ea6bdf
[gaim-migrate @ 1012]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
900
diff
changeset
|
215 newtl = (struct aim_tlvlist_t *)malloc(sizeof(struct aim_tlvlist_t)); |
1d8f05ea6bdf
[gaim-migrate @ 1012]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
900
diff
changeset
|
216 memset(newtl, 0x00, sizeof(struct aim_tlvlist_t)); |
1d8f05ea6bdf
[gaim-migrate @ 1012]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
900
diff
changeset
|
217 |
1d8f05ea6bdf
[gaim-migrate @ 1012]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
900
diff
changeset
|
218 newtl->tlv = aim_createtlv(); |
1d8f05ea6bdf
[gaim-migrate @ 1012]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
900
diff
changeset
|
219 newtl->tlv->type = type; |
1d8f05ea6bdf
[gaim-migrate @ 1012]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
900
diff
changeset
|
220 |
1d8f05ea6bdf
[gaim-migrate @ 1012]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
900
diff
changeset
|
221 newtl->tlv->length = aim_putcap(buf, sizeof(buf), caps); |
1d8f05ea6bdf
[gaim-migrate @ 1012]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
900
diff
changeset
|
222 newtl->tlv->value = (unsigned char *)calloc(1, newtl->tlv->length); |
1d8f05ea6bdf
[gaim-migrate @ 1012]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
900
diff
changeset
|
223 memcpy(newtl->tlv->value, buf, newtl->tlv->length); |
1d8f05ea6bdf
[gaim-migrate @ 1012]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
900
diff
changeset
|
224 |
1d8f05ea6bdf
[gaim-migrate @ 1012]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
900
diff
changeset
|
225 newtl->next = NULL; |
1d8f05ea6bdf
[gaim-migrate @ 1012]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
900
diff
changeset
|
226 |
1d8f05ea6bdf
[gaim-migrate @ 1012]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
900
diff
changeset
|
227 if (*list == NULL) { |
1d8f05ea6bdf
[gaim-migrate @ 1012]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
900
diff
changeset
|
228 *list = newtl; |
1d8f05ea6bdf
[gaim-migrate @ 1012]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
900
diff
changeset
|
229 } else if ((*list)->next == NULL) { |
1d8f05ea6bdf
[gaim-migrate @ 1012]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
900
diff
changeset
|
230 (*list)->next = newtl; |
1d8f05ea6bdf
[gaim-migrate @ 1012]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
900
diff
changeset
|
231 } else { |
1d8f05ea6bdf
[gaim-migrate @ 1012]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
900
diff
changeset
|
232 for(cur = *list; cur->next; cur = cur->next) |
1d8f05ea6bdf
[gaim-migrate @ 1012]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
900
diff
changeset
|
233 ; |
1d8f05ea6bdf
[gaim-migrate @ 1012]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
900
diff
changeset
|
234 cur->next = newtl; |
1d8f05ea6bdf
[gaim-migrate @ 1012]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
900
diff
changeset
|
235 } |
1d8f05ea6bdf
[gaim-migrate @ 1012]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
900
diff
changeset
|
236 return newtl->tlv->length; |
1d8f05ea6bdf
[gaim-migrate @ 1012]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
900
diff
changeset
|
237 } |
1d8f05ea6bdf
[gaim-migrate @ 1012]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
900
diff
changeset
|
238 |
840
595ac7759563
[gaim-migrate @ 850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
818
diff
changeset
|
239 faim_internal int aim_writetlvchain(u_char *buf, int buflen, struct aim_tlvlist_t **list) |
237 | 240 { |
241 int goodbuflen = 0; | |
242 int i = 0; | |
243 struct aim_tlvlist_t *cur; | |
244 | |
245 if (!list || !buf || !buflen) | |
246 return 0; | |
247 | |
248 /* do an initial run to test total length */ | |
249 for (cur = *list; cur; cur = cur->next) { | |
250 goodbuflen += 2 + 2; /* type + len */ | |
251 goodbuflen += cur->tlv->length; | |
252 } | |
253 | |
254 if (goodbuflen > buflen) | |
255 return 0; /* not enough buffer */ | |
256 | |
257 /* do the real write-out */ | |
258 for (cur = *list; cur; cur = cur->next) { | |
259 i += aimutil_put16(buf+i, cur->tlv->type); | |
260 i += aimutil_put16(buf+i, cur->tlv->length); | |
261 memcpy(buf+i, cur->tlv->value, cur->tlv->length); | |
262 i += cur->tlv->length; | |
263 } | |
264 | |
265 return i; | |
266 } | |
267 | |
268 | |
269 /* | |
270 * Grab the Nth TLV of type type in the TLV list list. | |
271 */ | |
840
595ac7759563
[gaim-migrate @ 850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
818
diff
changeset
|
272 faim_internal struct aim_tlv_t *aim_gettlv(struct aim_tlvlist_t *list, u_short type, int nth) |
237 | 273 { |
274 int i; | |
275 struct aim_tlvlist_t *cur; | |
276 | |
277 i = 0; | |
278 for (cur = list; cur != NULL; cur = cur->next) | |
279 { | |
280 if (cur && cur->tlv) | |
281 { | |
282 if (cur->tlv->type == type) | |
283 i++; | |
284 if (i >= nth) | |
285 return cur->tlv; | |
286 } | |
287 } | |
288 return NULL; | |
289 } | |
290 | |
840
595ac7759563
[gaim-migrate @ 850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
818
diff
changeset
|
291 faim_internal char *aim_gettlv_str(struct aim_tlvlist_t *list, u_short type, int nth) |
237 | 292 { |
293 struct aim_tlv_t *tlv; | |
294 char *newstr; | |
295 | |
296 if (!(tlv = aim_gettlv(list, type, nth))) | |
297 return NULL; | |
298 | |
299 newstr = (char *) malloc(tlv->length + 1); | |
300 memcpy(newstr, tlv->value, tlv->length); | |
301 *(newstr + tlv->length) = '\0'; | |
302 | |
303 return newstr; | |
304 } | |
305 | |
840
595ac7759563
[gaim-migrate @ 850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
818
diff
changeset
|
306 faim_internal struct aim_tlv_t *aim_grabtlv(u_char *src) |
2 | 307 { |
308 struct aim_tlv_t *dest = NULL; | |
309 | |
310 dest = aim_createtlv(); | |
311 | |
312 dest->type = src[0] << 8; | |
313 dest->type += src[1]; | |
314 | |
315 dest->length = src[2] << 8; | |
316 dest->length += src[3]; | |
317 | |
318 dest->value = (u_char *) malloc(dest->length*sizeof(u_char)); | |
319 memset(dest->value, 0, dest->length*sizeof(u_char)); | |
320 | |
321 memcpy(dest->value, &(src[4]), dest->length*sizeof(u_char)); | |
322 | |
323 return dest; | |
324 } | |
325 | |
840
595ac7759563
[gaim-migrate @ 850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
818
diff
changeset
|
326 faim_internal struct aim_tlv_t *aim_grabtlvstr(u_char *src) |
2 | 327 { |
328 struct aim_tlv_t *dest = NULL; | |
329 | |
330 dest = aim_createtlv(); | |
331 | |
332 dest->type = src[0] << 8; | |
333 dest->type += src[1]; | |
334 | |
335 dest->length = src[2] << 8; | |
336 dest->length += src[3]; | |
337 | |
338 dest->value = (u_char *) malloc((dest->length+1)*sizeof(u_char)); | |
339 memset(dest->value, 0, (dest->length+1)*sizeof(u_char)); | |
340 | |
341 memcpy(dest->value, &(src[4]), dest->length*sizeof(u_char)); | |
342 dest->value[dest->length] = '\0'; | |
343 | |
344 return dest; | |
345 } | |
346 | |
840
595ac7759563
[gaim-migrate @ 850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
818
diff
changeset
|
347 faim_internal int aim_puttlv(u_char *dest, struct aim_tlv_t *newtlv) |
2 | 348 { |
349 int i=0; | |
350 | |
351 dest[i++] = newtlv->type >> 8; | |
352 dest[i++] = newtlv->type & 0x00FF; | |
353 dest[i++] = newtlv->length >> 8; | |
354 dest[i++] = newtlv->length & 0x00FF; | |
355 memcpy(&(dest[i]), newtlv->value, newtlv->length); | |
356 i+=newtlv->length; | |
357 return i; | |
358 } | |
359 | |
840
595ac7759563
[gaim-migrate @ 850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
818
diff
changeset
|
360 faim_internal struct aim_tlv_t *aim_createtlv(void) |
2 | 361 { |
362 struct aim_tlv_t *newtlv = NULL; | |
363 newtlv = (struct aim_tlv_t *)malloc(sizeof(struct aim_tlv_t)); | |
364 memset(newtlv, 0, sizeof(struct aim_tlv_t)); | |
365 return newtlv; | |
366 } | |
367 | |
840
595ac7759563
[gaim-migrate @ 850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
818
diff
changeset
|
368 faim_internal int aim_freetlv(struct aim_tlv_t **oldtlv) |
2 | 369 { |
370 if (!oldtlv) | |
371 return -1; | |
372 if (!*oldtlv) | |
373 return -1; | |
374 if ((*oldtlv)->value) | |
375 free((*oldtlv)->value); | |
376 free(*(oldtlv)); | |
377 (*oldtlv) = NULL; | |
378 | |
379 return 0; | |
380 } | |
381 | |
840
595ac7759563
[gaim-migrate @ 850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
818
diff
changeset
|
382 faim_internal int aim_puttlv_16(u_char *buf, u_short t, u_short v) |
2 | 383 { |
384 int curbyte=0; | |
237 | 385 curbyte += aimutil_put16(buf+curbyte, (u_short)(t&0xffff)); |
386 curbyte += aimutil_put16(buf+curbyte, (u_short)0x0002); | |
387 curbyte += aimutil_put16(buf+curbyte, (u_short)(v&0xffff)); | |
388 return curbyte; | |
389 } | |
390 | |
840
595ac7759563
[gaim-migrate @ 850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
818
diff
changeset
|
391 faim_internal int aim_puttlv_32(u_char *buf, u_short t, u_long v) |
237 | 392 { |
393 int curbyte=0; | |
394 curbyte += aimutil_put16(buf+curbyte, (u_short)(t&0xffff)); | |
395 curbyte += aimutil_put16(buf+curbyte, (u_short)0x0004); | |
396 curbyte += aimutil_put32(buf+curbyte, (u_long)(v&0xffffffff)); | |
2 | 397 return curbyte; |
398 } | |
237 | 399 |
889
e1da6a6ec42b
[gaim-migrate @ 899]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
840
diff
changeset
|
400 faim_internal int aim_puttlv_str(u_char *buf, u_short t, int l, char *v) |
237 | 401 { |
402 int curbyte; | |
403 | |
404 curbyte = 0; | |
405 curbyte += aimutil_put16(buf+curbyte, (u_short)(t&0xffff)); | |
406 curbyte += aimutil_put16(buf+curbyte, (u_short)(l&0xffff)); | |
407 if (v) | |
840
595ac7759563
[gaim-migrate @ 850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
818
diff
changeset
|
408 memcpy(buf+curbyte, (unsigned char *)v, l); |
237 | 409 curbyte += l; |
410 return curbyte; | |
411 } |