* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
- * $Id: s_newconf.c 3161 2007-01-25 07:23:01Z nenolod $
+ * $Id: s_newconf.c 3508 2007-06-04 16:04:49Z jilles $
*/
#include "stdinc.h"
#include "common.h"
#include "s_conf.h"
#include "s_newconf.h"
-#include "tools.h"
#include "client.h"
-#include "memory.h"
#include "s_serv.h"
#include "send.h"
#include "hostmask.h"
#include "newconf.h"
#include "hash.h"
-#include "balloc.h"
-#include "event.h"
#include "sprintf_irc.h"
+#include "irc_dictionary.h"
-dlink_list shared_conf_list;
-dlink_list cluster_conf_list;
-dlink_list oper_conf_list;
-dlink_list hubleaf_conf_list;
-dlink_list server_conf_list;
-dlink_list xline_conf_list;
-dlink_list resv_conf_list; /* nicks only! */
-dlink_list nd_list; /* nick delay */
-dlink_list tgchange_list;
+rb_dlink_list shared_conf_list;
+rb_dlink_list cluster_conf_list;
+rb_dlink_list oper_conf_list;
+rb_dlink_list hubleaf_conf_list;
+rb_dlink_list server_conf_list;
+rb_dlink_list xline_conf_list;
+rb_dlink_list resv_conf_list; /* nicks only! */
+rb_dlink_list nd_list; /* nick delay */
+rb_dlink_list tgchange_list;
-patricia_tree_t *tgchange_tree;
+rb_patricia_tree_t *tgchange_tree;
static BlockHeap *nd_heap = NULL;
clear_s_newconf(void)
{
struct server_conf *server_p;
- dlink_node *ptr;
- dlink_node *next_ptr;
+ rb_dlink_node *ptr;
+ rb_dlink_node *next_ptr;
- DLINK_FOREACH_SAFE(ptr, next_ptr, shared_conf_list.head)
+ RB_DLINK_FOREACH_SAFE(ptr, next_ptr, shared_conf_list.head)
{
/* ptr here is ptr->data->node */
- dlinkDelete(ptr, &shared_conf_list);
+ rb_dlinkDelete(ptr, &shared_conf_list);
free_remote_conf(ptr->data);
}
- DLINK_FOREACH_SAFE(ptr, next_ptr, cluster_conf_list.head)
+ RB_DLINK_FOREACH_SAFE(ptr, next_ptr, cluster_conf_list.head)
{
- dlinkDelete(ptr, &cluster_conf_list);
+ rb_dlinkDelete(ptr, &cluster_conf_list);
free_remote_conf(ptr->data);
}
- DLINK_FOREACH_SAFE(ptr, next_ptr, hubleaf_conf_list.head)
+ RB_DLINK_FOREACH_SAFE(ptr, next_ptr, hubleaf_conf_list.head)
{
- dlinkDelete(ptr, &hubleaf_conf_list);
+ rb_dlinkDelete(ptr, &hubleaf_conf_list);
free_remote_conf(ptr->data);
}
- DLINK_FOREACH_SAFE(ptr, next_ptr, oper_conf_list.head)
+ RB_DLINK_FOREACH_SAFE(ptr, next_ptr, oper_conf_list.head)
{
free_oper_conf(ptr->data);
- dlinkDestroy(ptr, &oper_conf_list);
+ rb_dlinkDestroy(ptr, &oper_conf_list);
}
- DLINK_FOREACH_SAFE(ptr, next_ptr, server_conf_list.head)
+ RB_DLINK_FOREACH_SAFE(ptr, next_ptr, server_conf_list.head)
{
server_p = ptr->data;
if(!server_p->servers)
{
- dlinkDelete(ptr, &server_conf_list);
+ rb_dlinkDelete(ptr, &server_conf_list);
free_server_conf(ptr->data);
}
else
clear_s_newconf_bans(void)
{
struct ConfItem *aconf;
- dlink_node *ptr, *next_ptr;
+ rb_dlink_node *ptr, *next_ptr;
- DLINK_FOREACH_SAFE(ptr, next_ptr, xline_conf_list.head)
+ RB_DLINK_FOREACH_SAFE(ptr, next_ptr, xline_conf_list.head)
{
aconf = ptr->data;
continue;
free_conf(aconf);
- dlinkDestroy(ptr, &xline_conf_list);
+ rb_dlinkDestroy(ptr, &xline_conf_list);
}
- DLINK_FOREACH_SAFE(ptr, next_ptr, resv_conf_list.head)
+ RB_DLINK_FOREACH_SAFE(ptr, next_ptr, resv_conf_list.head)
{
aconf = ptr->data;
continue;
free_conf(aconf);
- dlinkDestroy(ptr, &resv_conf_list);
+ rb_dlinkDestroy(ptr, &resv_conf_list);
}
clear_resv_hash();
struct remote_conf *
make_remote_conf(void)
{
- struct remote_conf *remote_p = MyMalloc(sizeof(struct remote_conf));
+ struct remote_conf *remote_p = rb_malloc(sizeof(struct remote_conf));
return remote_p;
}
if(remote_p == NULL)
return;
- MyFree(remote_p->username);
- MyFree(remote_p->host);
- MyFree(remote_p->server);
- MyFree(remote_p);
+ rb_free(remote_p->username);
+ rb_free(remote_p->host);
+ rb_free(remote_p->server);
+ rb_free(remote_p);
}
int
const char *server, int flags)
{
struct remote_conf *shared_p;
- dlink_node *ptr;
+ rb_dlink_node *ptr;
- DLINK_FOREACH(ptr, shared_conf_list.head)
+ RB_DLINK_FOREACH(ptr, shared_conf_list.head)
{
shared_p = ptr->data;
char buffer[BUFSIZE];
struct remote_conf *shared_p;
va_list args;
- dlink_node *ptr;
+ rb_dlink_node *ptr;
va_start(args, format);
ircvsnprintf(buffer, sizeof(buffer), format, args);
va_end(args);
- DLINK_FOREACH(ptr, cluster_conf_list.head)
+ RB_DLINK_FOREACH(ptr, cluster_conf_list.head)
{
shared_p = ptr->data;
struct oper_conf *
make_oper_conf(void)
{
- struct oper_conf *oper_p = MyMalloc(sizeof(struct oper_conf));
+ struct oper_conf *oper_p = rb_malloc(sizeof(struct oper_conf));
return oper_p;
}
if(oper_p == NULL)
return;
- MyFree(oper_p->username);
- MyFree(oper_p->host);
- MyFree(oper_p->name);
+ rb_free(oper_p->username);
+ rb_free(oper_p->host);
+ rb_free(oper_p->name);
if(oper_p->passwd)
{
memset(oper_p->passwd, 0, strlen(oper_p->passwd));
- MyFree(oper_p->passwd);
+ rb_free(oper_p->passwd);
}
#ifdef HAVE_LIBCRYPTO
- MyFree(oper_p->rsa_pubkey_file);
+ rb_free(oper_p->rsa_pubkey_file);
if(oper_p->rsa_pubkey)
RSA_free(oper_p->rsa_pubkey);
#endif
- MyFree(oper_p);
+ rb_free(oper_p);
}
struct oper_conf *
struct irc_sockaddr_storage ip, cip;
char addr[HOSTLEN+1];
int bits, cbits;
- dlink_node *ptr;
+ rb_dlink_node *ptr;
parse_netmask(locip, (struct sockaddr *)&cip, &cbits);
- DLINK_FOREACH(ptr, oper_conf_list.head)
+ RB_DLINK_FOREACH(ptr, oper_conf_list.head)
{
oper_p = ptr->data;
{ OPER_GLINE, 'G', 'g' },
{ OPER_KLINE, 'K', 'k' },
{ OPER_XLINE, 'X', 'x' },
+ { OPER_RESV, 'Q', 'q' },
{ OPER_GLOBKILL, 'O', 'o' },
{ OPER_LOCKILL, 'C', 'c' },
{ OPER_REMOTE, 'R', 'r' },
{ OPER_SPY, 'S', 's' },
{ OPER_INVIS, 'P', 'p' },
{ OPER_REMOTEBAN, 'B', 'b' },
+ { OPER_MASSNOTICE, 'M', 'm' },
{ 0, '\0', '\0' }
};
struct server_conf *
make_server_conf(void)
{
- struct server_conf *server_p = MyMalloc(sizeof(struct server_conf));
+ struct server_conf *server_p = rb_malloc(sizeof(struct server_conf));
server_p->aftype = AF_INET;
return server_p;
}
if(!EmptyString(server_p->passwd))
{
memset(server_p->passwd, 0, strlen(server_p->passwd));
- MyFree(server_p->passwd);
+ rb_free(server_p->passwd);
}
if(!EmptyString(server_p->spasswd))
{
memset(server_p->spasswd, 0, strlen(server_p->spasswd));
- MyFree(server_p->spasswd);
+ rb_free(server_p->spasswd);
}
- MyFree(server_p->name);
- MyFree(server_p->host);
- MyFree(server_p->class_name);
- MyFree(server_p);
+ rb_free(server_p->name);
+ rb_free(server_p->host);
+ rb_free(server_p->class_name);
+ rb_free(server_p);
}
void
conf_report_error("Warning connect::class invalid for %s",
server_p->name);
- MyFree(server_p->class_name);
+ rb_free(server_p->class_name);
DupString(server_p->class_name, "default");
}
find_server_conf(const char *name)
{
struct server_conf *server_p;
- dlink_node *ptr;
+ rb_dlink_node *ptr;
- DLINK_FOREACH(ptr, server_conf_list.head)
+ RB_DLINK_FOREACH(ptr, server_conf_list.head)
{
server_p = ptr->data;
if(MaxUsers(server_p->class) < 0 && CurrUsers(server_p->class) <= 0)
free_class(server_p->class);
- dlinkDelete(&server_p->node, &server_conf_list);
+ rb_dlinkDelete(&server_p->node, &server_conf_list);
free_server_conf(server_p);
}
}
find_xline(const char *gecos, int counter)
{
struct ConfItem *aconf;
- dlink_node *ptr;
+ rb_dlink_node *ptr;
- DLINK_FOREACH(ptr, xline_conf_list.head)
+ RB_DLINK_FOREACH(ptr, xline_conf_list.head)
{
aconf = ptr->data;
return NULL;
}
+struct ConfItem *
+find_xline_mask(const char *gecos)
+{
+ struct ConfItem *aconf;
+ rb_dlink_node *ptr;
+
+ RB_DLINK_FOREACH(ptr, xline_conf_list.head)
+ {
+ aconf = ptr->data;
+
+ if(!irccmp(aconf->name, gecos))
+ return aconf;
+ }
+
+ return NULL;
+}
+
struct ConfItem *
find_nick_resv(const char *name)
{
struct ConfItem *aconf;
- dlink_node *ptr;
+ rb_dlink_node *ptr;
- DLINK_FOREACH(ptr, resv_conf_list.head)
+ RB_DLINK_FOREACH(ptr, resv_conf_list.head)
{
aconf = ptr->data;
return NULL;
}
+struct ConfItem *
+find_nick_resv_mask(const char *name)
+{
+ struct ConfItem *aconf;
+ rb_dlink_node *ptr;
+
+ RB_DLINK_FOREACH(ptr, resv_conf_list.head)
+ {
+ aconf = ptr->data;
+
+ if(!irccmp(aconf->name, name))
+ return aconf;
+ }
+
+ return NULL;
+}
+
/* clean_resv_nick()
*
* inputs - nick
const char *p;
char tmpch;
int nonwild = 0;
+ int wild = 0;
/* check the string for minimum number of nonwildcard chars */
p = data;
/* found an escape, p points to the char after it, so skip
* that and move on.
*/
- if(tmpch == '\\')
+ if(tmpch == '\\' && *p)
{
p++;
+ if(++nonwild >= ConfigFileEntry.min_nonwildcard_simple)
+ return 1;
}
else if(!IsMWildChar(tmpch))
{
if(++nonwild >= ConfigFileEntry.min_nonwildcard_simple)
return 1;
}
+ else
+ wild++;
}
- return 0;
+ /* strings without wilds are also ok */
+ return wild == 0;
}
time_t
expire_temp_rxlines(void *unused)
{
struct ConfItem *aconf;
- dlink_node *ptr;
- dlink_node *next_ptr;
+ rb_dlink_node *ptr;
+ rb_dlink_node *next_ptr;
int i;
HASH_WALK_SAFE(i, R_MAX, ptr, next_ptr, resvTable)
aconf->name);
free_conf(aconf);
- dlinkDestroy(ptr, &resvTable[i]);
+ rb_dlinkDestroy(ptr, &resvTable[i]);
}
}
HASH_WALK_END
- DLINK_FOREACH_SAFE(ptr, next_ptr, resv_conf_list.head)
+ RB_DLINK_FOREACH_SAFE(ptr, next_ptr, resv_conf_list.head)
{
aconf = ptr->data;
"Temporary RESV for [%s] expired",
aconf->name);
free_conf(aconf);
- dlinkDestroy(ptr, &resv_conf_list);
+ rb_dlinkDestroy(ptr, &resv_conf_list);
}
}
- DLINK_FOREACH_SAFE(ptr, next_ptr, xline_conf_list.head)
+ RB_DLINK_FOREACH_SAFE(ptr, next_ptr, xline_conf_list.head)
{
aconf = ptr->data;
"Temporary X-line for [%s] expired",
aconf->name);
free_conf(aconf);
- dlinkDestroy(ptr, &xline_conf_list);
+ rb_dlinkDestroy(ptr, &xline_conf_list);
}
}
}
unsigned long
get_nd_count(void)
{
- return(dlink_list_length(&nd_list));
+ return(rb_dlink_list_length(&nd_list));
}
-
void
add_nd_entry(const char *name)
{
struct nd_entry *nd;
- if(hash_find_nd(name) != NULL)
+ if(irc_dictionary_find(nd_dict, name) != NULL)
return;
nd = BlockHeapAlloc(nd_heap);
nd->expire = CurrentTime + ConfigFileEntry.nick_delay;
/* this list is ordered */
- dlinkAddTail(nd, &nd->lnode, &nd_list);
- add_to_nd_hash(name, nd);
+ rb_dlinkAddTail(nd, &nd->lnode, &nd_list);
+
+ irc_dictionary_add(nd_dict, nd->name, nd);
}
void
free_nd_entry(struct nd_entry *nd)
{
- dlinkDelete(&nd->lnode, &nd_list);
- dlinkDelete(&nd->hnode, &ndTable[nd->hashv]);
+ irc_dictionary_delete(nd_dict, nd->name);
+
+ rb_dlinkDelete(&nd->lnode, &nd_list);
BlockHeapFree(nd_heap, nd);
}
expire_nd_entries(void *unused)
{
struct nd_entry *nd;
- dlink_node *ptr;
- dlink_node *next_ptr;
+ rb_dlink_node *ptr;
+ rb_dlink_node *next_ptr;
- DLINK_FOREACH_SAFE(ptr, next_ptr, nd_list.head)
+ RB_DLINK_FOREACH_SAFE(ptr, next_ptr, nd_list.head)
{
nd = ptr->data;
if(find_tgchange(host))
return;
- target = MyMalloc(sizeof(tgchange));
+ target = rb_malloc(sizeof(tgchange));
pnode = make_and_lookup(tgchange_tree, host);
pnode->data = target;
DupString(target->ip, host);
target->expiry = CurrentTime + (60*60*12);
- dlinkAdd(target, &target->node, &tgchange_list);
+ rb_dlinkAdd(target, &target->node, &tgchange_list);
}
tgchange *