|
|
1.1 root 1: /* execfile.cpp */
2:
3: /* Synchronet file transfer-related command shell/module routines */
4:
1.1.1.2 ! root 5: /* $Id: execfile.cpp,v 1.13 2011/08/06 21:12:09 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_file(csi_t *csi)
42: {
43: char str[256],ch;
44: int s;
45: uint i,j,x,y;
46: file_t f;
47:
48: switch(*(csi->ip++)) {
49:
50: case CS_FILE_SELECT_AREA:
51: csi->logic=LOGIC_FALSE;
52: if(!usrlibs) return(0);
53: while(online) {
54: j=0;
55: if(usrlibs>1) {
56: sprintf(str,"%smenu/libs.*", cfg.text_dir);
57: if(fexist(str))
58: menu("libs");
59: else {
60: bputs(text[CfgLibLstHdr]);
61: for(i=0;i<usrlibs && !msgabort();i++) {
62: if(i==curlib)
63: outchar('*');
64: else outchar(' ');
65: if(i<9) outchar(' ');
66: if(i<99) outchar(' ');
67: bprintf(text[CfgLibLstFmt]
1.1.1.2 ! root 68: ,i+1,cfg.lib[usrlib[i]]->lname);
! 69: }
! 70: }
1.1 root 71: sprintf(str,text[JoinWhichLib],curlib+1);
72: mnemonics(str);
73: j=getnum(usrlibs);
74: if((int)j==-1)
75: return(0);
76: if(!j)
77: j=curlib;
78: else
1.1.1.2 ! root 79: j--;
! 80: }
1.1 root 81: sprintf(str,"%smenu/dirs%u.*", cfg.text_dir, usrlib[j]+1);
82: if(fexist(str)) {
83: sprintf(str,"dirs%u",usrlib[j]+1);
1.1.1.2 ! root 84: menu(str);
! 85: }
1.1 root 86: else {
87: CLS;
88: bprintf(text[DirLstHdr], cfg.lib[usrlib[j]]->lname);
89: for(i=0;i<usrdirs[j] && !msgabort();i++) {
90: if(i==curdir[j]) outchar('*');
91: else outchar(' ');
92: sprintf(str,text[DirLstFmt],i+1
93: ,cfg.dir[usrdir[j][i]]->lname,nulstr
94: ,getfiles(&cfg,usrdir[j][i]));
95: if(i<9) outchar(' ');
96: if(i<99) outchar(' ');
1.1.1.2 ! root 97: bputs(str);
! 98: }
! 99: }
1.1 root 100: sprintf(str,text[JoinWhichDir],curdir[j]+1);
101: mnemonics(str);
102: i=getnum(usrdirs[j]);
103: if((int)i==-1) {
104: if(usrlibs==1)
105: return(0);
1.1.1.2 ! root 106: continue;
! 107: }
1.1 root 108: if(!i)
109: i=curdir[j];
110: else
111: i--;
112: curlib=j;
113: curdir[curlib]=i;
114: csi->logic=LOGIC_TRUE;
1.1.1.2 ! root 115: return(0);
! 116: }
1.1 root 117: return(0);
118:
119: case CS_FILE_GET_DIR_NUM:
120:
121: if(useron.misc&COLDKEYS) {
122: i=atoi(csi->str);
123: if(i && i<=usrdirs[curlib] && usrlibs)
124: curdir[curlib]=i-1;
1.1.1.2 ! root 125: return(0);
! 126: }
1.1 root 127:
128: ch=getkey(K_UPPER);
129: outchar(ch);
130: if((ch&0xf)*10U<=usrdirs[curlib] && (ch&0xf) && usrlibs) {
131: i=(ch&0xf)*10;
132: ch=getkey(K_UPPER);
133: if(!isdigit(ch) && ch!=CR) {
134: ungetkey(ch);
135: curdir[curlib]=(i/10)-1;
1.1.1.2 ! root 136: return(0);
! 137: }
1.1 root 138: outchar(ch);
139: if(ch==CR) {
140: curdir[curlib]=(i/10)-1;
1.1.1.2 ! root 141: return(0);
! 142: }
1.1 root 143: logch(ch,0);
144: i+=ch&0xf;
145: if(i*10<=usrdirs[curlib]) { /* 100+ dirs */
146: i*=10;
147: ch=getkey(K_UPPER);
148: if(!isdigit(ch) && ch!=CR) {
149: ungetkey(ch);
150: curdir[curlib]=(i/10)-1;
1.1.1.2 ! root 151: return(0);
! 152: }
1.1 root 153: outchar(ch);
154: if(ch==CR) {
155: curdir[curlib]=(i/10)-1;
1.1.1.2 ! root 156: return(0);
! 157: }
1.1 root 158: logch(ch,0);
1.1.1.2 ! root 159: i+=ch&0xf;
! 160: }
1.1 root 161: if(i<=usrdirs[curlib])
162: curdir[curlib]=i-1;
1.1.1.2 ! root 163: return(0);
! 164: }
1.1 root 165: if((ch&0xf)<=(int)usrdirs[curlib] && (ch&0xf) && usrlibs)
166: curdir[curlib]=(ch&0xf)-1;
167: return(0);
168:
169: case CS_FILE_GET_LIB_NUM:
170:
171: if(useron.misc&COLDKEYS) {
172: i=atoi(csi->str);
173: if(i && i<=usrlibs)
174: curlib=i-1;
1.1.1.2 ! root 175: return(0);
! 176: }
1.1 root 177:
178: ch=getkey(K_UPPER);
179: outchar(ch);
180: if((ch&0xf)*10U<=usrlibs && (ch&0xf)) {
181: i=(ch&0xf)*10;
182: ch=getkey(K_UPPER);
183: if(!isdigit(ch) && ch!=CR) {
184: ungetkey(ch);
185: curlib=(i/10)-1;
1.1.1.2 ! root 186: return(0);
! 187: }
1.1 root 188: outchar(ch);
189: if(ch==CR) {
190: curlib=(i/10)-1;
1.1.1.2 ! root 191: return(0);
! 192: }
1.1 root 193: logch(ch,0);
194: i+=ch&0xf;
195: if(i<=usrlibs)
196: curlib=i-1;
1.1.1.2 ! root 197: return(0);
! 198: }
1.1 root 199: if((ch&0xf)<=(int)usrlibs && (ch&0xf))
200: curlib=(ch&0xf)-1;
201: return(0);
202:
203: case CS_FILE_SHOW_LIBRARIES:
204: if(!usrlibs) return(0);
205: sprintf(str,"%smenu/libs.*", cfg.text_dir);
206: if(fexist(str)) {
207: menu("libs");
1.1.1.2 ! root 208: return(0);
! 209: }
1.1 root 210: bputs(text[LibLstHdr]);
211: for(i=0;i<usrlibs && !msgabort();i++) {
212: if(i==curlib)
213: outchar('*');
214: else outchar(' ');
215: if(i<9) outchar(' ');
216: bprintf(text[LibLstFmt],i+1
1.1.1.2 ! root 217: ,cfg.lib[usrlib[i]]->lname,nulstr,usrdirs[i]);
! 218: }
1.1 root 219: return(0);
220:
221: case CS_FILE_SHOW_DIRECTORIES:
222: if(!usrlibs) return(0);
223: sprintf(str,"%smenu/dirs%u.*", cfg.text_dir, usrlib[curlib]+1);
224: if(fexist(str)) {
225: sprintf(str,"dirs%u",usrlib[curlib]+1);
226: menu(str);
1.1.1.2 ! root 227: return(0);
! 228: }
1.1 root 229: CRLF;
230: bprintf(text[DirLstHdr],cfg.lib[usrlib[curlib]]->lname);
231: for(i=0;i<usrdirs[curlib] && !msgabort();i++) {
232: if(i==curdir[curlib]) outchar('*');
233: else outchar(' ');
234: sprintf(str,text[DirLstFmt],i+1
235: ,cfg.dir[usrdir[curlib][i]]->lname,nulstr
236: ,getfiles(&cfg,usrdir[curlib][i]));
237: if(i<9) outchar(' ');
238: if(i<99) outchar(' ');
1.1.1.2 ! root 239: bputs(str);
! 240: }
1.1 root 241: return(0);
242:
243: case CS_FILE_LIBRARY_UP:
244: curlib++;
245: if(curlib>=usrlibs)
246: curlib=0;
247: return(0);
248: case CS_FILE_LIBRARY_DOWN:
249: if(!curlib)
250: curlib=usrlibs-1;
251: else curlib--;
252: return(0);
253: case CS_FILE_DIRECTORY_UP:
254: if(!usrlibs) return(0);
255: curdir[curlib]++;
256: if(curdir[curlib]>=usrdirs[curlib])
257: curdir[curlib]=0;
258: return(0);
259: case CS_FILE_DIRECTORY_DOWN:
260: if(!usrlibs) return(0);
261: if(!curdir[curlib])
262: curdir[curlib]=usrdirs[curlib]-1;
263: else curdir[curlib]--;
264: return(0);
265: case CS_FILE_SET_AREA:
266: csi->logic=LOGIC_TRUE;
267: for(i=0;i<usrlibs;i++)
268: for(j=0;j<usrdirs[i];j++)
269: if(!stricmp(csi->str,cfg.dir[usrdir[i][j]]->code)) {
270: curlib=i;
271: curdir[i]=j;
1.1.1.2 ! root 272: return(0);
! 273: }
1.1 root 274: csi->logic=LOGIC_FALSE;
275: return(0);
276: case CS_FILE_SET_LIBRARY:
277: csi->logic=LOGIC_TRUE;
278: for(i=0;i<usrlibs;i++)
279: if(!stricmp(cfg.lib[usrlib[i]]->sname,csi->str))
280: break;
281: if(i<usrlibs)
282: curlib=i;
283: else
284: csi->logic=LOGIC_FALSE;
285: return(0);
286:
287: case CS_FILE_UPLOAD:
288: csi->logic=LOGIC_FALSE;
289: if(usrlibs) {
290: i=usrdir[curlib][curdir[curlib]];
291: if(cfg.upload_dir!=INVALID_DIR
1.1.1.2 ! root 292: && !dir_op(i) && !(useron.exempt&FLAG('U'))
! 293: && !chk_ar(cfg.dir[i]->ul_ar,&useron,&client))
1.1 root 294: i=cfg.upload_dir;
295: } else
296: i=cfg.upload_dir;
297: csi->logic=upload(i) ? LOGIC_TRUE:LOGIC_FALSE;
298: return(0);
299: case CS_FILE_UPLOAD_USER:
300: csi->logic=LOGIC_FALSE;
301: if(cfg.user_dir==INVALID_DIR) {
302: bputs(text[NoUserDir]);
303: return(0);
304: }
305: csi->logic=upload(cfg.user_dir) ? LOGIC_TRUE:LOGIC_FALSE;
306: return(0);
307: case CS_FILE_UPLOAD_SYSOP:
308: csi->logic=LOGIC_FALSE;
309: if(cfg.sysop_dir==INVALID_DIR) {
310: bputs(text[NoSysopDir]);
311: return(0);
312: }
313: csi->logic=upload(cfg.sysop_dir) ? LOGIC_TRUE:LOGIC_FALSE;
314: return(0);
315: case CS_FILE_DOWNLOAD:
316: if(!usrlibs) return(0);
317: if(useron.rest&FLAG('D')) {
318: bputs(text[R_Download]);
1.1.1.2 ! root 319: return(0);
! 320: }
1.1 root 321: padfname(csi->str,str);
322: strupr(str);
323: if(!listfileinfo(usrdir[curlib][curdir[curlib]],str,FI_DOWNLOAD)) {
324: bputs(text[SearchingAllDirs]);
325: for(i=0;i<usrdirs[curlib];i++)
326: if(i!=curdir[curlib] &&
327: (s=listfileinfo(usrdir[curlib][i],str,FI_DOWNLOAD))!=0)
328: if(s==-1 || (!strchr(str,'?') && !strchr(str,'*')))
329: return(0);
330: bputs(text[SearchingAllLibs]);
331: for(i=0;i<usrlibs;i++) {
332: if(i==curlib) continue;
333: for(j=0;j<usrdirs[i];j++)
334: if((s=listfileinfo(usrdir[i][j],str,FI_DOWNLOAD))!=0)
335: if(s==-1 || (!strchr(str,'?') && !strchr(str,'*')))
1.1.1.2 ! root 336: return(0);
! 337: }
! 338: }
1.1 root 339: return(0);
340: case CS_FILE_DOWNLOAD_USER: /* Download from user dir */
341: csi->logic=LOGIC_FALSE;
342: if(cfg.user_dir==INVALID_DIR) {
343: bputs(text[NoUserDir]);
1.1.1.2 ! root 344: return(0);
! 345: }
1.1 root 346: if(useron.rest&FLAG('D')) {
347: bputs(text[R_Download]);
1.1.1.2 ! root 348: return(0);
! 349: }
1.1 root 350: CRLF;
351: if(!listfileinfo(cfg.user_dir,nulstr,FI_USERXFER))
352: bputs(text[NoFilesForYou]);
353: else
354: csi->logic=LOGIC_TRUE;
355: return(0);
356: case CS_FILE_DOWNLOAD_BATCH:
1.1.1.2 ! root 357: if(batdn_total && (text[DownloadBatchQ][0]==0 || yesno(text[DownloadBatchQ]))) {
1.1 root 358: start_batch_download();
1.1.1.2 ! root 359: csi->logic=LOGIC_TRUE;
! 360: }
1.1 root 361: else
362: csi->logic=LOGIC_FALSE;
363: return(0);
364: case CS_FILE_BATCH_ADD_LIST:
365: batch_add_list(csi->str);
366: return(0);
367: case CS_FILE_BATCH_ADD:
368: csi->logic=LOGIC_FALSE;
369: if(!csi->str[0])
370: return(0);
371: padfname(csi->str,f.name);
372: for(x=y=0;x<usrlibs;x++) {
373: for(y=0;y<usrdirs[x];y++)
374: if(findfile(&cfg,usrdir[x][y],f.name))
375: break;
376: if(y<usrdirs[x])
1.1.1.2 ! root 377: break;
! 378: }
1.1 root 379: if(x>=usrlibs)
380: return(0);
381: f.dir=usrdir[x][y];
382: getfileixb(&cfg,&f);
383: f.size=0;
384: getfiledat(&cfg,&f);
385: addtobatdl(&f);
386: csi->logic=LOGIC_TRUE;
387: return(0);
388: case CS_FILE_BATCH_CLEAR:
389: if(!batdn_total) {
390: csi->logic=LOGIC_FALSE;
1.1.1.2 ! root 391: return(0);
! 392: }
1.1 root 393: csi->logic=LOGIC_TRUE;
394: for(i=0;i<batdn_total;i++) {
395: f.dir=batdn_dir[i];
396: f.datoffset=batdn_offset[i];
397: f.size=batdn_size[i];
398: strcpy(f.name,batdn_name[i]);
1.1.1.2 ! root 399: closefile(&f);
! 400: }
1.1 root 401: batdn_total=0;
402: return(0);
403:
404: case CS_FILE_VIEW:
405: if(!usrlibs) return(0);
406: padfname(csi->str,str);
407: strupr(str);
408: csi->logic=LOGIC_TRUE;
409: if(listfiles(usrdir[curlib][curdir[curlib]],str,0,FL_VIEW))
410: return(0);
411: bputs(text[SearchingAllDirs]);
412: for(i=0;i<usrdirs[curlib];i++) {
413: if(i==curdir[curlib]) continue;
414: if(listfiles(usrdir[curlib][i],str,0,FL_VIEW))
1.1.1.2 ! root 415: break;
! 416: }
1.1 root 417: if(i<usrdirs[curlib])
418: return(0);
419: bputs(text[SearchingAllLibs]);
420: for(i=0;i<usrlibs;i++) {
421: if(i==curlib) continue;
422: for(j=0;j<usrdirs[i];j++)
423: if(listfiles(usrdir[i][j],str,0,FL_VIEW))
1.1.1.2 ! root 424: return(0);
! 425: }
1.1 root 426: csi->logic=LOGIC_FALSE;
427: bputs(text[FileNotFound]);
428: return(0);
429: case CS_FILE_LIST: /* List files in current dir */
430: if(!usrlibs) return(0);
431: csi->logic=LOGIC_FALSE;
432: if(!getfiles(&cfg,usrdir[curlib][curdir[curlib]])) {
433: bputs(text[EmptyDir]);
1.1.1.2 ! root 434: return(0);
! 435: }
1.1 root 436: padfname(csi->str,str);
437: strupr(str);
438: s=listfiles(usrdir[curlib][curdir[curlib]],str,0,0);
439: if(s>1) {
1.1.1.2 ! root 440: bprintf(text[NFilesListed],s);
! 441: }
1.1 root 442: csi->logic=!s;
443: return(0);
444: case CS_FILE_LIST_EXTENDED: /* Extended Information on files */
445: if(!usrlibs) return(0);
446: padfname(csi->str,str);
447: strupr(str);
448: if(!listfileinfo(usrdir[curlib][curdir[curlib]],str,FI_INFO)) {
449: bputs(text[SearchingAllDirs]);
450: for(i=0;i<usrdirs[curlib];i++)
451: if(i!=curdir[curlib] && (s=listfileinfo(usrdir[curlib][i]
452: ,str,FI_INFO))!=0)
453: if(s==-1 || (!strchr(str,'?') && !strchr(str,'*')))
454: return(0);
455: bputs(text[SearchingAllLibs]);
456: for(i=0;i<usrlibs;i++) {
457: if(i==curlib) continue;
458: for(j=0;j<usrdirs[i];j++)
459: if((s=listfileinfo(usrdir[i][j],str,FI_INFO))!=0)
460: if(s==-1 || (!strchr(str,'?') && !strchr(str,'*')))
1.1.1.2 ! root 461: return(0);
! 462: }
! 463: }
1.1 root 464: return(0);
465: case CS_FILE_FIND_TEXT: /* Find text in descriptions */
466: scandirs(FL_FINDDESC);
467: return(0);
468: case CS_FILE_FIND_TEXT_ALL: /* Find text in descriptions */
469: scanalldirs(FL_FINDDESC);
470: return(0);
471: case CS_FILE_FIND_NAME: /* Find text in descriptions */
472: scandirs(FL_NO_HDR);
473: return(0);
474: case CS_FILE_FIND_NAME_ALL: /* Find text in descriptions */
475: scanalldirs(FL_NO_HDR);
476: return(0);
477: case CS_FILE_BATCH_SECTION:
478: batchmenu();
479: return(0);
480: case CS_FILE_TEMP_SECTION:
481: temp_xfer();
482: return(0);
483: case CS_FILE_PTRS_CFG:
484: csi->logic=!inputnstime(&ns_time);
485: return(0);
486: case CS_FILE_NEW_SCAN:
487: scandirs(FL_ULTIME);
488: return(0);
489: case CS_FILE_NEW_SCAN_ALL:
490: scanalldirs(FL_ULTIME);
491: return(0);
492: case CS_FILE_REMOVE:
493: if(!usrlibs) return(0);
494: if(useron.rest&FLAG('R')) {
495: bputs(text[R_RemoveFiles]);
1.1.1.2 ! root 496: return(0);
! 497: }
1.1 root 498: padfname(csi->str,str);
499: strupr(str);
500: if(!listfileinfo(usrdir[curlib][curdir[curlib]],str,FI_REMOVE)) {
501: if(cfg.user_dir!=INVALID_DIR
502: && cfg.user_dir!=usrdir[curlib][curdir[curlib]])
503: if((s=listfileinfo(cfg.user_dir,str,FI_REMOVE))!=0)
504: if(s==-1 || (!strchr(str,'?') && !strchr(str,'*')))
505: return(0);
506: bputs(text[SearchingAllDirs]);
507: for(i=0;i<usrdirs[curlib];i++)
508: if(i!=curdir[curlib] && i!=cfg.user_dir
509: && (s=listfileinfo(usrdir[curlib][i],str,FI_REMOVE))!=0)
510: if(s==-1 || (!strchr(str,'?') && !strchr(str,'*')))
511: return(0);
512: bputs(text[SearchingAllLibs]);
513: for(i=0;i<usrlibs;i++) {
514: if(i==curlib || i==cfg.user_dir) continue;
515: for(j=0;j<usrdirs[i]; j++)
516: if((s=listfileinfo(usrdir[i][j],str,FI_REMOVE))!=0)
517: if(s==-1 || (!strchr(str,'?') && !strchr(str,'*')))
1.1.1.2 ! root 518: return(0);
! 519: }
! 520: }
1.1 root 521: return(0);
522: }
523:
524: errormsg(WHERE,ERR_CHK,"shell function",*(csi->ip-1));
525: return(0);
526: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.