mode api: Remove most modes from the chmode_table, and have them initialized in modeset files.

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.
This commit is contained in:
B.Greenham 2010-07-02 19:09:46 -04:00
parent ed6ad7a375
commit 1fe75e33cc
27 changed files with 574 additions and 145 deletions

View File

@ -46,7 +46,7 @@ CFLAGS = @CFLAGS@
# the system one. # the system one.
#CFLAGS= -DNDEBUG -g -O2 -D"FD_SETSIZE=1024" #CFLAGS= -DNDEBUG -g -O2 -D"FD_SETSIZE=1024"
SHELL=/bin/sh 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} CLEANDIRS = ${SUBDIRS}
RSA_FILES=rsa_respond/README rsa_respond/respond.c rsa_respond/Makefile RSA_FILES=rsa_respond/README rsa_respond/respond.c rsa_respond/Makefile

21
configure vendored
View File

@ -1,6 +1,6 @@
#! /bin/sh #! /bin/sh
# Guess values for system-dependent variables and create Makefiles. # 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 $ # $Id: configure.ac 3516 2007-06-10 16:14:03Z jilles $
# #
@ -551,8 +551,8 @@ MAKEFLAGS=
# Identity of this package. # Identity of this package.
PACKAGE_NAME='shadowircd' PACKAGE_NAME='shadowircd'
PACKAGE_TARNAME='shadowircd' PACKAGE_TARNAME='shadowircd'
PACKAGE_VERSION='6.1.0' PACKAGE_VERSION='6.2.0'
PACKAGE_STRING='shadowircd 6.1.0' PACKAGE_STRING='shadowircd 6.2.0'
PACKAGE_BUGREPORT='' PACKAGE_BUGREPORT=''
PACKAGE_URL='' 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. # 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. # This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF 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]... Usage: $0 [OPTION]... [VAR=VALUE]...
@ -1326,7 +1326,7 @@ fi
if test -n "$ac_init_help"; then if test -n "$ac_init_help"; then
case $ac_init_help in case $ac_init_help in
short | recursive ) echo "Configuration of shadowircd 6.1.0:";; short | recursive ) echo "Configuration of shadowircd 6.2.0:";;
esac esac
cat <<\_ACEOF cat <<\_ACEOF
@ -1444,7 +1444,7 @@ fi
test -n "$ac_init_help" && exit $ac_status test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then if $ac_init_version; then
cat <<\_ACEOF cat <<\_ACEOF
shadowircd configure 6.1.0 shadowircd configure 6.2.0
generated by GNU Autoconf 2.65 generated by GNU Autoconf 2.65
Copyright (C) 2009 Free Software Foundation, Inc. Copyright (C) 2009 Free Software Foundation, Inc.
@ -2043,7 +2043,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake. 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 generated by GNU Autoconf 2.65. Invocation command line was
$ $0 $@ $ $0 $@
@ -9459,7 +9459,7 @@ _ACEOF
fi 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 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 # report actual input values of CONFIG_FILES etc. instead of their
# values after options handling. # values after options handling.
ac_log=" 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 generated by GNU Autoconf 2.65. Invocation command line was
CONFIG_FILES = $CONFIG_FILES CONFIG_FILES = $CONFIG_FILES
@ -10031,7 +10031,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\ ac_cs_version="\\
shadowircd config.status 6.1.0 shadowircd config.status 6.2.0
configured by $0, generated by GNU Autoconf 2.65, configured by $0, generated by GNU Autoconf 2.65,
with options \\"\$ac_cs_config\\" with options \\"\$ac_cs_config\\"
@ -10152,6 +10152,7 @@ do
"bandb/Makefile") CONFIG_FILES="$CONFIG_FILES bandb/Makefile" ;; "bandb/Makefile") CONFIG_FILES="$CONFIG_FILES bandb/Makefile" ;;
"ssld/Makefile") CONFIG_FILES="$CONFIG_FILES ssld/Makefile" ;; "ssld/Makefile") CONFIG_FILES="$CONFIG_FILES ssld/Makefile" ;;
"extensions/Makefile") CONFIG_FILES="$CONFIG_FILES extensions/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" ;; "unsupported/Makefile") CONFIG_FILES="$CONFIG_FILES unsupported/Makefile" ;;
"src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;;
"modules/Makefile") CONFIG_FILES="$CONFIG_FILES modules/Makefile" ;; "modules/Makefile") CONFIG_FILES="$CONFIG_FILES modules/Makefile" ;;

View File

