commit 4396936f383cfc8098e43cece8e4b2af8f0a6fa4 from: LucentW date: Mon May 11 20:15:01 2015 UTC Implement timestamp tracking of invites Now lists nodes also have the "onlyonce" field, since the valid_until is used to keep the timestamp of placing. Found no references to onlyonce or about valid_until being == 1, though, so it might be unused, but still available for other enhancements. commit - 4da04640e6429e6cc61ca9dd4c7293b520d4b3bc commit + 4396936f383cfc8098e43cece8e4b2af8f0a6fa4 blob - a7c97d51bcfc01c047e1e3eb4522c99486561ca3 blob + d8ee7b70e9854603f2834f294380ab6475585140 --- src/ngircd/channel.c +++ src/ngircd/channel.c @@ -1120,7 +1120,7 @@ Channel_AddInvite(CHANNEL *c, const char *mask, bool o { struct list_head *h = Channel_GetListInvites(c); LogDebug("Adding \"%s\" to \"%s\" invite list", mask, Channel_Name(c)); - return Lists_Add(h, mask, onlyonce, who); + return Lists_Add(h, mask, time(NULL), who, onlyonce); } blob - 247344e508a6e3daf3fc164d1e47ddbdc0e98152 blob + 2ca67e9d444079c00952926a289d6cc1f8a27fcc --- src/ngircd/lists.c +++ src/ngircd/lists.c @@ -32,7 +32,8 @@ struct list_elem { struct list_elem *next; /** pointer to next list element */ char mask[MASK_LEN]; /** IRC mask */ char *reason; /** Optional "reason" text */ - time_t valid_until; /** 0: unlimited; 1: once; t(>1): until t */ + time_t valid_until; /** 0: unlimited; t(>0): until t */ + bool onlyonce; }; /** @@ -65,7 +66,7 @@ Lists_GetReason(const struct list_elem *e) * Get "validity" value stored in list element. * * @param list_elem List element. - * @return Validity: 0=unlimited, 1=once, >1 until this time stamp. + * @return Validity: 0=unlimited, >0 until this time stamp. */ GLOBAL time_t Lists_GetValidity(const struct list_elem *e) @@ -75,6 +76,19 @@ Lists_GetValidity(const struct list_elem *e) } /** + * Get "onlyonce" value stored in list element. + * + * @param list_elem List element. + * @return True if the element was stored for single use, false otherwise. + */ +GLOBAL bool +Lists_GetOnlyOnce(const struct list_elem *e) +{ + assert(e != NULL); + return e->onlyonce; +} + +/** * Get first list element of a list. * * @param h List head. @@ -111,7 +125,7 @@ Lists_GetNext(const struct list_elem *e) */ bool Lists_Add(struct list_head *h, const char *Mask, time_t ValidUntil, - const char *Reason) + const char *Reason, bool OnlyOnce = false) { struct list_elem *e, *newelem; @@ -148,6 +162,7 @@ Lists_Add(struct list_head *h, const char *Mask, time_ else newelem->reason = NULL; newelem->valid_until = ValidUntil; + newelem->onlyonce = OnlyOnce; newelem->next = e; h->first = newelem; @@ -363,7 +378,7 @@ Lists_Expire(struct list_head *h, const char *ListName while (e) { next = e->next; - if (e->valid_until > 1 && e->valid_until < now) { + if (e->valid_until > 0 && e->valid_until < now) { /* Entry is expired, delete it */ if (e->reason) Log(LOG_INFO, blob - db0f11a9603691f9eb64f5fcf90b638c007a0876 blob + 4206151ed06558c22526a7f87eca0acf23fadde9 --- src/ngircd/lists.h +++ src/ngircd/lists.h @@ -36,7 +36,7 @@ GLOBAL struct list_elem *Lists_CheckDupeMask PARAMS((c const char *mask)); GLOBAL bool Lists_Add PARAMS((struct list_head *h, const char *Mask, - time_t ValidUntil, const char *Reason)); + time_t ValidUntil, const char *Reason, bool OnlyOnce)); GLOBAL void Lists_Del PARAMS((struct list_head *head, const char *Mask)); GLOBAL unsigned long Lists_Count PARAMS((struct list_head *h)); @@ -46,6 +46,7 @@ GLOBAL void Lists_MakeMask PARAMS((const char *Pattern 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)); +GLOBAL bool Lists_GetOnlyOnce PARAMS((const struct list_elem *e)); GLOBAL void Lists_Expire PARAMS((struct list_head *h, const char *ListName));