]> jfr.im git - irc/rqf/shadowircd.git/commitdiff
mode api: Remove most modes from the chmode_table, and have them initialized in modes...
authorB.Greenham <redacted>
Fri, 2 Jul 2010 23:09:46 +0000 (19:09 -0400)
committerB.Greenham <redacted>
Fri, 2 Jul 2010 23:09:46 +0000 (19:09 -0400)
Modeset files are modules stored in shadowircd/modes. All they do is initalize
a set of modes on load, and orphan said modes on unload.

All cmodes not included in ircd-ratbox are now located in modeset files, rather
than being in the core. These modes no longer simply use defines, their
locations are stored in a the new struct module_modes. Each of these is set
when intializing the mode in the modeset files, and set to 0 when orphaning
the mode upon unloading the modeset file.

In addition, use_forward has been removed, as it is now obsoleted by modesets.

27 files changed:
Makefile.in
configure
configure.ac
doc/example.conf
doc/reference.conf
extensions/chm_quietunreg_compat.c
extensions/m_okick.c
include/channel.h
include/s_conf.h
modes/Makefile.in [new file with mode: 0644]
modes/charybdis.c [new file with mode: 0644]
modes/shadowircd.c [new file with mode: 0644]
modules/core/m_join.c
modules/core/m_kick.c
modules/core/m_message.c
modules/core/m_mode.c
modules/core/m_part.c
modules/m_info.c
modules/m_invite.c
modules/m_knock.c
src/channel.c
src/chmode.c
src/ircd.c
src/newconf.c
src/s_conf.c
src/s_user.c
src/supported.c

index 90c861ce56e872e03ef3411531000e60db969b6a..e4938e06f67371fd13f3de3b80e1324713c6741f 100644 (file)
@@ -46,7 +46,7 @@ CFLAGS                = @CFLAGS@
 # the system one.
 #CFLAGS= -DNDEBUG -g -O2 -D"FD_SETSIZE=1024"
 SHELL=/bin/sh
-SUBDIRS=libratbox modules extensions src tools ssld bandb doc help
+SUBDIRS=libratbox modules modes extensions src tools ssld bandb doc help
 CLEANDIRS = ${SUBDIRS}
 RSA_FILES=rsa_respond/README rsa_respond/respond.c rsa_respond/Makefile
 
index 79cdc8e055ed556946d212ccb797469ad730e35a..1aa3c601eda5a151af29f6eaf1fb6e81d8bc2657 100755 (executable)
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.65 for shadowircd 6.1.0.
+# Generated by GNU Autoconf 2.65 for shadowircd 6.2.0.
 #
 # $Id: configure.ac 3516 2007-06-10 16:14:03Z jilles $
 #
@@ -551,8 +551,8 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='shadowircd'
 PACKAGE_TARNAME='shadowircd'
-PACKAGE_VERSION='6.1.0'
-PACKAGE_STRING='shadowircd 6.1.0'
+PACKAGE_VERSION='6.2.0'
+PACKAGE_STRING='shadowircd 6.2.0'
 PACKAGE_BUGREPORT=''
 PACKAGE_URL=''
 
