]> arthur.barton.de Git - ngircd-alex.git/blobdiff - src/ngircd/lists.c
List expiration: use same log level as when setting
[ngircd-alex.git] / src / ngircd / lists.c
index d98dc6c847ec85cf9d13fca676bb78f26e5dd4df..b842ec82e319bbf3812d3b8a16a93e5b0bbe5c39 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * ngIRCd -- The Next Generation IRC Daemon
- * Copyright (c)2001-2011 Alexander Barton (alex@barton.de) and Contributors.
+ * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * Management of IRC lists: ban, invite, etc.
  */
 
-#include "imp.h"
 #include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include <time.h>
 
-#include "defines.h"
 #include "conn.h"
-#include "channel.h"
 #include "log.h"
 #include "match.h"
-#include "messages.h"
-#include "irc-write.h"
 
-#include <stdlib.h>
-#include <string.h>
-#include <strings.h>
-
-#include "exp.h"
 #include "lists.h"
 
 struct list_elem {
        struct list_elem *next; /** pointer to next list element */
        char mask[MASK_LEN];    /** IRC mask */
        char *reason;           /** Optional "reason" text */
-       time_t valid_until;     /** 0: unlimited; 1: once; t(>1): until t */
+       time_t valid_until;     /** 0: unlimited; t(>0): until t */
+       bool onlyonce;
 };
 
 /**
@@ -71,7 +66,7 @@ Lists_GetReason(const struct list_elem *e)
  * Get "validity" value stored in list element.
  *
  * @param list_elem List element.
- * @return Validity: 0=unlimited, 1=once, >1 until this time stamp.
+ * @return Validity: 0=unlimited, >0 until this time stamp.
  */
 GLOBAL time_t
 Lists_GetValidity(const struct list_elem *e)
@@ -80,6 +75,19 @@ Lists_GetValidity(const struct list_elem *e)
        return e->valid_until;
 }
 
+/**
+ * Get "onlyonce" value stored in list element.
+ *
+ * @param list_elem List element.
+ * @return True if the element was stored for single use, false otherwise.
+ */
+GLOBAL bool
+Lists_GetOnlyOnce(const struct list_elem *e)
+{
+       assert(e != NULL);
+       return e->onlyonce;
+}
+
 /**
  * Get first list element of a list.
  *
@@ -117,7 +125,7 @@ Lists_GetNext(const struct list_elem *e)
  */
 bool
 Lists_Add(struct list_head *h, const char *Mask, time_t ValidUntil,
-         const char *Reason)
+         const char *Reason, bool OnlyOnce)
 {
        struct list_elem *e, *newelem;
 
@@ -154,6 +162,7 @@ Lists_Add(struct list_head *h, const char *Mask, time_t ValidUntil,
        else
                newelem->reason = NULL;
        newelem->valid_until = ValidUntil;
+       newelem->onlyonce = OnlyOnce;
        newelem->next = e;
        h->first = newelem;
 
@@ -279,18 +288,19 @@ Lists_MakeMask(const char *Pattern, char *mask, size_t len)
 
        if (!at && !excl) {
                /* Neither "!" nor "@" found: use string as nickname */
-               strlcpy(mask, Pattern, len);
+               strlcpy(mask, Pattern, len - 5);
                strlcat(mask, "!*@*", len);
        } else if (!at && excl) {
                /* Domain part is missing */
-               strlcpy(mask, Pattern, len);
+               strlcpy(mask, Pattern, len - 3);
                strlcat(mask, "@*", len);
        } else if (at && !excl) {
                /* User name is missing */
                *at = '\0'; at++;
-               strlcpy(mask, Pattern, len);
+               strlcpy(mask, Pattern, len - 5);
                strlcat(mask, "!*@", len);
                strlcat(mask, at, len);
+               at--; *at = '@';
        } else {
                /* All parts (nick, user and domain name) are given */
                strlcpy(mask, Pattern, len);
@@ -331,10 +341,10 @@ Lists_CheckReason(struct list_head *h, CLIENT *Client, char *reason, size_t len)
 
        while (e) {
                next = e->next;
-               if (Match(e->mask, Client_MaskCloaked(Client))) {
+               if (MatchCaseInsensitive(e->mask, Client_MaskCloaked(Client))) {
                        if (len && e->reason)
                                strlcpy(reason, e->reason, len);
-                       if (e->valid_until == 1) {
+                       if (e->onlyonce) {
                                /* Entry is valid only once, delete it */
                                LogDebug("Deleted \"%s\" from list (used).",
                                         e->mask);
@@ -368,14 +378,14 @@ Lists_Expire(struct list_head *h, const char *ListName)
 
        while (e) {
                next = e->next;
-               if (e->valid_until > 1 && e->valid_until < now) {
+               if (e->valid_until > 0 && e->valid_until < now) {
                        /* Entry is expired, delete it */
                        if (e->reason)
-                               Log(LOG_INFO,
+                               Log(LOG_NOTICE|LOG_snotice,
                                    "Deleted \"%s\" (\"%s\") from %s list (expired).",
                                    e->mask, e->reason, ListName);
                        else
-                               Log(LOG_INFO,
+                               Log(LOG_NOTICE|LOG_snotice,
                                    "Deleted \"%s\" from %s list (expired).",
                                    e->mask, ListName);
                        Lists_Unlink(h, last, e);