diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/Makefile | 6 | ||||
| -rw-r--r-- | src/botserv.c | 33 | ||||
| -rw-r--r-- | src/chanserv.c | 2 | ||||
| -rw-r--r-- | src/hostserv.c | 4 | ||||
| -rw-r--r-- | src/language.c | 2 | ||||
| -rw-r--r-- | src/main.c | 35 | ||||
| -rw-r--r-- | src/memoserv.c | 7 | ||||
| -rw-r--r-- | src/news.c | 2 | ||||
| -rw-r--r-- | src/nickserv.c | 6 | ||||
| -rw-r--r-- | src/operserv.c | 38 | ||||
| -rw-r--r-- | src/ptlink.c | 15 | ||||
| -rw-r--r-- | src/sessions.c | 35 | ||||
| -rw-r--r-- | src/solidircd.c | 1710 | ||||
| -rw-r--r-- | src/unreal32.c | 12 | ||||
| -rw-r--r-- | src/users.c | 20 |
15 files changed, 1857 insertions, 70 deletions
diff --git a/src/Makefile b/src/Makefile index dd672c721..54929bf50 100644 --- a/src/Makefile +++ b/src/Makefile @@ -5,14 +5,14 @@ OBJS = actions.o base64.o botserv.o channels.o chanserv.o commands.o compat.o c memory.o memoserv.o messages.o misc.o modules.o news.o nickserv.o operserv.o \ process.o proxy.o send.o servers.o sessions.o slist.o sockutil.o \ timeout.o users.o dreamforge.o bahamut.o unreal31.o ultimate2.o ultimate3.o \ - hybrid.o ptlink.o viagra.o rageircd.o unreal32.o \ + hybrid.o ptlink.o viagra.o rageircd.o unreal32.o solidircd.o \ $(VSNPRINTF_O) $(RDB_OBJ) $(MYSQL_OBJ) SRCS = actions.c base64.c botserv.c channels.c chanserv.c commands.c compat.c converter.c \ config.c datafiles.c encrypt.c helpserv.c hostserv.c init.c language.c list.c log.c mail.c main.c \ memory.c memoserv.c messages.c misc.c modules.c news.c nickserv.c operserv.c \ process.c proxy.c send.c servers.c sessions.c slist.c sockutil.c \ dreamforge.c bahamut.c unreal31.c ultimate2.c ultimate3.c \ - hybrid.c ptlink.c viagra.c rageircd.c unreal32.c \ + hybrid.c ptlink.c viagra.c rageircd.c unreal32.c solidircd.c \ timeout.c users.c \ $(VSNPRINTF_C) $(RDB) $(MYSQL) @@ -23,7 +23,7 @@ INCLUDES = ../include/commands.h ../include/defs.h ../include/language.h \ ../include/modules.h ../include/slist.h \ ../include/dreamforge.h ../include/bahamut.h ../include/ultimate2.h \ ../include/ultimate3.h ../include/hybrid.h ../include/ptlink.h ../include/unreal31.h \ - ../include/viagra.h ../include/rageircd.h ../include/unreal32.h + ../include/viagra.h ../include/rageircd.h ../include/unreal32.h ../include/solidircd.h MAKEARGS = 'CFLAGS=${CFLAGS}' 'CC=${CC}' 'ANOPELIBS=${ANOPELIBS}' \ diff --git a/src/botserv.c b/src/botserv.c index 0c23c4c68..17f922133 100644 --- a/src/botserv.c +++ b/src/botserv.c @@ -612,7 +612,7 @@ void load_bs_dbase(void) dbFILE *f; int c, ver; int16 tmp16; - int32 tmp32; + uint32 tmp32; BotInfo *bi; int failed = 0; @@ -1148,12 +1148,19 @@ static void bot_raw_kick(User * requester, ChannelInfo * ci, char *nick, static void bot_raw_mode(User * requester, ChannelInfo * ci, char *mode, char *nick) { - char *av[3]; - User *u = finduser(nick); + char *av[4]; + int ac; + char buf[BUFSIZE]; + *buf = '\0'; + User *u; + + u = finduser(nick); if (!u || !is_on_chan(ci->c, u)) return; + snprintf(buf, BUFSIZE - 1, "%ld", (long int) time(NULL)); + if (ircd->protectedumode) { if (is_protected(u) && *mode == '-' && (requester != u)) { anope_cmd_privmsg(ci->bi->nick, ci->name, "%s", @@ -1167,12 +1174,22 @@ static void bot_raw_mode(User * requester, ChannelInfo * ci, char *mode, && (get_access(u, ci) >= get_access(requester, ci))) return; - av[0] = ci->name; - av[1] = mode; - av[2] = nick; + if (ircdcap->tsmode) { + av[0] = ci->name; + av[1] = buf; + av[2] = mode; + av[3] = nick; + ac = 4; + anope_cmd_mode(ci->bi->nick, av[0], "%s %s", av[2], av[3]); + } else { + av[0] = ci->name; + av[1] = mode; + av[2] = nick; + ac = 3; + anope_cmd_mode(ci->bi->nick, av[0], "%s %s", av[1], av[2]); + } - anope_cmd_mode(ci->bi->nick, av[0], "%s %s", av[1], av[2]); - do_cmode(ci->bi->nick, 3, av); + do_cmode(ci->bi->nick, ac, av); } /*************************************************************************/ diff --git a/src/chanserv.c b/src/chanserv.c index 48da2e4b1..e6b4522e2 100644 --- a/src/chanserv.c +++ b/src/chanserv.c @@ -636,7 +636,7 @@ void load_cs_dbase(void) for (i = 0; i < 256 && !failed; i++) { int16 tmp16; - int32 tmp32; + uint32 tmp32; int n_levels; char *s; NickAlias *na; diff --git a/src/hostserv.c b/src/hostserv.c index 1dcb087d0..11ee42984 100644 --- a/src/hostserv.c +++ b/src/hostserv.c @@ -535,7 +535,7 @@ void load_hs_dbase_v2(dbFILE * f) char *nick; char *vHost; char *creator; - int32 time; + uint32 time; while (!failed && (c = getc_db(f)) == 1) { @@ -563,7 +563,7 @@ void load_hs_dbase_v3(dbFILE * f) char *vHost; char *creator; char *vIdent; - int32 time; + uint32 time; while (!failed && (c = getc_db(f)) == 1) { if (c == 1) { diff --git a/src/language.c b/src/language.c index 01e7f00d3..cfde0184d 100644 --- a/src/language.c +++ b/src/language.c @@ -66,7 +66,7 @@ static void load_lang(int index, const char *filename) { char buf[256]; FILE *f; - int num, i; + int32 num, i; if (debug) { alog("debug: Loading language %d from file `languages/%s'", diff --git a/src/main.c b/src/main.c index 46d03a0ab..f7b4089b7 100644 --- a/src/main.c +++ b/src/main.c @@ -397,13 +397,20 @@ void sighandler(int signum) signum); #endif } + + if (signum == SIGSEGV) { + do_backtrace(); + } + if (started) { services_shutdown(); exit(0); } else { - alog("%s", quitmsg); - if (isatty(2)) + if (isatty(2)) { fprintf(stderr, "%s\n", quitmsg); + } else { + alog("%s", quitmsg); + } exit(1); } } @@ -554,3 +561,27 @@ int main(int ac, char **av, char **envp) } /*************************************************************************/ + +void do_backtrace(void) +{ +#ifdef HAVE_BACKTRACE + void *array[50]; + size_t size; + char **strings; + int i; + + alog("Backtrace: Segmentation fault detected"); + alog("Backtrace: report the following lines"); + alog("Backtrace: Anope version %s %s %s", version_number, + version_build, version_flags); + size = backtrace(array, 10); + strings = backtrace_symbols(array, size); + for (i = 1; i < size; i++) { + alog("Backtrace(%d): %s", i, strings[i]); + } + free(strings); + alog("Backtrace: complete"); +#else + alog("Backtrace: not available on this platform"); +#endif +} diff --git a/src/memoserv.c b/src/memoserv.c index f2da8bab2..a1255f5bc 100644 --- a/src/memoserv.c +++ b/src/memoserv.c @@ -361,6 +361,10 @@ void memo_send(User * u, char *name, char *text, int z) m->time = time(NULL); m->text = sstrdup(text); m->flags = MF_UNREAD; + /* Set notify sent flag - DrStein */ + if (z == 2) { + m->flags |= MF_NOTIFYS; + } /* Set receipt request flag */ if (z == 3) m->flags |= MF_RECEIPT; @@ -446,7 +450,8 @@ static int do_cancel(User * u) for (i = mi->memocount - 1; i >= 0; i--) { if ((mi->memos[i].flags & MF_UNREAD) - && !stricmp(mi->memos[i].sender, u->na->nc->display)) { + && !stricmp(mi->memos[i].sender, u->na->nc->display) + && (!(mi->memos[i].flags & MF_NOTIFYS))) { delmemo(mi, mi->memos[i].number); notice_lang(s_MemoServ, u, MEMO_CANCELLED, name); return MOD_CONT; diff --git a/src/news.c b/src/news.c index 9dc4c0adb..7a2b5a898 100644 --- a/src/news.c +++ b/src/news.c @@ -156,7 +156,7 @@ void load_news() dbFILE *f; int i; int16 n; - int32 tmp32; + uint32 tmp32; if (!(f = open_db(s_OperServ, NewsDBName, "r", NEWS_VERSION))) return; diff --git a/src/nickserv.c b/src/nickserv.c index 773a1282b..e025b8f75 100644 --- a/src/nickserv.c +++ b/src/nickserv.c @@ -374,7 +374,7 @@ void load_old_ns_dbase(void) int failed = 0; int16 tmp16; - int32 tmp32; + uint32 tmp32; char bufn[NICKMAX], bufp[PASSMAX]; char *email, *greet, *url, *forbidby, *forbidreason; @@ -632,7 +632,7 @@ void load_ns_req_db(void) dbFILE *f; int i, c, ver; NickRequest *nr; - int32 tmp32; + uint32 tmp32; int failed = 0; if (!(f = open_db(s_NickServ, PreNickDBName, "r", PRE_NICK_VERSION))) @@ -663,7 +663,7 @@ void load_ns_dbase(void) NickCore *nc, **nclast, *ncprev; int failed = 0; int16 tmp16; - int32 tmp32; + uint32 tmp32; char *s; if (!(f = open_db(s_NickServ, NickDBName, "r", NICK_VERSION))) diff --git a/src/operserv.c b/src/operserv.c index 025005d44..fcc567541 100644 --- a/src/operserv.c +++ b/src/operserv.c @@ -168,12 +168,15 @@ void moduleAddOperServCmds(void) { c = createCommand("SZLINE", do_szline, is_services_oper,OPER_HELP_SZLINE, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); /* Commands for Services admins: */ - c = createCommand("SET", do_set, is_services_admin,OPER_HELP_SET, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("SET READONLY", NULL, NULL,OPER_HELP_SET_READONLY, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("SET LOGCHAN",NULL, NULL,OPER_HELP_SET_LOGCHAN, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("SET DEBUG", NULL, NULL,OPER_HELP_SET_DEBUG, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("SET NOEXPIRE",NULL, NULL,OPER_HELP_SET_NOEXPIRE, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("SET SUPERADMIN",NULL, NULL,OPER_HELP_SET_SUPERADMIN, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); + c = createCommand("SET", do_set, is_services_admin,OPER_HELP_SET, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); + c = createCommand("SET READONLY", NULL, NULL,OPER_HELP_SET_READONLY, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); + c = createCommand("SET LOGCHAN", NULL, NULL,OPER_HELP_SET_LOGCHAN, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); + c = createCommand("SET DEBUG", NULL, NULL,OPER_HELP_SET_DEBUG, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); + c = createCommand("SET NOEXPIRE", NULL, NULL,OPER_HELP_SET_NOEXPIRE, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); + c = createCommand("SET SUPERADMIN", NULL, NULL,OPER_HELP_SET_SUPERADMIN, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); +#ifdef USE_MYSQL + c = createCommand("SET SQL", NULL, NULL,OPER_HELP_SET_SQL, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); +#endif c = createCommand("SVSNICK", do_svsnick, is_services_admin,OPER_HELP_SVSNICK, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); c = createCommand("UMODE", do_operumodes, is_services_admin,OPER_HELP_UMODE, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); c = createCommand("NOOP", do_noop, is_services_admin,OPER_HELP_NOOP, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); @@ -377,7 +380,7 @@ static void load_old_akill(void) dbFILE *f; int i, j; int16 tmp16; - int32 tmp32; + uint32 tmp32; char buf[NICKMAX], mask2[BUFSIZE], *mask, *s; Akill *ak, *entry; @@ -491,7 +494,7 @@ void load_os_dbase(void) int16 i, n, ver, c; HostCache *hc, **hclast, *hcprev; int16 tmp16; - int32 tmp32; + uint32 tmp32; char *s; int failed = 0; @@ -533,7 +536,7 @@ void load_os_dbase(void) } if (ver >= 7) { - int32 tmp32; + uint32 tmp32; SAFE(read_int32(&maxusercnt, f)); SAFE(read_int32(&tmp32, f)); maxusertime = tmp32; @@ -4466,7 +4469,22 @@ static int do_set(User * u) } else { notice_lang(s_OperServ, u, OPER_SET_IGNORE_ERROR); } - +#ifdef USE_MYSQL + } else if (stricmp(option, "SQL") == 0) { + if (stricmp(setting, "on") == 0) { + if (rdb_init()) { + notice_lang(s_OperServ, u, OPER_SET_SQL_ON); + } else { + notice_lang(s_OperServ, u, OPER_SET_SQL_ERROR_INIT); + } + } else if (stricmp(setting, "off") == 0) { + /* could call rdb_close() but that does nothing - TSL */ + do_mysql = 0; + notice_lang(s_OperServ, u, OPER_SET_SQL_OFF); + } else { + notice_lang(s_OperServ, u, OPER_SET_SQL_ERROR); + } +#endif } else if (stricmp(option, "READONLY") == 0) { if (stricmp(setting, "on") == 0) { readonly = 1; diff --git a/src/ptlink.c b/src/ptlink.c index 5f6ea4220..4689fdbef 100644 --- a/src/ptlink.c +++ b/src/ptlink.c @@ -54,7 +54,7 @@ IRCDVar ircd[] = { NULL, /* Mode to unset for an owner */ "+r", /* Mode On Reg */ "-r", /* Mode on UnReg */ - "+d", /* Mode on Nick Change */ + NULL, /* Mode on Nick Change */ 1, /* Supports SGlines */ 1, /* Supports SQlines */ 1, /* Supports SZlines */ @@ -1378,17 +1378,6 @@ void anope_set_umode(User * user, int ac, char **av) case '-': add = 0; break; - case 'd': - if (ac == 0) { - alog("user: umode +d with no parameter (?) for user %s", - user->nick); - break; - } - - ac--; - av++; - user->svid = strtoul(*av, NULL, 0); - break; case 'o': if (add) { opcnt++; @@ -1560,7 +1549,7 @@ void anope_cmd_svid_umode(char *nick, time_t ts) /* nc_change was = 1, and there is no na->status */ void anope_cmd_nc_change(User * u) { - common_svsmode(u, "+d", "1"); + /* Not Supported by this ircd */ } /* SVSMODE +d */ diff --git a/src/sessions.c b/src/sessions.c index 30edad494..939c92afb 100644 --- a/src/sessions.c +++ b/src/sessions.c @@ -76,7 +76,7 @@ int16 nexceptions = 0; static Session *findsession(const char *host); static Exception *find_host_exception(const char *host); -static int exception_add(const char *mask, const int limit, +static int exception_add(User * u, const char *mask, const int limit, const char *reason, const char *who, const time_t expires); @@ -380,7 +380,7 @@ void load_exceptions() int i; int16 n; int16 tmp16; - int32 tmp32; + uint32 tmp32; if (! (f = open_db(s_OperServ, ExceptionDBName, "r", EXCEPTION_VERSION))) @@ -479,16 +479,29 @@ void save_rdb_exceptions() /************************ Exception Manipulation *************************/ /*************************************************************************/ -static int exception_add(const char *mask, const int limit, +static int exception_add(User * u, const char *mask, const int limit, const char *reason, const char *who, const time_t expires) { int i; /* Check if an exception already exists for this mask */ - for (i = 0; i < nexceptions; i++) - if (stricmp(mask, exceptions[i].mask) == 0) - return 0; + for (i = 0; i < nexceptions; i++) { + if (!stricmp(mask, exceptions[i].mask)) { + if (exceptions[i].limit != limit) { + exceptions[i].limit = limit; + if (u) + notice_lang(s_OperServ, u, OPER_EXCEPTION_CHANGED, + mask, exceptions[i].limit); + return -2; + } else { + if (u) + notice_lang(s_OperServ, u, OPER_EXCEPTION_EXISTS, + mask); + return -1; + } + } + } nexceptions++; exceptions = srealloc(exceptions, sizeof(Exception) * nexceptions); @@ -626,6 +639,7 @@ int do_exception(User * u) char *mask, *reason, *expiry, *limitstr; int limit, expires; int i; + int x; if (!LimitSessions) { notice_lang(s_OperServ, u, OPER_EXCEPTION_DISABLED); @@ -679,12 +693,13 @@ int do_exception(User * u) return MOD_CONT; } - if (exception_add(mask, limit, reason, u->nick, expires)) + x = exception_add(u, mask, limit, reason, u->nick, expires); + + if (x == 1) { notice_lang(s_OperServ, u, OPER_EXCEPTION_ADDED, mask, limit); - else - notice_lang(s_OperServ, u, OPER_EXCEPTION_ALREADY_PRESENT, - mask, limit); + } + if (readonly) notice_lang(s_OperServ, u, READ_ONLY_MODE); } diff --git a/src/solidircd.c b/src/solidircd.c new file mode 100644 index 000000000..4dd736d28 --- /dev/null +++ b/src/solidircd.c @@ -0,0 +1,1710 @@ +/* Solid-IRCD functions + * + * (C) 2003 Anope Team + * Contact us at info@anope.org + * + * Please read COPYING and README for further details. + * + * Based on the original code of Epona by Lara. + * Based on the original code of Services by Andy Church. + * + * + */ + +/*************************************************************************/ + +#include "services.h" +#include "pseudo.h" + +#ifdef IRC_SOLID + +const char version_protocol[] = "Solid-IRCd 3.4.*"; + +/* Not all ircds use +f for their flood/join throttle system */ +const char flood_mode_char_set[] = "+j"; /* mode char for FLOOD mode on set */ +const char flood_mode_char_remove[] = "-j"; /* mode char for FLOOD mode on remove */ +int UseTSMODE = 0; /* does send TSMODE but if it doesn't means it won't so this is disabled */ + +IRCDVar ircd[] = { + {"Solid-IRCd 3.4.*", /* ircd name */ + "+o", /* nickserv mode */ + "+o", /* chanserv mode */ + "+o", /* memoserv mode */ + "+o", /* hostserv mode */ + "+io", /* operserv mode */ + "+o", /* botserv mode */ + "+h", /* helpserv mode */ + "+i", /* Dev/Null mode */ + "+io", /* Global mode */ + "+o", /* nickserv alias mode */ + "+o", /* chanserv alias mode */ + "+o", /* memoserv alias mode */ + "+io", /* hostserv alias mode */ + "+io", /* operserv alias mode */ + "+o", /* botserv alias mode */ + "+h", /* helpserv alias mode */ + "+i", /* Dev/Null alias mode */ + "+io", /* Global alias mode */ + "+", /* Used by BotServ Bots */ + 2, /* Chan Max Symbols */ + "-cilmnpstOR", /* Modes to Remove */ + "+o", /* Channel Umode used by Botserv bots */ + 1, /* SVSNICK */ + 1, /* Vhost */ + 0, /* Has Owner */ + NULL, /* Mode to set for an owner */ + NULL, /* Mode to unset for an owner */ + "+rd", /* Mode On Reg */ + "-r+d", /* Mode on UnReg */ + "+d", /* Mode on Nick Change */ + 1, /* Supports SGlines */ + 1, /* Supports SQlines */ + 1, /* Supports SZlines */ + 0, /* Supports Halfop +h */ + 3, /* Number of server args */ + 0, /* Join 2 Set */ + 0, /* Join 2 Message */ + 1, /* Has exceptions +e */ + 0, /* TS Topic Forward */ + 0, /* TS Topci Backward */ + 0, /* Protected Umode */ + 0, /* Has Admin */ + 1, /* Chan SQlines */ + 1, /* Quit on Kill */ + 1, /* SVSMODE unban */ + 0, /* Has Protect */ + 0, /* Reverse */ + 1, /* Chan Reg */ + CMODE_r, /* Channel Mode */ + 0, /* vidents */ + 1, /* svshold */ + 1, /* time stamp on mode */ + 1, /* NICKIP */ + 0, /* O:LINE */ + 1, /* UMODE */ + 0, /* VHOST ON NICK */ + 0, /* Change RealName */ + 0, /* ChanServ extra */ + 0, /* No Knock */ + 0, /* Admin Only */ + DEFAULT_MLOCK, /* Default MLOCK */ + UMODE_v, /* Vhost Mode */ + 1, /* +f */ + 0, /* +L */ + CMODE_j, /* Mode */ + 0, /* Mode */ + 1, + 1, /* No Knock requires +i */ + NULL, /* CAPAB Chan Modes */ + 0, /* We support TOKENS */ + 1, /* TOKENS are CASE inSensitive */ + 0, /* TIME STAMPS are BASE64 */ + 1, /* +I support */ + 0, /* SJOIN ban char */ + 0, /* SJOIN except char */ + } + , + {NULL} +}; + +IRCDCAPAB ircdcap[] = { + { + CAPAB_NOQUIT, /* NOQUIT */ + CAPAB_TSMODE, /* TSMODE */ + CAPAB_UNCONNECT, /* UNCONNECT */ + 0, /* NICKIP */ + 0, /* SJOIN */ + 0, /* ZIP */ + CAPAB_BURST, /* BURST */ + 0, /* TS5 */ + 0, /* TS3 */ + CAPAB_DKEY, /* DKEY */ + 0, /* PT4 */ + 0, /* SCS */ + 0, /* QS */ + 0, /* UID */ + 0, /* KNOCK */ + 0, /* CLIENT */ + 0, /* IPV6 */ + 0, /* SSJ5 */ + 0, /* SN2 */ + 0, /* TOKEN */ + 0, /* VHOST */ + 0, /* SSJ3 */ + 0, /* NICK2 */ + 0, /* UMODE2 */ + 0, /* VL */ + 0, /* TLKEXT */ + 0, /* DODKEY */ + CAPAB_DOZIP, /* DOZIP */ + 0, 0} +}; + + +void anope_set_umode(User * user, int ac, char **av) +{ + int add = 1; /* 1 if adding modes, 0 if deleting */ + char *modes = av[0]; + + ac--; + + if (debug) + alog("debug: Changing mode for %s to %s", user->nick, modes); + + while (*modes) { + + add ? (user->mode |= umodes[(int) *modes]) : (user->mode &= + ~umodes[(int) + *modes]); + + switch (*modes++) { + case '+': + add = 1; + break; + case '-': + add = 0; + break; + case 'a': + if (UnRestrictSAdmin) { + break; + } + if (add && !is_services_admin(user)) { + common_svsmode(user, "-a", NULL); + user->mode &= ~UMODE_a; + } + break; + case 'd': + if (ac == 0) { + alog("user: umode +d with no parameter (?) for user %s", + user->nick); + break; + } + + ac--; + av++; + user->svid = strtoul(*av, NULL, 0); + break; + case 'o': + if (add) { + opcnt++; + + if (WallOper) + anope_cmd_global(s_OperServ, + "\2%s\2 is now an IRC operator.", + user->nick); + display_news(user, NEWS_OPER); + + } else { + opcnt--; + } + break; + case 'r': + if (add && !nick_identified(user)) { + common_svsmode(user, "-r", NULL); + user->mode &= ~UMODE_r; + } + break; + case 'v': + update_host(user); + break; + } + } +} + + +unsigned long umodes[128] = { + 0, 0, 0, /* Unused */ + 0, 0, 0, /* Unused */ + 0, 0, 0, /* Unused, Unused, Horzontal Tab */ + 0, 0, 0, /* Line Feed, Unused, Unused */ + 0, 0, 0, /* Carriage Return, Unused, Unused */ + 0, 0, 0, /* Unused */ + 0, 0, 0, /* Unused */ + 0, 0, 0, /* Unused */ + 0, 0, 0, /* Unused */ + 0, 0, 0, /* Unused */ + 0, 0, 0, /* Unused, Unused, Space */ + 0, 0, 0, /* ! " # */ + 0, 0, 0, /* $ % & */ + 0, 0, 0, /* ! ( ) */ + 0, 0, 0, /* * + , */ + 0, 0, 0, /* - . / */ + 0, 0, /* 0 1 */ + 0, 0, /* 2 3 */ + 0, 0, /* 4 5 */ + 0, 0, /* 6 7 */ + 0, 0, /* 8 9 */ + 0, 0, /* : ; */ + 0, 0, 0, /* < = > */ + 0, 0, /* ? @ */ + UMODE_A, 0, UMODE_C, /* A B C */ + UMODE_D, 0, UMODE_F, /* D E F */ + 0, UMODE_H, UMODE_I, /* G H I */ + 0, UMODE_K, 0, /* J K L */ + 0, 0, UMODE_O, /* M N O */ + 0, 0, UMODE_R, /* P Q R */ + 0, 0, 0, /* S T U */ + 0, 0, UMODE_X, /* V W X */ + 0, /* Y */ + 0, /* Z */ + 0, 0, 0, /* [ \ ] */ + 0, 0, 0, /* ^ _ ` */ + UMODE_a, UMODE_b, UMODE_c, /* a b c */ + UMODE_d, UMODE_e, UMODE_f, /* d e f */ + UMODE_g, UMODE_h, UMODE_i, /* g h i */ + UMODE_j, UMODE_k, 0, /* j k l */ + UMODE_m, UMODE_n, UMODE_o, /* m n o */ + 0, 0, UMODE_r, /* p q r */ + UMODE_s, 0, 0, /* s t u */ + UMODE_v, 0, UMODE_x, /* v w x */ + UMODE_y, /* y */ + UMODE_z, /* z */ + 0, 0, 0, /* { | } */ + 0, 0 /* ~ ‚ */ +}; + +char csmodes[128] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, + 0, + 0, 0, 0, + 'h', + 0, 0, 0, 0, + 0, + + 'v', 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 'o', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + + +CMMode cmmodes[128] = { + {NULL}, {NULL}, {NULL}, + {NULL}, {NULL}, {NULL}, + {NULL}, {NULL}, {NULL}, + {NULL}, {NULL}, {NULL}, + {NULL}, {NULL}, {NULL}, + {NULL}, {NULL}, {NULL}, + {NULL}, {NULL}, {NULL}, + {NULL}, {NULL}, {NULL}, + {NULL}, {NULL}, {NULL}, + {NULL}, {NULL}, {NULL}, + {NULL}, {NULL}, {NULL}, + {NULL}, {NULL}, {NULL}, + {NULL}, {NULL}, {NULL}, + {NULL}, {NULL}, {NULL}, + {NULL}, {NULL}, {NULL}, + {NULL}, {NULL}, {NULL}, + {NULL}, {NULL}, {NULL}, + {NULL}, {NULL}, {NULL}, + {NULL}, {NULL}, {NULL}, + {NULL}, {NULL}, {NULL}, + {NULL}, {NULL}, {NULL}, + {NULL}, {NULL}, {NULL}, + {NULL}, {NULL}, {NULL}, /* BCD */ + {NULL}, {NULL}, {NULL}, /* EFG */ + {NULL}, /* H */ + {add_invite, del_invite}, + {NULL}, /* J */ + {NULL}, {NULL}, {NULL}, /* KLM */ + {NULL}, {NULL}, {NULL}, /* NOP */ + {NULL}, {NULL}, {NULL}, /* QRS */ + {NULL}, {NULL}, {NULL}, /* TUV */ + {NULL}, {NULL}, {NULL}, /* WXY */ + {NULL}, /* Z */ + {NULL}, {NULL}, /* (char 91 - 92) */ + {NULL}, {NULL}, {NULL}, /* (char 93 - 95) */ + {NULL}, /* ` (char 96) */ + {NULL}, /* a (char 97) */ + {add_ban, del_ban}, + {NULL}, + {NULL}, + {add_exception, del_exception}, + {NULL}, + {NULL}, + {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, + {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, + {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL} +}; + + + +CBMode cbmodes[128] = { + {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, + {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, + {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, + {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, + {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, + {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, + {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, + {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, + {0}, + {0}, /* A */ + {0}, /* B */ + {0}, /* C */ + {0}, /* D */ + {0}, /* E */ + {0}, /* F */ + {0}, /* G */ + {0}, /* H */ + {0}, /* I */ + {0}, /* J */ + {0}, /* K */ + {0}, /* L */ + {CMODE_M}, + {0}, /* N */ + {CMODE_O, CBM_NO_USER_MLOCK, NULL, NULL}, + {0}, /* P */ + {0}, /* Q */ + {CMODE_R, 0, NULL, NULL}, /* R */ + {0}, /* S */ + {0}, /* T */ + {0}, /* U */ + {0}, /* V */ + {0}, /* W */ + {0}, /* X */ + {0}, /* Y */ + {0}, /* Z */ + {0}, {0}, {0}, {0}, {0}, {0}, + {0}, /* a */ + {0}, /* b */ + {CMODE_c, 0, NULL, NULL}, + {0}, /* d */ + {0}, /* e */ + {0}, /* f */ + {0}, /* g */ + {0}, /* h */ + {CMODE_i, 0, NULL, NULL}, + {CMODE_j, 0, set_flood, cs_set_flood}, /* j */ + {CMODE_k, 0, set_key, cs_set_key}, + {CMODE_l, CBM_MINUS_NO_ARG, set_limit, cs_set_limit}, + {CMODE_m, 0, NULL, NULL}, + {CMODE_n, 0, NULL, NULL}, + {0}, /* o */ + {CMODE_p, 0, NULL, NULL}, + {0}, /* q */ + {CMODE_r, CBM_NO_MLOCK, NULL, NULL}, + {CMODE_s, 0, NULL, NULL}, + {CMODE_t, 0, NULL, NULL}, + {0}, + {0}, /* v */ + {0}, /* w */ + {0}, /* x */ + {0}, /* y */ + {0}, /* z */ + {0}, {0}, {0}, {0} +}; + +CBModeInfo cbmodeinfos[] = { + {'c', CMODE_c, 0, NULL, NULL}, + {'i', CMODE_i, 0, NULL, NULL}, + {'j', CMODE_j, 0, get_flood, cs_get_flood}, + {'k', CMODE_k, 0, get_key, cs_get_key}, + {'l', CMODE_l, CBM_MINUS_NO_ARG, get_limit, cs_get_limit}, + {'m', CMODE_m, 0, NULL, NULL}, + {'n', CMODE_n, 0, NULL, NULL}, + {'p', CMODE_p, 0, NULL, NULL}, + {'r', CMODE_r, 0, NULL, NULL}, + {'s', CMODE_s, 0, NULL, NULL}, + {'t', CMODE_t, 0, NULL, NULL}, + {'M', CMODE_M, 0, NULL, NULL}, + {'O', CMODE_O, 0, NULL, NULL}, + {0} +}; + +CUMode cumodes[128] = { + {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, + {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, + {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, + {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, + + {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, + {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, + {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, |
