]> arthur.barton.de Git - ngircd-alex.git/blobdiff - src/ngircd/lists.c
Lists_Add(): use size of destination when copying data
[ngircd-alex.git] / src / ngircd / lists.c
index d3f26e2e8077c946aca4239d81721d2bf119abe5..45a4874b6e94f268aa2a0942cdf249c4aec12a24 100644 (file)
@@ -60,13 +60,13 @@ Lists_GetMask(const struct list_elem *e)
  * Get optional "reason" text stored in list element.
  *
  * @param list_elem List element.
- * @return Pointer to "reason" text or NULL.
+ * @return Pointer to "reason" text or empty string ("").
  */
 GLOBAL const char *
 Lists_GetReason(const struct list_elem *e)
 {
        assert(e != NULL);
-       return e->reason;
+       return e->reason ? e->reason : "";
 }
 
 /**
@@ -129,14 +129,10 @@ Lists_Add(struct list_head *h, const char *Mask, time_t ValidUntil,
        e = Lists_CheckDupeMask(h, Mask);
        if (e) {
                e->valid_until = ValidUntil;
-               if (e->reason)
+               if (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!");
+                       e->reason = strdup(Reason);
+               }
                return true;
        }
 
@@ -153,7 +149,8 @@ Lists_Add(struct list_head *h, const char *Mask, time_t ValidUntil,
        if (Reason) {
                newelem->reason = malloc(strlen(Reason) + 1);
                if (newelem->reason)
-                       strlcpy(newelem->reason, Reason, strlen(Reason) + 1);
+                       strlcpy(newelem->reason, Reason,
+                               sizeof(newelem->reason));
                else
                        Log(LOG_EMERG,
                            "Can't allocate memory for new list reason text!");
@@ -324,7 +321,20 @@ Lists_MakeMask(const char *Pattern)
  * @return true if client is listed, false if not.
  */
 bool
-Lists_Check( struct list_head *h, CLIENT *Client)
+Lists_Check(struct list_head *h, CLIENT *Client)
+{
+       return Lists_CheckReason(h, Client) != NULL;
+}
+
+/**
+ * Check if a client is listed in a list and return the "reason".
+ *
+ * @param h List head.
+ * @param Client Client to check.
+ * @return true if client is listed, false if not.
+ */
+char *
+Lists_CheckReason(struct list_head *h, CLIENT *Client)
 {
        struct list_elem *e, *last, *next;
 
@@ -342,13 +352,13 @@ Lists_Check( struct list_head *h, CLIENT *Client)
                                         e->mask);
                                Lists_Unlink(h, last, e);
                        }
-                       return true;
+                       return e->reason ? e->reason : "";
                }
                last = e;
                e = next;
        }
 
-       return false;
+       return NULL;
 }
 
 /**
@@ -389,4 +399,26 @@ Lists_Expire(struct list_head *h, const char *ListName)
        }
 }
 
+/**
+ * Return the number of entries of a list.
+ *
+ * @param h List head.
+ * @return Number of items.
+ */
+GLOBAL unsigned long
+Lists_Count(struct list_head *h)
+{
+       struct list_elem *e;
+       unsigned long count = 0;
+
+       assert(h != NULL);
+
+       e = h->first;
+       while (e) {
+               count++;
+               e = e->next;
+       }
+       return count;
+}
+
 /* -eof- */