Annotation of sbbs/sbbs3/bat_xfer.cpp, revision 1.1.1.2

1.1       root        1: /* bat_xfer.cpp */
                      2: 
                      3: /* Synchronet batch file transfer functions */
                      4: 
1.1.1.2 ! root        5: /* $Id: bat_xfer.cpp,v 1.29 2004/05/30 06:47:52 deuce Exp $ */
1.1       root        6: 
                      7: /****************************************************************************
                      8:  * @format.tab-size 4          (Plain Text/Source Code File Header)                    *
                      9:  * @format.use-tabs true       (see http://www.synchro.net/ptsc_hdr.html)              *
                     10:  *                                                                                                                                                     *
                     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:        }
1.1.1.2 ! root       56:        if(useron.misc&(RIP|WIP|HTML) && !(useron.misc&EXPERT))
1.1       root       57:                menu("batchxfer");
                     58:        lncntr=0;
                     59:        while(online && !done && (batdn_total || batup_total
                     60:                || cfg.upload_dir!=INVALID_DIR)) {
1.1.1.2 ! root       61:                if(!(useron.misc&(EXPERT|RIP|WIP|HTML))) {
1.1       root       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);
1.1.1.2 ! root       74:                if(ch>' ')
1.1       root       75:                        logch(ch,0);
                     76:                switch(ch) {
                     77:                        case '?':
1.1.1.2 ! root       78:                                if(useron.misc&(EXPERT|RIP|WIP|HTML))
1.1       root       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++)
1.1.1.2 ! root      104:                                        if(!is_download_free(&cfg,batdn_dir[i],&useron))
1.1       root      105:                                                totalcdt+=batdn_cdt[i];
1.1.1.2 ! root      106:                                if(totalcdt>useron.cdt+useron.freecdt) {
1.1       root      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:                                }
1.1.1.2 ! root      120:                                xfer_prot_menu(XFER_BIDIR);
1.1       root      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) {
1.1.1.2 ! root      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: 
1.1       root      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);
1.1.1.2 ! root      152:                                                        if(!fexistcase(tmp2)) {
1.1       root      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 */
1.1.1.2 ! root      161:                                                                if(getnodedat(cfg.node_num,&thisnode,true)==0) {
        !           162:                                                                        thisnode.aux=0xff;
        !           163:                                                                        putnodedat(cfg.node_num,&thisnode);
        !           164:                                                                }
1.1       root      165:                                                                CRLF; 
                    166:                                                        } 
                    167:                                                }
                    168:                                        sprintf(str,"%sBATCHDN.LST",cfg.node_dir);
                    169:                                        sprintf(tmp2,"%sBATCHUP.LST",cfg.node_dir);
                    170:                                        start=time(NULL);
