|
|
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.