X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fngircd%2Flists.c;h=4f57ca73521f6b65f568d0aefa9c60b844a685c6;hb=391aa8d1f714d5dc2fc1b47ec466082169ef2177;hp=8e120bfeb16a059bf17d043dd440bd69c587cfe7;hpb=2b95c69ea19c6711bb98ee048ee71cee94c5dde9;p=ngircd-alex.git diff --git a/src/ngircd/lists.c b/src/ngircd/lists.c index 8e120bfe..4f57ca73 100644 --- a/src/ngircd/lists.c +++ b/src/ngircd/lists.c @@ -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 : ""; } /** @@ -126,8 +126,15 @@ 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 (Reason) { + free(e->reason); + e->reason = strdup(Reason); + } return true; + } e = Lists_GetFirst(h); @@ -240,17 +247,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; } /** @@ -313,7 +320,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; @@ -324,14 +344,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 */ @@ -339,13 +351,73 @@ 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 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- */