ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/modules/m_links.c
Revision: 1044
Committed: Tue Jan 26 12:58:17 2010 UTC (14 years, 2 months ago) by michael
Content type: text/x-csrc
File size: 5646 byte(s)
Log Message:
- contrib/spy_links_notice.c: do not show additional arguments supplied to the
  LINKS command in spy notices. new behaviour is to simply show the command sent
  by the client, which exactly behaves like all other contributed spy modules.
- remove clean_string()

File Contents

# Content
1 /*
2 * ircd-hybrid: an advanced Internet Relay Chat Daemon(ircd).
3 * m_links.c: Shows what servers are currently connected.
4 *
5 * Copyright (C) 2002 by the past and present ircd coders, and others.
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 * $Id$
23 */
24
25 #include "stdinc.h"
26 #include "handlers.h"
27 #include "client.h"
28 #include "irc_string.h"
29 #include "ircd.h"
30 #include "numeric.h"
31 #include "s_serv.h"
32 #include "send.h"
33 #include "s_conf.h"
34 #include "msg.h"
35 #include "motd.h"
36 #include "parse.h"
37 #include "modules.h"
38 #include "hook.h"
39
40 static void do_links(struct Client *, int, char **);
41 static void m_links(struct Client*, struct Client*, int, char**);
42 static void mo_links(struct Client*, struct Client*, int, char**);
43 static void ms_links(struct Client*, struct Client*, int, char**);
44
45 struct Message links_msgtab = {
46 "LINKS", 0, 0, 0, 0, MFLG_SLOW, 0,
47 {m_unregistered, m_links, ms_links, m_ignore, mo_links, m_ignore}
48 };
49
50 #ifndef STATIC_MODULES
51 const char *_version = "$Revision$";
52 static struct Callback *links_cb;
53
54 static void *
55 va_links(va_list args)
56 {
57 struct Client *source_p = va_arg(args, struct Client *);
58 int parc = va_arg(args, int);
59 char **parv = va_arg(args, char **);
60
61 do_links(source_p, parc, parv);
62 return NULL;
63 }
64
65 void
66 _modinit(void)
67 {
68 links_cb = register_callback("doing_links", va_links);
69 mod_add_cmd(&links_msgtab);
70 }
71
72 void
73 _moddeinit(void)
74 {
75 mod_del_cmd(&links_msgtab);
76 uninstall_hook(links_cb, va_links);
77 }
78
79 #endif
80
81 static void
82 do_links(struct Client *source_p, int parc, char **parv)
83 {
84 if (IsOper(source_p) || !ConfigServerHide.flatten_links)
85 {
86 const char *mask = (parc > 2 ? parv[2] : parv[1]);
87 const char *me_name, *nick, *p;
88 struct Client *target_p;
89 dlink_node *ptr;
90
91 me_name = ID_or_name(&me, source_p->from);
92 nick = ID_or_name(source_p, source_p->from);
93
94 DLINK_FOREACH(ptr, global_serv_list.head)
95 {
96 target_p = ptr->data;
97
98 if (!EmptyString(mask) && !match(mask, target_p->name))
99 continue;
100
101 if (target_p->info[0])
102 {
103 if ((p = strchr(target_p->info, ']')))
104 p += 2; /* skip the nasty [IP] part */
105 else
106 p = target_p->info;
107 }
108 else
109 p = "(Unknown Location)";
110
111 /* We just send the reply, as if they are here there's either no SHIDE,
112 * or they're an oper..
113 */
114 sendto_one(source_p, form_str(RPL_LINKS),
115 me_name, nick,
116 target_p->name, target_p->servptr->name,
117 target_p->hopcount, p);
118 }
119
120 sendto_one(source_p, form_str(RPL_ENDOFLINKS),
121 me_name, nick,
122 EmptyString(mask) ? "*" : mask);
123 }
124 else
125 {
126 /*
127 * Print our own info so at least it looks like a normal links
128 * then print out the file (which may or may not be empty)
129 */
130 sendto_one(source_p, form_str(RPL_LINKS),
131 ID_or_name(&me, source_p->from),
132 ID_or_name(source_p, source_p->from),
133 me.name, me.name, 0, me.info);
134 send_message_file(source_p, &ConfigFileEntry.linksfile);
135 sendto_one(source_p, form_str(RPL_ENDOFLINKS),
136 ID_or_name(&me, source_p->from),
137 ID_or_name(source_p, source_p->from), "*");
138 }
139 }
140
141 /*
142 * m_links - LINKS message handler
143 * parv[0] = sender prefix
144 * parv[1] = servername mask
145 * or
146 * parv[0] = sender prefix
147 * parv[1] = server to query
148 * parv[2] = servername mask
149 */
150 static void
151 m_links(struct Client *client_p, struct Client *source_p,
152 int parc, char *parv[])
153 {
154 static time_t last_used = 0;
155
156 if ((last_used + ConfigFileEntry.pace_wait) > CurrentTime)
157 {
158 sendto_one(source_p, form_str(RPL_LOAD2HI),
159 me.name, source_p->name);
160 return;
161 }
162
163 last_used = CurrentTime;
164
165 if (!ConfigServerHide.flatten_links)
166 {
167 mo_links(client_p, source_p, parc, parv);
168 return;
169 }
170
171 #ifdef STATIC_MODULES
172 do_links(source_p, parc, parv);
173 #else
174 execute_callback(links_cb, source_p, parc, parv);
175 #endif
176 }
177
178 static void
179 mo_links(struct Client *client_p, struct Client *source_p,
180 int parc, char *parv[])
181 {
182 if (parc > 2)
183 if (!ConfigFileEntry.disable_remote || IsOper(source_p))
184 {
185 if (hunt_server(client_p, source_p, ":%s LINKS %s :%s", 1, parc, parv)
186 != HUNTED_ISME)
187 return;
188 }
189
190 #ifdef STATIC_MODULES
191 do_links(source_p, parc, parv);
192 #else
193 execute_callback(links_cb, source_p, parc, parv);
194 #endif
195 }
196
197 /*
198 * ms_links - LINKS message handler
199 * parv[0] = sender prefix
200 * parv[1] = servername mask
201 * or
202 * parv[0] = sender prefix
203 * parv[1] = server to query
204 * parv[2] = servername mask
205 */
206 static void
207 ms_links(struct Client *client_p, struct Client *source_p,
208 int parc, char *parv[])
209 {
210 if (hunt_server(client_p, source_p, ":%s LINKS %s :%s", 1, parc, parv)
211 != HUNTED_ISME)
212 return;
213
214 if (IsClient(source_p))
215 m_links(client_p, source_p, parc, parv);
216 }

Properties

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