ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/trunk/modules/m_svsmode.c
(Generate patch)

Comparing ircd-hybrid/trunk/modules/m_svsmode.c (file contents):
Revision 2022 by michael, Sun May 12 18:07:07 2013 UTC vs.
Revision 2820 by michael, Wed Jan 15 23:10:26 2014 UTC

# Line 1 | Line 1
1   /*
2 < *  ircd-hybrid: an advanced Internet Relay Chat Daemon(ircd).
2 > *  ircd-hybrid: an advanced, lightweight Internet Relay Chat Daemon (ircd)
3   *
4 < *  Copyright (C) 1999 by the Bahamut Development Team.
5 < *  Copyright (C) 2011 by the Hybrid Development Team.
4 > *  Copyright (c) 1999 Bahamut development team.
5 > *  Copyright (c) 2011-2014 ircd-hybrid development team
6   *
7   *  This program is free software; you can redistribute it and/or modify
8   *  it under the terms of the GNU General Public License as published by
# Line 28 | Line 28
28   #include "stdinc.h"
29   #include "client.h"
30   #include "ircd.h"
31 – #include "numeric.h"
31   #include "s_serv.h"
32   #include "send.h"
33   #include "channel_mode.h"
# Line 37 | Line 36
36   #include "irc_string.h"
37   #include "s_user.h"
38   #include "conf.h"
40 – #include "hook.h"
39  
40  
41   /*! \brief SVSMODE command handler (called by services)
# Line 52 | Line 50
50   * \note Valid arguments for this command are:
51   *      - parv[0] = sender prefix
52   *      - parv[1] = nickname
53 < *      - parv[2] = TS
54 < *      - parv[3] = mode
55 < *      - parv[4] = optional argument (services id, hostname)
53 > *      - parv[2] = TS (or mode, depending on svs version)
54 > *      - parv[3] = mode (or services id if old svs version)
55 > *      - parv[4] = optional argument (services id)
56   */
57 < static void
57 > static int
58   ms_svsmode(struct Client *client_p, struct Client *source_p,
59             int parc, char *parv[])
60   {
61    struct Client *target_p = NULL;
64 –  const char *m = NULL, *extarg = NULL;
62    int what = MODE_ADD;
63 <  unsigned int flag = 0, setflags = 0;
63 >  unsigned int flag = 0, setmodes = 0;
64 >  const char *m = NULL, *modes = NULL, *extarg = NULL;
65    time_t ts = 0;
66  
67    if (!HasFlag(source_p, FLAGS_SERVICE))
68 <    return;
68 >    return 0;
69  
70 <  if ((target_p = find_person(client_p, parv[1])) == NULL)
71 <    return;
70 >  if ((parc >= 4) && ((*parv[3] == '+') || (*parv[3] == '-')))
71 >  {
72 >    ts     = atol(parv[2]);
73 >    modes  = parv[3];
74 >    extarg = (parc > 4) ? parv[4] : NULL;
75 >  }
76 >  else
77 >  {
78 >    modes  = parv[2];
79 >    extarg = (parc > 3) ? parv[3] : NULL;
80 >  }
81  
82 <  if ((ts = atol(parv[2])) && (ts != target_p->tsinfo))
83 <    return;
82 >  if ((target_p = find_person(client_p, parv[1])) == NULL)
83 >    return 0;
84  
85 <  if (parc > 4 && !EmptyString(parv[4]))
86 <    extarg = parv[4];
85 >  if (ts && (ts != target_p->tsinfo))
86 >    return 0;
87  
88 <  setflags = target_p->umodes;
88 >  setmodes = target_p->umodes;
89  
90 <  for (m = parv[3]; *m; ++m)
90 >  for (m = modes; *m; ++m)
91    {
92      switch (*m)
93      {
# Line 92 | Line 99 | ms_svsmode(struct Client *client_p, stru
99          break;
100  
101        case 'd':
102 <        if (extarg)
102 >        if (!EmptyString(extarg))
103            strlcpy(target_p->svid, extarg, sizeof(target_p->svid));
104          break;
105  
106        case 'x':
107 <        if (what == MODE_ADD && extarg)
108 <          user_set_hostmask(target_p, extarg);
107 >        if (!EmptyString(extarg) && valid_hostname(extarg))
108 >          user_set_hostmask(target_p, extarg, what);
109          break;
110  
111        case 'o':
# Line 114 | Line 121 | ms_svsmode(struct Client *client_p, stru
121              detach_conf(target_p, CONF_OPER);
122              ClrOFlag(target_p);
123              DelUMode(target_p, ConfigFileEntry.oper_only_umodes);
124 <
125 <           if ((dm = dlinkFindDelete(&oper_list, target_p)) != NULL)
126 <             free_dlink_node(dm);
124 >
125 >            if ((dm = dlinkFindDelete(&oper_list, target_p)))
126 >              free_dlink_node(dm);
127            }
128          }
129  
# Line 137 | Line 144 | ms_svsmode(struct Client *client_p, stru
144  
145          break;
146  
147 <      case ' ':
148 <      case '\n':
142 <      case '\r':
143 <      case '\t':
147 >      case 'S':  /* Only servers may set +S in a burst */
148 >      case 'W':  /* Only servers may set +W in a burst */
149          break;
150 +
151        default:
152          if ((flag = user_modes[(unsigned char)*m]))
153          {
# Line 159 | Line 165 | ms_svsmode(struct Client *client_p, stru
165    {
166      sendto_server(client_p, CAP_TS6, NOCAPS,
167                    ":%s SVSMODE %s %lu %s %s", ID(source_p),
168 <                  ID(target_p), (unsigned long)target_p->tsinfo, parv[3], extarg);
168 >                  ID(target_p), (unsigned long)target_p->tsinfo, modes, extarg);
169      sendto_server(client_p, NOCAPS, CAP_TS6,
170                    ":%s SVSMODE %s %lu %s %s", source_p->name,
171 <                  target_p->name, (unsigned long)target_p->tsinfo, parv[3], extarg);
171 >                  target_p->name, (unsigned long)target_p->tsinfo, modes, extarg);
172    }
173    else
174    {
175      sendto_server(client_p, CAP_TS6, NOCAPS,
176                    ":%s SVSMODE %s %lu %s", ID(source_p),
177 <                  ID(target_p), (unsigned long)target_p->tsinfo, parv[3]);
177 >                  ID(target_p), (unsigned long)target_p->tsinfo, modes);
178      sendto_server(client_p, NOCAPS, CAP_TS6,
179                    ":%s SVSMODE %s %lu %s", source_p->name,
180 <                  target_p->name, (unsigned long)target_p->tsinfo, parv[3]);
180 >                  target_p->name, (unsigned long)target_p->tsinfo, modes);
181    }
182  
183 <  if (MyConnect(target_p) && (setflags != target_p->umodes))
183 >  if (MyConnect(target_p) && (setmodes != target_p->umodes))
184    {
185      char modebuf[IRCD_BUFSIZE];
186  
187 <    send_umode(target_p, target_p, setflags, 0xffffffff, modebuf);
187 >    send_umode(target_p, target_p, setmodes, 0xffffffff, modebuf);
188    }
189 +
190 +  return 0;
191   }
192  
193 < static struct Message svsmode_msgtab = {
194 <  "SVSMODE", 0, 0, 4, MAXPARA, MFLG_SLOW, 0,
195 <  {m_ignore, m_ignore, ms_svsmode, m_ignore, m_ignore, m_ignore}
193 > static struct Message svsmode_msgtab =
194 > {
195 >  "SVSMODE", 0, 0, 3, MAXPARA, MFLG_SLOW, 0,
196 >  { m_ignore, m_ignore, ms_svsmode, m_ignore, m_ignore, m_ignore }
197   };
198  
199   static void
# Line 199 | Line 208 | module_exit(void)
208    mod_del_cmd(&svsmode_msgtab);
209   }
210  
211 < struct module module_entry = {
211 > struct module module_entry =
212 > {
213    .node    = { NULL, NULL, NULL },
214    .name    = NULL,
215    .version = "$Revision$",

Diff Legend

– Removed lines
+ Added lines
< Changed lines (old)
> Changed lines (new)