nickdelay -> dictionary.

This commit is contained in:
William Pitcock 2007-12-03 10:59:25 -06:00
parent 3e91d7006f
commit b37021a45e
8 changed files with 26 additions and 55 deletions

View File

@ -29,13 +29,16 @@
#include "tools.h"
struct Dictionary;
extern dlink_list *clientTable;
extern dlink_list *channelTable;
extern dlink_list *idTable;
extern dlink_list *resvTable;
extern dlink_list *hostTable;
extern dlink_list *helpTable;
extern dlink_list *ndTable;
extern struct Dictionary *nd_dict;
/* Magic value for FNV hash functions */
#define FNV1_32_INIT 0x811c9dc5UL
@ -101,9 +104,6 @@ extern void add_to_help_hash(const char *name, struct cachefile *hptr);
extern void clear_help_hash(void);
extern struct cachefile *hash_find_help(const char *name, int flags);
extern void add_to_nd_hash(const char *name, struct nd_entry *nd);
extern struct nd_entry *hash_find_nd(const char *name);
extern void hash_stats(struct Client *);
#endif /* INCLUDED_hash_h */

View File

@ -249,9 +249,6 @@ struct nd_entry
{
char name[NICKLEN+1];
time_t expire;
unsigned int hashv;
dlink_node hnode; /* node in hash */
dlink_node lnode; /* node in ll */
};

View File

