]> jfr.im git - irc/rqf/shadowircd.git/blobdiff - src/s_newconf.c
dlink -> rb_dlink
[irc/rqf/shadowircd.git] / src / s_newconf.c
index 66adbeca3ca56a49ed1eeb34b38b8cb58f2bec2d..6a0d2ff48b0dffa452895ce2b74811d1cc7c203b 100644 (file)
@@ -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"
 #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 *