ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/releases/8.2.0beta1/modules/m_svsmode.c
Revision: 3420
Committed: Tue Apr 29 15:13:10 2014 UTC (11 years, 3 months ago) by michael
Content type: text/x-csrc
File size: 5363 byte(s)
Log Message:
RELEASE TAG 8.2.0beta1

File Contents

# Content
1 /*
2 * ircd-hybrid: an advanced, lightweight Internet Relay Chat Daemon (ircd)
3 *
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
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
20 * USA
21 */
22
23 /*! \file m_svsmode.c
24 * \brief Includes required functions for processing the SVSMODE command.
25 * \version $Id$
26 */
27
28 #include "stdinc.h"
29 #include "client.h"
30 #include "ircd.h"
31 #include "server.h"
32 #include "send.h"
33 #include "channel_mode.h"
34 #include "parse.h"
35 #include "modules.h"
36 #include "irc_string.h"
37 #include "user.h"
38 #include "conf.h"
39
40
41 /*! \brief SVSMODE command handler
42 *
43 * \param source_p Pointer to allocated Client struct from which the message
44 * originally comes from. This can be a local or remote client.
45 * \param parc Integer holding the number of supplied arguments.
46 * \param parv Argument vector where parv[0] .. parv[parc-1] are non-NULL
47 * pointers.
48 * \note Valid arguments for this command are:
49 * - parv[0] = command
50 * - parv[1] = nickname
51 * - parv[2] = TS (or mode, depending on svs version)
52 * - parv[3] = mode (or services id if old svs version)
53 * - parv[4] = optional argument (services id)
54 */
55 static int
56 ms_svsmode(struct Client *source_p, int parc, char *parv[])
57 {
58 struct Client *target_p = NULL;
59 int what = MODE_ADD;
60 unsigned int flag = 0, setmodes = 0;
61 const char *modes = NULL, *extarg = NULL;
62 time_t ts = 0;
63
64 if (!HasFlag(source_p, FLAGS_SERVICE))
65 return 0;
66
67 if ((parc >= 4) && ((*parv[3] == '+') || (*parv[3] == '-')))
68 {
69 ts = atol(parv[2]);
70 modes = parv[3];
71 extarg = (parc > 4) ? parv[4] : NULL;
72 }
73 else
74 {
75 modes = parv[2];
76 extarg = (parc > 3) ? parv[3] : NULL;
77 }
78
79 if ((target_p = find_person(source_p, parv[1])) == NULL)
80 return 0;
81
82 if (ts && (ts != target_p->tsinfo))
83 return 0;
84
85 setmodes = target_p->umodes;
86
87 for (const char *m = modes; *m; ++m)
88 {
89 switch (*m)
90 {
91 case '+':
92 what = MODE_ADD;
93 break;
94 case '-':
95 what = MODE_DEL;
96 break;
97
98 case 'd':
99 if (!EmptyString(extarg))
100 strlcpy(target_p->svid, extarg, sizeof(target_p->svid));
101 break;
102
103 case 'x':
104 if (!EmptyString(extarg) && valid_hostname(extarg))
105 user_set_hostmask(target_p, extarg, what);
106 break;
107
108 case 'o':
109 if (what == MODE_DEL && HasUMode(target_p, UMODE_OPER))
110 {
111 ClearOper(target_p);
112 Count.oper--;
113
114 if (MyConnect(target_p))
115 {
116 dlink_node *dm = NULL;
117
118 detach_conf(target_p, CONF_OPER);
119 ClrOFlag(target_p);
120 DelUMode(target_p, ConfigFileEntry.oper_only_umodes);
121
122 if ((dm = dlinkFindDelete(&oper_list, target_p)))
123 free_dlink_node(dm);
124 }
125 }
126
127 break;
128
129 case 'i':
130 if (what == MODE_ADD && !HasUMode(target_p, UMODE_INVISIBLE))
131 {
132 AddUMode(target_p, UMODE_INVISIBLE);
133 ++Count.invisi;
134 }
135
136 if (what == MODE_DEL && HasUMode(target_p, UMODE_INVISIBLE))
137 {
138 DelUMode(target_p, UMODE_INVISIBLE);
139 --Count.invisi;
140 }
141
142 break;
143
144 case 'S': /* Only servers may set +S in a burst */
145 case 'W': /* Only servers may set +W in a burst */
146 break;
147
148 default:
149 if ((flag = user_modes[(unsigned char)*m]))
150 {
151 if (what == MODE_ADD)
152 AddUMode(target_p, flag);
153 else
154 DelUMode(target_p, flag);
155 }
156
157 break;
158 }
159 }
160
161 if (extarg)
162 sendto_server(source_p, NOCAPS, NOCAPS, ":%s SVSMODE %s %lu %s %s",
163 source_p->id,
164 target_p->id, (unsigned long)target_p->tsinfo, modes, extarg);
165 else
166 sendto_server(source_p, NOCAPS, NOCAPS, ":%s SVSMODE %s %lu %s",
167 source_p->id,
168 target_p->id, (unsigned long)target_p->tsinfo, modes);
169
170 if (MyConnect(target_p) && (setmodes != target_p->umodes))
171 {
172 char modebuf[IRCD_BUFSIZE] = "";
173
174 send_umode(target_p, target_p, setmodes, 0xffffffff, modebuf);
175 }
176
177 return 0;
178 }
179
180 static struct Message svsmode_msgtab =
181 {
182 "SVSMODE", 0, 0, 3, MAXPARA, MFLG_SLOW, 0,
183 { m_ignore, m_ignore, ms_svsmode, m_ignore, m_ignore, m_ignore }
184 };
185
186 static void
187 module_init(void)
188 {
189 mod_add_cmd(&svsmode_msgtab);
190 }
191
192 static void
193 module_exit(void)
194 {
195 mod_del_cmd(&svsmode_msgtab);
196 }
197
198 struct module module_entry =
199 {
200 .node = { NULL, NULL, NULL },
201 .name = NULL,
202 .version = "$Revision$",
203 .handle = NULL,
204 .modinit = module_init,
205 .modexit = module_exit,
206 .flags = 0
207 };

Properties

Name Value
svn:eol-style native
svn:keywords Id Revision