]> arthur.barton.de Git - ngircd-alex.git/blobdiff - src/ngircd/lists.c
Don't stop join handling on faulty channel, skip it
[ngircd-alex.git] / src / ngircd / lists.c
index 8e120bfeb16a059bf17d043dd440bd69c587cfe7..d3f26e2e8077c946aca4239d81721d2bf119abe5 100644 (file)
@@ -126,8 +126,19 @@ Lists_Add(struct list_head *h, const char *Mask, time_t ValidUntil,
        assert(h != NULL);
        assert(Mask != NULL);
 
-       if (Lists_CheckDupeMask(h, Mask))
+       e = Lists_CheckDupeMask(h, Mask);
+       if (e) {
+               e->valid_until = ValidUntil;
+               if (e->reason)
+                       free(e->reason);
+               e->reason = malloc(strlen(Reason) + 1);
+               if (e->reason)
+                       strlcpy(e->reason, Reason, strlen(Reason) + 1);
+               else
+                       Log(LOG_EMERG,
+                           "Can't allocate memory for new list reason text!");
                return true;
+       }
 
        e = Lists_GetFirst(h);
 
@@ -240,17 +251,17 @@ Lists_Free(struct list_head *head)
  * @param Mask IRC mask to test.
  * @return true if mask is already stored in the list, false otherwise.
  */
-GLOBAL bool
+GLOBAL struct list_elem *
 Lists_CheckDupeMask(const struct list_head *h, const char *Mask )
 {
        struct list_elem *e;
        e = h->first;
        while (e) {
                if (strcasecmp(e->mask, Mask) == 0)
-                       return true;
+                       return e;
                e = e->next;
        }
-       return false;
+       return NULL;
 }
 
 /**
@@ -324,14 +335,6 @@ Lists_Check( struct list_head *h, CLIENT *Client)
 
        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 +351,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- */