@ -156,7 +156,7 @@ mr_nick(struct Client *client_p, struct Client *source_p, int parc, const char *
return 0;
}
if(hash_find_nd(nick))
if(irc_dictionary_find(nd_dict, nick))
{
sendto_one(source_p, form_str(ERR_UNAVAILRESOURCE),
me.name, EmptyString(source_p->name) ? "*" : source_p->name, nick);
@ -217,7 +217,7 @@ m_nick(struct Client *client_p, struct Client *source_p, int parc, const char *p
return 0;
}
if(hash_find_nd(nick))
if(irc_dictionary_find(nd_dict, nick))
{
sendto_one(source_p, form_str(ERR_UNAVAILRESOURCE),
me.name, EmptyString(source_p->name) ? "*" : source_p->name, nick);
@ -890,7 +890,7 @@ change_remote_nick(struct Client *client_p, struct Client *source_p,
del_from_client_hash(source_p->name, source_p);
/* invalidate nick delay when a remote client uses the nick.. */
if((nd = hash_find_nd(nick)))
if((nd = irc_dictionary_retrieve(nd_dict, nick)))
free_nd_entry(nd);
strcpy(source_p->name, nick);
@ -1225,7 +1225,7 @@ register_client(struct Client *client_p, struct Client *server,
}
/* remove any nd entries for this nick */
if((nd = hash_find_nd(nick)))
if((nd = irc_dictionary_retrieve(nd_dict, nick)))
free_nd_entry(nd);
add_to_client_hash(nick, source_p);

View File

@ -259,7 +259,7 @@ me_nickdelay(struct Client *client_p, struct Client *source_p, int parc, const c
duration = atoi(parv[1]);
if (duration <= 0)
{
nd = hash_find_nd(parv[2]);
nd = irc_dictionary_retrieve(nd_dict, parv[2]);
if (nd != NULL)
free_nd_entry(nd);
}
@ -268,7 +268,7 @@ me_nickdelay(struct Client *client_p, struct Client *source_p, int parc, const c
if (duration > 86400)
duration = 86400;
add_nd_entry(parv[2]);
nd = hash_find_nd(parv[2]);
nd = irc_dictionary_retrieve(nd_dict, parv[2]);
if (nd != NULL)
nd->expire = CurrentTime + duration;
}

View File

@ -259,16 +259,13 @@ static void
stats_delay(struct Client *source_p)
{
struct nd_entry *nd;
dlink_node *ptr;
int i;
struct DictionaryIter iter;
HASH_WALK(i, U_MAX, ptr, ndTable)
DICTIONARY_FOREACH(nd, &iter, nd_dict)
{
nd = ptr->data;
sendto_one_notice(source_p, "Delaying: %s for %ld",
nd->name, (long) nd->expire);
}
HASH_WALK_END
}
static void

View File

@ -1,10 +1,11 @@
/*
* ircd-ratbox: A slightly useful ircd.
* charybdis: an advanced ircd.
* client.c: Controls clients.
*
* Copyright (C) 1990 Jarkko Oikarinen and University of Oulu, Co Center
* Copyright (C) 1996-2002 Hybrid Development Team
* Copyright (C) 2002-2005 ircd-ratbox development team
* Copyright (C) 2007 William Pitcock
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -60,6 +61,7 @@
#include "blacklist.h"
#include "reject.h"
#include "scache.h"
#include "irc_dictionary.h"
#define DEBUG_EXITED_CLIENTS

View File

@ -45,9 +45,8 @@ dlink_list *clientTable;
dlink_list *channelTable;
dlink_list *idTable;
dlink_list *resvTable;
dlink_list *hostTable;
dlink_list *hostTable;
dlink_list *helpTable;
dlink_list *ndTable;
/*
* look in whowas.c for the missing ...[WW_MAX]; entry
@ -95,7 +94,6 @@ init_hash(void)
{
clientTable = MyMalloc(sizeof(dlink_list) * U_MAX);
idTable = MyMalloc(sizeof(dlink_list) * U_MAX);
ndTable = MyMalloc(sizeof(dlink_list) * U_MAX);
channelTable = MyMalloc(sizeof(dlink_list) * CH_MAX);
hostTable = MyMalloc(sizeof(dlink_list) * HOST_MAX);
resvTable = MyMalloc(sizeof(dlink_list) * R_MAX);
@ -306,13 +304,6 @@ add_to_help_hash(const char *name, struct cachefile *hptr)
dlinkAddAlloc(hptr, &helpTable[hashv]);
}
void
add_to_nd_hash(const char *name, struct nd_entry *nd)
{
nd->hashv = hash_nick(name);
dlinkAdd(nd, &nd->hnode, &ndTable[nd->hashv]);
}
/* del_from_id_hash()
*
* removes an id from the id hash table
@ -733,29 +724,6 @@ clear_resv_hash(void)
HASH_WALK_END
}
struct nd_entry *
hash_find_nd(const char *name)
{
struct nd_entry *nd;
dlink_node *ptr;
unsigned int hashv;
if(EmptyString(name))
return NULL;
hashv = hash_nick(name);
DLINK_FOREACH(ptr, ndTable[hashv].head)
{
nd = ptr->data;
if(!irccmp(name, nd->name))
return nd;
}
return NULL;
}
static void
output_hash(struct Client *source_p, const char *name, int length, int *counts, int deepest)
{

View File

@ -48,6 +48,7 @@
#include "balloc.h"
#include "event.h"
#include "sprintf_irc.h"
#include "irc_dictionary.h"
dlink_list shared_conf_list;
dlink_list cluster_conf_list;
@ -744,13 +745,17 @@ get_nd_count(void)
return(dlink_list_length(&nd_list));
}
struct Dictionary *nd_dict = NULL;
void
add_nd_entry(const char *name)
{
struct nd_entry *nd;
if(hash_find_nd(name) != NULL)
if(nd_dict == NULL)
nd_dict = irc_dictionary_create(irccmp);
if(irc_dictionary_find(nd_dict, name) != NULL)
return;
nd = BlockHeapAlloc(nd_heap);
@ -760,14 +765,16 @@ add_nd_entry(const char *name)
/* this list is ordered */
dlinkAddTail(nd, &nd->lnode, &nd_list);
add_to_nd_hash(name, nd);
irc_dictionary_add(nd_dict, nd->name, nd);
}
void
free_nd_entry(struct nd_entry *nd)
{
irc_dictionary_delete(nd_dict, nd->name);
dlinkDelete(&nd->lnode, &nd_list);
dlinkDelete(&nd->hnode, &ndTable[nd->hashv]);
BlockHeapFree(nd_heap, nd);
}