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 2246 by michael, Sun Jun 16 10:48:39 2013 UTC

# Line 52 | Line 52
52   * \note Valid arguments for this command are:
53   *      - parv[0] = sender prefix
54   *      - parv[1] = nickname
55 < *      - parv[2] = TS
56 < *      - parv[3] = mode
55 > *      - parv[2] = TS (or mode, depending on svs version)
56 > *      - parv[3] = mode (or services id if old svs version)
57   *      - parv[4] = optional argument (services id)
58   */
59   static void
# Line 61 | Line 61 | ms_svsmode(struct Client *client_p, stru
61             int parc, char *parv[])
62   {
63    struct Client *target_p = NULL;
64 –  const char *m = NULL, *extarg = NULL;
64    int what = MODE_ADD;
65    unsigned int flag = 0, setmodes = 0;
66 +  char *m = NULL, *modes = NULL, *extarg = NULL;
67    time_t ts = 0;
68  
69    if (!HasFlag(source_p, FLAGS_SERVICE))
70      return;
71  
72 +  if ((parc >= 4) && ((*parv[3] == '+') || (*parv[3] == '-')))
73 +  {
74 +    ts     = atol(parv[2]);
75 +    modes  = parv[3];
76 +    extarg = (parc > 4) ? parv[4] : NULL;
77 +  }
78 +  else
79 +  {
80 +    modes  = parv[2];
81 +    extarg = (parc > 3) ? parv[3] : NULL;
82 +  }
83 +
84    if ((target_p = find_person(client_p, parv[1])) == NULL)
85      return;
86  
87 <  if ((ts = atol(parv[2])) && (ts != target_p->tsinfo))
87 >  if (ts && (ts != target_p->tsinfo))
88      return;
89  
78 –  if (parc > 4 && !EmptyString(parv[4]))
79 –    extarg = parv[4];
80 –
90    setmodes = target_p->umodes;
91  
92 <  for (m = parv[3]; *m; ++m)
92 >  for (m = modes; *m; ++m)
93    {
94      switch (*m)
95      {
# Line 92 | Line 101 | ms_svsmode(struct Client *client_p, stru
101          break;
102  
103        case 'd':
104 <        if (extarg)
104 >        if (!EmptyString(extarg))
105            strlcpy(target_p->svid, extarg, sizeof(target_p->svid));
106          break;
107  
108 +      case 'x':
109 +        if (!EmptyString(extarg) && valid_hostname(extarg))
110 +          user_set_hostmask(target_p, extarg, what);
111 +        break;
112 +
113        case 'o':
114          if (what == MODE_DEL && HasUMode(target_p, UMODE_OPER))
115          {
# Line 132 | Line 146 | ms_svsmode(struct Client *client_p, stru
146  
147          break;
148  
149 <      case ' ':
136 <      case '\n':
137 <      case '\r':
138 <      case '\t':
149 >      case 'S':  /* Only servers may set +S in a burst */
150          break;
151 +
152        default:
153          if ((flag = user_modes[(unsigned char)*m]))
154 <          execute_callback(umode_cb, client_p, target_p, what, flag);
154 >        {
155 >          if (what == MODE_ADD)
156 >            AddUMode(target_p, flag);
157 >          else
158 >            DelUMode(target_p, flag);
159 >        }
160 >
161          break;
162      }
163    }
# Line 148 | Line 166 | ms_svsmode(struct Client *client_p, stru
166    {
167      sendto_server(client_p, CAP_TS6, NOCAPS,
168                    ":%s SVSMODE %s %lu %s %s", ID(source_p),
169 <                  ID(target_p), (unsigned long)target_p->tsinfo, parv[3], extarg);
169 >                  ID(target_p), (unsigned long)target_p->tsinfo, modes, extarg);
170      sendto_server(client_p, NOCAPS, CAP_TS6,
171                    ":%s SVSMODE %s %lu %s %s", source_p->name,
172 <                  target_p->name, (unsigned long)target_p->tsinfo, parv[3], extarg);
172 >                  target_p->name, (unsigned long)target_p->tsinfo, modes, extarg);
173    }
174    else
175    {
176      sendto_server(client_p, CAP_TS6, NOCAPS,
177                    ":%s SVSMODE %s %lu %s", ID(source_p),
178 <                  ID(target_p), (unsigned long)target_p->tsinfo, parv[3]);
178 >                  ID(target_p), (unsigned long)target_p->tsinfo, modes);
179      sendto_server(client_p, NOCAPS, CAP_TS6,
180                    ":%s SVSMODE %s %lu %s", source_p->name,
181 <                  target_p->name, (unsigned long)target_p->tsinfo, parv[3]);
181 >                  target_p->name, (unsigned long)target_p->tsinfo, modes);
182    }
183  
184    if (MyConnect(target_p) && (setmodes != target_p->umodes))
# Line 172 | Line 190 | ms_svsmode(struct Client *client_p, stru
190   }
191  
192   static struct Message svsmode_msgtab = {
193 <  "SVSMODE", 0, 0, 4, MAXPARA, MFLG_SLOW, 0,
193 >  "SVSMODE", 0, 0, 3, MAXPARA, MFLG_SLOW, 0,
194    {m_ignore, m_ignore, ms_svsmode, m_ignore, m_ignore, m_ignore}
195   };
196  

Diff Legend

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