repo: ngircd action: commit revision: path_from: revision_from: af70c3dbc927c77167a26c1f4d8ed6bf2b97e3c5: path_to: revision_to:
commit af70c3dbc927c77167a26c1f4d8ed6bf2b97e3c5 Author: Alexander BartonDate: 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(). diff --git a/src/ngircd/channel.c b/src/ngircd/channel.c
--- 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
--- 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
--- 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
--- 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
--- 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
-----END OF PAGE-----