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