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