| 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 * |