rb_free(client_p->localClient->passwd);
}
+ rb_free(client_p->localClient->auth_user);
+
+ if(client_p->localClient->override_timeout_event)
+ {
+ rb_event_delete(client_p->localClient->override_timeout_event);
+ }
+
rb_free(client_p->localClient->challenge);
rb_free(client_p->localClient->fullcaps);
rb_free(client_p->localClient->opername);
s_assert(&me != client_p);
free_local_client(client_p);
free_pre_client(client_p);
+ rb_free(client_p->certfp);
rb_bh_free(client_heap, client_p);
}
sendto_realops_snomask(SNO_GENERAL, L_ALL,
"XLINE over-ruled for %s, client is kline_exempt [%s]",
get_client_name(client_p, HIDE_IP),
- aconf->name);
+ aconf->host);
continue;
}
*
*/
void
-dead_link(struct Client *client_p)
+dead_link(struct Client *client_p, int sendqex)
{
struct abort_client *abt;
abt = (struct abort_client *) rb_malloc(sizeof(struct abort_client));
- if(client_p->flags & FLAGS_SENDQEX)
+ if(sendqex)
rb_strlcpy(abt->notice, "Max SendQ exceeded", sizeof(abt->notice));
else
rb_snprintf(abt->notice, sizeof(abt->notice), "Write error: %s", strerror(errno));
make_user(struct Client *client_p)
{
struct User *user;
+ struct Dictionary *metadata;
user = client_p->user;
if(!user)
user = (struct User *) rb_bh_alloc(user_heap);
user->refcnt = 1;
client_p->user = user;
+
+ metadata = irc_dictionary_create(irccmp);
+ client_p->user->metadata = metadata;
}
return user;
}
* side effects - add's an Server information block to a client
* if it was not previously allocated.
*/
-server_t *
+struct Server *
make_server(struct Client *client_p)
{
- server_t *serv = client_p->serv;
+ struct Server *serv = client_p->serv;
if(!serv)
{
- serv = (server_t *) rb_malloc(sizeof(server_t));
+ serv = (struct Server *) rb_malloc(sizeof(struct Server));
client_p->serv = serv;
}
return client_p->serv;
{
free_away(client_p);
+ /* get rid of any metadata the user may have */
+ user_metadata_clear(client_p);
+
if(--user->refcnt <= 0)
{
if(user->away)
rb_free((char *) user->away);
+
/*
* sanity check
*/
exit_client(client_p, client_p, &me, errmsg);
}
+
+/*
+ * user_metadata_add
+ *
+ * inputs - pointer to client struct
+ * - name of metadata item you wish to add
+ * - value of metadata item
+ * - 1 if metadata should be propegated, 0 if not
+ * output - none
+ * side effects - metadata is added to the user in question
+ * - metadata is propegated if propegate is set.
+ */
+struct Metadata *
+user_metadata_add(struct Client *target, const char *name, const char *value, int propegate)
+{
+ struct Metadata *md;
+
+ md = rb_malloc(sizeof(struct Metadata));
+ md->name = rb_strdup(name);
+ md->value = rb_strdup(value);
+
+ irc_dictionary_add(target->user->metadata, md->name, md);
+
+ if(propegate)
+ sendto_match_servs(&me, "*", CAP_ENCAP, NOCAPS, "ENCAP * METADATA ADD %s %s :%s",
+ target->name, name, value);
+
+ return md;
+}
+
+/*
+ * user_metadata_delete
+ *
+ * inputs - pointer to client struct
+ * - name of metadata item you wish to delete
+ * output - none
+ * side effects - metadata is deleted from the user in question
+ * - deletion is propegated if propegate is set
+ */
+void
+user_metadata_delete(struct Client *target, const char *name, int propegate)
+{
+ struct Metadata *md = user_metadata_find(target, name);
+
+ if(!md)
+ return;
+
+ irc_dictionary_delete(target->user->metadata, md->name);
+
+ rb_free(md);
+
+ if(propegate)
+ sendto_match_servs(&me, "*", CAP_ENCAP, NOCAPS, "ENCAP * METADATA DELETE %s %s",
+ target->name, name);
+}
+
+/*
+ * user_metadata_find
+ *
+ * inputs - pointer to client struct
+ * - name of metadata item you wish to read
+ * output - the requested metadata, if it exists, elsewise null.
+ * side effects -
+ */
+struct Metadata *
+user_metadata_find(struct Client *target, const char *name)
+{
+ if(!target->user)
+ return NULL;
+
+ if(!target->user->metadata)
+ return NULL;
+
+ return irc_dictionary_retrieve(target->user->metadata, name);
+}
+/*
+ * user_metadata_clear
+ *
+ * inputs - pointer to user struct
+ * output - none
+ * side effects - metadata is cleared from the user in question
+ */
+void
+user_metadata_clear(struct Client *target)
+{
+ struct Metadata *md;
+ struct DictionaryIter iter;
+
+ DICTIONARY_FOREACH(md, &iter, target->user->metadata)
+ {
+ user_metadata_delete(target, md->name, 0);
+ }
+}