]> jfr.im git - irc/rqf/shadowircd.git/blobdiff - src/s_newconf.c
Fix some split servers not appearing in oper /map.
[irc/rqf/shadowircd.git] / src / s_newconf.c
index 97cd4751dc4d7a9cbebaa49d1d259b8f25f96319..60e85fd4fbaba9c05d71fa8ec22ef54c73206bdb 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 1747 2006-07-25 21:22:45Z jilles $
+ * $Id: s_newconf.c 3508 2007-06-04 16:04:49Z jilles $
  */
 
 #include "stdinc.h"
@@ -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;
@@ -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' }
 };
 
@@ -504,8 +507,7 @@ set_server_conf_autoconn(struct Client *source_p, char *name, int newval)
                                get_oper_name(source_p), name, newval);
        }
        else
-               sendto_one(source_p, ":%s NOTICE %s :Can't find %s",
-                               me.name, source_p->name, name);
+               sendto_one_notice(source_p, ":Can't find %s", name);
 }
 
 struct ConfItem *
@@ -529,6 +531,23 @@ find_xline(const char *gecos, int counter)
        return NULL;
 }
 
+struct ConfItem *
+find_xline_mask(const char *gecos)
+{
+       struct ConfItem *aconf;
+       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)
 {
@@ -549,6 +568,23 @@ find_nick_resv(const char *name)
        return NULL;
 }
 
+struct ConfItem *
+find_nick_resv_mask(const char *name)
+{
+       struct ConfItem *aconf;
+       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
@@ -596,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;
@@ -605,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))
                {
@@ -615,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
@@ -705,13 +747,12 @@ get_nd_count(void)
        return(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);
@@ -721,14 +762,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);
 }