|
|
1.1 ! root 1: /* execfunc.cpp */ ! 2: ! 3: /* Hi-level command shell/module routines (functions) */ ! 4: ! 5: /* $Id: execfunc.cpp,v 1.11 2000/12/11 23:21:11 rswindell Exp $ */ ! 6: ! 7: /**************************************************************************** ! 8: * @format.tab-size 4 (Plain Text/Source Code File Header) * ! 9: * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * ! 10: * * ! 11: * Copyright 2000 Rob Swindell - http://www.synchro.net/copyright.html * ! 12: * * ! 13: * This program is free software; you can redistribute it and/or * ! 14: * modify it under the terms of the GNU General Public License * ! 15: * as published by the Free Software Foundation; either version 2 * ! 16: * of the License, or (at your option) any later version. * ! 17: * See the GNU General Public License for more details: gpl.txt or * ! 18: * http://www.fsf.org/copyleft/gpl.html * ! 19: * * ! 20: * Anonymous FTP access to the most recent released source is available at * ! 21: * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * ! 22: * * ! 23: * Anonymous CVS access to the development source and modification history * ! 24: * is available at cvs.synchro.net:/cvsroot/sbbs, example: * ! 25: * cvs -d :pserver:[email protected]:/cvsroot/sbbs login * ! 26: * (just hit return, no password is necessary) * ! 27: * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src * ! 28: * * ! 29: * For Synchronet coding style and modification guidelines, see * ! 30: * http://www.synchro.net/source.html * ! 31: * * ! 32: * You are encouraged to submit any modifications (preferably in Unix diff * ! 33: * format) via e-mail to [email protected] * ! 34: * * ! 35: * Note: If this box doesn't appear square, then you need to fix your tabs. * ! 36: ****************************************************************************/ ! 37: ! 38: #include "sbbs.h" ! 39: #include "cmdshell.h" ! 40: ! 41: extern SOCKET spy_socket[]; ! 42: extern RingBuf* node_inbuf[]; ! 43: ! 44: int sbbs_t::exec_function(csi_t *csi) ! 45: { ! 46: char str[256],tmp2[128],ch; ! 47: char tmp[512]; ! 48: uchar* p; ! 49: char ansi_seq[32]; ! 50: int ansi_len; ! 51: int in; ! 52: int s,file; ! 53: uint i,j,k; ! 54: long l; ! 55: stats_t stats; ! 56: node_t node; ! 57: struct tm * tm; ! 58: ! 59: switch(*(csi->ip++)) { ! 60: ! 61: ! 62: case CS_PRINTFILE_STR: ! 63: printfile(csi->str,P_NOATCODES); ! 64: return(0); ! 65: ! 66: /********************************/ ! 67: /* General Main Menu Type Stuff */ ! 68: /********************************/ ! 69: case CS_AUTO_MESSAGE: ! 70: automsg(); ! 71: return(0); ! 72: case CS_MINUTE_BANK: ! 73: if(cfg.sys_misc&SM_TIMEBANK) { /* Allow users to deposit free time */ ! 74: s=(cfg.level_timeperday[useron.level]-useron.ttoday)+useron.textra; ! 75: if(s<0) s=0; ! 76: if(s>cfg.level_timepercall[useron.level]) ! 77: s=cfg.level_timepercall[useron.level]; ! 78: s-=(now-starttime)/60; ! 79: if(s<0) s=0; ! 80: bprintf(text[FreeMinLeft],s); ! 81: bprintf(text[UserMinutes],ultoac(useron.min,tmp)); ! 82: if(cfg.max_minutes && useron.min>=cfg.max_minutes) { ! 83: bputs(text[YouHaveTooManyMinutes]); ! 84: return(0); } ! 85: if(cfg.max_minutes) ! 86: while(s>0 && s+useron.min>cfg.max_minutes) s--; ! 87: bprintf(text[FreeMinToDeposit],s); ! 88: s=getnum(s); ! 89: if(s>0) { ! 90: logline(" ","Minute Bank Deposit"); ! 91: useron.min=adjustuserrec(&cfg,useron.number,U_MIN,10,s); ! 92: useron.ttoday=(ushort)adjustuserrec(&cfg,useron.number,U_TTODAY,10,s); ! 93: sprintf(str,"Minute Adjustment: %u",s*cfg.cdt_min_value); ! 94: logline("*+",str); } } ! 95: ! 96: if(!(cfg.sys_misc&SM_NOCDTCVT)) { ! 97: bprintf(text[ConversionRate],cfg.cdt_min_value); ! 98: bprintf(text[UserCredits] ! 99: ,ultoac(useron.cdt,tmp) ! 100: ,ultoac(useron.freecdt,tmp2) ! 101: ,ultoac(cfg.level_freecdtperday[useron.level],str)); ! 102: bprintf(text[UserMinutes],ultoac(useron.min,tmp)); ! 103: if(useron.cdt/102400L<1L) { ! 104: bprintf(text[YouOnlyHaveNCredits],ultoac(useron.cdt,tmp)); ! 105: return(0); } ! 106: if(cfg.max_minutes && useron.min>=cfg.max_minutes) { ! 107: bputs(text[YouHaveTooManyMinutes]); ! 108: return(0); } ! 109: s=useron.cdt/102400L; ! 110: if(cfg.max_minutes) ! 111: while(s>0 && (s*cfg.cdt_min_value)+useron.min>cfg.max_minutes) s--; ! 112: bprintf(text[CreditsToMin],s); ! 113: s=getnum(s); ! 114: if(s>0) { ! 115: logline(" ","Credit to Minute Conversion"); ! 116: useron.cdt=adjustuserrec(&cfg,useron.number,U_CDT,10,-(s*102400L)); ! 117: useron.min=adjustuserrec(&cfg,useron.number,U_MIN,10,s*cfg.cdt_min_value); ! 118: sprintf(str,"Credit Adjustment: %ld",-(s*102400L)); ! 119: logline("$-",str); ! 120: sprintf(str,"Minute Adjustment: %u",s*cfg.cdt_min_value); ! 121: logline("*+",str); } } ! 122: return(0); ! 123: case CS_CHAT_SECTION: ! 124: if(useron.rest&FLAG('C')) ! 125: bputs(text[R_Chat]); ! 126: else ! 127: chatsection(); ! 128: return(0); ! 129: case CS_USER_DEFAULTS: ! 130: maindflts(&useron); ! 131: if(!(useron.rest&FLAG('G'))) /* not guest */ ! 132: getuserdat(&cfg,&useron); ! 133: return(0); ! 134: case CS_TEXT_FILE_SECTION: ! 135: text_sec(); ! 136: return(0); ! 137: case CS_INFO_SYSTEM: /* System information */ ! 138: bputs(text[SiHdr]); ! 139: getstats(&cfg,0,&stats); ! 140: bprintf(text[SiSysName],cfg.sys_name); ! 141: bprintf(text[SiSysID],cfg.sys_id); /* QWK ID */ ! 142: for(i=0;i<cfg.total_faddrs;i++) ! 143: bprintf(text[SiSysFaddr],faddrtoa(cfg.faddr[i])); ! 144: if(cfg.sys_psname[0]) /* PostLink/PCRelay */ ! 145: bprintf(text[SiSysPsite],cfg.sys_psname,cfg.sys_psnum); ! 146: bprintf(text[SiSysLocation],cfg.sys_location); ! 147: bprintf(text[SiSysop],cfg.sys_op); ! 148: bprintf(text[SiSysNodes],cfg.sys_nodes); ! 149: // bprintf(text[SiNodeNumberName],cfg.node_num,cfg.node_name); ! 150: bprintf(text[SiNodePhone],cfg.node_phone); ! 151: bprintf(text[SiTotalLogons],ultoac(stats.logons,tmp)); ! 152: bprintf(text[SiLogonsToday],ultoac(stats.ltoday,tmp)); ! 153: bprintf(text[SiTotalTime],ultoac(stats.timeon,tmp)); ! 154: bprintf(text[SiTimeToday],ultoac(stats.ttoday,tmp)); ! 155: ver(); ! 156: if(yesno(text[ViewSysInfoFileQ])) { ! 157: CLS; ! 158: sprintf(str,"%ssystem.msg", cfg.text_dir); ! 159: printfile(str,0); } ! 160: if(yesno(text[ViewLogonMsgQ])) { ! 161: CLS; ! 162: menu("logon"); } ! 163: return(0); ! 164: case CS_INFO_SUBBOARD: /* Sub-board information */ ! 165: if(!usrgrps) return(0); ! 166: subinfo(usrsub[curgrp][cursub[curgrp]]); ! 167: return(0); ! 168: case CS_INFO_DIRECTORY: /* Sub-board information */ ! 169: if(!usrlibs) return(0); ! 170: dirinfo(usrdir[curlib][curdir[curlib]]); ! 171: return(0); ! 172: case CS_INFO_VERSION: /* Version */ ! 173: ver(); ! 174: return(0); ! 175: case CS_INFO_USER: /* User's statistics */ ! 176: bprintf(text[UserStats],useron.alias,useron.number); ! 177: ! 178: tm=gmtime(&useron.laston); ! 179: if(tm!=NULL) ! 180: bprintf(text[UserDates] ! 181: ,unixtodstr(&cfg,useron.firston,str) ! 182: ,unixtodstr(&cfg,useron.expire,tmp) ! 183: ,unixtodstr(&cfg,useron.laston,tmp2) ! 184: ,tm->tm_hour,tm->tm_min); ! 185: ! 186: bprintf(text[UserTimes] ! 187: ,useron.timeon,useron.ttoday ! 188: ,cfg.level_timeperday[useron.level] ! 189: ,useron.tlast ! 190: ,cfg.level_timepercall[useron.level] ! 191: ,useron.textra); ! 192: if(useron.posts) ! 193: i=useron.logons/useron.posts; ! 194: else ! 195: i=0; ! 196: bprintf(text[UserLogons] ! 197: ,useron.logons,useron.ltoday ! 198: ,cfg.level_callsperday[useron.level],useron.posts ! 199: ,i ? 100/i : useron.posts>useron.logons ? 100 : 0 ! 200: ,useron.ptoday); ! 201: bprintf(text[UserEmails] ! 202: ,useron.emails,useron.fbacks ! 203: ,getmail(&cfg,useron.number,0),useron.etoday); ! 204: CRLF; ! 205: bprintf(text[UserUploads] ! 206: ,ultoac(useron.ulb,tmp),useron.uls); ! 207: bprintf(text[UserDownloads] ! 208: ,ultoac(useron.dlb,tmp),useron.dls,nulstr); ! 209: bprintf(text[UserCredits],ultoac(useron.cdt,tmp) ! 210: ,ultoac(useron.freecdt,tmp2) ! 211: ,ultoac(cfg.level_freecdtperday[useron.level],str)); ! 212: bprintf(text[UserMinutes],ultoac(useron.min,tmp)); ! 213: return(0); ! 214: case CS_INFO_XFER_POLICY: ! 215: if(!usrlibs) return(0); ! 216: sprintf(str,"%smenu/tpolicy.*", cfg.text_dir); ! 217: if(fexist(str)) ! 218: menu("tpolicy"); ! 219: else { ! 220: bprintf(text[TransferPolicyHdr],cfg.sys_name); ! 221: bprintf(text[TpUpload] ! 222: ,cfg.dir[usrdir[curlib][curdir[curlib]]]->up_pct); ! 223: bprintf(text[TpDownload] ! 224: ,cfg.dir[usrdir[curlib][curdir[curlib]]]->dn_pct); ! 225: } ! 226: return(0); ! 227: case CS_XTRN_EXEC: ! 228: csi->logic=LOGIC_TRUE; ! 229: for(i=0;i<cfg.total_xtrns;i++) ! 230: if(!stricmp(cfg.xtrn[i]->code,csi->str)) ! 231: break; ! 232: if(i<cfg.total_xtrns) ! 233: exec_xtrn(i); ! 234: else ! 235: csi->logic=LOGIC_FALSE; ! 236: return(0); ! 237: case CS_XTRN_SECTION: ! 238: if(useron.rest&FLAG('X')) ! 239: bputs(text[R_ExternalPrograms]); ! 240: else ! 241: xtrn_sec(); /* If external available, don't pause */ ! 242: return(0); ! 243: case CS_LOGOFF: ! 244: if(!noyes(text[LogOffQ])) { ! 245: if(cfg.logoff_mod[0]) ! 246: exec_bin(cfg.logoff_mod,csi); ! 247: user_event(EVENT_LOGOFF); ! 248: menu("logoff"); ! 249: SYNC; ! 250: hangup(); } ! 251: return(0); ! 252: case CS_LOGOFF_FAST: ! 253: SYNC; ! 254: hangup(); ! 255: return(0); ! 256: case CS_NODELIST_ALL: ! 257: CRLF; ! 258: bputs(text[NodeLstHdr]); ! 259: for(i=1;i<=cfg.sys_nodes && i<=cfg.sys_lastnode;i++) { ! 260: getnodedat(i,&node,0); ! 261: printnodedat(i,&node); } ! 262: return(0); ! 263: case CS_NODELIST_USERS: ! 264: whos_online(true); ! 265: return(0); ! 266: case CS_USERLIST_SUB: ! 267: userlist(UL_SUB); ! 268: return(0); ! 269: case CS_USERLIST_DIR: ! 270: userlist(UL_DIR); ! 271: return(0); ! 272: case CS_USERLIST_ALL: ! 273: userlist(UL_ALL); ! 274: return(0); ! 275: case CS_USERLIST_LOGONS: ! 276: sprintf(str,"%slogon.lst", cfg.data_dir); ! 277: if(flength(str)<1) { ! 278: bputs("\r\n\r\n"); ! 279: bputs(text[NoOneHasLoggedOnToday]); } ! 280: else { ! 281: bputs(text[CallersToday]); ! 282: printfile(str,P_NOATCODES|P_OPENCLOSE); ! 283: CRLF; } ! 284: return(0); ! 285: case CS_PAGE_SYSOP: ! 286: if(cfg.startup->options&BBS_OPT_SYSOP_AVAILABLE ! 287: || (cfg.sys_chat_ar[0] && chk_ar(cfg.sys_chat_ar,&useron)) ! 288: || useron.exempt&FLAG('C')) { ! 289: sysop_page(); ! 290: return(0); } ! 291: bprintf(text[SysopIsNotAvailable],cfg.sys_op); ! 292: return(0); ! 293: case CS_PAGE_GURU: ! 294: csi->logic=LOGIC_FALSE; ! 295: for(i=0;i<cfg.total_gurus;i++) ! 296: if(!stricmp(csi->str,cfg.guru[i]->code) ! 297: && chk_ar(cfg.guru[i]->ar,&useron)) ! 298: break; ! 299: if(i>=cfg.total_gurus) ! 300: return(0); ! 301: sprintf(str,"%s%s.dat", cfg.ctrl_dir, cfg.guru[i]->code); ! 302: if((file=nopen(str,O_RDONLY))==-1) { ! 303: errormsg(WHERE,ERR_OPEN,str,O_RDONLY); ! 304: return(0); } ! 305: if((p=(uchar *)MALLOC(filelength(file)+1))==NULL) { ! 306: close(file); ! 307: errormsg(WHERE,ERR_ALLOC,str,filelength(file)+1); ! 308: return(0); } ! 309: read(file,p,filelength(file)); ! 310: p[filelength(file)]=0; ! 311: close(file); ! 312: localguru((char*)p,i); ! 313: FREE(p); ! 314: csi->logic=LOGIC_TRUE; ! 315: return(0); ! 316: case CS_SPY: ! 317: i=atoi(csi->str); ! 318: if(!i || i>MAX_NODES) { ! 319: bprintf("Invalid node number: %d\r\n",i); ! 320: csi->logic=LOGIC_FALSE; ! 321: return(0); ! 322: } ! 323: if(i==cfg.node_num) { ! 324: bprintf("Can't spy on yourself.\r\n"); ! 325: csi->logic=LOGIC_FALSE; ! 326: return(0); ! 327: } ! 328: if(spy_socket[i-1]!=INVALID_SOCKET) { ! 329: bprintf("Node %d already being spied (%lx)\r\n",i,spy_socket[i-1]); ! 330: csi->logic=LOGIC_FALSE; ! 331: return(0); ! 332: } ! 333: bprintf("*** Synchronet Remote Spy on Node %d: Ctrl-C to Abort ***" ! 334: "\r\n\r\n",i); ! 335: spy_socket[i-1]=client_socket; ! 336: ansi_len=0; ! 337: while(online ! 338: && client_socket!=INVALID_SOCKET ! 339: && spy_socket[i-1]!=INVALID_SOCKET ! 340: && !msgabort()) { ! 341: in=incom(); ! 342: if(in==NOINP) { ! 343: gettimeleft(); ! 344: mswait(1); ! 345: continue; ! 346: } ! 347: ch=in; ! 348: if(ch==ESC) { ! 349: if(!ansi_len) { ! 350: ansi_seq[ansi_len++]=ch; ! 351: continue; ! 352: } ! 353: ansi_len=0; ! 354: } ! 355: if(ansi_len && ansi_len<sizeof(ansi_seq)-2) { ! 356: if(ansi_len==1) { ! 357: if(ch=='[') { ! 358: ansi_seq[ansi_len++]=ch; ! 359: continue; ! 360: } ! 361: ansi_len=0; ! 362: } ! 363: if(ch=='R') { /* through-away cursor position report */ ! 364: ansi_len=0; ! 365: continue; ! 366: } ! 367: ansi_seq[ansi_len++]=ch; ! 368: if(isalpha(ch)) { ! 369: RingBufWrite(node_inbuf[i-1],(uchar*)ansi_seq,ansi_len); ! 370: ansi_len=0; ! 371: } ! 372: continue; ! 373: } ! 374: if(ch==16) { /* Ctrl-P Private node-node comm */ ! 375: lncntr=0; /* defeat pause */ ! 376: spy_socket[i-1]=INVALID_SOCKET; /* disable spy output */ ! 377: nodesync(); /* read waiting messages */ ! 378: nodemsg(); /* send a message */ ! 379: spy_socket[i-1]=client_socket; /* enable spy output */ ! 380: continue; ! 381: } ! 382: if(ch==21) { /* Ctrl-U Users online */ ! 383: lncntr=0; /* defeat pause */ ! 384: whos_online(true); /* list users */ ! 385: continue; ! 386: } ! 387: if(node_inbuf[i-1]!=NULL) ! 388: RingBufWrite(node_inbuf[i-1],(uchar*)&ch,1); ! 389: } ! 390: spy_socket[i-1]=INVALID_SOCKET; ! 391: csi->logic=LOGIC_TRUE; ! 392: return(0); ! 393: case CS_PRIVATE_CHAT: ! 394: privchat(); ! 395: return(0); ! 396: case CS_PRIVATE_MESSAGE: ! 397: nodemsg(); ! 398: return(0); ! 399: ! 400: /*******************/ ! 401: /* Sysop Functions */ ! 402: /*******************/ ! 403: case CS_USER_EDIT: ! 404: useredit(csi->str[0] ? finduser(csi->str) : 0,0); ! 405: return(0); ! 406: ! 407: ! 408: /******************/ ! 409: /* Mail Functions */ ! 410: /******************/ ! 411: ! 412: case CS_MAIL_READ: /* Read E-mail */ ! 413: readmail(useron.number,MAIL_YOUR); ! 414: return(0); ! 415: case CS_MAIL_READ_SENT: /* Kill/read sent mail */ ! 416: if(useron.rest&FLAG('K')) ! 417: bputs(text[R_ReadSentMail]); ! 418: else ! 419: readmail(useron.number,MAIL_SENT); ! 420: return(0); ! 421: case CS_MAIL_READ_ALL: ! 422: readmail(useron.number,MAIL_ALL); ! 423: return(0); ! 424: case CS_MAIL_SEND: /* Send E-mail */ ! 425: if(strchr(csi->str,'@')) { ! 426: i=1; ! 427: netmail(csi->str,nulstr,0); } ! 428: else if((i=finduser(csi->str))!=0) ! 429: email(i,nulstr,nulstr,WM_EMAIL); ! 430: csi->logic=!i; ! 431: return(0); ! 432: case CS_MAIL_SEND_FEEDBACK: /* Feedback */ ! 433: if((i=finduser(csi->str))!=0) ! 434: email(i,text[ReFeedback],nulstr,WM_EMAIL); ! 435: csi->logic=!i; ! 436: return(0); ! 437: case CS_MAIL_SEND_NETMAIL: ! 438: bputs(text[EnterNetMailAddress]); ! 439: if(getstr(str,60,K_LINE)) { ! 440: netmail(str,nulstr,0); ! 441: csi->logic=LOGIC_TRUE; } ! 442: else ! 443: csi->logic=LOGIC_FALSE; ! 444: return(0); ! 445: ! 446: case CS_MAIL_SEND_NETFILE: ! 447: bputs(text[EnterNetMailAddress]); ! 448: if(getstr(str,60,K_LINE)) { ! 449: netmail(str,nulstr,WM_FILE); ! 450: csi->logic=LOGIC_TRUE; } ! 451: else ! 452: csi->logic=LOGIC_FALSE; ! 453: return(0); ! 454: ! 455: case CS_MAIL_SEND_FILE: /* Upload Attached File to E-mail */ ! 456: if(strchr(csi->str,'@')) { ! 457: i=1; ! 458: netmail(csi->str,nulstr,WM_FILE); } ! 459: else if((i=finduser(csi->str))!=0) ! 460: email(i,nulstr,nulstr,WM_EMAIL|WM_FILE); ! 461: csi->logic=!i; ! 462: return(0); ! 463: case CS_MAIL_SEND_BULK: ! 464: if(csi->str[0]) ! 465: p=arstr(0,csi->str, &cfg); ! 466: else ! 467: p=(uchar *)nulstr; ! 468: bulkmail(p); ! 469: if(p && p[0]) ! 470: FREE(p); ! 471: return(0); ! 472: ! 473: case CS_INC_MAIN_CMDS: ! 474: main_cmds++; ! 475: return(0); ! 476: ! 477: case CS_INC_FILE_CMDS: ! 478: xfer_cmds++; ! 479: return(0); ! 480: ! 481: case CS_SYSTEM_LOG: /* System log */ ! 482: if(!chksyspass(0)) ! 483: return(0); ! 484: tm=gmtime(&now); ! 485: if(tm==NULL) ! 486: return(0); ! 487: sprintf(str,"%slogs/%2.2d%2.2d%2.2d.log", cfg.data_dir ! 488: ,tm->tm_mon+1,tm->tm_mday,TM_YEAR(tm->tm_year)); ! 489: printfile(str,0); ! 490: return(0); ! 491: case CS_SYSTEM_YLOG: /* Yesterday's log */ ! 492: if(!chksyspass(0)) ! 493: return(0); ! 494: now-=(ulong)60L*24L*60L; ! 495: tm=gmtime(&now); ! 496: if(tm==NULL) ! 497: return(0); ! 498: sprintf(str,"%slogs/%2.2d%2.2d%2.2d.log",cfg.data_dir ! 499: ,tm->tm_mon+1,tm->tm_mday,TM_YEAR(tm->tm_year)); ! 500: printfile(str,0); ! 501: return(0); ! 502: case CS_SYSTEM_STATS: /* System Statistics */ ! 503: bputs(text[SystemStatsHdr]); ! 504: getstats(&cfg,0,&stats); ! 505: bprintf(text[StatsTotalLogons],ultoac(stats.logons,tmp)); ! 506: bprintf(text[StatsLogonsToday],ultoac(stats.ltoday,tmp)); ! 507: bprintf(text[StatsTotalTime],ultoac(stats.timeon,tmp)); ! 508: bprintf(text[StatsTimeToday],ultoac(stats.ttoday,tmp)); ! 509: bprintf(text[StatsUploadsToday],ultoac(stats.ulb,tmp) ! 510: ,stats.uls); ! 511: bprintf(text[StatsDownloadsToday],ultoac(stats.dlb,tmp) ! 512: ,stats.dls); ! 513: bprintf(text[StatsPostsToday],ultoac(stats.ptoday,tmp)); ! 514: bprintf(text[StatsEmailsToday],ultoac(stats.etoday,tmp)); ! 515: bprintf(text[StatsFeedbacksToday],ultoac(stats.ftoday,tmp)); ! 516: return(0); ! 517: case CS_NODE_STATS: /* Node Statistics */ ! 518: i=atoi(csi->str); ! 519: if(i>cfg.sys_nodes) { ! 520: bputs(text[InvalidNode]); ! 521: return(0); } ! 522: if(!i) i=cfg.node_num; ! 523: bprintf(text[NodeStatsHdr],i); ! 524: getstats(&cfg,i,&stats); ! 525: bprintf(text[StatsTotalLogons],ultoac(stats.logons,tmp)); ! 526: bprintf(text[StatsLogonsToday],ultoac(stats.ltoday,tmp)); ! 527: bprintf(text[StatsTotalTime],ultoac(stats.timeon,tmp)); ! 528: bprintf(text[StatsTimeToday],ultoac(stats.ttoday,tmp)); ! 529: bprintf(text[StatsUploadsToday],ultoac(stats.ulb,tmp) ! 530: ,stats.uls); ! 531: bprintf(text[StatsDownloadsToday],ultoac(stats.dlb,tmp) ! 532: ,stats.dls); ! 533: bprintf(text[StatsPostsToday],ultoac(stats.ptoday,tmp)); ! 534: bprintf(text[StatsEmailsToday],ultoac(stats.etoday,tmp)); ! 535: bprintf(text[StatsFeedbacksToday],ultoac(stats.ftoday,tmp)); ! 536: return(0); ! 537: case CS_CHANGE_USER: /* Change to another user */ ! 538: if(!chksyspass(0)) ! 539: return(0); ! 540: bputs(text[ChUserPrompt]); ! 541: if(!getstr(str,LEN_ALIAS,K_UPPER)) ! 542: return(0); ! 543: if((i=finduser(str))==0) ! 544: return(0); ! 545: if(online==ON_REMOTE) { ! 546: getuserrec(&cfg,i,U_LEVEL,2,str); ! 547: if(atoi(str)>logon_ml) { ! 548: getuserrec(&cfg,i,U_PASS,8,tmp); ! 549: bputs(text[ChUserPwPrompt]); ! 550: console|=CON_R_ECHOX; ! 551: if(!(cfg.sys_misc&SM_ECHO_PW)) ! 552: console|=CON_L_ECHOX; ! 553: getstr(str,8,K_UPPER); ! 554: console&=~(CON_R_ECHOX|CON_L_ECHOX); ! 555: if(strcmp(str,tmp)) ! 556: return(0); } } ! 557: putmsgptrs(); ! 558: putuserrec(&cfg,useron.number,U_CURSUB,8 ! 559: ,cfg.sub[usrsub[curgrp][cursub[curgrp]]]->code); ! 560: putuserrec(&cfg,useron.number,U_CURDIR,8 ! 561: ,cfg.dir[usrdir[curlib][curdir[curlib]]]->code); ! 562: useron.number=i; ! 563: getuserdat(&cfg,&useron); ! 564: getnodedat(cfg.node_num,&thisnode,1); ! 565: thisnode.useron=useron.number; ! 566: putnodedat(cfg.node_num,&thisnode); ! 567: getmsgptrs(); ! 568: if(REALSYSOP) sys_status&=~SS_TMPSYSOP; ! 569: else sys_status|=SS_TMPSYSOP; ! 570: sprintf(str,"Changed into %s #%u",useron.alias,useron.number); ! 571: logline("S+",str); ! 572: return(0); ! 573: case CS_SHOW_MEM: ! 574: #ifdef __MSDOS__ ! 575: bprintf(text[NBytesFreeMemory],farcoreleft()); ! 576: #endif ! 577: return(0); ! 578: case CS_ERROR_LOG: ! 579: sprintf(str,"%serror.log", cfg.data_dir); ! 580: if(fexist(str)) { ! 581: bputs(text[ErrorLogHdr]); ! 582: printfile(str,0); ! 583: if(!noyes(text[DeleteErrorLogQ])) ! 584: remove(str); } ! 585: else ! 586: bputs(text[NoErrorLogExists]); ! 587: for(i=1;i<=cfg.sys_nodes;i++) { ! 588: getnodedat(i,&node,0); ! 589: if(node.errors) ! 590: break; } ! 591: if(i<=cfg.sys_nodes || criterrs) { ! 592: if(!noyes(text[ClearErrCounter])) { ! 593: for(i=1;i<=cfg.sys_nodes;i++) { ! 594: getnodedat(i,&node,1); ! 595: node.errors=0; ! 596: putnodedat(i,&node); } ! 597: criterrs=0; } } ! 598: return(0); ! 599: case CS_ANSI_CAPTURE: /* Capture ANSI codes */ ! 600: sys_status^=SS_ANSCAP; ! 601: bprintf(text[ANSICaptureIsNow] ! 602: ,sys_status&SS_ANSCAP ? text[ON] : text[OFF]); ! 603: return(0); ! 604: case CS_LIST_TEXT_FILE: /* View ASCII/ANSI/Ctrl-A file */ ! 605: if(!chksyspass(0)) ! 606: return(0); ! 607: bputs(text[Filename]); ! 608: if(getstr(str,60,0)) ! 609: printfile(str,0); ! 610: return(0); ! 611: case CS_EDIT_TEXT_FILE: /* Edit ASCII/Ctrl-A file */ ! 612: if(!chksyspass(0)) ! 613: return(0); ! 614: bputs(text[Filename]); ! 615: if(getstr(str,60,0)) ! 616: editfile(str); ! 617: return(0); ! 618: case CS_GURU_LOG: ! 619: sprintf(str,"%sguru.log", cfg.data_dir); ! 620: if(fexist(str)) { ! 621: printfile(str,0); ! 622: CRLF; ! 623: if(!noyes(text[DeleteGuruLogQ])) ! 624: remove(str); } ! 625: return(0); ! 626: case CS_FILE_SET_ALT_PATH: ! 627: altul=atoi(csi->str); ! 628: if(altul>cfg.altpaths) ! 629: altul=0; ! 630: bprintf(text[AltULPathIsNow],altul ? cfg.altpath[altul-1] : text[OFF]); ! 631: return(0); ! 632: case CS_FILE_RESORT_DIRECTORY: ! 633: for(i=1;i<=cfg.sys_nodes;i++) ! 634: if(i!=cfg.node_num) { ! 635: getnodedat(i,&node,0); ! 636: if(node.status==NODE_INUSE ! 637: || node.status==NODE_QUIET) ! 638: break; } ! 639: ! 640: if(i<=cfg.sys_nodes) { ! 641: bputs(text[ResortWarning]); ! 642: return(0); } ! 643: ! 644: if(!stricmp(csi->str,"ALL")) { /* all libraries */ ! 645: for(i=0;i<usrlibs;i++) ! 646: for(j=0;j<usrdirs[i];j++) ! 647: resort(usrdir[i][j]); ! 648: return(0); } ! 649: if(!stricmp(csi->str,"LIB")) { /* current library */ ! 650: for(i=0;i<usrdirs[curlib];i++) ! 651: resort(usrdir[curlib][i]); ! 652: return(0); } ! 653: resort(usrdir[curlib][curdir[curlib]]); ! 654: return(0); ! 655: ! 656: case CS_FILE_GET: ! 657: ! 658: if(!fexist(csi->str)) { ! 659: bputs(text[FileNotFound]); ! 660: return(0); } ! 661: if(!chksyspass(0)) ! 662: return(0); ! 663: ! 664: case CS_FILE_SEND: ! 665: ! 666: menu("dlprot"); ! 667: mnemonics(text[ProtocolOrQuit]); ! 668: strcpy(str,"Q"); ! 669: for(i=0;i<cfg.total_prots;i++) ! 670: if(cfg.prot[i]->dlcmd[0] && chk_ar(cfg.prot[i]->ar,&useron)) { ! 671: sprintf(tmp,"%c",cfg.prot[i]->mnemonic); ! 672: strcat(str,tmp); } ! 673: ch=(char)getkeys(str,0); ! 674: if(ch=='Q' || sys_status&SS_ABORT) { ! 675: return(0); } ! 676: for(i=0;i<cfg.total_prots;i++) ! 677: if(cfg.prot[i]->mnemonic==ch && chk_ar(cfg.prot[i]->ar,&useron)) ! 678: break; ! 679: if(i<cfg.total_prots) { ! 680: protocol(cmdstr(cfg.prot[i]->dlcmd,csi->str,csi->str,str),0); ! 681: autohangup(); } ! 682: return(0); ! 683: ! 684: case CS_FILE_PUT: ! 685: if(!chksyspass(0)) ! 686: return(0); ! 687: menu("ulprot"); ! 688: mnemonics(text[ProtocolOrQuit]); ! 689: strcpy(str,"Q"); ! 690: for(i=0;i<cfg.total_prots;i++) ! 691: if(cfg.prot[i]->ulcmd[0] && chk_ar(cfg.prot[i]->ar,&useron)) { ! 692: sprintf(tmp,"%c",cfg.prot[i]->mnemonic); ! 693: strcat(str,tmp); } ! 694: ch=(char)getkeys(str,0); ! 695: if(ch=='Q' || sys_status&SS_ABORT) { ! 696: lncntr=0; ! 697: return(0); } ! 698: for(i=0;i<cfg.total_prots;i++) ! 699: if(cfg.prot[i]->mnemonic==ch && chk_ar(cfg.prot[i]->ar,&useron)) ! 700: break; ! 701: if(i<cfg.total_prots) { ! 702: protocol(cmdstr(cfg.prot[i]->ulcmd,csi->str,csi->str,str),0); ! 703: autohangup(); } ! 704: return(0); ! 705: ! 706: case CS_FILE_UPLOAD_BULK: ! 707: ! 708: if(!usrlibs) return(0); ! 709: ! 710: if(!stricmp(csi->str,"ALL")) { /* all libraries */ ! 711: for(i=0;i<usrlibs;i++) ! 712: for(j=0;j<usrdirs[i];j++) { ! 713: if(cfg.lib[i]->offline_dir==usrdir[i][j]) ! 714: continue; ! 715: if(bulkupload(usrdir[i][j])) return(0); } ! 716: return(0); } ! 717: if(!stricmp(csi->str,"LIB")) { /* current library */ ! 718: for(i=0;i<usrdirs[curlib];i++) { ! 719: if(cfg.lib[usrlib[curlib]]->offline_dir ! 720: ==usrdir[curlib][i]) ! 721: continue; ! 722: if(bulkupload(usrdir[curlib][i])) return(0); } ! 723: return(0); } ! 724: bulkupload(usrdir[curlib][curdir[curlib]]); /* current dir */ ! 725: return(0); ! 726: ! 727: case CS_FILE_FIND_OLD: ! 728: case CS_FILE_FIND_OPEN: ! 729: case CS_FILE_FIND_OFFLINE: ! 730: case CS_FILE_FIND_OLD_UPLOADS: ! 731: if(!usrlibs) return(0); ! 732: if(!getfilespec(tmp)) ! 733: return(0); ! 734: padfname(tmp,str); ! 735: k=0; ! 736: bputs("\r\nSearching "); ! 737: if(!stricmp(csi->str,"ALL")) ! 738: bputs("all libraries"); ! 739: else if(!stricmp(csi->str,"LIB")) ! 740: bputs("library"); ! 741: else ! 742: bputs("directory"); ! 743: bputs(" for files "); ! 744: if(*(csi->ip-1)==CS_FILE_FIND_OLD_UPLOADS) { ! 745: l=FI_OLDUL; ! 746: bprintf("uploaded before %s\r\n",timestr(&ns_time)); } ! 747: else if(*(csi->ip-1)==CS_FILE_FIND_OLD) { /* go by download date */ ! 748: l=FI_OLD; ! 749: bprintf("not downloaded since %s\r\n",timestr(&ns_time)); } ! 750: else if(*(csi->ip-1)==CS_FILE_FIND_OFFLINE) { ! 751: l=FI_OFFLINE; ! 752: bputs("not online...\r\n"); } ! 753: else { ! 754: l=FI_CLOSE; ! 755: bputs("currently open...\r\n"); } ! 756: if(!stricmp(csi->str,"ALL")) { ! 757: for(i=0;i<usrlibs;i++) ! 758: for(j=0;j<usrdirs[i];j++) { ! 759: if(cfg.lib[i]->offline_dir==usrdir[i][j]) ! 760: continue; ! 761: if((s=listfileinfo(usrdir[i][j],str,(char)l))==-1) ! 762: return(0); ! 763: else k+=s; } } ! 764: else if(!stricmp(csi->str,"LIB")) { ! 765: for(i=0;i<usrdirs[curlib];i++) { ! 766: if(cfg.lib[usrlib[curlib]]->offline_dir==usrdir[curlib][i]) ! 767: continue; ! 768: if((s=listfileinfo(usrdir[curlib][i],str,(char)l))==-1) ! 769: return(0); ! 770: else k+=s; } } ! 771: else { ! 772: s=listfileinfo(usrdir[curlib][curdir[curlib]],str,(char)l); ! 773: if(s==-1) ! 774: return(0); ! 775: k=s; } ! 776: if(k>1) { ! 777: bprintf(text[NFilesListed],k); } ! 778: return(0); } ! 779: ! 780: if(*(csi->ip-1)>=CS_MSG_SET_AREA && *(csi->ip-1)<=CS_MSG_UNUSED1) { ! 781: csi->ip--; ! 782: return(execmsg(csi)); } ! 783: ! 784: if(*(csi->ip-1)>=CS_FILE_SET_AREA && *(csi->ip-1)<=CS_FILE_UNUSED1) { ! 785: csi->ip--; ! 786: return(execfile(csi)); } ! 787: ! 788: errormsg(WHERE,ERR_CHK,"shell function",*(csi->ip-1)); ! 789: return(0); ! 790: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.