1.1.1.2 ! root      171:                                        protocol(cfg.prot[xfrprot],XFER_BIDIR,str,tmp2,true);
1.1       root      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);
1.1.1.2 ! root      234:                                        if((int)n>=1) {
1.1       root      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);
1.1.1.2 ! root      251:                                        if((int)n>=1) {
1.1       root      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:                                }
1.1.1.2 ! root      282:                                xfer_prot_menu(XFER_BATCH_UPLOAD);
1.1       root      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);
1.1.1.2 ! root      314:                                                protocol(cfg.prot[xfrprot],XFER_BATCH_UPLOAD,str,nulstr,true);
1.1       root      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: /****************************************************************************/
1.1.1.2 ! root      332: BOOL sbbs_t::start_batch_download()
1.1       root      333: {
1.1.1.2 ! root      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;
1.1       root      342:     int                j;
                    343:     uint       i,xfrprot;
                    344:     ulong      totalcdt,totalsize,totaltime;
                    345:     time_t     start,end,t;
1.1.1.2 ! root      346:        struct  tm tm;
1.1       root      347: 
1.1.1.2 ! root      348:        if(batdn_total==0) {
        !           349:                bputs(text[DownloadQueueIsEmpty]);
        !           350:                return(FALSE);
        !           351:        }
1.1       root      352:        if(useron.rest&FLAG('D')) {     /* Download restriction */
                    353:                bputs(text[R_Download]);
1.1.1.2 ! root      354:                return(FALSE); 
        !           355:        }
1.1       root      356:        for(i=0,totalcdt=0;i<batdn_total;i++)
1.1.1.2 ! root      357:                if(is_download_free(&cfg,batdn_dir[i],&useron))
        !           358:                        totalcdt+=batdn_cdt[i];
        !           359:        if(totalcdt>useron.cdt+useron.freecdt) {
1.1       root      360:                bprintf(text[YouOnlyHaveNCredits]
                    361:                        ,ultoac(useron.cdt+useron.freecdt,tmp));
1.1.1.2 ! root      362:                return(FALSE); 
1.1       root      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]);
1.1.1.2 ! root      372:                return(FALSE); 
1.1       root      373:        }
1.1.1.2 ! root      374:        xfer_prot_menu(XFER_BATCH_DOWNLOAD);
1.1       root      375:        ASYNC;
                    376:        mnemonics(text[ProtocolOrQuit]);
1.1.1.2 ! root      377:        strcpy(str,"Q");
1.1       root      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);
1.1.1.2 ! root      381:                        strcat(str,tmp); 
1.1       root      382:                }
                    383:        ungetkey(useron.prot);
1.1.1.2 ! root      384:        ch=(char)getkeys(str,0);
1.1       root      385:        if(ch=='Q' || sys_status&SS_ABORT)
1.1.1.2 ! root      386:                return(FALSE);
1.1       root      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;
1.1.1.2 ! root      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"
1.1       root      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);
1.1.1.2 ! root      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:                                }
1.1       root      420:                                CRLF; 
1.1.1.2 ! root      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; 
1.1       root      451:                }
1.1.1.2 ! root      452:        }
1.1       root      453: 
1.1.1.2 ! root      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;
1.1       root      462:                thisnode.action=action;
                    463:                putnodedat(cfg.node_num,&thisnode); /* calculate ETA */
                    464:        }
1.1.1.2 ! root      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);
1.1       root      477: }
                    478: 
                    479: /****************************************************************************/
                    480: /* Creates the file BATCHDN.LST in the node directory. Returns true if      */
                    481: /* everything goes okay, false if not.                                      */
                    482: /****************************************************************************/
1.1.1.2 ! root      483: bool sbbs_t::create_batchdn_lst(bool native)
1.1       root      484: {
1.1.1.2 ! root      485:        char    path[MAX_PATH+1];
        !           486:        char    fname[MAX_PATH+1];
1.1       root      487:        int             file;
                    488:        uint    i;
                    489: 
1.1.1.2 ! root      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);
1.1       root      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)
1.1.1.2 ! root      497:                        SAFECOPY(path,cfg.temp_dir);
1.1       root      498:                else
1.1.1.2 ! root      499:                        SAFECOPY(path,batdn_alt[i]>0 && batdn_alt[i]<=cfg.altpaths
1.1       root      500:                                ? cfg.altpath[batdn_alt[i]-1] : cfg.dir[batdn_dir[i]]->path);
1.1.1.2 ! root      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)); 
1.1       root      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[256],str2[256];
                    588:        char    tmp[512];
                    589:        uint    i,j,x,y;
                    590:     file_t     f;
                    591:        DIR*    dir;
                    592:        DIRENT* dirent;
                    593: 
                    594:        for(i=0;i<batup_total;) {
                    595:                curdirnum=batup_dir[i];                         /* for ARS */
                    596:                lncntr=0;                               /* defeat pause */
                    597:                unpadfname(batup_name[i],tmp);
                    598:                sprintf(str1,"%s%s",cfg.temp_dir,tmp);
                    599:                sprintf(str2,"%s%s",cfg.dir[batup_dir[i]]->path,tmp);
1.1.1.2 ! root      600:                if(fexistcase(str1) && fexistcase(str2)) { /* file's in two places */
1.1       root      601:                        bprintf(text[FileAlreadyThere],batup_name[i]);
                    602:                        remove(str1);    /* this is the one received */
                    603:                        i++;
                    604:                        continue; 
                    605:                }
                    606:                if(fexist(str1))
                    607:                        mv(str1,str2,0);
                    608:                strcpy(f.name,batup_name[i]);
                    609:                strcpy(f.desc,batup_desc[i]);
                    610:                f.dir=batup_dir[i];
                    611:                f.misc=batup_misc[i];
                    612:                f.altpath=batup_alt[i];
                    613:                if(uploadfile(&f)) {
                    614:                        batup_total--;
                    615:                        for(j=i;j<batup_total;j++) {
                    616:                                batup_dir[j]=batup_dir[j+1];
                    617:                                batup_alt[j]=batup_alt[j+1];
                    618:                                batup_misc[j]=batup_misc[j+1];
                    619:                                strcpy(batup_name[j],batup_name[j+1]);
                    620:                                strcpy(batup_desc[j],batup_desc[j+1]); 
                    621:                        } 
                    622:                }
                    623:                else i++; 
                    624:        }
                    625:        if(cfg.upload_dir==INVALID_DIR)
                    626:                return;
                    627:        dir=opendir(cfg.temp_dir);
