/[cvs]/eggdrop1.9/src/tcluser.c
ViewVC logotype

Annotation of /eggdrop1.9/src/tcluser.c

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.16 - (hide annotations) (download) (as text)
Wed Apr 5 19:25:34 2000 UTC (19 years, 7 months ago) by fabian
Branch: MAIN
CVS Tags: eggdrop10503, eggdrop10403
Changes since 1.15: +4 -3 lines
File MIME type: text/x-chdr
Wiktor's chnick patch

1 fabian 1.8 /*
2 segfault 1.1 * tcluser.c -- handles:
3 fabian 1.8 * Tcl stubs for the user-record-oriented commands
4 segfault 1.1 *
5 fabian 1.16 * $Id: tcluser.c,v 1.15 2000/03/23 23:17:56 fabian Exp $
6 segfault 1.1 */
7 fabian 1.8 /*
8     * Copyright (C) 1997 Robey Pointer
9 fabian 1.12 * Copyright (C) 1999, 2000 Eggheads
10 fabian 1.8 *
11     * This program is free software; you can redistribute it and/or
12     * modify it under the terms of the GNU General Public License
13     * as published by the Free Software Foundation; either version 2
14     * of the License, or (at your option) any later version.
15     *
16     * This program is distributed in the hope that it will be useful,
17     * but WITHOUT ANY WARRANTY; without even the implied warranty of
18     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19     * GNU General Public License for more details.
20     *
21     * You should have received a copy of the GNU General Public License
22     * along with this program; if not, write to the Free Software
23     * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24 segfault 1.1 */
25    
26     #include "main.h"
27     #include "users.h"
28     #include "chan.h"
29     #include "tandem.h"
30    
31 fabian 1.14 extern Tcl_Interp *interp;
32     extern struct userrec *userlist;
33     extern int default_flags, dcc_total, ignore_time;
34     extern struct dcc_t *dcc;
35     extern char origbotname[], botnetnick[];
36     extern time_t now;
37 segfault 1.1
38    
39 fabian 1.14 static int tcl_countusers STDVAR
40     {
41 fabian 1.6 Context;
42 segfault 1.1 BADARGS(1, 1, "");
43     Tcl_AppendResult(irp, int_to_base10(count_users(userlist)), NULL);
44     return TCL_OK;
45     }
46    
47 fabian 1.14 static int tcl_validuser STDVAR
48     {
49 fabian 1.6 Context;
50 segfault 1.1 BADARGS(2, 2, " handle");
51     Tcl_AppendResult(irp, get_user_by_handle(userlist, argv[1]) ? "1" : "0",
52     NULL);
53     return TCL_OK;
54     }
55 fabian 1.14
56     static int tcl_finduser STDVAR
57     {
58 segfault 1.1 struct userrec *u;
59    
60 fabian 1.6 Context;
61 segfault 1.1 BADARGS(2, 2, " nick!user@host");
62     u = get_user_by_host(argv[1]);
63     Tcl_AppendResult(irp, u ? u->handle : "*", NULL);
64     return TCL_OK;
65     }
66    
67 fabian 1.14 static int tcl_passwdOk STDVAR
68     {
69 segfault 1.1 struct userrec *u;
70    
71 fabian 1.6 Context;
72 segfault 1.1 BADARGS(3, 3, " handle passwd");
73     Tcl_AppendResult(irp, ((u = get_user_by_handle(userlist, argv[1])) &&
74     u_pass_match(u, argv[2])) ? "1" : "0", NULL);
75     return TCL_OK;
76     }
77    
78 fabian 1.14 static int tcl_chattr STDVAR
79     {
80 segfault 1.1 char *chan, *chg, work[100];
81     struct flag_record pls, mns, user;
82     struct userrec *u;
83    
84 fabian 1.6 Context;
85 segfault 1.1 BADARGS(2, 4, " handle ?changes? ?channel?");
86     if ((argv[1][0] == '*') || !(u = get_user_by_handle(userlist, argv[1]))) {
87     Tcl_AppendResult(irp, "*", NULL);
88     return TCL_OK;
89     }
90     if (argc == 4) {
91     user.match = FR_GLOBAL | FR_CHAN;
92     chan = argv[3];
93     chg = argv[2];
94     } else if ((argc == 3)
95     && (argv[2][0] && (strchr(CHANMETA, argv[2][0]) != NULL))) {
96     /* We need todo extra checking here to stop us mixing up +channel's
97 fabian 1.14 * with flags. <cybah>
98     */
99 fabian 1.4 if (!findchan_by_dname(argv[2]) && argv[2][0] != '+') {
100 segfault 1.1 /* Channel doesnt exist, and it cant possibly be flags as there
101 fabian 1.14 * is no + at the start of the string.
102     */
103 segfault 1.1 Tcl_AppendResult(irp, "no such channel", NULL);
104     return TCL_ERROR;
105 fabian 1.4 } else if(findchan_by_dname(argv[2])) {
106 segfault 1.1 /* Channel exists */
107     user.match = FR_GLOBAL | FR_CHAN;
108     chan = argv[2];
109     chg = NULL;
110     } else {
111     /* 3rd possibility... channel doesnt exist, does start with a +.
112 fabian 1.14 * In this case we assume the string is flags.
113     */
114 segfault 1.1 user.match = FR_GLOBAL;
115     chan = NULL;
116     chg = argv[2];
117     }
118     } else {
119     user.match = FR_GLOBAL;
120     chan = NULL;
121     chg = argv[2];
122     }
123 fabian 1.4 if (chan && !findchan_by_dname(chan)) {
124 segfault 1.1 Tcl_AppendResult(irp, "no such channel", NULL);
125     return TCL_ERROR;
126     }
127     get_user_flagrec(u, &user, chan);
128 fabian 1.14 /* Make changes */
129 segfault 1.1 if (chg) {
130     pls.match = user.match;
131     break_down_flags(chg, &pls, &mns);
132 fabian 1.14 /* No-one can change these flags on-the-fly */
133 segfault 1.1 pls.global &=~(USER_BOT);
134     mns.global &=~(USER_BOT);
135     if (chan) {
136     pls.chan &= ~(BOT_SHARE);
137     mns.chan &= ~(BOT_SHARE);
138     }
139     user.global = sanity_check((user.global |pls.global) &~mns.global);
140     user.udef_global = (user.udef_global | pls.udef_global)
141     & ~mns.udef_global;
142     if (chan) {
143     user.chan = chan_sanity_check((user.chan | pls.chan) & ~mns.chan,
144     user.global);
145     user.udef_chan = (user.udef_chan | pls.udef_chan) & ~mns.udef_chan;
146     }
147     set_user_flagrec(u, &user, chan);
148     }
149 fabian 1.14 /* Retrieve current flags and return them */
150 segfault 1.1 build_flags(work, &user, NULL);
151     Tcl_AppendResult(irp, work, NULL);
152     return TCL_OK;
153     }
154    
155 fabian 1.14 static int tcl_botattr STDVAR
156     {
157 segfault 1.1 char *chan, *chg, work[100];
158     struct flag_record pls, mns, user;
159     struct userrec *u;
160    
161 fabian 1.6 Context;
162 segfault 1.1 BADARGS(2, 4, " bot-handle ?changes? ?channel?");
163     u = get_user_by_handle(userlist, argv[1]);
164     if ((argv[1][0] == '*') || !u || !(u->flags & USER_BOT)) {
165     Tcl_AppendResult(irp, "*", NULL);
166     return TCL_OK;
167     }
168     if (argc == 4) {
169     user.match = FR_BOT | FR_CHAN;
170     chan = argv[3];
171     chg = argv[2];
172     } else if ((argc == 3)
173     && (argv[2][0] && (strchr(CHANMETA, argv[2][0]) != NULL))) {
174     /* We need todo extra checking here to stop us mixing up +channel's
175 fabian 1.14 * with flags. <cybah>
176     */
177 fabian 1.4 if (!findchan_by_dname(argv[2]) && argv[2][0] != '+') {
178 segfault 1.1 /* Channel doesnt exist, and it cant possibly be flags as there
179 fabian 1.14 * is no + at the start of the string.
180     */
181 segfault 1.1 Tcl_AppendResult(irp, "no such channel", NULL);
182     return TCL_ERROR;
183 fabian 1.4 } else if(findchan_by_dname(argv[2])) {
184 segfault 1.1 /* Channel exists */
185     user.match = FR_BOT | FR_CHAN;
186     chan = argv[2];
187     chg = NULL;
188     } else {
189     /* 3rd possibility... channel doesnt exist, does start with a +.
190 fabian 1.14 * In this case we assume the string is flags.
191     */
192 segfault 1.1 user.match = FR_BOT;
193     chan = NULL;
194     chg = argv[2];
195     }
196     } else {
197     user.match = FR_BOT;
198     chan = NULL;
199     chg = argv[2];
200     }
201 fabian 1.4 if (chan && !findchan_by_dname(chan)) {
202 segfault 1.1 Tcl_AppendResult(irp, "no such channel", NULL);
203     return TCL_ERROR;
204     }
205     get_user_flagrec(u, &user, chan);
206 fabian 1.14 /* Make changes */
207 segfault 1.1 if (chg) {
208     pls.match = user.match;
209     break_down_flags(chg, &pls, &mns);
210 fabian 1.14 /* No-one can change these flags on-the-fly */
211 segfault 1.1 if (chan) {
212     pls.chan &= BOT_SHARE;
213     mns.chan &= BOT_SHARE;
214     }
215     user.bot = sanity_check((user.bot | pls.bot) & ~mns.bot);
216     if (chan) {
217 fabian 1.13 user.chan = (user.chan | pls.chan) & ~mns.chan;
218 segfault 1.1 user.udef_chan = (user.udef_chan | pls.udef_chan) & ~mns.udef_chan;
219     }
220     set_user_flagrec(u, &user, chan);
221     }
222 fabian 1.14 /* Retrieve current flags and return them */
223 segfault 1.1 build_flags(work, &user, NULL);
224     Tcl_AppendResult(irp, work, NULL);
225     return TCL_OK;
226     }
227    
228 fabian 1.14 static int tcl_matchattr STDVAR
229     {
230 segfault 1.1 struct userrec *u;
231     struct flag_record plus, minus, user;
232     int ok = 0, f;
233    
234 fabian 1.6 Context;
235 segfault 1.1 BADARGS(3, 4, " handle flags ?channel?");
236 fabian 1.6 Context; /* a2 - Last context: tcluser.c/184 */
237 segfault 1.1 if ((u = get_user_by_handle(userlist, argv[1])) &&
238 fabian 1.4 ((argc == 3) || findchan_by_dname(argv[3]))) {
239 fabian 1.6 Context; /* a2 - Last context: tcluser.c/184 */
240 segfault 1.1 user.match = FR_GLOBAL | (argc == 4 ? FR_CHAN : 0) | FR_BOT;
241     get_user_flagrec(u, &user, argv[3]);
242     plus.match = user.match;
243     break_down_flags(argv[2], &plus, &minus);
244     f = (minus.global || minus.udef_global || minus.chan ||
245     minus.udef_chan || minus.bot);
246     if (flagrec_eq(&plus, &user)) {
247 fabian 1.6 Context; /* a2 - Last context: tcluser.c/184 */
248 segfault 1.1 if (!f)
249     ok = 1;
250     else {
251     minus.match = plus.match ^ (FR_AND | FR_OR);
252     if (!flagrec_eq(&minus, &user))
253     ok = 1;
254     }
255     }
256     }
257 fabian 1.6 Context; /* a2 - Last context: tcluser.c/184 */
258 segfault 1.1 Tcl_AppendResult(irp, ok ? "1" : "0", NULL);
259     return TCL_OK;
260     }
261    
262 fabian 1.14 static int tcl_adduser STDVAR
263     {
264 fabian 1.6 Context;
265 fabian 1.7 BADARGS(3, 3, " handle ?hostmask?");
266 segfault 1.1 if (strlen(argv[1]) > HANDLEN)
267     argv[1][HANDLEN] = 0;
268     if ((argv[1][0] == '*') || get_user_by_handle(userlist, argv[1]))
269     Tcl_AppendResult(irp, "0", NULL);
270     else {
271     userlist = adduser(userlist, argv[1], argv[2], "-", default_flags);
272     Tcl_AppendResult(irp, "1", NULL);
273     }
274     return TCL_OK;
275     }
276    
277 fabian 1.14 static int tcl_addbot STDVAR
278     {
279 segfault 1.1 struct bot_addr *bi;
280     char *p, *q;
281    
282 fabian 1.6 Context;
283 segfault 1.1 BADARGS(3, 3, " handle address");
284     if (strlen(argv[1]) > HANDLEN)
285     argv[1][HANDLEN] = 0;
286     if (get_user_by_handle(userlist, argv[1]))
287     Tcl_AppendResult(irp, "0", NULL);
288     else if (argv[1][0] == '*')
289     Tcl_AppendResult(irp, "0", NULL);
290     else {
291     userlist = adduser(userlist, argv[1], "none", "-", USER_BOT);
292     bi = user_malloc(sizeof(struct bot_addr));
293     q = strchr(argv[2], ':');
294     if (!q) {
295     bi->address = user_malloc(strlen(argv[2]) + 1);
296     strcpy(bi->address, argv[2]);
297     bi->telnet_port = 3333;
298     bi->relay_port = 3333;
299     } else {
300     bi->address = user_malloc(q - argv[2] + 1);
301     strncpy(bi->address, argv[2], q - argv[2]);
302     bi->address[q - argv[2]] = 0;
303     p = q + 1;
304     bi->telnet_port = atoi(p);
305     q = strchr(p, '/');
306     if (!q)
307     bi->relay_port = bi->telnet_port;
308     else
309     bi->relay_port = atoi(q + 1);
310     }
311     set_user(&USERENTRY_BOTADDR, get_user_by_handle(userlist, argv[1]), bi);
312     Tcl_AppendResult(irp, "1", NULL);
313     }
314     return TCL_OK;
315     }
316    
317 fabian 1.14 static int tcl_deluser STDVAR
318     {
319 fabian 1.6 Context;
320 segfault 1.1 BADARGS(2, 2, " handle");
321     Tcl_AppendResult(irp, (argv[1][0] == '*') ? "0" :
322     int_to_base10(deluser(argv[1])), NULL);
323     return TCL_OK;
324     }
325    
326 fabian 1.14 static int tcl_delhost STDVAR
327     {
328 fabian 1.6 Context;
329 segfault 1.1 BADARGS(3, 3, " handle hostmask");
330     if ((!get_user_by_handle(userlist, argv[1])) || (argv[1][0] == '*')) {
331     Tcl_AppendResult(irp, "non-existent user", NULL);
332     return TCL_ERROR;
333     }
334     Tcl_AppendResult(irp, delhost_by_handle(argv[1], argv[2]) ? "1" : "0",
335     NULL);
336     return TCL_OK;
337     }
338    
339 fabian 1.14 static int tcl_userlist STDVAR
340     {
341 segfault 1.1 struct userrec *u = userlist;
342     struct flag_record user, plus, minus;
343     int ok = 1, f = 0;
344    
345 fabian 1.6 Context;
346 segfault 1.1 BADARGS(1, 3, " ?flags ?channel??");
347 fabian 1.4 if ((argc == 3) && !findchan_by_dname(argv[2])) {
348 segfault 1.1 Tcl_AppendResult(irp, "Invalid channel: ", argv[2], NULL);
349     return TCL_ERROR;
350     }
351     if (argc >= 2) {
352     plus.match = FR_GLOBAL | FR_CHAN | FR_BOT;
353     break_down_flags(argv[1], &plus, &minus);
354     f = (minus.global || minus.udef_global || minus.chan ||
355     minus.udef_chan || minus.bot);
356     }
357     minus.match = plus.match ^ (FR_AND | FR_OR);
358     while (u) {
359     if (argc >= 2) {
360     user.match = FR_GLOBAL | FR_CHAN | FR_BOT | (argc == 3 ? 0 : FR_ANYWH);
361     get_user_flagrec(u, &user, argv[2]); /* argv[2] == NULL for argc = 2 ;) */
362     if (flagrec_eq(&plus, &user) && !(f && flagrec_eq(&minus, &user)))
363     ok = 1;
364     else
365     ok = 0;
366     }
367     if (ok)
368     Tcl_AppendElement(interp, u->handle);
369     u = u->next;
370     }
371     return TCL_OK;
372     }
373    
374 fabian 1.14 static int tcl_save STDVAR
375     {
376 fabian 1.6 Context;
377 segfault 1.1 write_userfile(-1);
378     return TCL_OK;
379     }
380    
381 fabian 1.14 static int tcl_reload STDVAR
382     {
383 fabian 1.6 Context;
384 segfault 1.1 reload();
385     return TCL_OK;
386     }
387    
388 fabian 1.16 static int tcl_chhandle STDVAR
389 fabian 1.14 {
390 segfault 1.1 struct userrec *u;
391 fabian 1.2 char newhand[HANDLEN + 1];
392 segfault 1.1 int x = 1, i;
393    
394 fabian 1.6 Context;
395 segfault 1.1 BADARGS(3, 3, " oldnick newnick");
396     u = get_user_by_handle(userlist, argv[1]);
397     if (!u)
398     x = 0;
399     else {
400 fabian 1.2 strncpy(newhand, argv[2], HANDLEN);
401     newhand[HANDLEN] = 0;
402     for (i = 0; i < strlen(newhand); i++)
403     if ((newhand[i] <= 32) || (newhand[i] >= 127) || (newhand[i] == '@'))
404     newhand[i] = '?';
405     if (strchr(BADHANDCHARS, newhand[0]) != NULL)
406 segfault 1.1 x = 0;
407 fabian 1.2 else if (strlen(newhand) < 1)
408 segfault 1.1 x = 0;
409 fabian 1.2 else if (get_user_by_handle(userlist, newhand))
410 segfault 1.1 x = 0;
411 fabian 1.15 else if (!egg_strcasecmp(botnetnick, newhand) &&
412 fabian 1.3 (!(u->flags & USER_BOT) || nextbot (argv [1]) != -1))
413     x = 0;
414 fabian 1.2 else if (newhand[0] == '*')
415 segfault 1.1 x = 0;
416     }
417     if (x)
418 fabian 1.2 x = change_handle(u, newhand);
419 segfault 1.1
420     Tcl_AppendResult(irp, x ? "1" : "0", NULL);
421     return TCL_OK;
422     }
423    
424 fabian 1.14 static int tcl_getting_users STDVAR
425     {
426 segfault 1.1 int i;
427    
428 fabian 1.6 Context;
429 segfault 1.1 BADARGS(1, 1, "");
430     for (i = 0; i < dcc_total; i++) {
431     if ((dcc[i].type == &DCC_BOT) &&
432     (dcc[i].status & STAT_GETTING)) {
433     Tcl_AppendResult(irp, "1", NULL);
434     return TCL_OK;
435     }
436     }
437     Tcl_AppendResult(irp, "0", NULL);
438     return TCL_OK;
439     }
440    
441 fabian 1.14 static int tcl_isignore STDVAR
442     {
443 fabian 1.6 Context;
444 segfault 1.1 BADARGS(2, 2, " nick!user@host");
445     Tcl_AppendResult(irp, match_ignore(argv[1]) ? "1" : "0", NULL);
446     return TCL_OK;
447     }
448    
449 fabian 1.14 static int tcl_newignore STDVAR
450     {
451 segfault 1.1 time_t expire_time;
452     char ign[UHOSTLEN], cmt[66], from[HANDLEN + 1];
453    
454 fabian 1.6 Context;
455 segfault 1.1 BADARGS(4, 5, " hostmask creator comment ?lifetime?");
456 fabian 1.2 strncpy(ign, argv[1], UHOSTMAX);
457     ign[UHOSTMAX] = 0;
458 segfault 1.1 strncpy(from, argv[2], HANDLEN);
459     from[HANDLEN] = 0;
460     strncpy(cmt, argv[3], 65);
461     cmt[65] = 0;
462     if (argc == 4)
463     expire_time = now + (60 * ignore_time);
464     else {
465     if (atol(argv[4]) == 0)
466     expire_time = 0L;
467     else
468     expire_time = now + (60 * atol(argv[4]));
469     }
470     addignore(ign, from, cmt, expire_time);
471 fabian 1.9 dprintf(DP_SERVER, "SILENCE +%s\n", ign);
472 segfault 1.1 return TCL_OK;
473     }
474    
475 fabian 1.14 static int tcl_killignore STDVAR
476     {
477 fabian 1.6 Context;
478 segfault 1.1 BADARGS(2, 2, " hostmask");
479 fabian 1.9 dprintf(DP_SERVER, "SILENCE +%s\n", argv[1]);
480 segfault 1.1 Tcl_AppendResult(irp, delignore(argv[1]) ? "1" : "0", NULL);
481     return TCL_OK;
482     }
483    
484 fabian 1.14 /* { hostmask note expire-time create-time creator }
485     */
486     static int tcl_ignorelist STDVAR
487     {
488 segfault 1.1 struct igrec *i;
489     char ts[21], ts1[21], *list[5], *p;
490    
491 fabian 1.6 Context;
492 segfault 1.1 BADARGS(1, 1, "");
493     for (i = global_ign; i; i = i->next) {
494     list[0] = i->igmask;
495     list[1] = i->msg;
496     sprintf(ts, "%lu", i->expire);
497     list[2] = ts;
498     sprintf(ts1, "%lu", i->added);
499     list[3] = ts1;
500     list[4] = i->user;
501     p = Tcl_Merge(5, list);
502     Tcl_AppendElement(irp, p);
503 fabian 1.5 Tcl_Free((char *) p);
504 segfault 1.1 }
505     return TCL_OK;
506     }
507    
508 fabian 1.14 static int tcl_getuser STDVAR
509     {
510 segfault 1.1 struct user_entry_type *et;
511     struct userrec *u;
512     struct user_entry *e;
513    
514 fabian 1.6 Context;
515 segfault 1.1 BADARGS(3, 999, " handle type");
516 fabian 1.15 if (!(et = find_entry_type(argv[2])) && egg_strcasecmp(argv[2], "HANDLE")) {
517 segfault 1.1 Tcl_AppendResult(irp, "No such info type: ", argv[2], NULL);
518     return TCL_ERROR;
519     }
520     if (!(u = get_user_by_handle(userlist, argv[1]))) {
521     if (argv[1][0] != '*') {
522     Tcl_AppendResult(irp, "No such user.", NULL);
523     return TCL_ERROR;
524     } else
525     return TCL_OK; /* silently ignore user * */
526     }
527 fabian 1.15 if (!egg_strcasecmp(argv[2], "HANDLE")) {
528 fabian 1.10 Tcl_AppendResult(irp,u->handle, NULL);
529     } else {
530 segfault 1.1 e = find_user_entry(et, u);
531    
532     if (e)
533     return et->tcl_get(irp, u, e, argc, argv);
534 fabian 1.10 }
535 segfault 1.1 return TCL_OK;
536     }
537    
538 fabian 1.14 static int tcl_setuser STDVAR
539     {
540 segfault 1.1 struct user_entry_type *et;
541     struct userrec *u;
542     struct user_entry *e;
543     int r;
544    
545 fabian 1.6 Context;
546 segfault 1.1 BADARGS(3, 999, " handle type ?setting....?");
547     if (!(et = find_entry_type(argv[2]))) {
548     Tcl_AppendResult(irp, "No such info type: ", argv[2], NULL);
549     return TCL_ERROR;
550     }
551     if (!(u = get_user_by_handle(userlist, argv[1]))) {
552     if (argv[1][0] != '*') {
553     Tcl_AppendResult(irp, "No such user.", NULL);
554     return TCL_ERROR;
555     } else
556 fabian 1.14 return TCL_OK; /* Silently ignore user * */
557 segfault 1.1 }
558     if (!(e = find_user_entry(et, u))) {
559     e = user_malloc(sizeof(struct user_entry));
560    
561     e->type = et;
562     e->name = NULL;
563     e->u.list = NULL;
564     list_insert((&(u->entries)), e);
565     }
566     r = et->tcl_set(irp, u, e, argc, argv);
567 fabian 1.14 /* Yeah... e is freed, and we read it... (tcl: setuser hand HOSTS none) */
568 segfault 1.1 if (!e->u.list) {
569     if (list_delete((struct list_type **) &(u->entries),
570     (struct list_type *) e))
571     nfree(e);
572     /* else maybe already freed... (entry_type==HOSTS) <drummer> */
573     }
574     return r;
575     }
576    
577     tcl_cmds tcluser_cmds[] =
578     {
579 fabian 1.14 {"countusers", tcl_countusers},
580     {"validuser", tcl_validuser},
581     {"finduser", tcl_finduser},
582     {"passwdok", tcl_passwdOk},
583     {"chattr", tcl_chattr},
584     {"botattr", tcl_botattr},
585     {"matchattr", tcl_matchattr},
586     {"matchchanattr", tcl_matchattr},
587     {"adduser", tcl_adduser},
588     {"addbot", tcl_addbot},
589     {"deluser", tcl_deluser},
590     {"delhost", tcl_delhost},
591     {"userlist", tcl_userlist},
592     {"save", tcl_save},
593     {"reload", tcl_reload},
594 fabian 1.16 {"chhandle", tcl_chhandle},
595     {"chnick", tcl_chhandle},
596 fabian 1.14 {"getting-users", tcl_getting_users},
597     {"isignore", tcl_isignore},
598     {"newignore", tcl_newignore},
599     {"killignore", tcl_killignore},
600     {"ignorelist", tcl_ignorelist},
601     {"getuser", tcl_getuser},
602     {"setuser", tcl_setuser},
603     {NULL, NULL}
604 segfault 1.1 };

webmaster@eggheads.org
ViewVC Help
Powered by ViewVC 1.1.23