summaryrefslogtreecommitdiff
path: root/modules/m_svsmode.c
diff options
context:
space:
mode:
authormichael <michael@82007160-df01-0410-b94d-b575c5fd34c7>2013-05-15 19:37:42 +0000
committermichael <michael@82007160-df01-0410-b94d-b575c5fd34c7>2013-05-15 19:37:42 +0000
commitaba42ce92038bc137c44842c886bcdbbae9794d9 (patch)
tree5b93bf256aabc9a8a1e01c13bfd9e022bbffe4e9 /modules/m_svsmode.c
parentd654992a626ccf95c9db1bb10cee37c9ae9618bb (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.c44
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}
};