|
|
1.1 root 1: /* execfunc.cpp */
2:
3: /* Hi-level command shell/module routines (functions) */
4:
1.1.1.2 ! root 5: /* $Id: execfunc.cpp,v 1.41 2011/07/21 11:19:22 rswindell Exp $ */
1.1 root 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: * *
1.1.1.2 ! root 11: * Copyright 2011 Rob Swindell - http://www.synchro.net/copyright.html *
1.1 root 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:
1.1.1.2 ! root 113: if(text[LogOffQ][0]==0 || !noyes(text[LogOffQ])) {
1.1 root 114: if(cfg.logoff_mod[0])
115: exec_bin(cfg.logoff_mod,csi);
116: user_event(EVENT_LOGOFF);
117: menu("logoff");
118: SYNC;
1.1.1.2 ! root 119: hangup();
! 120: }
1.1 root 121: return(0);
122: case CS_LOGOFF_FAST:
123: SYNC;
124: hangup();
125: return(0);
126: case CS_NODELIST_ALL:
127: nodelist();
128: return(0);
129: case CS_NODELIST_USERS:
130: whos_online(true);
131: return(0);
132: case CS_USERLIST_SUB:
133: userlist(UL_SUB);
134: return(0);
135: case CS_USERLIST_DIR:
136: userlist(UL_DIR);
137: return(0);
138: case CS_USERLIST_ALL:
139: userlist(UL_ALL);
140: return(0);
141: case CS_USERLIST_LOGONS:
142: logonlist();
143: return(0);
144: case CS_PAGE_SYSOP:
145: csi->logic=sysop_page() ? LOGIC_TRUE:LOGIC_FALSE;
146: return(0);
147: case CS_PAGE_GURU:
148: csi->logic=guru_page() ? LOGIC_TRUE:LOGIC_FALSE;
149: return(0);
150: case CS_SPY:
151: csi->logic=spy(atoi(csi->str)) ? LOGIC_TRUE:LOGIC_FALSE;
152: return(0);
153: case CS_PRIVATE_CHAT:
154: privchat();
155: return(0);
156: case CS_PRIVATE_MESSAGE:
157: nodemsg();
158: return(0);
159:
160: /*******************/
161: /* Sysop Functions */
162: /*******************/
163: case CS_USER_EDIT:
164: useredit(csi->str[0] ? finduser(csi->str) : 0);
165: return(0);
166:
167:
168: /******************/
169: /* Mail Functions */
170: /******************/
171:
172: case CS_MAIL_READ: /* Read E-mail */
173: readmail(useron.number,MAIL_YOUR);
174: return(0);
175: case CS_MAIL_READ_SENT: /* Kill/read sent mail */
176: readmail(useron.number,MAIL_SENT);
177: return(0);
178: case CS_MAIL_READ_ALL:
179: readmail(useron.number,MAIL_ALL);
180: return(0);
181: case CS_MAIL_SEND: /* Send E-mail */
182: if(strchr(csi->str,'@')) {
183: i=1;
1.1.1.2 ! root 184: netmail(csi->str,nulstr,0);
! 185: }
1.1 root 186: else if((i=finduser(csi->str))!=0
1.1.1.2 ! root 187: || (cfg.msg_misc&MM_REALNAME && (i=userdatdupe(0,U_NAME,LEN_NAME,csi->str))!=0))
1.1 root 188: email(i,nulstr,nulstr,WM_EMAIL);
189: csi->logic=!i;
190: return(0);
191: case CS_MAIL_SEND_FEEDBACK: /* Feedback */
192: if((i=finduser(csi->str))!=0)
193: email(i,text[ReFeedback],nulstr,WM_EMAIL);
194: csi->logic=!i;
195: return(0);
196: case CS_MAIL_SEND_NETMAIL:
197: bputs(text[EnterNetMailAddress]);
198: if(getstr(str,60,K_LINE)) {
199: netmail(str,nulstr,0);
1.1.1.2 ! root 200: csi->logic=LOGIC_TRUE;
! 201: }
1.1 root 202: else
203: csi->logic=LOGIC_FALSE;
204: return(0);
205:
206: case CS_MAIL_SEND_NETFILE:
207: bputs(text[EnterNetMailAddress]);
208: if(getstr(str,60,K_LINE)) {
209: netmail(str,nulstr,WM_FILE);
1.1.1.2 ! root 210: csi->logic=LOGIC_TRUE;
! 211: }
1.1 root 212: else
213: csi->logic=LOGIC_FALSE;
214: return(0);
215:
216: case CS_MAIL_SEND_FILE: /* Upload Attached File to E-mail */
217: if(strchr(csi->str,'@')) {
218: i=1;
1.1.1.2 ! root 219: netmail(csi->str,nulstr,WM_FILE);
! 220: }
1.1 root 221: else if((i=finduser(csi->str))!=0
1.1.1.2 ! root 222: || (cfg.msg_misc&MM_REALNAME && (i=userdatdupe(0,U_NAME,LEN_NAME,csi->str))!=0))
1.1 root 223: email(i,nulstr,nulstr,WM_EMAIL|WM_FILE);
224: csi->logic=!i;
225: return(0);
226: case CS_MAIL_SEND_BULK:
227: if(csi->str[0])
228: p=arstr(NULL,csi->str, &cfg);
229: else
230: p=(uchar *)nulstr;
231: bulkmail(p);
232: if(p && p[0])
233: free(p);
234: return(0);
235:
236: case CS_INC_MAIN_CMDS:
237: main_cmds++;
238: return(0);
239:
240: case CS_INC_FILE_CMDS:
241: xfer_cmds++;
242: return(0);
243:
244: case CS_SYSTEM_LOG: /* System log */
245: if(!chksyspass())
246: return(0);
247: if(localtime_r(&now,&tm)==NULL)
248: return(0);
249: sprintf(str,"%slogs/%2.2d%2.2d%2.2d.log", cfg.logs_dir
250: ,tm.tm_mon+1,tm.tm_mday,TM_YEAR(tm.tm_year));
251: printfile(str,0);
252: return(0);
253: case CS_SYSTEM_YLOG: /* Yesterday's log */
254: if(!chksyspass())
255: return(0);
256: now-=(ulong)60L*24L*60L;
257: if(localtime_r(&now,&tm)==NULL)
258: return(0);
259: sprintf(str,"%slogs/%2.2d%2.2d%2.2d.log",cfg.logs_dir
260: ,tm.tm_mon+1,tm.tm_mday,TM_YEAR(tm.tm_year));
261: printfile(str,0);
262: return(0);
263: case CS_SYSTEM_STATS: /* System Statistics */
264: sys_stats();
265: return(0);
266: case CS_NODE_STATS: /* Node Statistics */
267: node_stats(atoi(csi->str));
268: return(0);
269: case CS_CHANGE_USER: /* Change to another user */
270: change_user();
271: return(0);
272: case CS_SHOW_MEM:
273: return(0);
274: case CS_ERROR_LOG:
275: sprintf(str,"%serror.log", cfg.logs_dir);
276: if(fexist(str)) {
277: bputs(text[ErrorLogHdr]);
278: printfile(str,0);
1.1.1.2 ! root 279: if(text[DeleteErrorLogQ][0] && !noyes(text[DeleteErrorLogQ]))
! 280: remove(str);
! 281: }
1.1 root 282: else
1.1.1.2 ! root 283: bprintf(text[FileDoesNotExist],str);
1.1 root 284: for(i=1;i<=cfg.sys_nodes;i++) {
285: getnodedat(i,&node,0);
286: if(node.errors)
1.1.1.2 ! root 287: break;
! 288: }
1.1 root 289: if(i<=cfg.sys_nodes || criterrs) {
1.1.1.2 ! root 290: if(text[ClearErrCounter][0]==0 || !noyes(text[ClearErrCounter])) {
1.1 root 291: for(i=1;i<=cfg.sys_nodes;i++) {
292: if(getnodedat(i,&node,true)==0) {
293: node.errors=0;
294: putnodedat(i,&node);
295: }
296: criterrs=0;
297: }
298: }
299: }
300: return(0);
301: case CS_ANSI_CAPTURE: /* Capture ANSI codes */
302: sys_status^=SS_ANSCAP;
303: bprintf(text[ANSICaptureIsNow]
304: ,sys_status&SS_ANSCAP ? text[ON] : text[OFF]);
305: return(0);
306: case CS_LIST_TEXT_FILE: /* View ASCII/ANSI/Ctrl-A file */
307: if(!chksyspass())
308: return(0);
309: bputs(text[Filename]);
310: if(getstr(str,60,0))
311: printfile(str,0);
312: return(0);
313: case CS_EDIT_TEXT_FILE: /* Edit ASCII/Ctrl-A file */
314: if(!chksyspass())
315: return(0);
316: bputs(text[Filename]);
317: if(getstr(str,60,0))
318: editfile(str);
319: return(0);
320: case CS_GURU_LOG:
321: sprintf(str,"%sguru.log", cfg.logs_dir);
322: if(fexist(str)) {
323: printfile(str,0);
324: CRLF;
1.1.1.2 ! root 325: if(text[DeleteGuruLogQ][0] && !noyes(text[DeleteGuruLogQ]))
! 326: remove(str);
! 327: }
1.1 root 328: return(0);
329: case CS_FILE_SET_ALT_PATH:
330: altul=atoi(csi->str);
331: if(altul>cfg.altpaths)
332: altul=0;
333: bprintf(text[AltULPathIsNow],altul ? cfg.altpath[altul-1] : text[OFF]);
334: return(0);
335: case CS_FILE_RESORT_DIRECTORY:
336: for(i=1;i<=cfg.sys_nodes;i++)
337: if(i!=cfg.node_num) {
338: getnodedat(i,&node,0);
339: if(node.status==NODE_INUSE
340: || node.status==NODE_QUIET)
1.1.1.2 ! root 341: break;
! 342: }
1.1 root 343:
344: if(i<=cfg.sys_nodes) {
345: bputs(text[ResortWarning]);
1.1.1.2 ! root 346: return(0);
! 347: }
1.1 root 348:
349: if(!stricmp(csi->str,"ALL")) { /* all libraries */
350: for(i=0;i<usrlibs;i++)
351: for(j=0;j<usrdirs[i];j++)
352: resort(usrdir[i][j]);
1.1.1.2 ! root 353: return(0);
! 354: }
1.1 root 355: if(!stricmp(csi->str,"LIB")) { /* current library */
356: for(i=0;i<usrdirs[curlib];i++)
357: resort(usrdir[curlib][i]);
1.1.1.2 ! root 358: return(0);
! 359: }
1.1 root 360: resort(usrdir[curlib][curdir[curlib]]);
361: return(0);
362:
363: case CS_FILE_GET:
364: if(!fexist(csi->str)) {
365: bputs(text[FileNotFound]);
1.1.1.2 ! root 366: return(0);
! 367: }
1.1 root 368: if(!chksyspass())
369: return(0);
370:
371: case CS_FILE_SEND:
372:
373: csi->logic=sendfile(csi->str) ? LOGIC_TRUE:LOGIC_FALSE;
374: return(0);
375:
376: case CS_FILE_PUT:
377: csi->logic=LOGIC_FALSE;
378: if(!chksyspass())
379: return(0);
380:
381: case CS_FILE_RECEIVE:
382: csi->logic=recvfile(csi->str) ? LOGIC_TRUE:LOGIC_FALSE;
383: return(0);
384:
385: case CS_FILE_UPLOAD_BULK:
386:
387: if(!usrlibs) return(0);
388:
389: if(!stricmp(csi->str,"ALL")) { /* all libraries */
390: for(i=0;i<usrlibs;i++)
391: for(j=0;j<usrdirs[i];j++) {
392: if(cfg.lib[i]->offline_dir==usrdir[i][j])
393: continue;
1.1.1.2 ! root 394: if(bulkupload(usrdir[i][j])) return(0);
! 395: }
! 396: return(0);
! 397: }
1.1 root 398: if(!stricmp(csi->str,"LIB")) { /* current library */
399: for(i=0;i<usrdirs[curlib];i++) {
400: if(cfg.lib[usrlib[curlib]]->offline_dir
401: ==usrdir[curlib][i])
402: continue;
1.1.1.2 ! root 403: if(bulkupload(usrdir[curlib][i])) return(0);
! 404: }
! 405: return(0);
! 406: }
1.1 root 407: bulkupload(usrdir[curlib][curdir[curlib]]); /* current dir */
408: return(0);
409:
410: case CS_FILE_FIND_OLD:
411: case CS_FILE_FIND_OPEN:
412: case CS_FILE_FIND_OFFLINE:
413: case CS_FILE_FIND_OLD_UPLOADS:
414: if(!usrlibs) return(0);
415: if(!getfilespec(tmp))
416: return(0);
417: padfname(tmp,str);
418: k=0;
419: bputs("\r\nSearching ");
420: if(!stricmp(csi->str,"ALL"))
421: bputs("all libraries");
422: else if(!stricmp(csi->str,"LIB"))
423: bputs("library");
424: else
425: bputs("directory");
426: bputs(" for files ");
427: if(*(csi->ip-1)==CS_FILE_FIND_OLD_UPLOADS) {
428: l=FI_OLDUL;
1.1.1.2 ! root 429: bprintf("uploaded before %s\r\n",timestr(ns_time));
! 430: }
1.1 root 431: else if(*(csi->ip-1)==CS_FILE_FIND_OLD) { /* go by download date */
432: l=FI_OLD;
1.1.1.2 ! root 433: bprintf("not downloaded since %s\r\n",timestr(ns_time));
! 434: }
1.1 root 435: else if(*(csi->ip-1)==CS_FILE_FIND_OFFLINE) {
436: l=FI_OFFLINE;
1.1.1.2 ! root 437: bputs("not online...\r\n");
! 438: }
1.1 root 439: else {
440: l=FI_CLOSE;
1.1.1.2 ! root 441: bputs("currently open...\r\n");
! 442: }
1.1 root 443: if(!stricmp(csi->str,"ALL")) {
444: for(i=0;i<usrlibs;i++)
445: for(j=0;j<usrdirs[i];j++) {
446: if(cfg.lib[i]->offline_dir==usrdir[i][j])
447: continue;
448: if((s=listfileinfo(usrdir[i][j],str,(char)l))==-1)
449: return(0);
1.1.1.2 ! root 450: else k+=s;
! 451: }
! 452: }
1.1 root 453: else if(!stricmp(csi->str,"LIB")) {
454: for(i=0;i<usrdirs[curlib];i++) {
455: if(cfg.lib[usrlib[curlib]]->offline_dir==usrdir[curlib][i])
456: continue;
457: if((s=listfileinfo(usrdir[curlib][i],str,(char)l))==-1)
458: return(0);
1.1.1.2 ! root 459: else k+=s;
! 460: }
! 461: }
1.1 root 462: else {
463: s=listfileinfo(usrdir[curlib][curdir[curlib]],str,(char)l);
464: if(s==-1)
465: return(0);
1.1.1.2 ! root 466: k=s;
! 467: }
1.1 root 468: if(k>1) {
1.1.1.2 ! root 469: bprintf(text[NFilesListed],k);
! 470: }
! 471: return(0);
! 472: }
1.1 root 473:
474: if(*(csi->ip-1)>=CS_MSG_SET_AREA && *(csi->ip-1)<=CS_MSG_UNUSED1) {
475: csi->ip--;
1.1.1.2 ! root 476: return(exec_msg(csi));
! 477: }
1.1 root 478:
479: if(*(csi->ip-1)>=CS_FILE_SET_AREA && *(csi->ip-1)<=CS_FILE_RECEIVE) {
480: csi->ip--;
1.1.1.2 ! root 481: return(exec_file(csi));
! 482: }
1.1 root 483:
484: errormsg(WHERE,ERR_CHK,"shell function",*(csi->ip-1));
485: return(0);
486: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.