1.1.1.2 ! root      628:        while(dir!=NULL && (dirent=readdir(dir))!=NULL) {
1.1       root      629:                sprintf(str1,"%s%s",cfg.temp_dir,dirent->d_name);
                    630:                if(isdir(str1))
                    631:                        continue;
                    632:                memset(&f,0,sizeof(file_t));
                    633:                f.dir=cfg.upload_dir;
                    634:                padfname(dirent->d_name,f.name);
                    635:                for(x=0;x<usrlibs;x++) {
                    636:                        for(y=0;y<usrdirs[x];y++)
                    637:                                if(cfg.dir[usrdir[x][y]]->misc&DIR_DUPES
                    638:                                        && findfile(&cfg,usrdir[x][y],f.name))
                    639:                                        break;
                    640:                        if(y<usrdirs[x])
                    641:                                break; 
                    642:                }
                    643:                sprintf(str2,"%s%s",cfg.dir[f.dir]->path,dirent->d_name);
1.1.1.2 ! root      644:                if(x<usrlibs || fexistcase(str2)) {
1.1       root      645:                        bprintf(text[FileAlreadyOnline],f.name);
                    646:                        remove(str1); 
                    647:                } else {
                    648:                        mv(str1,str2,0);
                    649:                        uploadfile(&f); 
                    650:                }
                    651:        }
1.1.1.2 ! root      652:        if(dir!=NULL)
        !           653:                closedir(dir);
