]> arthur.barton.de Git - ngircd-alex.git/blobdiff - src/ngircd/lists.c
Specify session context for OpenSSL clients
[ngircd-alex.git] / src / ngircd / lists.c
index 563dfa47ba3193bdd30707067d42d1157be35639..a091addb26860ed703c40ddc25eb5c0c65f1d582 100644 (file)
@@ -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)
@@ -74,6 +75,19 @@ Lists_GetValidity(const struct list_elem *e)
        return e->valid_until;
 }
 
+/**
+ * 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.
  *
@@ -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)
 {
        struct list_elem *e, *newelem;
 
@@ -148,6 +162,7 @@ Lists_Add(struct list_head *h, const char *Mask, time_t ValidUntil,
        else
                newelem->reason = NULL;
        newelem->valid_until = ValidUntil;
+       newelem->onlyonce = OnlyOnce;
        newelem->next = e;
        h->first = newelem;
 
@@ -285,6 +300,7 @@ Lists_MakeMask(const char *Pattern, char *mask, size_t len)
                strlcpy(mask, Pattern, len - 5);
                strlcat(mask, "!*@", len);
                strlcat(mask, at, len);
+               at--; *at = '@';
        } else {
                /* All parts (nick, user and domain name) are given */
                strlcpy(mask, Pattern, len);
@@ -325,10 +341,10 @@ Lists_CheckReason(struct list_head *h, CLIENT *Client, char *reason, size_t len)
 
        while (e) {
                next = e->next;
-               if (Match(e->mask, Client_MaskCloaked(Client))) {
+               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);
@@ -362,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,