]> andersk Git - libfaim.git/blob - aim_tlv.c
536e259948d6b0b58f726129f41796cee74a0df2
[libfaim.git] / aim_tlv.c
1 #include <aim.h>
2
3 struct aim_tlv_t *aim_grabtlv(u_char *src)
4 {
5   struct aim_tlv_t *dest = NULL;
6
7   dest = aim_createtlv();
8
9   dest->type = src[0] << 8;
10   dest->type += src[1];
11
12   dest->length = src[2] << 8;
13   dest->length += src[3];
14
15   dest->value = (u_char *) malloc(dest->length*sizeof(u_char));
16   memset(dest->value, 0, dest->length*sizeof(u_char));
17
18   memcpy(dest->value, &(src[4]), dest->length*sizeof(u_char));
19   
20   return dest;
21 }
22
23 struct aim_tlv_t *aim_grabtlvstr(u_char *src)
24 {
25   struct aim_tlv_t *dest = NULL;
26
27   dest = aim_createtlv();
28
29   dest->type = src[0] << 8;
30   dest->type += src[1];
31
32   dest->length = src[2] << 8;
33   dest->length += src[3];
34
35   dest->value = (u_char *) malloc((dest->length+1)*sizeof(u_char));
36   memset(dest->value, 0, (dest->length+1)*sizeof(u_char));
37
38   memcpy(dest->value, &(src[4]), dest->length*sizeof(u_char));
39   dest->value[dest->length] = '\0';
40
41   return dest;
42 }
43
44 int aim_puttlv (u_char *dest, struct aim_tlv_t *newtlv)
45 {
46   int i=0;
47
48   dest[i++] = newtlv->type >> 8;
49   dest[i++] = newtlv->type & 0x00FF;
50   dest[i++] = newtlv->length >> 8;
51   dest[i++] = newtlv->length & 0x00FF;
52   memcpy(&(dest[i]), newtlv->value, newtlv->length);
53   i+=newtlv->length;
54   return i;
55 }
56
57 struct aim_tlv_t *aim_createtlv(void)
58 {
59   struct aim_tlv_t *newtlv = NULL;
60   newtlv = (struct aim_tlv_t *)malloc(sizeof(struct aim_tlv_t));
61   memset(newtlv, 0, sizeof(struct aim_tlv_t));
62   return newtlv;
63 }
64
65 int aim_freetlv(struct aim_tlv_t **oldtlv)
66 {
67   if (!oldtlv)
68     return -1;
69   if (!*oldtlv)
70     return -1;
71   if ((*oldtlv)->value)
72     free((*oldtlv)->value);
73   free(*(oldtlv));
74   (*oldtlv) = NULL;
75
76   return 0;
77 }
78
79 int aim_puttlv_16(u_char *buf, u_short t, u_short v)
80 {
81   int curbyte=0;
82   curbyte += aimutil_put16(buf+curbyte, (u_short)(t&0xffff));
83   curbyte += aimutil_put16(buf+curbyte, (u_short)0x0002);
84   curbyte += aimutil_put16(buf+curbyte, (u_short)(v&0xffff));
85   return curbyte;
86 }
This page took 0.044924 seconds and 3 git commands to generate.