X-Git-Url: https://jfr.im/git/irc/rqf/shadowircd.git/blobdiff_plain/5366977b4f3c7a50d170bf7a1e29b14c74944db7..af81d5a0b09446188fd6f9c292b51519f2c1cedd:/src/s_newconf.c diff --git a/src/s_newconf.c b/src/s_newconf.c index 66adbec..6a0d2ff 100644 --- a/src/s_newconf.c +++ b/src/s_newconf.c @@ -29,7 +29,7 @@ * 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" @@ -48,16 +48,17 @@ #include "balloc.h" #include "event.h" #include "sprintf_irc.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; +#include "irc_dictionary.h" + +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; @@ -79,32 +80,32 @@ void 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) { /* 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) { - 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) { - 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) { 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) @@ -113,7 +114,7 @@ clear_s_newconf(void) if(!server_p->servers) { - dlinkDelete(ptr, &server_conf_list); + rb_dlinkDelete(ptr, &server_conf_list); free_server_conf(ptr->data); } else @@ -125,7 +126,7 @@ void 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) { @@ -135,7 +136,7 @@ clear_s_newconf_bans(void) 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) @@ -147,7 +148,7 @@ clear_s_newconf_bans(void) continue; free_conf(aconf); - dlinkDestroy(ptr, &resv_conf_list); + rb_dlinkDestroy(ptr, &resv_conf_list); } clear_resv_hash(); @@ -178,7 +179,7 @@ find_shared_conf(const char *username, const char *host, const char *server, int flags) { struct remote_conf *shared_p; - dlink_node *ptr; + rb_dlink_node *ptr; DLINK_FOREACH(ptr, shared_conf_list.head) { @@ -224,7 +225,7 @@ cluster_generic(struct Client *source_p, const char *command, 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); @@ -287,7 +288,7 @@ find_oper_conf(const char *username, const char *host, const char *locip, const 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); @@ -330,6 +331,7 @@ static struct oper_flags oper_flagtable[] = { 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' }, @@ -342,6 +344,7 @@ static struct oper_flags oper_flagtable[] = { OPER_SPY, 'S', 's' }, { OPER_INVIS, 'P', 'p' }, { OPER_REMOTEBAN, 'B', 'b' }, + { OPER_MASSNOTICE, 'M', 'm' }, { 0, '\0', '\0' } }; @@ -429,7 +432,7 @@ struct server_conf * 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) { @@ -482,7 +485,7 @@ detach_server_conf(struct Client *client_p) 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); } } @@ -511,7 +514,7 @@ struct ConfItem * find_xline(const char *gecos, int counter) { struct ConfItem *aconf; - dlink_node *ptr; + rb_dlink_node *ptr; DLINK_FOREACH(ptr, xline_conf_list.head) { @@ -528,11 +531,28 @@ find_xline(const char *gecos, int counter) return NULL; } +struct ConfItem * +find_xline_mask(const char *gecos) +{ + struct ConfItem *aconf; + rb_dlink_node *ptr; + + 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) { @@ -548,6 +568,23 @@ find_nick_resv(const char *name) return NULL; } +struct ConfItem * +find_nick_resv_mask(const char *name) +{ + struct ConfItem *aconf; + rb_dlink_node *ptr; + + DLINK_FOREACH(ptr, resv_conf_list.head) + { + aconf = ptr->data; + + if(!irccmp(aconf->name, name)) + return aconf; + } + + return NULL; +} + /* clean_resv_nick() * * inputs - nick @@ -595,6 +632,7 @@ valid_wild_card_simple(const char *data) const char *p; char tmpch; int nonwild = 0; + int wild = 0; /* check the string for minimum number of nonwildcard chars */ p = data; @@ -604,9 +642,11 @@ valid_wild_card_simple(const char *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)) { @@ -614,9 +654,12 @@ valid_wild_card_simple(const char *data) if(++nonwild >= ConfigFileEntry.min_nonwildcard_simple) return 1; } + else + wild++; } - return 0; + /* strings without wilds are also ok */ + return wild == 0; } time_t @@ -646,8 +689,8 @@ static void 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) @@ -662,7 +705,7 @@ expire_temp_rxlines(void *unused) aconf->name); free_conf(aconf); - dlinkDestroy(ptr, &resvTable[i]); + rb_dlinkDestroy(ptr, &resvTable[i]); } } HASH_WALK_END @@ -678,7 +721,7 @@ expire_temp_rxlines(void *unused) "Temporary RESV for [%s] expired", aconf->name); free_conf(aconf); - dlinkDestroy(ptr, &resv_conf_list); + rb_dlinkDestroy(ptr, &resv_conf_list); } } @@ -693,7 +736,7 @@ expire_temp_rxlines(void *unused) "Temporary X-line for [%s] expired", aconf->name); free_conf(aconf); - dlinkDestroy(ptr, &xline_conf_list); + rb_dlinkDestroy(ptr, &xline_conf_list); } } } @@ -701,16 +744,15 @@ expire_temp_rxlines(void *unused) 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); @@ -719,15 +761,17 @@ add_nd_entry(const char *name) 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); } @@ -735,8 +779,8 @@ void 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) { @@ -770,7 +814,7 @@ add_tgchange(const char *host) DupString(target->ip, host); target->expiry = CurrentTime + (60*60*12); - dlinkAdd(target, &target->node, &tgchange_list); + rb_dlinkAdd(target, &target->node, &tgchange_list); } tgchange *