about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorAlexander Barton <alex@barton.de>2011-12-25 17:44:20 +0100
committerAlexander Barton <alex@barton.de>2011-12-25 17:44:20 +0100
commitae5ebfb9f0dc1b628a5eebbb39615b3483fe05db (patch)
tree81c4517fc3fa9e097d0c5ff9057f5b65854b7ac0 /src
parente9e6224aaeac6aab825caa12172bc207a00a86f9 (diff)
downloadngircd-ae5ebfb9f0dc1b628a5eebbb39615b3483fe05db.tar.gz
ngircd-ae5ebfb9f0dc1b628a5eebbb39615b3483fe05db.zip
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 :-)
Diffstat (limited to 'src')
-rw-r--r--src/ngircd/class.c7
-rw-r--r--src/ngircd/class.h2
-rw-r--r--src/ngircd/conn.c4
-rw-r--r--src/ngircd/lists.c48
-rw-r--r--src/ngircd/lists.h2
5 files changed, 55 insertions, 8 deletions
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- */