/* tcl.c -- handles: the code for every command eggdrop adds to Tcl Tcl initialization getting and setting Tcl/eggdrop variables dprintf'ized, 4feb96 */ #if HAVE_CONFIG_H #include #endif #include #include #include #include #include "../lush.h" #include "eggdrop.h" #include "proto.h" #include "cmdt.h" #include "tclegg.h" /* eggdrop always uses the same interpreter */ Tcl_Interp *interp; extern int curserv, serv, backgrd; extern int shtime, require_x, learn_users, share_users, use_info, passive, strict_host, require_p, isolate, keep_all_logs, copy_to_tmp, use_stderr, upload_to_cd, never_give_up, allow_new_telnets, keepnick; extern int telnet_port, botserverport, min_servs, default_flags, conmask, newserverport, dcc_block, dcc_limit, dcc_maxsize, dcc_users, save_users_at, switch_logfiles_at, telnet_bots_only, server_timeout, connect_timeout, firewallport, reserved_port; extern char *logfile[]; extern char *logchan[]; extern int logmask[]; extern int flood_thr, flood_pub_thr, flood_join_thr, ban_time, ignore_time, flood_ctcp_thr, flood_time, flood_pub_time, flood_join_time, flood_ctcp_time; extern char botname[], origbotname[], botuser[], botrealname[], botserver[], dccdir[], dccin[], motdfile[], admin[], userfile[], filedb_path[], helpdir[], initserver[], notify_new[], notefile[], hostname[], myip[], botuserhost[], tempdir[], newserver[], textdir[], ctcp_version[], ctcp_finger[], ctcp_userinfo[], owner[], newserverpass[], newbotname[], altnick[], firewall[]; extern char flag1, flag2, flag3, flag4, flag5, flag6, flag7, flag8, flag9, flag0; extern char cx_file[]; extern int cx_line; extern int online; extern struct eggqueue *serverlist; extern struct dcc_t dcc[]; extern int dcc_total; extern char egg_version[]; extern tcl_timer_t *timer,*utimer; /* prototypes for tcl */ Tcl_Interp *Tcl_CreateInterp(); int expmem_tcl() { int i,tot=0; for (i=0; i ] */ int tcl_logfile STDVAR { int i; char s[151]; BADARGS(1,4," ?logModes channel logFile?"); if (argc==1) { /* they just want a list of the logfiles and modes */ for (i=0; iresult); return; } for (i=0; i' */ curserv=(-1); n_free(list,"",0); if (botserver[0]) next_server(&curserv,botserver,&botserverport,""); } /* weird, weird, weird... */ void set_tcl_servers() { Tcl_DString ds; char *slist; struct eggqueue *q; Tcl_DStringInit(&ds); q=serverlist; while (q!=NULL) { Tcl_DStringAppendElement(&ds,q->item); q=q->next; } slist=Tcl_DStringValue(&ds); Tcl_SetVar(interp,"servers",slist,TCL_GLOBAL_ONLY); Tcl_DStringFree(&ds); } void tcl_bool(var,val) char *var; int *val; { char *s; s=Tcl_GetVar(interp,var,TCL_GLOBAL_ONLY); if (s!=NULL) { if (Tcl_ExprBoolean(interp,s,val)==TCL_ERROR) { putlog(LOG_MISC,"*","Tcl error evaluating %s:",var); putlog(LOG_MISC,"*","%s",interp->result); } } } void tcl_setbool(var,val) char *var; int val; { char s[2]; s[1]=0; s[0]=(val?'1':'0'); Tcl_SetVar(interp,var,s,TCL_GLOBAL_ONLY); } void tcl_int(var,val) char *var; int *val; { char *s; long l; s=Tcl_GetVar(interp,var,TCL_GLOBAL_ONLY); if (s!=NULL) { if (Tcl_ExprLong(interp,s,&l)==TCL_ERROR) { putlog(LOG_MISC,"*","Tcl error evaluating %s:",var); putlog(LOG_MISC,"*","%s",interp->result); } } *val=(int)l; } void tcl_setint(var,val) char *var; int val; { char s[40]; sprintf(s,"%d",val); Tcl_SetVar(interp,var,s,TCL_GLOBAL_ONLY); } void tcl_str(var,val,max) char *var,*val; int max; { char *s; s=Tcl_GetVar(interp,var,TCL_GLOBAL_ONLY); if (s!=NULL) { if (strlen(s)>max) s[max]=0; strcpy(val,s); } } void tcl_setstr(var,val) char *var,*val; { Tcl_SetVar(interp,var,val,TCL_GLOBAL_ONLY); } void tcl_char(var,val) char *var,*val; { char *s; s=Tcl_GetVar(interp,var,TCL_GLOBAL_ONLY); if (s!=NULL) *val=s[0]; } void tcl_setchar(var,val) char *var,val; { char s[2]; s[0]=val; s[1]=0; Tcl_SetVar(interp,var,s,TCL_GLOBAL_ONLY); } void protect_tcl() { Tcl_TraceVar(interp,"owner",TCL_TRACE_WRITES|TCL_TRACE_UNSETS, tcl_readonly,(ClientData)&owner); Tcl_TraceVar(interp,"userfile",TCL_TRACE_WRITES|TCL_TRACE_UNSETS, tcl_readonly,(ClientData)&userfile); } void unprotect_tcl() { Tcl_UntraceVar(interp,"owner",TCL_TRACE_WRITES|TCL_TRACE_UNSETS, tcl_readonly,(ClientData)&owner); Tcl_UntraceVar(interp,"userfile",TCL_TRACE_WRITES|TCL_TRACE_UNSETS, tcl_readonly,(ClientData)&userfile); } /* not going through Tcl's crazy main() system (what on earth was he smoking?!) so we gotta initialize the Tcl interpreter */ void init_tcl() { /* initialize the interpreter */ context; interp=Tcl_CreateInterp(); Tcl_Init(interp); init_hash(); init_builtins(); /* see note (1) at the bottom of this file */ /* Tcl_DeleteCommand(interp,"exec"); */ /* put traces on the 10 flag variables */ tcl_setchar("flag1",flag1); tcl_setchar("flag2",flag2); tcl_setchar("flag3",flag3); tcl_setchar("flag4",flag4); tcl_setchar("flag5",flag5); tcl_setchar("flag6",flag6); tcl_setchar("flag7",flag7); tcl_setchar("flag8",flag8); tcl_setchar("flag9",flag9); tcl_setchar("flag0",flag0); Tcl_TraceVar(interp,"flag1",TCL_TRACE_WRITES,tcl_chflag,(ClientData)1); Tcl_TraceVar(interp,"flag2",TCL_TRACE_WRITES,tcl_chflag,(ClientData)2); Tcl_TraceVar(interp,"flag3",TCL_TRACE_WRITES,tcl_chflag,(ClientData)3); Tcl_TraceVar(interp,"flag4",TCL_TRACE_WRITES,tcl_chflag,(ClientData)4); Tcl_TraceVar(interp,"flag5",TCL_TRACE_WRITES,tcl_chflag,(ClientData)5); Tcl_TraceVar(interp,"flag6",TCL_TRACE_WRITES,tcl_chflag,(ClientData)6); Tcl_TraceVar(interp,"flag7",TCL_TRACE_WRITES,tcl_chflag,(ClientData)7); Tcl_TraceVar(interp,"flag8",TCL_TRACE_WRITES,tcl_chflag,(ClientData)8); Tcl_TraceVar(interp,"flag9",TCL_TRACE_WRITES,tcl_chflag,(ClientData)9); Tcl_TraceVar(interp,"flag0",TCL_TRACE_WRITES,tcl_chflag,(ClientData)0); Tcl_TraceVar(interp,"version",TCL_TRACE_WRITES|TCL_TRACE_UNSETS, tcl_readonly,(ClientData)&egg_version); /* add new commands */ Tcl_CreateCommand(interp,"logfile",tcl_logfile,NULL,NULL); Tcl_CreateCommand(interp,"putserv",tcl_putserv,NULL,NULL); Tcl_CreateCommand(interp,"puthelp",tcl_puthelp,NULL,NULL); Tcl_CreateCommand(interp,"putdcc",tcl_putdcc,NULL,NULL); Tcl_CreateCommand(interp,"putlog",tcl_putlog,NULL,NULL); Tcl_CreateCommand(interp,"putcmdlog",tcl_putcmdlog,NULL,NULL); Tcl_CreateCommand(interp,"putxferlog",tcl_putxferlog,NULL,NULL); Tcl_CreateCommand(interp,"putloglev",tcl_putloglev,NULL,NULL); Tcl_CreateCommand(interp,"countusers",tcl_countusers,NULL,NULL); Tcl_CreateCommand(interp,"validuser",tcl_validuser,NULL,NULL); Tcl_CreateCommand(interp,"finduser",tcl_finduser,NULL,NULL); Tcl_CreateCommand(interp,"passwdOk",tcl_passwdOk,NULL,NULL); Tcl_CreateCommand(interp,"passwdok",tcl_passwdOk,NULL,NULL); Tcl_CreateCommand(interp,"chattr",tcl_chattr,NULL,NULL); Tcl_CreateCommand(interp,"matchattr",tcl_matchattr,NULL,NULL); Tcl_CreateCommand(interp,"botisop",tcl_botisop,NULL,NULL); Tcl_CreateCommand(interp,"isop",tcl_isop,NULL,NULL); Tcl_CreateCommand(interp,"isvoice",tcl_isvoice,NULL,NULL); Tcl_CreateCommand(interp,"onchan",tcl_onchan,NULL,NULL); Tcl_CreateCommand(interp,"handonchan",tcl_handonchan,NULL,NULL); Tcl_CreateCommand(interp,"ischanban",tcl_ischanban,NULL,NULL); Tcl_CreateCommand(interp,"getchanhost",tcl_getchanhost,NULL,NULL); Tcl_CreateCommand(interp,"onchansplit",tcl_onchansplit,NULL,NULL); Tcl_CreateCommand(interp,"chanlist",tcl_chanlist,NULL,NULL); Tcl_CreateCommand(interp,"bind",tcl_bind,(ClientData)0,NULL); Tcl_CreateCommand(interp,"unbind",tcl_bind,(ClientData)1,NULL); Tcl_CreateCommand(interp,"adduser",tcl_adduser,NULL,NULL); Tcl_CreateCommand(interp,"addbot",tcl_addbot,NULL,NULL); Tcl_CreateCommand(interp,"deluser",tcl_deluser,NULL,NULL); Tcl_CreateCommand(interp,"maskhost",tcl_maskhost,NULL,NULL); Tcl_CreateCommand(interp,"dccsimul",tcl_dccsimul,NULL,NULL); Tcl_CreateCommand(interp,"addhost",tcl_addhost,NULL,NULL); Tcl_CreateCommand(interp,"delhost",tcl_delhost,NULL,NULL); Tcl_CreateCommand(interp,"timer",tcl_timer,NULL,NULL); Tcl_CreateCommand(interp,"killtimer",tcl_killtimer,NULL,NULL); Tcl_CreateCommand(interp,"utimer",tcl_utimer,NULL,NULL); Tcl_CreateCommand(interp,"killutimer",tcl_killutimer,NULL,NULL); Tcl_CreateCommand(interp,"unixtime",tcl_unixtime,NULL,NULL); Tcl_CreateCommand(interp,"time",tcl_time,NULL,NULL); Tcl_CreateCommand(interp,"date",tcl_date,NULL,NULL); Tcl_CreateCommand(interp,"getinfo",tcl_getinfo,NULL,NULL); Tcl_CreateCommand(interp,"getaddr",tcl_getaddr,NULL,NULL); Tcl_CreateCommand(interp,"getdccdir",tcl_getdccdir,NULL,NULL); Tcl_CreateCommand(interp,"getcomment",tcl_getcomment,NULL,NULL); Tcl_CreateCommand(interp,"getemail",tcl_getemail,NULL,NULL); Tcl_CreateCommand(interp,"getxtra",tcl_getxtra,NULL,NULL); Tcl_CreateCommand(interp,"setinfo",tcl_setinfo,NULL,NULL); Tcl_CreateCommand(interp,"setdccdir",tcl_setdccdir,NULL,NULL); Tcl_CreateCommand(interp,"setcomment",tcl_setcomment,NULL,NULL); Tcl_CreateCommand(interp,"setemail",tcl_setemail,NULL,NULL); Tcl_CreateCommand(interp,"setxtra",tcl_setxtra,NULL,NULL); Tcl_CreateCommand(interp,"delban",tcl_delban,NULL,NULL); Tcl_CreateCommand(interp,"delglban",tcl_delglban,NULL,NULL); Tcl_CreateCommand(interp,"isban",tcl_isban,NULL,NULL); Tcl_CreateCommand(interp,"ispermban",tcl_ispermban,NULL,NULL); Tcl_CreateCommand(interp,"matchban",tcl_matchban,NULL,NULL); Tcl_CreateCommand(interp,"addban",tcl_addban,NULL,NULL); Tcl_CreateCommand(interp,"addglban",tcl_addglban,NULL,NULL); Tcl_CreateCommand(interp,"getlaston",tcl_getlaston,NULL,NULL); Tcl_CreateCommand(interp,"setlaston",tcl_setlaston,NULL,NULL); Tcl_CreateCommand(interp,"timers",tcl_timers,NULL,NULL); Tcl_CreateCommand(interp,"utimers",tcl_utimers,NULL,NULL); Tcl_CreateCommand(interp,"jump",tcl_jump,NULL,NULL); Tcl_CreateCommand(interp,"ctime",tcl_ctime,NULL,NULL); Tcl_CreateCommand(interp,"myip",tcl_myip,NULL,NULL); Tcl_CreateCommand(interp,"dccsend",tcl_dccsend,NULL,NULL); Tcl_CreateCommand(interp,"rand",tcl_rand,NULL,NULL); Tcl_CreateCommand(interp,"dccbroadcast",tcl_dccbroadcast,NULL,NULL); Tcl_CreateCommand(interp,"hand2idx",tcl_hand2idx,NULL,NULL); Tcl_CreateCommand(interp,"getidx",tcl_hand2idx,NULL,NULL); Tcl_CreateCommand(interp,"idx2hand",tcl_idx2hand,NULL,NULL); Tcl_CreateCommand(interp,"getchan",tcl_getchan,NULL,NULL); Tcl_CreateCommand(interp,"setchan",tcl_setchan,NULL,NULL); Tcl_CreateCommand(interp,"dccputchan",tcl_dccputchan,NULL,NULL); Tcl_CreateCommand(interp,"console",tcl_console,NULL,NULL); Tcl_CreateCommand(interp,"echo",tcl_echo,NULL,NULL); Tcl_CreateCommand(interp,"control",tcl_control,NULL,NULL); Tcl_CreateCommand(interp,"putbot",tcl_putbot,NULL,NULL); Tcl_CreateCommand(interp,"putallbots",tcl_putallbots,NULL,NULL); Tcl_CreateCommand(interp,"getchanidle",tcl_getchanidle,NULL,NULL); Tcl_CreateCommand(interp,"killdcc",tcl_killdcc,NULL,NULL); Tcl_CreateCommand(interp,"userlist",tcl_userlist,NULL,NULL); Tcl_CreateCommand(interp,"sendnote",tcl_sendnote,NULL,NULL); Tcl_CreateCommand(interp,"save",tcl_save,NULL,NULL); Tcl_CreateCommand(interp,"reload",tcl_reload,NULL,NULL); Tcl_CreateCommand(interp,"bots",tcl_bots,NULL,NULL); Tcl_CreateCommand(interp,"chanbans",tcl_chanbans,NULL,NULL); Tcl_CreateCommand(interp,"gethosts",tcl_gethosts,NULL,NULL); Tcl_CreateCommand(interp,"nick2hand",tcl_nick2hand,NULL,NULL); Tcl_CreateCommand(interp,"hand2nick",tcl_hand2nick,NULL,NULL); Tcl_CreateCommand(interp,"getdccidle",tcl_getdccidle,NULL,NULL); Tcl_CreateCommand(interp,"dcclist",tcl_dcclist,NULL,NULL); Tcl_CreateCommand(interp,"dccused",tcl_dccused,NULL,NULL); Tcl_CreateCommand(interp,"getfileq",tcl_getfileq,NULL,NULL); Tcl_CreateCommand(interp,"chpass",tcl_chpass,NULL,NULL); Tcl_CreateCommand(interp,"chnick",tcl_chhandle,NULL,NULL); Tcl_CreateCommand(interp,"chhandle",tcl_chhandle,NULL,NULL); Tcl_CreateCommand(interp,"link",tcl_link,NULL,NULL); Tcl_CreateCommand(interp,"unlink",tcl_unlink,NULL,NULL); Tcl_CreateCommand(interp,"channel",tcl_channel,NULL,NULL); Tcl_CreateCommand(interp,"banlist",tcl_banlist,NULL,NULL); Tcl_CreateCommand(interp,"channels",tcl_channels,NULL,NULL); Tcl_CreateCommand(interp,"getting-users",tcl_getting_users,NULL,NULL); Tcl_CreateCommand(interp,"getdesc",tcl_getdesc,NULL,NULL); Tcl_CreateCommand(interp,"getowner",tcl_getowner,NULL,NULL); Tcl_CreateCommand(interp,"setdesc",tcl_setdesc,NULL,NULL); Tcl_CreateCommand(interp,"setowner",tcl_setowner,NULL,NULL); Tcl_CreateCommand(interp,"getgots",tcl_getgots,NULL,NULL); Tcl_CreateCommand(interp,"getpwd",tcl_getpwd,NULL,NULL); Tcl_CreateCommand(interp,"setpwd",tcl_setpwd,NULL,NULL); Tcl_CreateCommand(interp,"getlink",tcl_getlink,NULL,NULL); Tcl_CreateCommand(interp,"setlink",tcl_setlink,NULL,NULL); Tcl_CreateCommand(interp,"getfiles",tcl_getfiles,NULL,NULL); Tcl_CreateCommand(interp,"getdirs",tcl_getdirs,NULL,NULL); Tcl_CreateCommand(interp,"hide",tcl_hide,NULL,NULL); Tcl_CreateCommand(interp,"unhide",tcl_unhide,NULL,NULL); Tcl_CreateCommand(interp,"share",tcl_share,NULL,NULL); Tcl_CreateCommand(interp,"unshare",tcl_unshare,NULL,NULL); Tcl_CreateCommand(interp,"filesend",tcl_filesend,NULL,NULL); Tcl_CreateCommand(interp,"assoc",tcl_assoc,NULL,NULL); Tcl_CreateCommand(interp,"killassoc",tcl_killassoc,NULL,NULL); Tcl_CreateCommand(interp,"getchanmode",tcl_getchanmode,NULL,NULL); Tcl_CreateCommand(interp,"pushmode",tcl_pushmode,NULL,NULL); Tcl_CreateCommand(interp,"flushmode",tcl_flushmode,NULL,NULL); Tcl_CreateCommand(interp,"encrypt",tcl_encrypt,NULL,NULL); Tcl_CreateCommand(interp,"decrypt",tcl_decrypt,NULL,NULL); Tcl_CreateCommand(interp,"addignore",tcl_addignore,NULL,NULL); Tcl_CreateCommand(interp,"addpermignore",tcl_addpermignore,NULL,NULL); Tcl_CreateCommand(interp,"delignore",tcl_delignore,NULL,NULL); Tcl_CreateCommand(interp,"isignore",tcl_isignore,NULL,NULL); Tcl_CreateCommand(interp,"getdccaway",tcl_getdccaway,NULL,NULL); Tcl_CreateCommand(interp,"setdccaway",tcl_setdccaway,NULL,NULL); Tcl_CreateCommand(interp,"connect",tcl_connect,NULL,NULL); Tcl_CreateCommand(interp,"newchanban",tcl_newchanban,NULL,NULL); Tcl_CreateCommand(interp,"newban",tcl_newban,NULL,NULL); Tcl_CreateCommand(interp,"killchanban",tcl_killchanban,NULL,NULL); Tcl_CreateCommand(interp,"killban",tcl_killban,NULL,NULL); Tcl_CreateCommand(interp,"newignore",tcl_newignore,NULL,NULL); Tcl_CreateCommand(interp,"killignore",tcl_killignore,NULL,NULL); Tcl_CreateCommand(interp,"ignorelist",tcl_ignorelist,NULL,NULL); Tcl_CreateCommand(interp,"whom",tcl_whom,NULL,NULL); Tcl_CreateCommand(interp,"dumpfile",tcl_dumpfile,NULL,NULL); Tcl_CreateCommand(interp,"dccdumpfile",tcl_dccdumpfile,NULL,NULL); } /* set Tcl variables to match eggdrop internal variables */ void set_tcl_vars() { char s[121]; set_tcl_servers(); /* on/off variables */ tcl_setbool("log-time",shtime); tcl_setbool("learn-users",learn_users); tcl_setbool("require-x",require_x); tcl_setbool("require-p",require_p); tcl_setbool("use-info",use_info); tcl_setbool("share-users",share_users); tcl_setbool("passive",passive); tcl_setbool("strict-host",strict_host); tcl_setbool("isolate",isolate); tcl_setbool("keep-all-logs",keep_all_logs); tcl_setbool("upload-to-cd",upload_to_cd); tcl_setbool("never-give-up",never_give_up); tcl_setbool("open-telnets",allow_new_telnets); tcl_setbool("keep-nick",keepnick); tcl_setbool("copy-to-tmp",copy_to_tmp); tcl_setbool("telnet-bots-only",telnet_bots_only); /* numbers */ tcl_setint("telnet",telnet_port); tcl_setint("servlimit",min_servs); tcl_setint("ban-time",ban_time); tcl_setint("ignore-time",ignore_time); tcl_setint("dcc-limit",dcc_limit); tcl_setint("dcc-block",dcc_block); tcl_setint("dcc-maxsize",dcc_maxsize); tcl_setint("dcc-users",dcc_users); tcl_setint("save-users-at",save_users_at); tcl_setint("switch-logfiles-at",switch_logfiles_at); tcl_setint("server-timeout",server_timeout); tcl_setint("connect-timeout",connect_timeout); tcl_setint("reserved-port",reserved_port); /* strings */ tcl_setstr("nick",origbotname); tcl_setstr("altnick",altnick); tcl_setstr("username",botuser); tcl_setstr("realname",botrealname); tcl_setstr("userfile",userfile); tcl_setstr("dcc-path",dccdir); tcl_setstr("dcc-incoming",dccin); tcl_setstr("motd",motdfile); tcl_setstr("admin",admin); tcl_setstr("init-server",initserver); tcl_setstr("notefile",notefile); tcl_setstr("helpdir",helpdir); tcl_setstr("tempdir",tempdir); tcl_setstr("textdir",textdir); tcl_setstr("notify-newusers",notify_new); tcl_setstr("ctcp-version",ctcp_version); tcl_setstr("ctcp-finger",ctcp_finger); tcl_setstr("ctcp-userinfo",ctcp_userinfo); tcl_setstr("owner",owner); tcl_setstr("filedb-path",filedb_path); tcl_setstr("my-hostname",hostname); tcl_setstr("my-ip",myip); /* weird */ strcpy(s,masktype(conmask)); tcl_setstr("console",s); flags2str(default_flags,s); tcl_setstr("default-flags",s); if (firewall[0]) sprintf(s,"%s:%d",firewall,firewallport); else s[0]=0; tcl_setstr("firewall",s); sprintf(s,"%d:%d",flood_thr,flood_time); tcl_setstr("flood-msg",s); sprintf(s,"%d:%d",flood_pub_thr,flood_pub_time); tcl_setstr("flood-chan",s); sprintf(s,"%d:%d",flood_join_thr,flood_join_time); tcl_setstr("flood-join",s); sprintf(s,"%d:%d",flood_ctcp_thr,flood_ctcp_time); tcl_setstr("flood-ctcp",s); /* variables that we won't re-read... only for convenience of scripts */ tcl_setstr("botnick",botname); sprintf(s,"%s:%d",botserver,botserverport); tcl_setstr("server",s); sprintf(s,"%s!%s",botname,botuserhost); tcl_setstr("botname",s); tcl_setstr("version",egg_version); /* cos we have to: */ tcl_setstr("tcl_interactive","0"); } /* set eggdrop internal variables to match Tcl variables */ void get_tcl_vars() { char s[120],s1[20]; int oldisol; get_tcl_servers(); /* on/off variables: */ tcl_bool("log-time",&shtime); tcl_bool("learn-users",&learn_users); tcl_bool("require-x",&require_x); tcl_bool("require-p",&require_p); tcl_bool("use-info",&use_info); tcl_bool("share-users",&share_users); tcl_bool("passive",&passive); tcl_bool("strict-host",&strict_host); oldisol=isolate; tcl_bool("isolate",&isolate); if ((isolate) && (!oldisol) && (online)) { /* suddenly isolating now */ chatout("*** Party line is now isolated.\n"); tandout("chat %s Isolating my party line.\n",origbotname); } if ((!isolate) && (oldisol) && (online)) { chatout("*** Party line is now open.\n"); tandout("chat %s Merging my party line.\n",origbotname); } tcl_bool("keep-all-logs",&keep_all_logs); tcl_bool("upload-to-cd",&upload_to_cd); tcl_bool("never-give-up",&never_give_up); tcl_bool("open-telnets",&allow_new_telnets); tcl_bool("keep-nick",&keepnick); tcl_bool("copy-to-tmp",©_to_tmp); tcl_bool("telnet-bots-only",&telnet_bots_only); /* numbers */ oldisol=telnet_port; tcl_int("telnet",&telnet_port); tcl_int("servlimit",&min_servs); tcl_int("ban-time",&ban_time); tcl_int("ignore-time",&ignore_time); tcl_int("dcc-limit",&dcc_limit); tcl_int("dcc-block",&dcc_block); tcl_int("dcc-maxsize",&dcc_maxsize); tcl_int("dcc-users",&dcc_users); tcl_int("save-users-at",&save_users_at); tcl_int("switch-logfiles-at",&switch_logfiles_at); tcl_int("server-timeout",&server_timeout); tcl_int("connect-timeout",&connect_timeout); tcl_int("reserved-port",&reserved_port); /* strings */ strcpy(s,origbotname); tcl_str("nick",origbotname,9); if ((s[0]) && (strcasecmp(origbotname,s)!=0)) { /* trying to change bot's nickname */ if (get_tands() > 0) { putlog(LOG_MISC,"*","* Tried to change my nickname, but I'm still linked to a botnet."); putlog(LOG_MISC,"*","* (Unlink and try again.)"); strcpy(origbotname,s); } else { putlog(LOG_MISC,"*","* IDENTITY CHANGE: %s -> %s",s,origbotname); /* start all over with nick chasing: */ strcpy(botname,origbotname); newbotname[0]=0; if (serv>=0) tprintf(serv,"NICK %s\n",botname); } } tcl_str("altnick",altnick,9); tcl_str("username",botuser,10); tcl_str("realname",botrealname,80); tcl_str("userfile",userfile,120); tcl_str("dcc-path",dccdir,120); if (dccdir[0]) if (dccdir[strlen(dccdir)-1]!='/') strcat(dccdir,"/"); tcl_str("dcc-incoming",dccin,120); if (dccin[0]) if (dccin[strlen(dccin)-1]!='/') strcat(dccin,"/"); tcl_str("motd",motdfile,120); tcl_str("admin",admin,120); tcl_str("init-server",initserver,120); tcl_str("notefile",notefile,120); tcl_str("helpdir",helpdir,120); if (helpdir[0]) if (helpdir[strlen(helpdir)-1]!='/') strcat(helpdir,"/"); tcl_str("tempdir",tempdir,120); if (tempdir[0]) if (tempdir[strlen(tempdir)-1]!='/') strcat(tempdir,"/"); tcl_str("textdir",textdir,120); if (textdir[0]) { if (textdir[strlen(textdir)-1]!='/') strcat(textdir,"/"); } else strcpy(textdir,helpdir); tcl_str("filedb-path",filedb_path,120); if (filedb_path[0]) { if (filedb_path[strlen(filedb_path)-1]!='/') strcat(filedb_path,"/"); } tcl_str("notify-newusers",notify_new,120); tcl_str("ctcp-version",ctcp_version,120); tcl_str("ctcp-finger",ctcp_finger,120); tcl_str("ctcp-userinfo",ctcp_userinfo,120); tcl_str("owner",owner,120); tcl_str("my-hostname",hostname,120); tcl_str("my-ip",myip,120); /* wait till after loading hostname! */ if (telnet_port!=oldisol) change_telnet_port(); /* weird ones */ s[0]=0; tcl_str("console",s,20); if (s[0]) conmask=logmodes(s); else conmask=LOG_MODES|LOG_MISC|LOG_CMDS; s[0]=0; tcl_str("default-flags",s,20); default_flags=str2flags(s); tcl_str("firewall",s,121); if (s[0]) { splitc(firewall,s,':'); if (!firewall[0]) strcpy(firewall,s); else firewallport=atoi(s); } else firewall[0]=0; tcl_str("flood-msg",s,20); if (s[0]) { splitc(s1,s,':'); if (s1[0]) { flood_thr=atoi(s1); flood_time=atoi(s); } else flood_thr=atoi(s); } tcl_str("flood-chan",s,20); if (s[0]) { splitc(s1,s,':'); if (s1[0]) { flood_pub_thr=atoi(s1); flood_pub_time=atoi(s); } else flood_pub_thr=atoi(s); } tcl_str("flood-join",s,20); if (s[0]) { splitc(s1,s,':'); if (s1[0]) { flood_join_thr=atoi(s1); flood_join_time=atoi(s); } else flood_join_thr=atoi(s); } tcl_str("flood-ctcp",s,20); if (s[0]) { splitc(s1,s,':'); if (s1[0]) { flood_ctcp_thr=atoi(s1); flood_ctcp_time=atoi(s); } else flood_ctcp_thr=atoi(s); } } /* evaluate a Tcl command, send output to a dcc user */ void cmd_tcl(idx,msg) int idx; char *msg; { int code; context; set_tcl_vars(); code=Tcl_Eval(interp,msg); if (code==TCL_OK) dumplots(idx,"Tcl: ",interp->result); else dprintf(idx,"TCL error: %s\n",interp->result); /* refresh internal vars */ get_tcl_vars(); } /* perform a 'set' command */ void cmd_set(idx,msg) int idx; char *msg; { int code; char s[512]; context; putlog(LOG_CMDS,"*","#%s# set %s",dcc[idx].nick,msg); set_tcl_vars(); strcpy(s,"set "); strcat(s,msg); if (!msg[0]) { strcpy(s,"info globals"); Tcl_Eval(interp,s); dumplots(idx,"global vars: ",interp->result); return; } code=Tcl_Eval(interp,s); if (code==TCL_OK) { if (strchr(msg,' ')==NULL) dumplots(idx,"currently: ",interp->result); else dprintf(idx,"Ok, set.\n"); } else dprintf(idx,"Error: %s\n",interp->result); get_tcl_vars(); } void do_tcl(whatzit,script) char *whatzit,*script; { int code; #ifdef EBUG_TCL FILE *f=fopen("DEBUG.TCL","a"); if (f!=NULL) fprintf(f,"eval: %s\n",script); #endif set_tcl_vars(); code=Tcl_Eval(interp,script); #ifdef EBUG_TCL if (f!=NULL) { fprintf(f,"done eval, result=%d\n",code); fclose(f); } #endif if (code!=TCL_OK) { putlog(LOG_MISC,"*","Tcl error in script for '%s':",whatzit); putlog(LOG_MISC,"*","%s",interp->result); } get_tcl_vars(); } /* read and interpret the configfile given */ /* return 1 if everything was okay */ int readtclprog(fname) char *fname; { int code; FILE *f; set_tcl_vars(); f=fopen(fname,"r"); if (f==NULL) return 0; fclose(f); #ifdef EBUG_TCL f=fopen("DEBUG.TCL","a"); if (f!=NULL) { fprintf(f,"Sourcing file %s ...\n"); fclose(f); } #endif code=Tcl_EvalFile(interp,fname); if (code!=TCL_OK) { if (use_stderr) { tprintf(STDERR,"Tcl error in file '%s':\n",fname); tprintf(STDERR,"%s\n",Tcl_GetVar(interp,"errorInfo",TCL_GLOBAL_ONLY)); } else { putlog(LOG_MISC,"*","Tcl error in file '%s':",fname); putlog(LOG_MISC,"*","%s\n",Tcl_GetVar(interp,"errorInfo",TCL_GLOBAL_ONLY)); } /* try to go on anyway (shrug) */ } /* refresh internal variables */ get_tcl_vars(); return 1; } void warn_obsolete(s) char *s; { static warned=0; if (warned) return; putlog(LOG_MISC,"*","Obsolete Tcl command '%s' used (the script %s)", s,"should be updated soon, as this command will soon vanish"); warned++; } /* note (1): the tcl 'exec' command is no longer removed, since it is assumed that the tcl command will be left at its default flag requirement, ie: only owners can do tcl commands directly. also, removing the 'exec' command doesn't block up all holes -- tcl allows you to open a "pipe" which really just executes a shell command and redirects output. so you were never truly safe anyway. gee. */