ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/branches/8.0.x/modules/m_tburst.c
Revision: 1486
Committed: Fri Jul 27 08:21:40 2012 UTC (14 years, 2 months ago) by michael
Content type: text/x-csrc
Original Path: ircd-hybrid-8/modules/m_tburst.c
File size: 4553 byte(s)
Log Message:
- m_tburst.c: TBURST requires at least 6 parameters

File Contents

# User Rev Content
1 michael 325 /* modules/m_tburst.c
2     * Copyright (C) 2002, 2003, 2004, 2005 Hybrid Development Team
3     *
4     * Redistribution and use in source and binary forms, with or without
5     * modification, are permitted provided that the following conditions are
6     * met:
7     *
8     * 1.Redistributions of source code must retain the above copyright notice,
9     * this list of conditions and the following disclaimer.
10     * 2.Redistributions in binary form must reproduce the above copyright
11     * notice, this list of conditions and the following disclaimer in the
12     * documentation and/or other materials provided with the distribution.
13     * 3.The name of the author may not be used to endorse or promote products
14     * derived from this software without specific prior written permission.
15     *
16     * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17     * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18     * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19     * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
20     * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21     * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22     * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23     * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
24     * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
25     * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26     * POSSIBILITY OF SUCH DAMAGE.
27     *
28 michael 335 * $Id$
29 michael 325 */
30    
31     #include "stdinc.h"
32     #include "client.h"
33     #include "ircd.h"
34     #include "send.h"
35     #include "modules.h"
36     #include "hash.h"
37     #include "s_serv.h"
38 michael 1309 #include "conf.h"
39 michael 1243 #include "parse.h"
40 michael 325
41    
42     /* ms_tburst()
43     *
44     * parv[0] = sender prefix
45     * parv[1] = channel timestamp
46     * parv[2] = channel
47     * parv[3] = topic timestamp
48     * parv[4] = topic setter
49     * parv[5] = topic
50     */
51     static void
52     ms_tburst(struct Client *client_p, struct Client *source_p,
53     int parc, char *parv[])
54     {
55     struct Channel *chptr = NULL;
56 michael 336 int accept_remote = 0;
57     time_t remote_channel_ts = atol(parv[1]);
58     time_t remote_topic_ts = atol(parv[3]);
59 michael 1486 const char *topic = parv[5];
60     const char *setby = parv[4];
61 michael 325
62 michael 336 /*
63     * Do NOT test parv[5] for an empty string and return if true!
64     * parv[5] CAN be an empty string, i.e. if the other side wants
65     * to unset our topic. Don't forget: an empty topic is also a
66     * valid topic.
67     */
68    
69    
70 michael 325 if ((chptr = hash_find_channel(parv[2])) == NULL)
71     return;
72    
73 michael 336 /*
74     * The logic for accepting and rejecting channel topics was
75     * always a bit hairy, so now we got exactly 2 cases where
76     * we would accept a bursted topic
77     *
78     * Case 1:
79     * The TS of the remote channel is older than ours
80     * Case 2:
81     * The TS of the remote channel is equal to ours AND
82     * the TS of the remote topic is newer than ours
83 michael 325 */
84 michael 1485 if (HasFlag(source_p, FLAGS_SERVICE))
85 michael 336 accept_remote = 1;
86 michael 1485 else if (remote_channel_ts < chptr->channelts)
87     accept_remote = 1;
88 michael 336 else if (remote_channel_ts == chptr->channelts)
89     if (remote_topic_ts > chptr->topic_time)
90     accept_remote = 1;
91    
92     if (accept_remote)
93     {
94 michael 394 set_channel_topic(chptr, topic, setby, remote_topic_ts);
95 michael 336
96 michael 1485 if (strncmp(chptr->topic, topic, sizeof(chptr->topic) - 1))
97 michael 1243 sendto_channel_local(ALL_MEMBERS, 0, chptr, ":%s TOPIC %s :%s",
98 michael 336 ConfigServerHide.hide_servers ? me.name : source_p->name,
99 michael 1203 chptr->chname, chptr->topic);
100 michael 336 }
101    
102     /*
103     * Always propagate what we have received, not only if we accept the topic.
104     * This will keep other servers in sync.
105     */
106 michael 1474 sendto_server(source_p, CAP_TBURST|CAP_TS6, NOCAPS,
107 michael 336 ":%s TBURST %s %s %s %s :%s",
108 michael 1472 ID(source_p), parv[1], parv[2], parv[3], setby, topic);
109 michael 1474 sendto_server(source_p, CAP_TBURST, CAP_TS6,
110 michael 1472 ":%s TBURST %s %s %s %s :%s",
111 michael 394 source_p->name, parv[1], parv[2], parv[3], setby, topic);
112 michael 325 }
113    
114 michael 1230 static struct Message tburst_msgtab = {
115 michael 1486 "TBURST", 0, 0, 6, MAXPARA, MFLG_SLOW, 0,
116 michael 1230 { m_ignore, m_ignore, ms_tburst, m_ignore, m_ignore, m_ignore }
117     };
118    
119 michael 325 static void
120 michael 1230 module_init(void)
121 michael 325 {
122 michael 1230 mod_add_cmd(&tburst_msgtab);
123     add_capability("TBURST", CAP_TBURST, 1);
124     }
125 michael 325
126 michael 1230 static void
127     module_exit(void)
128     {
129     mod_del_cmd(&tburst_msgtab);
130     delete_capability("TBURST");
131 michael 325 }
132 michael 1230
133     struct module module_entry = {
134     .node = { NULL, NULL, NULL },
135     .name = NULL,
136     .version = "$Revision$",
137     .handle = NULL,
138     .modinit = module_init,
139     .modexit = module_exit,
140     .flags = 0
141     };

Properties

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