55 |
|
} |
56 |
|
|
57 |
|
void |
58 |
< |
resv_delete(struct ResvItem *resv) |
58 |
> |
resv_delete(struct ResvItem *resv, bool expired) |
59 |
|
{ |
60 |
+ |
if (expired == true) |
61 |
+ |
sendto_realops_flags(UMODE_EXPIRATION, L_ALL, SEND_NOTICE, "Temporary RESV for [%s] expired", |
62 |
+ |
resv->mask); |
63 |
+ |
|
64 |
|
while (resv->exempt_list.head) |
65 |
|
{ |
66 |
|
struct ResvExemptItem *exempt = resv->exempt_list.head->data; |
140 |
|
struct ResvItem * |
141 |
|
resv_find(const char *name, int (*compare)(const char *, const char *)) |
142 |
|
{ |
143 |
< |
dlink_node *node; |
143 |
> |
dlink_node *node, *node_next; |
144 |
|
dlink_list *list; |
145 |
|
|
146 |
|
if (IsChanPrefix(*name)) |
148 |
|
else |
149 |
|
list = &resv_nick_list; |
150 |
|
|
151 |
< |
DLINK_FOREACH(node, list->head) |
151 |
> |
DLINK_FOREACH_SAFE(node, node_next, list->head) |
152 |
|
{ |
153 |
|
struct ResvItem *resv = node->data; |
154 |
|
|
155 |
< |
if (compare(resv->mask, name) == 0) |
155 |
> |
if (resv->expire && |
156 |
> |
(resv->expire <= event_base->time.sec_real)) |
157 |
> |
resv_delete(resv, true); |
158 |
> |
else if (compare(resv->mask, name) == 0) |
159 |
|
return resv; |
160 |
|
} |
161 |
|
|
212 |
|
struct ResvItem *resv = node->data; |
213 |
|
|
214 |
|
if (resv->in_database == false) |
215 |
< |
resv_delete(resv); |
215 |
> |
resv_delete(resv, false); |
216 |
|
} |
217 |
|
} |
218 |
|
} |
230 |
|
{ |
231 |
|
struct ResvItem *resv = node->data; |
232 |
|
|
233 |
< |
if (resv->expire == 0 || resv->expire > event_base->time.sec_real) |
234 |
< |
continue; |
235 |
< |
|
229 |
< |
sendto_realops_flags(UMODE_EXPIRATION, L_ALL, SEND_NOTICE, "Temporary RESV for [%s] expired", |
230 |
< |
resv->mask); |
231 |
< |
resv_delete(resv); |
233 |
> |
if (resv->expire && |
234 |
> |
(resv->expire <= event_base->time.sec_real)) |
235 |
> |
resv_delete(resv, true); |
236 |
|
} |
237 |
|
} |
238 |
|
} |