src/protocols/oscar/snac.c

changeset 4617
35d860860593
parent 4333
f4c095774bc2
child 8735
01248ea222d3
equal deleted inserted replaced
4616:177e05ba38a3 4617:35d860860593
88 88
89 for (prev = (aim_snac_t **)&sess->snac_hash[index]; (cur = *prev); ) { 89 for (prev = (aim_snac_t **)&sess->snac_hash[index]; (cur = *prev); ) {
90 if (cur->id == id) { 90 if (cur->id == id) {
91 *prev = cur->next; 91 *prev = cur->next;
92 if (cur->flags & AIM_SNACFLAGS_DESTRUCTOR) { 92 if (cur->flags & AIM_SNACFLAGS_DESTRUCTOR) {
93 struct aim_snac_destructor *asd = cur->data; 93 free(cur->data);
94 cur->data = asd->data; 94 cur->data = NULL;
95 free(asd);
96 } 95 }
97 return cur; 96 return cur;
98 } else 97 } else
99 prev = &cur->next; 98 prev = &cur->next;
100 } 99 }
101 100
102 return cur; 101 return cur;
103 } 102 }
104
105 /* Free a SNAC, and call the appropriate destructor if necessary.
106 */
107 faim_internal faim_shortfunc void aim_cleansnac(aim_session_t *sess, aim_snac_t *snac)
108 {
109 aim_module_t *cur;
110
111 if (snac->flags & AIM_SNACFLAGS_DESTRUCTOR) {
112 struct aim_snac_destructor *d = snac->data;
113 aim_modsnac_t modsnac;
114
115 modsnac.id = snac->id;
116 modsnac.subtype = snac->type;
117 modsnac.family = snac->family;
118 modsnac.flags = snac->flags;
119
120 for (cur = (aim_module_t *)sess->modlistv; cur; cur = cur->next)
121 {
122 if (!cur->snacdestructor)
123 continue;
124 if (!(cur->flags & AIM_MODFLAG_MULTIFAMILY) &&
125 (cur->family != modsnac.family))
126 continue;
127 if (cur->snacdestructor(sess, d->conn, &modsnac,
128 d->data))
129 break;
130 }
131 free(d->data);
132 }
133
134 free(snac->data);
135 free(snac);
136 }
137
138 103
139 /* 104 /*
140 * This is for cleaning up old SNACs that either don't get replies or 105 * This is for cleaning up old SNACs that either don't get replies or
141 * a reply was never received for. Garabage collection. Plain and simple. 106 * a reply was never received for. Garabage collection. Plain and simple.
142 * 107 *
159 for (prev = (aim_snac_t **)&sess->snac_hash[i]; (cur = *prev); ) { 124 for (prev = (aim_snac_t **)&sess->snac_hash[i]; (cur = *prev); ) {
160 if ((curtime - cur->issuetime) > maxage) { 125 if ((curtime - cur->issuetime) > maxage) {
161 126
162 *prev = cur->next; 127 *prev = cur->next;
163 128
164 aim_cleansnac(sess, cur); 129 free(cur->data);
130 free(cur);
165 } else 131 } else
166 prev = &cur->next; 132 prev = &cur->next;
167 } 133 }
168 } 134 }
169 135

mercurial