@@ -1265,7 +1265,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures shadowircd 6.1.0 to adapt to many kinds of systems.
+\`configure' configures shadowircd 6.2.0 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1326,7 +1326,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of shadowircd 6.1.0:";;
+     short | recursive ) echo "Configuration of shadowircd 6.2.0:";;
    esac
   cat <<\_ACEOF
 
@@ -1444,7 +1444,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-shadowircd configure 6.1.0
+shadowircd configure 6.2.0
 generated by GNU Autoconf 2.65
 
 Copyright (C) 2009 Free Software Foundation, Inc.
@@ -2043,7 +2043,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by shadowircd $as_me 6.1.0, which was
+It was created by shadowircd $as_me 6.2.0, which was
 generated by GNU Autoconf 2.65.  Invocation command line was
 
   $ $0 $@
@@ -9459,7 +9459,7 @@ _ACEOF
 
 fi
 
-ac_config_files="$ac_config_files Makefile bandb/Makefile ssld/Makefile extensions/Makefile unsupported/Makefile src/Makefile modules/Makefile tools/Makefile doc/Makefile help/Makefile"
+ac_config_files="$ac_config_files Makefile bandb/Makefile ssld/Makefile extensions/Makefile modes/Makefile unsupported/Makefile src/Makefile modules/Makefile tools/Makefile doc/Makefile help/Makefile"
 
 
 cat >confcache <<\_ACEOF
@@ -9969,7 +9969,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by shadowircd $as_me 6.1.0, which was
+This file was extended by shadowircd $as_me 6.2.0, which was
 generated by GNU Autoconf 2.65.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -10031,7 +10031,7 @@ _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-shadowircd config.status 6.1.0
+shadowircd config.status 6.2.0
 configured by $0, generated by GNU Autoconf 2.65,
   with options \\"\$ac_cs_config\\"
 
@@ -10152,6 +10152,7 @@ do
     "bandb/Makefile") CONFIG_FILES="$CONFIG_FILES bandb/Makefile" ;;
     "ssld/Makefile") CONFIG_FILES="$CONFIG_FILES ssld/Makefile" ;;
     "extensions/Makefile") CONFIG_FILES="$CONFIG_FILES extensions/Makefile" ;;
+    "modes/Makefile") CONFIG_FILES="$CONFIG_FILES modes/Makefile" ;;
     "unsupported/Makefile") CONFIG_FILES="$CONFIG_FILES unsupported/Makefile" ;;
     "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;;
     "modules/Makefile") CONFIG_FILES="$CONFIG_FILES modules/Makefile" ;;
index 7de2bd291675b74221f4c8197a4ed0cd9d572f2f..025b82c673427a63508c493b0061728a401bd51a 100644 (file)
@@ -10,7 +10,7 @@ AC_PREREQ(2.57)
 dnl Sneaky way to get an Id tag into the configure script
 AC_COPYRIGHT([$Id: configure.ac 3516 2007-06-10 16:14:03Z jilles $])
 
-AC_INIT([shadowircd],[6.1.0])
+AC_INIT([shadowircd],[6.2.0])
 
 AC_CONFIG_HEADER(include/setup.h)
 
@@ -1160,6 +1160,7 @@ AC_CONFIG_FILES(                  \
        bandb/Makefile                  \
        ssld/Makefile                   \
        extensions/Makefile             \
+       modes/Makefile                  \
        unsupported/Makefile            \
        src/Makefile                    \
        modules/Makefile                \
index 1e621018c0589aead38add057f802387366ec556..0f08301f87cf428372769dec7726d639f6ed47c5 100755 (executable)
@@ -45,6 +45,10 @@ loadmodule "extensions/sno_globalkline.so";
 loadmodule "extensions/sno_globaloper.so";
 #loadmodule "extensions/sno_whois.so";
 
+/* Modesets, load only one */
+loadmodule "modes/shadowircd.so";
+#loadmodule "modes/charybdis.so";
+
 serverinfo {
        name = "hades.arpa";
        sid = "42X";
@@ -379,7 +383,6 @@ channel {
        use_invex = yes;
        use_except = yes;
        use_knock = yes;
-       use_forward = yes;
        use_local_channels = yes;
        knock_delay = 5 minutes;
        knock_delay_channel = 1 minute;
index bbb2b26be24539bed2932dac5f6f42665bfc5310..f77e60c736f2a397dacccba884b1a81920ef8c66 100755 (executable)
@@ -115,6 +115,31 @@ loadmodule "extensions/sno_globalkline.so";
 loadmodule "extensions/sno_globaloper.so";
 #loadmodule "extensions/sno_whois.so";
 
+/* modesets: Modesets are modules that enable various user and channel
+ * modes. When enabled, they enable usermodes and channel modes equivalent
+ * to the named ircd. This is useful for linking to other TS6 IRCds. 
+ * If you do not know what this does or do not know if you need it
+ * then you should just load modes/shadowircd.so for full functionality.
+ * Without any modeset loaded, you will only have the modes that are included
+ * in ircd-ratbox. Unloading a modeset while the ircd is running is possible,
+ * but will be confusing for users, as it will leave all existent unloaded
+ * modes in place without users being able to remove them. Said modes will, 
+ * however, not function. You should be able to load a module that provides 
+ * more modes than your current (say, going from charybdis to shadowircd) 
+ * on the fly without any problems. The slight exception to this is unloading
+ * a module that provides quiets (cmode +q). Users affected by quiets will
+ * have to part and rejoin the channel before the quiet will cease affecting
+ * them. In addition, unloaded modes will remain in the IRCd's VERSION reply
+ * until restart. For these reasons, it is highly recommended to restart if you wish
+ * to change modeset.
+ * Modesets currently only affect cmodes. 
+ * You should only load one of these at a time.
+ * Modules are listed in order of highest functionality to least,
+ * while no module provides the least functionality of all. */
+loadmodule "modes/shadowircd.so";
+#loadmodule "modes/charybdis.so";
+
  
 /* serverinfo {}:  Contains information about the server. (OLD M:) */
 serverinfo {
@@ -787,14 +812,6 @@ channel {
         */
        use_except = yes;
 
-       /* forward: Enable/disable channel mode +f, which allows you to set 
-        * a channel to forward users to if they can't join because of +i etc.
-        * Disabling this option via rehash will leave all previously set 
-        * forwards hanging around, though they will not do anything. For 
-        * this reason, you may want to restart to disable this option.
-        */
-       use_forward = yes;
-
        /* knock: Allows users to request an invite to a channel that
         * is locked somehow (+ikl).  If the channel is +p or you are banned
         * the knock will not be sent.
index a0d822d3f42c853059f45165916544d517795d6d..cdb612dacd44d3e63fee3adf40a6bdbb3ba353fe 100644 (file)
@@ -9,6 +9,9 @@
 #include "hook.h"
 #include "ircd.h"
 #include "chmode.h"
+#include "channel.h"
+
+struct module_modes ModuleModes;
 
 static int _modinit(void);
 static void _moddeinit(void);
@@ -44,7 +47,7 @@ chm_quietunreg(struct Client *source_p, struct Channel *chptr,
 
        if (MyClient(source_p))
                chm_ban(source_p, chptr, alevel, 1, &newparn, newparv,
-                               errors, dir, 'q', CHFL_QUIET);
+                               errors, dir, 'q', ModuleModes.CHFL_QUIET);
        else
                chm_nosuch(source_p, chptr, alevel, parc, parn, parv,
                                errors, dir, c, mode_type);
index bf1ea2cdd4448819ea15162caa755321807a35e8..780e1ede0af1a6d28c70f7d2de1d674cb2dd4f7a 100644 (file)
@@ -37,6 +37,8 @@
 #include "s_conf.h"
 #include "s_serv.h"
 
+struct module_modes ModuleModes;
+
 static int mo_okick(struct Client *client_p, struct Client *source_p, int parc, const char *parv[]);
 
 
@@ -140,7 +142,7 @@ mo_okick(struct Client *client_p, struct Client *source_p, int parc, const char
        rb_snprintf(text, sizeof(text), "K%s", who->id);
 
        /* we don't need to track NOREJOIN stuff unless it's our client being kicked */
-       if(MyClient(who) && chptr->mode.mode & MODE_NOREJOIN)
+       if(MyClient(who) && chptr->mode.mode & ModuleModes.MODE_NOREJOIN)
                channel_metadata_time_add(chptr, text, rb_current_time(), "KICKNOREJOIN");
        return 0;
 }
index 62f53265a413f5e90e33f138d7242dc062f830a5..e35ea5aca7d4563e99163d765a665b08b11b1394 100644 (file)
@@ -136,6 +136,32 @@ struct ChannelMode
        long mode_type;
 };
 
+/* modes added by the module files in modes/ */
+struct module_modes
+{
+       unsigned int MODE_REGONLY; 
+       unsigned int MODE_NOCTCP; /* Block CTCPs directed to this channel */
+       unsigned int MODE_NOCOLOR;
+       unsigned int MODE_EXLIMIT; /* exempt from list limits, +b/+e/+I/+q */
+       unsigned int MODE_PERMANENT; /* permanant channel, +P */
+       unsigned int MODE_OPMODERATE; /* send rejected messages to ops */
+       unsigned int MODE_FREEINVITE; /* allow free use of /invite */
+       unsigned int MODE_FREETARGET; /* can be forwarded to without authorization */
+       unsigned int MODE_DISFORWARD; /* disable channel forwarding */
+       unsigned int MODE_THROTTLE; /* throttle joins */
+       unsigned int MODE_FORWARD;
+       unsigned int MODE_NONOTICE; /* Block notices directed to this channel */
+       unsigned int MODE_NOACTION; /* Block CTCP ACTION directed to this channel */
+       unsigned int MODE_NOKICK; /* Disable /kick on this channel */
+       unsigned int MODE_NONICK; /* Disable /nick for anyone on this channel */
+       unsigned int MODE_NOCAPS; /* Block messages in all capital letters */
+       unsigned int MODE_NOREJOIN; /* Block rejoin immediately after kick */
+       unsigned int MODE_NOREPEAT; /* Block repeat messages */
+       unsigned int MODE_NOOPERKICK; /* disallow kicking opers */
+
+       unsigned int CHFL_QUIET;
+};
+
 typedef int (*ExtbanFunc)(const char *data, struct Client *client_p,
                struct Channel *chptr, long mode_type);
 
@@ -171,28 +197,10 @@ typedef int (*ExtbanFunc)(const char *data, struct Client *client_p,
 #define MODE_TOPICLIMIT 0x0008
 #define MODE_INVITEONLY 0x0010
 #define MODE_NOPRIVMSGS 0x0020
-#define MODE_REGONLY   0x0040
-#define MODE_NOCOLOR   0x0080
-#define MODE_EXLIMIT   0x0100  /* exempt from list limits, +b/+e/+I/+q */
-#define MODE_PERMANENT  0x0200  /* permanant channel, +P */
-#define MODE_OPMODERATE 0x0400  /* send rejected messages to ops */
-#define MODE_FREEINVITE 0x0800  /* allow free use of /invite */
-#define MODE_FREETARGET 0x1000  /* can be forwarded to without authorization */
-#define MODE_DISFORWARD 0x2000  /* disable channel forwarding */
-#define MODE_NOCTCP     0x8000  /* Block CTCPs directed to this channel */
-#define MODE_NONOTICE  0x10000 /* Block notices directed to this channel */
-#define MODE_NOACTION  0x20000 /* Block CTCP ACTION directed to this channel */
-#define MODE_NOKICK    0x40000 /* Disable /kick on this channel */
-#define MODE_NONICK    0x80000 /* Disable /nick for anyone on this channel */
-#define MODE_NOCAPS    0x100000 /* Block messages in all capital letters */
-#define MODE_NOREJOIN  0x200000 /* Block rejoin immediately after kick */
-#define MODE_NOREPEAT  0x400000 /* Block repeat messages */
-#define MODE_NOOPERKICK        0x800000 /* disallow kicking opers */
 
 #define CHFL_BAN        0x10000000     /* ban channel flag */
 #define CHFL_EXCEPTION  0x20000000     /* exception to ban channel flag */
 #define CHFL_INVEX      0x40000000
-#define CHFL_QUIET      0x80000000
 
 /* mode flags for direction indication */
 #define MODE_QUERY     0
@@ -219,6 +227,7 @@ typedef int (*ExtbanFunc)(const char *data, struct Client *client_p,
 
 extern rb_dlink_list global_channel_list;
 void init_channels(void);
+void init_module_modes(void);
 
 struct Channel *allocate_channel(const char *chname);
 void free_channel(struct Channel *chptr);
index 65a971d4412105beedf7015a9c58c43f70ca8b51..ebe88f1fe02a559f82ce8fe848712bff763ed061 100644 (file)
@@ -243,7 +243,6 @@ struct config_channel_entry
        int use_except;
        int use_invex;
        int use_knock;
-       int use_forward;
        int use_local_channels;
        int knock_delay;
        int knock_delay_channel;
diff --git a/modes/Makefile.in b/modes/Makefile.in
new file mode 100644 (file)
index 0000000..326309e
--- /dev/null
@@ -0,0 +1,68 @@
+#
+# Makefile.in for ircd/modes
+#
+#
+CC             = @CC@
+RM             = @RM@
+SED             = @SED@
+LEX            = @LEX@
+LEXLIB         = @LEXLIB@
+CFLAGS         = @IRC_CFLAGS@ -DIRCD_PREFIX=\"@prefix@\"
+PICFLAGS       = @PICFLAGS@
+MKDEP          = @MKDEP@
+INSTALL                = @INSTALL@
+INSTALL_PROGRAM        = @INSTALL_PROGRAM@
+INSTALL_DATA   = @INSTALL_DATA@
+INSTALL_SUID    = @INSTALL_PROGRAM@ -o root -m 4755
+SHELL          = /bin/sh
+AUTOMODULEDIR  = @moduledir@/modes
+
+SSL_LIBS       = @SSL_LIBS@
+SSL_INCLUDES   = @SSL_INCLUDES@
+
+IRCDLIBS       = @LIBS@ $(SSL_LIBS)
+
+INCLUDES       = -I. -I../include -I../libratbox/include $(SSL_INCLUDES)
+CPPFLAGS       = ${INCLUDES} @CPPFLAGS@
+
+SRCS =                          \
+  charybdis.c                  \
+  shadowircd.c
+
+OBJS = ${SRCS:.c=.so}
+
+default:       build
+build: all
+all: $(OBJS)
+
+install: all
+       -@if test ! -d $(DESTDIR)$(AUTOMODULEDIR); then \
+                mkdir $(DESTDIR)$(AUTOMODULEDIR); \
+        fi
+       @echo "Installing modules into $(DESTDIR)$(AUTOMODULEDIR) .."
+       @for file in $(OBJS); do \
+               $(INSTALL_DATA) $$file $(DESTDIR)$(AUTOMODULEDIR); \
+       done
+
+.SUFFIXES: .so
+
+.c.so:
+       ${CC} ${PICFLAGS}  ${CPPFLAGS} ${CFLAGS} $< -o $@
+
+.PHONY: depend clean distclean
+depend:
+       @${MKDEP} ${CPPFLAGS} ${SRCS} > .depend
+       @sed s/\\\.o/\\\.so/ < .depend > .depend.tmp
+       @sed -e '/^# DO NOT DELETE THIS LINE/,$$d' <Makefile >Makefile.depend
+       @echo '# DO NOT DELETE THIS LINE!!!' >>Makefile.depend
+       @echo '# make depend needs it.' >>Makefile.depend
+       @cat .depend.tmp >>Makefile.depend
+       @mv Makefile.depend Makefile
+       @rm -f .depend.tmp .depend
+
+clean:
+       ${RM} -f *.so *~ 
+
+distclean: clean
+       ${RM} -f Makefile
+
diff --git a/modes/charybdis.c b/modes/charybdis.c
new file mode 100644 (file)
index 0000000..0ce9cca
--- /dev/null
@@ -0,0 +1,104 @@
+#include "stdinc.h"
+#include "modules.h"
+#include "client.h"
+#include "ircd.h"
+#include "chmode.h"
+#include "channel.h"
+
+struct module_modes ModuleModes;
+
+static int
+_modinit(void)
+{
+       ModuleModes.MODE_NOCTCP = cflag_add('C', chm_simple);
+       if (ModuleModes.MODE_NOCTCP == 0)
+               return -1;
+
+       ModuleModes.MODE_REGONLY = cflag_add('r', chm_regonly);
+       if (ModuleModes.MODE_REGONLY == 0)
+               return -1;
+
+       ModuleModes.MODE_NOCOLOR = cflag_add('c', chm_simple);
+       if (ModuleModes.MODE_NOCOLOR == 0)
+               return -1;
+
+       ModuleModes.MODE_EXLIMIT = cflag_add('L', chm_staff);
+       if (ModuleModes.MODE_EXLIMIT == 0)
+               return -1;
+
+       ModuleModes.MODE_PERMANENT = cflag_add('P', chm_staff);
+       if (ModuleModes.MODE_PERMANENT == 0)
+               return -1;
+
+       ModuleModes.MODE_OPMODERATE = cflag_add('z', chm_simple);
+       if (ModuleModes.MODE_OPMODERATE == 0)
+               return -1;
+
+       ModuleModes.MODE_FREEINVITE = cflag_add('g', chm_simple);
+       if (ModuleModes.MODE_FREEINVITE == 0)
+               return -1;
+
+       ModuleModes.MODE_FREETARGET = cflag_add('F', chm_simple);
+       if (ModuleModes.MODE_FREETARGET == 0)
+               return -1;
+
+       ModuleModes.MODE_DISFORWARD = cflag_add('Q', chm_simple);
+       if (ModuleModes.MODE_DISFORWARD == 0)
+               return -1;
+
+       ModuleModes.CHFL_QUIET = cflag_add('q', chm_ban);
+       if (ModuleModes.CHFL_QUIET == 0)
+               return -1;
+
+       ModuleModes.MODE_FORWARD = cflag_add('f', chm_forward);
+       if (ModuleModes.MODE_FORWARD == 0)
+               return -1;
+
+       ModuleModes.MODE_THROTTLE = cflag_add('j', chm_throttle);
+       if (ModuleModes.MODE_THROTTLE == 0)
+               return -1;
+
+       return 0;
+}
+
+static void
+_moddeinit(void)
+{
+       cflag_orphan('C');
+       ModuleModes.MODE_NOCTCP = 0;
+
+       cflag_orphan('r');
+       ModuleModes.MODE_REGONLY = 0;
+
+       cflag_orphan('c');
+       ModuleModes.MODE_NOCOLOR = 0;
+
+       cflag_orphan('L');
+       ModuleModes.MODE_EXLIMIT = 0;
+
+       cflag_orphan('P');
+       ModuleModes.MODE_PERMANENT = 0;
+
+       cflag_orphan('z');
+       ModuleModes.MODE_OPMODERATE = 0;
+
+       cflag_orphan('g');
+       ModuleModes.MODE_FREEINVITE = 0;
+
+       cflag_orphan('F');
+       ModuleModes.MODE_FREETARGET = 0;
+
+       cflag_orphan('Q');
+       ModuleModes.MODE_DISFORWARD = 0;
+
+       cflag_orphan('q');
+       ModuleModes.CHFL_QUIET = 0;
+
+       cflag_orphan('f');
+       ModuleModes.MODE_FORWARD = 0;
+
+       cflag_orphan('j');
+       ModuleModes.MODE_THROTTLE = 0;
+}
+
+DECLARE_MODULE_AV1(charybdis, _modinit, _moddeinit, NULL, NULL, NULL, "$charybdis$");
diff --git a/modes/shadowircd.c b/modes/shadowircd.c
new file mode 100644 (file)
index 0000000..d453d18
--- /dev/null
@@ -0,0 +1,166 @@
+#include "stdinc.h"
+#include "modules.h"
+#include "client.h"
+#include "ircd.h"
+#include "chmode.h"
+#include "channel.h"
+
+struct module_modes ModuleModes;
+
+static int
+_modinit(void)
+{
+       /* charybdis modes */
+       ModuleModes.MODE_NOCTCP = cflag_add('C', chm_simple);
+       if (ModuleModes.MODE_NOCTCP == 0)
+               return -1;
+
+       ModuleModes.MODE_REGONLY = cflag_add('r', chm_regonly);
+       if (ModuleModes.MODE_REGONLY == 0)
+               return -1;
+
+       ModuleModes.MODE_NOCOLOR = cflag_add('c', chm_simple);
+       if (ModuleModes.MODE_NOCOLOR == 0)
+               return -1;
+
+       ModuleModes.MODE_EXLIMIT = cflag_add('L', chm_staff);
+       if (ModuleModes.MODE_EXLIMIT == 0)
+               return -1;
+
+       ModuleModes.MODE_PERMANENT = cflag_add('P', chm_staff);
+       if (ModuleModes.MODE_PERMANENT == 0)
+               return -1;
+
+       ModuleModes.MODE_OPMODERATE = cflag_add('z', chm_simple);
+       if (ModuleModes.MODE_OPMODERATE == 0)
+               return -1;
+
+       ModuleModes.MODE_FREEINVITE = cflag_add('g', chm_simple);
+       if (ModuleModes.MODE_FREEINVITE == 0)
+               return -1;
+
+       ModuleModes.MODE_FREETARGET = cflag_add('F', chm_simple);
+       if (ModuleModes.MODE_FREETARGET == 0)
+               return -1;
+
+       ModuleModes.MODE_DISFORWARD = cflag_add('Q', chm_simple);
+       if (ModuleModes.MODE_DISFORWARD == 0)
+               return -1;
+
+       ModuleModes.CHFL_QUIET = cflag_add('q', chm_ban);
+       if (ModuleModes.CHFL_QUIET == 0)
+               return -1;
+
+       ModuleModes.MODE_FORWARD = cflag_add('f', chm_forward);
+       if (ModuleModes.MODE_FORWARD == 0)
+               return -1;
+
+       ModuleModes.MODE_THROTTLE = cflag_add('j', chm_throttle);
+       if (ModuleModes.MODE_THROTTLE == 0)
+               return -1;
+
+       /* shadowircd modes */
+
+       ModuleModes.MODE_NONOTICE = cflag_add('T', chm_simple);
+       if (ModuleModes.MODE_NONOTICE == 0)
+               return -1;
+
+       ModuleModes.MODE_NOACTION = cflag_add('D', chm_simple);
+       if (ModuleModes.MODE_NOACTION == 0)
+               return -1;
+
+       ModuleModes.MODE_NOKICK = cflag_add('E', chm_simple);
+       if (ModuleModes.MODE_NOKICK == 0)
+               return -1;
+
+       ModuleModes.MODE_NONICK = cflag_add('N', chm_simple);
+       if (ModuleModes.MODE_NONICK == 0)
+               return -1;
+
+       ModuleModes.MODE_NOCAPS = cflag_add('G', chm_simple);
+       if (ModuleModes.MODE_NOCAPS == 0)
+               return -1;
+
+       ModuleModes.MODE_NOREJOIN = cflag_add('J', chm_simple);
+       if (ModuleModes.MODE_NOREJOIN == 0)
+               return -1;
+
+       ModuleModes.MODE_NOREPEAT = cflag_add('K', chm_simple);
+       if (ModuleModes.MODE_NOREPEAT == 0)
+               return -1;
+
+       ModuleModes.MODE_NOOPERKICK = cflag_add('M', chm_hidden);
+       if (ModuleModes.MODE_NOOPERKICK == 0)
+               return -1;
+
+       return 0;
+}
+
+static void
+_moddeinit(void)
+{
+       /* charybdis modes */
+       cflag_orphan('C');
+       ModuleModes.MODE_NOCTCP = 0;
+
+       cflag_orphan('r');
+       ModuleModes.MODE_REGONLY = 0;
+
+       cflag_orphan('c');
+       ModuleModes.MODE_NOCOLOR = 0;
+
+       cflag_orphan('L');
+       ModuleModes.MODE_EXLIMIT = 0;
+
+       cflag_orphan('P');
+       ModuleModes.MODE_PERMANENT = 0;
+
+       cflag_orphan('z');
+       ModuleModes.MODE_OPMODERATE = 0;
+
+       cflag_orphan('g');
+       ModuleModes.MODE_FREEINVITE = 0;
+
+       cflag_orphan('F');
+       ModuleModes.MODE_FREETARGET = 0;
+
+       cflag_orphan('Q');
+       ModuleModes.MODE_DISFORWARD = 0;
+
+       cflag_orphan('q');
+       ModuleModes.CHFL_QUIET = 0;
+
+       cflag_orphan('f');
+       ModuleModes.MODE_FORWARD = 0;
+
+       cflag_orphan('j');
+       ModuleModes.MODE_THROTTLE = 0;
+
+       /* shadowircd modes */
+
+       cflag_orphan('T');
+       ModuleModes.MODE_NONOTICE = 0;
+
+       cflag_orphan('D');
+       ModuleModes.MODE_NOACTION = 0;
+
+       cflag_orphan('E');
+       ModuleModes.MODE_NOKICK = 0;
+
+       cflag_orphan('N');
+       ModuleModes.MODE_NONICK = 0;
+
+       cflag_orphan('G');
+       ModuleModes.MODE_NOCAPS = 0;
+
+       cflag_orphan('J');
+       ModuleModes.MODE_NOREJOIN = 0;
+
+       cflag_orphan('K');
+       ModuleModes.MODE_NOREPEAT = 0;
+
+       cflag_orphan('M');
+       ModuleModes.MODE_NOOPERKICK = 0;
+}
+
+DECLARE_MODULE_AV1(charybdis, _modinit, _moddeinit, NULL, NULL, NULL, "$charybdis$");
index 73c497e8a00849f213210b87e1f618b6d926c50f..81a62811d1680d0b8734f012cf350a24b152f817 100644 (file)
@@ -46,6 +46,8 @@ static int me_svsjoin(struct Client *, struct Client *, int, const char **);
 static int ms_join(struct Client *, struct Client *, int, const char **);
 static int ms_sjoin(struct Client *, struct Client *, int, const char **);
 
+struct module_modes ModuleModes;
+
 struct Message join_msgtab = {
        "JOIN", 0, 0, 0, MFLG_SLOW,
        {mg_unreg, {m_join, 2}, {ms_join, 2}, mg_ignore, mg_ignore, {m_join, 2}}
@@ -819,7 +821,7 @@ ms_sjoin(struct Client *client_p, struct Client *source_p, int parc, const char
                                     CheckEmpty(para[2]), CheckEmpty(para[3]));
        }
 
-       if(!joins && !(chptr->mode.mode & MODE_PERMANENT) && isnew)
+       if(!joins && !(chptr->mode.mode & ModuleModes.MODE_PERMANENT) && isnew)
        {
                destroy_channel(chptr);
 
@@ -970,7 +972,7 @@ set_final_mode(struct Mode *mode, struct Mode *oldmode)
                len = rb_sprintf(pbuf, "%d:%d ", mode->join_num, mode->join_time);
                pbuf += len;
        }
-       if(mode->forward[0] && strcmp(oldmode->forward, mode->forward) && ConfigChannel.use_forward)
+       if(mode->forward[0] && strcmp(oldmode->forward, mode->forward) && ModuleModes.MODE_FORWARD)
        {
                if(dir != MODE_ADD)
                {
index 012891fea9273901beb84e776e4232e0fe5cdeba..07d6c7dbc288fd5127cfb9885b4dc1f8fcf5a9f0 100644 (file)
@@ -39,6 +39,8 @@
 #include "s_conf.h"
 #include "hook.h"
 
+struct module_modes ModuleModes;
+
 static int m_kick(struct Client *, struct Client *, int, const char **);
 #define mg_kick { m_kick, 3 }
 
@@ -165,7 +167,7 @@ m_kick(struct Client *client_p, struct Client *source_p, int parc, const char *p
                        return 0;
                }
 
-               if(MyClient(source_p) && chptr->mode.mode & MODE_NOKICK)
+               if(MyClient(source_p) && chptr->mode.mode & ModuleModes.MODE_NOKICK)
                {
                        sendto_one_numeric(source_p, ERR_NOKICK,
                                        form_str(ERR_NOKICK),
@@ -173,7 +175,7 @@ m_kick(struct Client *client_p, struct Client *source_p, int parc, const char *p
                        return 0;
                }
 
-               if (MyClient(source_p) && chptr->mode.mode & MODE_NOOPERKICK && IsOper(who))
+               if (MyClient(source_p) && chptr->mode.mode & ModuleModes.MODE_NOOPERKICK && IsOper(who))
                {
                        sendto_realops_snomask(SNO_GENERAL, L_NETWIDE,
                                        "Overriding KICK from %s on %s in %s (channel is +M)",
@@ -237,7 +239,7 @@ m_kick(struct Client *client_p, struct Client *source_p, int parc, const char *p
                rb_snprintf(text, sizeof(text), "K%s", who->id);
 
                /* we don't need to track NOREJOIN stuff unless it's our client being kicked */
-               if(MyClient(who) && chptr->mode.mode & MODE_NOREJOIN)
+               if(MyClient(who) && chptr->mode.mode & ModuleModes.MODE_NOREJOIN)
                        channel_metadata_time_add(chptr, text, rb_current_time(), "KICKNOREJOIN");
        }
        else if (MyClient(source_p))
index 6f931173293e370359bcac731f63487ffbf107e7..c5d852b970480fbf1bea8ff5d6e1457487e49d99 100644 (file)
@@ -45,6 +45,7 @@
 #include "tgchange.h"
 #include "inline/stringops.h"
 #include "irc_dictionary.h"
+#include "channel.h"
 
 static int m_message(int, const char *, struct Client *, struct Client *, int, const char **);
 static int m_privmsg(struct Client *, struct Client *, int, const char **);
@@ -53,6 +54,8 @@ static int m_notice(struct Client *, struct Client *, int, const char **);
 static void expire_tgchange(void *unused);
 static struct ev_entry *expire_tgchange_event;
 
+struct module_modes ModuleModes;
+
 static int
 modinit(void)
 {
@@ -497,7 +500,7 @@ msg_channel(int p_or_n, const char *command,
                        source_p->localClient->last = rb_current_time();
        }
 
-       if(chptr->mode.mode & MODE_NOREPEAT)
+       if(chptr->mode.mode & ModuleModes.MODE_NOREPEAT)
        {
                rb_strlcpy(text2, text, BUFSIZE);
                strip_unprintable(text2);
@@ -515,7 +518,7 @@ msg_channel(int p_or_n, const char *command,
                channel_metadata_add(chptr, "NOREPEAT", text2, 0);
        }
 
-       if(chptr->mode.mode & MODE_NOCOLOR && (!ConfigChannel.exempt_cmode_c || !is_any_op(msptr)))
+       if(chptr->mode.mode & ModuleModes.MODE_NOCOLOR && (!ConfigChannel.exempt_cmode_c || !is_any_op(msptr)))
        {
                rb_strlcpy(text2, text, BUFSIZE);
                strip_colour(text2);
@@ -536,7 +539,7 @@ msg_channel(int p_or_n, const char *command,
                if(result == CAN_SEND_OPV ||
                   !flood_attack_channel(p_or_n, source_p, chptr, chptr->chname))
                {
-                       if (strlen(text) > 10 && chptr->mode.mode & MODE_NOCAPS && (!ConfigChannel.exempt_cmode_G || !is_any_op(msptr)))
+                       if (strlen(text) > 10 && chptr->mode.mode & ModuleModes.MODE_NOCAPS && (!ConfigChannel.exempt_cmode_G || !is_any_op(msptr)))
                        {
                                rb_strlcpy(text2, text, BUFSIZE);
                                strip_unprintable(text2);
@@ -552,12 +555,12 @@ msg_channel(int p_or_n, const char *command,
                                        return;
                                }
                        }
-                       if (p_or_n != PRIVMSG && chptr->mode.mode & MODE_NONOTICE && (!ConfigChannel.exempt_cmode_T || !is_any_op(msptr)))
+                       if (p_or_n != PRIVMSG && chptr->mode.mode & ModuleModes.MODE_NONOTICE && (!ConfigChannel.exempt_cmode_T || !is_any_op(msptr)))
                        {
                                sendto_one_numeric(source_p, 404, "%s :Cannot send to channel - Notices are disallowed (+T set)", chptr->chname);
                                return;
                        }
-                       if (p_or_n != NOTICE && chptr->mode.mode & MODE_NOACTION &&
+                       if (p_or_n != NOTICE && chptr->mode.mode & ModuleModes.MODE_NOACTION &&
                                        !strncasecmp(text + 1, "ACTION", 6) &&
                                        (!ConfigChannel.exempt_cmode_D || !is_any_op(msptr)))
                        {
@@ -567,7 +570,7 @@ msg_channel(int p_or_n, const char *command,
                        if (p_or_n != NOTICE && *text == '\001' &&
                                        strncasecmp(text + 1, "ACTION", 6))
                        {
-                               if (chptr->mode.mode & MODE_NOCTCP && (!ConfigChannel.exempt_cmode_C || !is_any_op(msptr)))
+                               if (chptr->mode.mode & ModuleModes.MODE_NOCTCP && (!ConfigChannel.exempt_cmode_C || !is_any_op(msptr)))
                                {
                                        sendto_one_numeric(source_p, 404, "%s :Cannot send to channel - CTCPs to this channel are disallowed (+C set)", chptr->chname);
                                        return;
@@ -579,7 +582,7 @@ msg_channel(int p_or_n, const char *command,
                                             "%s %s :%s", command, chptr->chname, text);
                }
        }
-       else if(chptr->mode.mode & MODE_OPMODERATE &&
+       else if(chptr->mode.mode & ModuleModes.MODE_OPMODERATE &&
                        (!(chptr->mode.mode & MODE_NOPRIVMSGS) ||
                         IsMember(source_p, chptr)))
        {
@@ -616,7 +619,7 @@ msg_channel_opmod(int p_or_n, const char *command,
 {
        char text2[BUFSIZE];
 
-       if(chptr->mode.mode & MODE_NOCOLOR)
+       if(chptr->mode.mode & ModuleModes.MODE_NOCOLOR)
        {
                rb_strlcpy(text2, text, BUFSIZE);
                strip_colour(text2);
@@ -631,7 +634,7 @@ msg_channel_opmod(int p_or_n, const char *command,
                }
        }
 
-       if(chptr->mode.mode & MODE_OPMODERATE &&
+       if(chptr->mode.mode & ModuleModes.MODE_OPMODERATE &&
                        (!(chptr->mode.mode & MODE_NOPRIVMSGS) ||
                         IsMember(source_p, chptr)))
        {
index 737c1bed5abf4cc0fe8a7edd739ea70e8898a42e..759a71d0eaf53b6fc24d1eb6f7825a174cb7cc2f 100644 (file)
@@ -41,6 +41,8 @@
 #include "packet.h"
 #include "s_newconf.h"
 
+struct module_modes ModuleModes;
+
 static int m_mode(struct Client *, struct Client *, int, const char **);
 static int ms_mode(struct Client *, struct Client *, int, const char **);
 static int ms_tmode(struct Client *, struct Client *, int, const char **);
@@ -258,7 +260,7 @@ ms_bmask(struct Client *client_p, struct Client *source_p, int parc, const char
 
        case 'q':
                banlist = &chptr->quietlist;
-               mode_type = CHFL_QUIET;
+               mode_type = ModuleModes.CHFL_QUIET;
                mems = ALL_MEMBERS;
                break;
 
index c69f314e5ff531da3a87871cba8493f1f681a90d..334665b6ed88188ac7ad7c53776ddeb80b3e8fca 100644 (file)
@@ -39,6 +39,7 @@
 #include "s_conf.h"
 #include "packet.h"
 #include "inline/stringops.h"
+#include "channel.h"
 
 static int m_part(struct Client *, struct Client *, int, const char **);
 
@@ -54,6 +55,7 @@ DECLARE_MODULE_AV1(part, NULL, NULL, part_clist, NULL, NULL, "$Revision: 98 $");
 static void part_one_client(struct Client *client_p,
                            struct Client *source_p, char *name, char *reason);
 
+struct module_modes ModuleModes;
 
 /*
 ** m_part
@@ -127,7 +129,7 @@ part_one_client(struct Client *client_p, struct Client *source_p, char *name, ch
                           (source_p->localClient->firsttime +
                            ConfigFileEntry.anti_spam_exit_message_time) < rb_current_time()))))
        {
-               if(chptr->mode.mode & MODE_NOCOLOR && (!ConfigChannel.exempt_cmode_c || !is_any_op(msptr)))
+               if(chptr->mode.mode & ModuleModes.MODE_NOCOLOR && (!ConfigChannel.exempt_cmode_c || !is_any_op(msptr)))
                {
                        rb_strlcpy(reason2, reason, BUFSIZE);
                        strip_colour(reason2);
index ca1d6268cae12a9d11fcc8dffd72e5173d7c1f9f..4b4324949b04b4f6c2093fdc5e2a92b055f6f963 100644 (file)
@@ -643,12 +643,6 @@ static struct InfoStruct info_table[] = {
                &ConfigChannel.use_invex,
                "Enable chanmode +I (invite exceptions)",
        },
-       {
-               "use_forward",
-               OUTPUT_BOOLEAN_YN,
-               &ConfigChannel.use_forward,
-               "Enable chanmode +f (channel forwarding)",
-       },
        {
                "use_knock",
                OUTPUT_BOOLEAN_YN,
index ed1c53dd844cc2025b954f5d554082ea39955f53..7fd5ff43c005c515284d87a30cb74626e41c20d4 100644 (file)
@@ -39,6 +39,9 @@
 #include "modules.h"
 #include "packet.h"
 #include "tgchange.h"
+#include "channel.h"
+
+struct module_modes ModuleModes;
 
 static int m_invite(struct Client *, struct Client *, int, const char **);
 
@@ -145,7 +148,7 @@ m_invite(struct Client *client_p, struct Client *source_p, int parc, const char
        /* unconditionally require ops, unless the channel is +g */
        /* treat remote clients as chanops */
        if(MyClient(source_p) && !is_any_op(msptr) &&
-                       !(chptr->mode.mode & MODE_FREEINVITE))
+                       !(chptr->mode.mode & ModuleModes.MODE_FREEINVITE))
        {
                if(IsOverride(source_p))
                {
@@ -176,7 +179,7 @@ m_invite(struct Client *client_p, struct Client *source_p, int parc, const char
         * for +l/+j just check if the mode is set, this varies over time
         */
        if(chptr->mode.mode & MODE_INVITEONLY ||
-                       (chptr->mode.mode & MODE_REGONLY && EmptyString(target_p->user->suser)) ||
+                       (chptr->mode.mode & ModuleModes.MODE_REGONLY && EmptyString(target_p->user->suser)) ||
                        chptr->mode.limit || chptr->mode.join_num)
                store_invite = 1;
 
index 67d56fbd64414f3f889fec980b99ec3b5d46b1ee..586ca157928f7f68a95cd385458a16d181bf25e8 100644 (file)
@@ -36,6 +36,8 @@
 #include "modules.h"
 #include "s_serv.h"
 
+struct module_modes ModuleModes;
+
 static int m_knock(struct Client *, struct Client *, int, const char **);
 
 struct Message knock_msgtab = {
@@ -157,7 +159,7 @@ m_knock(struct Client *client_p, struct Client *source_p, int parc, const char *
        chptr->last_knock = rb_current_time();
 
        if(ConfigChannel.use_knock)
-               sendto_channel_local(chptr->mode.mode & MODE_FREEINVITE ? ALL_MEMBERS : ONLY_CHANOPS,
+               sendto_channel_local(chptr->mode.mode & ModuleModes.MODE_FREEINVITE ? ALL_MEMBERS : ONLY_CHANOPS,
                                     chptr, form_str(RPL_KNOCK),
                                     me.name, name, name, source_p->name,
                                     source_p->username, source_p->host);
index 39d2f85d828dd80ddd5e9f9b7cd82f31ae560795..9c95fb736b01b94f686bbb04496b7a9eca8c2291 100644 (file)
@@ -66,6 +66,8 @@ static int h_can_join;
 static int h_can_create_channel;
 static int h_channel_join;
 
+struct module_modes ModuleModes;
+
 /* init_channels()
  *
  * input       -
@@ -85,6 +87,40 @@ init_channels(void)
        h_can_create_channel = register_hook("can_create_channel");
 }
 
+/* is this the best place to put this? */
+/* init_module_modes()
+ *
+ * input       -
+ * output      -
+ * side effects - various MODE_ values are set to 0
+ */
+void
+init_module_modes()
+{
+       ModuleModes.MODE_REGONLY = 0;
+       ModuleModes.MODE_NOCTCP = 0;
+       ModuleModes.MODE_NOCOLOR = 0;
+       ModuleModes.MODE_EXLIMIT = 0;
+       ModuleModes.MODE_PERMANENT = 0;
+       ModuleModes.MODE_OPMODERATE = 0;
+       ModuleModes.MODE_FREEINVITE = 0;
+       ModuleModes.MODE_FREETARGET = 0;
+       ModuleModes.MODE_DISFORWARD = 0;
+       ModuleModes.MODE_THROTTLE = 0;
+       ModuleModes.MODE_FORWARD = 0;
+       ModuleModes.MODE_NONOTICE = 0;
+       ModuleModes.MODE_NOACTION = 0;
+       ModuleModes.MODE_NOKICK = 0;
+       ModuleModes.MODE_NONICK = 0;
+       ModuleModes.MODE_NOCAPS = 0;
+       ModuleModes.MODE_NOREJOIN = 0;
+       ModuleModes.MODE_NOREPEAT = 0;
+       ModuleModes.MODE_NOOPERKICK = 0;
+
+       ModuleModes.CHFL_QUIET = 0;
+}
+
+
 /*
  * allocate_channel - Allocates a channel
  */
@@ -352,7 +388,7 @@ remove_user_from_channel(struct membership *msptr)
        if(client_p->servptr == &me)
                rb_dlinkDelete(&msptr->locchannode, &chptr->locmembers);
 
-       if(!(chptr->mode.mode & MODE_PERMANENT) && rb_dlink_list_length(&chptr->members) <= 0)
+       if(!(chptr->mode.mode & ModuleModes.MODE_PERMANENT) && rb_dlink_list_length(&chptr->members) <= 0)
                destroy_channel(chptr);
 
        rb_bh_free(member_heap, msptr);
@@ -387,7 +423,7 @@ remove_user_from_channels(struct Client *client_p)
                if(client_p->servptr == &me)
                        rb_dlinkDelete(&msptr->locchannode, &chptr->locmembers);
 
-               if(!(chptr->mode.mode & MODE_PERMANENT) && rb_dlink_list_length(&chptr->members) <= 0)
+               if(!(chptr->mode.mode & ModuleModes.MODE_PERMANENT) && rb_dlink_list_length(&chptr->members) <= 0)
                        destroy_channel(chptr);
 
                rb_bh_free(member_heap, msptr);
@@ -723,6 +759,10 @@ is_quieted(struct Channel *chptr, struct Client *who, struct membership *msptr,
        struct Ban *actualBan = NULL;
        struct Ban *actualExcept = NULL;
 
+       /* check to make sure quiets even exist on this server first */
+       if(ModuleModes.CHFL_QUIET == 0)
+               return 0;
+
        if(!MyClient(who))
                return 0;
 
@@ -758,7 +798,7 @@ is_quieted(struct Channel *chptr, struct Client *who, struct membership *msptr,
                if(match(actualBan->banstr, s) ||
                   match(actualBan->banstr, s2) ||
                   match_cidr(actualBan->banstr, s2) ||
-                  match_extban(actualBan->banstr, who, chptr, CHFL_QUIET) ||
+                  match_extban(actualBan->banstr, who, chptr, ModuleModes.CHFL_QUIET) ||
                   (s3 != NULL && match(actualBan->banstr, s3)))
                        break;
                else
@@ -899,15 +939,19 @@ can_join(struct Client *source_p, struct Channel *chptr, char *key)
        if(chptr->mode.limit &&
           rb_dlink_list_length(&chptr->members) >= (unsigned long) chptr->mode.limit)
                i = ERR_CHANNELISFULL;
-       if(chptr->mode.mode & MODE_REGONLY && EmptyString(source_p->user->suser))
+       if(chptr->mode.mode & ModuleModes.MODE_REGONLY && EmptyString(source_p->user->suser))
                i = ERR_NEEDREGGEDNICK;
        /* join throttling stuff --nenolod */
-       else if(chptr->mode.join_num > 0 && chptr->mode.join_time > 0)
+       /* only check for throttles if they exist on this server --Taros */
+       else if(ModuleModes.MODE_THROTTLE)
        {
-               if ((rb_current_time() - chptr->join_delta <= 
-                       chptr->mode.join_time) && (chptr->join_count >=
-                       chptr->mode.join_num))
-                       i = ERR_THROTTLE;
+               if(chptr->mode.join_num > 0 && chptr->mode.join_time > 0)
+               {
+                       if ((rb_current_time() - chptr->join_delta <= 
+                               chptr->mode.join_time) && (chptr->join_count >=
+                               chptr->mode.join_num))
+                               i = ERR_THROTTLE;
+               }
        }
 
        /* allow /invite to override +l/+r/+j also -- jilles */
@@ -1042,7 +1086,7 @@ find_nonickchange_channel(struct Client *client_p)
        {
                msptr = ptr->data;
                chptr = msptr->chptr;
-               if (chptr->mode.mode & MODE_NONICK && (!ConfigChannel.exempt_cmode_N || !is_any_op(msptr)))
+               if (chptr->mode.mode & ModuleModes.MODE_NONICK && (!ConfigChannel.exempt_cmode_N || !is_any_op(msptr)))
                        return chptr;
        }
        return NULL;
@@ -1297,7 +1341,7 @@ channel_modes(struct Channel *chptr, struct Client *client_p)
                                           chptr->mode.join_time);
        }
 
-       if(*chptr->mode.forward && (ConfigChannel.use_forward || !IsClient(client_p)))
+       if(*chptr->mode.forward && (ModuleModes.MODE_FORWARD || !IsClient(client_p)))
        {
                *mbuf++ = 'f';
 
@@ -1608,7 +1652,7 @@ check_forward(struct Client *source_p, struct Channel *chptr,
                if (hash_find_resv(chptr->chname))
                        return NULL;
                /* Don't forward to +Q channel */
-               if (chptr->mode.mode & MODE_DISFORWARD)
+               if (chptr->mode.mode & ModuleModes.MODE_DISFORWARD)
                        return NULL;
                i = can_join(source_p, chptr, key);
                if (i == 0)
@@ -1868,7 +1912,7 @@ void user_join(struct Client * client_p, struct Client * source_p, const char *
                                                me.name, get_oper_name(source_p), chptr->chname);
                        }
                        else if ((i != ERR_NEEDREGGEDNICK && i != ERR_THROTTLE && i != ERR_INVITEONLYCHAN && i != ERR_CHANNELISFULL) ||
-                           (!ConfigChannel.use_forward || (chptr = check_forward(source_p, chptr, key)) == NULL))
+                           (!ModuleModes.MODE_FORWARD || (chptr = check_forward(source_p, chptr, key)) == NULL))
                        {
                                /* might be wrong, but is there any other better location for such?
                                 * see extensions/chm_operonly.c for other comments on this
index cab5b31400989108c9027b59a9ab8bbb72f9660a..7de7ba913b54c006fb514ce7d6b72d122d131db2 100644 (file)
@@ -71,6 +71,8 @@ char cflagsmyinfo[256];
 
 int chmode_flags[256];
 
+struct module_modes ModuleModes;
+
 /* OPTIMIZE ME! -- dwr */
 void
 construct_cflags_strings(void)
@@ -101,29 +103,24 @@ construct_cflags_strings(void)
                        chmode_flags[i] = 0;
                }
                 
-               switch (chmode_flags[i])
+               if(chmode_flags[i] == ModuleModes.MODE_DISFORWARD)
                {
-                   case MODE_EXLIMIT:
-                   case MODE_DISFORWARD:
-                       if(ConfigChannel.use_forward)
-                       {
-                           *ptr++ = (char) i;
-                       }
-                       
-                       break;
-                   case MODE_REGONLY:
-                       if(rb_dlink_list_length(&service_list))
+                       if (ModuleModes.MODE_FORWARD)
                        {
-                           *ptr++ = (char) i;
+                               *ptr++ = (char) i;
                        }
-
-                       break;
-                   default:
-                       if(chmode_flags[i] != 0)
+               }
+               else if(chmode_flags[i] == ModuleModes.MODE_REGONLY)
+               {
+                       if (rb_dlink_list_length(&service_list))
                        {
-                           *ptr++ = (char) i;
+                               *ptr++ = (char) i;
                        }
                }
+               else if(chmode_flags[i] != ModuleModes.MODE_EXLIMIT && chmode_flags[i] != 0)
+               {
+                       *ptr++ = (char) i;
+               }
                
                /* Should we leave orphaned check here? -- dwr */
                if(!(chmode_table[i].set_func == chm_nosuch) && !(chmode_table[i].set_func == chm_orphaned))
@@ -219,7 +216,7 @@ add_id(struct Client *source_p, struct Channel *chptr, const char *banid,
         */
        if(MyClient(source_p))
        {
-               if((rb_dlink_list_length(&chptr->banlist) + rb_dlink_list_length(&chptr->exceptlist) + rb_dlink_list_length(&chptr->invexlist) + rb_dlink_list_length(&chptr->quietlist)) >= (chptr->mode.mode & MODE_EXLIMIT ? ConfigChannel.max_bans_large : ConfigChannel.max_bans))
+               if((rb_dlink_list_length(&chptr->banlist) + rb_dlink_list_length(&chptr->exceptlist) + rb_dlink_list_length(&chptr->invexlist) + rb_dlink_list_length(&chptr->quietlist)) >= (chptr->mode.mode & ModuleModes.MODE_EXLIMIT ? ConfigChannel.max_bans_large : ConfigChannel.max_bans))
                {
                        sendto_one(source_p, form_str(ERR_BANLISTFULL),
                                   me.name, source_p->name, chptr->chname, realban);
@@ -256,7 +253,7 @@ add_id(struct Client *source_p, struct Channel *chptr, const char *banid,
        rb_dlinkAdd(actualBan, &actualBan->node, list);
 
        /* invalidate the can_send() cache */
-       if(mode_type == CHFL_BAN || mode_type == CHFL_QUIET || mode_type == CHFL_EXCEPTION)
+       if(mode_type == CHFL_BAN || mode_type == ModuleModes.CHFL_QUIET || mode_type == CHFL_EXCEPTION)
                chptr->bants++;
 
        return 1;
@@ -287,7 +284,7 @@ del_id(struct Channel *chptr, const char *banid, rb_dlink_list * list, long mode
                        free_ban(banptr);
 
                        /* invalidate the can_send() cache */
-                       if(mode_type == CHFL_BAN || mode_type == CHFL_QUIET || mode_type == CHFL_EXCEPTION)
+                       if(mode_type == CHFL_BAN || mode_type == ModuleModes.CHFL_QUIET || mode_type == CHFL_EXCEPTION)
                                chptr->bants++;
 
                        return 1;
@@ -536,7 +533,7 @@ chm_simple(struct Client *source_p, struct Channel *chptr,
        if((dir == MODE_ADD) && !(chptr->mode.mode & mode_type))
        {
                /* if +f is disabled, ignore an attempt to set +QF locally */
-               if(!ConfigChannel.use_forward && MyClient(source_p) &&
+               if(!ModuleModes.MODE_FORWARD && MyClient(source_p) &&
                   (c == 'Q' || c == 'F'))
                        return;
 
@@ -751,18 +748,17 @@ chm_ban(struct Client *source_p, struct Channel *chptr,
        int mems;
        int override = 0;
 
-       switch (mode_type)
+       if(mode_type == CHFL_BAN)
        {
-       case CHFL_BAN:
                list = &chptr->banlist;
                errorval = SM_ERR_RPL_B;
                rpl_list = RPL_BANLIST;
                rpl_endlist = RPL_ENDOFBANLIST;
                mems = ALL_MEMBERS;
                caps = 0;
-               break;
-
-       case CHFL_EXCEPTION:
+       }
+       else if(mode_type == CHFL_EXCEPTION)
+       {
                /* if +e is disabled, allow all but +e locally */
                if(!ConfigChannel.use_except && MyClient(source_p) &&
                   ((dir == MODE_ADD) && (parc > *parn)))
@@ -778,9 +774,9 @@ chm_ban(struct Client *source_p, struct Channel *chptr,
                        mems = ONLY_CHANOPS;
                else
                        mems = ONLY_SERVERS;
-               break;
-
-       case CHFL_INVEX:
+       }
+       else if(mode_type == CHFL_INVEX)
+       {
                /* if +I is disabled, allow all but +I locally */
                if(!ConfigChannel.use_invex && MyClient(source_p) &&
                   (dir == MODE_ADD) && (parc > *parn))
@@ -796,21 +792,20 @@ chm_ban(struct Client *source_p, struct Channel *chptr,
                        mems = ONLY_CHANOPS;
                else
                        mems = ONLY_SERVERS;
-               break;
-
-       case CHFL_QUIET:
+       }
+       else if(mode_type == ModuleModes.CHFL_QUIET)
+       {
                list = &chptr->quietlist;
                errorval = SM_ERR_RPL_Q;
                rpl_list = RPL_QUIETLIST;
                rpl_endlist = RPL_ENDOFQUIETLIST;
                mems = ALL_MEMBERS;
                caps = 0;
-               break;
-
-       default:
+       }
+       else
+       {
                sendto_realops_snomask(SNO_GENERAL, L_ALL, "chm_ban() called with unknown type!");
                return;
-               break;
        }
 
        if(dir == 0 || parc <= *parn)
@@ -821,7 +816,7 @@ chm_ban(struct Client *source_p, struct Channel *chptr,
 
                /* non-ops cant see +eI lists.. */
                if(alevel != CHFL_CHANOP && alevel != CHFL_ADMIN && alevel != CHFL_HALFOP && mode_type != CHFL_BAN &&
-                               mode_type != CHFL_QUIET)
+                               mode_type != ModuleModes.CHFL_QUIET)
                {
                        if(IsOverride(source_p))
                        {
@@ -1508,7 +1503,7 @@ chm_forward(struct Client *source_p, struct Channel *chptr,
        int override = 0;
 
        /* if +f is disabled, ignore local attempts to set it */
-       if(!ConfigChannel.use_forward && MyClient(source_p) &&
+       if(!ModuleModes.MODE_FORWARD && MyClient(source_p) &&
           (dir == MODE_ADD) && (parc > *parn))
                return;
 
@@ -1578,10 +1573,10 @@ chm_forward(struct Client *source_p, struct Channel *chptr,
                                           form_str(ERR_NOSUCHCHANNEL), forward);
                        return;
                }
-               if(MyClient(source_p) && !(targptr->mode.mode & MODE_FREETARGET))
+               if(MyClient(source_p) && !(targptr->mode.mode & ModuleModes.MODE_FREETARGET))
                {
                        if((msptr = find_channel_membership(targptr, source_p)) == NULL ||
-                               is_any_op(msptr))
+                               !is_any_op(msptr))
                        {
                                if(IsOverride(source_p))
                                        override = 1;
@@ -1600,7 +1595,7 @@ chm_forward(struct Client *source_p, struct Channel *chptr,
                mode_changes[mode_count].dir = MODE_ADD;
                mode_changes[mode_count].caps = 0;
                mode_changes[mode_count].nocaps = 0;
-               mode_changes[mode_count].mems = ConfigChannel.use_forward ? ALL_MEMBERS : ONLY_SERVERS;
+               mode_changes[mode_count].mems = ModuleModes.MODE_FORWARD ? ALL_MEMBERS : ONLY_SERVERS;
                mode_changes[mode_count].id = NULL;
                mode_changes[mode_count].override = override;
                mode_changes[mode_count++].arg = forward;
@@ -1757,6 +1752,9 @@ chm_regonly(struct Client *source_p, struct Channel *chptr,
 }
 
 /* *INDENT-OFF* */
+/* Only RFC and ircd-ratbox modes are held in this table
+ * All other modes are added via loading modules in shadowircd/modes
+ * Such is documented in the comments for each mode, ex: C - NOCTCP. */
 struct ChannelMode chmode_table[256] =
 {
   {chm_nosuch,  0 },                   /* 0x00 */
@@ -1827,24 +1825,24 @@ struct ChannelMode chmode_table[256] =
   {chm_nosuch, 0 },                    /* @ */
   {chm_nosuch, 0 },                    /* A */
   {chm_nosuch, 0 },                    /* B */
-  {chm_simple, MODE_NOCTCP },          /* C */
-  {chm_simple, MODE_NOACTION },        /* D */
-  {chm_simple, MODE_NOKICK },          /* E */
-  {chm_simple, MODE_FREETARGET },      /* F */
-  {chm_simple, MODE_NOCAPS },          /* G */
+  {chm_nosuch, 0 },                    /* C - MODE_NOCTCP */
+  {chm_nosuch, 0 },                    /* D - MODE_NOACTION */
+  {chm_nosuch, 0 },                    /* E - MODE_NOKICK */
+  {chm_nosuch, 0 },                    /* F - MODE_FREETARGET */
+  {chm_nosuch, 0 },                    /* G - MODE_NOCAPS */
   {chm_nosuch, 0 },                    /* H */
   {chm_ban,    CHFL_INVEX },           /* I */
-  {chm_simple, MODE_NOREJOIN },        /* J */
-  {chm_simple, MODE_NOREPEAT },        /* K */
-  {chm_staff,  MODE_EXLIMIT },         /* L */
-  {chm_hidden, MODE_NOOPERKICK },      /* M */
-  {chm_simple, MODE_NONICK },          /* N */
+  {chm_nosuch, 0 },                    /* J - MODE_NOREJOIN */
+  {chm_nosuch, 0 },                    /* K - MODE_NOREPEAT */
+  {chm_nosuch, 0 },                    /* L - MODE_EXLIMIT */
+  {chm_nosuch, 0 },                    /* M - MODE_NOOPERKICK */
+  {chm_nosuch, 0 },                    /* N - MODE_NONICK */
   {chm_nosuch, 0 },                    /* O */
-  {chm_staff,  MODE_PERMANENT },       /* P */
-  {chm_simple, MODE_DISFORWARD },      /* Q */
+  {chm_nosuch, 0 },                    /* P - MODE_PERMANENT */
+  {chm_nosuch, 0 },                    /* Q - MODE_DISFORWARD */
   {chm_nosuch, 0 },                    /* R */
   {chm_nosuch, 0 },                    /* S */
-  {chm_simple, MODE_NONOTICE },        /* T */
+  {chm_nosuch, 0 },                    /* T - MODE_NONOTICE */
   {chm_nosuch, 0 },                    /* U */
   {chm_nosuch, 0 },                    /* V */
   {chm_nosuch, 0 },                    /* W */
@@ -1859,22 +1857,22 @@ struct ChannelMode chmode_table[256] =
   {chm_nosuch, 0 },
   {chm_admin,  0 },                    /* a */
   {chm_ban,    CHFL_BAN },             /* b */
-  {chm_simple, MODE_NOCOLOR },         /* c */
+  {chm_nosuch, 0 },                    /* c - MODE_NOCOLOR */
   {chm_nosuch, 0 },                    /* d */
   {chm_ban,    CHFL_EXCEPTION },       /* e */
-  {chm_forward,        0 },                    /* f */
-  {chm_simple, MODE_FREEINVITE },      /* g */
+  {chm_nosuch, 0 },                    /* f - MODE_FORWARD */
+  {chm_nosuch, 0 },                    /* g - MODE_FREEINVITE */
   {chm_halfop, 0 },                    /* h */
   {chm_simple, MODE_INVITEONLY },      /* i */
-  {chm_throttle, 0 },                  /* j */
+  {chm_nosuch, 0 },                    /* j - MODE_THROTTLE */
   {chm_key,    0 },                    /* k */
   {chm_limit,  0 },                    /* l */
   {chm_simple, MODE_MODERATED },       /* m */
   {chm_simple, MODE_NOPRIVMSGS },      /* n */
   {chm_op,     0 },                    /* o */
   {chm_simple, MODE_PRIVATE },         /* p */
-  {chm_ban,    CHFL_QUIET },           /* q */
-  {chm_regonly, MODE_REGONLY },                /* r */
+  {chm_nosuch, 0 },                    /* q - CHFL_QUIET */
+  {chm_nosuch, 0 },                    /* r - MODE_REGONLY */
   {chm_simple, MODE_SECRET },          /* s */
   {chm_simple, MODE_TOPICLIMIT },      /* t */
   {chm_nosuch, 0 },                    /* u */
@@ -1882,7 +1880,7 @@ struct ChannelMode chmode_table[256] =
   {chm_nosuch, 0 },                    /* w */
   {chm_nosuch, 0 },                    /* x */
   {chm_nosuch, 0 },                    /* y */
-  {chm_simple, MODE_OPMODERATE },      /* z */
+  {chm_nosuch, 0 },                    /* z - MODE_OPMODERATE */
 
   {chm_nosuch,  0 },                   /* 0x7b */
   {chm_nosuch,  0 },                   /* 0x7c */
index 8716b3e99a5a59635b0418a3244f4c4774f59f19..c4a7c8074fc5f455af77784c9dfa0e281a4f5c62 100644 (file)
@@ -641,6 +641,7 @@ main(int argc, char *argv[])
 
        seed_random(NULL);
 
+       init_module_modes();
        init_main_logfile();
        newconf_init();
        init_s_conf();
index a48f6397231dd999c592d30cc110b28b4bcc3fae..8eeca1e5e0997b9831280b79f9431b9cc087123d 100644 (file)
@@ -2283,7 +2283,6 @@ static struct ConfEntry conf_channel_table[] =
        { "use_except",         CF_YESNO, NULL, 0, &ConfigChannel.use_except            },
        { "use_invex",          CF_YESNO, NULL, 0, &ConfigChannel.use_invex             },
        { "use_knock",          CF_YESNO, NULL, 0, &ConfigChannel.use_knock             },
-       { "use_forward",        CF_YESNO, NULL, 0, &ConfigChannel.use_forward           },
        { "use_local_channels", CF_YESNO, NULL, 0, &ConfigChannel.use_local_channels    },
        { "resv_forcepart",     CF_YESNO, NULL, 0, &ConfigChannel.resv_forcepart        },
        { "exempt_cmode_c",     CF_YESNO, NULL, 0, &ConfigChannel.exempt_cmode_c        },
index 52e59b87bf0a7af22eabdf9c9ede6355e0ee76f4..1cf0c269db70073a27ac618b7bfc7362ccf4e017 100644 (file)
@@ -768,7 +768,6 @@ set_default_conf(void)
        ConfigChannel.use_except = YES;
        ConfigChannel.use_invex = YES;
        ConfigChannel.use_knock = YES;
-       ConfigChannel.use_forward = YES;
        ConfigChannel.use_local_channels = YES;
        ConfigChannel.knock_delay = 300;
        ConfigChannel.knock_delay_channel = 60;
index e6dc1ca60172d51773357d6fe0f9ff693f5a796c..b0ed306187ce5a04382050796b90354ddd20ea74 100644 (file)
@@ -54,6 +54,8 @@
 #include "substitution.h"
 #include "chmode.h"
 
+struct module_modes ModuleModes;
+
 static void report_and_set_user_flags(struct Client *, struct ConfItem *);
 void user_welcome(struct Client *source_p);
 
@@ -1101,7 +1103,7 @@ user_mode(struct Client *client_p, struct Client *source_p, int parc, const char
                        }
                        /* FALLTHROUGH */
                default:
-                       if (MyConnect(source_p) && *pm == 'Q' && !ConfigChannel.use_forward) {
+                       if (MyConnect(source_p) && *pm == 'Q' && !ModuleModes.MODE_FORWARD) {
                                badflag = YES;
                                break;
                        }
index 49f0da414bfbdc2ad8362e6dd14accc03c39a612..a8f734adacb13b8c0e4c1e4edd636ed753bda7d8 100644 (file)
@@ -87,6 +87,9 @@
 #include "s_conf.h"
 #include "supported.h"
 #include "chmode.h"
+#include "channel.h"
+
+struct module_modes ModuleModes;
 
 rb_dlink_list isupportlist;
 
@@ -238,7 +241,7 @@ isupport_chanmodes(const void *ptr)
        rb_snprintf(result, sizeof result, "%s%sbq,k,%slj,%s",
                        ConfigChannel.use_except ? "e" : "",
                        ConfigChannel.use_invex ? "I" : "",
-                       ConfigChannel.use_forward ? "f" : "",
+                       ModuleModes.MODE_FORWARD ? "f" : "",
                        cflagsbuf);
        return result;
 }