X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fngircd%2Fclass.c;h=0bd9397f215c625db75ca6e121786e6824d8682c;hb=7207bef418c655107d3076b20dd797418ad82cd7;hp=0f617b8213d1ff3fe56a5cbf9babf58265080df9;hpb=1537c791320086df83b8fbecb057e70c7120ea12;p=ngircd-alex.git diff --git a/src/ngircd/class.c b/src/ngircd/class.c index 0f617b82..0bd9397f 100644 --- a/src/ngircd/class.c +++ b/src/ngircd/class.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors. + * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,25 +16,17 @@ * User class management. */ -#include "imp.h" #include +#include #include -#include "defines.h" -#include "array.h" #include "conn.h" -#include "client.h" #include "lists.h" -#include "match.h" -#include "stdio.h" -#include "exp.h" #include "class.h" struct list_head My_Classes[CLASS_COUNT]; -char Reject_Reason[COMMAND_LEN]; - GLOBAL void Class_Init(void) { @@ -49,32 +41,31 @@ Class_Exit(void) for (i = 0; i < CLASS_COUNT; Lists_Free(&My_Classes[i++])); } -GLOBAL char * -Class_GetMemberReason(const int Class, CLIENT *Client) +GLOBAL bool +Class_GetMemberReason(const int Class, CLIENT *Client, char *reason, size_t len) { - char *reason; + char str[COMMAND_LEN]; assert(Class < CLASS_COUNT); assert(Client != NULL); - reason = Lists_CheckReason(&My_Classes[Class], Client); - if (!reason) - return NULL; + strlcpy(str, "listed", sizeof(str)); - if (!*reason) - reason = "listed"; + if (!Lists_CheckReason(&My_Classes[Class], Client, str, sizeof(str))) + return false; switch(Class) { case CLASS_GLINE: - snprintf(Reject_Reason, sizeof(Reject_Reason), - "\"%s\" (G-Line)", reason); - return Reject_Reason; + snprintf(reason, len, "\"%s\" (G-Line)", str); + break; case CLASS_KLINE: - snprintf(Reject_Reason, sizeof(Reject_Reason), - "\"%s\" (K-Line)", reason); - return Reject_Reason; + snprintf(reason, len, "\"%s\" (K-Line)", str); + break; + default: + snprintf(reason, len, "%s", str); + break; } - return reason; + return true; } /** @@ -88,15 +79,13 @@ Class_GetMemberReason(const int Class, CLIENT *Client) GLOBAL bool Class_HandleServerBans(CLIENT *Client) { - char *rejectptr; + char reject[COMMAND_LEN]; assert(Client != NULL); - rejectptr = Class_GetMemberReason(CLASS_GLINE, Client); - if (!rejectptr) - rejectptr = Class_GetMemberReason(CLASS_KLINE, Client); - if (rejectptr) { - Client_Reject(Client, rejectptr, true); + if (Class_GetMemberReason(CLASS_GLINE, Client, reject, sizeof(reject)) || + Class_GetMemberReason(CLASS_KLINE, Client, reject, sizeof(reject))) { + Client_Reject(Client, reject, true); return DISCONNECTED; } @@ -105,24 +94,30 @@ Class_HandleServerBans(CLIENT *Client) GLOBAL bool -Class_AddMask(const int Class, const char *Mask, time_t ValidUntil, +Class_AddMask(const int Class, const char *Pattern, time_t ValidUntil, const char *Reason) { + char mask[MASK_LEN]; + assert(Class < CLASS_COUNT); - assert(Mask != NULL); + assert(Pattern != NULL); assert(Reason != NULL); - return Lists_Add(&My_Classes[Class], Lists_MakeMask(Mask), - ValidUntil, Reason); + Lists_MakeMask(Pattern, mask, sizeof(mask)); + return Lists_Add(&My_Classes[Class], mask, + ValidUntil, Reason, false); } GLOBAL void -Class_DeleteMask(const int Class, const char *Mask) +Class_DeleteMask(const int Class, const char *Pattern) { + char mask[MASK_LEN]; + assert(Class < CLASS_COUNT); - assert(Mask != NULL); + assert(Pattern != NULL); - Lists_Del(&My_Classes[Class], Lists_MakeMask(Mask)); + Lists_MakeMask(Pattern, mask, sizeof(mask)); + Lists_Del(&My_Classes[Class], mask); } GLOBAL struct list_head *