|
|
1.1 ! root 1: /* execfunc.cpp */ ! 2: ! 3: /* Hi-level command shell/module routines (functions) */ ! 4: ! 5: /* $Id: execfunc.cpp,v 1.35 2006/02/28 00:47:34 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 2006 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: int sbbs_t::exec_function(csi_t *csi) ! 42: { ! 43: char str[256]; ! 44: char tmp[512]; ! 45: uchar* p; ! 46: int s; ! 47: uint i,j,k; ! 48: long l; ! 49: node_t node; ! 50: struct tm tm; ! 51: ! 52: switch(*(csi->ip++)) { ! 53: ! 54: ! 55: case CS_PRINTFILE_STR: ! 56: printfile(csi->str,P_NOATCODES); ! 57: return(0); ! 58: ! 59: /********************************/ ! 60: /* General Main Menu Type Stuff */ ! 61: /********************************/ ! 62: case CS_AUTO_MESSAGE: ! 63: automsg(); ! 64: return(0); ! 65: case CS_MINUTE_BANK: ! 66: time_bank(); ! 67: return(0); ! 68: case CS_CHAT_SECTION: ! 69: chatsection(); ! 70: return(0); ! 71: case CS_USER_DEFAULTS: ! 72: maindflts(&useron); ! 73: if(!(useron.rest&FLAG('G'))) /* not guest */ ! 74: getuserdat(&cfg,&useron); ! 75: return(0); ! 76: case CS_TEXT_FILE_SECTION: ! 77: text_sec(); ! 78: return(0); ! 79: case CS_INFO_SYSTEM: /* System information */ ! 80: sys_info(); ! 81: return(0); ! 82: case CS_INFO_SUBBOARD: /* Sub-board information */ ! 83: if(!usrgrps) return(0); ! 84: subinfo(usrsub[curgrp][cursub[curgrp]]); ! 85: return(0); ! 86: case CS_INFO_DIRECTORY: /* Sub-board information */ ! 87: if(!usrlibs) return(0); ! 88: dirinfo(usrdir[curlib][curdir[curlib]]); ! 89: return(0); ! 90: case CS_INFO_VERSION: /* Version */ ! 91: ver(); ! 92: return(0); ! 93: case CS_INFO_USER: /* User's statistics */ ! 94: user_info(); ! 95: return(0); ! 96: case CS_INFO_XFER_POLICY: ! 97: xfer_policy(); ! 98: return(0); ! 99: case CS_XTRN_EXEC: ! 100: csi->logic=LOGIC_TRUE; ! 101: for(i=0;i<cfg.total_xtrns;i++) ! 102: if(!stricmp(cfg.xtrn[i]->code,csi->str)) ! 103: break; ! 104: if(i<cfg.total_xtrns) ! 105: exec_xtrn(i); ! 106: else ! 107: csi->logic=LOGIC_FALSE; ! 108: return(0); ! 109: case CS_XTRN_SECTION: ! 110: xtrn_sec(); ! 111: return(0); ! 112: case CS_LOGOFF: ! 113: if(!noyes(text[LogOffQ])) { ! 114: if(cfg.logoff_mod[0]) ! 115: exec_bin(cfg.logoff_mod,csi); ! 116: user_event(EVENT_LOGOFF); ! 117: menu("logoff"); ! 118: SYNC; ! 119: hangup(); } ! 120: return(0); ! 121: case CS_LOGOFF_FAST: ! 122: SYNC; ! 123: hangup(); ! 124: return(0); ! 125: case CS_NODELIST_ALL: ! 126: nodelist(); ! 127: return(0); ! 128: case CS_NODELIST_USERS: ! 129: whos_online(true); ! 130: return(0); ! 131: case CS_USERLIST_SUB: ! 132: userlist(UL_SUB); ! 133: return(0); ! 134: case CS_USERLIST_DIR: ! 135: userlist(UL_DIR); ! 136: return(0); ! 137: case CS_USERLIST_ALL: ! 138: userlist(UL_ALL); ! 139: return(0); ! 140: case CS_USERLIST_LOGONS: ! 141: logonlist(); ! 142: return(0); ! 143: case CS_PAGE_SYSOP: ! 144: csi->logic=sysop_page() ? LOGIC_TRUE:LOGIC_FALSE; ! 145: return(0); ! 146: case CS_PAGE_GURU: ! 147: csi->logic=guru_page() ? LOGIC_TRUE:LOGIC_FALSE; ! 148: return(0); ! 149: case CS_SPY: ! 150: csi->logic=spy(atoi(csi->str)) ? LOGIC_TRUE:LOGIC_FALSE; ! 151: return(0); ! 152: case CS_PRIVATE_CHAT: ! 153: privchat(); ! 154: return(0); ! 155: case CS_PRIVATE_MESSAGE: ! 156: nodemsg(); ! 157: return(0); ! 158: ! 159: /*******************/ ! 160: /* Sysop Functions */ ! 161: /*******************/ ! 162: case CS_USER_EDIT: ! 163: useredit(csi->str[0] ? finduser(csi->str) : 0); ! 164: return(0); ! 165: ! 166: ! 167: /******************/ ! 168: /* Mail Functions */ ! 169: /******************/ ! 170: ! 171: case CS_MAIL_READ: /* Read E-mail */ ! 172: readmail(useron.number,MAIL_YOUR); ! 173: return(0); ! 174: case CS_MAIL_READ_SENT: /* Kill/read sent mail */ ! 175: readmail(useron.number,MAIL_SENT); ! 176: return(0); ! 177: case CS_MAIL_READ_ALL: ! 178: readmail(useron.number,MAIL_ALL); ! 179: return(0); ! 180: case CS_MAIL_SEND: /* Send E-mail */ ! 181: if(strchr(csi->str,'@')) { ! 182: i=1; ! 183: netmail(csi->str,nulstr,0); } ! 184: else if((i=finduser(csi->str))!=0 ! 185: || (cfg.msg_misc&MM_REALNAME && (i=userdatdupe(0,U_NAME,LEN_NAME,csi->str,false))!=0)) ! 186: email(i,nulstr,nulstr,WM_EMAIL); ! 187: csi->logic=!i; ! 188: return(0); ! 189: case CS_MAIL_SEND_FEEDBACK: /* Feedback */ ! 190: if((i=finduser(csi->str))!=0) ! 191: email(i,text[ReFeedback],nulstr,WM_EMAIL); ! 192: csi->logic=!i; ! 193: return(0); ! 194: case CS_MAIL_SEND_NETMAIL: ! 195: bputs(text[EnterNetMailAddress]); ! 196: if(getstr(str,60,K_LINE)) { ! 197: netmail(str,nulstr,0); ! 198: csi->logic=LOGIC_TRUE; } ! 199: else ! 200: csi->logic=LOGIC_FALSE; ! 201: return(0); ! 202: ! 203: case CS_MAIL_SEND_NETFILE: ! 204: bputs(text[EnterNetMailAddress]); ! 205: if(getstr(str,60,K_LINE)) { ! 206: netmail(str,nulstr,WM_FILE); ! 207: csi->logic=LOGIC_TRUE; } ! 208: else ! 209: csi->logic=LOGIC_FALSE; ! 210: return(0); ! 211: ! 212: case CS_MAIL_SEND_FILE: /* Upload Attached File to E-mail */ ! 213: if(strchr(csi->str,'@')) { ! 214: i=1; ! 215: netmail(csi->str,nulstr,WM_FILE); } ! 216: else if((i=finduser(csi->str))!=0 ! 217: || (cfg.msg_misc&MM_REALNAME && (i=userdatdupe(0,U_NAME,LEN_NAME,csi->str,false))!=0)) ! 218: email(i,nulstr,nulstr,WM_EMAIL|WM_FILE); ! 219: csi->logic=!i; ! 220: return(0); ! 221: case CS_MAIL_SEND_BULK: ! 222: if(csi->str[0]) ! 223: p=arstr(NULL,csi->str, &cfg); ! 224: else ! 225: p=(uchar *)nulstr; ! 226: bulkmail(p); ! 227: if(p && p[0]) ! 228: free(p); ! 229: return(0); ! 230: ! 231: case CS_INC_MAIN_CMDS: ! 232: main_cmds++; ! 233: return(0); ! 234: ! 235: case CS_INC_FILE_CMDS: ! 236: xfer_cmds++; ! 237: return(0); ! 238: ! 239: case CS_SYSTEM_LOG: /* System log */ ! 240: if(!chksyspass()) ! 241: return(0); ! 242: if(localtime_r(&now,&tm)==NULL) ! 243: return(0); ! 244: sprintf(str,"%slogs/%2.2d%2.2d%2.2d.log", cfg.logs_dir ! 245: ,tm.tm_mon+1,tm.tm_mday,TM_YEAR(tm.tm_year)); ! 246: printfile(str,0); ! 247: return(0); ! 248: case CS_SYSTEM_YLOG: /* Yesterday's log */ ! 249: if(!chksyspass()) ! 250: return(0); ! 251: now-=(ulong)60L*24L*60L; ! 252: if(localtime_r(&now,&tm)==NULL) ! 253: return(0); ! 254: sprintf(str,"%slogs/%2.2d%2.2d%2.2d.log",cfg.logs_dir ! 255: ,tm.tm_mon+1,tm.tm_mday,TM_YEAR(tm.tm_year)); ! 256: printfile(str,0); ! 257: return(0); ! 258: case CS_SYSTEM_STATS: /* System Statistics */ ! 259: sys_stats(); ! 260: return(0); ! 261: case CS_NODE_STATS: /* Node Statistics */ ! 262: node_stats(atoi(csi->str)); ! 263: return(0); ! 264: case CS_CHANGE_USER: /* Change to another user */ ! 265: change_user(); ! 266: return(0); ! 267: case CS_SHOW_MEM: ! 268: return(0); ! 269: case CS_ERROR_LOG: ! 270: sprintf(str,"%serror.log", cfg.logs_dir); ! 271: if(fexist(str)) { ! 272: bputs(text[ErrorLogHdr]); ! 273: printfile(str,0); ! 274: if(!noyes(text[DeleteErrorLogQ])) ! 275: remove(str); } ! 276: else ! 277: bputs(text[NoErrorLogExists]); ! 278: for(i=1;i<=cfg.sys_nodes;i++) { ! 279: getnodedat(i,&node,0); ! 280: if(node.errors) ! 281: break; } ! 282: if(i<=cfg.sys_nodes || criterrs) { ! 283: if(!noyes(text[ClearErrCounter])) { ! 284: for(i=1;i<=cfg.sys_nodes;i++) { ! 285: if(getnodedat(i,&node,true)==0) { ! 286: node.errors=0; ! 287: putnodedat(i,&node); ! 288: } ! 289: criterrs=0; ! 290: } ! 291: } ! 292: } ! 293: return(0); ! 294: case CS_ANSI_CAPTURE: /* Capture ANSI codes */ ! 295: sys_status^=SS_ANSCAP; ! 296: bprintf(text[ANSICaptureIsNow] ! 297: ,sys_status&SS_ANSCAP ? text[ON] : text[OFF]); ! 298: return(0); ! 299: case CS_LIST_TEXT_FILE: /* View ASCII/ANSI/Ctrl-A file */ ! 300: if(!chksyspass()) ! 301: return(0); ! 302: bputs(text[Filename]); ! 303: if(getstr(str,60,0)) ! 304: printfile(str,0); ! 305: return(0); ! 306: case CS_EDIT_TEXT_FILE: /* Edit ASCII/Ctrl-A file */ ! 307: if(!chksyspass()) ! 308: return(0); ! 309: bputs(text[Filename]); ! 310: if(getstr(str,60,0)) ! 311: editfile(str); ! 312: return(0); ! 313: case CS_GURU_LOG: ! 314: sprintf(str,"%sguru.log", cfg.logs_dir); ! 315: if(fexist(str)) { ! 316: printfile(str,0); ! 317: CRLF; ! 318: if(!noyes(text[DeleteGuruLogQ])) ! 319: remove(str); } ! 320: return(0); ! 321: case CS_FILE_SET_ALT_PATH: ! 322: altul=atoi(csi->str); ! 323: if(altul>cfg.altpaths) ! 324: altul=0; ! 325: bprintf(text[AltULPathIsNow],altul ? cfg.altpath[altul-1] : text[OFF]); ! 326: return(0); ! 327: case CS_FILE_RESORT_DIRECTORY: ! 328: for(i=1;i<=cfg.sys_nodes;i++) ! 329: if(i!=cfg.node_num) { ! 330: getnodedat(i,&node,0); ! 331: if(node.status==NODE_INUSE ! 332: || node.status==NODE_QUIET) ! 333: break; } ! 334: ! 335: if(i<=cfg.sys_nodes) { ! 336: bputs(text[ResortWarning]); ! 337: return(0); } ! 338: ! 339: if(!stricmp(csi->str,"ALL")) { /* all libraries */ ! 340: for(i=0;i<usrlibs;i++) ! 341: for(j=0;j<usrdirs[i];j++) ! 342: resort(usrdir[i][j]); ! 343: return(0); } ! 344: if(!stricmp(csi->str,"LIB")) { /* current library */ ! 345: for(i=0;i<usrdirs[curlib];i++) ! 346: resort(usrdir[curlib][i]); ! 347: return(0); } ! 348: resort(usrdir[curlib][curdir[curlib]]); ! 349: return(0); ! 350: ! 351: case CS_FILE_GET: ! 352: if(!fexist(csi->str)) { ! 353: bputs(text[FileNotFound]); ! 354: return(0); } ! 355: if(!chksyspass()) ! 356: return(0); ! 357: ! 358: case CS_FILE_SEND: ! 359: ! 360: csi->logic=sendfile(csi->str) ? LOGIC_TRUE:LOGIC_FALSE; ! 361: return(0); ! 362: ! 363: case CS_FILE_PUT: ! 364: csi->logic=LOGIC_FALSE; ! 365: if(!chksyspass()) ! 366: return(0); ! 367: ! 368: case CS_FILE_RECEIVE: ! 369: csi->logic=recvfile(csi->str) ? LOGIC_TRUE:LOGIC_FALSE; ! 370: return(0); ! 371: ! 372: case CS_FILE_UPLOAD_BULK: ! 373: ! 374: if(!usrlibs) return(0); ! 375: ! 376: if(!stricmp(csi->str,"ALL")) { /* all libraries */ ! 377: for(i=0;i<usrlibs;i++) ! 378: for(j=0;j<usrdirs[i];j++) { ! 379: if(cfg.lib[i]->offline_dir==usrdir[i][j]) ! 380: continue; ! 381: if(bulkupload(usrdir[i][j])) return(0); } ! 382: return(0); } ! 383: if(!stricmp(csi->str,"LIB")) { /* current library */ ! 384: for(i=0;i<usrdirs[curlib];i++) { ! 385: if(cfg.lib[usrlib[curlib]]->offline_dir ! 386: ==usrdir[curlib][i]) ! 387: continue; ! 388: if(bulkupload(usrdir[curlib][i])) return(0); } ! 389: return(0); } ! 390: bulkupload(usrdir[curlib][curdir[curlib]]); /* current dir */ ! 391: return(0); ! 392: ! 393: case CS_FILE_FIND_OLD: ! 394: case CS_FILE_FIND_OPEN: ! 395: case CS_FILE_FIND_OFFLINE: ! 396: case CS_FILE_FIND_OLD_UPLOADS: ! 397: if(!usrlibs) return(0); ! 398: if(!getfilespec(tmp)) ! 399: return(0); ! 400: padfname(tmp,str); ! 401: k=0; ! 402: bputs("\r\nSearching "); ! 403: if(!stricmp(csi->str,"ALL")) ! 404: bputs("all libraries"); ! 405: else if(!stricmp(csi->str,"LIB")) ! 406: bputs("library"); ! 407: else ! 408: bputs("directory"); ! 409: bputs(" for files "); ! 410: if(*(csi->ip-1)==CS_FILE_FIND_OLD_UPLOADS) { ! 411: l=FI_OLDUL; ! 412: bprintf("uploaded before %s\r\n",timestr(&ns_time)); } ! 413: else if(*(csi->ip-1)==CS_FILE_FIND_OLD) { /* go by download date */ ! 414: l=FI_OLD; ! 415: bprintf("not downloaded since %s\r\n",timestr(&ns_time)); } ! 416: else if(*(csi->ip-1)==CS_FILE_FIND_OFFLINE) { ! 417: l=FI_OFFLINE; ! 418: bputs("not online...\r\n"); } ! 419: else { ! 420: l=FI_CLOSE; ! 421: bputs("currently open...\r\n"); } ! 422: if(!stricmp(csi->str,"ALL")) { ! 423: for(i=0;i<usrlibs;i++) ! 424: for(j=0;j<usrdirs[i];j++) { ! 425: if(cfg.lib[i]->offline_dir==usrdir[i][j]) ! 426: continue; ! 427: if((s=listfileinfo(usrdir[i][j],str,(char)l))==-1) ! 428: return(0); ! 429: else k+=s; } } ! 430: else if(!stricmp(csi->str,"LIB")) { ! 431: for(i=0;i<usrdirs[curlib];i++) { ! 432: if(cfg.lib[usrlib[curlib]]->offline_dir==usrdir[curlib][i]) ! 433: continue; ! 434: if((s=listfileinfo(usrdir[curlib][i],str,(char)l))==-1) ! 435: return(0); ! 436: else k+=s; } } ! 437: else { ! 438: s=listfileinfo(usrdir[curlib][curdir[curlib]],str,(char)l); ! 439: if(s==-1) ! 440: return(0); ! 441: k=s; } ! 442: if(k>1) { ! 443: bprintf(text[NFilesListed],k); } ! 444: return(0); } ! 445: ! 446: if(*(csi->ip-1)>=CS_MSG_SET_AREA && *(csi->ip-1)<=CS_MSG_UNUSED1) { ! 447: csi->ip--; ! 448: return(exec_msg(csi)); } ! 449: ! 450: if(*(csi->ip-1)>=CS_FILE_SET_AREA && *(csi->ip-1)<=CS_FILE_RECEIVE) { ! 451: csi->ip--; ! 452: return(exec_file(csi)); } ! 453: ! 454: errormsg(WHERE,ERR_CHK,"shell function",*(csi->ip-1)); ! 455: return(0); ! 456: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.