assert(h != NULL);
assert(Mask != NULL);
- if (Lists_CheckDupeMask(h, Mask))
+ e = Lists_CheckDupeMask(h, Mask);
+ if (e) {
+ e->valid_until = ValidUntil;
+ if (e->reason)
+ free(e->reason);
+ e->reason = malloc(strlen(Reason) + 1);
+ if (e->reason)
+ strlcpy(e->reason, Reason, strlen(Reason) + 1);
+ else
+ Log(LOG_EMERG,
+ "Can't allocate memory for new list reason text!");
return true;
+ }
e = Lists_GetFirst(h);
* @param Mask IRC mask to test.
* @return true if mask is already stored in the list, false otherwise.
*/
-GLOBAL bool
+GLOBAL struct list_elem *
Lists_CheckDupeMask(const struct list_head *h, const char *Mask )
{
struct list_elem *e;
e = h->first;
while (e) {
if (strcasecmp(e->mask, Mask) == 0)
- return true;
+ return e;
e = e->next;
}
- return false;
+ return NULL;
}
/**
while (e) {
next = e->next;
- if (e->valid_until > 1 && e->valid_until < time(NULL)) {
- /* Entry is expired, delete it */
- LogDebug("Deleted \"%s\" from list (expired).",
- e->mask);
- Lists_Unlink(h, last, e);
- e = next;
- continue;
- }
if (Match(e->mask, Client_Mask(Client))) {
if (e->valid_until == 1) {
/* Entry is valid only once, delete it */
return false;
}
+/**
+ * Check list and purge expired entries.
+ *
+ * @param h List head.
+ */
+GLOBAL void
+Lists_Expire(struct list_head *h, const char *ListName)
+{
+ struct list_elem *e, *last, *next;
+ time_t now;
+
+ assert(h != NULL);
+
+ e = h->first;
+ last = NULL;
+ now = time(NULL);
+
+ while (e) {
+ next = e->next;
+ if (e->valid_until > 1 && e->valid_until < now) {
+ /* Entry is expired, delete it */
+ if (e->reason)
+ Log(LOG_INFO,
+ "Deleted \"%s\" (\"%s\") from %s list (expired).",
+ e->mask, e->reason, ListName);
+ else
+ Log(LOG_INFO,
+ "Deleted \"%s\" from %s list (expired).",
+ e->mask, ListName);
+ Lists_Unlink(h, last, e);
+ e = next;
+ continue;
+ }
+ last = e;
+ e = next;
+ }
+}
+
/* -eof- */