1.1       root      654: }
                    655: 
                    656: /****************************************************************************/
                    657: /* Processes files that were supposed to be sent from the batch queue       */
                    658: /* xfrprot is -1 if downloading files from within QWK (no DSZLOG)           */
                    659: /****************************************************************************/
                    660: void sbbs_t::batch_download(int xfrprot)
                    661: {
                    662:     uint       i,j;
                    663:     file_t     f;
                    664: 
                    665:        for(i=0;i<batdn_total;) {
                    666:                lncntr=0;                               /* defeat pause */
                    667:                f.dir=curdirnum=batdn_dir[i];
                    668:                strcpy(f.name,batdn_name[i]);
                    669:                f.datoffset=batdn_offset[i];
                    670:                f.size=batdn_size[i];
                    671:                f.altpath=batdn_alt[i];
1.1.1.2 ! root      672:                if(xfrprot==-1 || checkprotresult(cfg.prot[xfrprot],0,&f)) {
1.1       root      673:                        if(cfg.dir[f.dir]->misc&DIR_TFREE && cur_cps)
                    674:                                starttime+=f.size/(ulong)cur_cps;
                    675:                        downloadfile(&f);
                    676:                        closefile(&f);
                    677:                        batdn_total--;
                    678:                        for(j=i;j<batdn_total;j++) {
                    679:                                strcpy(batdn_name[j],batdn_name[j+1]);
                    680:                                batdn_dir[j]=batdn_dir[j+1];
                    681:                                batdn_cdt[j]=batdn_cdt[j+1];
                    682:                                batdn_alt[j]=batdn_alt[j+1];
                    683:                                batdn_size[j]=batdn_size[j+1];
                    684:                                batdn_offset[j]=batdn_offset[j+1]; 
                    685:                        } 
                    686:                }
                    687:                else i++; 
                    688:        }
                    689: }
                    690: 
                    691: /****************************************************************************/
                    692: /* Adds a list of files to the batch download queue                                            */
                    693: /****************************************************************************/
                    694: void sbbs_t::batch_add_list(char *list)
                    695: {
                    696:     char       str[128];
                    697:        int             file;
                    698:        uint    i,j,k;
                    699:     FILE *     stream;
                    700:        file_t  f;
                    701: 
                    702:        if((stream=fnopen(&file,list,O_RDONLY))!=NULL) {
                    703:                bputs(text[SearchingAllLibs]);
                    704:                while(!feof(stream)) {
                    705:                        checkline();
                    706:                        if(!online)
                    707:                                break;
                    708:                        if(!fgets(str,127,stream))
                    709:                                break;
                    710:                        truncsp(str);
                    711:                        sprintf(f.name,"%.12s",str);
                    712:                        lncntr=0;
1.1.1.2 ! root      713:                        for(i=j=k=0;i<usrlibs;i++) {
1.1       root      714:                                for(j=0;j<usrdirs[i];j++,k++) {
                    715:                                        outchar('.');
                    716:                                        if(k && !(k%5))
                    717:                                                bputs("\b\b\b\b\b     \b\b\b\b\b");
                    718:                                        if(findfile(&cfg,usrdir[i][j],f.name))
                    719:                                                break; 
                    720:                                }
                    721:                                if(j<usrdirs[i])
                    722:                                        break; 
                    723:                        }
                    724:                        if(i<usrlibs) {
                    725:                                f.dir=usrdir[i][j];
                    726:                                getfileixb(&cfg,&f);
                    727:                                f.size=0;
                    728:                                getfiledat(&cfg,&f);
                    729:                                if(f.size==-1L)
                    730:                                        bprintf(text[FileIsNotOnline],f.name);
                    731:                                else
                    732:                                        addtobatdl(&f); 
                    733:                        } 
                    734:                }
                    735:                fclose(stream);
                    736:                remove(list);
                    737:                CRLF; 
                    738:        }
                    739: }
1.1.1.2 ! root      740: /****************************************************************************/
        !           741: void sbbs_t::batch_create_list()
        !           742: {
        !           743:        char    str[MAX_PATH+1];
        !           744:        int             i;
        !           745:        FILE*   stream;
        !           746: 
        !           747:        if(batdn_total) {
        !           748:                sprintf(str,"%sfile/%04u.dwn",cfg.data_dir,useron.number);
        !           749:                if((stream=fnopen(NULL,str,O_WRONLY|O_TRUNC|O_CREAT))!=NULL) {
        !           750:                        for(i=0;i<(int)batdn_total;i++)
        !           751:                                fprintf(stream,"%s\r\n",batdn_name[i]);
        !           752:                        fclose(stream); 
        !           753:                } 
        !           754:        }
        !           755: }
