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 1809 by michael, Wed Apr 10 16:51:34 2013 UTC vs.
Revision 2274 by michael, Tue Jun 18 16:01:57 2013 UTC

# 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
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
# Line 61 | Line 59 | ms_svsmode(struct Client *client_p, stru
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, setmodes = 0;
64 +  char *m = NULL, *modes = NULL, *extarg = NULL;
65    time_t ts = 0;
66  
67    if (!HasFlag(source_p, FLAGS_SERVICE))
68      return;
69  
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 ((target_p = find_person(client_p, parv[1])) == NULL)
83      return;
84  
85 <  if ((ts = atol(parv[2])) && (ts != target_p->tsinfo))
85 >  if (ts && (ts != target_p->tsinfo))
86      return;
87  
78 –  if (parc > 4 && !EmptyString(parv[4]))
79 –    extarg = parv[4];
80 –
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 (!EmptyString(extarg) && valid_hostname(extarg))
108 +          user_set_hostmask(target_p, extarg, what);
109 +        break;
110 +
111        case 'o':
112          if (what == MODE_DEL && HasUMode(target_p, UMODE_OPER))
113          {
# Line 132 | Line 144 | ms_svsmode(struct Client *client_p, stru
144  
145          break;
146  
147 <      case ' ':
136 <      case '\n':
137 <      case '\r':
138 <      case '\t':
147 >      case 'S':  /* Only servers may set +S in a burst */
148          break;
149 +
150        default:
151          if ((flag = user_modes[(unsigned char)*m]))
152 <          execute_callback(umode_cb, client_p, target_p, what, flag);
152 >        {
153 >          if (what == MODE_ADD)
154 >            AddUMode(target_p, flag);
155 >          else
156 >            DelUMode(target_p, flag);
157 >        }
158 >
159          break;
160      }
161    }
# Line 148 | Line 164 | ms_svsmode(struct Client *client_p, stru
164    {
165      sendto_server(client_p, CAP_TS6, NOCAPS,
166                    ":%s SVSMODE %s %lu %s %s", ID(source_p),
167 <                  ID(target_p), (unsigned long)target_p->tsinfo, parv[3], extarg);
167 >                  ID(target_p), (unsigned long)target_p->tsinfo, modes, extarg);
168      sendto_server(client_p, NOCAPS, CAP_TS6,
169                    ":%s SVSMODE %s %lu %s %s", source_p->name,
170 <                  target_p->name, (unsigned long)target_p->tsinfo, parv[3], extarg);
170 >                  target_p->name, (unsigned long)target_p->tsinfo, modes, extarg);
171    }
172    else
173    {
174      sendto_server(client_p, CAP_TS6, NOCAPS,
175                    ":%s SVSMODE %s %lu %s", ID(source_p),
176 <                  ID(target_p), (unsigned long)target_p->tsinfo, parv[3]);
176 >                  ID(target_p), (unsigned long)target_p->tsinfo, modes);
177      sendto_server(client_p, NOCAPS, CAP_TS6,
178                    ":%s SVSMODE %s %lu %s", source_p->name,
179 <                  target_p->name, (unsigned long)target_p->tsinfo, parv[3]);
179 >                  target_p->name, (unsigned long)target_p->tsinfo, modes);
180    }
181  
182    if (MyConnect(target_p) && (setmodes != target_p->umodes))
# Line 172 | Line 188 | ms_svsmode(struct Client *client_p, stru
188   }
189  
190   static struct Message svsmode_msgtab = {
191 <  "SVSMODE", 0, 0, 4, MAXPARA, MFLG_SLOW, 0,
191 >  "SVSMODE", 0, 0, 3, MAXPARA, MFLG_SLOW, 0,
192    {m_ignore, m_ignore, ms_svsmode, m_ignore, m_ignore, m_ignore}
193   };
194  

Diff Legend

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