From: Alexander Barton Date: Sun, 25 Dec 2011 16:44:20 +0000 (+0100) Subject: New functions Lists_Expire() and Class_Expire() X-Git-Tag: rel-19-rc1~100 X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=ngircd-alex.git;a=commitdiff_plain;h=ae5ebfb9f0dc1b628a5eebbb39615b3483fe05db New functions Lists_Expire() and Class_Expire() GLINE and KLINE lists are cleared automatically now, not when they are checked. So "STATS g" and "STATS k" no longer show expired entries :-) --- diff --git a/src/ngircd/class.c b/src/ngircd/class.c index dd10ac81..1a4d4c0b 100644 --- a/src/ngircd/class.c +++ b/src/ngircd/class.c @@ -83,4 +83,11 @@ Class_GetList(const int Class) return My_Classes[Class]; } +GLOBAL void +Class_Expire(void) +{ + Lists_Expire(&My_Classes[CLASS_GLINE], "G-Line"); + Lists_Expire(&My_Classes[CLASS_KLINE], "K-Line"); +} + /* -eof- */ diff --git a/src/ngircd/class.h b/src/ngircd/class.h index b93c3b68..3507836f 100644 --- a/src/ngircd/class.h +++ b/src/ngircd/class.h @@ -33,6 +33,8 @@ GLOBAL bool Class_IsMember PARAMS((const int Class, CLIENT *Client)); GLOBAL struct list_head Class_GetList PARAMS((const int Class)); +GLOBAL void Class_Expire PARAMS((void)); + #endif /* __class_h__ */ /* -eof- */ diff --git a/src/ngircd/conn.c b/src/ngircd/conn.c index aa754eb4..4d5c223c 100644 --- a/src/ngircd/conn.c +++ b/src/ngircd/conn.c @@ -65,6 +65,7 @@ #include "ngircd.h" #include "array.h" #include "client.h" +#include "class.h" #include "conf.h" #include "conn-ssl.h" #include "conn-zip.h" @@ -742,6 +743,9 @@ Conn_Handler(void) Check_Servers(); Check_Connections(); + /* Expire outdated class/list items */ + Class_Expire(); + /* Look for non-empty read buffers ... */ for (i = 0; i < Pool_Size; i++) { if ((My_Connections[i].sock > NONE) diff --git a/src/ngircd/lists.c b/src/ngircd/lists.c index 8e120bfe..63c16b0d 100644 --- a/src/ngircd/lists.c +++ b/src/ngircd/lists.c @@ -316,22 +316,16 @@ bool Lists_Check( struct list_head *h, CLIENT *Client) { 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 < 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 */ @@ -348,4 +342,42 @@ Lists_Check( struct list_head *h, CLIENT *Client) 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- */ diff --git a/src/ngircd/lists.h b/src/ngircd/lists.h index 316b1345..f9a4c91c 100644 --- a/src/ngircd/lists.h +++ b/src/ngircd/lists.h @@ -47,6 +47,8 @@ GLOBAL const char *Lists_GetMask PARAMS((const struct list_elem *e)); GLOBAL const char *Lists_GetReason PARAMS((const struct list_elem *e)); GLOBAL time_t Lists_GetValidity PARAMS((const struct list_elem *e)); +GLOBAL void Lists_Expire PARAMS((struct list_head *h, const char *ListName)); + #endif /* -eof- */