1
0
mirror of https://github.com/osmarks/ngircd.git synced 2025-01-31 17:49:11 +00:00

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.
This commit is contained in:
Alexander Barton 2011-12-24 13:34:25 +01:00
parent 872dc5042d
commit fea2194fc0
2 changed files with 23 additions and 12 deletions

View File

@ -1,6 +1,6 @@
/* /*
* ngIRCd -- The Next Generation IRC Daemon * 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 * 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 * it under the terms of the GNU General Public License as published by
@ -39,7 +39,7 @@
struct list_elem { struct list_elem {
struct list_elem *next; struct list_elem *next;
char mask[MASK_LEN]; 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 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; 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 )); strlcpy( newelem->mask, Mask, sizeof( newelem->mask ));
newelem->onlyonce = OnlyOnce; newelem->valid_until = ValidUntil;
newelem->next = e; newelem->next = e;
header->first = newelem; header->first = newelem;
@ -213,23 +213,34 @@ Lists_MakeMask(const char *Pattern)
bool bool
Lists_Check( struct list_head *header, CLIENT *Client) Lists_Check( struct list_head *header, CLIENT *Client)
{ {
struct list_elem *e, *last; struct list_elem *e, *last, *next;
assert( header != NULL ); assert( header != NULL );
e = header->first; e = header->first;
last = NULL; last = NULL;
while( e ) { while (e) {
if( Match( e->mask, Client_Mask( Client ))) { next = e->next;
if( e->onlyonce ) { /* delete entry */ if (e->valid_until > 1 && e->valid_until < time(NULL)) {
LogDebug("Deleted \"%s\" from list", e->mask); /* 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); Lists_Unlink(header, last, e);
} }
return true; return true;
} }
last = e; last = e;
e = e->next; e = next;
} }
return false; return false;

View File

@ -1,6 +1,6 @@
/* /*
* ngIRCd -- The Next Generation IRC Daemon * 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 * 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 * 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_Check PARAMS((struct list_head *head, CLIENT *client ));
GLOBAL bool Lists_CheckDupeMask PARAMS((const struct list_head *head, const char *mask )); 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 void Lists_Del PARAMS((struct list_head *head, const char *Mask ));
GLOBAL bool Lists_AlreadyRegistered PARAMS(( const struct list_head *head, const char *Mask)); GLOBAL bool Lists_AlreadyRegistered PARAMS(( const struct list_head *head, const char *Mask));