ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/trunk/modules/m_tburst.c
Revision: 1485
Committed: Fri Jul 27 08:15:55 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: 4611 byte(s)
Log Message:
- m_tburst.c: Services may always override topic-/channel-TS rules

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 394 const char *topic = "";
60     const char *setby = "";
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 394 if (parc == 6)
74     {
75     topic = parv[5];
76     setby = parv[4];
77     }
78    
79 michael 336 /*
80     * The logic for accepting and rejecting channel topics was
81     * always a bit hairy, so now we got exactly 2 cases where
82     * we would accept a bursted topic
83     *
84     * Case 1:
85     * The TS of the remote channel is older than ours
86     * Case 2:
87     * The TS of the remote channel is equal to ours AND
88     * the TS of the remote topic is newer than ours
89 michael 325 */
90 michael 1485 if (HasFlag(source_p, FLAGS_SERVICE))
91 michael 336 accept_remote = 1;
92 michael 1485 else if (remote_channel_ts < chptr->channelts)
93     accept_remote = 1;
94 michael 336 else if (remote_channel_ts == chptr->channelts)
95     if (remote_topic_ts > chptr->topic_time)
96     accept_remote = 1;
97    
98     if (accept_remote)
99     {
100 michael 394 set_channel_topic(chptr, topic, setby, remote_topic_ts);
101 michael 336
102 michael 1485 if (strncmp(chptr->topic, topic, sizeof(chptr->topic) - 1))
103 michael 1243 sendto_channel_local(ALL_MEMBERS, 0, chptr, ":%s TOPIC %s :%s",
104 michael 336 ConfigServerHide.hide_servers ? me.name : source_p->name,
105 michael 1203 chptr->chname, chptr->topic);
106 michael 336 }
107    
108     /*
109     * Always propagate what we have received, not only if we accept the topic.
110     * This will keep other servers in sync.
111     */
112 michael 1474 sendto_server(source_p, CAP_TBURST|CAP_TS6, NOCAPS,
113 michael 336 ":%s TBURST %s %s %s %s :%s",
114 michael 1472 ID(source_p), parv[1], parv[2], parv[3], setby, topic);
115 michael 1474 sendto_server(source_p, CAP_TBURST, CAP_TS6,
116 michael 1472 ":%s TBURST %s %s %s %s :%s",
117 michael 394 source_p->name, parv[1], parv[2], parv[3], setby, topic);
118 michael 325 }
119    
120 michael 1230 static struct Message tburst_msgtab = {
121     "TBURST", 0, 0, 5, MAXPARA, MFLG_SLOW, 0,
122     { m_ignore, m_ignore, ms_tburst, m_ignore, m_ignore, m_ignore }
123     };
124    
125 michael 325 static void
126 michael 1230 module_init(void)
127 michael 325 {
128 michael 1230 mod_add_cmd(&tburst_msgtab);
129     add_capability("TBURST", CAP_TBURST, 1);
130     }
131 michael 325
132 michael 1230 static void
133     module_exit(void)
134     {
135     mod_del_cmd(&tburst_msgtab);
136     delete_capability("TBURST");
137 michael 325 }
138 michael 1230
139     struct module module_entry = {
140     .node = { NULL, NULL, NULL },
141     .name = NULL,
142     .version = "$Revision$",
143     .handle = NULL,
144     .modinit = module_init,
145     .modexit = module_exit,
146     .flags = 0
147     };

Properties

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