diff options
author | michael <michael@82007160-df01-0410-b94d-b575c5fd34c7> | 2013-05-15 19:37:42 +0000 |
---|---|---|
committer | michael <michael@82007160-df01-0410-b94d-b575c5fd34c7> | 2013-05-15 19:37:42 +0000 |
commit | aba42ce92038bc137c44842c886bcdbbae9794d9 (patch) | |
tree | 5b93bf256aabc9a8a1e01c13bfd9e022bbffe4e9 /modules/m_svsmode.c | |
parent | d654992a626ccf95c9db1bb10cee37c9ae9618bb (diff) |
- m_svsmode(): temporarily allow 3 arguments (SVSMODE without a valid TS)
git-svn-id: svn://svn.ircd-hybrid.org/svnroot/ircd-hybrid/branches/8.1.x@2054 82007160-df01-0410-b94d-b575c5fd34c7
Diffstat (limited to 'modules/m_svsmode.c')
-rw-r--r-- | modules/m_svsmode.c | 44 |
1 files changed, 24 insertions, 20 deletions
diff --git a/modules/m_svsmode.c b/modules/m_svsmode.c index 5852690..815a85a 100644 --- a/modules/m_svsmode.c +++ b/modules/m_svsmode.c @@ -52,35 +52,44 @@ * \note Valid arguments for this command are: * - parv[0] = sender prefix * - parv[1] = nickname - * - parv[2] = TS - * - parv[3] = mode - * - parv[4] = optional argument (services id, hostname) + * - parv[2] = TS (or mode, depending on svs version) + * - parv[3] = mode (or services id if old svs version) + * - parv[4] = optional argument (services id) */ static void ms_svsmode(struct Client *client_p, struct Client *source_p, int parc, char *parv[]) { struct Client *target_p = NULL; - const char *m = NULL, *extarg = NULL; int what = MODE_ADD; unsigned int flag = 0, setflags = 0; + char *m = NULL, *modes = NULL, *extarg = NULL; time_t ts = 0; if (!HasFlag(source_p, FLAGS_SERVICE)) return; + if ((parc >= 4) && ((*parv[3] == '+') || (*parv[3] == '-'))) + { + ts = atol(parv[2]); + modes = parv[3]; + extarg = (parc > 4) ? parv[4] : NULL; + } + else + { + modes = parv[2]; + extarg = (parc > 3) ? parv[3] : NULL; + } + if ((target_p = find_person(client_p, parv[1])) == NULL) return; - if ((ts = atol(parv[2])) && (ts != target_p->tsinfo)) + if (ts && (ts != target_p->tsinfo)) return; - if (parc > 4 && !EmptyString(parv[4])) - extarg = parv[4]; - setflags = target_p->umodes; - for (m = parv[3]; *m; ++m) + for (m = modes; *m; ++m) { switch (*m) { @@ -92,15 +101,10 @@ ms_svsmode(struct Client *client_p, struct Client *source_p, break; case 'd': - if (extarg) + if (!EmptyString(extarg)) strlcpy(target_p->svid, extarg, sizeof(target_p->svid)); break; - case 'x': - if (what == MODE_ADD && extarg) - user_set_hostmask(target_p, extarg); - break; - case 'o': if (what == MODE_DEL && HasUMode(target_p, UMODE_OPER)) { @@ -154,19 +158,19 @@ ms_svsmode(struct Client *client_p, struct Client *source_p, { sendto_server(client_p, CAP_TS6, NOCAPS, ":%s SVSMODE %s %lu %s %s", ID(source_p), - ID(target_p), (unsigned long)target_p->tsinfo, parv[3], extarg); + ID(target_p), (unsigned long)target_p->tsinfo, modes, extarg); sendto_server(client_p, NOCAPS, CAP_TS6, ":%s SVSMODE %s %lu %s %s", source_p->name, - target_p->name, (unsigned long)target_p->tsinfo, parv[3], extarg); + target_p->name, (unsigned long)target_p->tsinfo, modes, extarg); } else { sendto_server(client_p, CAP_TS6, NOCAPS, ":%s SVSMODE %s %lu %s", ID(source_p), - ID(target_p), (unsigned long)target_p->tsinfo, parv[3]); + ID(target_p), (unsigned long)target_p->tsinfo, modes); sendto_server(client_p, NOCAPS, CAP_TS6, ":%s SVSMODE %s %lu %s", source_p->name, - target_p->name, (unsigned long)target_p->tsinfo, parv[3]); + target_p->name, (unsigned long)target_p->tsinfo, modes); } if (MyConnect(target_p) && (setflags != target_p->umodes)) @@ -178,7 +182,7 @@ ms_svsmode(struct Client *client_p, struct Client *source_p, } static struct Message svsmode_msgtab = { - "SVSMODE", 0, 0, 4, MAXPARA, MFLG_SLOW, 0, + "SVSMODE", 0, 0, 3, MAXPARA, MFLG_SLOW, 0, {m_ignore, m_ignore, ms_svsmode, m_ignore, m_ignore, m_ignore} }; |