|
|
1.1 root 1: /* bat_xfer.cpp */
2:
3: /* Synchronet batch file transfer functions */
4:
5: /* $Id: bat_xfer.cpp,v 1.6 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:
40: /****************************************************************************/
41: /* This is the batch menu section */
42: /****************************************************************************/
43: void sbbs_t::batchmenu()
44: {
45: char str[129],tmp2[250],done=0,ch;
46: char tmp[512];
47: uint i,n,xfrprot,xfrdir;
48: ulong totalcdt,totalsize,totaltime;
49: time_t start,end;
50: file_t f;
51:
52: if(!batdn_total && !batup_total && cfg.upload_dir==INVALID_DIR) {
53: bputs(text[NoFilesInBatchQueue]);
54: return;
55: }
56: if(useron.misc&(RIP|WIP) && !(useron.misc&EXPERT))
57: menu("batchxfer");
58: lncntr=0;
59: while(online && !done && (batdn_total || batup_total
60: || cfg.upload_dir!=INVALID_DIR)) {
61: if(!(useron.misc&(EXPERT|RIP|WIP))) {
62: sys_status&=~SS_ABORT;
63: if(lncntr) {
64: SYNC;
65: CRLF;
66: if(lncntr) /* CRLF or SYNC can cause pause */
67: pause();
68: }
69: menu("batchxfr");
70: }
71: ASYNC;
72: bputs(text[BatchMenuPrompt]);
73: ch=(char)getkeys("BCDLQRU?\r",0);
74: if(ch>SP)
75: logch(ch,0);
76: switch(ch) {
77: case '?':
78: if(useron.misc&(EXPERT|RIP|WIP))
79: menu("batchxfr");
80: break;
81: case CR:
82: case 'Q':
83: lncntr=0;
84: done=1;
85: break;
86: case 'B': /* Bi-directional transfers */
87: if(useron.rest&FLAG('D')) {
88: bputs(text[R_Download]);
89: break;
90: }
91: if(useron.rest&FLAG('U')) {
92: bputs(text[R_Upload]);
93: break;
94: }
95: if(!batdn_total) {
96: bputs(text[DownloadQueueIsEmpty]);
97: break;
98: }
99: if(!batup_total && cfg.upload_dir==INVALID_DIR) {
100: bputs(text[UploadQueueIsEmpty]);
101: break;
102: }
103: for(i=0,totalcdt=0;i<batdn_total;i++)
104: totalcdt+=batdn_cdt[i];
105: if(!(useron.exempt&FLAG('D'))
106: && totalcdt>useron.cdt+useron.freecdt) {
107: bprintf(text[YouOnlyHaveNCredits]
108: ,ultoac(useron.cdt+useron.freecdt,tmp));
109: break;
110: }
111: for(i=0,totalsize=totaltime=0;i<batdn_total;i++) {
112: totalsize+=batdn_size[i];
113: if(!(cfg.dir[batdn_dir[i]]->misc&DIR_TFREE) && cur_cps)
114: totaltime+=batdn_size[i]/(ulong)cur_cps;
115: }
116: if(!(useron.exempt&FLAG('T')) && !SYSOP && totaltime>timeleft) {
117: bputs(text[NotEnoughTimeToDl]);
118: break;
119: }
120: menu("biprot");
121: if(!create_batchdn_lst())
122: break;
123: if(!create_batchup_lst())
124: break;
125: if(!create_bimodem_pth())
126: break;
127: SYNC;
128: mnemonics(text[ProtocolOrQuit]);
129: strcpy(tmp2,"Q");
130: for(i=0;i<cfg.total_prots;i++)
131: if(cfg.prot[i]->bicmd[0] && chk_ar(cfg.prot[i]->ar,&useron)) {
132: sprintf(tmp,"%c",cfg.prot[i]->mnemonic);
133: strcat(tmp2,tmp); }
134: ungetkey(useron.prot);
135: ch=(char)getkeys(tmp2,0);
136: if(ch=='Q')
137: break;
138: for(i=0;i<cfg.total_prots;i++)
139: if(cfg.prot[i]->bicmd[0] && cfg.prot[i]->mnemonic==ch
140: && chk_ar(cfg.prot[i]->ar,&useron))
141: break;
142: if(i<cfg.total_prots) {
143: xfrprot=i;
144: action=NODE_BXFR;
145: SYNC;
146: for(i=0;i<batdn_total;i++)
147: if(cfg.dir[batdn_dir[i]]->seqdev) {
148: lncntr=0;
149: unpadfname(batdn_name[i],tmp);
150: sprintf(tmp2,"%s%s",cfg.temp_dir,tmp);
151: if(!fexist(tmp2)) {
152: seqwait(cfg.dir[batdn_dir[i]]->seqdev);
153: bprintf(text[RetrievingFile],tmp);
154: sprintf(str,"%s%s"
155: ,batdn_alt[i]>0 && batdn_alt[i]<=cfg.altpaths
156: ? cfg.altpath[batdn_alt[i]-1]
157: : cfg.dir[batdn_dir[i]]->path
158: ,tmp);
159: mv(str,tmp2,1); /* copy the file to temp dir */
160: getnodedat(cfg.node_num,&thisnode,1);
161: thisnode.aux=0xff;
162: putnodedat(cfg.node_num,&thisnode);
163: CRLF;
164: }
165: }
166: sprintf(str,"%sBATCHDN.LST",cfg.node_dir);
167: sprintf(tmp2,"%sBATCHUP.LST",cfg.node_dir);
168: start=time(NULL);
169: protocol(cmdstr(cfg.prot[xfrprot]->bicmd,str,tmp2,NULL),0);
170: end=time(NULL);
171: for(i=0;i<batdn_total;i++)
172: if(cfg.dir[batdn_dir[i]]->seqdev) {
173: unpadfname(batdn_name[i],tmp);
174: sprintf(tmp2,"%s%s",cfg.temp_dir,tmp);
175: remove(tmp2); }
176: batch_upload();
177: batch_download(xfrprot);
178: if(batdn_total) /* files still in queue, not xfered */
179: notdownloaded(totalsize,start,end);
180: autohangup();
181: }
182: break;
183: case 'C':
184: if(batup_total) {
185: if(!noyes(text[ClearUploadQueueQ])) {
186: batup_total=0;
187: bputs(text[UploadQueueCleared]);
188: }
189: }
190: if(batdn_total) {
191: if(!noyes(text[ClearDownloadQueueQ])) {
192: for(i=0;i<batdn_total;i++) {
193: f.dir=batdn_dir[i];
194: f.datoffset=batdn_offset[i];
195: f.size=batdn_size[i];
196: strcpy(f.name,batdn_name[i]);
197: closefile(&f); }
198: batdn_total=0;
199: bputs(text[DownloadQueueCleared]);
200: }
201: }
202: break;
203: case 'D':
204: if(useron.rest&FLAG('D')) {
205: bputs(text[R_Download]);
206: break; }
207: if(!batdn_total) {
208: bputs(text[DownloadQueueIsEmpty]);
209: break; }
210: start_batch_download();
211: break;
212: case 'L':
213: if(batup_total) {
214: bputs(text[UploadQueueLstHdr]);
215: for(i=0;i<batup_total;i++)
216: bprintf(text[UploadQueueLstFmt],i+1,batup_name[i]
217: ,batup_desc[i]); }
218: if(batdn_total) {
219: bputs(text[DownloadQueueLstHdr]);
220: for(i=0,totalcdt=0,totalsize=0;i<batdn_total;i++) {
221: bprintf(text[DownloadQueueLstFmt],i+1
222: ,batdn_name[i],ultoac(batdn_cdt[i],tmp)
223: ,ultoac(batdn_size[i],str)
224: ,cur_cps
225: ? sectostr(batdn_size[i]/(ulong)cur_cps,tmp2)
226: : "??:??:??");
227: totalsize+=batdn_size[i];
228: totalcdt+=batdn_cdt[i]; }
229: bprintf(text[DownloadQueueTotals]
230: ,ultoac(totalcdt,tmp),ultoac(totalsize,str),cur_cps
231: ? sectostr(totalsize/(ulong)cur_cps,tmp2)
232: : "??:??:??"); }
233: break; /* Questionable line ^^^, see note above function */
234: case 'R':
235: if(batup_total) {
236: bprintf(text[RemoveWhichFromUlQueue],batup_total);
237: n=getnum(batup_total);
238: if(n>=1) {
239: n--;
240: batup_total--;
241: while(n<batup_total) {
242: batup_dir[n]=batup_dir[n+1];
243: batup_misc[n]=batup_misc[n+1];
244: batup_alt[n]=batup_alt[n+1];
245: strcpy(batup_name[n],batup_name[n+1]);
246: strcpy(batup_desc[n],batup_desc[n+1]);
247: n++; }
248: if(!batup_total)
249: bputs(text[UploadQueueCleared]);
250: }
251: }
252: if(batdn_total) {
253: bprintf(text[RemoveWhichFromDlQueue],batdn_total);
254: n=getnum(batdn_total);
255: if(n>=1) {
256: n--;
257: f.dir=batdn_dir[n];
258: strcpy(f.name,batdn_name[n]);
259: f.datoffset=batdn_offset[n];
260: f.size=batdn_size[n];
261: closefile(&f);
262: batdn_total--;
263: while(n<batdn_total) {
264: strcpy(batdn_name[n],batdn_name[n+1]);
265: batdn_dir[n]=batdn_dir[n+1];
266: batdn_cdt[n]=batdn_cdt[n+1];
267: batdn_alt[n]=batdn_alt[n+1];
268: batdn_size[n]=batdn_size[n+1];
269: batdn_offset[n]=batdn_offset[n+1];
270: n++;
271: }
272: if(!batdn_total)
273: bputs(text[DownloadQueueCleared]);
274: }
275: }
276: break;
277: case 'U':
278: if(useron.rest&FLAG('U')) {
279: bputs(text[R_Upload]);
280: break;
281: }
282: if(!batup_total && cfg.upload_dir==INVALID_DIR) {
283: bputs(text[UploadQueueIsEmpty]);
284: break;
285: }
286: menu("batuprot");
287: if(!create_batchup_lst())
288: break;
289: if(!create_bimodem_pth())
290: break;
291: ASYNC;
292: mnemonics(text[ProtocolOrQuit]);
293: strcpy(str,"Q");
294: for(i=0;i<cfg.total_prots;i++)
295: if(cfg.prot[i]->batulcmd[0] && chk_ar(cfg.prot[i]->ar,&useron)) {
296: sprintf(tmp,"%c",cfg.prot[i]->mnemonic);
297: strcat(str,tmp);
298: }
299: ch=(char)getkeys(str,0);
300: if(ch=='Q')
301: break;
302: for(i=0;i<cfg.total_prots;i++)
303: if(cfg.prot[i]->batulcmd[0] && cfg.prot[i]->mnemonic==ch
304: && chk_ar(cfg.prot[i]->ar,&useron))
305: break;
306: if(i<cfg.total_prots) {
307: sprintf(str,"%sBATCHUP.LST",cfg.node_dir);
308: xfrprot=i;
309: if(batup_total)
310: xfrdir=batup_dir[0];
311: else
312: xfrdir=cfg.upload_dir;
313: action=NODE_ULNG;
314: SYNC;
315: if(online==ON_REMOTE) {
316: delfiles(cfg.temp_dir,ALLFILES);
317: start=time(NULL);
318: protocol(cmdstr(cfg.prot[xfrprot]->batulcmd,str,nulstr,NULL),1);
319: end=time(NULL);
320: if(!(cfg.dir[xfrdir]->misc&DIR_ULTIME))
321: starttime+=end-start;
322: }
323: batch_upload();
324: delfiles(cfg.temp_dir,ALLFILES);
325: autohangup();
326: }
327: break;
328: }
329: }
330: delfiles(cfg.temp_dir,ALLFILES);
331: }
332:
333: /****************************************************************************/
334: /* Download files from batch queue */
335: /****************************************************************************/
336: void sbbs_t::start_batch_download()
337: {
338: char ch,str[256],tmp2[256],tmp3[128],fname[64];
339: char tmp[512];
340: int j;
341: uint i,xfrprot;
342: ulong totalcdt,totalsize,totaltime;
343: time_t start,end,t;
344: struct tm * tm;
345: file_t f;
346:
347: if(useron.rest&FLAG('D')) { /* Download restriction */
348: bputs(text[R_Download]);
349: return; }
350: for(i=0,totalcdt=0;i<batdn_total;i++)
351: totalcdt+=batdn_cdt[i];
352: if(!(useron.exempt&FLAG('D'))
353: && totalcdt>useron.cdt+useron.freecdt) {
354: bprintf(text[YouOnlyHaveNCredits]
355: ,ultoac(useron.cdt+useron.freecdt,tmp));
356: return;
357: }
358:
359: if(online==ON_LOCAL) { /* Local download */
360: bputs(text[EnterPath]);
361: if(!getstr(str,60,K_LINE|K_UPPER))
362: return;
363: backslash(str);
364: for(i=0;i<batdn_total;i++) {
365: curdirnum=batdn_dir[i]; /* for ARS */
366: lncntr=0;
367: unpadfname(batdn_name[i],tmp);
368: sprintf(tmp2,"%s%s",str,tmp);
369: seqwait(cfg.dir[batdn_dir[i]]->seqdev);
370: bprintf(text[RetrievingFile],tmp);
371: sprintf(tmp3,"%s%s"
372: ,batdn_alt[i]>0 && batdn_alt[i]<=cfg.altpaths
373: ? cfg.altpath[batdn_alt[i]-1]
374: : cfg.dir[batdn_dir[i]]->path
375: ,tmp);
376: j=mv(tmp3,tmp2,1);
377: getnodedat(cfg.node_num,&thisnode,1);
378: thisnode.aux=30; /* clear the seq dev # */
379: putnodedat(cfg.node_num,&thisnode);
380: CRLF;
381: if(j) /* copy unsuccessful */
382: return;
383: for(j=0;j<cfg.total_dlevents;j++)
384: if(!stricmp(cfg.dlevent[j]->ext,batdn_name[i]+9)
385: && chk_ar(cfg.dlevent[j]->ar,&useron)) {
386: bputs(cfg.dlevent[j]->workstr);
387: external(cmdstr(cfg.dlevent[j]->cmd,tmp2,nulstr,NULL),EX_OUTL);
388: CRLF;
389: }
390: }
391: for(i=0;i<batdn_total;i++) {
392: curdirnum=batdn_dir[i]; /* for ARS */
393: f.dir=batdn_dir[i];
394: strcpy(f.name,batdn_name[i]);
395: f.datoffset=batdn_offset[i];
396: f.size=batdn_size[i];
397: f.altpath=batdn_alt[i];
398: downloadfile(&f);
399: closefile(&f);
400: }
401: batdn_total=0;
402: return;
403: }
404:
405: for(i=0,totalsize=totaltime=0;i<batdn_total;i++) {
406: totalsize+=batdn_size[i];
407: if(!(cfg.dir[batdn_dir[i]]->misc&DIR_TFREE) && cur_cps)
408: totaltime+=batdn_size[i]/(ulong)cur_cps;
409: }
410: if(!(useron.exempt&FLAG('T')) && !SYSOP && totaltime>timeleft) {
411: bputs(text[NotEnoughTimeToDl]);
412: return;
413: }
414: menu("batdprot");
415: if(!create_batchdn_lst())
416: return;
417: if(!create_bimodem_pth())
418: return;
419: ASYNC;
420: mnemonics(text[ProtocolOrQuit]);
421: strcpy(tmp2,"Q");
422: for(i=0;i<cfg.total_prots;i++)
423: if(cfg.prot[i]->batdlcmd[0] && chk_ar(cfg.prot[i]->ar,&useron)) {
424: sprintf(tmp,"%c",cfg.prot[i]->mnemonic);
425: strcat(tmp2,tmp);
426: }
427: ungetkey(useron.prot);
428: ch=(char)getkeys(tmp2,0);
429: if(ch=='Q' || sys_status&SS_ABORT)
430: return;
431: for(i=0;i<cfg.total_prots;i++)
432: if(cfg.prot[i]->batdlcmd[0] && cfg.prot[i]->mnemonic==ch
433: && chk_ar(cfg.prot[i]->ar,&useron))
434: break;
435: if(i<cfg.total_prots) {
436: xfrprot=i;
437: for(i=0;i<batdn_total;i++) {
438: curdirnum=batdn_dir[i]; /* for ARS */
439: unpadfname(batdn_name[i],fname);
440: if(cfg.dir[batdn_dir[i]]->seqdev) {
441: lncntr=0;
442: sprintf(tmp2,"%s%s",cfg.temp_dir,fname);
443: if(!fexist(tmp2)) {
444: seqwait(cfg.dir[batdn_dir[i]]->seqdev);
445: bprintf(text[RetrievingFile],fname);
446: sprintf(str,"%s%s"
447: ,batdn_alt[i]>0 && batdn_alt[i]<=cfg.altpaths
448: ? cfg.altpath[batdn_alt[i]-1]
449: : cfg.dir[batdn_dir[i]]->path
450: ,fname);
451: mv(str,tmp2,1); /* copy the file to temp dir */
452: getnodedat(cfg.node_num,&thisnode,1);
453: thisnode.aux=40; /* clear the seq dev # */
454: putnodedat(cfg.node_num,&thisnode);
455: CRLF;
456: }
457: }
458: else
459: sprintf(tmp2,"%s%s"
460: ,batdn_alt[i]>0 && batdn_alt[i]<=cfg.altpaths
461: ? cfg.altpath[batdn_alt[i]-1]
462: : cfg.dir[batdn_dir[i]]->path
463: ,fname);
464: sprintf(str,"total_dlevents=%d",cfg.total_dlevents);
465: for(j=0;j<cfg.total_dlevents;j++) {
466: if(stricmp(cfg.dlevent[j]->ext,batdn_name[i]+9))
467: continue;
468: if(!chk_ar(cfg.dlevent[j]->ar,&useron))
469: continue;
470: bputs(cfg.dlevent[j]->workstr);
471: external(cmdstr(cfg.dlevent[j]->cmd,tmp2,nulstr,NULL),EX_OUTL);
472: CRLF;
473: }
474: }
475:
476: sprintf(str,"%sBATCHDN.LST",cfg.node_dir);
477: getnodedat(cfg.node_num,&thisnode,1);
478: action=NODE_DLNG;
479: t=now;
480: if(cur_cps)
481: t+=(totalsize/(ulong)cur_cps);
482: tm=gmtime(&t);
483: if(tm==NULL)
484: return;
485: thisnode.aux=(tm->tm_hour*60)+tm->tm_min;
486: thisnode.action=action;
487: putnodedat(cfg.node_num,&thisnode); /* calculate ETA */
488: start=time(NULL);
489: protocol(cmdstr(cfg.prot[xfrprot]->batdlcmd,str,nulstr,NULL),0);
490: end=time(NULL);
491: batch_download(xfrprot);
492: if(batdn_total)
493: notdownloaded(totalsize,start,end);
494: autohangup();
495: }
496: }
497:
498: /****************************************************************************/
499: /* Creates the file BATCHDN.LST in the node directory. Returns true if */
500: /* everything goes okay, false if not. */
501: /****************************************************************************/
502: bool sbbs_t::create_batchdn_lst()
503: {
504: char str[256];
505: int file;
506: uint i;
507:
508: sprintf(str,"%sBATCHDN.LST",cfg.node_dir);
509: if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1) {
510: errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC);
511: return(false);
512: }
513: for(i=0;i<batdn_total;i++) {
514: if(batdn_dir[i]>=cfg.total_dirs || cfg.dir[batdn_dir[i]]->seqdev)
515: strcpy(str,cfg.temp_dir);
516: else
517: strcpy(str,batdn_alt[i]>0 && batdn_alt[i]<=cfg.altpaths
518: ? cfg.altpath[batdn_alt[i]-1] : cfg.dir[batdn_dir[i]]->path);
519: write(file,str,strlen(str));
520: unpadfname(batdn_name[i],str);
521: strcat(str,crlf);
522: write(file,str,strlen(str));
523: }
524: close(file);
525: return(true);
526: }
527:
528: /****************************************************************************/
529: /* Creates the file BATCHUP.LST in the node directory. Returns true if */
530: /* everything goes okay, false if not. */
531: /* This list is not used by any protocols to date. */
532: /****************************************************************************/
533: bool sbbs_t::create_batchup_lst()
534: {
535: char str[256];
536: int file;
537: uint i;
538:
539: sprintf(str,"%sBATCHUP.LST",cfg.node_dir);
540: if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1) {
541: errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC);
542: return(false);
543: }
544: for(i=0;i<batup_total;i++) {
545: if(batup_dir[i]>=cfg.total_dirs)
546: strcpy(str,cfg.temp_dir);
547: else
548: strcpy(str,batup_alt[i]>0 && batup_alt[i]<=cfg.altpaths
549: ? cfg.altpath[batup_alt[i]-1] : cfg.dir[batup_dir[i]]->path);
550: write(file,str,strlen(str));
551: unpadfname(batup_name[i],str);
552: strcat(str,crlf);
553: write(file,str,strlen(str));
554: }
555: close(file);
556: return(true);
557: }
558:
559: /****************************************************************************/
560: /* Creates the file BIMODEM.PTH in the node directory. Returns true if */
561: /* everything goes okay, false if not. */
562: /****************************************************************************/
563: bool sbbs_t::create_bimodem_pth()
564: {
565: char str[256],tmp2[512];
566: char tmp[512];
567: int file;
568: uint i;
569:
570: sprintf(str,"%sBIMODEM.PTH",cfg.node_dir); /* Create bimodem file */
571: if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1) {
572: errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC);
573: return(false);
574: }
575: for(i=0;i<batup_total;i++) {
576: sprintf(str,"%s%s",batup_dir[i]>=cfg.total_dirs ? cfg.temp_dir
577: : batup_alt[i]>0 && batup_alt[i]<=cfg.altpaths
578: ? cfg.altpath[batup_alt[i]-1] : cfg.dir[batup_dir[i]]->path
579: ,unpadfname(batup_name[i],tmp));
580: sprintf(tmp2,"D %-80.80s%-160.160s"
581: ,unpadfname(batup_name[i],tmp),str);
582: write(file,tmp2,248);
583: }
584: for(i=0;i<batdn_total;i++) {
585: sprintf(str,"%s%s"
586: ,(batdn_dir[i]>=cfg.total_dirs || cfg.dir[batdn_dir[i]]->seqdev)
587: ? cfg.temp_dir : batdn_alt[i]>0 && batdn_alt[i]<=cfg.altpaths
588: ? cfg.altpath[batdn_alt[i]-1] : cfg.dir[batdn_dir[i]]->path
589: ,unpadfname(batdn_name[i],tmp));
590: sprintf(tmp2,"U %-240.240s",str);
591: write(file,tmp2,248);
592: }
593: close(file);
594: return(true);
595: }
596:
597: /****************************************************************************/
598: /* Processes files that were supposed to be received in the batch queue */
599: /****************************************************************************/
600: void sbbs_t::batch_upload()
601: {
602: char str1[256],str2[256];
603: char tmp[512];
604: uint i,j,x,y;
605: file_t f;
606: DIR* dir;
607: DIRENT* dirent;
608:
609: for(i=0;i<batup_total;) {
610: curdirnum=batup_dir[i]; /* for ARS */
611: lncntr=0; /* defeat pause */
612: unpadfname(batup_name[i],tmp);
613: sprintf(str1,"%s%s",cfg.temp_dir,tmp);
614: sprintf(str2,"%s%s",cfg.dir[batup_dir[i]]->path,tmp);
615: if(fexist(str1) && fexist(str2)) { /* file's in two places */
616: bprintf(text[FileAlreadyThere],batup_name[i]);
617: remove(str1); /* this is the one received */
618: i++;
619: continue;
620: }
621: if(fexist(str1))
622: mv(str1,str2,0);
623: strcpy(f.name,batup_name[i]);
624: strcpy(f.desc,batup_desc[i]);
625: f.dir=batup_dir[i];
626: f.misc=batup_misc[i];
627: f.altpath=batup_alt[i];
628: if(uploadfile(&f)) {
629: batup_total--;
630: for(j=i;j<batup_total;j++) {
631: batup_dir[j]=batup_dir[j+1];
632: batup_alt[j]=batup_alt[j+1];
633: batup_misc[j]=batup_misc[j+1];
634: strcpy(batup_name[j],batup_name[j+1]);
635: strcpy(batup_desc[j],batup_desc[j+1]);
636: }
637: }
638: else i++;
639: }
640: if(cfg.upload_dir==INVALID_DIR)
641: return;
642: dir=opendir(cfg.temp_dir);
643: while((dirent=readdir(dir))!=NULL) {
644: sprintf(str1,"%s%s",cfg.temp_dir,dirent->d_name);
645: if(isdir(str1))
646: continue;
647: memset(&f,0,sizeof(file_t));
648: f.dir=cfg.upload_dir;
649: padfname(dirent->d_name,f.name);
650: strupr(f.name);
651: for(x=0;x<usrlibs;x++) {
652: for(y=0;y<usrdirs[x];y++)
653: if(cfg.dir[usrdir[x][y]]->misc&DIR_DUPES
654: && findfile(&cfg,usrdir[x][y],f.name))
655: break;
656: if(y<usrdirs[x])
657: break;
658: }
659: sprintf(str2,"%s%s",cfg.dir[f.dir]->path,dirent->d_name);
660: if(x<usrlibs || fexist(str2)) {
661: bprintf(text[FileAlreadyOnline],f.name);
662: remove(str1);
663: } else {
664: mv(str1,str2,0);
665: uploadfile(&f);
666: }
667: }
668: closedir(dir);
669: }
670:
671: /****************************************************************************/
672: /* Processes files that were supposed to be sent from the batch queue */
673: /* xfrprot is -1 if downloading files from within QWK (no DSZLOG) */
674: /****************************************************************************/
675: void sbbs_t::batch_download(int xfrprot)
676: {
677: uint i,j;
678: file_t f;
679:
680: for(i=0;i<batdn_total;) {
681: lncntr=0; /* defeat pause */
682: f.dir=curdirnum=batdn_dir[i];
683: strcpy(f.name,batdn_name[i]);
684: f.datoffset=batdn_offset[i];
685: f.size=batdn_size[i];
686: /* Removed 05/18/95
687: if(cfg.dir[f.dir]->misc&DIR_TFREE && cur_cps) Looks like it gave back double
688: starttime+=f.size/(ulong)cur_cps;
689: */
690: f.altpath=batdn_alt[i];
691: if(xfrprot==-1 || (cfg.prot[xfrprot]->misc&PROT_DSZLOG && checkprotlog(&f))
692: || !(cfg.prot[xfrprot]->misc&PROT_DSZLOG)) {
693: if(cfg.dir[f.dir]->misc&DIR_TFREE && cur_cps)
694: starttime+=f.size/(ulong)cur_cps;
695: downloadfile(&f);
696: closefile(&f);
697: batdn_total--;
698: for(j=i;j<batdn_total;j++) {
699: strcpy(batdn_name[j],batdn_name[j+1]);
700: batdn_dir[j]=batdn_dir[j+1];
701: batdn_cdt[j]=batdn_cdt[j+1];
702: batdn_alt[j]=batdn_alt[j+1];
703: batdn_size[j]=batdn_size[j+1];
704: batdn_offset[j]=batdn_offset[j+1];
705: }
706: }
707: else i++;
708: }
709: }
710:
711: /****************************************************************************/
712: /* Adds a list of files to the batch download queue */
713: /****************************************************************************/
714: void sbbs_t::batch_add_list(char *list)
715: {
716: char str[128];
717: int file;
718: uint i,j,k;
719: FILE * stream;
720: file_t f;
721:
722: if((stream=fnopen(&file,list,O_RDONLY))!=NULL) {
723: bputs(text[SearchingAllLibs]);
724: while(!feof(stream)) {
725: checkline();
726: if(!online)
727: break;
728: if(!fgets(str,127,stream))
729: break;
730: truncsp(str);
731: sprintf(f.name,"%.12s",str);
732: strupr(f.name);
733: lncntr=0;
734: for(i=k=0;i<usrlibs;i++) {
735: for(j=0;j<usrdirs[i];j++,k++) {
736: outchar('.');
737: if(k && !(k%5))
738: bputs("\b\b\b\b\b \b\b\b\b\b");
739: if(findfile(&cfg,usrdir[i][j],f.name))
740: break;
741: }
742: if(j<usrdirs[i])
743: break;
744: }
745: if(i<usrlibs) {
746: f.dir=usrdir[i][j];
747: getfileixb(&cfg,&f);
748: f.size=0;
749: getfiledat(&cfg,&f);
750: if(f.size==-1L)
751: bprintf(text[FileIsNotOnline],f.name);
752: else
753: addtobatdl(&f);
754: }
755: }
756: fclose(stream);
757: remove(list);
758: CRLF;
759: }
760: }
761:
762: /**************************************************************************/
763: /* Add file 'f' to batch download queue. Return 1 if successful, 0 if not */
764: /**************************************************************************/
765: bool sbbs_t::addtobatdl(file_t* f)
766: {
767: char str[256],tmp2[256];
768: char tmp[512];
769: uint i;
770: ulong totalcdt, totalsize, totaltime;
771:
772: if(useron.rest&FLAG('D')) {
773: bputs(text[R_Download]);
774: return(false);
775: }
776: /***
777: sprintf(str,"%s%s",f->altpath>0 && f->altpath<=altpaths ? altpath[f->altpath-1]
778: : cfg.dir[f->dir]->path,unpadfname(f->name,tmp));
779: ***/
780: for(i=0;i<batdn_total;i++) {
781: if(!strcmp(batdn_name[i],f->name) && f->dir==batdn_dir[i]) {
782: bprintf(text[FileAlreadyInQueue],f->name);
783: return(false);
784: }
785: }
786: if(f->size<=0 /* !fexist(str) */) {
787: bprintf(text[CantAddToQueue],f->name);
788: bputs(text[FileIsNotOnline]);
789: return(false);
790: }
791: if(batdn_total>=cfg.max_batdn) {
792: bprintf(text[CantAddToQueue],f->name);
793: bputs(text[BatchDlQueueIsFull]);
794: return(false);
795: }
796: for(i=0,totalcdt=0;i<batdn_total;i++)
797: totalcdt+=batdn_cdt[i];
798: if(cfg.dir[f->dir]->misc&DIR_FREE) f->cdt=0L;
799: totalcdt+=f->cdt;
800: if(!(useron.exempt&FLAG('D')) && totalcdt>useron.cdt+useron.freecdt) {
801: bprintf(text[CantAddToQueue],f->name);
802: bprintf(text[YouOnlyHaveNCredits],ultoac(useron.cdt+useron.freecdt,tmp));
803: return(false);
804: }
805: if(!chk_ar(cfg.dir[f->dir]->dl_ar,&useron)) {
806: bprintf(text[CantAddToQueue],f->name);
807: bputs(text[CantDownloadFromDir]);
808: return(false);
809: }
810: for(i=0,totalsize=totaltime=0;i<batdn_total;i++) {
811: totalsize+=batdn_size[i];
812: if(!(cfg.dir[batdn_dir[i]]->misc&DIR_TFREE) && cur_cps)
813: totaltime+=batdn_size[i]/(ulong)cur_cps;
814: }
815: totalsize+=f->size;
816: if(!(cfg.dir[f->dir]->misc&DIR_TFREE) && cur_cps)
817: totaltime+=f->size/(ulong)cur_cps;
818: if(!(useron.exempt&FLAG('T')) && totaltime>timeleft) {
819: bprintf(text[CantAddToQueue],f->name);
820: bputs(text[NotEnoughTimeToDl]);
821: return(false);
822: }
823: strcpy(batdn_name[batdn_total],f->name);
824: batdn_dir[batdn_total]=f->dir;
825: batdn_cdt[batdn_total]=f->cdt;
826: batdn_offset[batdn_total]=f->datoffset;
827: batdn_size[batdn_total]=f->size;
828: batdn_alt[batdn_total]=f->altpath;
829: batdn_total++;
830: openfile(f);
831: bprintf(text[FileAddedToBatDlQueue]
832: ,f->name,batdn_total,cfg.max_batdn,ultoac(totalcdt,tmp)
833: ,ultoac(totalsize,tmp2)
834: ,sectostr(totalsize/(ulong)cur_cps,str));
835: return(true);
836: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.