]>
Commit | Line | Data |
---|---|---|
9de3ca7e | 1 | |
2 | /* | |
3 | * | |
4 | * Various SNAC-related dodads... | |
5 | * | |
6 | * outstanding_snacs is a list of aim_snac_t structs. A SNAC should be added | |
7 | * whenever a new SNAC is sent and it should remain in the list until the | |
8 | * response for it has been receieved. | |
9 | * | |
10 | * First edition badly written by Adam Fritzler (afritz@delphid.ml.org) | |
11 | * Current edition nicely rewritten (it even works) by n (n@ml.org) | |
12 | * | |
13 | */ | |
14 | ||
a25832e6 | 15 | #include <faim/aim.h> |
9de3ca7e | 16 | |
a25832e6 | 17 | u_long aim_newsnac(struct aim_session_t *sess, |
18 | struct aim_snac_t *newsnac) | |
19 | { | |
20 | struct aim_snac_t *snac = NULL, *cur = NULL; | |
9de3ca7e | 21 | |
a25832e6 | 22 | if (!newsnac) |
23 | return 0; | |
9de3ca7e | 24 | |
a25832e6 | 25 | cur = sess->outstanding_snacs; |
9de3ca7e | 26 | |
a25832e6 | 27 | snac = calloc(1, sizeof(struct aim_snac_t)); |
28 | if (!snac) | |
29 | return 0; | |
30 | memcpy(snac, newsnac, sizeof(struct aim_snac_t)); | |
31 | snac->issuetime = time(&snac->issuetime); | |
32 | snac->next = NULL; | |
33 | ||
34 | if (cur == NULL) { | |
35 | sess->outstanding_snacs = snac; | |
36 | return(snac->id); | |
37 | } | |
38 | while (cur->next != NULL) | |
39 | cur = cur->next; | |
40 | cur->next = snac; | |
5b401785 | 41 | |
a25832e6 | 42 | return(snac->id); |
43 | } | |
9de3ca7e | 44 | |
a25832e6 | 45 | struct aim_snac_t *aim_remsnac(struct aim_session_t *sess, |
46 | u_long id) | |
47 | { | |
48 | struct aim_snac_t *cur; | |
5b401785 | 49 | |
50 | cur = sess->outstanding_snacs; | |
51 | ||
a25832e6 | 52 | if (cur == NULL) |
53 | return(NULL); | |
9de3ca7e | 54 | |
a25832e6 | 55 | if (cur->id == id) { |
56 | sess->outstanding_snacs = cur->next; | |
57 | return(cur); | |
58 | } | |
59 | while (cur->next != NULL) { | |
60 | if (cur->next->id == id) { | |
61 | struct aim_snac_t *tmp = NULL; | |
62 | ||
63 | tmp = cur->next; | |
64 | cur->next = cur->next->next; | |
65 | return(tmp); | |
66 | } | |
67 | cur = cur->next; | |
68 | } | |
69 | return(NULL); | |
9de3ca7e | 70 | } |
71 | ||
72 | /* | |
73 | * This is for cleaning up old SNACs that either don't get replies or | |
74 | * a reply was never received for. Garabage collection. Plain and simple. | |
75 | * | |
76 | * maxage is the _minimum_ age in seconds to keep SNACs (though I don't know | |
77 | * why its called _max_age). | |
78 | * | |
79 | */ | |
a25832e6 | 80 | int aim_cleansnacs(struct aim_session_t *sess, |
81 | int maxage) | |
9de3ca7e | 82 | { |
a25832e6 | 83 | struct aim_snac_t *cur; |
9de3ca7e | 84 | struct aim_snac_t *remed = NULL; |
85 | time_t curtime; | |
a25832e6 | 86 | |
87 | cur = sess->outstanding_snacs; | |
9de3ca7e | 88 | |
89 | curtime = time(&curtime); | |
a25832e6 | 90 | |
9de3ca7e | 91 | while (cur) |
92 | { | |
93 | if ( (cur) && (((cur->issuetime) + maxage) < curtime)) | |
94 | { | |
5b401785 | 95 | #if DEBUG > 1 |
128a9903 | 96 | printf("aimsnac: WARNING purged obsolete snac %08lx\n", cur->id); |
9de3ca7e | 97 | #endif |
a25832e6 | 98 | remed = aim_remsnac(sess, cur->id); |
9de3ca7e | 99 | if (remed) |
100 | { | |
101 | if (remed->data) | |
102 | free(remed->data); | |
103 | free(remed); | |
104 | } | |
105 | } | |
106 | cur = cur->next; | |
107 | } | |
a25832e6 | 108 | |
9de3ca7e | 109 | return 0; |
110 | } | |
111 | ||
112 | int aim_putsnac(u_char *buf, int family, int subtype, int flags, u_long snacid) | |
113 | { | |
114 | int curbyte = 0; | |
115 | curbyte += aimutil_put16(buf+curbyte, (u_short)(family&0xffff)); | |
116 | curbyte += aimutil_put16(buf+curbyte, (u_short)(subtype&0xffff)); | |
117 | curbyte += aimutil_put16(buf+curbyte, (u_short)(flags&0xffff)); | |
118 | curbyte += aimutil_put32(buf+curbyte, snacid); | |
119 | return curbyte; | |
120 | } |