1.1       root      756: 
                    757: /**************************************************************************/
                    758: /* Add file 'f' to batch download queue. Return 1 if successful, 0 if not */
                    759: /**************************************************************************/
                    760: bool sbbs_t::addtobatdl(file_t* f)
                    761: {
                    762:     char       str[256],tmp2[256];
                    763:        char    tmp[512];
                    764:     uint       i;
                    765:        ulong   totalcdt, totalsize, totaltime;
                    766: 
                    767:        if(useron.rest&FLAG('D')) {
                    768:                bputs(text[R_Download]);
                    769:                return(false); 
                    770:        }
                    771:        for(i=0;i<batdn_total;i++) {
                    772:                if(!strcmp(batdn_name[i],f->name) && f->dir==batdn_dir[i]) {
                    773:                        bprintf(text[FileAlreadyInQueue],f->name);
                    774:                        return(false); 
                    775:                } 
                    776:        }
                    777:        if(f->size<=0 /* !fexist(str) */) {
                    778:                bprintf(text[CantAddToQueue],f->name);
                    779:                bputs(text[FileIsNotOnline]);
                    780:                return(false); 
                    781:        }
                    782:        if(batdn_total>=cfg.max_batdn) {
                    783:                bprintf(text[CantAddToQueue],f->name);
                    784:                bputs(text[BatchDlQueueIsFull]);
                    785:                return(false); 
                    786:        }
                    787:        for(i=0,totalcdt=0;i<batdn_total;i++)
1.1.1.2 ! root      788:                if(!is_download_free(&cfg,batdn_dir[i],&useron))
        !           789:                        totalcdt+=batdn_cdt[i];
1.1       root      790:        if(cfg.dir[f->dir]->misc&DIR_FREE) f->cdt=0L;
1.1.1.2 ! root      791:        if(!is_download_free(&cfg,f->dir,&useron))
        !           792:                totalcdt+=f->cdt;
        !           793:        if(totalcdt>useron.cdt+useron.freecdt) {
1.1       root      794:                bprintf(text[CantAddToQueue],f->name);
                    795:                bprintf(text[YouOnlyHaveNCredits],ultoac(useron.cdt+useron.freecdt,tmp));
                    796:                return(false); 
                    797:        }
                    798:        if(!chk_ar(cfg.dir[f->dir]->dl_ar,&useron)) {
                    799:                bprintf(text[CantAddToQueue],f->name);
                    800:                bputs(text[CantDownloadFromDir]);
                    801:                return(false); 
                    802:        }
                    803:        for(i=0,totalsize=totaltime=0;i<batdn_total;i++) {
                    804:                totalsize+=batdn_size[i];
                    805:                if(!(cfg.dir[batdn_dir[i]]->misc&DIR_TFREE) && cur_cps)
                    806:                        totaltime+=batdn_size[i]/(ulong)cur_cps; 
                    807:        }
                    808:        totalsize+=f->size;
                    809:        if(!(cfg.dir[f->dir]->misc&DIR_TFREE) && cur_cps)
                    810:                totaltime+=f->size/(ulong)cur_cps;
                    811:        if(!(useron.exempt&FLAG('T')) && totaltime>timeleft) {
                    812:                bprintf(text[CantAddToQueue],f->name);
                    813:                bputs(text[NotEnoughTimeToDl]);
                    814:                return(false); 
                    815:        }
                    816:        strcpy(batdn_name[batdn_total],f->name);
                    817:        batdn_dir[batdn_total]=f->dir;
                    818:        batdn_cdt[batdn_total]=f->cdt;
                    819:        batdn_offset[batdn_total]=f->datoffset;
                    820:        batdn_size[batdn_total]=f->size;
                    821:        batdn_alt[batdn_total]=f->altpath;
                    822:        batdn_total++;
                    823:        openfile(f);
                    824:        bprintf(text[FileAddedToBatDlQueue]
                    825:                ,f->name,batdn_total,cfg.max_batdn,ultoac(totalcdt,tmp)
                    826:                ,ultoac(totalsize,tmp2)
                    827:                ,sectostr(totalsize/(ulong)cur_cps,str));
                    828:        return(true);
                    829: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.