Module: ngircd.git Branch: master Commit: af70c3dbc927c77167a26c1f4d8ed6bf2b97e3c5 URL: http://ngircd.barton.de/cgi-bin/gitweb.cgi?p=ngircd.git&a=commit;h=af70c...
Author: Alexander Barton alex@barton.de Date: Sun Dec 25 14:19:45 2011 +0100
List and class handling: add optional "reason" text
Adjust Lists_Add() and Class_AddMask() accordingly, implement Lists_GetReason() and Lists_GetValidity().
---
src/ngircd/channel.c | 4 ++-- src/ngircd/class.c | 6 ++++-- src/ngircd/class.h | 2 +- src/ngircd/lists.c | 45 +++++++++++++++++++++++++++++++++++++++++---- src/ngircd/lists.h | 7 +++++-- 5 files changed, 53 insertions(+), 11 deletions(-)
diff --git a/src/ngircd/channel.c b/src/ngircd/channel.c index 74c97a0..2dbf53a 100644 --- a/src/ngircd/channel.c +++ b/src/ngircd/channel.c @@ -1003,7 +1003,7 @@ Channel_AddBan(CHANNEL *c, const char *mask ) { struct list_head *h = Channel_GetListBans(c); LogDebug("Adding "%s" to "%s" %s list", mask, Channel_Name(c), "ban"); - return Lists_Add(h, mask, false); + return Lists_Add(h, mask, false, NULL); }
@@ -1012,7 +1012,7 @@ Channel_AddInvite(CHANNEL *c, const char *mask, bool onlyonce) { struct list_head *h = Channel_GetListInvites(c); LogDebug("Adding "%s" to "%s" %s list", mask, Channel_Name(c), "invite"); - return Lists_Add(h, mask, onlyonce); + return Lists_Add(h, mask, onlyonce, NULL); }
diff --git a/src/ngircd/class.c b/src/ngircd/class.c index ee034f2..aeecaae 100644 --- a/src/ngircd/class.c +++ b/src/ngircd/class.c @@ -56,12 +56,14 @@ Class_IsMember(const int Class, CLIENT *Client) }
GLOBAL bool -Class_AddMask(const int Class, const char *Mask, time_t ValidUntil) +Class_AddMask(const int Class, const char *Mask, time_t ValidUntil, + const char *Reason) { assert(Class < CLASS_COUNT); assert(Mask != NULL); + assert(Reason != NULL);
- return Lists_Add(&My_Classes[Class], Mask, ValidUntil); + return Lists_Add(&My_Classes[Class], Mask, ValidUntil, Reason); }
GLOBAL void diff --git a/src/ngircd/class.h b/src/ngircd/class.h index 5b04eea..deb60f4 100644 --- a/src/ngircd/class.h +++ b/src/ngircd/class.h @@ -26,7 +26,7 @@ GLOBAL void Class_Init PARAMS((void)); GLOBAL void Class_Exit PARAMS((void));
GLOBAL bool Class_AddMask PARAMS((const int Class, const char *Mask, - const time_t ValidUntil)); + const time_t ValidUntil, const char *Reason)); GLOBAL void Class_DeleteMask PARAMS((const int Class, const char *Mask));
GLOBAL bool Class_IsMember PARAMS((const int Class, CLIENT *Client)); diff --git a/src/ngircd/lists.c b/src/ngircd/lists.c index 1101ea0..9a10ac7 100644 --- a/src/ngircd/lists.c +++ b/src/ngircd/lists.c @@ -39,6 +39,7 @@ struct list_elem { struct list_elem *next; char mask[MASK_LEN]; + char *reason; time_t valid_until; /** 0: unlimited; 1: once; t(>1): until t */ };
@@ -49,6 +50,19 @@ Lists_GetMask(const struct list_elem *e) return e->mask; }
+GLOBAL const char * +Lists_GetReason(const struct list_elem *e) +{ + assert(e != NULL); + return e->reason; +} + +GLOBAL time_t +Lists_GetValidity(const struct list_elem *e) +{ + assert(e != NULL); + return e->valid_until; +}
GLOBAL struct list_elem* Lists_GetFirst(const struct list_head *h) @@ -63,9 +77,18 @@ Lists_GetNext(const struct list_elem *e) return e->next; }
- +/** + * Add a new mask to a list. + * + * @param header List head. + * @param Mask The IRC mask to add to the list. + * @param ValidUntil 0: unlimited, 1: only once, t>1: until given time_t. + * @param Reason Reason string or NULL, if no reason should be saved. + * @return true on success, false otherwise. + */ bool -Lists_Add(struct list_head *header, const char *Mask, time_t ValidUntil ) +Lists_Add(struct list_head *header, const char *Mask, time_t ValidUntil, + const char *Reason) { struct list_elem *e, *newelem;
@@ -82,7 +105,17 @@ Lists_Add(struct list_head *header, const char *Mask, time_t ValidUntil ) return false; }
- strlcpy( newelem->mask, Mask, sizeof( newelem->mask )); + 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 + Log(LOG_EMERG, + "Can't allocate memory for new list reason text!"); + } + else + newelem->reason = NULL; newelem->valid_until = ValidUntil; newelem->next = e; header->first = newelem; @@ -100,6 +133,8 @@ Lists_Unlink(struct list_head *header, struct list_elem *p, struct list_elem *vi if (p) p->next = victim->next; else header->first = victim->next;
+ if (victim->reason) + free(victim->reason); free(victim); }
@@ -141,7 +176,9 @@ Lists_Free(struct list_head *head) LogDebug("Deleted "%s" from invite list" , e->mask); victim = e; e = e->next; - free( victim ); + if (victim->reason) + free(victim->reason); + free(victim); } }
diff --git a/src/ngircd/lists.h b/src/ngircd/lists.h index 7422d60..5dd1a68 100644 --- a/src/ngircd/lists.h +++ b/src/ngircd/lists.h @@ -32,7 +32,8 @@ GLOBAL struct list_elem *Lists_GetNext PARAMS((const struct list_elem *)); GLOBAL bool Lists_Check PARAMS((struct list_head *head, CLIENT *client )); GLOBAL bool Lists_CheckDupeMask PARAMS((const struct list_head *head, const char *mask ));
-GLOBAL bool Lists_Add PARAMS((struct list_head *header, const char *Mask, time_t ValidUntil )); +GLOBAL bool Lists_Add PARAMS((struct list_head *header, const char *Mask, + time_t ValidUntil, const char *Reason)); GLOBAL void Lists_Del PARAMS((struct list_head *head, const char *Mask ));
GLOBAL bool Lists_AlreadyRegistered PARAMS(( const struct list_head *head, const char *Mask)); @@ -40,7 +41,9 @@ GLOBAL bool Lists_AlreadyRegistered PARAMS(( const struct list_head *head, const GLOBAL void Lists_Free PARAMS(( struct list_head *head ));
GLOBAL const char *Lists_MakeMask PARAMS((const char *Pattern)); -GLOBAL const char *Lists_GetMask PARAMS(( const struct list_elem *e )); +GLOBAL const char *Lists_GetMask PARAMS((const struct list_elem *e)); +GLOBAL const char *Lists_GetReason PARAMS((const struct list_elem *e)); +GLOBAL time_t Lists_GetValidity PARAMS((const struct list_elem *e));
#endif
ngircd-commits@lists.barton.de