Module: ngircd.git Branch: master Commit: ae5ebfb9f0dc1b628a5eebbb39615b3483fe05db URL: http://ngircd.barton.de/cgi-bin/gitweb.cgi?p=ngircd.git&a=commit;h=ae5eb...
Author: Alexander Barton alex@barton.de Date: Sun Dec 25 17:44:20 2011 +0100
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 :-)
---
src/ngircd/class.c | 7 +++++++ src/ngircd/class.h | 2 ++ src/ngircd/conn.c | 4 ++++ src/ngircd/lists.c | 48 ++++++++++++++++++++++++++++++++++++++++-------- src/ngircd/lists.h | 2 ++ 5 files changed, 55 insertions(+), 8 deletions(-)
diff --git a/src/ngircd/class.c b/src/ngircd/class.c index dd10ac8..1a4d4c0 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 b93c3b6..3507836 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 aa754eb..4d5c223 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 8e120bf..63c16b0 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 316b134..f9a4c91 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- */
ngircd-commits@lists.barton.de