diff --git a/extensions/Makefile.in b/extensions/Makefile.in index 052903c20..5d2ee63db 100644 --- a/extensions/Makefile.in +++ b/extensions/Makefile.in @@ -27,6 +27,7 @@ INCLUDES = -I. -I../include -I../libratbox/include $(SSL_INCLUDES) CPPFLAGS = ${INCLUDES} @CPPFLAGS@ SRCS = \ + chm_operonly_compat.c \ chm_quietunreg_compat.c \ chm_sslonly_compat.c \ createauthonly.c \ diff --git a/extensions/chm_operonly_compat.c b/extensions/chm_operonly_compat.c new file mode 100644 index 000000000..f30104eb7 --- /dev/null +++ b/extensions/chm_operonly_compat.c @@ -0,0 +1,63 @@ +/* + * Treat cmode +-O as +-iI $o. + */ + +#include "stdinc.h" +#include "modules.h" +#include "client.h" +#include "hook.h" +#include "ircd.h" + +/* XXX prototypes */ +void chm_ban(struct Client *source_p, struct Channel *chptr, + int alevel, int parc, int *parn, + const char **parv, int *errors, int dir, char c, long mode_type); +void chm_nosuch(struct Client *source_p, struct Channel *chptr, + int alevel, int parc, int *parn, + const char **parv, int *errors, int dir, char c, long mode_type); +void chm_simple(struct Client *source_p, struct Channel *chptr, + int alevel, int parc, int *parn, + const char **parv, int *errors, int dir, char c, long mode_type); +/* end yucky prototypes */ + +static int _modinit(void); +static void _moddeinit(void); +static void chm_operonly(struct Client *source_p, struct Channel *chptr, + int alevel, int parc, int *parn, + const char **parv, int *errors, int dir, char c, long mode_type); + +DECLARE_MODULE_AV1(chm_operonly_compat, _modinit, _moddeinit, NULL, NULL, NULL, "$Revision$"); + +static int +_modinit(void) +{ + chmode_table['O'].set_func = chm_operonly; + chmode_table['O'].mode_type = 0; + + return 0; +} + +static void +_moddeinit(void) +{ + chmode_table['O'].set_func = chm_nosuch; + chmode_table['O'].mode_type = 0; +} + +static void +chm_operonly(struct Client *source_p, struct Channel *chptr, + int alevel, int parc, int *parn, + const char **parv, int *errors, int dir, char c, long mode_type) +{ + int newparn = 0; + const char *newparv[] = { "$o" }; + + if (MyClient(source_p)) { + chm_simple(source_p, chptr, alevel, parc, parn, parv, + errors, dir, 'i', MODE_INVITEONLY); + chm_ban(source_p, chptr, alevel, 1, &newparn, newparv, + errors, dir, 'I', CHFL_INVEX); + } else + chm_nosuch(source_p, chptr, alevel, parc, parn, parv, + errors, dir, c, mode_type); +}