/*
* 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
struct list_head My_Classes[CLASS_COUNT];
-char Reject_Reason[COMMAND_LEN];
-
GLOBAL void
Class_Init(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;
}
/**
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;
}
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], Mask, ValidUntil, Reason);
+ Lists_MakeMask(Pattern, mask, sizeof(mask));
+ return Lists_Add(&My_Classes[Class], mask,
+ ValidUntil, Reason);
}
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], Mask);
+ Lists_MakeMask(Pattern, mask, sizeof(mask));
+ Lists_Del(&My_Classes[Class], mask);
}
GLOBAL struct list_head *