|
|
1.1 root 1: #line 1 "XFER_HI.C"
2:
3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
4:
5: #include "sbbs.h"
6:
7: uint temp_dirnum;
8:
9: /****************************************************************************/
10: /* Uploads files */
11: /****************************************************************************/
12: void upload(uint dirnum)
13: {
14: static char lastdesc[59];
15: uchar str[256],src[256]={""},descbeg[25]={""},descend[25]={""},path[256]
16: ,fname[13],keys[256],ch,*p;
17: time_t start,end;
18: int i,j,file,destuser[MAX_USERXFER],destusers=0;
19: uint k;
20: file_t f;
21: struct dfree d;
22: user_t user;
23: node_t node;
24:
25: if(sys_status&SS_EVENT && online==ON_REMOTE && !dir_op(dirnum))
26: bprintf(text[UploadBeforeEvent],timeleft/60);
27: if(altul)
28: strcpy(path,altpath[altul-1]);
29: else
30: strcpy(path,dir[dirnum]->path);
31: if(path[1]==':')
32: i=path[0]-'A'+1;
33: else i=0;
34: getdfree(i,&d);
35: if(d.df_sclus==0xffff)
36: errormsg(WHERE,ERR_CHK,path,0);
37: if((ulong)d.df_bsec*(ulong)d.df_sclus
38: *(ulong)d.df_avail<(ulong)min_dspace*1024L) {
39: bputs(text[LowDiskSpace]);
40: sprintf(str,"Diskspace is low: %s",path);
41: errorlog(str);
42: if(!dir_op(dirnum))
43: return; }
44: bprintf(text[DiskNBytesFree],ultoac((ulong)d.df_bsec
45: *(ulong)d.df_sclus*(ulong)d.df_avail,tmp));
46: f.dir=curdirnum=dirnum;
47: f.misc=0;
48: f.altpath=altul;
49: bputs(text[Filename]);
50: if(!getstr(fname,12,K_UPPER) || strchr(fname,'?') || strchr(fname,'*')
51: || !checkfname(fname) || (trashcan(fname,"FILE") && !dir_op(dirnum))) {
52: if(fname[0])
53: bputs(text[BadFilename]);
54: return; }
55: if(dirnum==sysop_dir)
56: sprintf(str,text[UploadToSysopDirQ],fname);
57: else if(dirnum==user_dir)
58: sprintf(str,text[UploadToUserDirQ],fname);
59: else
60: sprintf(str,text[UploadToCurDirQ],fname,lib[dir[dirnum]->lib]->sname
61: ,dir[dirnum]->sname);
62: if(!yesno(str)) return;
63: action=NODE_ULNG;
64: padfname(fname,f.name);
65: sprintf(str,"%s%s",path,fname);
66: if(fexist(str)) { /* File is on disk */
67: if(!dir_op(dirnum) && online!=ON_LOCAL) { /* local users or sysops */
68: bprintf(text[FileAlreadyThere],fname);
69: return; }
70: if(!yesno(text[FileOnDiskAddQ]))
71: return; }
72: else if(online==ON_LOCAL) {
73: bputs(text[FileNotOnDisk]);
74: bputs(text[EnterPath]);
75: if(!getstr(tmp,60,K_LINE|K_UPPER))
76: return;
77: backslash(tmp);
78: sprintf(src,"%s%s",tmp,fname); }
79: strcpy(str,dir[dirnum]->exts);
80: strcpy(tmp,f.name);
81: truncsp(tmp);
82: j=strlen(str);
83: for(i=0;i<j;i+=ch+1) { /* Check extension of upload with allowable exts */
84: p=strchr(str+i,',');
85: if(p!=NULL)
86: *p=0;
87: ch=strlen(str+i);
88: if(!strcmp(tmp+9,str+i))
89: break; }
90: if(j && i>=j) {
91: bputs(text[TheseFileExtsOnly]);
92: bputs(dir[dirnum]->exts);
93: CRLF;
94: if(!dir_op(dirnum)) return; }
95: bputs(text[SearchingForDupes]);
96: for(i=k=0;i<usrlibs;i++)
97: for(j=0;j<usrdirs[i];j++,k++) {
98: outchar('.');
99: if(k && !(k%5))
100: bputs("\b\b\b\b\b \b\b\b\b\b");
101: if((usrdir[i][j]==dirnum || dir[usrdir[i][j]]->misc&DIR_DUPES)
102: && findfile(usrdir[i][j],f.name)) {
103: bputs(text[SearchedForDupes]);
104: bprintf(text[FileAlreadyOnline],f.name);
105: if(!dir_op(dirnum))
106: return; /* File is in database for another dir */
107: if(usrdir[i][j]==dirnum)
108: return; } } /* don't allow duplicates */
109: bputs(text[SearchedForDupes]);
110: if(dirnum==user_dir) { /* User to User transfer */
111: bputs(text[EnterAfterLastDestUser]);
112: while((!dir_op(dirnum) && destusers<max_userxfer) || destusers<MAX_USERXFER) {
113: bputs(text[SendFileToUser]);
114: if(!getstr(str,LEN_ALIAS,K_UPRLWR))
115: break;
116: if((user.number=finduser(str))!=0) {
117: if(!dir_op(dirnum) && user.number==useron.number) {
118: bputs(text[CantSendYourselfFiles]);
119: continue; }
120: for(i=0;i<destusers;i++)
121: if(user.number==destuser[i])
122: break;
123: if(i<destusers) {
124: bputs(text[DuplicateUser]);
125: continue; }
126: getuserdat(&user);
127: if((user.rest&(FLAG('T')|FLAG('D')))
128: || !chk_ar(lib[dir[user_dir]->lib]->ar,user)
129: || !chk_ar(dir[user_dir]->dl_ar,user)) {
130: bprintf(text[UserWontBeAbleToDl],user.alias); }
131: else {
132: bprintf(text[UserAddedToDestList],user.alias);
133: destuser[destusers++]=user.number; } }
134: else {
135: CRLF; } }
136: if(!destusers)
137: return; }
138: if(dir[dirnum]->misc&DIR_RATE) {
139: SYNC;
140: bputs(text[RateThisFile]);
141: ch=getkey(K_ALPHA);
142: if(!isalpha(ch) || sys_status&SS_ABORT)
143: return;
144: CRLF;
145: sprintf(descbeg,text[Rated],toupper(ch)); }
146: if(dir[dirnum]->misc&DIR_ULDATE) {
147: now=time(NULL);
148: if(descbeg[0])
149: strcat(descbeg," ");
150: sprintf(str,"%s ",unixtodstr(now,tmp));
151: strcat(descbeg,str); }
152: if(dir[dirnum]->misc&DIR_MULT) {
153: SYNC;
154: if(!noyes(text[MultipleDiskQ])) {
155: bputs(text[HowManyDisksTotal]);
156: if((i=getnum(99))<2)
157: return;
158: bputs(text[NumberOfFile]);
159: if((j=getnum(i))<1)
160: return;
161: if(j==1)
162: lastdesc[0]=0;
163: if(i>9)
164: sprintf(descend,text[FileOneOfTen],j,i);
165: else
166: sprintf(descend,text[FileOneOfTwo],j,i); }
167: else
168: lastdesc[0]=0; }
169: else
170: lastdesc[0]=0;
171: bputs(text[EnterDescNow]);
172: i=LEN_FDESC-(strlen(descbeg)+strlen(descend));
173: getstr(lastdesc,i,K_LINE|K_EDIT|K_AUTODEL);
174: if(sys_status&SS_ABORT)
175: return;
176: if(descend[0]) /* end of desc specified, so pad desc with spaces */
177: sprintf(f.desc,"%s%-*s%s",descbeg,i,lastdesc,descend);
178: else /* no end specified, so string ends at desc end */
179: sprintf(f.desc,"%s%s",descbeg,lastdesc);
180:
181: if(dir[dirnum]->misc&DIR_ANON && !(dir[dirnum]->misc&DIR_AONLY)
182: && (dir_op(dirnum) || useron.exempt&FLAG('A'))) {
183: if(!noyes(text[AnonymousQ]))
184: f.misc|=FM_ANON; }
185: sprintf(str,"%s%s",path,fname);
186: if(src[0]) { /* being copied from another local dir */
187: bprintf(text[RetrievingFile],fname);
188: if(mv(src,str,1))
189: return;
190: CRLF; }
191: if(fexist(str)) { /* File is on disk */
192: if(!uploadfile(&f))
193: return; }
194: else {
195: menu("ULPROT");
196: SYNC;
197: strcpy(keys,"Q");
198: if(dirnum==user_dir || !max_batup) /* no batch user to user xfers */
199: mnemonics(text[ProtocolOrQuit]);
200: else {
201: mnemonics(text[ProtocolBatchOrQuit]);
202: strcat(keys,"B"); }
203: for(i=0;i<total_prots;i++)
204: if(prot[i]->ulcmd[0] && chk_ar(prot[i]->ar,useron)) {
205: sprintf(tmp,"%c",prot[i]->mnemonic);
206: strcat(keys,tmp); }
207: ch=getkeys(keys,0);
208: if(ch=='Q')
209: return;
210: if(ch=='B') {
211: if(batup_total>=max_batup)
212: bputs(text[BatchUlQueueIsFull]);
213: else {
214: for(i=0;i<batup_total;i++)
215: if(!strcmp(batup_name[i],f.name)) {
216: bprintf(text[FileAlreadyInQueue],f.name);
217: return; }
218: strcpy(batup_name[batup_total],f.name);
219: strcpy(batup_desc[batup_total],f.desc);
220: batup_dir[batup_total]=dirnum;
221: batup_misc[batup_total]=f.misc;
222: batup_alt[batup_total]=altul;
223: batup_total++;
224: bprintf(text[FileAddedToUlQueue]
225: ,f.name,batup_total,max_batup); } }
226: else {
227: for(i=0;i<total_prots;i++)
228: if(prot[i]->ulcmd[0] && prot[i]->mnemonic==ch
229: && chk_ar(prot[i]->ar,useron))
230: break;
231: if(i<total_prots) {
232: start=time(NULL);
233: protocol(cmdstr(prot[i]->ulcmd,str,nulstr,NULL),0);
234: end=time(NULL);
235: if(!(dir[dirnum]->misc&DIR_ULTIME)) /* Don't deduct upload time */
236: starttime+=end-start;
237: ch=uploadfile(&f);
238: autohangup();
239: if(!ch) /* upload failed, don't process user to user xfer */
240: return; } } }
241: if(dirnum==user_dir) { /* Add files to XFER.IXT in INDX dir */
242: sprintf(str,"%sXFER.IXT",data_dir);
243: if((file=nopen(str,O_WRONLY|O_CREAT|O_APPEND))==-1) {
244: errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_APPEND);
245: return; }
246: for(j=0;j<destusers;j++) {
247: for(i=1;i<=sys_nodes;i++) { /* Tell user, if online */
248: getnodedat(i,&node,0);
249: if(node.useron==destuser[j] && !(node.misc&NODE_POFF)
250: && (node.status==NODE_INUSE || node.status==NODE_QUIET)) {
251: sprintf(str,text[UserToUserXferNodeMsg],node_num,useron.alias);
252: putnmsg(i,str);
253: break; } }
254: if(i>sys_nodes) { /* User not online */
255: sprintf(str,text[UserSentYouFile],useron.alias);
256: putsmsg(destuser[j],str); }
257: sprintf(str,"%4.4u %12.12s %4.4u\r\n"
258: ,destuser[j],f.name,useron.number);
259: write(file,str,strlen(str)); }
260: close(file); }
261: }
262:
263: /****************************************************************************/
264: /* Checks directory for 'dir' and prompts user to enter description for */
265: /* the files that aren't in the database. */
266: /* Returns 1 if the user aborted, 0 if not. */
267: /****************************************************************************/
268: char bulkupload(uint dirnum)
269: {
270: char done,str[256];
271: struct ffblk ff;
272: file_t f;
273:
274: memset(&f,0,sizeof(file_t));
275: f.dir=dirnum;
276: f.altpath=altul;
277: bprintf(text[BulkUpload],lib[dir[dirnum]->lib]->sname,dir[dirnum]->sname);
278: sprintf(str,"%s*.*",altul>0 && altul<=altpaths ? altpath[altul-1]
279: : dir[dirnum]->path);
280: done=findfirst(str,&ff,0);
281: action=NODE_ULNG;
282: SYNC;
283: while(!done && !msgabort()) {
284: if(gettotalfiles(dirnum)>dir[dirnum]->maxfiles) {
285: bputs(text[DirFull]);
286: return(0); }
287: strupr(ff.ff_name);
288: padfname(ff.ff_name,str);
289: if(findfile(f.dir,str)==0) {
290: strcpy(f.name,str);
291: f.cdt=ff.ff_fsize;
292: bprintf(text[BulkUploadDescPrompt],f.name,f.cdt);
293: getstr(f.desc,LEN_FDESC,K_LINE);
294: if(sys_status&SS_ABORT)
295: return(1);
296: uploadfile(&f); } /* used to abort here if the file failed upload */
297: done=findnext(&ff); }
298: return(0);
299: }
300:
301:
302:
303: /****************************************************************************/
304: /* This is the batch menu section */
305: /****************************************************************************/
306: void batchmenu()
307: {
308: char str[129],tmp2[250],done=0,ch;
309: uint i,j,xfrprot,xfrdir;
310: ulong totalcdt,totalsize,totaltime;
311: time_t start,end;
312: int file,n;
313: file_t f;
314:
315: if(!batdn_total && !batup_total && upload_dir==INVALID_DIR) {
316: bputs(text[NoFilesInBatchQueue]);
317: return; }
318: if(useron.misc&(RIP|WIP) && !(useron.misc&EXPERT))
319: menu("BATCHXFR");
320: lncntr=0;
321: while(online && !done && (batdn_total || batup_total
322: || upload_dir!=INVALID_DIR)) {
323: if(!(useron.misc&(EXPERT|RIP|WIP))) {
324: sys_status&=~SS_ABORT;
325: if(lncntr) {
326: SYNC;
327: CRLF;
328: if(lncntr) /* CRLF or SYNC can cause pause */
329: pause(); }
330: menu("BATCHXFR"); }
331: ASYNC;
332: bputs(text[BatchMenuPrompt]);
333: ch=getkeys("BCDLQRU?\r",0);
334: if(ch>SP)
335: logch(ch,0);
336: switch(ch) {
337: case '?':
338: if(useron.misc&(EXPERT|RIP|WIP))
339: menu("BATCHXFR");
340: break;
341: case CR:
342: case 'Q':
343: lncntr=0;
344: done=1;
345: break;
346: case 'B': /* Bi-directional transfers */
347: if(useron.rest&FLAG('D')) {
348: bputs(text[R_Download]);
349: break; }
350: if(useron.rest&FLAG('U')) {
351: bputs(text[R_Upload]);
352: break; }
353: if(!batdn_total) {
354: bputs(text[DownloadQueueIsEmpty]);
355: break; }
356: if(!batup_total && upload_dir==INVALID_DIR) {
357: bputs(text[UploadQueueIsEmpty]);
358: break; }
359: for(i=0,totalcdt=0;i<batdn_total;i++)
360: totalcdt+=batdn_cdt[i];
361: if(!(useron.exempt&FLAG('D'))
362: && totalcdt>useron.cdt+useron.freecdt) {
363: bprintf(text[YouOnlyHaveNCredits]
364: ,ultoac(useron.cdt+useron.freecdt,tmp));
365: break; }
366: for(i=0,totalsize=totaltime=0;i<batdn_total;i++) {
367: totalsize+=batdn_size[i];
368: if(!(dir[batdn_dir[i]]->misc&DIR_TFREE) && cur_cps)
369: totaltime+=batdn_size[i]/(ulong)cur_cps; }
370: if(!(useron.exempt&FLAG('T')) && !SYSOP && totaltime>timeleft) {
371: bputs(text[NotEnoughTimeToDl]);
372: break; }
373: menu("BIPROT");
374: if(!create_batchdn_lst())
375: break;
376: if(!create_batchup_lst())
377: break;
378: if(!create_bimodem_pth())
379: break;
380: SYNC;
381: mnemonics(text[ProtocolOrQuit]);
382: strcpy(tmp2,"Q");
383: for(i=0;i<total_prots;i++)
384: if(prot[i]->bicmd[0] && chk_ar(prot[i]->ar,useron)) {
385: sprintf(tmp,"%c",prot[i]->mnemonic);
386: strcat(tmp2,tmp); }
387: ungetkey(useron.prot);
388: ch=getkeys(tmp2,0);
389: if(ch=='Q')
390: break;
391: for(i=0;i<total_prots;i++)
392: if(prot[i]->bicmd[0] && prot[i]->mnemonic==ch
393: && chk_ar(prot[i]->ar,useron))
394: break;
395: if(i<total_prots) {
396: xfrprot=i;
397: action=NODE_BXFR;
398: SYNC;
399: for(i=0;i<batdn_total;i++)
400: if(dir[batdn_dir[i]]->seqdev) {
401: lncntr=0;
402: unpadfname(batdn_name[i],tmp);
403: sprintf(tmp2,"%s%s",temp_dir,tmp);
404: if(!fexist(tmp2)) {
405: seqwait(dir[batdn_dir[i]]->seqdev);
406: bprintf(text[RetrievingFile],tmp);
407: sprintf(str,"%s%s"
408: ,batdn_alt[i]>0 && batdn_alt[i]<=altpaths
409: ? altpath[batdn_alt[i]-1]
410: : dir[batdn_dir[i]]->path
411: ,tmp);
412: mv(str,tmp2,1); /* copy the file to temp dir */
413: getnodedat(node_num,&thisnode,1);
414: thisnode.aux=0xff;
415: putnodedat(node_num,thisnode);
416: CRLF; } }
417: sprintf(str,"%sBATCHDN.LST",node_dir);
418: sprintf(tmp2,"%sBATCHUP.LST",node_dir);
419: start=time(NULL);
420: protocol(cmdstr(prot[xfrprot]->bicmd,str,tmp2,NULL),0);
421: end=time(NULL);
422: for(i=0;i<batdn_total;i++)
423: if(dir[batdn_dir[i]]->seqdev) {
424: unpadfname(batdn_name[i],tmp);
425: sprintf(tmp2,"%s%s",temp_dir,tmp);
426: remove(tmp2); }
427: batch_upload();
428: batch_download(xfrprot);
429: if(batdn_total) /* files still in queue, not xfered */
430: notdownloaded(totalsize,start,end);
431: autohangup(); }
432: break;
433: case 'C':
434: if(batup_total) {
435: if(!noyes(text[ClearUploadQueueQ])) {
436: batup_total=0;
437: bputs(text[UploadQueueCleared]); } }
438: if(batdn_total) {
439: if(!noyes(text[ClearDownloadQueueQ])) {
440: for(i=0;i<batdn_total;i++) {
441: f.dir=batdn_dir[i];
442: f.datoffset=batdn_offset[i];
443: f.size=batdn_size[i];
444: strcpy(f.name,batdn_name[i]);
445: closefile(f); }
446: batdn_total=0;
447: bputs(text[DownloadQueueCleared]); } }
448: break;
449: case 'D':
450: if(useron.rest&FLAG('D')) {
451: bputs(text[R_Download]);
452: break; }
453: if(!batdn_total) {
454: bputs(text[DownloadQueueIsEmpty]);
455: break; }
456: start_batch_download();
457: break;
458: case 'L':
459: if(batup_total) {
460: bputs(text[UploadQueueLstHdr]);
461: for(i=0;i<batup_total;i++)
462: bprintf(text[UploadQueueLstFmt],i+1,batup_name[i]
463: ,batup_desc[i]); }
464: if(batdn_total) {
465: bputs(text[DownloadQueueLstHdr]);
466: for(i=0,totalcdt=0,totalsize=0;i<batdn_total;i++) {
467: bprintf(text[DownloadQueueLstFmt],i+1
468: ,batdn_name[i],ultoac(batdn_cdt[i],tmp)
469: ,ultoac(batdn_size[i],str)
470: ,cur_cps
471: ? sectostr(batdn_size[i]/(ulong)cur_cps,tmp2)
472: : "??:??:??");
473: totalsize+=batdn_size[i];
474: totalcdt+=batdn_cdt[i]; }
475: bprintf(text[DownloadQueueTotals]
476: ,ultoac(totalcdt,tmp),ultoac(totalsize,str),cur_cps
477: ? sectostr(totalsize/(ulong)cur_cps,tmp2)
478: : "??:??:??"); }
479: break; /* Questionable line ^^^, see note above function */
480: case 'R':
481: if(batup_total) {
482: bprintf(text[RemoveWhichFromUlQueue],batup_total);
483: n=getnum(batup_total);
484: if(n>=1) {
485: n--;
486: batup_total--;
487: while(n<batup_total) {
488: batup_dir[n]=batup_dir[n+1];
489: batup_misc[n]=batup_misc[n+1];
490: batup_alt[n]=batup_alt[n+1];
491: strcpy(batup_name[n],batup_name[n+1]);
492: strcpy(batup_desc[n],batup_desc[n+1]);
493: n++; }
494: if(!batup_total)
495: bputs(text[UploadQueueCleared]); } }
496: if(batdn_total) {
497: bprintf(text[RemoveWhichFromDlQueue],batdn_total);
498: n=getnum(batdn_total);
499: if(n>=1) {
500: n--;
501: f.dir=batdn_dir[n];
502: strcpy(f.name,batdn_name[n]);
503: f.datoffset=batdn_offset[n];
504: f.size=batdn_size[n];
505: closefile(f);
506: batdn_total--;
507: while(n<batdn_total) {
508: strcpy(batdn_name[n],batdn_name[n+1]);
509: batdn_dir[n]=batdn_dir[n+1];
510: batdn_cdt[n]=batdn_cdt[n+1];
511: batdn_alt[n]=batdn_alt[n+1];
512: batdn_size[n]=batdn_size[n+1];
513: batdn_offset[n]=batdn_offset[n+1];
514: n++; }
515: if(!batdn_total)
516: bputs(text[DownloadQueueCleared]); } }
517: break;
518: case 'U':
519: if(useron.rest&FLAG('U')) {
520: bputs(text[R_Upload]);
521: break; }
522: if(!batup_total && upload_dir==INVALID_DIR) {
523: bputs(text[UploadQueueIsEmpty]);
524: break; }
525: menu("BATUPROT");
526: if(!create_batchup_lst())
527: break;
528: if(!create_bimodem_pth())
529: break;
530: ASYNC;
531: mnemonics(text[ProtocolOrQuit]);
532: strcpy(str,"Q");
533: for(i=0;i<total_prots;i++)
534: if(prot[i]->batulcmd[0] && chk_ar(prot[i]->ar,useron)) {
535: sprintf(tmp,"%c",prot[i]->mnemonic);
536: strcat(str,tmp); }
537: ch=getkeys(str,0);
538: if(ch=='Q')
539: break;
540: for(i=0;i<total_prots;i++)
541: if(prot[i]->batulcmd[0] && prot[i]->mnemonic==ch
542: && chk_ar(prot[i]->ar,useron))
543: break;
544: if(i<total_prots) {
545: sprintf(str,"%sBATCHUP.LST",node_dir);
546: xfrprot=i;
547: if(batup_total)
548: xfrdir=batup_dir[0];
549: else
550: xfrdir=upload_dir;
551: action=NODE_ULNG;
552: SYNC;
553: if(online==ON_REMOTE) {
554: delfiles(temp_dir,"*.*");
555: start=time(NULL);
556: protocol(cmdstr(prot[xfrprot]->batulcmd,str,nulstr,NULL),1);
557: end=time(NULL);
558: if(!(dir[xfrdir]->misc&DIR_ULTIME))
559: starttime+=end-start; }
560: batch_upload();
561: delfiles(temp_dir,"*.*");
562: autohangup(); }
563: break; } }
564: delfiles(temp_dir,"*.*");
565: }
566:
567: /****************************************************************************/
568: /* Download files from batch queue */
569: /****************************************************************************/
570: void start_batch_download()
571: {
572: char ch,str[256],tmp2[256],tmp3[128],fname[64];
573: int j;
574: uint i,xfrprot;
575: ulong totalcdt,totalsize,totaltime;
576: time_t start,end;
577: file_t f;
578:
579: if(useron.rest&FLAG('D')) { /* Download restriction */
580: bputs(text[R_Download]);
581: return; }
582: for(i=0,totalcdt=0;i<batdn_total;i++)
583: totalcdt+=batdn_cdt[i];
584: if(!(useron.exempt&FLAG('D'))
585: && totalcdt>useron.cdt+useron.freecdt) {
586: bprintf(text[YouOnlyHaveNCredits]
587: ,ultoac(useron.cdt+useron.freecdt,tmp));
588: return; }
589:
590: if(online==ON_LOCAL) { /* Local download */
591: bputs(text[EnterPath]);
592: if(!getstr(str,60,K_LINE|K_UPPER))
593: return;
594: backslash(str);
595: for(i=0;i<batdn_total;i++) {
596: curdirnum=batdn_dir[i]; /* for ARS */
597: lncntr=0;
598: unpadfname(batdn_name[i],tmp);
599: sprintf(tmp2,"%s%s",str,tmp);
600: seqwait(dir[batdn_dir[i]]->seqdev);
601: bprintf(text[RetrievingFile],tmp);
602: sprintf(tmp3,"%s%s"
603: ,batdn_alt[i]>0 && batdn_alt[i]<=altpaths
604: ? altpath[batdn_alt[i]-1]
605: : dir[batdn_dir[i]]->path
606: ,tmp);
607: j=mv(tmp3,tmp2,1);
608: getnodedat(node_num,&thisnode,1);
609: thisnode.aux=30; /* clear the seq dev # */
610: putnodedat(node_num,thisnode);
611: CRLF;
612: if(j) /* copy unsuccessful */
613: return;
614: for(j=0;j<total_dlevents;j++)
615: if(!stricmp(dlevent[j]->ext,batdn_name[i]+9)
616: && chk_ar(dlevent[j]->ar,useron)) {
617: bputs(dlevent[j]->workstr);
618: external(cmdstr(dlevent[j]->cmd,tmp2,nulstr,NULL),EX_OUTL);
619: CRLF; }
620: }
621: for(i=0;i<batdn_total;i++) {
622: curdirnum=batdn_dir[i]; /* for ARS */
623: f.dir=batdn_dir[i];
624: strcpy(f.name,batdn_name[i]);
625: f.datoffset=batdn_offset[i];
626: f.size=batdn_size[i];
627: f.altpath=batdn_alt[i];
628: downloadfile(f);
629: closefile(f); }
630: batdn_total=0;
631: return; }
632:
633: for(i=0,totalsize=totaltime=0;i<batdn_total;i++) {
634: totalsize+=batdn_size[i];
635: if(!(dir[batdn_dir[i]]->misc&DIR_TFREE) && cur_cps)
636: totaltime+=batdn_size[i]/(ulong)cur_cps; }
637: if(!(useron.exempt&FLAG('T')) && !SYSOP && totaltime>timeleft) {
638: bputs(text[NotEnoughTimeToDl]);
639: return; }
640: menu("BATDPROT");
641: if(!create_batchdn_lst())
642: return;
643: if(!create_bimodem_pth())
644: return;
645: ASYNC;
646: mnemonics(text[ProtocolOrQuit]);
647: strcpy(tmp2,"Q");
648: for(i=0;i<total_prots;i++)
649: if(prot[i]->batdlcmd[0] && chk_ar(prot[i]->ar,useron)) {
650: sprintf(tmp,"%c",prot[i]->mnemonic);
651: strcat(tmp2,tmp); }
652: ungetkey(useron.prot);
653: ch=getkeys(tmp2,0);
654: if(ch=='Q' || sys_status&SS_ABORT)
655: return;
656: for(i=0;i<total_prots;i++)
657: if(prot[i]->batdlcmd[0] && prot[i]->mnemonic==ch
658: && chk_ar(prot[i]->ar,useron))
659: break;
660: if(i<total_prots) {
661: xfrprot=i;
662: /* delfiles(temp_dir,"*.*"); fix for CD-ROM */
663: for(i=0;i<batdn_total;i++) {
664: curdirnum=batdn_dir[i]; /* for ARS */
665: unpadfname(batdn_name[i],fname);
666: if(dir[batdn_dir[i]]->seqdev) {
667: lncntr=0;
668: sprintf(tmp2,"%s%s",temp_dir,fname);
669: if(!fexist(tmp2)) {
670: seqwait(dir[batdn_dir[i]]->seqdev);
671: bprintf(text[RetrievingFile],fname);
672: sprintf(str,"%s%s"
673: ,batdn_alt[i]>0 && batdn_alt[i]<=altpaths
674: ? altpath[batdn_alt[i]-1]
675: : dir[batdn_dir[i]]->path
676: ,fname);
677: mv(str,tmp2,1); /* copy the file to temp dir */
678: getnodedat(node_num,&thisnode,1);
679: thisnode.aux=40; /* clear the seq dev # */
680: putnodedat(node_num,thisnode);
681: CRLF; } }
682: else
683: sprintf(tmp2,"%s%s"
684: ,batdn_alt[i]>0 && batdn_alt[i]<=altpaths
685: ? altpath[batdn_alt[i]-1]
686: : dir[batdn_dir[i]]->path
687: ,fname);
688: sprintf(str,"total_dlevents=%d",total_dlevents);
689: // logline("dl",str);
690: for(j=0;j<total_dlevents;j++) {
691: // logline("dl",dlevent[j]->ext);
692: // logline("dl",dlevent[j]->cmd);
693: // logline("dl",tmp2);
694: if(stricmp(dlevent[j]->ext,batdn_name[i]+9))
695: continue;
696: // logline("dl","chkar");
697: if(!chk_ar(dlevent[j]->ar,useron))
698: continue;
699: // logline("dl","bputs");
700: bputs(dlevent[j]->workstr);
701: // logline("dl","external");
702: external(cmdstr(dlevent[j]->cmd,tmp2,nulstr,NULL),EX_OUTL);
703: // logline("dl","crlf");
704: CRLF; }
705: // logline("dl","after dlevents");
706: }
707:
708: sprintf(str,"%sBATCHDN.LST",node_dir);
709: getnodedat(node_num,&thisnode,1);
710: action=NODE_DLNG;
711: if(cur_cps)
712: unixtodos(now+(totalsize/(ulong)cur_cps)
713: ,&date,&curtime);
714: thisnode.aux=(curtime.ti_hour*60)+curtime.ti_min;
715: thisnode.action=action;
716: putnodedat(node_num,thisnode); /* calculate ETA */
717: start=time(NULL);
718: protocol(cmdstr(prot[xfrprot]->batdlcmd,str,nulstr,NULL),0);
719: end=time(NULL);
720: batch_download(xfrprot);
721: if(batdn_total)
722: notdownloaded(totalsize,start,end);
723: /* delfiles(temp_dir,"*.*"); fix for CD-ROM */
724: autohangup(); }
725: }
726:
727: /*****************************************************************************/
728: /* Temp directory section. Files must be extracted here and both temp_uler */
729: /* and temp_uler fields should be filled before entrance. */
730: /*****************************************************************************/
731: void temp_xfer()
732: {
733: char str[256],tmp2[256],done=0,ch;
734: uint i,dirnum=total_dirs,j,files;
735: ulong bytes;
736: time_t start,end;
737: struct ffblk ff;
738: struct dfree d;
739: file_t f;
740:
741: if(!usrlibs)
742: return;
743: if(useron.rest&FLAG('D')) {
744: bputs(text[R_Download]);
745: return; }
746: /*************************************/
747: /* Create TEMP directory information */
748: /*************************************/
749: if((dir[dirnum]=(dir_t *)MALLOC(sizeof(dir_t)))==0) {
750: errormsg(WHERE,ERR_ALLOC,"temp_dir",sizeof(dir_t));
751: return; }
752: memset(dir[dirnum],0,sizeof(dir_t));
753: dir[dirnum]->lname="Temporary";
754: dir[dirnum]->sname="Temp";
755: strcpy(dir[dirnum]->code,"TEMP");
756: dir[dirnum]->path=temp_dir;
757: dir[dirnum]->maxfiles=MAX_FILES;
758: dir[dirnum]->data_dir=dir[0]->data_dir;
759: dir[dirnum]->op_ar=nulstr;
760: temp_dirnum=curdirnum=usrdir[curlib][curdir[curlib]];
761: total_dirs++;
762:
763: /****************************/
764: /* Fill filedat information */
765: /****************************/
766: sprintf(f.name,"TEMP_%3.3d.%s",node_num,useron.tmpext);
767: strcpy(f.desc,"Temp File");
768: f.dir=dirnum;
769: f.misc=f.timesdled=f.dateuled=f.datedled=0L;
770:
771: if(useron.misc&(RIP|WIP) && !(useron.misc&EXPERT))
772: menu("TEMPXFER");
773: lncntr=0;
774: while(online && !done) {
775: if(!(useron.misc&(EXPERT|RIP|WIP))) {
776: sys_status&=~SS_ABORT;
777: if(lncntr) {
778: SYNC;
779: CRLF;
780: if(lncntr) /* CRLF or SYNC can cause pause */
781: pause(); }
782: menu("TEMPXFER"); }
783: ASYNC;
784: bputs(text[TempDirPrompt]);
785: strcpy(f.uler,temp_uler);
786: ch=getkeys("ADEFNILQRVX?\r",0);
787: if(ch>SP)
788: logch(ch,0);
789: switch(ch) {
790: case 'A': /* add to temp file */
791: if(temp_dir[1]==':')
792: i=temp_dir[0]-'A'+1;
793: else i=0;
794: getdfree(i,&d);
795: if(d.df_sclus==0xffff)
796: errormsg(WHERE,ERR_CHK,temp_dir,0);
797: if((ulong)d.df_bsec*(ulong)d.df_sclus
798: *(ulong)d.df_avail<(ulong)min_dspace*1024L) {
799: bputs(text[LowDiskSpace]);
800: sprintf(str,"Diskspace is low: %s",temp_dir);
801: errorlog(str);
802: if(!dir_op(dirnum))
803: break; }
804: bprintf(text[DiskNBytesFree],ultoac((ulong)d.df_bsec
805: *(ulong)d.df_sclus*(ulong)d.df_avail,tmp));
806: if(!getfilespec(str))
807: break;
808: if(!checkfname(str))
809: break;
810: sprintf(tmp2,"Added %s to %s",str,f.name);
811: logline(nulstr,tmp2);
812: sprintf(tmp2,"%s%s",temp_dir,str);
813: sprintf(str,"%s%s",temp_dir,f.name);
814: external(cmdstr(temp_cmd(),str,tmp2,NULL),EX_CC|EX_OUTL|EX_OUTR);
815: break;
816: case 'D': /* download from temp dir */
817: sprintf(str,"%s%s",temp_dir,f.name);
818: if(!fexist(str)) {
819: bprintf(text[TempFileNotCreatedYet],f.name);
820: break; }
821: f.size=f.cdt=flength(str);
822: f.opencount=0;
823: if(temp_cdt) /* if file was not free */
824: f.cdt=f.size;
825: else
826: f.cdt=0;
827: if(!(useron.exempt&FLAG('D'))
828: && f.cdt>useron.cdt+useron.freecdt) {
829: bprintf(text[YouOnlyHaveNCredits]
830: ,ultoac(useron.cdt+useron.freecdt,tmp));
831: break; } /* f.cdt must equal size here */
832: if(!(useron.exempt&FLAG('T')) && !dir_op(dirnum)
833: && !(dir[temp_dirnum]->misc&DIR_TFREE) && cur_cps
834: && f.size/(ulong)cur_cps>timeleft) {
835: bputs(text[NotEnoughTimeToDl]);
836: break; }
837: if(!chk_ar(dir[temp_dirnum]->dl_ar,useron)) {
838: bputs(text[CantDownloadFromDir]);
839: break; }
840: addfiledat(&f);
841: menu("DLPROT");
842: SYNC;
843: mnemonics(text[ProtocolOrQuit]);
844: strcpy(tmp2,"Q");
845: for(i=0;i<total_prots;i++)
846: if(prot[i]->dlcmd[0] && chk_ar(prot[i]->ar,useron)) {
847: sprintf(tmp,"%c",prot[i]->mnemonic);
848: strcat(tmp2,tmp); }
849: ungetkey(useron.prot);
850: ch=getkeys(tmp2,0);
851: for(i=0;i<total_prots;i++)
852: if(prot[i]->dlcmd[0] && prot[i]->mnemonic==ch
853: && chk_ar(prot[i]->ar,useron))
854: break;
855: if(i<total_prots) {
856: getnodedat(node_num,&thisnode,1);
857: action=NODE_DLNG;
858: if(cur_cps)
859: unixtodos(now+(f.size/(ulong)cur_cps)
860: ,&date,&curtime);
861: thisnode.aux=(curtime.ti_hour*60)+curtime.ti_min;
862: putnodedat(node_num,thisnode); /* calculate ETA */
863: start=time(NULL);
864: j=protocol(cmdstr(prot[i]->dlcmd,str,nulstr,NULL),0);
865: end=time(NULL);
866: if(dir[temp_dirnum]->misc&DIR_TFREE)
867: starttime+=end-start;
868: if(prot[i]->misc&PROT_DSZLOG) {
869: if(checkprotlog(f))
870: downloadfile(f);
871: else
872: notdownloaded(f.size,start,end); }
873: else {
874: if(!j)
875: downloadfile(f);
876: else {
877: bprintf(text[FileNotSent],f.name);
878: notdownloaded(f.size,start,end); } }
879: autohangup(); }
880: removefiledat(f);
881: break;
882: case 'E':
883: extract(usrdir[curlib][curdir[curlib]]);
884: sys_status&=~SS_ABORT;
885: break;
886: case 'F': /* Create a file list */
887: delfiles(temp_dir,"*.*");
888: create_filelist("FILELIST.TXT",0);
889: if(!(sys_status&SS_ABORT))
890: logline(nulstr,"Created list of all files");
891: CRLF;
892: sys_status&=~SS_ABORT;
893: break;
894: case 'I': /* information on what's here */
895: bprintf(text[TempFileInfo],f.uler,temp_file);
896: break;
897: case 'L': /* list files in dir */
898: if(!getfilespec(str))
899: break;
900: if(!checkfname(str))
901: break;
902: bytes=files=0L;
903: CRLF;
904: sprintf(tmp2,"%s%s",temp_dir,str);
905: i=findfirst(tmp2,&ff,0);
906: while(!i && !msgabort()) {
907: bprintf("%s %10s\r\n",padfname(ff.ff_name,str)
908: ,ultoac(ff.ff_fsize,tmp));
909: files++;
910: bytes+=ff.ff_fsize;
911: i=findnext(&ff); }
912: if(!files)
913: bputs(text[EmptyDir]);
914: else if(files>1)
915: bprintf(text[TempDirTotal],ultoac(bytes,tmp),files);
916: break;
917: case 'N': /* Create a list of new files */
918: delfiles(temp_dir,"*.*");
919: create_filelist("NEWFILES.TXT",FL_ULTIME);
920: if(!(sys_status&SS_ABORT))
921: logline(nulstr,"Created list of new files");
922: CRLF;
923: sys_status&=~SS_ABORT;
924: break;
925: case 'R': /* Remove files from dir */
926: if(!getfilespec(str))
927: break;
928: // padfname(str,tmp); Removed 04/14/96
929: bprintf(text[NFilesRemoved],delfiles(temp_dir,tmp));
930: break;
931: case 'V': /* view files in dir */
932: bputs(text[FileSpec]);
933: if(!getstr(str,12,K_UPPER) || !checkfname(str))
934: break;
935: viewfiles(dirnum,str);
936: break;
937: case CR:
938: case 'Q': /* quit */
939: done=1;
940: break;
941: case 'X': /* extract from archive in temp dir */
942: extract(dirnum);
943: sys_status&=~SS_ABORT;
944: break;
945: case '?': /* menu */
946: if(useron.misc&(EXPERT|RIP|WIP))
947: menu("TEMPXFER");
948: break; }
949: if(sys_status&SS_ABORT)
950: break; }
951: FREE(dir[dirnum]);
952: total_dirs--;
953: }
954:
955:
956: /****************************************************************************/
957: /* Re-sorts file directory 'dirnum' according to dir[dirnum]->sort type */
958: /****************************************************************************/
959: void resort(uint dirnum)
960: {
961: char str[25],ixbfname[128],datfname[128],exbfname[128],txbfname[128]
962: ,ext[512],nulbuf[512];
963: uchar HUGE16 *ixbbuf, HUGE16 *datbuf;
964: uchar HUGE16 *ixbptr[MAX_FILES];
965: int ixbfile,datfile,exbfile,txbfile,i,j;
966: ulong ixblen,datlen,offset,newoffset,l;
967:
968: memset(nulbuf,0,512);
969: bprintf(text[ResortLineFmt],lib[dir[dirnum]->lib]->sname,dir[dirnum]->sname);
970: sprintf(ixbfname,"%s%s.IXB",dir[dirnum]->data_dir,dir[dirnum]->code);
971: sprintf(datfname,"%s%s.DAT",dir[dirnum]->data_dir,dir[dirnum]->code);
972: sprintf(exbfname,"%s%s.EXB",dir[dirnum]->data_dir,dir[dirnum]->code);
973: sprintf(txbfname,"%s%s.TXB",dir[dirnum]->data_dir,dir[dirnum]->code);
974:
975: if(flength(ixbfname)<1L || flength(datfname)<1L) {
976: remove(exbfname);
977: remove(txbfname);
978: remove(ixbfname);
979: remove(datfname);
980: bputs(text[ResortEmptyDir]);
981: return; }
982: bputs(text[Sorting]);
983: if((ixbfile=nopen(ixbfname,O_RDONLY))==-1) {
984: errormsg(WHERE,ERR_OPEN,ixbfname,O_RDONLY);
985: return; }
986: if((datfile=nopen(datfname,O_RDONLY))==-1) {
987: close(ixbfile);
988: errormsg(WHERE,ERR_OPEN,datfname,O_RDONLY);
989: return; }
990: ixblen=filelength(ixbfile);
991: datlen=filelength(datfile);
992: if((ixbbuf=MALLOC(ixblen))==NULL) {
993: close(ixbfile);
994: close(datfile);
995: errormsg(WHERE,ERR_ALLOC,ixbfname,ixblen);
996: return; }
997: if((datbuf=MALLOC(datlen))==NULL) {
998: close(ixbfile);
999: close(datfile);
1000: FREE((char *)ixbbuf);
1001: errormsg(WHERE,ERR_ALLOC,datfname,datlen);
1002: return; }
1003: if(lread(ixbfile,ixbbuf,ixblen)!=ixblen) {
1004: close(ixbfile);
1005: close(datfile);
1006: FREE((char *)ixbbuf);
1007: FREE((char *)datbuf);
1008: errormsg(WHERE,ERR_READ,ixbfname,ixblen);
1009: return; }
1010: if(lread(datfile,datbuf,datlen)!=datlen) {
1011: close(ixbfile);
1012: close(datfile);
1013: FREE((char *)ixbbuf);
1014: FREE((char *)datbuf);
1015: errormsg(WHERE,ERR_READ,datfname,datlen);
1016: return; }
1017: close(ixbfile);
1018: close(datfile);
1019: if((ixbfile=nopen(ixbfname,O_WRONLY|O_TRUNC))==-1) {
1020: FREE((char *)ixbbuf);
1021: FREE((char *)datbuf);
1022: errormsg(WHERE,ERR_OPEN,ixbfname,O_WRONLY|O_TRUNC);
1023: return; }
1024: if((datfile=nopen(datfname,O_WRONLY|O_TRUNC))==-1) {
1025: close(ixbfile);
1026: FREE((char *)ixbbuf);
1027: FREE((char *)datbuf);
1028: errormsg(WHERE,ERR_OPEN,datfname,O_WRONLY|O_TRUNC);
1029: return; }
1030: for(l=0,i=0;l<ixblen && i<MAX_FILES;l+=F_IXBSIZE,i++)
1031: ixbptr[i]=ixbbuf+l;
1032: switch(dir[dirnum]->sort) {
1033: case SORT_NAME_A:
1034: qsort((void *)ixbptr,ixblen/F_IXBSIZE,sizeof(ixbptr[0])
1035: ,(int(*)(const void*, const void*))fnamecmp_a);
1036: break;
1037: case SORT_NAME_D:
1038: qsort((void *)ixbptr,ixblen/F_IXBSIZE,sizeof(ixbptr[0])
1039: ,(int(*)(const void*, const void*))fnamecmp_d);
1040: break;
1041: case SORT_DATE_A:
1042: qsort((void *)ixbptr,ixblen/F_IXBSIZE,sizeof(ixbptr[0])
1043: ,(int(*)(const void*, const void*))fdatecmp_a);
1044: break;
1045: case SORT_DATE_D:
1046: qsort((void *)ixbptr,ixblen/F_IXBSIZE,sizeof(ixbptr[0])
1047: ,(int(*)(const void*, const void*))fdatecmp_d);
1048: break; }
1049:
1050: if((exbfile=nopen(exbfname,O_RDWR|O_CREAT))==-1) {
1051: close(ixbfile);
1052: close(datfile);
1053: FREE((char *)ixbbuf);
1054: FREE((char *)datbuf);
1055: errormsg(WHERE,ERR_OPEN,exbfname,O_RDWR|O_CREAT);
1056: return; }
1057: if((txbfile=nopen(txbfname,O_RDWR|O_CREAT))==-1) {
1058: close(exbfile);
1059: close(datfile);
1060: close(exbfile);
1061: FREE((char *)ixbbuf);
1062: FREE((char *)datbuf);
1063: errormsg(WHERE,ERR_OPEN,txbfname,O_RDWR|O_CREAT);
1064: return; }
1065:
1066: for(i=0;i<ixblen/F_IXBSIZE;i++) {
1067: offset=ixbptr[i][11]|((long)ixbptr[i][12]<<8)|((long)ixbptr[i][13]<<16);
1068: lwrite(datfile,&datbuf[offset],F_LEN);
1069:
1070: newoffset=(ulong)i*(ulong)F_LEN;
1071:
1072: j=datbuf[offset+F_MISC]; /* misc bits */
1073: if(j!=ETX) j-=SP;
1074: if(j&FM_EXTDESC) { /* extended description */
1075: lseek(exbfile,(offset/F_LEN)*512L,SEEK_SET);
1076: memset(ext,0,512);
1077: read(exbfile,ext,512);
1078: while(filelength(txbfile)<(newoffset/F_LEN)*512L) {
1079: // lseek(txbfile,0L,SEEK_END);
1080: write(txbfile,nulbuf,512); }
1081: lseek(txbfile,(newoffset/F_LEN)*512L,SEEK_SET);
1082: write(txbfile,ext,512); }
1083:
1084: str[0]=newoffset&0xff; /* Get offset within DAT file for IXB file */
1085: str[1]=(newoffset>>8)&0xff;
1086: str[2]=(newoffset>>16)&0xff;
1087: lwrite(ixbfile,ixbptr[i],11); /* filename */
1088: lwrite(ixbfile,str,3); /* offset */
1089: lwrite(ixbfile,ixbptr[i]+14,8); } /* upload and download times */
1090: close(exbfile);
1091: close(txbfile);
1092: close(ixbfile);
1093: close(datfile);
1094: remove(exbfname);
1095: rename(txbfname,exbfname);
1096: if(!flength(exbfname))
1097: remove(exbfname);
1098: FREE((char *)ixbbuf);
1099: FREE((char *)datbuf);
1100: if(ixblen/F_IXBSIZE==datlen/F_LEN)
1101: bputs(text[Sorted]);
1102: else
1103: bprintf(text[Compressed]
1104: ,(uint)((datlen/F_LEN)-(ixblen/F_IXBSIZE))
1105: ,ultoac(((datlen/F_LEN)-(ixblen/F_IXBSIZE))*F_LEN,tmp));
1106: }
1107:
1108: /*****************************************************************************/
1109: /* Handles extraction from a normal transfer file to the temp directory */
1110: /*****************************************************************************/
1111: void extract(uint dirnum)
1112: {
1113: char fname[13],str[256],excmd[256],path[256],done
1114: ,files[256],tmp[256],intmp=0;
1115: int i,j;
1116: struct ffblk ff;
1117: file_t f;
1118: struct dfree d;
1119:
1120: temp_dirnum=curdirnum=dirnum;
1121: if(!strcmp(dir[dirnum]->code,"TEMP"))
1122: intmp=1;
1123: if(temp_dir[1]==':')
1124: i=temp_dir[0]-'A'+1;
1125: else i=0;
1126: getdfree(i,&d);
1127: if(d.df_sclus==0xffff)
1128: errormsg(WHERE,ERR_CHK,temp_dir,0);
1129: if((ulong)d.df_bsec*(ulong)d.df_sclus
1130: *(ulong)d.df_avail<(ulong)min_dspace*1024L) {
1131: bputs(text[LowDiskSpace]);
1132: sprintf(str,"Diskspace is low: %s",temp_dir);
1133: errorlog(str);
1134: if(!dir_op(dirnum))
1135: return; }
1136: else if(!intmp) { /* not in temp dir */
1137: CRLF; }
1138: bprintf(text[DiskNBytesFree],ultoac((ulong)d.df_bsec
1139: *(ulong)d.df_sclus*(ulong)d.df_avail,tmp));
1140: if(!intmp) { /* not extracting FROM temp directory */
1141: sprintf(str,"%s*.*",temp_dir);
1142: if(fexist(str)) {
1143: bputs(text[RemovingTempFiles]);
1144: done=findfirst(str,&ff,0);
1145: while(!done) {
1146: sprintf(str,"%s%s",temp_dir,ff.ff_name);
1147: remove(str);
1148: done=findnext(&ff); }
1149: CRLF; } }
1150: bputs(text[ExtractFrom]);
1151: if(!getstr(fname,12,K_UPPER) || !checkfname(fname) || strchr(fname,'*')
1152: || strchr(fname,'?'))
1153: return;
1154: padfname(fname,f.name);
1155: strcpy(str,f.name);
1156: truncsp(str);
1157: for(i=0;i<total_fextrs;i++)
1158: if(!strcmp(str+9,fextr[i]->ext) && chk_ar(fextr[i]->ar,useron)) {
1159: strcpy(excmd,fextr[i]->cmd);
1160: break; }
1161: if(i==total_fextrs) {
1162: bputs(text[UnextractableFile]);
1163: return; }
1164: if(!intmp && !findfile(dirnum,f.name)) { /* not temp dir */
1165: bputs(text[SearchingAllDirs]);
1166: for(i=0;i<usrdirs[curlib] && !msgabort();i++) {
1167: if(i==dirnum) continue;
1168: if(findfile(usrdir[curlib][i],f.name))
1169: break; }
1170: if(i==usrdirs[curlib]) { /* not found in cur lib */
1171: bputs(text[SearchingAllLibs]);
1172: for(i=0;i<usrlibs;i++) {
1173: if(i==curlib) continue;
1174: for(j=0;j<usrdirs[i] && !msgabort();j++)
1175: if(findfile(usrdir[i][j],f.name))
1176: break;
1177: if(j<usrdirs[i])
1178: break; }
1179: if(i==usrlibs) {
1180: bputs(text[FileNotFound]); /* not in database */
1181: return; }
1182: dirnum=usrdir[i][j]; }
1183: else
1184: dirnum=usrdir[curlib][i]; }
1185: if(sys_status&SS_ABORT)
1186: return;
1187: sprintf(path,"%s%s",dir[dirnum]->path,fname);
1188: if(!intmp) { /* not temp dir, so get temp_file info */
1189: f.datoffset=f.dateuled=f.datedled=0L;
1190: f.dir=dirnum;
1191: getfileixb(&f);
1192: if(!f.datoffset && !f.dateuled && !f.datedled) /* error reading ixb */
1193: return;
1194: f.size=0;
1195: getfiledat(&f);
1196: fileinfo(f);
1197: if(f.altpath>0 && f.altpath<=altpaths)
1198: sprintf(path,"%s%s",altpath[f.altpath-1],fname);
1199: temp_dirnum=dirnum;
1200: if(dir[f.dir]->misc&DIR_FREE)
1201: temp_cdt=0L;
1202: else
1203: temp_cdt=f.cdt;
1204: strcpy(temp_uler,f.uler);
1205: strcpy(temp_file,f.name); } /* padded filename */
1206: if(!fexist(path)) {
1207: bputs(text[FileNotThere]); /* not on disk */
1208: return; }
1209: done=0;
1210: while(online && !done) {
1211: mnemonics(text[ExtractFilesPrompt]);
1212: switch(getkeys("EVQ",0)) {
1213: case 'E':
1214: if(!getfilespec(str))
1215: break;
1216: if(!checkfname(str))
1217: break;
1218: if((i=external(cmdstr(excmd,path,str,NULL)
1219: ,EX_INR|EX_OUTL|EX_OUTR|EX_CC))!=0) {
1220: errormsg(WHERE,ERR_EXEC,cmdstr(excmd,path,str,NULL),i);
1221: return; }
1222: sprintf(tmp,"Extracted %s from %s",str,path);
1223: logline(nulstr,tmp);
1224: CRLF;
1225: break;
1226: case 'V':
1227: viewfiles(dirnum,fname);
1228: break;
1229: default:
1230: done=1;
1231: break; } }
1232: }
1233:
1234: /****************************************************************************/
1235: /* Creates the file BATCHDN.LST in the node directory. Returns 1 if */
1236: /* everything goes okay. 0 if not. */
1237: /****************************************************************************/
1238: int create_batchdn_lst()
1239: {
1240: char str[256];
1241: int i,file;
1242:
1243: sprintf(str,"%sBATCHDN.LST",node_dir);
1244: if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1) {
1245: errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC);
1246: return(0); }
1247: for(i=0;i<batdn_total;i++) {
1248: if(batdn_dir[i]>=total_dirs || dir[batdn_dir[i]]->seqdev)
1249: strcpy(str,temp_dir);
1250: else
1251: strcpy(str,batdn_alt[i]>0 && batdn_alt[i]<=altpaths
1252: ? altpath[batdn_alt[i]-1] : dir[batdn_dir[i]]->path);
1253: write(file,str,strlen(str));
1254: unpadfname(batdn_name[i],str);
1255: strcat(str,crlf);
1256: write(file,str,strlen(str)); }
1257: close(file);
1258: return(1);
1259: }
1260:
1261: /****************************************************************************/
1262: /* Creates the file BATCHUP.LST in the node directory. Returns 1 if */
1263: /* everything goes okay. 0 if not. */
1264: /* This list is not used by any protocols to date. */
1265: /****************************************************************************/
1266: int create_batchup_lst()
1267: {
1268: char str[256];
1269: int i,file;
1270:
1271: sprintf(str,"%sBATCHUP.LST",node_dir);
1272: if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1) {
1273: errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC);
1274: return(0); }
1275: for(i=0;i<batup_total;i++) {
1276: if(batup_dir[i]>=total_dirs)
1277: strcpy(str,temp_dir);
1278: else
1279: strcpy(str,batup_alt[i]>0 && batup_alt[i]<=altpaths
1280: ? altpath[batup_alt[i]-1] : dir[batup_dir[i]]->path);
1281: write(file,str,strlen(str));
1282: unpadfname(batup_name[i],str);
1283: strcat(str,crlf);
1284: write(file,str,strlen(str)); }
1285: close(file);
1286: return(1);
1287: }
1288:
1289: /****************************************************************************/
1290: /* Creates the file BIMODEM.PTH in the node directory. Returns 1 if */
1291: /* everything goes okay. 0 if not. */
1292: /****************************************************************************/
1293: int create_bimodem_pth()
1294: {
1295: char str[256],tmp2[512];
1296: int i,file;
1297:
1298: sprintf(str,"%sBIMODEM.PTH",node_dir); /* Create bimodem file */
1299: if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1) {
1300: errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC);
1301: return(0); }
1302: for(i=0;i<batup_total;i++) {
1303: sprintf(str,"%s%s",batup_dir[i]>=total_dirs ? temp_dir
1304: : batup_alt[i]>0 && batup_alt[i]<=altpaths
1305: ? altpath[batup_alt[i]-1] : dir[batup_dir[i]]->path
1306: ,unpadfname(batup_name[i],tmp));
1307: sprintf(tmp2,"D %-80.80s%-160.160s"
1308: ,unpadfname(batup_name[i],tmp),str);
1309: write(file,tmp2,248); }
1310: for(i=0;i<batdn_total;i++) {
1311: sprintf(str,"%s%s"
1312: ,(batdn_dir[i]>=total_dirs || dir[batdn_dir[i]]->seqdev)
1313: ? temp_dir : batdn_alt[i]>0 && batdn_alt[i]<=altpaths
1314: ? altpath[batdn_alt[i]-1] : dir[batdn_dir[i]]->path
1315: ,unpadfname(batdn_name[i],tmp));
1316: sprintf(tmp2,"U %-240.240s",str);
1317: write(file,tmp2,248); }
1318: close(file);
1319: return(1);
1320: }
1321:
1322: /****************************************************************************/
1323: /* Processes files that were supposed to be received in the batch queue */
1324: /****************************************************************************/
1325: void batch_upload()
1326: {
1327: char str1[256],str2[256];
1328: int i,j,x,y;
1329: file_t f;
1330: struct ffblk ff;
1331:
1332: for(i=0;i<batup_total;) {
1333: curdirnum=batup_dir[i]; /* for ARS */
1334: lncntr=0; /* defeat pause */
1335: unpadfname(batup_name[i],tmp);
1336: sprintf(str1,"%s%s",temp_dir,tmp);
1337: sprintf(str2,"%s%s",dir[batup_dir[i]]->path,tmp);
1338: if(fexist(str1) && fexist(str2)) { /* file's in two places */
1339: bprintf(text[FileAlreadyThere],batup_name[i]);
1340: remove(str1); /* this is the one received */
1341: i++;
1342: continue; }
1343: if(fexist(str1))
1344: mv(str1,str2,0);
1345: strcpy(f.name,batup_name[i]);
1346: strcpy(f.desc,batup_desc[i]);
1347: f.dir=batup_dir[i];
1348: f.misc=batup_misc[i];
1349: f.altpath=batup_alt[i];
1350: if(uploadfile(&f)) {
1351: batup_total--;
1352: for(j=i;j<batup_total;j++) {
1353: batup_dir[j]=batup_dir[j+1];
1354: batup_alt[j]=batup_alt[j+1];
1355: batup_misc[j]=batup_misc[j+1];
1356: strcpy(batup_name[j],batup_name[j+1]);
1357: strcpy(batup_desc[j],batup_desc[j+1]); } }
1358: else i++; }
1359: if(upload_dir==INVALID_DIR)
1360: return;
1361: sprintf(str1,"%s*.*",temp_dir);
1362: i=findfirst(str1,&ff,0);
1363: while(!i) {
1364: memset(&f,0,sizeof(file_t));
1365: f.dir=upload_dir;
1366: padfname(ff.ff_name,f.name);
1367: strupr(f.name);
1368: sprintf(str1,"%s%s",temp_dir,ff.ff_name);
1369: for(x=0;x<usrlibs;x++) {
1370: for(y=0;y<usrdirs[x];y++)
1371: if(dir[usrdir[x][y]]->misc&DIR_DUPES
1372: && findfile(usrdir[x][y],f.name))
1373: break;
1374: if(y<usrdirs[x])
1375: break; }
1376: sprintf(str2,"%s%s",dir[f.dir]->path,ff.ff_name);
1377: if(x<usrlibs || fexist(str2)) {
1378: bprintf(text[FileAlreadyOnline],f.name);
1379: remove(str1); }
1380: else {
1381: mv(str1,str2,0);
1382: uploadfile(&f); }
1383: i=findnext(&ff); }
1384: }
1385:
1386: /****************************************************************************/
1387: /* Processes files that were supposed to be sent from the batch queue */
1388: /* xfrprot is -1 if downloading files from within QWK (no DSZLOG) */
1389: /****************************************************************************/
1390: void batch_download(int xfrprot)
1391: {
1392: int i,j;
1393: file_t f;
1394:
1395: for(i=0;i<batdn_total;) {
1396: lncntr=0; /* defeat pause */
1397: f.dir=curdirnum=batdn_dir[i];
1398: strcpy(f.name,batdn_name[i]);
1399: f.datoffset=batdn_offset[i];
1400: f.size=batdn_size[i];
1401: /* Removed 05/18/95
1402: if(dir[f.dir]->misc&DIR_TFREE && cur_cps) Looks like it gave back double
1403: starttime+=f.size/(ulong)cur_cps;
1404: */
1405: f.altpath=batdn_alt[i];
1406: if(xfrprot==-1 || (prot[xfrprot]->misc&PROT_DSZLOG && checkprotlog(f))
1407: || !(prot[xfrprot]->misc&PROT_DSZLOG)) {
1408: if(dir[f.dir]->misc&DIR_TFREE && cur_cps)
1409: starttime+=f.size/(ulong)cur_cps;
1410: downloadfile(f);
1411: closefile(f);
1412: batdn_total--;
1413: for(j=i;j<batdn_total;j++) {
1414: strcpy(batdn_name[j],batdn_name[j+1]);
1415: batdn_dir[j]=batdn_dir[j+1];
1416: batdn_cdt[j]=batdn_cdt[j+1];
1417: batdn_alt[j]=batdn_alt[j+1];
1418: batdn_size[j]=batdn_size[j+1];
1419: batdn_offset[j]=batdn_offset[j+1]; } }
1420: else i++; }
1421: }
1422:
1423: /****************************************************************************/
1424: /* Adds a list of files to the batch download queue */
1425: /****************************************************************************/
1426: void batch_add_list(char *list)
1427: {
1428: char str[128];
1429: int file,i,j,k;
1430: FILE *stream;
1431: file_t f;
1432:
1433: if((stream=fnopen(&file,list,O_RDONLY))!=NULL) {
1434: bputs(text[SearchingAllLibs]);
1435: while(!feof(stream)) {
1436: checkline();
1437: if(!online)
1438: break;
1439: if(!fgets(str,127,stream))
1440: break;
1441: truncsp(str);
1442: sprintf(f.name,"%.12s",str);
1443: strupr(f.name);
1444: lncntr=0;
1445: for(i=k=0;i<usrlibs;i++) {
1446: for(j=0;j<usrdirs[i];j++,k++) {
1447: outchar('.');
1448: if(k && !(k%5))
1449: bputs("\b\b\b\b\b \b\b\b\b\b");
1450: if(findfile(usrdir[i][j],f.name))
1451: break; }
1452: if(j<usrdirs[i])
1453: break; }
1454: if(i<usrlibs) {
1455: f.dir=usrdir[i][j];
1456: getfileixb(&f);
1457: f.size=0;
1458: getfiledat(&f);
1459: if(f.size==-1L)
1460: bprintf(text[FileIsNotOnline],f.name);
1461: else
1462: addtobatdl(f); } }
1463: fclose(stream);
1464: remove(list);
1465: CRLF; }
1466: }
1467:
1468: /****************************************************************************/
1469: /* Creates a text file named NEWFILES.DAT in the temp directory that */
1470: /* all new files since p-date. Returns number of files in list. */
1471: /****************************************************************************/
1472: ulong create_filelist(char *name, char mode)
1473: {
1474: char str[256];
1475: int i,j,d,file;
1476: ulong l,k;
1477:
1478: bprintf(text[CreatingFileList],name);
1479: sprintf(str,"%s%s",temp_dir,name);
1480: if((file=nopen(str,O_CREAT|O_WRONLY|O_APPEND))==-1) {
1481: errormsg(WHERE,ERR_OPEN,str,O_CREAT|O_WRONLY|O_APPEND);
1482: return(0); }
1483: k=0;
1484: if(mode&FL_ULTIME) {
1485: sprintf(str,"New files since: %s\r\n",timestr(&ns_time));
1486: write(file,str,strlen(str)); }
1487: for(i=d=0;i<usrlibs;i++) {
1488: for(j=0;j<usrdirs[i];j++,d++) {
1489: outchar('.');
1490: if(d && !(d%5))
1491: bputs("\b\b\b\b\b \b\b\b\b\b");
1492: if(mode&FL_ULTIME /* New-scan */
1493: && (lib[usrlib[i]]->offline_dir==usrdir[i][j]
1494: || dir[usrdir[i][j]]->misc&DIR_NOSCAN))
1495: continue;
1496: l=listfiles(usrdir[i][j],nulstr,file,mode);
1497: if((long)l==-1)
1498: break;
1499: k+=l; }
1500: if(j<usrdirs[i])
1501: break; }
1502: if(k>1) {
1503: sprintf(str,"\r\n%d Files Listed.\r\n",k);
1504: write(file,str,strlen(str)); }
1505: close(file);
1506: if(k)
1507: bprintf(text[CreatedFileList],name);
1508: else {
1509: bputs(text[NoFiles]);
1510: sprintf(str,"%s%s",temp_dir,name);
1511: remove(str); }
1512: strcpy(temp_file,name);
1513: strcpy(temp_uler,"File List");
1514: return(k);
1515: }
1516:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.