Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
BitchX
GitHub Repository: BitchX/BitchX1.3
Path: blob/master/source/commands2.c
1069 views
1
/*
2
* Routines within this files are Copyright Colten Edwards 1996
3
* Aka panasync on irc.
4
* Thanks to Shiek and Flier for helpful hints and suggestions. As well
5
* as code in some cases.
6
*/
7
8
#include "irc.h"
9
static char cvsrevision[] = "$Id: commands2.c 163 2012-04-30 08:05:04Z keaston $";
10
CVS_REVISION(commands2_c)
11
#include "struct.h"
12
#include <sys/stat.h>
13
14
#if defined(_ALL_SOURCE) || defined(__EMX__) || defined(__QNX__) || defined(__FreeBSD__)
15
#include <termios.h>
16
#else
17
#include <sys/termios.h>
18
#endif
19
#include <sys/ioctl.h>
20
21
22
#ifdef HAVE_UNAME
23
#include <sys/utsname.h>
24
#endif
25
26
#include <unistd.h>
27
#ifdef HAVE_SYS_UN_H
28
#include <sys/un.h>
29
#endif
30
31
#include <sys/wait.h>
32
#include <sys/ioctl.h>
33
#ifdef HAVE_SYS_FILIO_H
34
#include <sys/filio.h>
35
#endif
36
37
38
#include "parse.h"
39
#include "server.h"
40
#include "chelp.h"
41
#include "commands.h"
42
#include "encrypt.h"
43
#include "vars.h"
44
#include "ircaux.h"
45
#include "lastlog.h"
46
#include "log.h"
47
#include "window.h"
48
#include "screen.h"
49
#include "ircterm.h"
50
#include "who.h"
51
#include "hook.h"
52
#include "input.h"
53
#include "ignore.h"
54
#include "keys.h"
55
#include "names.h"
56
#include "alias.h"
57
#include "array.h"
58
#include "history.h"
59
#include "funny.h"
60
#include "ctcp.h"
61
#include "dcc.h"
62
#include "output.h"
63
#include "exec.h"
64
#include "notify.h"
65
#include "numbers.h"
66
#include "status.h"
67
#include "if.h"
68
#include "help.h"
69
#include "stack.h"
70
#include "queue.h"
71
#include "timer.h"
72
#include "list.h"
73
#include "misc.h"
74
#include "userlist.h"
75
#include "whowas.h"
76
#include "window.h"
77
#include "flood.h"
78
#include "hash2.h"
79
#include "notice.h"
80
#include "who.h"
81
#include "gui.h"
82
#define MAIN_SOURCE
83
#include "modval.h"
84
85
void toggle_reverse_status(Window *, char *, int);
86
87
#ifdef GUI
88
char *msgtext = NULL;
89
90
#ifndef GLOBAL_MENU_ID
91
#define GLOBAL_MENU_ID 5000
92
#endif
93
94
MenuStruct *morigin = NULL;
95
int globalmenuid=GLOBAL_MENU_ID;
96
#endif
97
98
extern char attach_ttyname[];
99
100
char *org_nick = NULL;
101
102
static int delay_gain_nick (void *, char *);
103
104
BUILT_IN_COMMAND(nwhois)
105
{
106
ChannelList *tmp = NULL;
107
NickList *user = NULL;
108
int once = 0;
109
char *nick = NULL;
110
int mem_use = 0, max_mem = 0;
111
int server = from_server;
112
char *arg = NULL, *t = NULL;
113
int all = 0;
114
int to_chan = 0;
115
116
if (!(tmp = get_server_channels(server)))
117
{
118
bitchsay("No Channel or no server");
119
return;
120
}
121
122
if (args && *args)
123
t = arg = m_strdup(args);
124
else
125
{
126
all = 1;
127
nick = get_current_channel_by_refnum(0);
128
}
129
130
while (all || (nick = next_arg(arg, &arg)))
131
{
132
while (tmp)
133
{
134
if ((all || (nick && (to_chan = is_channel(nick)))) && my_stricmp(tmp->channel, nick))
135
{
136
tmp = tmp->next;
137
continue;
138
}
139
for (user = next_nicklist(tmp, NULL); user; user = next_nicklist(tmp, user))
140
{
141
if (all || to_chan || wild_match(nick, user->nick))
142
{
143
if (!once)
144
{
145
put_it("%s", convert_output_format("%G$[7]0 @ v UL: SL: +o -o +b -b kicks nicks pub", "%s", (all || to_chan)?/*"Channel"*/tmp->channel:"Nick"));
146
#ifdef ONLY_STD_CHARS
147
put_it("%s", convert_output_format("%B------------------------------------------------------------------------------", NULL, NULL));
148
#else
149
put_it("%s", convert_output_format("%B������������������������������������������������������������������������������", NULL, NULL));
150
#endif
151
once++;
152
}
153
put_it("%s", convert_output_format("$[10]0 %C$1 $2%w %B$[16]3 %R$[6]4 %M$[4]5 $[4]6 $[4]7 $[4]8$[-4]9 $[-4]10 $[-6]11",
154
"%s %c %c %s %u %u %u %u %u %u %u %u",
155
to_chan ? tmp->channel: user->nick,
156
nick_isop(user)? '@':'�',nick_isvoice(user)?'v':'�',
157
#ifdef WANT_USERLIST
158
user->userlist?convert_flags(user->userlist->flags):"none",
159
user->shitlist?user->shitlist->level: 0,
160
#else
161
"none", 0,
162
#endif
163
user->stat_ops,user->stat_dops, user->stat_bans, user->stat_unbans,
164
user->stat_kicks, user->stat_nicks, user->stat_pub));
165
mem_use += sizeof(NickList) + (user->userlist ? sizeof(UserList) : 0) + (user->shitlist ? sizeof(ShitList):0);
166
if (max_mem < mem_use)
167
max_mem = mem_use;
168
if (!all)
169
break;
170
}
171
}
172
tmp = tmp->next;
173
}
174
if (once && nick)
175
put_it("%s", convert_output_format("$G End /NWhoIs list for $1- [Mem Usage: $0 bytes per chan]", "%d %s", max_mem, (all||to_chan) ? "All":nick));
176
if (all)
177
break;
178
}
179
if (!all && !once)
180
put_it("%s", convert_output_format("$G No such nick or channel", NULL, NULL));
181
new_free(&t);
182
}
183
184
BUILT_IN_COMMAND(whowas)
185
{
186
187
if (!command)
188
show_whowas();
189
else
190
show_wholeft(NULL);
191
}
192
193
BUILT_IN_COMMAND(add_ban_word)
194
{
195
char *word = NULL;
196
char *chan = NULL;
197
WordKickList *new;
198
199
200
if (args && *args)
201
{
202
chan = next_arg(args, &args);
203
if ((!is_channel(chan) && (chan && *chan != '*')) || !args || !*args)
204
return;
205
if (!command)
206
{
207
new = (WordKickList *)find_in_list((List **)&ban_words, args, 0);
208
if (!ban_words || !new || (new && !wild_match(new->channel, chan)))
209
{
210
new = (WordKickList *) new_malloc(sizeof(WordKickList));
211
malloc_strcpy(&new->channel, chan);
212
malloc_strcpy(&new->string, args);
213
add_to_list((List **)&ban_words, (List *)new);
214
bitchsay("Added %s to %s Banned Word List", new->string, new->channel);
215
} else bitchsay("[%s] is already in the list for channel %s", args, chan);
216
}
217
else
218
{
219
int count = 0;
220
malloc_strcpy(&word, args);
221
while ((new = (WordKickList *) removewild_from_list((List **)&ban_words, word)))
222
{
223
bitchsay("Removed %s Banned Word [%s]", new->channel, new->string);
224
new_free(&new->channel);
225
new_free(&new->string);
226
new_free((char **)&new);
227
count++;
228
}
229
if (!count)
230
bitchsay("Banned Word %s not found.", word);
231
new_free(&word);
232
}
233
}
234
}
235
236
BUILT_IN_COMMAND(show_word_kick)
237
{
238
WordKickList *new;
239
240
241
if (ban_words)
242
{
243
put_it("%14s %40s", "Channel", "Banned Word(s)");
244
for (new = ban_words; new; new = new->next)
245
put_it("%-14s %40s", new->channel, new->string);
246
} else
247
bitchsay("No Banned Words on list");
248
}
249
250
void save_banwords(FILE *outfile)
251
{
252
int count = 0;
253
WordKickList *new;
254
255
256
if (ban_words)
257
{
258
fprintf(outfile, "# %s Banned Words\n", version);
259
for (new = ban_words; new; new = new->next)
260
{
261
fprintf(outfile, "BANWORD %s %s\n", new->channel, new->string);
262
count++;
263
}
264
}
265
if (count && do_hook(SAVEFILE_LIST,"BanWords %d", count))
266
bitchsay("Saved %d Banned Words List", count);
267
}
268
269
#if 0
270
static char *recreate_saymode(ChannelList *chan)
271
{
272
static char mode_str[] = "iklmnpsta";
273
static char buffer[BIG_BUFFER_SIZE/4+1];
274
int mode_pos = 0;
275
int mode;
276
char *s;
277
278
279
buffer[0] = '\0';
280
s = buffer;
281
mode = chan->modelock_val;
282
while (mode)
283
{
284
if (mode % 2)
285
*s++ = mode_str[mode_pos];
286
mode /= 2;
287
mode_pos++;
288
}
289
if (chan->key && *chan->key)
290
{
291
*s++ = ' ';
292
strcpy(s, chan->key);
293
s += strlen(chan->key);
294
}
295
if (chan->limit)
296
sprintf(s, " %d", chan->limit);
297
else
298
*s = '\0';
299
return buffer;
300
}
301
#endif
302
303
int check_mode_lock(char *channel, char *mode_list, int server)
304
{
305
ChannelList *chan;
306
char buffer[BIG_BUFFER_SIZE+1];
307
308
if ((chan = lookup_channel(channel, server, 0)) && chan->modelock_key)
309
{
310
char *newmode;
311
char *modelock = NULL;
312
char *new_mode_list = NULL;
313
char *save, *save1;
314
char *args = NULL, *args1 = NULL;
315
int add = 0;
316
memset(buffer, 0, sizeof(buffer));
317
318
319
malloc_strcpy(&modelock, chan->modelock_key);
320
malloc_strcpy(&new_mode_list, mode_list);
321
save1 = new_mode_list;
322
save = modelock;
323
new_mode_list = next_arg(new_mode_list, &args1);
324
modelock = next_arg(modelock, &args);
325
326
while (*modelock)
327
{
328
newmode = strchr(mode_list, *modelock);
329
switch(*modelock)
330
{
331
case '+':
332
add = 1;
333
break;
334
case '-':
335
add = 0;
336
break;
337
case 'k':
338
if (newmode)
339
{
340
if (add)
341
{
342
char *key;
343
key = next_arg(args1, &args1);
344
if (chan->key)
345
{
346
strcat(buffer, "-k " );
347
strcat(buffer, chan->key);
348
}
349
key = next_arg(args, &args);
350
if (key)
351
{
352
strcat(buffer, " +k ");
353
strcat(buffer, key);
354
strcat(buffer, space);
355
}
356
}
357
else
358
{
359
if (!chan->key)
360
break;
361
strcat(buffer, "-k ");
362
strcat(buffer, chan->key);
363
}
364
strcat(buffer, space);
365
}
366
break;
367
case 'l':
368
if (newmode)
369
{
370
if (add)
371
{
372
int limit = 0;
373
if (args && *args)
374
limit = strtoul(args, &args, 10);
375
if (limit > 0)
376
{
377
strcat(buffer, "+l ");
378
strcat(buffer, ltoa(limit));
379
strcat(buffer, space);
380
}
381
}
382
else
383
{
384
chan->limit = 0;
385
strcat(buffer, "-l");
386
}
387
}
388
break;
389
default:
390
if (newmode)
391
{
392
if (add)
393
{
394
strcat(buffer, "+");
395
}
396
else
397
{
398
strcat(buffer, "-");
399
}
400
buffer[strlen(buffer)] = *modelock;
401
strcat(buffer, space);
402
}
403
break;
404
}
405
modelock++;
406
}
407
if (chan && chan->have_op && buffer)
408
send_to_server("MODE %s %s", chan->channel, buffer);
409
new_free(&save);
410
new_free(&save1);
411
return 1;
412
}
413
return 0;
414
}
415
416
BUILT_IN_COMMAND(mode_lock)
417
{
418
ChannelList *chan;
419
int i = 0;
420
char *channel = NULL;
421
u_long mode = 0;
422
int value = 0;
423
424
char *t = NULL;
425
char *key = NULL;
426
427
428
if (command && *command && !strcmp(command, "ModeLock"))
429
{
430
if (!args || !*args)
431
return;
432
t = next_arg(args, &args);
433
if (is_channel(t))
434
{
435
channel = t;
436
t = next_arg(args, &args);
437
} else
438
channel = get_current_channel_by_refnum(0);
439
if (!t || !*t)
440
{
441
bitchsay("No Mode Specified");
442
return;
443
}
444
if ((chan = lookup_channel(channel, from_server, 0)))
445
{
446
char valid_mode[BIG_BUFFER_SIZE + 1];
447
char *buffer = NULL;
448
int limit = -1;
449
int add = 0;
450
memset(valid_mode, 0, sizeof(valid_mode));
451
while (*t && i < BIG_BUFFER_SIZE)
452
{
453
switch(*t)
454
{
455
case '+':
456
add = 1;
457
valid_mode[i++] = '+';
458
break;
459
case '-':
460
add = 0;
461
valid_mode[i++] = '-';
462
break;
463
case 'm':
464
value = MODE_MODERATED;
465
valid_mode[i++] = *t;
466
break;
467
case 'a':
468
value = MODE_ANONYMOUS;
469
valid_mode[i++] = *t;
470
break;
471
case 'i':
472
value = MODE_INVITE;
473
valid_mode[i++] = *t;
474
break;
475
case 'n':
476
value = MODE_MSGS;
477
valid_mode[i++] = *t;
478
break;
479
case 's':
480
value = MODE_SECRET;
481
valid_mode[i++] = *t;
482
break;
483
case 't':
484
value = MODE_TOPIC;
485
valid_mode[i++] = *t;
486
break;
487
case 'p':
488
value = MODE_PRIVATE;
489
valid_mode[i++] = *t;
490
break;
491
case 'k':
492
value = MODE_KEY;
493
valid_mode[i++] = *t;
494
if (add)
495
key = next_arg(args, &args);
496
else
497
key = NULL;
498
break;
499
500
case 'l':
501
valid_mode[i++] = *t;
502
value = MODE_LIMIT;
503
if (add)
504
{
505
if (args && *args)
506
limit = strtoul(args, &args, 10);
507
}
508
else
509
limit = 0;
510
break;
511
default:
512
break;
513
}
514
if (add)
515
mode |= value;
516
else
517
mode &= ~value;
518
519
t++;
520
}
521
chan->modelock_val = mode;
522
malloc_strcpy(&buffer, valid_mode);
523
if (key && *key)
524
{
525
malloc_strcat(&buffer, space);
526
malloc_strcat(&buffer, key);
527
}
528
if (limit > 0)
529
{
530
malloc_strcat(&buffer, space);
531
malloc_strcat(&buffer, ltoa(limit));
532
}
533
if (*buffer)
534
{
535
malloc_strcpy(&chan->modelock_key, buffer);
536
bitchsay("%s Mode Locked at: [%s] %s", chan->channel, buffer, (chan->limit > 0) ? "Users":empty_string);
537
} else
538
bitchsay("Invalid Mode for [%s]", chan->channel);
539
} else
540
bitchsay("No Such Channel");
541
}
542
else if (command && *command && !my_stricmp(command, "ClearLock"))
543
{
544
545
if (!args || !*args)
546
return;
547
t = next_arg(args, &args);
548
if (t && *t && *t != '*')
549
{
550
if ((chan = lookup_channel(t, from_server, 0)))
551
{
552
new_free(&chan->modelock_key);
553
chan->modelock_val = 0;
554
bitchsay("Cleared %s Mode Lock", chan->channel);
555
} else
556
bitchsay("No such Channel [%s]", t);
557
}
558
else if (t && *t && *t == '*')
559
{
560
for (chan = get_server_channels(from_server); chan; chan = chan->next)
561
{
562
new_free(&chan->modelock_key);
563
chan->modelock_val = 0;
564
}
565
bitchsay("Cleared All Channel Mode Locks");
566
}
567
}
568
else
569
{
570
for (i = 0; i < server_list_size(); i++ )
571
{
572
for (chan = get_server_channels(from_server); chan; chan = chan->next)
573
bitchsay("Lock on %s: %s", chan->channel, chan->modelock_key ? chan->modelock_key : "none");
574
}
575
}
576
}
577
578
BUILT_IN_COMMAND(randomnick)
579
{
580
char *prefix = NULL, *p;
581
int count = 1;
582
int len = 0;
583
584
585
while ((p = next_arg(args, &args)))
586
{
587
if (isdigit((unsigned char)*p))
588
count = atol(p);
589
else
590
prefix = p;
591
}
592
if (prefix && (len = strlen(prefix)))
593
{
594
if (len > 5)
595
*(prefix + 6) = 0;
596
}
597
while (count > 0)
598
{
599
send_to_server("NICK %s%s", prefix?prefix:empty_string, random_str(3,9-len));
600
count--;
601
}
602
}
603
604
BUILT_IN_COMMAND(topic_lock)
605
{
606
ChannelList *chan;
607
char *t, *channel;
608
609
610
if (!args || !*args)
611
return;
612
t = next_arg(args, &args);
613
if (args && *args)
614
{
615
channel = make_channel(t);
616
if (!channel || !is_channel(channel))
617
return;
618
t = next_arg(args, &args);
619
} else
620
channel = get_current_channel_by_refnum(0);
621
622
if ((chan = lookup_channel(channel, from_server, 0)))
623
{
624
if (t && *t && !my_stricmp(t, "ON"))
625
{
626
chan->topic_lock = 1;
627
}
628
else if (t && *t && !my_strnicmp(t, "OF", 2))
629
chan->topic_lock = 0;
630
bitchsay("Topic lock for [%s] - %s", chan->channel, on_off(chan->topic_lock));
631
}
632
}
633
634
BUILT_IN_COMMAND(sping)
635
{
636
char *sname;
637
638
if (!args || !*args)
639
{
640
Sping *tmp;
641
int count = 0;
642
tmp = get_server_sping(from_server, NULL);
643
for ( ;tmp; tmp = tmp->next)
644
{
645
if (!count)
646
say("Waiting Sping");
647
say("%d\t%s", ++count, tmp->sname);
648
}
649
return;
650
}
651
else if (!my_strnicmp(args, "-CLEAR", 3))
652
clear_server_sping(from_server, NULL);
653
else
654
{
655
Sping *tmp;
656
reset_display_target();
657
bitchsay("Sent server ping to [\002%s\002]", args);
658
while ((sname = next_arg(args, &args)))
659
{
660
if (*sname == '.')
661
if (!(sname = get_server_itsname(from_server)))
662
sname = get_server_name(from_server);
663
if (!wild_match("*.*", sname))
664
{
665
bitchsay("%s is not a server", sname);
666
continue;
667
}
668
tmp = new_malloc(sizeof(Sping));
669
tmp->sname = m_strdup(sname);
670
#ifdef HAVE_GETTIMEOFDAY
671
gettimeofday(&tmp->in_sping, NULL);
672
set_server_sping(from_server, tmp);
673
#else
674
tmp->in_sping = now;
675
set_server_sping(from_server, tmp);
676
#endif
677
if (!my_stricmp(sname, get_server_name(from_server)) || !my_stricmp(sname, get_server_itsname(from_server)))
678
#ifdef HAVE_GETTIMEOFDAY
679
send_to_server("PING LAG%ld.%ld :%s", tmp->in_sping.tv_sec, tmp->in_sping.tv_usec, sname);
680
#else
681
send_to_server("PING LAG%ld :%s", now, sname);
682
#endif
683
else
684
send_to_server("PING %s :%s",
685
get_server_itsname(from_server) ?
686
get_server_itsname(from_server) :
687
get_server_name(from_server), sname);
688
}
689
690
}
691
#if 0
692
#ifdef HAVE_GETTIMEOFDAY
693
struct timeval in_sping = {0};
694
#endif
695
if (!servern || !*servern)
696
if (!(servern = get_server_itsname(from_server)))
697
servern = get_server_name(from_server);
698
699
if (servern && *servern && wild_match("*.*", servern))
700
{
701
#ifdef HAVE_GETTIMEOFDAY
702
gettimeofday(&in_sping, NULL);
703
send_to_server("PING LAG%ld.%ld :%s", in_sping.tv_sec, in_sping.tv_usec, servern);
704
#else
705
send_to_server("PING LAG%ld :%s", now, servern);
706
#endif
707
}
708
else
709
{
710
#ifdef HAVE_GETTIMEOFDAY
711
gettimeofday(&in_sping, NULL);
712
set_server_sping(from_server, in_sping);
713
#else
714
set_server_sping(from_server, now);
715
#endif
716
send_to_server("PING %s :%s", get_server_itsname(from_server), servern);
717
}
718
}
719
#endif
720
}
721
722
BUILT_IN_COMMAND(tog_fprot)
723
{
724
static int here = 0;
725
726
727
if (args && *args)
728
{
729
if (!my_stricmp(args, "ON"))
730
here = 0;
731
else if (!my_stricmp(args, "OFF"))
732
here = 1;
733
else
734
return;
735
}
736
737
if (here)
738
{
739
set_int_var(CTCP_FLOOD_PROTECTION_VAR, 0);
740
set_int_var(FLOOD_PROTECTION_VAR, 0);
741
here = 0;
742
} else
743
{
744
set_int_var(CTCP_FLOOD_PROTECTION_VAR, 1);
745
set_int_var(FLOOD_PROTECTION_VAR, 1);
746
here = 1;
747
}
748
bitchsay("Toggled flood protection - [%s]", on_off(here));
749
}
750
751
BUILT_IN_COMMAND(do_toggle)
752
{
753
#ifndef BITCHX_LITE
754
if (!args || !*args)
755
{
756
#ifdef ONLY_STD_CHARS
757
758
put_it("%s", convert_output_format("%G-----------%K[ %WBitchX %wToggles %K]%G----------------------------------------------", NULL));
759
put_it("%s", convert_output_format("%G| %Cauto_ns%clookup %K[%W$[-3]0%K] %Cctcp_f%clood_protection %K[%W$[-3]1%K] %Cbeep%c %K[%W$[-3]2%K]", "%s %s %s", on_off(get_int_var(AUTO_NSLOOKUP_VAR)), on_off(get_int_var(CTCP_FLOOD_PROTECTION_VAR)), on_off(get_int_var(BEEP_VAR))));
760
put_it("%s", convert_output_format("%G| %Cpub%cflood %K[%W$[-3]0%K] %Cflood_p%crotection %K[%W$[-3]1%K] %Ckickf%clood %K[%W$[-3]2%K]", "%s %s %s", on_off(get_int_var(PUBFLOOD_VAR)), on_off(get_int_var(FLOOD_PROTECTION_VAR)), on_off(get_int_var(KICKFLOOD_VAR))));
761
put_it("%s", convert_output_format("%G| %Cdcc_a%cutoget %K[%W$[-3]0%K] %Cflood_k%cick %K[%W$[-3]1%K] %Cmsg%clog %K[%W$[-3]2%K]", "%s %s %s", on_off(get_int_var(DCC_AUTOGET_VAR)), on_off(get_int_var(FLOOD_KICK_VAR)), on_off(get_int_var(MSGLOG_VAR))));
762
put_it("%s", convert_output_format("%G| %Cll%cook %K[%W$[-3]0%K] %Cdeop%cflood %K[%W$[-3]1%K] %Cjoin%cflood %K[%W$[-3]2%K]", "%s %s %s", on_off(get_int_var(LLOOK_VAR)), on_off(get_int_var(DEOPFLOOD_VAR)), on_off(get_int_var(JOINFLOOD_VAR))));
763
put_it("%s", convert_output_format("%G| %Cauto_w%chowas %K[%W$[-3]0%K] %Cverb%cose_ctcp %K[%W$[-3]1%K] %Cnickfl%cood %K[%W$[-3]2%K]", "%s %s %s", on_off(get_int_var(AUTO_WHOWAS_VAR)), on_off(get_int_var(CTCP_VERBOSE_VAR)), on_off(get_int_var(NICKFLOOD_VAR))));
764
put_it("%s", convert_output_format("%G| %Ccl%coak %K[%W$[-3]0%K] %Coper%cview %K[%W$[-3]1%K] %Cshit%clist %K[%W$[-3]2%K]", "%s %s %s", on_off(get_int_var(CLOAK_VAR)), on_off(get_int_var(OV_VAR)), on_off(get_int_var(SHITLIST_VAR))));
765
put_it("%s", convert_output_format("%G| %Ckick_o%cps %K[%W$[-3]0%K] %Cannoy%c_kick %K[%W$[-3]1%K] %Cuser%clist %K[%W$[-3]2%K]", "%s %s %s", on_off(get_int_var(KICK_OPS_VAR)), on_off(get_int_var(ANNOY_KICK_VAR)), on_off(get_int_var(USERLIST_VAR))));
766
put_it("%s", convert_output_format("%G| %Chack%cing %K[%W$[-3]0%K] %Cnick_c%completion %K[%W$[-3]1%K] %Cauto_r%cejoin %K[%W$[-3]2%K]","%s %s %s", on_off(get_int_var(HACKING_VAR)),on_off(get_int_var(NICK_COMPLETION_VAR)), on_off((get_int_var(AUTO_REJOIN_VAR)?1:0)) ));
767
put_it("%s", convert_output_format("%K| %Caop %K[%W$[-3]0%K] %Cauto_aw%cay %K[%W$[-3]1%K] %Cauto_rec%conn %K[%W$[-3]2%K]", "%s %s %s", on_off((get_int_var(AOP_VAR))),on_off((get_int_var(AUTO_AWAY_VAR))), on_off(get_int_var(AUTO_RECONNECT_VAR))));
768
put_it("%s", convert_output_format("%K| %Cbitch %K[%W$[-3]0%K] %Cdcc_f%cast %K[%W$[-3]1%K] %Ckick_if_ban %K[%W$[-3]2%K]", "%s %s %s", on_off((get_int_var(BITCH_VAR))),on_off((get_int_var(DCC_FAST_VAR))), on_off(get_int_var(KICK_IF_BANNED_VAR))));
769
put_it("%s", convert_output_format("%g| %Cftp_g%crab %K[%W$[-3]0%K] %Cmircs %K[%W$[-3]1%K] %Chttp%c_grab %K[%W$[-3]2%K]", "%s %s", on_off((get_int_var(FTP_GRAB_VAR))),on_off((get_int_var(MIRCS_VAR))),on_off((get_int_var(HTTP_GRAB_VAR))) ));
770
put_it("%s", convert_output_format("%G| %Cdisp%clay_ansi %K[%W$[-3]0%K] %Wtype /toggle <setting> %Clog %K[%W$[-3]1%K]", "%s %s", on_off((get_int_var(DISPLAY_ANSI_VAR))),on_off((get_int_var(LOG_VAR))) ));
771
772
#else
773
774
put_it("%s", convert_output_format("%G������---%g�%G-%K[ %WBitchX %wToggles %K]-%g��%G-%g������---%K�%g--%K��%g-%K���������--- -- - --- -- -", NULL));
775
put_it("%s", convert_output_format("%G� %Cauto_ns%clookup %K[%W$[-3]0%K] %Cctcp_f%clood_protection %K[%W$[-3]1%K] %Cbeep%c %K[%W$[-3]2%K]", "%s %s %s", on_off(get_int_var(AUTO_NSLOOKUP_VAR)), on_off(get_int_var(CTCP_FLOOD_PROTECTION_VAR)), on_off(get_int_var(BEEP_VAR))));
776
put_it("%s", convert_output_format("%G� %Cpub%cflood %K[%W$[-3]0%K] %Cflood_p%crotection %K[%W$[-3]1%K] %Ckickf%clood %K[%W$[-3]2%K]", "%s %s %s", on_off(get_int_var(PUBFLOOD_VAR)), on_off(get_int_var(FLOOD_PROTECTION_VAR)), on_off(get_int_var(KICKFLOOD_VAR))));
777
put_it("%s", convert_output_format("%g� %Cdcc_a%cutoget %K[%W$[-3]0%K] %Cflood_k%cick %K[%W$[-3]1%K] %Cmsg%clog %K[%W$[-3]2%K]", "%s %s %s", on_off(get_int_var(DCC_AUTOGET_VAR)), on_off(get_int_var(FLOOD_KICK_VAR)), on_off(get_int_var(MSGLOG_VAR))));
778
put_it("%s", convert_output_format("%G� %Cll%cook %K[%W$[-3]0%K] %Cdeop%cflood %K[%W$[-3]1%K] %Cjoin%cflood %K[%W$[-3]2%K]", "%s %s %s", on_off(get_int_var(LLOOK_VAR)), on_off(get_int_var(DEOPFLOOD_VAR)), on_off(get_int_var(JOINFLOOD_VAR))));
779
put_it("%s", convert_output_format("%g| %Cauto_w%chowas %K[%W$[-3]0%K] %Cverb%cose_ctcp %K[%W$[-3]1%K] %Cnickfl%cood %K[%W$[-3]2%K]", "%s %s %s", on_off(get_int_var(AUTO_WHOWAS_VAR)), on_off(get_int_var(CTCP_VERBOSE_VAR)), on_off(get_int_var(NICKFLOOD_VAR))));
780
put_it("%s", convert_output_format("%G: %Ccl%coak %K[%W$[-3]0%K] %Coper%cview %K[%W$[-3]1%K] %Cshit%clist %K[%W$[-3]2%K]", "%s %s %s", on_off(get_int_var(CLOAK_VAR)), on_off(get_int_var(OV_VAR)), on_off(get_int_var(SHITLIST_VAR))));
781
put_it("%s", convert_output_format("%G: %Ckick_o%cps %K[%W$[-3]0%K] %Cannoy%c_kick %K[%W$[-3]1%K] %Cuser%clist %K[%W$[-3]2%K]", "%s %s %s", on_off(get_int_var(KICK_OPS_VAR)), on_off(get_int_var(ANNOY_KICK_VAR)), on_off(get_int_var(USERLIST_VAR))));
782
put_it("%s", convert_output_format("%K| %Chack%cing %K[%W$[-3]0%K] %Cnick_c%completion %K[%W$[-3]1%K] %Cauto_rej%coin %K[%W$[-3]2%K]", "%s %s %s", on_off(get_int_var(HACKING_VAR)),on_off(get_int_var(NICK_COMPLETION_VAR)), on_off((get_int_var(AUTO_REJOIN_VAR)?1:0)) ));
783
put_it("%s", convert_output_format("%K: %Caop %K[%W$[-3]0%K] %Cauto_aw%cay %K[%W$[-3]1%K] %Cauto_rec%conn %K[%W$[-3]2%K]", "%s %s %s", on_off((get_int_var(AOP_VAR)?1:0)),on_off((get_int_var(AUTO_AWAY_VAR))), on_off(get_int_var(AUTO_RECONNECT_VAR))));
784
put_it("%s", convert_output_format("%K: %Cbitch %K[%W$[-3]0%K] %Cdcc_f%cast %K[%W$[-3]1%K] %Ckick_if_ban %K[%W$[-3]2%K]", "%s %s %s", on_off((get_int_var(BITCH_VAR))),on_off((get_int_var(DCC_FAST_VAR))), on_off(get_int_var(KICK_IF_BANNED_VAR))));
785
put_it("%s", convert_output_format("%g: %Cftp_g%crab %K[%W$[-3]0%K] %Cmircs %K[%W$[-3]1%K] %Chttp%c_grab %K[%W$[-3]2%K]", "%s %s %s", on_off((get_int_var(FTP_GRAB_VAR))),on_off((get_int_var(MIRCS_VAR))),on_off((get_int_var(HTTP_GRAB_VAR))) ));
786
put_it("%s", convert_output_format("%K: %Cdisp%clay_ansi %K[%W$[-3]0%K] %Ctimestamp %K[%W$[-3]1%K] %Clog %K[%W$[-3]2%K]", "%s %s %s", on_off((get_int_var(DISPLAY_ANSI_VAR))),on_off((get_int_var(TIMESTAMP_VAR))), on_off((get_int_var(LOG_VAR))) ));
787
put_it("%s", convert_output_format("%K: %Wtype /toggle <setting> ", NULL));
788
789
#endif
790
}
791
else
792
{
793
char *arg;
794
while ((arg = next_arg(args, &args)))
795
{
796
int var = -1;
797
char *str = NULL;
798
upper(arg);
799
800
if (!my_strnicmp(arg, "auto_nslookup", 7))
801
{
802
var = AUTO_NSLOOKUP_VAR;
803
str = "$G %cToggled %GAuto-NSlookup %K[%W$[-3]0%K]";
804
} else if (!my_strnicmp(arg, "pubflood", 3))
805
{
806
var = PUBFLOOD_VAR;
807
str = "$G %cToggled %GPub Flood %K[%W$[-3]0%K]";
808
} else if (!my_strnicmp(arg, "dcc_autoget", 5))
809
{
810
var = DCC_AUTOGET_VAR;
811
str = "$G %cToggled %GDCC Auto Get %K[%W$[-3]0%K]";
812
} else if (!my_strnicmp(arg, "llook", 2))
813
{
814
var = LLOOK_VAR;
815
str = "$G %cToggled %GLink Look %K[%W$[-3]0%K]";
816
} else if (!my_strnicmp(arg, "auto_whowas", 6))
817
{
818
var = AUTO_WHOWAS_VAR;
819
str = "$G %cToggled %GAuto-WhoWas %K[%W$[-3]0%K]";
820
} else if (!my_strnicmp(arg, "cloak", 2))
821
{
822
var = CLOAK_VAR;
823
str = "$G %cToggled %GCloaking %K[%W$[-3]0%K]";
824
} else if (!my_strnicmp(arg, "kick_ops", 6))
825
{
826
var = KICK_OPS_VAR;
827
str = "$G %cToggled %GKick Ops %K[%W$[-3]0%K]";
828
} else if (!my_strnicmp(arg, "ctcp_flood_protection", 6))
829
{
830
var = CTCP_FLOOD_PROTECTION_VAR;
831
str = "$G %cToggled %GCtcp Flood Protection %K[%W$[-3]0%K]","%s";
832
} else if (!my_strnicmp(arg, "flood_protection",7))
833
{
834
var = FLOOD_PROTECTION_VAR;
835
str = "$G %cToggled %GFlood Protection %K[%W$[-3]0%K]";
836
} else if (!my_strnicmp(arg, "flood_kick", 7))
837
{
838
var = FLOOD_KICK_VAR;
839
str = "$G %cToggled %GFlood Kicks %K[%W$[-3]0%K]";
840
} else if (!my_strnicmp(arg, "deopflood",4))
841
{
842
var = DEOPFLOOD_VAR;
843
str = "$G %cToggled %GDeOp Flood %K[%W$[-3]0%K]";
844
} else if (!my_strnicmp(arg, "verbose_ctcp",4))
845
{
846
var = CTCP_VERBOSE_VAR;
847
str = "$G %cToggled %GVerbose CTCP %K[%W$[-3]0%K]";
848
} else if (!my_strnicmp(arg, "operview", 4))
849
{
850
int ov_mode = get_int_var(OV_VAR);
851
var = OV_VAR;
852
setup_ov_mode(ov_mode, 0, current_window->log);
853
str = "$G %cToggled %GOper View %K[%W$[-3]0%K]";
854
} else if (!my_strnicmp(arg, "annoy_kick",4))
855
{
856
var = ANNOY_KICK_VAR;
857
str = "$G %cToggled %GAnnoy Kicks %K[%W$[-3]0%K]";
858
} else if (!my_strnicmp(arg, "beep",4))
859
{
860
var = BEEP_VAR;
861
str = "$G %cToggled %GBeep %K[%W$[-3]0%K]";
862
863
} else if (!my_strnicmp(arg, "kickflood",5))
864
{
865
var = KICKFLOOD_VAR;
866
str = "$G %cToggled %GKick Flood %K[%W$[-3]0%K]","%s";
867
} else if (!my_strnicmp(arg, "msglog", 3))
868
{
869
var = MSGLOG_VAR;
870
str = "$G %cToggled %GMSG log %K[%W$[-3]0%K]";
871
} else if (!my_strnicmp(arg, "joinflood", 4))
872
{
873
var = JOINFLOOD_VAR;
874
str = "$G %cToggled %GJoin Flood %K[%W$[-3]0%K]";
875
} else if (!my_strnicmp(arg, "nickflood", 6))
876
{
877
var = NICKFLOOD_VAR;
878
str = "$G %cToggled %GNick Flood %K[%W$[-3]0%K]";
879
} else if (!my_strnicmp(arg, "shitlist", 4))
880
{
881
var = SHITLIST_VAR;
882
str = "$G %cToggled %GShitList %K[%W$[-3]0%K]";
883
} else if (!my_strnicmp(arg, "userlist", 4))
884
{
885
var = USERLIST_VAR;
886
str = "$G %cToggled %GUserList %K[%W$[-3]0%K]";
887
} else if (!my_strnicmp(arg, "hacking", 4))
888
{
889
var = HACKING_VAR;
890
str = "$G %cToggled %GHacking %K[%W$[-3]0%K]";
891
} else if (!my_strnicmp(arg, "auto_rejoin", 8))
892
{
893
var = AUTO_REJOIN_VAR;
894
str = "$G %cToggled %GAuto_Rejoin %K[%W$[-3]0%K]","%s";
895
} else if (!my_strnicmp(arg, "nick_completion", 6))
896
{
897
var = NICK_COMPLETION_VAR;
898
str = "$G %cToggled %GNick Completion %K[%W$[-3]0%K]","%s";
899
} else if (!my_strnicmp(arg, "aop", 3))
900
{
901
var = AOP_VAR;
902
str = "$G %cToggled %GAOP %K[%W$[-3]0%K]";
903
} else if (!my_strnicmp(arg, "auto_away", 7))
904
{
905
var = AUTO_AWAY_VAR;
906
str = "$G %cToggled %GAuto Away %K[%W$[-3]0%K]";
907
} else if (!my_strnicmp(arg, "auto_reconnect", 8))
908
{
909
var = AUTO_RECONNECT_VAR;
910
str = "$G %cToggled %GAuto Reconnect %K[%W$[-3]0%K]";
911
} else if (!my_strnicmp(arg, "mircs", 5))
912
{
913
var = MIRCS_VAR;
914
str = "$G %cToggled %GmIRC Color %K[%W$[-3]0%K]";
915
} else if (!my_strnicmp(arg, "bitch", 5))
916
{
917
var = BITCH_VAR;
918
str = "$G %cToggled %GBitch %K[%W$[-3]0%K]";
919
} else if (!my_strnicmp(arg, "dcc_fast", 5))
920
{
921
var = DCC_FAST_VAR;
922
str = "$G %cToggled %GDCC fast %K[%W$[-3]0%K]";
923
} else if (!my_strnicmp(arg, "kick_if_banned", 5))
924
{
925
var = KICK_IF_BANNED_VAR;
926
str = "$G %cToggled %GKick banned Users %K[%W$[-3]0%K]";
927
} else if (!my_strnicmp(arg, "ftp_grab", 5))
928
{
929
var = FTP_GRAB_VAR;
930
str = "$G %cToggled %GFTP grab %K[%W$[-3]0%K]";
931
} else if (!my_strnicmp(arg, "timestamp", 3))
932
{
933
var = TIMESTAMP_VAR;
934
str = "$G %cToggled %GTimestamps %K[%W$[-3]0%K]";
935
} else if (!my_strnicmp(arg, "http_grab", 4))
936
{
937
var = HTTP_GRAB_VAR;
938
str = "$G %cToggled %GHTTP grab %K[%W$[-3]0%K]";
939
} else if (!my_strnicmp(arg, "display_ansi", 4))
940
{
941
set_int_var(DISPLAY_ANSI_VAR, get_int_var(DISPLAY_ANSI_VAR)?0:1);
942
toggle_reverse_status(current_window, NULL, get_int_var(DISPLAY_ANSI_VAR));
943
if (do_hook(SET_LIST, "%s %s", arg, on_off(get_int_var(DISPLAY_ANSI_VAR))))
944
put_it("%s", convert_output_format("$G %cToggled %GAnsi Display %K[%W$[-3]0%K]", "%s", on_off(get_int_var(DISPLAY_ANSI_VAR)) ));
945
set_input_prompt(current_window, empty_string, 0);
946
set_input_prompt(current_window, get_string_var(INPUT_PROMPT_VAR), 0);
947
status_update(1);
948
continue;
949
} else if (!my_strnicmp(arg, "log", 3))
950
{
951
int old_window_display = window_display;
952
var = LOG_VAR;
953
str = "$G %cToggled %GLogging %K[%W$[-3]0%K]";
954
window_display = 0;
955
logger(current_window, NULL, get_int_var(LOG_VAR)?0:1);
956
window_display = old_window_display;
957
}
958
if (var != -1)
959
set_int_var(var, get_int_var(var)?0:1);
960
if (str)
961
{
962
if (do_hook(SET_LIST, "%s %s", arg, on_off(get_int_var(var))))
963
put_it("%s", convert_output_format(str, "%s", on_off(get_int_var(var)) ));
964
}
965
if (var == -1)
966
bitchsay("Unknown /toggle [%s]", arg);
967
}
968
}
969
#endif
970
}
971
972
973
BUILT_IN_COMMAND(show_version)
974
{
975
char *nick;
976
char *version_buf = NULL;
977
extern char tcl_versionstr[];
978
979
#ifdef HAVE_UNAME
980
struct utsname buf;
981
982
uname(&buf);
983
malloc_strcpy(&version_buf, stripansicodes(convert_output_format(fget_string_var(FORMAT_VERSION_FSET), "%s %s %s %s %s", irc_version, internal_version, buf.sysname, buf.release?buf.release:empty_string, tcl_versionstr)));
984
#else
985
malloc_strcpy(&version_buf, stripansicodes(convert_output_format(fget_string_var(FORMAT_VERSION_FSET), "%s %s %s %s %s", irc_version, internal_version, "unknown", tcl_versionstr, empty_string)));
986
#endif
987
if (args && *args)
988
nick = next_arg(args, &args);
989
else
990
nick = get_current_channel_by_refnum(0);
991
send_text(nick, version_buf, "PRIVMSG", 1, 0);
992
new_free(&version_buf);
993
}
994
995
996
997
void who_user_kill(WhoEntry *w, char *from, char **ArgList)
998
{
999
char *match_arg;
1000
char *arg = NULL;
1001
int server = 0;
1002
char *nick_arg = NULL;
1003
char *reason = NULL;
1004
1005
if (isme(ArgList[4]))
1006
return;
1007
match_arg = alloca(2000);
1008
*match_arg = 0;
1009
1010
arg = LOCAL_COPY(w->who_buff);
1011
1012
strmopencat(match_arg, 1999, "*!", ArgList[1], "@", ArgList[2], NULL);
1013
1014
server = atol(next_arg(arg, &arg));
1015
nick_arg = next_arg(arg, &arg);
1016
1017
if (wild_match(nick_arg, match_arg))
1018
{
1019
char *t_arg, *t_nick;
1020
t_arg = alloca(2000);
1021
*t_arg = 0;
1022
if ((reason = strchr(arg, ':')))
1023
*reason++ = 0;
1024
t_nick = next_arg(arg, &arg);
1025
if (t_nick && *t_nick)
1026
strmopencat(t_arg, 1999, t_nick, ",", ArgList[4],"!", ArgList[1],"@", ArgList[2], NULL);
1027
else
1028
strmopencat(t_arg, 1999, ArgList[4], "!", ArgList[1],"@", ArgList[2], NULL);
1029
malloc_sprintf(&w->who_buff, "%d %s %s :%s", server, nick_arg, t_arg, reason);
1030
}
1031
}
1032
1033
void who_user_killend(WhoEntry *w, char *unused, char **unused1)
1034
{
1035
char *pattern, *match, *who_buff, *reason;
1036
int server = -1;
1037
1038
if (w->who_buff)
1039
{
1040
who_buff = LOCAL_COPY(w->who_buff);
1041
reason = strchr(who_buff, ':');
1042
*reason++ = 0;
1043
server = atol(next_arg(who_buff, &who_buff));
1044
pattern = next_arg(who_buff, &who_buff);
1045
match = next_arg(who_buff, &who_buff);
1046
if (match && *match && server != -1)
1047
{
1048
char *m_buff, *nick, *uh;
1049
char *buffer = NULL;
1050
char *save_buffer = NULL;
1051
int num = 0, count = 0;
1052
m_buff = alloca(strlen(match)+1);
1053
strcpy(m_buff, match);
1054
bitchsay("Killing all matching %s.", pattern);
1055
while ((nick = next_in_comma_list(m_buff, &m_buff)))
1056
{
1057
if (!nick || !*nick)
1058
break;
1059
m_s3cat(&save_buffer, space, nick);
1060
uh = strchr(nick, '!');
1061
*uh++ = 0;
1062
num++;
1063
count++;
1064
m_s3cat(&buffer, ",", nick);
1065
if (num >= get_int_var(NUM_KILLS_VAR))
1066
{
1067
bitchsay("Killing %s :%s[%d]", save_buffer, reason, count);
1068
my_send_to_server(server, "KILL %s :%s(%d)", buffer, reason, count);
1069
new_free(&buffer);
1070
num = 0;
1071
}
1072
}
1073
if (buffer)
1074
{
1075
bitchsay("Killing %s %s[%d]", save_buffer, reason, count);
1076
my_send_to_server(server, "KILL %s :%s(%d)", buffer, reason, count);
1077
}
1078
new_free(&save_buffer);
1079
new_free(&buffer);
1080
}
1081
else
1082
bitchsay("None Matching for /whokill or no longer connected");
1083
}
1084
}
1085
1086
BUILT_IN_COMMAND(whokill)
1087
{
1088
char *pattern;
1089
char *p = NULL;
1090
char *reason = NULL;
1091
char *nick_arg = NULL;
1092
1093
if (!args || !*args)
1094
return;
1095
if ((reason = strchr(args, ':')))
1096
*reason++ = 0;
1097
else
1098
reason = get_reason(empty_string, NULL);
1099
1100
while ((pattern = next_arg(args, &args)))
1101
{
1102
malloc_sprintf(&nick_arg, "%s%s%s", *pattern != '*'?"*":empty_string, pattern, *(pattern+strlen(pattern)-1) != '*'?"*":empty_string);
1103
if ((p = strchr(nick_arg, '@')))
1104
p++;
1105
whobase(p ? p : nick_arg, who_user_kill, who_user_killend, "%d %s :%s", from_server, nick_arg, (reason && *reason) ? reason : empty_string);
1106
new_free(&nick_arg);
1107
}
1108
}
1109
1110
static char *tnick_arg = NULL;
1111
static char *treason = NULL;
1112
1113
void trace_handlekill(int comm, char *nick)
1114
{
1115
static int count = 0;
1116
1117
1118
if (!nick || !*nick)
1119
{
1120
if (comm == 262)
1121
{
1122
set_server_trace_kill(from_server, 0);
1123
return;
1124
}
1125
if (!count && get_server_trace_kill(from_server) != 2 && tnick_arg)
1126
bitchsay("No Match for trace kill of [%s]", tnick_arg);
1127
new_free(&treason);
1128
new_free(&tnick_arg);
1129
count = 0;
1130
return;
1131
}
1132
if (!my_stricmp(nick, get_server_nickname(from_server)))
1133
return;
1134
bitchsay("Killing %s[%s] %d", nick, tnick_arg, ++count);
1135
if (!treason)
1136
malloc_strcpy(&treason, get_reason(nick, NULL));
1137
send_to_server("KILL %s :%s (%d)", nick, treason, count);
1138
}
1139
1140
void handle_tracekill(int comm, char *nick, char *user, char *host)
1141
{
1142
char *q, *n;
1143
if (!nick || !*nick)
1144
{
1145
trace_handlekill(comm, NULL);
1146
return;
1147
}
1148
n = LOCAL_COPY(nick);
1149
if ((q = strchr(n, '[')))
1150
*q++ = 0;
1151
else
1152
return;
1153
chop(q, 1);
1154
if (wild_match(tnick_arg, q))
1155
{
1156
if (get_server_trace_kill(from_server) == 2)
1157
bitchsay("User: %s", nick);
1158
else
1159
{
1160
if (!my_stricmp(n, get_server_nickname(from_server)))
1161
return;
1162
trace_handlekill(comm, n);
1163
}
1164
}
1165
}
1166
1167
BUILT_IN_COMMAND(tracekill)
1168
{
1169
char *pattern;
1170
1171
1172
if (get_server_trace_kill(from_server))
1173
{
1174
bitchsay("Already in %s", command);
1175
return;
1176
}
1177
if (!(pattern = next_arg(args, &args)))
1178
return;
1179
if (args && *args)
1180
malloc_strcpy(&treason, args);
1181
else
1182
new_free(&treason);
1183
1184
malloc_sprintf(&tnick_arg, "%s%s%s", *pattern != '*'?"*":empty_string, pattern, *(pattern+strlen(pattern)-1) != '*'?"*":empty_string);
1185
1186
if (treason && *treason == '-')
1187
set_server_trace_kill(from_server, 2);
1188
else
1189
set_server_trace_kill(from_server, 1);
1190
1191
send_to_server("TRACE");
1192
}
1193
1194
BUILT_IN_COMMAND(traceserv)
1195
{
1196
char *server, *pattern;
1197
1198
1199
if (get_server_trace_kill(from_server))
1200
{
1201
bitchsay("Already in %s", command);
1202
return;
1203
}
1204
if (!(server = next_arg(args, &args)) ||
1205
!(pattern = next_arg(args, &args)))
1206
return;
1207
if (args && *args)
1208
malloc_strcpy(&treason, args);
1209
else
1210
new_free(&treason);
1211
1212
malloc_sprintf(&tnick_arg, "%s%s%s", *pattern != '*'?"*":empty_string, pattern, *(pattern+strlen(pattern)-1) != '*'?"*":empty_string);
1213
1214
if (treason && *treason == '-')
1215
set_server_trace_kill(from_server, 2);
1216
else
1217
set_server_trace_kill(from_server, 1);
1218
send_to_server("TRACE %s", server);
1219
}
1220
1221
#if 0
1222
BUILT_IN_COMMAND(ftp)
1223
{
1224
Window *window, *tmp;
1225
char name[40];
1226
char *pgm = NULL;
1227
int direct = 0;
1228
1229
1230
sprintf(name, "%%%s", command);
1231
if (command && !my_stricmp(command, "shell"))
1232
{
1233
pgm = get_string_var(SHELL_VAR);
1234
direct = 1;
1235
}
1236
else
1237
pgm = command;
1238
1239
if (!args || !*args)
1240
{
1241
if (!is_window_name_unique(name+1))
1242
{
1243
int logic = -1;
1244
if ((tmp = get_window_by_name(name+1)))
1245
{
1246
delete_window(tmp);
1247
if ((logic = logical_to_index(name+1)) > -1)
1248
kill_process(logic, 15);
1249
else bitchsay("No such process [%s]", name+1);
1250
}
1251
recalculate_windows(tmp->screen);
1252
update_all_windows();
1253
return;
1254
}
1255
}
1256
if ((tmp = new_window(current_window->screen)))
1257
{
1258
int refnum;
1259
char *p = NULL;
1260
window = tmp;
1261
if (is_window_name_unique(name+1))
1262
{
1263
malloc_strcpy(&window->name, name+1);
1264
window->update |= UPDATE_STATUS;
1265
}
1266
1267
window->screen = main_screen;
1268
set_screens_current_window(window->screen, window);
1269
recalculate_windows(tmp->screen);
1270
hide_window(window);
1271
refnum = window->refnum;
1272
1273
/* update_all_windows();*/
1274
malloc_sprintf(&p, "-NAME %s %s %s", name, pgm, args);
1275
/* start_process(p, name+1, NULL, NULL, refnum, direct);*/
1276
execcmd(NULL, p, NULL, NULL);
1277
if (is_valid_process(name))
1278
{
1279
NickList *tmp_nick = NULL;
1280
malloc_strcpy(&window->query_nick, name);
1281
tmp_nick = (NickList *)new_malloc(sizeof(NickList));
1282
malloc_strcpy(&tmp_nick->nick, name);
1283
add_to_list((List **)&window->nicks, (List *)tmp_nick);
1284
}
1285
new_free(&p);
1286
} else bitchsay("Unable to create a new window");
1287
}
1288
#endif
1289
1290
BUILT_IN_COMMAND(lkw)
1291
{
1292
delete_window(current_window);
1293
update_all_windows();
1294
}
1295
1296
BUILT_IN_COMMAND(jnw)
1297
{
1298
char *channel;
1299
int hidden = 0;
1300
1301
if ((channel = next_arg(args, &args)))
1302
{
1303
Window *tmp;
1304
if (*channel == '-' && !my_stricmp(channel, "-hide"))
1305
{
1306
if (!(channel = next_arg(args, &args)))
1307
return;
1308
hidden = 1;
1309
}
1310
if ((tmp = new_window(current_window->screen)))
1311
{
1312
int server;
1313
server = from_server;
1314
from_server = tmp->server;
1315
if (channel && (channel = make_channel(channel)))
1316
{
1317
send_to_server("JOIN %s%s%s", channel, args?space:empty_string, args?args:empty_string);
1318
malloc_strcpy(&tmp->waiting_channel, channel);
1319
}
1320
from_server = server;
1321
build_status(tmp, NULL, 0);
1322
if (hidden)
1323
hide_window(tmp);
1324
update_all_windows();
1325
}
1326
}
1327
}
1328
1329
int change_orig_nick(int server)
1330
{
1331
char *nick = get_server_orignick(server);
1332
char *curnick = get_server_nickname(server);
1333
1334
if (!nick || !curnick || !is_server_connected(server) ||
1335
is_orignick_pending(server) || !strcmp(nick, curnick))
1336
return 0;
1337
orignick_is_pending(server, 1);
1338
change_server_nickname(server, nick);
1339
bitchsay("Attempting to regain nick [%s]", nick);
1340
update_all_status(current_window, NULL, 0);
1341
update_input(UPDATE_ALL);
1342
return 1;
1343
}
1344
1345
static void gain_nick (UserhostItem *stuff, char *nick, char *args)
1346
{
1347
int gotit = 0;
1348
int server = -1;
1349
int old_serv = from_server;
1350
if (!get_server_orignick(from_server) || !is_server_connected(from_server))
1351
return;
1352
server = my_atol(args);
1353
old_serv = server;
1354
if (stuff && stuff->nick && (!strcmp(stuff->user, "<UNKNOWN>") || !strcmp(stuff->host, "<UNKNOWN>")))
1355
gotit = change_orig_nick(from_server);
1356
if (!gotit && get_int_var(ORIGNICK_TIME_VAR) > 0 && !timer_callback_exists(delay_gain_nick))
1357
add_timer(0, empty_string, get_int_var(ORIGNICK_TIME_VAR) * 1000, 1, delay_gain_nick, NULL, NULL, -1, "orignick");
1358
from_server = old_serv;
1359
}
1360
1361
static int delay_gain_nick(void *arg, char *sub)
1362
{
1363
char *nick = get_server_orignick(from_server);
1364
if (from_server == -1)
1365
nick = get_server_orignick(0);
1366
if (nick)
1367
userhostbase(nick, gain_nick, 1, "%d", from_server);
1368
arg = NULL;
1369
sub = NULL;
1370
return 0;
1371
}
1372
1373
void check_orig_nick(char *nick)
1374
{
1375
char *n = get_server_orignick(from_server);
1376
if (!nick && n)
1377
{
1378
userhostbase(n, gain_nick, 1, "%d", from_server);
1379
return;
1380
}
1381
if (n && !my_stricmp(nick, n))
1382
change_orig_nick(from_server);
1383
}
1384
1385
BUILT_IN_COMMAND(orig_nick)
1386
{
1387
char *nick;
1388
char *org_nick = get_server_orignick(from_server);
1389
if (!args || !*args || !(nick = next_arg(args, &args)))
1390
{
1391
if (org_nick)
1392
bitchsay("Attempting to gain \"%s\"", org_nick);
1393
return;
1394
}
1395
if (*nick == '-')
1396
{
1397
if (!org_nick)
1398
bitchsay("Not trying to gain a nick");
1399
else
1400
{
1401
bitchsay("Removing gain nick [%s]. Timer will expire.", org_nick);
1402
set_server_orignick(from_server, NULL);
1403
}
1404
}
1405
else
1406
{
1407
if (org_nick && !my_stricmp(nick, org_nick) && timer_callback_exists(delay_gain_nick))
1408
bitchsay("Already attempting that nick %s", nick);
1409
else if ((nick = check_nickname(nick)))
1410
{
1411
set_server_orignick(from_server, nick);
1412
userhostbase(get_server_orignick(from_server), gain_nick, 1, "%d", from_server);
1413
bitchsay("Trying to regain nick [%s] every %d seconds", get_server_orignick(from_server), get_int_var(ORIGNICK_TIME_VAR));
1414
}
1415
else
1416
bitchsay("Nickname was bad.");
1417
}
1418
}
1419
1420
BUILT_IN_COMMAND(add_bad_nick)
1421
{
1422
char *buffer = NULL;
1423
LameList *lame_nick = NULL;
1424
char *nick = NULL;
1425
extern LameList *lame_list;
1426
int add = 0;
1427
if (!args || !*args || !command)
1428
{
1429
if (!command)
1430
{
1431
int i = 0;
1432
if (!lame_list)
1433
{
1434
bitchsay("There are no nicks on your lame nick list");
1435
return;
1436
}
1437
bitchsay("Lame Nick list:");
1438
for (lame_nick = lame_list; lame_nick; lame_nick = lame_nick->next)
1439
{
1440
if (buffer)
1441
m_s3cat(&buffer, lame_nick->nick, "\t");
1442
else
1443
buffer = m_sprintf("%s\t", lame_nick->nick);
1444
i++;
1445
if (i == 6)
1446
{
1447
i = 0;
1448
put_it("%s", buffer);
1449
new_free(&buffer);
1450
}
1451
}
1452
if (buffer)
1453
put_it("%s", buffer);
1454
new_free(&buffer);
1455
}
1456
return;
1457
}
1458
add = !my_stricmp(command, "addlamenick") ? 1 : 0;
1459
bitchsay("%s %s LameNick list", add ? "Added":"Removed", add?"to":"from");
1460
while (args && *args)
1461
{
1462
nick = next_arg(args, &args);
1463
if (add && nick)
1464
{
1465
1466
lame_nick = (LameList *)new_malloc(sizeof(LameList));
1467
malloc_strcpy(&lame_nick->nick, nick);
1468
add_to_list((List **)&lame_list, (List *)lame_nick);
1469
}
1470
else if (!add && nick)
1471
{
1472
lame_nick = (LameList *)remove_from_list((List **)&lame_list, nick);
1473
if (lame_nick)
1474
{
1475
new_free(&lame_nick->nick);
1476
new_free((char **)&lame_nick);
1477
}
1478
else
1479
nick = NULL;
1480
}
1481
if (nick && *nick)
1482
{
1483
if (buffer)
1484
m_s3cat(&buffer, nick, "\t");
1485
else
1486
buffer = m_sprintf("%s\t", nick);
1487
}
1488
}
1489
if (buffer)
1490
put_it("%s", buffer);
1491
new_free(&buffer);
1492
}
1493
1494
static UrlList *url_list = NULL;
1495
1496
int grab_http(char *from, char *to, char *text)
1497
{
1498
#ifdef PUBLIC_ACCESS
1499
return 0;
1500
#else
1501
if ((get_int_var(HTTP_GRAB_VAR) && stristr(text, "HTTP:")) || (get_int_var(FTP_GRAB_VAR) && (stristr(text, "FTP:") || stristr(text, "FTP."))))
1502
{
1503
static int count = 0;
1504
int url_count = 0;
1505
char *q = NULL;
1506
UrlList *cur_url, *prev_url, *new_url;
1507
1508
malloc_sprintf(&q, "%s %s -- %s", from, to, text);
1509
1510
/* Look for end of the list, counting as we go */
1511
for (cur_url = url_list, prev_url = NULL; cur_url; prev_url = cur_url, cur_url = cur_url->next)
1512
{
1513
url_count++;
1514
/* If we find that the URL is already in the list, bail out. */
1515
if (cur_url->name && !my_stricmp(cur_url->name, q))
1516
{
1517
new_free(&q);
1518
return 0;
1519
}
1520
}
1521
1522
/* Add the new URL at the end of the list */
1523
new_url = (UrlList *) new_malloc(sizeof(UrlList));
1524
new_url->name = q;
1525
new_url->next = NULL;
1526
if (!prev_url)
1527
url_list = new_url;
1528
else
1529
prev_url->next = new_url;
1530
url_count++;
1531
count++;
1532
1533
/* Prune off any excess entries */
1534
while (url_count > get_int_var(MAX_URLS_VAR) && url_list)
1535
{
1536
UrlList *tmp = url_list;
1537
url_list = url_list->next;
1538
new_free(&tmp->name);
1539
new_free(&tmp);
1540
url_count--;
1541
}
1542
1543
if (do_hook(URLGRAB_LIST, "%d %d %s %s %s %s", url_count, count, from, FromUserHost, to, text))
1544
bitchsay("Added HTTP/FTP grab [%d/%d]", url_count, count);
1545
return 1;
1546
}
1547
return 0;
1548
#endif
1549
}
1550
1551
BUILT_IN_COMMAND(url_grabber)
1552
{
1553
#ifdef PUBLIC_ACCESS
1554
bitchsay("This command has been disabled on a public access system");
1555
return 0;
1556
#else
1557
int do_display = 1;
1558
1559
if (args && *args)
1560
{
1561
int i, q;
1562
char *p;
1563
UrlList *cur_url, *prev_url;
1564
1565
while ((p = next_arg(args, &args)))
1566
{
1567
if (!my_stricmp(p, "SAVE"))
1568
{
1569
char *filename = NULL;
1570
FILE *file;
1571
char buffer[BIG_BUFFER_SIZE+1];
1572
char *number = "*";
1573
1574
snprintf(buffer, BIG_BUFFER_SIZE, "%s/BitchX.url", get_string_var(CTOOLZ_DIR_VAR));
1575
filename = expand_twiddle(buffer);
1576
if (!filename)
1577
return;
1578
1579
file = fopen(filename, "a");
1580
if (!file)
1581
{
1582
new_free(&filename);
1583
return;
1584
}
1585
1586
if (args && *args && (isdigit((unsigned char)*args) || *args == '-'))
1587
number = next_arg(args, &args);
1588
for (i = 0, cur_url = url_list; cur_url; cur_url = cur_url->next, i++)
1589
{
1590
if (matchmcommand(number, i) && cur_url->name)
1591
fprintf(file, "%s\n", cur_url->name);
1592
}
1593
new_free(&filename);
1594
fclose(file);
1595
1596
/* Clear URL list */
1597
while (url_list)
1598
{
1599
UrlList *tmp = url_list;
1600
url_list = url_list->next;
1601
new_free(&tmp->name);
1602
new_free(&tmp);
1603
}
1604
1605
bitchsay("Url list saved");
1606
do_display = 0;
1607
}
1608
else if (!my_stricmp("HTTP", p))
1609
{
1610
int on = get_int_var(HTTP_GRAB_VAR);
1611
char *ans = next_arg(args, &args);
1612
if (ans && !my_stricmp(ans, "ON"))
1613
on = 1;
1614
else
1615
on = 0;
1616
set_int_var(HTTP_GRAB_VAR, on);
1617
}
1618
else if (!my_stricmp("FTP", p))
1619
{
1620
int on = get_int_var(FTP_GRAB_VAR);
1621
char *ans = next_arg(args, &args);
1622
if (ans && !my_stricmp(ans, "ON"))
1623
on = 1;
1624
else
1625
on = 0;
1626
set_int_var(FTP_GRAB_VAR, on);
1627
}
1628
else if (*p == '-')
1629
{
1630
if (!*++p)
1631
{
1632
while (url_list)
1633
{
1634
UrlList *tmp = url_list;
1635
url_list = url_list->next;
1636
new_free(&tmp->name);
1637
new_free(&tmp);
1638
}
1639
bitchsay("Url list cleared");
1640
}
1641
else
1642
{
1643
q = my_atol(p);
1644
for (i = 1, cur_url = url_list, prev_url = NULL; cur_url && i < q; prev_url = cur_url, cur_url = cur_url->next, i++);
1645
if (cur_url && i == q)
1646
{
1647
if (!prev_url)
1648
url_list = url_list->next;
1649
else
1650
prev_url->next = cur_url->next;
1651
new_free(&cur_url->name);
1652
new_free(&cur_url);
1653
bitchsay("Cleared Url [%d]", q);
1654
}
1655
else
1656
bitchsay("Url [%d] not found", q);
1657
}
1658
do_display = 0;
1659
}
1660
else if (!my_stricmp("LIST", p) || !my_stricmp("+", p))
1661
{
1662
if (!url_list)
1663
{
1664
bitchsay("No Urls in Url list");
1665
return;
1666
}
1667
bitchsay("Url list:");
1668
for (i = 1, cur_url = url_list; cur_url; cur_url = cur_url->next, i++)
1669
{
1670
if (!cur_url->name)
1671
break;
1672
put_it("%s", convert_output_format("$G HTTP[$0] $1-", "%d %s", i, cur_url->name));
1673
}
1674
do_display = 0;
1675
}
1676
}
1677
}
1678
if (do_display)
1679
put_it("%s", convert_output_format("$G HTTP grab %K[%W$0%K]%n FTP grab %K[%W$1%K]", "%s %s", on_off(get_int_var(HTTP_GRAB_VAR)), on_off(get_int_var(FTP_GRAB_VAR))));
1680
#endif
1681
}
1682
1683
BUILT_IN_COMMAND(serv_stat)
1684
{
1685
extern long nick_collisions, oper_kills, serv_fakes, serv_unauth, serv_split;
1686
extern long serv_rejoin, client_connects, serv_rehash, client_exits,serv_klines;
1687
extern long client_floods, client_invalid, stats_req, client_bot, client_bot_alarm;
1688
extern long oper_requests, serv_squits, serv_connects;
1689
#ifdef ONLY_STD_CHARS
1690
1691
put_it("%s", convert_output_format("%G-----------%K[ %WServer %wStats %K]%G----------------------------------------------", NULL));
1692
put_it("%s", convert_output_format("%G| %CN%cick Collisions %K[%W$[-4]0%K] %CO%cper Kills %K[%W$[-4]1%K]", "%d %d", nick_collisions, oper_kills));
1693
put_it("%s", convert_output_format("%G| %CF%cake Modes %K[%W$[-4]0%K] %CU%cnauth %K[%W$[-4]1%K]", "%d %d",serv_fakes, serv_unauth));
1694
put_it("%s", convert_output_format("%G| %CH%cigh Traffic %K[%W$[-4]0%K] %CN%corm Traffic %K[%W$[-4]1%K]", "%d %d",serv_split, serv_rejoin));
1695
put_it("%s", convert_output_format("%G| %CT%cotal Clients %K[%W$[-4]0%K] %CS%cerv rehash %K[%W$[-4]1%K]", "%d %d",client_connects, serv_rehash));
1696
put_it("%s", convert_output_format("%G| %CC%client exits %K[%W$[-4]0%K] %CK%c-lines adds %K[%W$[-4]1%K]", "%d %d",client_exits, serv_klines));
1697
put_it("%s", convert_output_format("%G| %CC%client Floods %K[%W$[-4]0%K] %CS%ctats reqs %K[%W$[-4]1%K]", "%d %d",client_floods, stats_req));
1698
put_it("%s", convert_output_format("%G| %CI%cnvalid User %K[%W$[-4]0%K] %CO%cper Reqs %K[%W$[-4]1%K]", "%d %d",client_invalid, oper_requests));
1699
put_it("%s", convert_output_format("%G| %CP%cossible Bots %K[%W$[-4]0%K] %CB%cot Alarms %K[%W$[-4]1%K]", "%d %d",client_bot, client_bot_alarm));
1700
put_it("%s", convert_output_format("%G| %CS%cerv Squits %K[%W$[-4]0%K] %CS%cerv Connect %K[%W$[-4]1%K]", "%d %d",serv_squits, serv_connects));
1701
1702
#else
1703
1704
put_it("%s", convert_output_format("%G������---%g�%G-%K[ %WServer %wStats %K]-%g��%G-%g������---%K�%g--%K��%g-%K���������--- -- - --- -- -", NULL));
1705
put_it("%s", convert_output_format("%G� %CN%cick Collisions %K[%W$[-4]0%K] %CO%cper Kills %K[%W$[-4]1%K]", "%l %l", nick_collisions, oper_kills));
1706
put_it("%s", convert_output_format("%G� %CF%cake Modes %K[%W$[-4]0%K] %CU%cnauth %K[%W$[-4]1%K]", "%l %l",serv_fakes, serv_unauth));
1707
put_it("%s", convert_output_format("%g� %CH%cigh Traffic %K[%W$[-4]0%K] %CN%corm Traffic %K[%W$[-4]1%K]", "%l %l",serv_split, serv_rejoin));
1708
put_it("%s", convert_output_format("%G� %CT%cotal Clients %K[%W$[-4]0%K] %CS%cerv rehash %K[%W$[-4]1%K]", "%l %l",client_connects, serv_rehash));
1709
put_it("%s", convert_output_format("%g| %CC%client exits %K[%W$[-4]0%K] %CK%c-lines adds %K[%W$[-4]1%K]", "%l %l",client_exits, serv_klines));
1710
put_it("%s", convert_output_format("%G: %CC%client Floods %K[%W$[-4]0%K] %CS%ctats reqs %K[%W$[-4]1%K]", "%l %l",client_floods, stats_req));
1711
put_it("%s", convert_output_format("%G: %CI%cnvalid User %K[%W$[-4]0%K] %CO%cper Reqs %K[%W$[-4]1%K]", "%l %l",client_invalid, oper_requests));
1712
put_it("%s", convert_output_format("%K| %CP%cossible Bots %K[%W$[-4]0%K] %CB%cot Alarms %K[%W$[-4]1%K]", "%l %l",client_bot, client_bot_alarm));
1713
put_it("%s", convert_output_format("%g: %CS%cerv Squits %K[%W$[-4]0%K] %CS%cerv Connect %K[%W$[-4]1%K]", "%l %l",serv_squits, serv_connects));
1714
1715
#endif
1716
1717
}
1718
1719
char *strip(char *str, char *unwanted)
1720
{
1721
static char buffer[NICKNAME_LEN*4];
1722
register char *cp, *dp;
1723
if (!str)
1724
return empty_string;
1725
for (cp = str, dp = buffer; *cp; cp++)
1726
{
1727
if (!strchr(unwanted, *cp))
1728
*dp++ = *cp;
1729
}
1730
*dp = 0;
1731
return buffer;
1732
}
1733
1734
1735
BUILT_IN_COMMAND(set_autoreply)
1736
{
1737
char new_nick[NICKNAME_LEN+10];
1738
char not_wanted1[] = "_^\\{}[]|-";
1739
char not_wanted2[] = "_^\\{}[]|-0123456789";
1740
extern char *auto_str;
1741
if (!args || !*args)
1742
return;
1743
if (*args == '-')
1744
{
1745
set_string_var(AUTO_RESPONSE_STR_VAR, NULL);
1746
bitchsay("Auto-reply pats are deleted");
1747
new_free(&auto_str);
1748
}
1749
else
1750
{
1751
char *p, *new_args = NULL;
1752
p = next_arg(args, &args);
1753
if (*p == 'd' && strlen(p) == 1)
1754
{
1755
int len = strlen(nickname);
1756
m_e3cat(&new_args, nickname, space);
1757
m_e3cat(&new_args, strip(nickname, not_wanted1), (len > 4 ? space: empty_string));
1758
if (len > 4)
1759
{
1760
memset(new_nick, 0, sizeof(new_nick));
1761
new_nick[0] = '*';
1762
strncpy(new_nick+1, strip(nickname, not_wanted1), 4);
1763
new_nick[5] = '*';
1764
if (!strstr(new_args, new_nick))
1765
m_e3cat(&new_args, new_nick, space);
1766
}
1767
if (!strstr(new_args, strip(nickname, not_wanted2)))
1768
m_e3cat(&new_args, strip(nickname, not_wanted2), (len > 4 ? space:empty_string));
1769
if (len > 4)
1770
{
1771
memset(new_nick, 0, sizeof(new_nick));
1772
new_nick[0] = '*';
1773
strncpy(new_nick+1, strip(nickname, not_wanted2), 4);
1774
new_nick[5] = '*';
1775
if (!strstr(new_args, new_nick))
1776
malloc_strcat(&new_args, new_nick);
1777
}
1778
set_string_var(AUTO_RESPONSE_STR_VAR, new_args);
1779
reinit_autoresponse(current_window, new_args, 0);
1780
}
1781
else
1782
{
1783
do {
1784
m_3cat(&new_args, p, args?space:empty_string);
1785
} while ((p = next_arg(args, &args)));
1786
set_string_var(AUTO_RESPONSE_STR_VAR, new_args);
1787
reinit_autoresponse(current_window, new_args, 0);
1788
}
1789
new_free(&new_args);
1790
bitchsay("Auto-Response now set to [%s]", get_string_var(AUTO_RESPONSE_STR_VAR));
1791
}
1792
}
1793
1794
1795
1796
BUILT_IN_COMMAND(unload)
1797
{
1798
remove_bindings();
1799
init_keys();
1800
init_keys2();
1801
delete_all_timers();
1802
destroy_aliases(VAR_ALIAS);
1803
destroy_aliases(COMMAND_ALIAS);
1804
destroy_aliases(VAR_ALIAS_LOCAL);
1805
delete_all_arrays();
1806
delete_all_ext_fset();
1807
flush_on_hooks();
1808
init_variables();
1809
init_window_vars(NULL, NULL, NULL, NULL);
1810
}
1811
1812
1813
BUILT_IN_COMMAND(add_no_flood)
1814
{
1815
char *nick;
1816
List *nptr;
1817
if (!args || !*args)
1818
{
1819
int count = 0;
1820
for (nptr = next_namelist(no_flood_list, NULL, FLOOD_HASHSIZE); nptr; nptr = next_namelist(no_flood_list, nptr, FLOOD_HASHSIZE))
1821
{
1822
if (count == 0)
1823
put_it("%s", convert_output_format("No Flood list", NULL, NULL));
1824
put_it("%s", nptr->name);
1825
count++;
1826
}
1827
return;
1828
}
1829
say("Adding \"%s\" to No Flood list.", args);
1830
nick = next_arg(args, &args);
1831
while (nick && *nick)
1832
{
1833
if (!(nptr = find_name_in_genericlist(nick, no_flood_list, FLOOD_HASHSIZE, 0)))
1834
add_name_to_genericlist(nick, no_flood_list, FLOOD_HASHSIZE);
1835
nick = next_arg(args, &args);
1836
}
1837
}
1838
1839
BUILT_IN_COMMAND(check_clones)
1840
{
1841
char *channel= NULL;
1842
ChannelList *chan = NULL;
1843
NickList *nptr = NULL, *nptr1 = NULL;
1844
int server = from_server;
1845
int clones = 0;
1846
if (args && *args)
1847
{
1848
channel = next_arg(args, &args);
1849
channel = make_channel(channel);
1850
chan = prepare_command(&server, channel, NO_OP);
1851
}
1852
else
1853
{
1854
channel = get_current_channel_by_refnum(0);
1855
chan = prepare_command(&server, channel, NO_OP);
1856
}
1857
if (chan == NULL)
1858
return;
1859
for (nptr = next_nicklist(chan, NULL); nptr; nptr = next_nicklist(chan, nptr))
1860
nptr->check_clone = 0;
1861
for (nptr = next_nicklist(chan, NULL); nptr; nptr = next_nicklist(chan, nptr))
1862
{
1863
char *q;
1864
1865
if (nptr->check_clone)
1866
continue;
1867
1868
q = strchr(nptr->host, '@'); q++;
1869
1870
/* Scan forward from this point, looking for clones */
1871
for (nptr1 = next_nicklist(chan, nptr); nptr1; nptr1 = next_nicklist(chan, nptr1))
1872
{
1873
char *p;
1874
1875
p = strchr(nptr1->host, '@'); p++;
1876
1877
if (!strcmp(p, q))
1878
{
1879
/* clone detected */
1880
if (!clones && do_hook(CLONE_LIST, "Clones detected on %s", chan->channel))
1881
bitchsay("Clones detected on %s", chan->channel);
1882
if (!nptr->check_clone++)
1883
{
1884
if (do_hook(CLONE_LIST, "%s %s %s", nptr->nick, nptr->host, nick_isop(nptr)? "@":empty_string))
1885
put_user(nptr, chan->channel);
1886
clones++;
1887
}
1888
if (do_hook(CLONE_LIST, "%s %s %s", nptr1->nick, nptr1->host, nick_isop(nptr1)? "@":empty_string))
1889
put_user(nptr1, chan->channel);
1890
nptr1->check_clone++;
1891
clones++;
1892
}
1893
}
1894
}
1895
if (!clones)
1896
{
1897
if (do_hook(CLONE_LIST, "No clones detected on %s", channel))
1898
bitchsay("No clones detected on %s", channel);
1899
}
1900
else if (do_hook(CLONE_LIST, "Found %d clones", clones))
1901
bitchsay("Found %d clones", clones);
1902
}
1903
1904
void get_range(char *line, int *start, int *end)
1905
{
1906
char *q = line, *p = line;
1907
while (*p && isdigit((unsigned char)*p))
1908
p++;
1909
if (*p)
1910
*p++ = 0;
1911
*start = my_atol(q);
1912
*end = *p? my_atol(p): *start;
1913
if (*end < *start)
1914
*end = *start;
1915
}
1916
1917
BUILT_IN_COMMAND(pastecmd)
1918
{
1919
char *lines;
1920
char *channel = NULL;
1921
Window *win;
1922
int winref = 0;
1923
int line = 1;
1924
int topic = 0;
1925
1926
int start_line = 1, end_line = 1, count;
1927
#if 0
1928
Lastlog *start_pos;
1929
#else
1930
Display *start_pos;
1931
#endif
1932
if ((lines = next_arg(args, &args)))
1933
get_range(lines, &start_line, &end_line);
1934
if (!args || !*args)
1935
channel = get_current_channel_by_refnum(0);
1936
else
1937
{
1938
char *t;
1939
while (args && *args)
1940
{
1941
t = next_arg(args, &args);
1942
if (*t == '-')
1943
{
1944
if (!my_strnicmp(t, "-win", strlen(t)))
1945
{
1946
if (*args && isdigit((unsigned char)*args))
1947
{
1948
t = next_arg(args, &args);
1949
winref = my_atol(t);
1950
}
1951
}
1952
else if (!my_strnicmp(t, "-topic", strlen(t)))
1953
{
1954
topic = 1;
1955
}
1956
}
1957
else
1958
channel = t;
1959
}
1960
}
1961
if (!channel && !(channel = get_current_channel_by_refnum(0)))
1962
return;
1963
win = get_window_by_refnum(winref);
1964
1965
if (!win) {
1966
bitchsay("That window doesn't exist");
1967
return;
1968
}
1969
1970
#if 0
1971
if (!(end_line - start_line))
1972
line = end_line;
1973
else
1974
line = end_line - start_line + 1;
1975
#endif
1976
line = end_line;
1977
1978
#if 0
1979
if (line < 1 || line > win->lastlog_size)
1980
{
1981
bitchsay("Try a realistic number within your scrollbuffer");
1982
return;
1983
}
1984
for (start_pos = get_input_hold(win) ? get_input_hold(win):win->lastlog_head; line; start_pos = start_pos->next)
1985
line--;
1986
1987
if (!start_pos)
1988
start_pos = win->lastlog_tail;
1989
else
1990
start_pos = start_pos->prev;
1991
count = end_line - start_line + 1;
1992
if (count == 1 && topic && start_pos)
1993
{
1994
send_to_server("TOPIC %s :%s", channel, start_pos->msg);
1995
return;
1996
}
1997
while (count)
1998
{
1999
line++;
2000
if (start_pos && start_pos->msg)
2001
{
2002
if (do_hook(PASTE_LIST, "%s %s", channel, start_pos->msg))
2003
send_text(channel, convert_output_format(fget_string_var(FORMAT_PASTE_FSET),"%s %d %s", channel, line, start_pos->msg), NULL, 1, 0);
2004
start_pos = start_pos->prev;
2005
}
2006
count--;
2007
}
2008
#else
2009
if (line < 1 || line > win->display_buffer_size)
2010
{
2011
bitchsay("Try a realistic number within your scrollbuffer");
2012
return;
2013
}
2014
start_pos = get_screen_hold(win);
2015
for (start_pos = start_pos ? start_pos->prev : win->display_ip->prev; line > 1; start_pos = start_pos->prev)
2016
line--;
2017
2018
if (!start_pos)
2019
start_pos = win->display_ip->prev;
2020
2021
count = end_line - start_line + 1;
2022
if (count == 1 && topic && start_pos)
2023
{
2024
send_to_server("TOPIC %s :%s", channel, start_pos->line);
2025
return;
2026
}
2027
line = 0;
2028
while (count)
2029
{
2030
line++;
2031
if (start_pos && start_pos->line)
2032
{
2033
if (do_hook(PASTE_LIST, "%s %s", channel, start_pos->line))
2034
send_text(channel, convert_output_format(fget_string_var(FORMAT_PASTE_FSET),"%s %d %s", channel, line, start_pos->line), NULL, 1, 0);
2035
start_pos = start_pos->next;
2036
}
2037
count--;
2038
}
2039
#endif
2040
}
2041
2042
#if defined(GUI)
2043
void parsemenuitem(char *pargs, char **itemtext, char **options, char **itemalias, int *refnum)
2044
{
2045
char *text;
2046
*refnum=0;
2047
2048
text = pargs;
2049
while(*pargs == '-')
2050
{
2051
while(*pargs && *pargs != ' ')
2052
pargs++;
2053
while(*pargs==' ')
2054
pargs++;
2055
}
2056
if(text == pargs)
2057
*options = empty_string;
2058
else
2059
{
2060
*(pargs-1)=0;
2061
*options = text;
2062
}
2063
2064
if(pargs && (*pargs=='\"' || *pargs == 's') )
2065
*itemtext=new_next_arg(pargs, &pargs);
2066
else
2067
{
2068
*refnum=my_atol(new_next_arg(pargs, &pargs));
2069
*itemtext=new_next_arg(pargs, &pargs);
2070
}
2071
if (pargs && *pargs == '{')
2072
*itemalias = next_expr(&pargs, '{');
2073
else
2074
*itemalias = pargs;
2075
}
2076
2077
void parsesubmenu(char *pargs, char **submenutext, char **options)
2078
{
2079
if (*pargs == '-')
2080
{
2081
*options = new_next_arg(pargs, &pargs);
2082
}
2083
*submenutext = new_next_arg(pargs, &pargs);
2084
}
2085
2086
/*
2087
* Returns a pointer to the menu you are looking for, or returns NULL if it does not exist
2088
*/
2089
2090
MenuStruct *findmenu(char *menuname)
2091
{
2092
MenuStruct *thismenu;
2093
if(morigin!=NULL)
2094
{
2095
thismenu=morigin;
2096
while(thismenu)
2097
{
2098
if(!strcmp(menuname, thismenu->name))
2099
return thismenu;
2100
thismenu = thismenu->next;
2101
}
2102
}
2103
return NULL;
2104
}
2105
2106
2107
/*
2108
* This adds an empty menu entry
2109
*/
2110
2111
static int null_cmp_func(List *s, List *s1)
2112
{
2113
return 0;
2114
}
2115
2116
MenuStruct *addmenu(char *menuname)
2117
{
2118
MenuStruct *new = NULL;
2119
new = new_malloc(sizeof(MenuStruct));
2120
memset(new, 0, sizeof(MenuStruct));
2121
malloc_strcpy(&new->name, menuname);
2122
2123
new->menuorigin=NULL;
2124
new->next=NULL;
2125
new->root=NULL;
2126
#ifdef __EMXPM__
2127
new->sharedhandle = NULLHANDLE;
2128
#elif defined(GTK)
2129
new->sharedhandle = (GtkWidget *)NULL;
2130
#endif
2131
add_to_list_ext((List **)&morigin, (List *)new, null_cmp_func);
2132
return new;
2133
}
2134
2135
/*
2136
* This function recursively deletes all menuitems
2137
*/
2138
2139
void removemenu(char *);
2140
2141
void recdel(MenuList *delitem)
2142
{
2143
MenuList *last;
2144
while (delitem)
2145
{
2146
last = delitem->next;
2147
new_free(&delitem->name);
2148
if (delitem->menutype & GUISUBMENU)
2149
{
2150
new_free(&delitem->alias);
2151
if (!(delitem->menutype & GUISHARED))
2152
removemenu(delitem->submenu);
2153
}
2154
new_free(&delitem->alias);
2155
new_free(&delitem);
2156
delitem = last;
2157
}
2158
}
2159
2160
/*
2161
* This removes a menu entry and all menuitems on it
2162
*/
2163
2164
void removemenu(char *menuname)
2165
{
2166
MenuStruct *thismenu;
2167
if ((thismenu = (MenuStruct *)remove_from_list((List **)&morigin, menuname)))
2168
{
2169
if (thismenu->menuorigin)
2170
recdel(thismenu->menuorigin);
2171
new_free(&thismenu->name);
2172
new_free(&thismenu);
2173
}
2174
}
2175
2176
BUILT_IN_COMMAND(os2menu)
2177
{
2178
char *mpar;
2179
MenuStruct *thismenu;
2180
2181
if ((mpar = new_next_arg(args, &args)))
2182
{
2183
if(*mpar =='-')
2184
{
2185
gui_remove_menurefs(mpar + 1);
2186
removemenu(mpar + 1);
2187
}
2188
else
2189
addmenu(mpar);
2190
}
2191
else
2192
{
2193
if (morigin)
2194
{
2195
thismenu=morigin;
2196
while (thismenu!=NULL)
2197
{
2198
say("Menu \'%s\'",thismenu->name);
2199
thismenu=thismenu->next;
2200
}
2201
}
2202
else
2203
say("No menus defined.");
2204
}
2205
}
2206
2207
BUILT_IN_COMMAND(os2menuitem)
2208
{
2209
char *menuname = NULL,
2210
*itemtext = NULL,
2211
*options = NULL,
2212
*itemalias = NULL;
2213
MenuStruct *thismenu;
2214
MenuList *lastitem = NULL, *thisitem = NULL;
2215
int refnum = -1, z;
2216
2217
if ((menuname = next_arg(args, &args)) && (thismenu=findmenu(menuname)))
2218
{
2219
parsemenuitem(args, &itemtext, &options, &itemalias, &refnum);
2220
if (thismenu->menuorigin!=NULL)
2221
{
2222
thisitem=thismenu->menuorigin;
2223
while (thisitem)
2224
{
2225
lastitem=thisitem;
2226
thisitem=lastitem->next;
2227
}
2228
lastitem->next=(MenuList *)new_malloc(sizeof(MenuList));
2229
thisitem=lastitem->next;
2230
}
2231
else
2232
{
2233
thismenu->menuorigin=(MenuList *)new_malloc(sizeof(MenuList));
2234
thisitem=thismenu->menuorigin;
2235
}
2236
thisitem->menuid=globalmenuid;
2237
thisitem->refnum=refnum;
2238
globalmenuid++;
2239
/* Add checks for inactive items, etc in options */
2240
if (!my_stricmp(itemtext, "separator"))
2241
thisitem->menutype = GUISEPARATOR;
2242
else
2243
{
2244
thisitem->menutype = GUIMENUITEM;
2245
if(options && *options)
2246
{
2247
for(z=0;z<strlen(options);z++)
2248
{
2249
if(options[z] == 'd')
2250
thisitem->menutype |= GUIDEFMENUITEM;
2251
else if(options[z] == 'b')
2252
thisitem->menutype |= GUIBRKMENUITEM;
2253
else if(options[z] == 'c')
2254
thisitem->menutype |= GUICHECKEDMENUITEM | GUICHECKMENUITEM;
2255
else if(options[z] == 'n')
2256
thisitem->menutype |= GUINDMENUITEM;
2257
}
2258
}
2259
malloc_strcpy(&thisitem->name,itemtext);
2260
thisitem->alias = convert_output_format2(itemalias);
2261
thisitem->submenu=NULL;
2262
thisitem->next=NULL;
2263
}
2264
2265
}
2266
}
2267
2268
BUILT_IN_COMMAND(os2submenu)
2269
{
2270
char *menuname = NULL,
2271
*submenuname = NULL,
2272
*submenutext = NULL,
2273
*options = NULL;
2274
MenuStruct *thismenu = NULL, *submenu = NULL;
2275
MenuList *lastitem = NULL, *thisitem = NULL;
2276
int z;
2277
2278
2279
if ((menuname = next_arg(args, &args)))
2280
{
2281
submenuname = next_arg(args, &args);
2282
if(!submenuname)
2283
return;
2284
if (!(thismenu = findmenu(menuname)))
2285
{
2286
say("Menu not found.");
2287
return;
2288
}
2289
if (thismenu->menuorigin)
2290
submenu = findmenu(submenuname);
2291
if (!submenu)
2292
submenu = addmenu(submenuname);
2293
}
2294
if (menuname && thismenu)
2295
{
2296
parsesubmenu(args, &submenutext, &options);
2297
if(thismenu->menuorigin)
2298
{
2299
thisitem=thismenu->menuorigin;
2300
while(thisitem)
2301
{
2302
lastitem=thisitem;
2303
thisitem=lastitem->next;
2304
}
2305
/* I need to add error checking here later */
2306
lastitem->next=(MenuList *)new_malloc(sizeof(MenuList));
2307
thisitem=lastitem->next;
2308
}
2309
else
2310
{
2311
/* I need to add error checking here later */
2312
thismenu->menuorigin=(MenuList *)new_malloc(sizeof(MenuList));
2313
thisitem=thismenu->menuorigin;
2314
}
2315
memset(thisitem, 0, sizeof(MenuList));
2316
thisitem->menuid=globalmenuid;
2317
thisitem->refnum=-1;
2318
globalmenuid++;
2319
/* Add checks for inactive items, etc in options */
2320
thisitem->menutype = GUISUBMENU;
2321
if(options && *options)
2322
{
2323
for(z=0;z<strlen(options);z++)
2324
{
2325
if(options[z] == 'b')
2326
thisitem->menutype |= GUIBRKSUBMENU;
2327
else if(options[z] == 's')
2328
thisitem->menutype |= GUISHARED;
2329
}
2330
}
2331
malloc_strcpy(&thisitem->name,submenutext);
2332
malloc_strcpy(&thisitem->submenu, submenuname);
2333
thisitem->next=NULL;
2334
}
2335
}
2336
2337
BUILT_IN_COMMAND(fontdialog)
2338
{
2339
gui_font_dialog(last_input_screen);
2340
}
2341
2342
BUILT_IN_COMMAND(filedialog)
2343
{
2344
char *type = NULL,
2345
*path = NULL,
2346
*title = NULL,
2347
*ok = NULL,
2348
*apply = NULL,
2349
*code = NULL,
2350
szButton[10] = "OK";
2351
2352
if (!(type = next_arg(args, &args)) || !(path = next_arg(args, &args)))
2353
return;
2354
if (!(title = new_next_arg(args, &args)))
2355
return;
2356
if (*args=='\"')
2357
{
2358
ok = new_next_arg(args, &args);
2359
strcpy(szButton, ok);
2360
}
2361
if (*args=='\"')
2362
apply = new_next_arg(args, &args);
2363
2364
if (args && *args == '{')
2365
code = next_expr(&args, '{');
2366
else
2367
code = args;
2368
2369
gui_file_dialog(type, path, title, ok, apply, code, szButton);
2370
}
2371
2372
BUILT_IN_COMMAND(pmpaste)
2373
{
2374
gui_paste(args);
2375
}
2376
2377
BUILT_IN_COMMAND(pmprop)
2378
{
2379
gui_properties_notebook();
2380
}
2381
2382
BUILT_IN_COMMAND(os2popupmenu)
2383
{
2384
char *menuname;
2385
2386
if(args && *args)
2387
{
2388
menuname = next_arg(args, &args);
2389
gui_popupmenu(menuname);
2390
}
2391
}
2392
2393
BUILT_IN_COMMAND(os2popupmsg)
2394
{
2395
char *tmpmsg;
2396
2397
if (args && *args)
2398
{
2399
tmpmsg = new_next_arg(args, &args);
2400
if (tmpmsg && *tmpmsg)
2401
{
2402
msgtext = m_strdup(tmpmsg);
2403
gui_msgbox();
2404
}
2405
}
2406
}
2407
#endif
2408
2409
#ifdef __EMXPM__
2410
BUILT_IN_COMMAND(pmcodepage)
2411
{
2412
int codepage=0;
2413
extern HMQ hmq;
2414
2415
if (args && *args)
2416
{
2417
codepage = my_atol(args);
2418
if (codepage)
2419
{
2420
current_window->screen->codepage = codepage;
2421
WinSetCp(hmq, codepage);
2422
VioSetCp(0, codepage, current_window->screen->hvps);
2423
VioSetCp(0, codepage, current_window->screen->hvpsnick);
2424
}
2425
}
2426
else
2427
say("Usage: /codepage <codepage number>");
2428
}
2429
#endif
2430
2431
#if !defined(__EMX__) && !defined(WINNT) && !defined(GUI) && defined(WANT_DETACH)
2432
#ifndef PUBLIC_ACCESS
2433
extern char socket_path[];
2434
extern char *old_pass;
2435
2436
int displays = 0;
2437
int reattach_socket = -1;
2438
int save_ipc = -1;
2439
int save_pid = -1;
2440
int already_detached = 0;
2441
2442
struct param {
2443
pid_t pgrp,
2444
pid;
2445
uid_t uid;
2446
int cols;
2447
int rows;
2448
char tty[80];
2449
char cookie[30];
2450
char password[80];
2451
char termid[81];
2452
};
2453
2454
static char connect_cookie[30];
2455
2456
#define SOCKMODE (S_IWRITE | S_IREAD | (displays ? S_IEXEC : 0))
2457
2458
struct param parm;
2459
2460
void handle_reconnect(int s)
2461
{
2462
int len;
2463
struct sockaddr_in addr;
2464
int n;
2465
memset(&addr, 0, sizeof(addr));
2466
memset(&parm, 0, sizeof(parm));
2467
len = sizeof(addr);
2468
alarm(10);
2469
n = my_accept(s, (struct sockaddr *)&addr, &len);
2470
alarm(0);
2471
if (n < 0 || getpeername(n, (struct sockaddr *)&addr, &len) < 0)
2472
{
2473
put_it("%d %s", errno, strerror(errno));
2474
if ( n > -1) close(n);
2475
return;
2476
}
2477
if (strcmp(inet_ntoa(addr.sin_addr), "127.0.0.1"))
2478
{
2479
put_it("Invalid hostname connect from %s", inet_ntoa(addr.sin_addr));
2480
close(n);
2481
return;
2482
}
2483
set_blocking(n);
2484
alarm(5);
2485
if ((len = read(n, &parm, sizeof(struct param))) > 0)
2486
{
2487
alarm(0);
2488
if ( ((parm.password[0] != '\0') && !old_pass) ||
2489
((parm.password[0] == '\0') && old_pass) ||
2490
((parm.password[0] != '\0') && old_pass && checkpass(parm.password, old_pass) ))
2491
{
2492
bitchsay("Invalid password attempt on reconnect");
2493
close(n);
2494
return;
2495
}
2496
if ((parm.uid != getuid()) || !*parm.cookie || strcmp(parm.cookie, connect_cookie))
2497
{
2498
bitchsay("Invalid uid attempting connect [%d] or bad cookie", parm.uid);
2499
close(n);
2500
return;
2501
}
2502
2503
save_pid = parm.pid;
2504
2505
new_close(0);
2506
close(1);
2507
close(2);
2508
fclose(main_screen->fpout);
2509
fclose(main_screen->fpin);
2510
close(main_screen->fdout);
2511
close(main_screen->fdin);
2512
2513
dup2(n, 0);
2514
dup2(n, 1);
2515
dup2(n, 2);
2516
2517
parm.pid = getpid();
2518
parm.pgrp = getpgrp();
2519
strcpy(attach_ttyname, ttyname(0)? ttyname(0): parm.tty);
2520
write(n, &parm, sizeof(struct param));
2521
2522
main_screen->fpin = fdopen(0, "r");
2523
main_screen->fpout = fdopen(1, "w");
2524
main_screen->fdin = fileno(main_screen->fpin);
2525
main_screen->fdout = fileno(main_screen->fpout);
2526
2527
new_open(n);
2528
2529
2530
term_init((parm.termid && *parm.termid) ? parm.termid : NULL);
2531
reset_cols(parm.cols);
2532
reset_lines(parm.rows);
2533
reinit_term(main_screen->fdin);
2534
set_term_eight_bit(1);
2535
charset_ibmpc();
2536
update_all_windows();
2537
refresh_screen(0, NULL);
2538
reattach_socket = n;
2539
close_socketread(s);
2540
use_input = 1;
2541
already_detached = 0;
2542
save_ipc = -1;
2543
return;
2544
}
2545
alarm(0);
2546
close(n);
2547
}
2548
2549
extern SIGNAL_HANDLER(sigpipe);
2550
2551
void kill_attached_if_needed(int type)
2552
{
2553
if (reattach_socket != -1)
2554
{
2555
my_signal(SIGPIPE, SIG_IGN, 0);
2556
new_close(0);
2557
kill(save_pid, type? SIGPIPE : SIGHUP);
2558
new_close(reattach_socket);
2559
dup2(main_screen->fdin, 0);
2560
new_open(0);
2561
dup2(main_screen->fdout, 1);
2562
dup2(main_screen->fdout, 2);
2563
reattach_socket = -1;
2564
save_pid = -1;
2565
my_signal(SIGPIPE, sigpipe, 0);
2566
}
2567
}
2568
2569
void make_cookie(void)
2570
{
2571
int i, j;
2572
memset(connect_cookie, 0, sizeof(connect_cookie));
2573
for (i = 0; i < (int) (20.0 * rand()/RAND_MAX) + 5; i++)
2574
{
2575
j = (int)(95.0 * rand()/RAND_MAX);
2576
connect_cookie[i] = j + 32;
2577
}
2578
}
2579
2580
static int create_ipc_socket(void)
2581
{
2582
int s = -1, u = -1;
2583
unsigned short port = 0;
2584
char buf[BIG_BUFFER_SIZE+1];
2585
2586
init_socketpath();
2587
2588
if ((s = connect_by_number(NULL, &port, SERVICE_SERVER, PROTOCOL_TCP, 0)) < 0)
2589
{
2590
bitchsay("Error creating IPC socket: [%d] %s", s, strerror(errno));
2591
return 1;
2592
}
2593
2594
sprintf(buf, socket_path, port);
2595
if ((u = open(buf, O_CREAT|O_WRONLY, 0600)) != -1)
2596
{
2597
chmod(buf, SOCKMODE);
2598
chown(buf, getuid(), getgid());
2599
make_cookie();
2600
write(u, connect_cookie, strlen(connect_cookie));
2601
write(u, "\n", 1);
2602
close(u);
2603
}
2604
2605
set_non_blocking(s);
2606
add_socketread(s, port, 0, socket_path, handle_reconnect, NULL);
2607
save_ipc = s;
2608
2609
return 0;
2610
}
2611
2612
2613
void do_detach(int pid, char *args)
2614
{
2615
2616
cursor_to_input();
2617
term_cr();
2618
term_clear_to_eol();
2619
term_reset2();
2620
fprintf(stdout, "\r");
2621
if (args && *args)
2622
old_pass = m_strdup(next_arg(args, &args));
2623
if (pid != -1)
2624
fprintf(stdout, "detached from %s. To re-attach type scr-bx %s\n\r", attach_ttyname, old_pass?"-p":empty_string);
2625
fflush(stdout);
2626
fflush(stderr);
2627
exit(pid);
2628
}
2629
#endif
2630
#endif /* EMX WINNT WANT_DETACH */
2631
2632
void close_detach_fd(void)
2633
{
2634
Screen *screen = NULL;
2635
if (main_screen)
2636
{
2637
main_screen->fdout = main_screen->fdin = open("/dev/null", O_RDWR|O_NOCTTY);
2638
main_screen->fpin = fdopen(main_screen->fdin, "r");
2639
main_screen->fpout = fdopen(main_screen->fdout, "w");
2640
}
2641
else
2642
{
2643
close(0);
2644
close(1);
2645
close(2);
2646
}
2647
freopen("/dev/null", "r", stdin);
2648
freopen("/dev/null", "w", stdout);
2649
freopen("/dev/null", "w", stderr);
2650
for (screen = screen_list; screen; screen = screen->next)
2651
{
2652
screen->fpin = main_screen->fpin;
2653
screen->fpout = main_screen->fpout;
2654
screen->fdin = main_screen->fdin;
2655
screen->fdout = main_screen->fdout;
2656
}
2657
2658
}
2659
2660
extern int do_check_pid;
2661
2662
BUILT_IN_COMMAND(detachcmd)
2663
{
2664
#if !defined(__EMX__) && !defined(WINNT) && !defined (GUI) && defined(WANT_DETACH)
2665
#ifndef PUBLIC_ACCESS
2666
pid_t pid;
2667
/*
2668
* this is written so that a running bx client will attempt to
2669
* detach and then later a screen type program can be used to re-attach
2670
* to us.
2671
*/
2672
if (already_detached)
2673
return;
2674
if (args && *args)
2675
{
2676
char *p;
2677
if ((p = next_arg(args, &args)))
2678
malloc_strcpy(&old_pass, cryptit(p));
2679
}
2680
/*
2681
* create a server socket with the above name.
2682
*/
2683
if (create_ipc_socket())
2684
return;
2685
2686
switch(pid = fork())
2687
{
2688
case -1:
2689
bitchsay("fork() failed: %s", strerror(errno));
2690
return;
2691
default:
2692
do_detach(pid, args);
2693
/* Not reached */
2694
return;
2695
case 0:
2696
break;
2697
}
2698
2699
setpgid(0, 0);
2700
already_detached = 1;
2701
use_input = 0;
2702
2703
close_detach_fd();
2704
kill_attached_if_needed(1);
2705
disable_stop();
2706
do_check_pid = 1;
2707
setup_pid();
2708
#endif
2709
#endif
2710
}
2711
2712
BUILT_IN_COMMAND(spam)
2713
{
2714
char *c;
2715
ChannelList *chan = NULL;
2716
if (!args || !*args || (from_server == -1))
2717
return;
2718
c = next_arg(args, &args);
2719
c = make_channel(c);
2720
if (!c || !args || !*args)
2721
{
2722
bitchsay("Please specify channel(s) to compare");
2723
return;
2724
}
2725
if ((chan = lookup_channel(c, from_server, 0)))
2726
{
2727
NickList *u, *u1 = NULL;
2728
for (u = next_nicklist(chan, NULL); u; u = next_nicklist(chan, u))
2729
{
2730
ChannelList *chan1;
2731
char *tmpc, *t;
2732
tmpc = LOCAL_COPY(args);
2733
2734
while ((t = next_arg(tmpc, &tmpc)))
2735
{
2736
if (!(t = make_channel(t)))
2737
continue;
2738
chan1 = lookup_channel(t, from_server, 0);
2739
if (!chan1 || (chan1 == chan))
2740
continue;
2741
if (!(u1 = find_nicklist_in_channellist(u->nick, chan1, 0)))
2742
continue;
2743
bitchsay("Found %s!%s on %s", u1->nick, u1->host, chan1->channel);
2744
}
2745
}
2746
}
2747
}
2748
2749
BUILT_IN_COMMAND(send_kline)
2750
{
2751
char *dur,
2752
*target = NULL,
2753
*t;
2754
time_t t_time = DEFAULT_TKLINE_TIME;
2755
int tkline = 0;
2756
2757
if (*command == 'U')
2758
{
2759
while ((target = next_arg(args, &args)))
2760
{
2761
while ((t = next_in_comma_list(target, &target)))
2762
{
2763
if (!t || !*t) break;
2764
send_to_server("%s %s", command, t);
2765
}
2766
}
2767
return;
2768
}
2769
dur = next_arg(args, &args);
2770
2771
if (*command == 'D')
2772
target = dur;
2773
else if (*command == 'K' || *command == 'T')
2774
{
2775
if (*command == 'T') /* timed kline */
2776
command++, tkline++;
2777
if (dur && is_number(dur))
2778
{
2779
int l;
2780
if ((l = my_atol(dur)))
2781
t_time = l;
2782
target = next_arg(args, &args);
2783
}
2784
else
2785
target = dur;
2786
}
2787
while (args && *args == ':')
2788
args++;
2789
if (!args || !*args)
2790
{
2791
bitchsay("Specify a reason for your %s", command);
2792
return;
2793
}
2794
bitchsay("Sending %s for %s : %s", command, target, args);
2795
while ((t = next_in_comma_list(target, &target)))
2796
{
2797
if (!t || !*t) break;
2798
if (tkline)
2799
send_to_server("%s %u %s :%s", command, t_time, t, args);
2800
else
2801
send_to_server("%s %s :%s", command, t, args);
2802
}
2803
}
2804
2805
typedef void (*cvsfunc)(char *);
2806
2807
cvsfunc cvsfuncs[] = {
2808
alias_c,
2809
alist_c,
2810
array_c,
2811
banlist_c,
2812
botlink_c,
2813
cdcc_c,
2814
chelp_c,
2815
commands_c,
2816
commands2_c,
2817
cset_c,
2818
ctcp_c,
2819
dcc_c,
2820
debug_c,
2821
encrypt_c,
2822
exec_c,
2823
files_c,
2824
flood_c,
2825
fset_c,
2826
functions_c,
2827
funny_c,
2828
hash_c,
2829
help_c,
2830
history_c,
2831
hook_c,
2832
if_c,
2833
ignore_c,
2834
input_c,
2835
irc_c,
2836
ircaux_c,
2837
keys_c,
2838
lastlog_c,
2839
list_c,
2840
log_c,
2841
mail_c,
2842
misc_c,
2843
modules_c,
2844
names_c,
2845
network_c,
2846
newio_c,
2847
notice_c,
2848
notify_c,
2849
numbers_c,
2850
output_c,
2851
parse_c,
2852
queue_c,
2853
readlog_c,
2854
reg_c,
2855
screen_c,
2856
server_c,
2857
stack_c,
2858
status_c,
2859
struct_c,
2860
tcl_public_c,
2861
term_c,
2862
timer_c,
2863
translat_c,
2864
user_c,
2865
userlist_c,
2866
vars_c,
2867
who_c,
2868
whowas_c,
2869
window_c,
2870
words_c,
2871
0
2872
};
2873
2874
BUILT_IN_COMMAND(show_revisions)
2875
{
2876
int z = 0, found = 0;
2877
char revisionbuf[100];
2878
2879
while(cvsfuncs[z])
2880
{
2881
cvsfuncs[z](revisionbuf);
2882
/* If there are args... we look for a matching filename or start string */
2883
if(args && *args)
2884
{
2885
if(my_strnicmp(&revisionbuf[5], args, strlen(args)) == 0)
2886
{
2887
say(revisionbuf);
2888
found = 1;
2889
}
2890
}
2891
else
2892
{
2893
say(revisionbuf);
2894
found = 1;
2895
}
2896
z++;
2897
}
2898
if(!found)
2899
say("Could not find any revisions.");
2900
}
2901
2902