]> jfr.im git - solanum.git/blobdiff - ircd/client.c
blacklist: this didn't get committed somehow
[solanum.git] / ircd / client.c
index 1c8504fe9a6ba22890c8713c2d2beb98a3f7bea0..86ca8fcccfeb9b05a3081c2f37663c25382316b3 100644 (file)
 
 #include "client.h"
 #include "class.h"
-#include "common.h"
 #include "hash.h"
 #include "match.h"
 #include "ircd.h"
 #include "numeric.h"
 #include "packet.h"
-#include "s_auth.h"
+#include "authd.h"
 #include "s_conf.h"
 #include "s_newconf.h"
 #include "logger.h"
@@ -48,7 +47,6 @@
 #include "hook.h"
 #include "msg.h"
 #include "monitor.h"
-#include "blacklist.h"
 #include "reject.h"
 #include "scache.h"
 #include "rb_dictionary.h"
@@ -77,9 +75,9 @@ static rb_bh *pclient_heap = NULL;
 static rb_bh *user_heap = NULL;
 static rb_bh *away_heap = NULL;
 static char current_uid[IDLEN];
-static int32_t current_connid = 0;
+static uint32_t current_connid = 0;
 
-struct Dictionary *nd_dict = NULL;
+rb_dictionary *nd_dict = NULL;
 
 enum
 {
@@ -130,6 +128,78 @@ init_client(void)
        nd_dict = rb_dictionary_create("nickdelay", irccmp);
 }
 
+/*
+ * connid_get - allocate a connid
+ *
+ * inputs       - none
+ * outputs      - a connid token which is used to represent a logical circuit
+ * side effects - current_connid is incremented, possibly multiple times.
+ *                the association of the connid to it's client is committed.
+ */
+uint32_t
+connid_get(struct Client *client_p)
+{
+       s_assert(MyClient(client_p));
+       if (!MyClient(client_p))
+               return 0;
+
+       /* find a connid that is available */
+       while (find_cli_connid_hash(++current_connid) != NULL)
+       {
+               /* handle wraparound, current_connid must NEVER be 0 */
+               if (current_connid == 0)
+                       ++current_connid;
+       }
+
+       add_to_cli_connid_hash(client_p, current_connid);
+       rb_dlinkAddAlloc(RB_UINT_TO_POINTER(current_connid), &client_p->localClient->connids);
+
+       return current_connid;
+}
+
+/*
+ * connid_put - free a connid
+ *
+ * inputs       - connid to free
+ * outputs      - nothing
+ * side effects - connid bookkeeping structures are freed
+ */
+void
+connid_put(uint32_t id)
+{
+       struct Client *client_p;
+
+       s_assert(id != 0);
+       if (id == 0)
+               return;
+
+       client_p = find_cli_connid_hash(id);
+       if (client_p == NULL)
+               return;
+
+       del_from_cli_connid_hash(id);
+       rb_dlinkFindDestroy(RB_UINT_TO_POINTER(id), &client_p->localClient->connids);
+}
+
+/*
+ * client_release_connids - release any connids still attached to a client
+ *
+ * inputs       - client to garbage collect
+ * outputs      - none
+ * side effects - client's connids are garbage collected
+ */
+void
+client_release_connids(struct Client *client_p)
+{
+       rb_dlink_node *ptr, *ptr2;
+
+       s_assert(MyClient(client_p));
+       if (!MyClient(client_p))
+               return;
+
+       RB_DLINK_FOREACH_SAFE(ptr, ptr2, client_p->localClient->connids.head)
+               connid_put(RB_POINTER_TO_UINT(ptr->data));
+}
 
 /*
  * make_client - create a new Client struct and set it to initial state.
@@ -161,17 +231,6 @@ make_client(struct Client *from)
 
                client_p->localClient->F = NULL;
 
-               if(current_connid+1 == 0)
-                       current_connid++;
-
-               client_p->localClient->connid = ++current_connid;
-
-               if(current_connid+1 == 0)
-                       current_connid++;
-
-               client_p->localClient->zconnid = ++current_connid;
-               add_to_cli_connid_hash(client_p);
-
                client_p->preClient = rb_bh_alloc(pclient_heap);
 
                /* as good a place as any... */
@@ -193,17 +252,15 @@ make_client(struct Client *from)
 void
 free_pre_client(struct Client *client_p)
 {
-       struct Blacklist *blptr;
-
        s_assert(NULL != client_p);
 
        if(client_p->preClient == NULL)
                return;
 
-       blptr = client_p->preClient->dnsbl_listed;
-       if (blptr != NULL)
-               unref_blacklist(blptr);
-       s_assert(rb_dlink_list_length(&client_p->preClient->dnsbl_queries) == 0);
+       s_assert(client_p->preClient->authd_cid == 0);
+
+       rb_free(client_p->preClient->authd_data);
+       rb_free(client_p->preClient->authd_reason);
 
        rb_bh_free(pclient_heap, client_p->preClient);
        client_p->preClient = NULL;
@@ -230,7 +287,7 @@ free_local_client(struct Client *client_p)
                client_p->localClient->listener = 0;
        }
 
-       del_from_cli_connid_hash(client_p);
+       client_release_connids(client_p);
        if(client_p->localClient->F != NULL)
        {
                rb_close(client_p->localClient->F);
@@ -394,9 +451,8 @@ check_unknowns_list(rb_dlink_list * list)
                if(IsDead(client_p) || IsClosing(client_p))
                        continue;
 
-               /* still has DNSbls to validate against */
-               if(client_p->preClient != NULL &&
-                               rb_dlink_list_length(&client_p->preClient->dnsbl_queries) > 0)
+               /* Still querying with authd */
+               if(client_p->preClient != NULL && client_p->preClient->authd_cid != 0)
                        continue;
 
                /*
@@ -1295,8 +1351,7 @@ static int
 exit_unknown_client(struct Client *client_p, struct Client *source_p, struct Client *from,
                  const char *comment)
 {
-       delete_auth_queries(source_p);
-       abort_blacklist_queries(source_p);
+       authd_abort_client(client_p);
        rb_dlinkDelete(&source_p->localClient->tnode, &unknown_list);
 
        if(!IsIOError(source_p))
@@ -1950,7 +2005,7 @@ close_connection(struct Client *client_p)
        else
                ServerStats.is_ni++;
 
-       del_from_cli_connid_hash(client_p);
+       client_release_connids(client_p);
 
        if(client_p->localClient->F != NULL)
        {