* 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 : "";
}
/**
assert(h != NULL);
assert(Mask != NULL);
- if (Lists_CheckDupeMask(h, Mask))
+ e = Lists_CheckDupeMask(h, Mask);
+ if (e) {
+ e->valid_until = ValidUntil;
+ if (Reason) {
+ free(e->reason);
+ e->reason = strdup(Reason);
+ }
return true;
+ }
e = Lists_GetFirst(h);
strlcpy(newelem->mask, Mask, sizeof(newelem->mask));
if (Reason) {
- newelem->reason = malloc(strlen(Reason) + 1);
- if (newelem->reason)
- strlcpy(newelem->reason, Reason, strlen(Reason) + 1);
- else
+ newelem->reason = strdup(Reason);
+ if (!newelem->reason)
Log(LOG_EMERG,
"Can't allocate memory for new list reason text!");
}
* @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;
}
/**
excl = NULL;
if (!at && !excl) {
- /* Neither "!" nor "@" found: use string as nick name */
+ /* Neither "!" nor "@" found: use string as nickname */
strlcpy(TheMask, Pattern, sizeof(TheMask) - 5);
strlcat(TheMask, "!*@*", sizeof(TheMask));
return TheMask;
* @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;
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 */
e->mask);
Lists_Unlink(h, last, e);
}
- return true;
+ return e->reason ? e->reason : "";
+ }
+ last = e;
+ e = next;
+ }
+
+ return NULL;
+}
+
+/**
+ * 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;
}
+}
+
+/**
+ * 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);
- return false;
+ e = h->first;
+ while (e) {
+ count++;
+ e = e->next;
+ }
+ return count;
}
/* -eof- */