@ -10,7 +10,7 @@ AC_PREREQ(2.57)
dnl Sneaky way to get an Id tag into the configure script 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_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) AC_CONFIG_HEADER(include/setup.h)
@ -1160,6 +1160,7 @@ AC_CONFIG_FILES( \
bandb/Makefile \ bandb/Makefile \
ssld/Makefile \ ssld/Makefile \
extensions/Makefile \ extensions/Makefile \
modes/Makefile \
unsupported/Makefile \ unsupported/Makefile \
src/Makefile \ src/Makefile \
modules/Makefile \ modules/Makefile \

View File

@ -45,6 +45,10 @@ loadmodule "extensions/sno_globalkline.so";
loadmodule "extensions/sno_globaloper.so"; loadmodule "extensions/sno_globaloper.so";
#loadmodule "extensions/sno_whois.so"; #loadmodule "extensions/sno_whois.so";
/* Modesets, load only one */
loadmodule "modes/shadowircd.so";
#loadmodule "modes/charybdis.so";
serverinfo { serverinfo {
name = "hades.arpa"; name = "hades.arpa";
sid = "42X"; sid = "42X";
@ -379,7 +383,6 @@ channel {
use_invex = yes; use_invex = yes;
use_except = yes; use_except = yes;
use_knock = yes; use_knock = yes;
use_forward = yes;
use_local_channels = yes; use_local_channels = yes;
knock_delay = 5 minutes; knock_delay = 5 minutes;
knock_delay_channel = 1 minute; knock_delay_channel = 1 minute;

View File

@ -115,6 +115,31 @@ loadmodule "extensions/sno_globalkline.so";
loadmodule "extensions/sno_globaloper.so"; loadmodule "extensions/sno_globaloper.so";
#loadmodule "extensions/sno_whois.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 {}: Contains information about the server. (OLD M:) */
serverinfo { serverinfo {
@ -787,14 +812,6 @@ channel {
*/ */
use_except = yes; 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 /* knock: Allows users to request an invite to a channel that
* is locked somehow (+ikl). If the channel is +p or you are banned * is locked somehow (+ikl). If the channel is +p or you are banned
* the knock will not be sent. * the knock will not be sent.

View File

@ -9,6 +9,9 @@
#include "hook.h" #include "hook.h"
#include "ircd.h" #include "ircd.h"
#include "chmode.h" #include "chmode.h"
#include "channel.h"
struct module_modes ModuleModes;
static int _modinit(void); static int _modinit(void);
static void _moddeinit(void); static void _moddeinit(void);
@ -44,7 +47,7 @@ chm_quietunreg(struct Client *source_p, struct Channel *chptr,
if (MyClient(source_p)) if (MyClient(source_p))
chm_ban(source_p, chptr, alevel, 1, &newparn, newparv, chm_ban(source_p, chptr, alevel, 1, &newparn, newparv,
errors, dir, 'q', CHFL_QUIET); errors, dir, 'q', ModuleModes.CHFL_QUIET);
else else
chm_nosuch(source_p, chptr, alevel, parc, parn, parv, chm_nosuch(source_p, chptr, alevel, parc, parn, parv,
errors, dir, c, mode_type); errors, dir, c, mode_type);

View File

@ -37,6 +37,8 @@
#include "s_conf.h" #include "s_conf.h"
#include "s_serv.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[]); 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); rb_snprintf(text, sizeof(text), "K%s", who->id);
/* we don't need to track NOREJOIN stuff unless it's our client being kicked */ /* 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"); channel_metadata_time_add(chptr, text, rb_current_time(), "KICKNOREJOIN");
return 0; return 0;
} }

View File

@ -136,6 +136,32 @@ struct ChannelMode
long mode_type; 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, typedef int (*ExtbanFunc)(const char *data, struct Client *client_p,
struct Channel *chptr, long mode_type); 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_TOPICLIMIT 0x0008
#define MODE_INVITEONLY 0x0010 #define MODE_INVITEONLY 0x0010
#define MODE_NOPRIVMSGS 0x0020 #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_BAN 0x10000000 /* ban channel flag */
#define CHFL_EXCEPTION 0x20000000 /* exception to ban channel flag */ #define CHFL_EXCEPTION 0x20000000 /* exception to ban channel flag */
#define CHFL_INVEX 0x40000000 #define CHFL_INVEX 0x40000000
#define CHFL_QUIET 0x80000000
/* mode flags for direction indication */ /* mode flags for direction indication */
#define MODE_QUERY 0 #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; extern rb_dlink_list global_channel_list;
void init_channels(void); void init_channels(void);
void init_module_modes(void);
struct Channel *allocate_channel(const char *chname); struct Channel *allocate_channel(const char *chname);
void free_channel(struct Channel *chptr); void free_channel(struct Channel *chptr);

View File

@ -243,7 +243,6 @@ struct config_channel_entry
int use_except; int use_except;
int use_invex; int use_invex;
int use_knock; int use_knock;
int use_forward;
int use_local_channels; int use_local_channels;
int knock_delay; int knock_delay;
int knock_delay_channel; int knock_delay_channel;

68
modes/Makefile.in Normal file
View File

@ -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

104
modes/charybdis.c Normal file
View File

@ -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$");

166
modes/shadowircd.c Normal file
View File

@ -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$");

View 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_join(struct Client *, struct Client *, int, const char **);
static int ms_sjoin(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 = { struct Message join_msgtab = {
"JOIN", 0, 0, 0, MFLG_SLOW, "JOIN", 0, 0, 0, MFLG_SLOW,
{mg_unreg, {m_join, 2}, {ms_join, 2}, mg_ignore, mg_ignore, {m_join, 2}} {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])); 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); 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); len = rb_sprintf(pbuf, "%d:%d ", mode->join_num, mode->join_time);
pbuf += len; 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) if(dir != MODE_ADD)
{ {

View File

@ -39,6 +39,8 @@
#include "s_conf.h" #include "s_conf.h"
#include "hook.h" #include "hook.h"
struct module_modes ModuleModes;
static int m_kick(struct Client *, struct Client *, int, const char **); static int m_kick(struct Client *, struct Client *, int, const char **);
#define mg_kick { m_kick, 3 } #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; 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, sendto_one_numeric(source_p, ERR_NOKICK,
form_str(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; 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, sendto_realops_snomask(SNO_GENERAL, L_NETWIDE,
"Overriding KICK from %s on %s in %s (channel is +M)", "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); rb_snprintf(text, sizeof(text), "K%s", who->id);
/* we don't need to track NOREJOIN stuff unless it's our client being kicked */ /* 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"); channel_metadata_time_add(chptr, text, rb_current_time(), "KICKNOREJOIN");
} }
else if (MyClient(source_p)) else if (MyClient(source_p))

View File

@ -45,6 +45,7 @@
#include "tgchange.h" #include "tgchange.h"
#include "inline/stringops.h" #include "inline/stringops.h"
#include "irc_dictionary.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_message(int, const char *, struct Client *, struct Client *, int, const char **);
static int m_privmsg(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 void expire_tgchange(void *unused);
static struct ev_entry *expire_tgchange_event; static struct ev_entry *expire_tgchange_event;
struct module_modes ModuleModes;
static int static int
modinit(void) modinit(void)
{ {
@ -497,7 +500,7 @@ msg_channel(int p_or_n, const char *command,
source_p->localClient->last = rb_current_time(); 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); rb_strlcpy(text2, text, BUFSIZE);
strip_unprintable(text2); strip_unprintable(text2);
@ -515,7 +518,7 @@ msg_channel(int p_or_n, const char *command,
channel_metadata_add(chptr, "NOREPEAT", text2, 0); 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); rb_strlcpy(text2, text, BUFSIZE);
strip_colour(text2); strip_colour(text2);
@ -536,7 +539,7 @@ msg_channel(int p_or_n, const char *command,
if(result == CAN_SEND_OPV || if(result == CAN_SEND_OPV ||
!flood_attack_channel(p_or_n, source_p, chptr, chptr->chname)) !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); rb_strlcpy(text2, text, BUFSIZE);
strip_unprintable(text2); strip_unprintable(text2);
@ -552,12 +555,12 @@ msg_channel(int p_or_n, const char *command,
return; 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); sendto_one_numeric(source_p, 404, "%s :Cannot send to channel - Notices are disallowed (+T set)", chptr->chname);
return; 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) && !strncasecmp(text + 1, "ACTION", 6) &&
(!ConfigChannel.exempt_cmode_D || !is_any_op(msptr))) (!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' && if (p_or_n != NOTICE && *text == '\001' &&
strncasecmp(text + 1, "ACTION", 6)) 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); sendto_one_numeric(source_p, 404, "%s :Cannot send to channel - CTCPs to this channel are disallowed (+C set)", chptr->chname);
return; return;
@ -579,7 +582,7 @@ msg_channel(int p_or_n, const char *command,
"%s %s :%s", command, chptr->chname, text); "%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) || (!(chptr->mode.mode & MODE_NOPRIVMSGS) ||
IsMember(source_p, chptr))) IsMember(source_p, chptr)))
{ {
@ -616,7 +619,7 @@ msg_channel_opmod(int p_or_n, const char *command,
{ {
char text2[BUFSIZE]; char text2[BUFSIZE];
if(chptr->mode.mode & MODE_NOCOLOR) if(chptr->mode.mode & ModuleModes.MODE_NOCOLOR)
{ {
rb_strlcpy(text2, text, BUFSIZE); rb_strlcpy(text2, text, BUFSIZE);
strip_colour(text2); 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) || (!(chptr->mode.mode & MODE_NOPRIVMSGS) ||
IsMember(source_p, chptr))) IsMember(source_p, chptr)))
{ {

View File

@ -41,6 +41,8 @@
#include "packet.h" #include "packet.h"
#include "s_newconf.h" #include "s_newconf.h"
struct module_modes ModuleModes;
static int m_mode(struct Client *, struct Client *, int, const char **); 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_mode(struct Client *, struct Client *, int, const char **);
static int ms_tmode(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': case 'q':
banlist = &chptr->quietlist; banlist = &chptr->quietlist;
mode_type = CHFL_QUIET; mode_type = ModuleModes.CHFL_QUIET;
mems = ALL_MEMBERS; mems = ALL_MEMBERS;
break; break;

View File

@ -39,6 +39,7 @@
#include "s_conf.h" #include "s_conf.h"
#include "packet.h" #include "packet.h"
#include "inline/stringops.h" #include "inline/stringops.h"
#include "channel.h"
static int m_part(struct Client *, struct Client *, int, const char **); 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, static void part_one_client(struct Client *client_p,
struct Client *source_p, char *name, char *reason); struct Client *source_p, char *name, char *reason);
struct module_modes ModuleModes;
/* /*
** m_part ** m_part
@ -127,7 +129,7 @@ part_one_client(struct Client *client_p, struct Client *source_p, char *name, ch
(source_p->localClient->firsttime + (source_p->localClient->firsttime +
ConfigFileEntry.anti_spam_exit_message_time) < rb_current_time())))) 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); rb_strlcpy(reason2, reason, BUFSIZE);
strip_colour(reason2); strip_colour(reason2);

View File

@ -643,12 +643,6 @@ static struct InfoStruct info_table[] = {
&ConfigChannel.use_invex, &ConfigChannel.use_invex,
"Enable chanmode +I (invite exceptions)", "Enable chanmode +I (invite exceptions)",
}, },
{
"use_forward",
OUTPUT_BOOLEAN_YN,
&ConfigChannel.use_forward,
"Enable chanmode +f (channel forwarding)",
},
{ {
"use_knock", "use_knock",
OUTPUT_BOOLEAN_YN, OUTPUT_BOOLEAN_YN,

View File

@ -39,6 +39,9 @@
#include "modules.h" #include "modules.h"
#include "packet.h" #include "packet.h"
#include "tgchange.h" #include "tgchange.h"
#include "channel.h"
struct module_modes ModuleModes;
static int m_invite(struct Client *, struct Client *, int, const char **); 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 */ /* unconditionally require ops, unless the channel is +g */
/* treat remote clients as chanops */ /* treat remote clients as chanops */
if(MyClient(source_p) && !is_any_op(msptr) && if(MyClient(source_p) && !is_any_op(msptr) &&
!(chptr->mode.mode & MODE_FREEINVITE)) !(chptr->mode.mode & ModuleModes.MODE_FREEINVITE))
{ {
if(IsOverride(source_p)) 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 * for +l/+j just check if the mode is set, this varies over time
*/ */
if(chptr->mode.mode & MODE_INVITEONLY || 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) chptr->mode.limit || chptr->mode.join_num)
store_invite = 1; store_invite = 1;

View File

@ -36,6 +36,8 @@
#include "modules.h" #include "modules.h"
#include "s_serv.h" #include "s_serv.h"
struct module_modes ModuleModes;
static int m_knock(struct Client *, struct Client *, int, const char **); static int m_knock(struct Client *, struct Client *, int, const char **);
struct Message knock_msgtab = { 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(); chptr->last_knock = rb_current_time();
if(ConfigChannel.use_knock) 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), chptr, form_str(RPL_KNOCK),
me.name, name, name, source_p->name, me.name, name, name, source_p->name,
source_p->username, source_p->host); source_p->username, source_p->host);

View File

@ -66,6 +66,8 @@ static int h_can_join;
static int h_can_create_channel; static int h_can_create_channel;
static int h_channel_join; static int h_channel_join;
struct module_modes ModuleModes;
/* init_channels() /* init_channels()
* *
* input - * input -
@ -85,6 +87,40 @@ init_channels(void)
h_can_create_channel = register_hook("can_create_channel"); 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 * allocate_channel - Allocates a channel
*/ */
@ -352,7 +388,7 @@ remove_user_from_channel(struct membership *msptr)
if(client_p->servptr == &me) if(client_p->servptr == &me)
rb_dlinkDelete(&msptr->locchannode, &chptr->locmembers); 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); destroy_channel(chptr);
rb_bh_free(member_heap, msptr); rb_bh_free(member_heap, msptr);
@ -387,7 +423,7 @@ remove_user_from_channels(struct Client *client_p)
if(client_p->servptr == &me) if(client_p->servptr == &me)
rb_dlinkDelete(&msptr->locchannode, &chptr->locmembers); 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); destroy_channel(chptr);
rb_bh_free(member_heap, msptr); 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 *actualBan = NULL;
struct Ban *actualExcept = 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)) if(!MyClient(who))
return 0; return 0;
@ -758,7 +798,7 @@ is_quieted(struct Channel *chptr, struct Client *who, struct membership *msptr,
if(match(actualBan->banstr, s) || if(match(actualBan->banstr, s) ||
match(actualBan->banstr, s2) || match(actualBan->banstr, s2) ||
match_cidr(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))) (s3 != NULL && match(actualBan->banstr, s3)))
break; break;
else else
@ -899,16 +939,20 @@ can_join(struct Client *source_p, struct Channel *chptr, char *key)
if(chptr->mode.limit && if(chptr->mode.limit &&
rb_dlink_list_length(&chptr->members) >= (unsigned long) chptr->mode.limit) rb_dlink_list_length(&chptr->members) >= (unsigned long) chptr->mode.limit)
i = ERR_CHANNELISFULL; 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; i = ERR_NEEDREGGEDNICK;
/* join throttling stuff --nenolod */ /* 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(chptr->mode.join_num > 0 && chptr->mode.join_time > 0)
{ {
if ((rb_current_time() - chptr->join_delta <= if ((rb_current_time() - chptr->join_delta <=
chptr->mode.join_time) && (chptr->join_count >= chptr->mode.join_time) && (chptr->join_count >=
chptr->mode.join_num)) chptr->mode.join_num))
i = ERR_THROTTLE; i = ERR_THROTTLE;
} }
}
/* allow /invite to override +l/+r/+j also -- jilles */ /* allow /invite to override +l/+r/+j also -- jilles */
if (i != 0 && invite == NULL) if (i != 0 && invite == NULL)
@ -1042,7 +1086,7 @@ find_nonickchange_channel(struct Client *client_p)
{ {
msptr = ptr->data; msptr = ptr->data;
chptr = msptr->chptr; 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 chptr;
} }
return NULL; return NULL;
@ -1297,7 +1341,7 @@ channel_modes(struct Channel *chptr, struct Client *client_p)
chptr->mode.join_time); 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'; *mbuf++ = 'f';
@ -1608,7 +1652,7 @@ check_forward(struct Client *source_p, struct Channel *chptr,
if (hash_find_resv(chptr->chname)) if (hash_find_resv(chptr->chname))
return NULL; return NULL;
/* Don't forward to +Q channel */ /* Don't forward to +Q channel */
if (chptr->mode.mode & MODE_DISFORWARD) if (chptr->mode.mode & ModuleModes.MODE_DISFORWARD)
return NULL; return NULL;
i = can_join(source_p, chptr, key); i = can_join(source_p, chptr, key);
if (i == 0) 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); me.name, get_oper_name(source_p), chptr->chname);
} }
else if ((i != ERR_NEEDREGGEDNICK && i != ERR_THROTTLE && i != ERR_INVITEONLYCHAN && i != ERR_CHANNELISFULL) || 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? /* might be wrong, but is there any other better location for such?
* see extensions/chm_operonly.c for other comments on this * see extensions/chm_operonly.c for other comments on this

View File

@ -71,6 +71,8 @@ char cflagsmyinfo[256];
int chmode_flags[256]; int chmode_flags[256];
struct module_modes ModuleModes;
/* OPTIMIZE ME! -- dwr */ /* OPTIMIZE ME! -- dwr */
void void
construct_cflags_strings(void) construct_cflags_strings(void)
@ -101,29 +103,24 @@ construct_cflags_strings(void)
chmode_flags[i] = 0; chmode_flags[i] = 0;
} }
switch (chmode_flags[i]) if(chmode_flags[i] == ModuleModes.MODE_DISFORWARD)
{ {
case MODE_EXLIMIT: if (ModuleModes.MODE_FORWARD)
case MODE_DISFORWARD:
if(ConfigChannel.use_forward)
{ {
*ptr++ = (char) i; *ptr++ = (char) i;
} }
}
break; else if(chmode_flags[i] == ModuleModes.MODE_REGONLY)
case MODE_REGONLY: {
if(rb_dlink_list_length(&service_list)) if (rb_dlink_list_length(&service_list))
{ {
*ptr++ = (char) i; *ptr++ = (char) i;
} }
}
break; else if(chmode_flags[i] != ModuleModes.MODE_EXLIMIT && chmode_flags[i] != 0)
default:
if(chmode_flags[i] != 0)
{ {
*ptr++ = (char) i; *ptr++ = (char) i;
} }
}
/* Should we leave orphaned check here? -- dwr */ /* Should we leave orphaned check here? -- dwr */
if(!(chmode_table[i].set_func == chm_nosuch) && !(chmode_table[i].set_func == chm_orphaned)) 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(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), sendto_one(source_p, form_str(ERR_BANLISTFULL),
me.name, source_p->name, chptr->chname, realban); 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); rb_dlinkAdd(actualBan, &actualBan->node, list);
/* invalidate the can_send() cache */ /* 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++; chptr->bants++;
return 1; return 1;
@ -287,7 +284,7 @@ del_id(struct Channel *chptr, const char *banid, rb_dlink_list * list, long mode
free_ban(banptr); free_ban(banptr);
/* invalidate the can_send() cache */ /* 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++; chptr->bants++;
return 1; 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((dir == MODE_ADD) && !(chptr->mode.mode & mode_type))
{ {
/* if +f is disabled, ignore an attempt to set +QF locally */ /* 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')) (c == 'Q' || c == 'F'))
return; return;
@ -751,18 +748,17 @@ chm_ban(struct Client *source_p, struct Channel *chptr,
int mems; int mems;
int override = 0; int override = 0;
switch (mode_type) if(mode_type == CHFL_BAN)
{ {
case CHFL_BAN:
list = &chptr->banlist; list = &chptr->banlist;
errorval = SM_ERR_RPL_B; errorval = SM_ERR_RPL_B;
rpl_list = RPL_BANLIST; rpl_list = RPL_BANLIST;
rpl_endlist = RPL_ENDOFBANLIST; rpl_endlist = RPL_ENDOFBANLIST;
mems = ALL_MEMBERS; mems = ALL_MEMBERS;
caps = 0; caps = 0;
break; }
else if(mode_type == CHFL_EXCEPTION)
case CHFL_EXCEPTION: {
/* if +e is disabled, allow all but +e locally */ /* if +e is disabled, allow all but +e locally */
if(!ConfigChannel.use_except && MyClient(source_p) && if(!ConfigChannel.use_except && MyClient(source_p) &&
((dir == MODE_ADD) && (parc > *parn))) ((dir == MODE_ADD) && (parc > *parn)))
@ -778,9 +774,9 @@ chm_ban(struct Client *source_p, struct Channel *chptr,
mems = ONLY_CHANOPS; mems = ONLY_CHANOPS;
else else
mems = ONLY_SERVERS; mems = ONLY_SERVERS;
break; }
else if(mode_type == CHFL_INVEX)
case CHFL_INVEX: {
/* if +I is disabled, allow all but +I locally */ /* if +I is disabled, allow all but +I locally */
if(!ConfigChannel.use_invex && MyClient(source_p) && if(!ConfigChannel.use_invex && MyClient(source_p) &&
(dir == MODE_ADD) && (parc > *parn)) (dir == MODE_ADD) && (parc > *parn))
@ -796,21 +792,20 @@ chm_ban(struct Client *source_p, struct Channel *chptr,
mems = ONLY_CHANOPS; mems = ONLY_CHANOPS;
else else
mems = ONLY_SERVERS; mems = ONLY_SERVERS;
break; }
else if(mode_type == ModuleModes.CHFL_QUIET)
case CHFL_QUIET: {
list = &chptr->quietlist; list = &chptr->quietlist;
errorval = SM_ERR_RPL_Q; errorval = SM_ERR_RPL_Q;
rpl_list = RPL_QUIETLIST; rpl_list = RPL_QUIETLIST;
rpl_endlist = RPL_ENDOFQUIETLIST; rpl_endlist = RPL_ENDOFQUIETLIST;
mems = ALL_MEMBERS; mems = ALL_MEMBERS;
caps = 0; caps = 0;
break; }
else
default: {
sendto_realops_snomask(SNO_GENERAL, L_ALL, "chm_ban() called with unknown type!"); sendto_realops_snomask(SNO_GENERAL, L_ALL, "chm_ban() called with unknown type!");
return; return;
break;
} }
if(dir == 0 || parc <= *parn) if(dir == 0 || parc <= *parn)
@ -821,7 +816,7 @@ chm_ban(struct Client *source_p, struct Channel *chptr,
/* non-ops cant see +eI lists.. */ /* non-ops cant see +eI lists.. */
if(alevel != CHFL_CHANOP && alevel != CHFL_ADMIN && alevel != CHFL_HALFOP && mode_type != CHFL_BAN && 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)) if(IsOverride(source_p))
{ {
@ -1508,7 +1503,7 @@ chm_forward(struct Client *source_p, struct Channel *chptr,
int override = 0; int override = 0;
/* if +f is disabled, ignore local attempts to set it */ /* 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)) (dir == MODE_ADD) && (parc > *parn))
return; return;
@ -1578,10 +1573,10 @@ chm_forward(struct Client *source_p, struct Channel *chptr,
form_str(ERR_NOSUCHCHANNEL), forward); form_str(ERR_NOSUCHCHANNEL), forward);
return; 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 || if((msptr = find_channel_membership(targptr, source_p)) == NULL ||
is_any_op(msptr)) !is_any_op(msptr))
{ {
if(IsOverride(source_p)) if(IsOverride(source_p))
override = 1; 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].dir = MODE_ADD;
mode_changes[mode_count].caps = 0; mode_changes[mode_count].caps = 0;
mode_changes[mode_count].nocaps = 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].id = NULL;
mode_changes[mode_count].override = override; mode_changes[mode_count].override = override;
mode_changes[mode_count++].arg = forward; mode_changes[mode_count++].arg = forward;
@ -1757,6 +1752,9 @@ chm_regonly(struct Client *source_p, struct Channel *chptr,
} }
/* *INDENT-OFF* */ /* *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] = struct ChannelMode chmode_table[256] =
{ {
{chm_nosuch, 0 }, /* 0x00 */ {chm_nosuch, 0 }, /* 0x00 */
@ -1827,24 +1825,24 @@ struct ChannelMode chmode_table[256] =
{chm_nosuch, 0 }, /* @ */ {chm_nosuch, 0 }, /* @ */
{chm_nosuch, 0 }, /* A */ {chm_nosuch, 0 }, /* A */
{chm_nosuch, 0 }, /* B */ {chm_nosuch, 0 }, /* B */
{chm_simple, MODE_NOCTCP }, /* C */ {chm_nosuch, 0 }, /* C - MODE_NOCTCP */
{chm_simple, MODE_NOACTION }, /* D */ {chm_nosuch, 0 }, /* D - MODE_NOACTION */
{chm_simple, MODE_NOKICK }, /* E */ {chm_nosuch, 0 }, /* E - MODE_NOKICK */
{chm_simple, MODE_FREETARGET }, /* F */ {chm_nosuch, 0 }, /* F - MODE_FREETARGET */
{chm_simple, MODE_NOCAPS }, /* G */ {chm_nosuch, 0 }, /* G - MODE_NOCAPS */
{chm_nosuch, 0 }, /* H */ {chm_nosuch, 0 }, /* H */
{chm_ban, CHFL_INVEX }, /* I */ {chm_ban, CHFL_INVEX }, /* I */
{chm_simple, MODE_NOREJOIN }, /* J */ {chm_nosuch, 0 }, /* J - MODE_NOREJOIN */
{chm_simple, MODE_NOREPEAT }, /* K */ {chm_nosuch, 0 }, /* K - MODE_NOREPEAT */
{chm_staff, MODE_EXLIMIT }, /* L */ {chm_nosuch, 0 }, /* L - MODE_EXLIMIT */
{chm_hidden, MODE_NOOPERKICK }, /* M */ {chm_nosuch, 0 }, /* M - MODE_NOOPERKICK */
{chm_simple, MODE_NONICK }, /* N */ {chm_nosuch, 0 }, /* N - MODE_NONICK */
{chm_nosuch, 0 }, /* O */ {chm_nosuch, 0 }, /* O */
{chm_staff, MODE_PERMANENT }, /* P */ {chm_nosuch, 0 }, /* P - MODE_PERMANENT */
{chm_simple, MODE_DISFORWARD }, /* Q */ {chm_nosuch, 0 }, /* Q - MODE_DISFORWARD */
{chm_nosuch, 0 }, /* R */ {chm_nosuch, 0 }, /* R */
{chm_nosuch, 0 }, /* S */ {chm_nosuch, 0 }, /* S */
{chm_simple, MODE_NONOTICE }, /* T */ {chm_nosuch, 0 }, /* T - MODE_NONOTICE */
{chm_nosuch, 0 }, /* U */ {chm_nosuch, 0 }, /* U */
{chm_nosuch, 0 }, /* V */ {chm_nosuch, 0 }, /* V */
{chm_nosuch, 0 }, /* W */ {chm_nosuch, 0 }, /* W */
@ -1859,22 +1857,22 @@ struct ChannelMode chmode_table[256] =
{chm_nosuch, 0 }, {chm_nosuch, 0 },
{chm_admin, 0 }, /* a */ {chm_admin, 0 }, /* a */
{chm_ban, CHFL_BAN }, /* b */ {chm_ban, CHFL_BAN }, /* b */
{chm_simple, MODE_NOCOLOR }, /* c */ {chm_nosuch, 0 }, /* c - MODE_NOCOLOR */
{chm_nosuch, 0 }, /* d */ {chm_nosuch, 0 }, /* d */
{chm_ban, CHFL_EXCEPTION }, /* e */ {chm_ban, CHFL_EXCEPTION }, /* e */
{chm_forward, 0 }, /* f */ {chm_nosuch, 0 }, /* f - MODE_FORWARD */
{chm_simple, MODE_FREEINVITE }, /* g */ {chm_nosuch, 0 }, /* g - MODE_FREEINVITE */
{chm_halfop, 0 }, /* h */ {chm_halfop, 0 }, /* h */
{chm_simple, MODE_INVITEONLY }, /* i */ {chm_simple, MODE_INVITEONLY }, /* i */
{chm_throttle, 0 }, /* j */ {chm_nosuch, 0 }, /* j - MODE_THROTTLE */
{chm_key, 0 }, /* k */ {chm_key, 0 }, /* k */
{chm_limit, 0 }, /* l */ {chm_limit, 0 }, /* l */
{chm_simple, MODE_MODERATED }, /* m */ {chm_simple, MODE_MODERATED }, /* m */
{chm_simple, MODE_NOPRIVMSGS }, /* n */ {chm_simple, MODE_NOPRIVMSGS }, /* n */
{chm_op, 0 }, /* o */ {chm_op, 0 }, /* o */
{chm_simple, MODE_PRIVATE }, /* p */ {chm_simple, MODE_PRIVATE }, /* p */
{chm_ban, CHFL_QUIET }, /* q */ {chm_nosuch, 0 }, /* q - CHFL_QUIET */
{chm_regonly, MODE_REGONLY }, /* r */ {chm_nosuch, 0 }, /* r - MODE_REGONLY */
{chm_simple, MODE_SECRET }, /* s */ {chm_simple, MODE_SECRET }, /* s */
{chm_simple, MODE_TOPICLIMIT }, /* t */ {chm_simple, MODE_TOPICLIMIT }, /* t */
{chm_nosuch, 0 }, /* u */ {chm_nosuch, 0 }, /* u */
@ -1882,7 +1880,7 @@ struct ChannelMode chmode_table[256] =
{chm_nosuch, 0 }, /* w */ {chm_nosuch, 0 }, /* w */
{chm_nosuch, 0 }, /* x */ {chm_nosuch, 0 }, /* x */
{chm_nosuch, 0 }, /* y */ {chm_nosuch, 0 }, /* y */
{chm_simple, MODE_OPMODERATE }, /* z */ {chm_nosuch, 0 }, /* z - MODE_OPMODERATE */
{chm_nosuch, 0 }, /* 0x7b */ {chm_nosuch, 0 }, /* 0x7b */
{chm_nosuch, 0 }, /* 0x7c */ {chm_nosuch, 0 }, /* 0x7c */

View File

@ -641,6 +641,7 @@ main(int argc, char *argv[])
seed_random(NULL); seed_random(NULL);
init_module_modes();
init_main_logfile(); init_main_logfile();
newconf_init(); newconf_init();
init_s_conf(); init_s_conf();

View File

@ -2283,7 +2283,6 @@ static struct ConfEntry conf_channel_table[] =
{ "use_except", CF_YESNO, NULL, 0, &ConfigChannel.use_except }, { "use_except", CF_YESNO, NULL, 0, &ConfigChannel.use_except },
{ "use_invex", CF_YESNO, NULL, 0, &ConfigChannel.use_invex }, { "use_invex", CF_YESNO, NULL, 0, &ConfigChannel.use_invex },
{ "use_knock", CF_YESNO, NULL, 0, &ConfigChannel.use_knock }, { "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 }, { "use_local_channels", CF_YESNO, NULL, 0, &ConfigChannel.use_local_channels },
{ "resv_forcepart", CF_YESNO, NULL, 0, &ConfigChannel.resv_forcepart }, { "resv_forcepart", CF_YESNO, NULL, 0, &ConfigChannel.resv_forcepart },
{ "exempt_cmode_c", CF_YESNO, NULL, 0, &ConfigChannel.exempt_cmode_c }, { "exempt_cmode_c", CF_YESNO, NULL, 0, &ConfigChannel.exempt_cmode_c },

View File

@ -768,7 +768,6 @@ set_default_conf(void)
ConfigChannel.use_except = YES; ConfigChannel.use_except = YES;
ConfigChannel.use_invex = YES; ConfigChannel.use_invex = YES;
ConfigChannel.use_knock = YES; ConfigChannel.use_knock = YES;
ConfigChannel.use_forward = YES;
ConfigChannel.use_local_channels = YES; ConfigChannel.use_local_channels = YES;
ConfigChannel.knock_delay = 300; ConfigChannel.knock_delay = 300;
ConfigChannel.knock_delay_channel = 60; ConfigChannel.knock_delay_channel = 60;

View File

@ -54,6 +54,8 @@
#include "substitution.h" #include "substitution.h"
#include "chmode.h" #include "chmode.h"
struct module_modes ModuleModes;
static void report_and_set_user_flags(struct Client *, struct ConfItem *); static void report_and_set_user_flags(struct Client *, struct ConfItem *);
void user_welcome(struct Client *source_p); 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 */ /* FALLTHROUGH */
default: default:
if (MyConnect(source_p) && *pm == 'Q' && !ConfigChannel.use_forward) { if (MyConnect(source_p) && *pm == 'Q' && !ModuleModes.MODE_FORWARD) {
badflag = YES; badflag = YES;
break; break;
} }

View File

@ -87,6 +87,9 @@
#include "s_conf.h" #include "s_conf.h"
#include "supported.h" #include "supported.h"
#include "chmode.h" #include "chmode.h"
#include "channel.h"
struct module_modes ModuleModes;
rb_dlink_list isupportlist; rb_dlink_list isupportlist;
@ -238,7 +241,7 @@ isupport_chanmodes(const void *ptr)
rb_snprintf(result, sizeof result, "%s%sbq,k,%slj,%s", rb_snprintf(result, sizeof result, "%s%sbq,k,%slj,%s",
ConfigChannel.use_except ? "e" : "", ConfigChannel.use_except ? "e" : "",
ConfigChannel.use_invex ? "I" : "", ConfigChannel.use_invex ? "I" : "",
ConfigChannel.use_forward ? "f" : "", ModuleModes.MODE_FORWARD ? "f" : "",
cflagsbuf); cflagsbuf);
return result; return result;
} }