diff options
| author | trystan trystan@31f1291d-b8d6-0310-a050-a5561fc1590b <trystan trystan@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864> | 2004-11-28 06:10:17 +0000 |
|---|---|---|
| committer | trystan trystan@31f1291d-b8d6-0310-a050-a5561fc1590b <trystan trystan@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864> | 2004-11-28 06:10:17 +0000 |
| commit | f37314234168d48ea2dddba3a3b4b8fefadab8b3 (patch) | |
| tree | d2a0f3dab7647c7b4b99ae7004002b242d20deff /src | |
| parent | c55942927eccc7b3bf3e5aa742acdb737b4a8989 (diff) | |
BUILD : 1.7.6 (463) BUGS : 192, 210, 222, 234 NOTES : 1. Removed +d references from the ptlink protocol code, since they do not timestamp the nicks 2. Memos sent as notification of receipt can not be cancelled. 3. Unreal3.2 supports SVSMODE -b on clearing bans 4. fixed do_kill() not remove the user from the user list 5. /os set sql [on|off] runtime sql toggle 6. Segfaults logged to the services log when DumpCore is disabled 7. fixed RUNGROUP not passed during build time 8. Exceptions now update if the limit is changed 9. Solid-IRCD support 10. Fixed TSMODE warnings when using FANTASY commands 11. Fixed read_int32 warnings (fixes compiling and running under cygwin) - Thats all..
git-svn-id: svn://svn.anope.org/anope/trunk@463 31f1291d-b8d6-0310-a050-a5561fc1590b
git-svn-id: http://anope.svn.sourceforge.net/svnroot/anope/trunk@317 5417fbe8-f217-4b02-8779-1006273d7864
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 */ |
