commit - 2fc61ce8a6a6c2ac8652b8cea33d57acd50681c2
commit + d28d838cb9a8488208c10ea73b25532e1aef8e06
blob - e74cd6eb1dfcc4358668a1c5ec18ec040471d697
blob + 02eb235754217588b7767d9d2a13e49a9f0a6201
--- src/ngircd/channel.c
+++ src/ngircd/channel.c
GLOBAL bool
-Channel_AddBan(CHANNEL *c, const char *mask )
+Channel_AddBan(CHANNEL *c, const char *mask, const char *who )
{
struct list_head *h = Channel_GetListBans(c);
LogDebug("Adding \"%s\" to \"%s\" ban list", mask, Channel_Name(c));
- return Lists_Add(h, mask, false, NULL);
+ return Lists_Add(h, mask, time(NULL), who, false);
}
GLOBAL bool
-Channel_AddExcept(CHANNEL *c, const char *mask )
+Channel_AddExcept(CHANNEL *c, const char *mask, const char *who )
{
struct list_head *h = Channel_GetListExcepts(c);
LogDebug("Adding \"%s\" to \"%s\" exception list", mask, Channel_Name(c));
- return Lists_Add(h, mask, false, NULL);
+ return Lists_Add(h, mask, time(NULL), who, false);
}
GLOBAL bool
-Channel_AddInvite(CHANNEL *c, const char *mask, bool onlyonce)
+Channel_AddInvite(CHANNEL *c, const char *mask, bool onlyonce, const char *who )
{
struct list_head *h = Channel_GetListInvites(c);
LogDebug("Adding \"%s\" to \"%s\" invite list", mask, Channel_Name(c));
- return Lists_Add(h, mask, onlyonce, NULL);
+ return Lists_Add(h, mask, time(NULL), who, onlyonce);
}
while (e) {
if (!IRC_WriteStrClient(Client, msg, Client_ID(Client),
Channel_Name(Channel),
- Lists_GetMask(e)))
+ Lists_GetMask(e),
+ Lists_GetReason(e),
+ Lists_GetValidity(e)))
return DISCONNECTED;
e = Lists_GetNext(e);
}
blob - 1bc77760942bbebbc2ed55d84d27dcc4f2d99651
blob + 0e96703d5bdcdf027c6ba9f2ba9b5404561c096c
--- src/ngircd/channel.h
+++ src/ngircd/channel.h
GLOBAL unsigned int Channel_CreationTime PARAMS(( CHANNEL *Chan ));
#endif
-GLOBAL bool Channel_AddBan PARAMS((CHANNEL *c, const char *Mask));
-GLOBAL bool Channel_AddExcept PARAMS((CHANNEL *c, const char *Mask));
+GLOBAL bool Channel_AddBan PARAMS((CHANNEL *c, const char *Mask, const char *who));
+GLOBAL bool Channel_AddExcept PARAMS((CHANNEL *c, const char *Mask, const char *who));
GLOBAL bool Channel_AddInvite PARAMS((CHANNEL *c, const char *Mask,
- bool OnlyOnce));
+ bool OnlyOnce, const char *who));
GLOBAL bool Channel_ShowBans PARAMS((CLIENT *client, CHANNEL *c));
GLOBAL bool Channel_ShowExcepts PARAMS((CLIENT *client, CHANNEL *c));
blob - 9ffa8b147471b18b8ee2a97d4914c162e21e6f44
blob + 0bd9397f215c625db75ca6e121786e6824d8682c
--- src/ngircd/class.c
+++ src/ngircd/class.c
Lists_MakeMask(Pattern, mask, sizeof(mask));
return Lists_Add(&My_Classes[Class], mask,
- ValidUntil, Reason);
+ ValidUntil, Reason, false);
}
GLOBAL void
blob - ec7d53c488a788be68eba3033100047ce77ea008
blob + 2f9225067a4aa503146c142c811ac224243052ed
--- src/ngircd/irc-mode.c
+++ src/ngircd/irc-mode.c
switch (what) {
case 'I':
- if (!Channel_AddInvite(Channel, mask, false))
+ if (!Channel_AddInvite(Channel, mask, false, Client_ID(Client)))
return CONNECTED;
break;
case 'b':
- if (!Channel_AddBan(Channel, mask))
+ if (!Channel_AddBan(Channel, mask, Client_ID(Client)))
return CONNECTED;
break;
case 'e':
- if (!Channel_AddExcept(Channel, mask))
+ if (!Channel_AddExcept(Channel, mask, Client_ID(Client)))
return CONNECTED;
break;
}
blob - 2e5c680aaa52ddde65b6a0ade839e90e96770cdb
blob + a309ee9f068fcba162c9f393a8b1d46633c3604c
--- src/ngircd/irc-op.c
+++ src/ngircd/irc-op.c
if (remember) {
/* We must remember this invite */
if (!Channel_AddInvite(chan, Client_MaskCloaked(target),
- true))
+ true, Client_ID(from)))
return CONNECTED;
}
}
blob - 247344e508a6e3daf3fc164d1e47ddbdc0e98152
blob + a091addb26860ed703c40ddc25eb5c0c65f1d582
--- src/ngircd/lists.c
+++ src/ngircd/lists.c
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;
};
/**
* 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)
}
/**
+ * 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.
*/
bool
Lists_Add(struct list_head *h, const char *Mask, time_t ValidUntil,
- const char *Reason)
+ const char *Reason, bool OnlyOnce)
{
struct list_elem *e, *newelem;
else
newelem->reason = NULL;
newelem->valid_until = ValidUntil;
+ newelem->onlyonce = OnlyOnce;
newelem->next = e;
h->first = newelem;
if (MatchCaseInsensitive(e->mask, Client_MaskCloaked(Client))) {
if (len && e->reason)
strlcpy(reason, e->reason, len);
- if (e->valid_until == 1) {
+ if (e->onlyonce) {
/* Entry is valid only once, delete it */
LogDebug("Deleted \"%s\" from list (used).",
e->mask);
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 + 070e4233efcaac596641bfb78626bfedb20c22ea
--- src/ngircd/lists.h
+++ src/ngircd/lists.h
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));
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));
blob - 8eba60ee6f13a119157e2e748789e50734ab8a37
blob + 8a7215b42172464a3f77204225292760fb47af5c
--- src/ngircd/messages.h
+++ src/ngircd/messages.h
#define RPL_TOPICSETBY_MSG "333 %s %s %s %u"
#define RPL_WHOISBOT_MSG "335 %s %s :is an IRC Bot"
#define RPL_INVITING_MSG "341 %s %s %s%s"
-#define RPL_INVITELIST_MSG "346 %s %s %s"
+#define RPL_INVITELIST_MSG "346 %s %s %s %s %d"
#define RPL_ENDOFINVITELIST_MSG "347 %s %s :End of channel invite list"
-#define RPL_EXCEPTLIST_MSG "348 %s %s %s"
+#define RPL_EXCEPTLIST_MSG "348 %s %s %s %s %d"
#define RPL_ENDOFEXCEPTLIST_MSG "349 %s %s :End of channel exception list"
#define RPL_VERSION_MSG "351 %s %s-%s.%s %s :%s"
#define RPL_WHOREPLY_MSG "352 %s %s %s %s %s %s %s :%d %s"
#define RPL_LINKS_MSG "364 %s %s %s :%d %s"
#define RPL_ENDOFLINKS_MSG "365 %s %s :End of LINKS list"
#define RPL_ENDOFNAMES_MSG "366 %s %s :End of NAMES list"
-#define RPL_BANLIST_MSG "367 %s %s %s"
+#define RPL_BANLIST_MSG "367 %s %s %s %s %d"
#define RPL_ENDOFBANLIST_MSG "368 %s %s :End of channel ban list"
#define RPL_ENDOFWHOWAS_MSG "369 %s %s :End of WHOWAS list"
#define RPL_INFO_MSG "371 %s :%s"