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