repo: ngircd action: commit revision: path_from: revision_from: ae5ebfb9f0dc1b628a5eebbb39615b3483fe05db: path_to: revision_to:
commit ae5ebfb9f0dc1b628a5eebbb39615b3483fe05db Author: Alexander BartonDate: 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 :-) diff --git a/src/ngircd/class.c b/src/ngircd/class.c
--- 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
--- 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
--- 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
--- 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
--- 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- */
-----END OF PAGE-----