Module: ngircd.git Branch: master Commit: fea2194fc066af6f3b47fd94a93359dbd7aab8ff URL: http://ngircd.barton.de/cgi-bin/gitweb.cgi?p=ngircd.git&a=commit;h=fea21...
Author: Alexander Barton alex@barton.de Date: Sat Dec 24 13:34:25 2011 +0100
Lists: change "only once" property into "valid until"
The old "only once" true/false behavior is still supported, so there are no other code changes required.
---
src/ngircd/lists.c | 31 +++++++++++++++++++++---------- src/ngircd/lists.h | 4 ++-- 2 files changed, 23 insertions(+), 12 deletions(-)
diff --git a/src/ngircd/lists.c b/src/ngircd/lists.c index b30326d..1101ea0 100644 --- a/src/ngircd/lists.c +++ b/src/ngircd/lists.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2005 Alexander Barton (alex@barton.de) + * Copyright (c)2001-2011 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 @@ -39,7 +39,7 @@ struct list_elem { struct list_elem *next; char mask[MASK_LEN]; - bool onlyonce; + time_t valid_until; /** 0: unlimited; 1: once; t(>1): until t */ };
@@ -65,7 +65,7 @@ Lists_GetNext(const struct list_elem *e)
bool -Lists_Add(struct list_head *header, const char *Mask, bool OnlyOnce ) +Lists_Add(struct list_head *header, const char *Mask, time_t ValidUntil ) { struct list_elem *e, *newelem;
@@ -83,7 +83,7 @@ Lists_Add(struct list_head *header, const char *Mask, bool OnlyOnce ) }
strlcpy( newelem->mask, Mask, sizeof( newelem->mask )); - newelem->onlyonce = OnlyOnce; + newelem->valid_until = ValidUntil; newelem->next = e; header->first = newelem;
@@ -213,23 +213,34 @@ Lists_MakeMask(const char *Pattern) bool Lists_Check( struct list_head *header, CLIENT *Client) { - struct list_elem *e, *last; + struct list_elem *e, *last, *next;
assert( header != NULL );
e = header->first; last = NULL;
- while( e ) { - if( Match( e->mask, Client_Mask( Client ))) { - if( e->onlyonce ) { /* delete entry */ - LogDebug("Deleted "%s" from list", e->mask); + 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(header, last, e); + e = next; + continue; + } + if (Match(e->mask, Client_Mask(Client))) { + if (e->valid_until == 1 ) { + /* Entry is valid only once, delete it */ + LogDebug("Deleted "%s" from list (used).", + e->mask); Lists_Unlink(header, last, e); } return true; } last = e; - e = e->next; + e = next; }
return false; diff --git a/src/ngircd/lists.h b/src/ngircd/lists.h index 28f5478..7422d60 100644 --- a/src/ngircd/lists.h +++ b/src/ngircd/lists.h @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001,2002 by Alexander Barton (alex@barton.de) + * Copyright (c)2001-2011 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 @@ -32,7 +32,7 @@ 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, bool OnlyOnce )); +GLOBAL bool Lists_Add PARAMS((struct list_head *header, const char *Mask, time_t ValidUntil )); 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));