* USA
*/
#include "stdinc.h"
-#include "config.h"
+#include "defaults.h"
#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 "authproc.h"
#include "s_conf.h"
#include "s_newconf.h"
#include "logger.h"
#include "hook.h"
#include "msg.h"
#include "monitor.h"
-#include "blacklist.h"
#include "reject.h"
#include "scache.h"
-#include "irc_dictionary.h"
+#include "rb_dictionary.h"
#include "sslproc.h"
+#include "wsproc.h"
#include "s_assert.h"
#define DEBUG_EXITED_CLIENTS
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
{
rb_event_addish("exit_aborted_clients", exit_aborted_clients, NULL, 1);
rb_event_add("flood_recalc", flood_recalc, NULL, 1);
- nd_dict = irc_dictionary_create("nickdelay", irccmp);
+ 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(MyConnect(client_p));
+ if (!MyConnect(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;
+
+ if (client_p->localClient->connids.head)
+ s_assert(MyConnect(client_p));
+
+ if (!MyConnect(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.
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... */
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->auth.cid == 0);
+
+ rb_free(client_p->preClient->auth.data);
+ rb_free(client_p->preClient->auth.reason);
rb_bh_free(pclient_heap, client_p->preClient);
client_p->preClient = NULL;
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);
if (client_p->localClient->privset)
privilegeset_unref(client_p->localClient->privset);
- if(IsSSL(client_p))
- ssld_decrement_clicount(client_p->localClient->ssl_ctl);
+ if (IsSSL(client_p))
+ ssld_decrement_clicount(client_p->localClient->ssl_ctl);
+
+ if (IsCapable(client_p, CAP_ZIP))
+ ssld_decrement_clicount(client_p->localClient->z_ctl);
- if(IsCapable(client_p, CAP_ZIP))
- ssld_decrement_clicount(client_p->localClient->z_ctl);
+ if (client_p->localClient->ws_ctl != NULL)
+ wsockd_decrement_clicount(client_p->localClient->ws_ctl);
rb_bh_free(lclient_heap, client_p->localClient);
client_p->localClient = NULL;
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->auth.cid != 0)
continue;
/*
void
check_klines_event(void *unused)
{
- kline_queued = 0;
+ kline_queued = false;
check_klines();
}
if(IsMe(client_p))
continue;
- if((aconf = find_dline((struct sockaddr *)&client_p->localClient->ip,client_p->localClient->ip.ss_family)) != NULL)
+ if((aconf = find_dline((struct sockaddr *)&client_p->localClient->ip, GET_SS_FAMILY(&client_p->localClient->ip))) != NULL)
{
if(aconf->status & CONF_EXEMPTDLINE)
continue;
{
client_p = ptr->data;
- if((aconf = find_dline((struct sockaddr *)&client_p->localClient->ip,client_p->localClient->ip.ss_family)) != NULL)
+ if((aconf = find_dline((struct sockaddr *)&client_p->localClient->ip, GET_SS_FAMILY(&client_p->localClient->ip))) != NULL)
{
if(aconf->status & CONF_EXEMPTDLINE)
continue;
{
s_assert(0);
sendto_realops_snomask(SNO_GENERAL, L_ALL,
- "On abort_list: %s stat: %u flags: %u/%u handler: %c",
+ "On abort_list: %s stat: %u flags: %llu handler: %c",
target_p->name, (unsigned int) target_p->status,
- target_p->flags, target_p->flags2, target_p->handler);
+ (unsigned long long)target_p->flags, target_p->handler);
sendto_realops_snomask(SNO_GENERAL, L_ALL,
"Please report this to the charybdis developers!");
found++;
{
s_assert(0);
sendto_realops_snomask(SNO_GENERAL, L_ALL,
- "On dead_list: %s stat: %u flags: %u/%u handler: %c",
+ "On dead_list: %s stat: %u flags: %llu handler: %c",
abt->client->name, (unsigned int) abt->client->status,
- abt->client->flags, abt->client->flags2, abt->client->handler);
+ (unsigned long long)abt->client->flags, abt->client->handler);
sendto_realops_snomask(SNO_GENERAL, L_ALL,
"Please report this to the charybdis developers!");
continue;
}
/*
- * This assumes IsUnknown(source_p) == TRUE and MyConnect(source_p) == TRUE
+ * This assumes IsUnknown(source_p) == true and MyConnect(source_p) == true
*/
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))
/*
- * This assumes IsPerson(source_p) == TRUE && MyConnect(source_p) == TRUE
+ * This assumes IsPerson(source_p) == true && MyConnect(source_p) == true
*/
static int
if(user->refcnt < 0 || user->invited.head || user->channel.head)
{
sendto_realops_snomask(SNO_GENERAL, L_ALL,
- "* %#lx user (%s!%s@%s) %#lx %#lx %#lx %lu %d *",
- (unsigned long) client_p,
+ "* %p user (%s!%s@%s) %p %p %p %lu %d *",
+ client_p,
client_p ? client_p->
name : "<noname>",
client_p->username,
client_p->host,
- (unsigned long) user,
- (unsigned long) user->invited.head,
- (unsigned long) user->channel.head,
+ user,
+ user->invited.head,
+ user->channel.head,
rb_dlink_list_length(&user->channel),
user->refcnt);
s_assert(!user->refcnt);
else
ServerStats.is_ni++;
- del_from_cli_connid_hash(client_p);
+ client_release_connids(client_p);
if(client_p->localClient->F != NULL)
{