X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fngircd%2Flists.c;h=b0accd41edb6476a6d85e27567618b65402906dd;hb=5a424f60dad660815d89285da9a7a07e4991461a;hp=bab30f221be15766267347cf2a0f9f14ae5e92de;hpb=cde2e8a2775e8b01266627a60a08e2560eac42c8;p=ngircd-alex.git diff --git a/src/ngircd/lists.c b/src/ngircd/lists.c index bab30f22..b0accd41 100644 --- a/src/ngircd/lists.c +++ b/src/ngircd/lists.c @@ -34,8 +34,6 @@ #include "exp.h" #include "lists.h" -#define MASK_LEN (2*CLIENT_HOST_LEN) - struct list_elem { struct list_elem *next; /** pointer to next list element */ char mask[MASK_LEN]; /** IRC mask */ @@ -262,17 +260,13 @@ Lists_CheckDupeMask(const struct list_head *h, const char *Mask ) /** * Generate a valid IRC mask from "any" string given. * - * Attention: This mask is only valid until the next call to Lists_MakeMask(), - * because a single global buffer ist used! You have to copy the generated - * mask to some sane location yourself! - * * @param Pattern Source string to generate an IRC mask for. - * @return Pointer to global result buffer. + * @param mask Buffer to store the mask. + * @param len Size of the buffer. */ -GLOBAL const char * -Lists_MakeMask(const char *Pattern) +GLOBAL void +Lists_MakeMask(const char *Pattern, char *mask, size_t len) { - static char TheMask[MASK_LEN]; char *excl, *at; assert(Pattern != NULL); @@ -285,30 +279,22 @@ Lists_MakeMask(const char *Pattern) if (!at && !excl) { /* Neither "!" nor "@" found: use string as nickname */ - strlcpy(TheMask, Pattern, sizeof(TheMask) - 5); - strlcat(TheMask, "!*@*", sizeof(TheMask)); - return TheMask; - } - - if (!at && excl) { + strlcpy(mask, Pattern, len - 5); + strlcat(mask, "!*@*", len); + } else if (!at && excl) { /* Domain part is missing */ - strlcpy(TheMask, Pattern, sizeof(TheMask) - 3); - strlcat(TheMask, "@*", sizeof(TheMask)); - return TheMask; - } - - if (at && !excl) { + strlcpy(mask, Pattern, len - 3); + strlcat(mask, "@*", len); + } else if (at && !excl) { /* User name is missing */ *at = '\0'; at++; - strlcpy(TheMask, Pattern, sizeof(TheMask) - 5); - strlcat(TheMask, "!*@", sizeof(TheMask)); - strlcat(TheMask, at, sizeof(TheMask)); - return TheMask; + strlcpy(mask, Pattern, len - 5); + strlcat(mask, "!*@", len); + strlcat(mask, at, len); + } else { + /* All parts (nick, user and domain name) are given */ + strlcpy(mask, Pattern, len); } - - /* All parts (nick, user and domain name) are given */ - strlcpy(TheMask, Pattern, sizeof(TheMask)); - return TheMask; } /* Lists_MakeMask */ /** @@ -325,13 +311,12 @@ Lists_Check(struct list_head *h, CLIENT *Client) } /** - * Check if a client is listed in a list and store the reason if a buffer - * is provided. + * Check if a client is listed in a list and store the reason. * * @param h List head. * @param Client Client to check. - * @param reason Result buffer to store the reason. - * @param len Size of the buffer. + * @param reason Buffer to store the reason. + * @param len Size of the buffer if reason should be saved. * @return true if client is listed, false if not. */ bool