Annotation of sbbs/src/sbbs3/tmp_xfer.cpp, revision 1.1.1.1

1.1       root        1: /* tmp_xfer.cpp */
                      2: 
                      3: /* Synchronet temp directory file transfer routines */
                      4: 
                      5: /* $Id: tmp_xfer.cpp,v 1.38 2005/10/02 23:52:26 rswindell Exp $ */
                      6: 
                      7: /****************************************************************************
                      8:  * @format.tab-size 4          (Plain Text/Source Code File Header)                    *
                      9:  * @format.use-tabs true       (see http://www.synchro.net/ptsc_hdr.html)              *
                     10:  *                                                                                                                                                     *
                     11:  * Copyright 2005 Rob Swindell - http://www.synchro.net/copyright.html         *
                     12:  *                                                                                                                                                     *
                     13:  * This program is free software; you can redistribute it and/or                       *
                     14:  * modify it under the terms of the GNU General Public License                         *
                     15:  * as published by the Free Software Foundation; either version 2                      *
                     16:  * of the License, or (at your option) any later version.                                      *
                     17:  * See the GNU General Public License for more details: gpl.txt or                     *
                     18:  * http://www.fsf.org/copyleft/gpl.html                                                                                *
                     19:  *                                                                                                                                                     *
                     20:  * Anonymous FTP access to the most recent released source is available at     *
                     21:  * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net     *
                     22:  *                                                                                                                                                     *
                     23:  * Anonymous CVS access to the development source and modification history     *
                     24:  * is available at cvs.synchro.net:/cvsroot/sbbs, example:                                     *
                     25:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs login                       *
                     26:  *     (just hit return, no password is necessary)                                                     *
                     27:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src                *
                     28:  *                                                                                                                                                     *
                     29:  * For Synchronet coding style and modification guidelines, see                                *
                     30:  * http://www.synchro.net/source.html                                                                          *
                     31:  *                                                                                                                                                     *
                     32:  * You are encouraged to submit any modifications (preferably in Unix diff     *
                     33:  * format) via e-mail to [email protected]                                                                      *
                     34:  *                                                                                                                                                     *
                     35:  * Note: If this box doesn't appear square, then you need to fix your tabs.    *
                     36:  ****************************************************************************/
                     37: 
                     38: #include "sbbs.h"
                     39: 
                     40: /*****************************************************************************/
                     41: /* Temp directory section. Files must be extracted here and both temp_uler   */
                     42: /* and temp_uler fields should be filled before entrance.                    */
                     43: /*****************************************************************************/
                     44: void sbbs_t::temp_xfer()
                     45: {
                     46:     char       str[256],tmp2[256],done=0,ch;
                     47:        char    tmp[512];
                     48:        int             error;
                     49:     uint       i,dirnum=cfg.total_dirs,files;
                     50:     ulong      bytes;
                     51:        ulong   space;
                     52:     time_t     start,end,t;
                     53:     file_t     f;
                     54:        glob_t  g;
                     55:        struct  tm tm;
                     56: 
                     57:        if(!usrlibs)
                     58:                return;
                     59:        if(useron.rest&FLAG('D')) {
                     60:                bputs(text[R_Download]);
                     61:                return; }
                     62:        /*************************************/
                     63:        /* Create TEMP directory information */
                     64:        /*************************************/
                     65:        if((cfg.dir[dirnum]=(dir_t *)malloc(sizeof(dir_t)))==0) {
                     66:                errormsg(WHERE,ERR_ALLOC,"temp_dir",sizeof(dir_t));
                     67:                return; }
                     68:        memset(cfg.dir[dirnum],0,sizeof(dir_t));
                     69:        SAFECOPY(cfg.dir[dirnum]->lname,"Temporary");
                     70:        SAFECOPY(cfg.dir[dirnum]->sname,"Temp");
                     71:        SAFECOPY(cfg.dir[dirnum]->code,"TEMP");
                     72:        SAFECOPY(cfg.dir[dirnum]->path,cfg.temp_dir);
                     73:        SAFECOPY(cfg.dir[dirnum]->data_dir,cfg.dir[0]->data_dir);
                     74:        cfg.dir[dirnum]->maxfiles=MAX_FILES;
                     75:        cfg.dir[dirnum]->op_ar=(uchar *)nulstr;
                     76:        cfg.dir[dirnum]->ex_ar=(uchar *)nulstr;
                     77:        temp_dirnum=curdirnum=usrdir[curlib][curdir[curlib]];
                     78:        cfg.total_dirs++;
                     79: 
                     80:        /****************************/
                     81:        /* Fill filedat information */
                     82:        /****************************/
                     83:        memset(&f,0,sizeof(f));
                     84:        SAFEPRINTF2(f.name,"temp_%3.3d.%s",cfg.node_num,useron.tmpext);
                     85:        SAFECOPY(f.desc,"Temp File");
                     86:        f.dir=dirnum;
                     87: 
                     88:        if(useron.misc&(RIP|WIP|HTML) && !(useron.misc&EXPERT))
                     89:                menu("tempxfer");
                     90:        lncntr=0;
                     91:        while(online && !done) {
                     92:                if(!(useron.misc&(EXPERT|RIP|WIP|HTML))) {
                     93:                        sys_status&=~SS_ABORT;
                     94:                        if(lncntr) {
                     95:                                SYNC;
                     96:                                CRLF;
                     97:                                if(lncntr)          /* CRLF or SYNC can cause pause */
                     98:                                        pause(); }
                     99:                        menu("tempxfer"); }
                    100:                ASYNC;
                    101:                bputs(text[TempDirPrompt]);
                    102:                SAFECOPY(f.uler,temp_uler);
                    103:                ch=(char)getkeys("ADEFNILQRVX?\r",0);
                    104:                if(ch>' ')
                    105:                        logch(ch,0);
                    106:                switch(ch) {
                    107:                        case 'A':   /* add to temp file */
                    108:                                /* free disk space */
                    109:                                space=getfreediskspace(cfg.temp_dir,1024);
                    110:                                if(space<(ulong)cfg.min_dspace) {
                    111:                                        bputs(text[LowDiskSpace]);
                    112:                                        sprintf(str,"Diskspace is low: %s (%lu kilobytes)"
                    113:                                                ,cfg.temp_dir,space);
                    114:                                        errorlog(str);
                    115:                                        if(!dir_op(dirnum))
                    116:                                                break; }
                    117:                                bprintf(text[DiskNBytesFree],ultoac(space,tmp));
                    118:                                if(!getfilespec(str))
                    119:                                        break;
                    120:                                if(!checkfname(str))
                    121:                                        break;
                    122:                                sprintf(tmp2,"%s added %s to %s"
                    123:                                        ,useron.alias,str,f.name);
                    124:                                logline(nulstr,tmp2);
                    125:                                sprintf(tmp2,"%s%s",cfg.temp_dir,str);
                    126:                                sprintf(str,"%s%s",cfg.temp_dir,f.name);
                    127:                                external(cmdstr(temp_cmd(),str,tmp2,NULL),EX_WILDCARD|EX_OUTL|EX_OUTR);
                    128:                                break;
                    129:                        case 'D':   /* download from temp dir */
                    130:                                sprintf(str,"%s%s",cfg.temp_dir,f.name);
                    131:                                if(!fexist(str)) {
                    132:                                        bprintf(text[TempFileNotCreatedYet],f.name);
                    133:                                        break; }
                    134:                                f.size=f.cdt=flength(str);
                    135:                                f.opencount=0;
                    136:                                if(temp_cdt)    /* if file was not free */
                    137:                                        f.cdt=f.size;
                    138:                                else
                    139:                                        f.cdt=0;
                    140:                                if(!(useron.exempt&FLAG('D'))
                    141:                                        && f.cdt>useron.cdt+useron.freecdt) {
                    142:                                        bprintf(text[YouOnlyHaveNCredits]
                    143:                                                ,ultoac(useron.cdt+useron.freecdt,tmp));
                    144:                                        break; }    /* f.cdt must equal size here */
                    145:                                if(!(useron.exempt&FLAG('T')) && !dir_op(dirnum)
                    146:                                        && !(cfg.dir[temp_dirnum]->misc&DIR_TFREE) && cur_cps
                    147:                                        && f.size/(ulong)cur_cps>timeleft) {
                    148:                                        bputs(text[NotEnoughTimeToDl]);
                    149:                                        break; }
                    150:                                if(!chk_ar(cfg.dir[temp_dirnum]->dl_ar,&useron)) {
                    151:                                        bputs(text[CantDownloadFromDir]);
                    152:                                        break; }
                    153:                                addfiledat(&cfg,&f);
                    154:                                xfer_prot_menu(XFER_DOWNLOAD);
                    155:                                SYNC;
                    156:                                mnemonics(text[ProtocolOrQuit]);
                    157:                                SAFECOPY(tmp2,"Q");
                    158:                                for(i=0;i<cfg.total_prots;i++)
                    159:                                        if(cfg.prot[i]->dlcmd[0] && chk_ar(cfg.prot[i]->ar,&useron)) {
                    160:                                                sprintf(tmp,"%c",cfg.prot[i]->mnemonic);
                    161:                                                strcat(tmp2,tmp); }
                    162:                                ungetkey(useron.prot);
                    163:                                ch=(char)getkeys(tmp2,0);
                    164:                                for(i=0;i<cfg.total_prots;i++)
                    165:                                        if(cfg.prot[i]->dlcmd[0] && cfg.prot[i]->mnemonic==ch
                    166:                                                && chk_ar(cfg.prot[i]->ar,&useron))
                    167:                                                break;
                    168:                                if(i<cfg.total_prots) {
                    169:                                        getnodedat(cfg.node_num,&thisnode,1);
                    170:                                        action=NODE_DLNG;
                    171:                                        t=now;
                    172:                                        if(cur_cps) 
                    173:                                                t+=(f.size/(ulong)cur_cps);
                    174:                                        if(localtime_r(&t,&tm)==NULL)
                    175:                                                break;
                    176:                                        thisnode.aux=(tm.tm_hour*60)+tm.tm_min;
                    177: 
                    178:                                        putnodedat(cfg.node_num,&thisnode); /* calculate ETA */
                    179:                                        start=time(NULL);
                    180:                                        error=protocol(cfg.prot[i],XFER_DOWNLOAD,str,nulstr,false);
                    181:                                        end=time(NULL);
                    182:                                        if(cfg.dir[temp_dirnum]->misc&DIR_TFREE)
                    183:                                                starttime+=end-start;
                    184:                                        if(checkprotresult(cfg.prot[i],error,&f))
                    185:                                                downloadfile(&f);
                    186:                                        else
                    187:                                                notdownloaded(f.size,start,end);
                    188:                                        autohangup(); 
                    189:                                }
                    190:                                removefiledat(&cfg,&f);
                    191:                                break;
                    192:                        case 'E':
                    193:                                extract(usrdir[curlib][curdir[curlib]]);
                    194:                                sys_status&=~SS_ABORT;
                    195:                                break;
                    196:                        case 'F':   /* Create a file list */
                    197:                                delfiles(cfg.temp_dir,ALLFILES);
                    198:                                create_filelist("FILELIST.TXT",0);
                    199:                                if(!(sys_status&SS_ABORT))
                    200:                                        logline(nulstr,"Created list of all files");
                    201:                                CRLF;
                    202:                                sys_status&=~SS_ABORT;
                    203:                                break;
                    204:                        case 'I':   /* information on what's here */
                    205:                                bprintf(text[TempFileInfo],f.uler,temp_file);
                    206:                                break;
                    207:                        case 'L':   /* list files in dir */
                    208:                                if(!getfilespec(str))
                    209:                                        break;
                    210:                                if(!checkfname(str))
                    211:                                        break;
                    212:                                bytes=files=0L;
                    213:                                CRLF;
                    214:                                sprintf(tmp2,"%s%s",cfg.temp_dir,str);
                    215:                                glob(tmp2,0,NULL,&g);
                    216:                                for(i=0;i<(uint)g.gl_pathc && !msgabort();i++) {
                    217:                                        if(isdir(g.gl_pathv[i]))
                    218:                                                continue;
                    219:                                        t=fdate(g.gl_pathv[i]);
                    220:                                        bprintf("%-25s %15s   %s\r\n",getfname(g.gl_pathv[i])
                    221:                                                ,ultoac(flength(g.gl_pathv[i]),tmp)
                    222:                                                ,timestr(&t));
                    223:                                        files++;
                    224:                                        bytes+=flength(g.gl_pathv[i]);
                    225:                                }
                    226:                                globfree(&g);
                    227:                                if(!files)
                    228:                                        bputs(text[EmptyDir]);
                    229:                                else if(files>1)
                    230:                                        bprintf(text[TempDirTotal],ultoac(bytes,tmp),files);
                    231:                                break;
                    232:                        case 'N':   /* Create a list of new files */
                    233:                                delfiles(cfg.temp_dir,ALLFILES);
                    234:                                create_filelist("NEWFILES.TXT",FL_ULTIME);
                    235:                                if(!(sys_status&SS_ABORT))
                    236:                                        logline(nulstr,"Created list of new files");
                    237:                                CRLF;
                    238:                                sys_status&=~SS_ABORT;
                    239:                                break;
                    240:                        case 'R':   /* Remove files from dir */
                    241:                                if(!getfilespec(str) || !checkfname(str))
                    242:                                        break;
                    243:                                bprintf(text[NFilesRemoved],delfiles(cfg.temp_dir,str));
                    244:                                break;
                    245:                        case 'V':   /* view files in dir */
                    246:                                bputs(text[FileSpec]);
                    247:                                if(!getstr(str,64,K_NONE) || !checkfname(str))
                    248:                                        break;
                    249:                                viewfiles(dirnum,str);
                    250:                                break;
                    251:                        case CR:
                    252:                        case 'Q':   /* quit */
                    253:                                done=1;
                    254:                                break;
                    255:                        case 'X':   /* extract from archive in temp dir */
                    256:                                extract(dirnum);
                    257:                                sys_status&=~SS_ABORT;
                    258:                                break;
                    259:                        case '?':   /* menu */
                    260:                                if(useron.misc&(EXPERT|RIP|WIP|HTML))
                    261:                                        menu("tempxfer");
                    262:                                break; }
                    263:                if(sys_status&SS_ABORT)
                    264:                        break; }
                    265:        free(cfg.dir[dirnum]);
                    266:        cfg.total_dirs--;
                    267: }
                    268: 
                    269: /*****************************************************************************/
                    270: /* Handles extraction from a normal transfer file to the temp directory      */
                    271: /*****************************************************************************/
                    272: void sbbs_t::extract(uint dirnum)
                    273: {
                    274:     char       fname[13],str[256],excmd[256],path[256],done
                    275:                                ,tmp[256],intmp=0;
                    276:     uint       i,j;
                    277:        ulong   space;
                    278:     file_t     f;
                    279:        DIR*    dir;
                    280:        DIRENT* dirent;
                    281: 
                    282:        temp_dirnum=curdirnum=dirnum;
                    283:        if(!strcmp(cfg.dir[dirnum]->code,"TEMP"))
                    284:                intmp=1;
                    285: 
                    286:        /* get free disk space */
                    287:        space=getfreediskspace(cfg.temp_dir,1024);
                    288:        if(space<(ulong)cfg.min_dspace) {
                    289:                bputs(text[LowDiskSpace]);
                    290:                sprintf(str,"Diskspace is low: %s (%lu kilobytes)",cfg.temp_dir,space);
                    291:                errorlog(str);
                    292:                if(!dir_op(dirnum))
                    293:                        return; }
                    294:        else if(!intmp) {   /* not in temp dir */
                    295:                CRLF; }
                    296:        bprintf(text[DiskNBytesFree],ultoac(space,tmp));
                    297: 
                    298:        if(!intmp) {    /* not extracting FROM temp directory */
                    299:                sprintf(str,"%s%s",cfg.temp_dir,ALLFILES);
                    300:                if(fexist(str)) {
                    301:                        bputs(text[RemovingTempFiles]);
                    302:                        dir=opendir(cfg.temp_dir);
                    303:                        while(dir!=NULL && (dirent=readdir(dir))!=NULL) {
                    304:                                sprintf(str,"%s%s",cfg.temp_dir,dirent->d_name);
                    305:                        if(!isdir(str))
                    306:                                        remove(str);
                    307:                        }
                    308:                        if(dir!=NULL)
                    309:                                closedir(dir);
                    310:                        CRLF; 
                    311:                } 
                    312:        }
                    313:        bputs(text[ExtractFrom]);
                    314:        if(!getstr(fname,64,K_NONE) || !checkfname(fname) || strchr(fname,'*')
                    315:                || strchr(fname,'?'))
                    316:                return;
                    317:        padfname(fname,f.name);
                    318:        SAFECOPY(str,f.name);
                    319:        truncsp(str);
                    320:        for(i=0;i<cfg.total_fextrs;i++)
                    321:                if(!stricmp(str+9,cfg.fextr[i]->ext) && chk_ar(cfg.fextr[i]->ar,&useron)) {
                    322:                        SAFECOPY(excmd,cfg.fextr[i]->cmd);
                    323:                        break; }
                    324:        if(i==cfg.total_fextrs) {
                    325:                bputs(text[UnextractableFile]);
                    326:                return; }
                    327:        if(!intmp && !findfile(&cfg,dirnum,f.name)) {    /* not temp dir */
                    328:                bputs(text[SearchingAllDirs]);
                    329:                for(i=0;i<usrdirs[curlib] && !msgabort();i++) {
                    330:                        if(i==dirnum) continue;
                    331:                        if(findfile(&cfg,usrdir[curlib][i],f.name))
                    332:                                break; }
                    333:                if(i==usrdirs[curlib]) { /* not found in cur lib */
                    334:                        bputs(text[SearchingAllLibs]);
                    335:                        for(i=j=0;i<usrlibs;i++) {
                    336:                                if(i==curlib) continue;
                    337:                                for(j=0;j<usrdirs[i] && !msgabort();j++)
                    338:                                        if(findfile(&cfg,usrdir[i][j],f.name))
                    339:                                                break;
                    340:                                if(j<usrdirs[i])
                    341:                                        break; }
                    342:                        if(i==usrlibs) {
                    343:                                bputs(text[FileNotFound]);  /* not in database */
                    344:                                return; }
                    345:                        dirnum=usrdir[i][j]; }
                    346:                else
                    347:                        dirnum=usrdir[curlib][i]; }
                    348:        if(sys_status&SS_ABORT)
                    349:                return;
                    350:        sprintf(path,"%s%s",cfg.dir[dirnum]->path,fname);
                    351:        if(!intmp) {    /* not temp dir, so get temp_file info */
                    352:                f.datoffset=f.dateuled=f.datedled=0L;
                    353:                f.dir=dirnum;
                    354:                getfileixb(&cfg,&f);
                    355:                if(!f.datoffset && !f.dateuled && !f.datedled)  /* error reading ixb */
                    356:                        return;
                    357:                f.size=0;
                    358:                getfiledat(&cfg,&f);
                    359:                fileinfo(&f);
                    360:                if(f.altpath>0 && f.altpath<=cfg.altpaths)
                    361:                        sprintf(path,"%s%s",cfg.altpath[f.altpath-1],fname);
                    362:                temp_dirnum=dirnum;
                    363:                if(cfg.dir[f.dir]->misc&DIR_FREE)
                    364:                        temp_cdt=0L;
                    365:                else
                    366:                        temp_cdt=f.cdt;
                    367:                SAFECOPY(temp_uler,f.uler);
                    368:                SAFECOPY(temp_file,f.name); }     /* padded filename */
                    369:        if(!fexistcase(path)) {
                    370:                bputs(text[FileNotThere]);  /* not on disk */
                    371:                return; }
                    372:        done=0;
                    373:        while(online && !done) {
                    374:                mnemonics(text[ExtractFilesPrompt]);
                    375:                switch(getkeys("EVQ",0)) {
                    376:                        case 'E':
                    377:                                if(!getfilespec(str))
                    378:                                        break;
                    379:                                if(!checkfname(str))
                    380:                                        break;
                    381:                                if((i=external(cmdstr(excmd,path,str,NULL)
                    382:                                        ,EX_INR|EX_OUTL|EX_OUTR))!=0) {
                    383:                                        errormsg(WHERE,ERR_EXEC,cmdstr(excmd,path,str,NULL),i);
                    384:                                        return; }
                    385:                                sprintf(tmp,"%s extracted %s from %s",useron.alias,str,path);
                    386:                                logline(nulstr,tmp);
                    387:                                CRLF;
                    388:                                break;
                    389:                        case 'V':
                    390:                                viewfiles(dirnum,fname);
                    391:                                break;
                    392:                        default:
                    393:                                done=1;
                    394:                                break; } }
                    395: }
                    396: 
                    397: /****************************************************************************/
                    398: /* Creates a text file named NEWFILES.DAT in the temp directory that        */
                    399: /* all new files since p-date. Returns number of files in list.             */
                    400: /****************************************************************************/
                    401: ulong sbbs_t::create_filelist(char *name, long mode)
                    402: {
                    403:     char       str[256];
                    404:        int             file;
                    405:        uint    i,j,d;
                    406:        ulong   l,k;
                    407: 
                    408:        bprintf(text[CreatingFileList],name);
                    409:        sprintf(str,"%s%s",cfg.temp_dir,name);
                    410:        if((file=nopen(str,O_CREAT|O_WRONLY|O_APPEND))==-1) {
                    411:                errormsg(WHERE,ERR_OPEN,str,O_CREAT|O_WRONLY|O_APPEND);
                    412:                return(0); }
                    413:        k=0;
                    414:        if(mode&FL_ULTIME) {
                    415:                sprintf(str,"New files since: %s\r\n",timestr(&ns_time));
                    416:                write(file,str,strlen(str)); }
                    417:        for(i=j=d=0;i<usrlibs;i++) {
                    418:                for(j=0;j<usrdirs[i];j++,d++) {
                    419:                        outchar('.');
                    420:                        if(d && !(d%5))
                    421:                                bputs("\b\b\b\b\b     \b\b\b\b\b");
                    422:                        if(mode&FL_ULTIME /* New-scan */
                    423:                                && (cfg.lib[usrlib[i]]->offline_dir==usrdir[i][j]
                    424:                                || cfg.dir[usrdir[i][j]]->misc&DIR_NOSCAN))
                    425:                                continue;
                    426:                        l=listfiles(usrdir[i][j],nulstr,file,mode);
                    427:                        if((long)l==-1)
                    428:                                break;
                    429:                        k+=l; }
                    430:                if(j<usrdirs[i])
                    431:                        break; }
                    432:        if(k>1) {
                    433:                sprintf(str,"\r\n%ld Files Listed.\r\n",k);
                    434:                write(file,str,strlen(str)); }
                    435:        close(file);
                    436:        if(k)
                    437:                bprintf(text[CreatedFileList],name);
                    438:        else {
                    439:                bputs(text[NoFiles]);
                    440:                sprintf(str,"%s%s",cfg.temp_dir,name);
                    441:                remove(str); }
                    442:        SAFECOPY(temp_file,name);
                    443:        SAFECOPY(temp_uler,"File List");
                    444:        return(k);
                    445: }
                    446: 
                    447: /****************************************************************************/
                    448: /* This function returns the command line for the temp file extension for      */
                    449: /* current user online.                                                                                                        */
                    450: /****************************************************************************/
                    451: char * sbbs_t::temp_cmd(void)
                    452: {
                    453:        int i;
                    454: 
                    455:        if(!cfg.total_fcomps) {
                    456:                errormsg(WHERE,ERR_CHK,"compressible file types",0);
                    457:                return(nulstr); }
                    458:        for(i=0;i<cfg.total_fcomps;i++)
                    459:                if(!stricmp(useron.tmpext,cfg.fcomp[i]->ext)
                    460:                        && chk_ar(cfg.fcomp[i]->ar,&useron))
                    461:                        return(cfg.fcomp[i]->cmd);
                    462:        return(cfg.fcomp[0]->cmd);
                    463: }

unix.superglobalmegacorp.com

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