Annotation of sbbs/sbbs2/xfer_hi.c, revision 1.1

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

unix.superglobalmegacorp.com

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