Annotation of sbbs/sbbs3/upload.cpp, revision 1.1.1.1

1.1       root        1: /* upload.cpp */
                      2: 
                      3: /* Synchronet file upload-related routines */
                      4: 
                      5: /* $Id: upload.cpp,v 1.8 2000/12/31 03:41:55 rswindell Exp $ */
                      6: 
                      7: /****************************************************************************
                      8:  * @format.tab-size 4          (Plain Text/Source Code File Header)                    *
                      9:  * @format.use-tabs true       (see http://www.synchro.net/ptsc_hdr.html)              *
                     10:  *                                                                                                                                                     *
                     11:  * Copyright 2000 Rob Swindell - http://www.synchro.net/copyright.html         *
                     12:  *                                                                                                                                                     *
                     13:  * This program is free software; you can redistribute it and/or                       *
                     14:  * modify it under the terms of the GNU General Public License                         *
                     15:  * as published by the Free Software Foundation; either version 2                      *
                     16:  * of the License, or (at your option) any later version.                                      *
                     17:  * See the GNU General Public License for more details: gpl.txt or                     *
                     18:  * http://www.fsf.org/copyleft/gpl.html                                                                                *
                     19:  *                                                                                                                                                     *
                     20:  * Anonymous FTP access to the most recent released source is available at     *
                     21:  * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net     *
                     22:  *                                                                                                                                                     *
                     23:  * Anonymous CVS access to the development source and modification history     *
                     24:  * is available at cvs.synchro.net:/cvsroot/sbbs, example:                                     *
                     25:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs login                       *
                     26:  *     (just hit return, no password is necessary)                                                     *
                     27:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src                *
                     28:  *                                                                                                                                                     *
                     29:  * For Synchronet coding style and modification guidelines, see                                *
                     30:  * http://www.synchro.net/source.html                                                                          *
                     31:  *                                                                                                                                                     *
                     32:  * You are encouraged to submit any modifications (preferably in Unix diff     *
                     33:  * format) via e-mail to [email protected]                                                                      *
                     34:  *                                                                                                                                                     *
                     35:  * Note: If this box doesn't appear square, then you need to fix your tabs.    *
                     36:  ****************************************************************************/
                     37: 
                     38: #include "sbbs.h"
                     39: 
                     40: /****************************************************************************/
                     41: /* Adds file data in 'f' to DIR#.DAT and DIR#.IXB   and updates user        */
                     42: /* info for uploader. Must have .name, .desc and .dir fields filled prior   */
                     43: /* to a call to this function.                                              */
                     44: /* Returns 1 if file uploaded sucessfully, 0 if not.                        */
                     45: /****************************************************************************/
                     46: bool sbbs_t::uploadfile(file_t *f)
                     47: {
                     48:        char path[256],str[256],fname[25],ext[513],desc[513],tmp[128];
                     49:        int  file;
                     50:     uint i;
                     51:     long length;
                     52:        FILE *stream;
                     53: 
                     54:        f->misc=0;
                     55:        curdirnum=f->dir;
                     56:        if(findfile(&cfg,f->dir,f->name)) {
                     57:                errormsg(WHERE,ERR_CHK,f->name,f->dir);
                     58:                return(0); }
                     59:        sprintf(path,"%s%s",f->altpath>0 && f->altpath<=cfg.altpaths
                     60:                ? cfg.altpath[f->altpath-1]
                     61:                : cfg.dir[f->dir]->path,unpadfname(f->name,fname));
                     62:        if(!fexist(path)) {
                     63:                bprintf(text[FileNotReceived],f->name);
                     64:                sprintf(str,"Attempted to upload %s to %s %s (Not received)",f->name
                     65:                        ,cfg.lib[cfg.dir[f->dir]->lib]->sname,cfg.dir[f->dir]->sname);
                     66:                logline("U!",str);
                     67:                return(0); }
                     68:        strcpy(tmp,f->name);
                     69:        truncsp(tmp);
                     70:        for(i=0;i<cfg.total_ftests;i++)
                     71:                if(cfg.ftest[i]->ext[0]=='*' || !strcmp(tmp+9,cfg.ftest[i]->ext)) {
                     72:                        if(!chk_ar(cfg.ftest[i]->ar,&useron))
                     73:                                continue;
                     74:                        attr(LIGHTGRAY);
                     75:                        bputs(cfg.ftest[i]->workstr);
                     76: 
                     77:                        sprintf(sbbsfilename,"SBBSFILENAME=%.12s",unpadfname(f->name,fname));
                     78:                        putenv(sbbsfilename);
                     79:                        sprintf(sbbsfiledesc,"SBBSFILEDESC=%.*s",LEN_FDESC,f->desc);
                     80:                        putenv(sbbsfiledesc);
                     81:                        sprintf(str,"%sSBBSFILE.NAM",cfg.node_dir);
                     82:                        if((stream=fopen(str,"w"))!=NULL) {
                     83:                                fwrite(fname,1,strlen(fname),stream);
                     84:                                fclose(stream); }
                     85:                        sprintf(str,"%sSBBSFILE.DES",cfg.node_dir);
                     86:                        if((stream=fopen(str,"w"))!=NULL) {
                     87:                                fwrite(f->desc,1,strlen(f->desc),stream);
                     88:                                fclose(stream); }
                     89:                        if(external(cmdstr(cfg.ftest[i]->cmd,path,f->desc,NULL),0)) { /* EX_OUTL */
                     90:                                bprintf(text[FileHadErrors],f->name,cfg.ftest[i]->ext);
                     91:                                if(SYSOP) {
                     92:                                        if(!yesno(text[DeleteFileQ])) return(0); }
                     93:                                remove(path);
                     94:                                sprintf(str,"Attempted to upload %s to %s %s (%s Errors)",f->name
                     95:                                        ,cfg.lib[cfg.dir[f->dir]->lib]->sname,cfg.dir[f->dir]->sname,cfg.ftest[i]->ext);
                     96:                                logline("U!",str);
                     97:                                return(0); }
                     98:                        else {
                     99:                                sprintf(str,"%ssbbsfile.nam",cfg.node_dir);
                    100:                                if((stream=fopen(str,"r"))!=NULL) {
                    101:                                        if(fgets(str,128,stream)) {
                    102:                                                truncsp(str);
                    103:                                                strupr(str);
                    104:                                                padfname(str,f->name);
                    105:                                                strcpy(tmp,f->name);
                    106:                                                truncsp(tmp);
                    107:                                                sprintf(path,"%s%s",f->altpath>0 && f->altpath<=cfg.altpaths
                    108:                                                        ? cfg.altpath[f->altpath-1] : cfg.dir[f->dir]->path
                    109:                                                        ,unpadfname(f->name,fname)); }
                    110:                                        fclose(stream);
                    111:                                        }
                    112:                                sprintf(str,"%ssbbsfile.des",cfg.node_dir);
                    113:                                if((stream=fopen(str,"r"))!=NULL) {
                    114:                                        if(fgets(str,128,stream)) {
                    115:                                                truncsp(str);
                    116:                                                sprintf(f->desc,"%.*s",LEN_FDESC,str); }
                    117:                                        fclose(stream); }
                    118:                                CRLF; } }
                    119: 
                    120:        if((length=flength(path))<=0L) {
                    121:                bprintf(text[FileZeroLength],f->name);
                    122:                remove(path);
                    123:                sprintf(str,"Attempted to upload %s to %s %s (Zero length)",f->name
                    124:                        ,cfg.lib[cfg.dir[f->dir]->lib]->sname,cfg.dir[f->dir]->sname);
                    125:                logline("U!",str);
                    126:                return(0); }
                    127:        if(cfg.dir[f->dir]->misc&DIR_DIZ) {
                    128:                for(i=0;i<cfg.total_fextrs;i++)
                    129:                        if(!stricmp(cfg.fextr[i]->ext,tmp+9) && chk_ar(cfg.fextr[i]->ar,&useron))
                    130:                                break;
                    131:                if(i<cfg.total_fextrs) {
                    132:                        sprintf(str,"%sFILE_ID.DIZ",cfg.temp_dir);
                    133:                        remove(str);
                    134:                        external(cmdstr(cfg.fextr[i]->cmd,path,"FILE_ID.DIZ",NULL),EX_OUTL);
                    135:                        if(!fexist(str)) {
                    136:                                sprintf(str,"%sDESC.SDI",cfg.temp_dir);
                    137:                                remove(str);
                    138:                                external(cmdstr(cfg.fextr[i]->cmd,path,"DESC.SDI",NULL),EX_OUTL); }
                    139:                        if((file=nopen(str,O_RDONLY))!=-1) {
                    140:                                memset(ext,0,513);
                    141:                                read(file,ext,512);
                    142:                                for(i=512;i;i--)
                    143:                                        if(ext[i-1]>SP)
                    144:                                                break;
                    145:                                ext[i]=0;
                    146:                                if(!f->desc[0]) {
                    147:                                        strcpy(desc,ext);
                    148:                                        strip_exascii(desc);
                    149:                                        strip_ctrl(desc);
                    150:                                        for(i=0;desc[i];i++)
                    151:                                                if(isalnum(desc[i]))
                    152:                                                        break;
                    153:                                        sprintf(f->desc,"%.*s",LEN_FDESC,desc+i); }
                    154:                                close(file);
                    155:                                remove(str);
                    156:                                f->misc|=FM_EXTDESC; } } }
                    157: 
                    158:        logon_ulb+=length;  /* Update 'this call' stats */
                    159:        logon_uls++;
                    160:        if(cfg.dir[f->dir]->misc&DIR_AONLY)  /* Forced anonymous */
                    161:                f->misc|=FM_ANON;
                    162:        f->cdt=length;
                    163:        f->dateuled=time(NULL);
                    164:        f->timesdled=0;
                    165:        f->datedled=0L;
                    166:        f->opencount=0;
                    167:        strcpy(f->uler,useron.alias);
                    168:        bprintf(text[FileNBytesReceived],f->name,ultoac(length,tmp));
                    169:        if(!f->desc[0])
                    170:                sprintf(f->desc,"%.*s",LEN_FDESC,text[NoDescription]);
                    171:        if(!addfiledat(&cfg,f))
                    172:                return(0);
                    173: 
                    174:        if(f->misc&FM_EXTDESC)
                    175:                putextdesc(f->dir,f->datoffset,ext);
                    176: 
                    177:        sprintf(str,"Uploaded %s to %s %s",f->name,cfg.lib[cfg.dir[f->dir]->lib]->sname
                    178:                ,cfg.dir[f->dir]->sname);
                    179:        if(cfg.dir[f->dir]->upload_sem[0])
                    180:                if((file=nopen(cmdstr(cfg.dir[f->dir]->upload_sem,nulstr,nulstr,NULL)
                    181:                        ,O_WRONLY|O_CREAT|O_TRUNC))!=-1)
                    182:                        close(file);
                    183:        logline("U+",str);
                    184:        /**************************/
                    185:        /* Update Uploader's Info */
                    186:        /**************************/
                    187:        useron.uls=(ushort)adjustuserrec(&cfg,useron.number,U_ULS,5,1);
                    188:        useron.ulb=(ushort)adjustuserrec(&cfg,useron.number,U_ULB,10,length);
                    189:        if(cfg.dir[f->dir]->up_pct && cfg.dir[f->dir]->misc&DIR_CDTUL) { /* credit for upload */
                    190:                if(cfg.dir[f->dir]->misc&DIR_CDTMIN && cur_cps)    /* Give min instead of cdt */
                    191:                        useron.min=adjustuserrec(&cfg,useron.number,U_MIN,10
                    192:                                ,((ulong)(length*(cfg.dir[f->dir]->up_pct/100.0))/cur_cps)/60);
                    193:                else
                    194:                        useron.cdt=adjustuserrec(&cfg,useron.number,U_CDT,10
                    195:                                ,(ulong)(f->cdt*(cfg.dir[f->dir]->up_pct/100.0))); }
                    196: 
                    197:        return(true);
                    198: }
                    199: 
                    200: 
                    201: /****************************************************************************/
                    202: /* Update the upload date for the file 'f'                                  */
                    203: /****************************************************************************/
                    204: void sbbs_t::update_uldate(file_t* f)
                    205: {
                    206:        char str[256],fname[13];
                    207:        int i,file;
                    208:        long l,length;
                    209: 
                    210:        /*******************/
                    211:        /* Update IXB File */
                    212:        /*******************/
                    213:        sprintf(str,"%s%s.ixb",cfg.dir[f->dir]->data_dir,cfg.dir[f->dir]->code);
                    214:        if((file=nopen(str,O_RDWR))==-1) {
                    215:                errormsg(WHERE,ERR_OPEN,str,O_RDWR);
                    216:                return; }
                    217:        length=filelength(file);
                    218:        if(length%F_IXBSIZE) {
                    219:                close(file);
                    220:                errormsg(WHERE,ERR_LEN,str,length);
                    221:                return; }
                    222:        strcpy(fname,f->name);
                    223:        for(i=8;i<12;i++)   /* Turn FILENAME.EXT into FILENAMEEXT */
                    224:                fname[i]=fname[i+1];
                    225:        for(l=0;l<length;l+=F_IXBSIZE) {
                    226:                read(file,str,F_IXBSIZE);      /* Look for the filename in the IXB file */
                    227:                str[11]=0;
                    228:                if(!strcmp(fname,str)) break; }
                    229:        if(l>=length) {
                    230:                close(file);
                    231:                errormsg(WHERE,ERR_CHK,f->name,length);
                    232:                return; }
                    233:        lseek(file,l+14,SEEK_SET);
                    234:        write(file,&f->dateuled,4);
                    235:        close(file);
                    236: 
                    237:        /*******************************************/
                    238:        /* Update last upload date/time stamp file */
                    239:        /*******************************************/
                    240:        sprintf(str,"%s%s.dab",cfg.dir[f->dir]->data_dir,cfg.dir[f->dir]->code);
                    241:        if((file=nopen(str,O_WRONLY|O_CREAT))==-1)
                    242:                errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT);
                    243:        else {
                    244:                write(file,&f->dateuled,4);
                    245:                close(file); 
                    246:        }
                    247: }
                    248: 
                    249: /****************************************************************************/
                    250: /* Uploads files                                                            */
                    251: /****************************************************************************/
                    252: void sbbs_t::upload(uint dirnum)
                    253: {
                    254:        char    str[256],src[256]={""},descbeg[25]={""},descend[25]={""},path[256]
                    255:                                ,fname[13],keys[256],ch,*p;
                    256:        char    tmp[512];
                    257:     time_t     start,end;
                    258:     uint       i,j,k,destuser[MAX_USERXFER],destusers=0;
                    259:        int             file;
                    260:        ulong   space;
                    261:     file_t     f;
                    262:     user_t     user;
                    263:     node_t     node;
                    264: 
                    265:        if(sys_status&SS_EVENT && online==ON_REMOTE && !dir_op(dirnum))
                    266:                bprintf(text[UploadBeforeEvent],timeleft/60);
                    267:        if(altul)
                    268:                strcpy(path,cfg.altpath[altul-1]);
                    269:        else
                    270:                strcpy(path,cfg.dir[dirnum]->path);
                    271: 
                    272: 
                    273:        /* get free disk space */
                    274:        space=getfreediskspace(path);
                    275:        if(space<(ulong)cfg.min_dspace*1024L) {
                    276:                bputs(text[LowDiskSpace]);
                    277:                sprintf(str,"Diskspace is low: %s (%lu bytes)",path,space);
                    278:                errorlog(str);
                    279:                if(!dir_op(dirnum))
                    280:                        return; }
                    281:        bprintf(text[DiskNBytesFree],ultoac(space,tmp));
                    282: 
                    283:        f.dir=curdirnum=dirnum;
                    284:        f.misc=0;
                    285:        f.altpath=altul;
                    286:        bputs(text[Filename]);
                    287:        if(!getstr(fname,12,K_UPPER) || strchr(fname,'?') || strchr(fname,'*')
                    288:                || !checkfname(fname) || (trashcan(fname,"file") && !dir_op(dirnum))) {
                    289:                if(fname[0])
                    290:                        bputs(text[BadFilename]);
                    291:                return; }
                    292:        if(dirnum==cfg.sysop_dir)
                    293:                sprintf(str,text[UploadToSysopDirQ],fname);
                    294:        else if(dirnum==cfg.user_dir)
                    295:                sprintf(str,text[UploadToUserDirQ],fname);
                    296:        else
                    297:                sprintf(str,text[UploadToCurDirQ],fname,cfg.lib[cfg.dir[dirnum]->lib]->sname
                    298:                        ,cfg.dir[dirnum]->sname);
                    299:        if(!yesno(str)) return;
                    300:        action=NODE_ULNG;
                    301:        padfname(fname,f.name);
                    302:        sprintf(str,"%s%s",path,fname);
                    303:        if(fexist(str)) {   /* File is on disk */
                    304:                if(!dir_op(dirnum) && online!=ON_LOCAL) {                /* local users or sysops */
                    305:                        bprintf(text[FileAlreadyThere],fname);
                    306:                        return; }
                    307:                if(!yesno(text[FileOnDiskAddQ]))
                    308:                        return; }
                    309:        else if(online==ON_LOCAL) {
                    310:                bputs(text[FileNotOnDisk]);
                    311:                bputs(text[EnterPath]);
                    312:                if(!getstr(tmp,60,K_LINE|K_UPPER))
                    313:                        return;
                    314:                backslash(tmp);
                    315:                sprintf(src,"%s%s",tmp,fname); }
                    316:        strcpy(str,cfg.dir[dirnum]->exts);
                    317:        strcpy(tmp,f.name);
                    318:        truncsp(tmp);
                    319:        j=strlen(str);
                    320:        for(i=0;i<j;i+=ch+1) { /* Check extension of upload with allowable exts */
                    321:                p=strchr(str+i,',');
                    322:                if(p!=NULL)
                    323:                        *p=0;
                    324:                ch=strlen(str+i);
                    325:                if(!strcmp(tmp+9,str+i))
                    326:                        break; }
                    327:        if(j && i>=j) {
                    328:                bputs(text[TheseFileExtsOnly]);
                    329:                bputs(cfg.dir[dirnum]->exts);
                    330:                CRLF;
                    331:                if(!dir_op(dirnum)) return; }
                    332:        bputs(text[SearchingForDupes]);
                    333:        for(i=k=0;i<usrlibs;i++)
                    334:                for(j=0;j<usrdirs[i];j++,k++) {
                    335:                        outchar('.');
                    336:                        if(k && !(k%5))
                    337:                                bputs("\b\b\b\b\b     \b\b\b\b\b");
                    338:                        if((usrdir[i][j]==dirnum || cfg.dir[usrdir[i][j]]->misc&DIR_DUPES)
                    339:                                && findfile(&cfg,usrdir[i][j],f.name)) {
                    340:                                bputs(text[SearchedForDupes]);
                    341:                                bprintf(text[FileAlreadyOnline],f.name);
                    342:                                if(!dir_op(dirnum))
                    343:                                        return;          /* File is in database for another dir */
                    344:                                if(usrdir[i][j]==dirnum)
                    345:                                        return; } } /* don't allow duplicates */
                    346:        bputs(text[SearchedForDupes]);
                    347:        if(dirnum==cfg.user_dir) {  /* User to User transfer */
                    348:                bputs(text[EnterAfterLastDestUser]);
                    349:                while((!dir_op(dirnum) && destusers<cfg.max_userxfer) || destusers<MAX_USERXFER) {
                    350:                        bputs(text[SendFileToUser]);
                    351:                        if(!getstr(str,LEN_ALIAS,K_UPRLWR))
                    352:                                break;
                    353:                        if((user.number=finduser(str))!=0) {
                    354:                                if(!dir_op(dirnum) && user.number==useron.number) {
                    355:                                        bputs(text[CantSendYourselfFiles]);
                    356:                                        continue; }
                    357:                                for(i=0;i<destusers;i++)
                    358:                                        if(user.number==destuser[i])
                    359:                                                break;
                    360:                                if(i<destusers) {
                    361:                                        bputs(text[DuplicateUser]);
                    362:                                        continue; }
                    363:                                getuserdat(&cfg,&user);
                    364:                                if((user.rest&(FLAG('T')|FLAG('D')))
                    365:                                        || !chk_ar(cfg.lib[cfg.dir[cfg.user_dir]->lib]->ar,&user)
                    366:                                        || !chk_ar(cfg.dir[cfg.user_dir]->dl_ar,&user)) {
                    367:                                        bprintf(text[UserWontBeAbleToDl],user.alias); }
                    368:                                else {
                    369:                                        bprintf(text[UserAddedToDestList],user.alias);
                    370:                                        destuser[destusers++]=user.number; } }
                    371:                        else {
                    372:                                CRLF; } }
                    373:                if(!destusers)
                    374:                        return; }
                    375:        if(cfg.dir[dirnum]->misc&DIR_RATE) {
                    376:                SYNC;
                    377:                bputs(text[RateThisFile]);
                    378:                ch=getkey(K_ALPHA);
                    379:                if(!isalpha(ch) || sys_status&SS_ABORT)
                    380:                        return;
                    381:                CRLF;
                    382:                sprintf(descbeg,text[Rated],toupper(ch)); }
                    383:        if(cfg.dir[dirnum]->misc&DIR_ULDATE) {
                    384:                now=time(NULL);
                    385:                if(descbeg[0])
                    386:                        strcat(descbeg," ");
                    387:                sprintf(str,"%s  ",unixtodstr(&cfg,now,tmp));
                    388:                strcat(descbeg,str); }
                    389:        if(cfg.dir[dirnum]->misc&DIR_MULT) {
                    390:                SYNC;
                    391:                if(!noyes(text[MultipleDiskQ])) {
                    392:                        bputs(text[HowManyDisksTotal]);
                    393:                        if((int)(i=getnum(99))<2)
                    394:                                return;
                    395:                        bputs(text[NumberOfFile]);
                    396:                        if((int)(j=getnum(i))<1)
                    397:                                return;
                    398:                        if(j==1)
                    399:                                upload_lastdesc[0]=0;
                    400:                        if(i>9)
                    401:                                sprintf(descend,text[FileOneOfTen],j,i);
                    402:                        else
                    403:                                sprintf(descend,text[FileOneOfTwo],j,i); }
                    404:                else
                    405:                        upload_lastdesc[0]=0; }
                    406:        else
                    407:                upload_lastdesc[0]=0;
                    408:        bputs(text[EnterDescNow]);
                    409:        i=LEN_FDESC-(strlen(descbeg)+strlen(descend));
                    410:        getstr(upload_lastdesc,i,K_LINE|K_EDIT|K_AUTODEL);
                    411:        if(sys_status&SS_ABORT)
                    412:                return;
                    413:        if(descend[0])      /* end of desc specified, so pad desc with spaces */
                    414:                sprintf(f.desc,"%s%-*s%s",descbeg,i,upload_lastdesc,descend);
                    415:        else                /* no end specified, so string ends at desc end */
                    416:                sprintf(f.desc,"%s%s",descbeg,upload_lastdesc);
                    417: 
                    418:        if(cfg.dir[dirnum]->misc&DIR_ANON && !(cfg.dir[dirnum]->misc&DIR_AONLY)
                    419:                && (dir_op(dirnum) || useron.exempt&FLAG('A'))) {
                    420:                if(!noyes(text[AnonymousQ]))
                    421:                        f.misc|=FM_ANON; }
                    422:        sprintf(str,"%s%s",path,fname);
                    423:        if(src[0]) {    /* being copied from another local dir */
                    424:                bprintf(text[RetrievingFile],fname);
                    425:                if(mv(src,str,1))
                    426:                        return;
                    427:                CRLF; }
                    428:        if(fexist(str)) {   /* File is on disk */
                    429:                if(!uploadfile(&f))
                    430:                        return; }
                    431:        else {
                    432:                menu("ulprot");
                    433:                SYNC;
                    434:                strcpy(keys,"Q");
                    435:                if(dirnum==cfg.user_dir || !cfg.max_batup)  /* no batch user to user xfers */
                    436:                        mnemonics(text[ProtocolOrQuit]);
                    437:                else {
                    438:                        mnemonics(text[ProtocolBatchOrQuit]);
                    439:                        strcat(keys,"B"); }
                    440:                for(i=0;i<cfg.total_prots;i++)
                    441:                        if(cfg.prot[i]->ulcmd[0] && chk_ar(cfg.prot[i]->ar,&useron)) {
                    442:                                sprintf(tmp,"%c",cfg.prot[i]->mnemonic);
                    443:                                strcat(keys,tmp); }
                    444:                ch=(char)getkeys(keys,0);
                    445:                if(ch=='Q')
                    446:                        return;
                    447:                if(ch=='B') {
                    448:                        if(batup_total>=cfg.max_batup)
                    449:                                bputs(text[BatchUlQueueIsFull]);
                    450:                        else {
                    451:                                for(i=0;i<batup_total;i++)
                    452:                                        if(!strcmp(batup_name[i],f.name)) {
                    453:                                                bprintf(text[FileAlreadyInQueue],f.name);
                    454:                                                return; }
                    455:                                strcpy(batup_name[batup_total],f.name);
                    456:                                strcpy(batup_desc[batup_total],f.desc);
                    457:                                batup_dir[batup_total]=dirnum;
                    458:                                batup_misc[batup_total]=f.misc;
                    459:                                batup_alt[batup_total]=altul;
                    460:                                batup_total++;
                    461:                                bprintf(text[FileAddedToUlQueue]
                    462:                                        ,f.name,batup_total,cfg.max_batup); } }
                    463:                else {
                    464:                        for(i=0;i<cfg.total_prots;i++)
                    465:                                if(cfg.prot[i]->ulcmd[0] && cfg.prot[i]->mnemonic==ch
                    466:                                        && chk_ar(cfg.prot[i]->ar,&useron))
                    467:                                        break;
                    468:                        if(i<cfg.total_prots) {
                    469:                                start=time(NULL);
                    470:                                protocol(cmdstr(cfg.prot[i]->ulcmd,str,nulstr,NULL),0);
                    471:                                end=time(NULL);
                    472:                                if(!(cfg.dir[dirnum]->misc&DIR_ULTIME)) /* Don't deduct upload time */
                    473:                                        starttime+=end-start;
                    474:                                ch=uploadfile(&f);
                    475:                                autohangup();
                    476:                                if(!ch)  /* upload failed, don't process user to user xfer */
                    477:                                        return; } } }
                    478:        if(dirnum==cfg.user_dir) {  /* Add files to XFER.IXT in INDX dir */
                    479:                sprintf(str,"%sxfer.ixt",cfg.data_dir);
                    480:                if((file=nopen(str,O_WRONLY|O_CREAT|O_APPEND))==-1) {
                    481:                        errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_APPEND);
                    482:                        return; }
                    483:                for(j=0;j<destusers;j++) {
                    484:                        for(i=1;i<=cfg.sys_nodes;i++) { /* Tell user, if online */
                    485:                                getnodedat(i,&node,0);
                    486:                                if(node.useron==destuser[j] && !(node.misc&NODE_POFF)
                    487:                                        && (node.status==NODE_INUSE || node.status==NODE_QUIET)) {
                    488:                                        sprintf(str,text[UserToUserXferNodeMsg],cfg.node_num,useron.alias);
                    489:                                        putnmsg(i,str);
                    490:                                        break; } }
                    491:                        if(i>cfg.sys_nodes) {   /* User not online */
                    492:                                sprintf(str,text[UserSentYouFile],useron.alias);
                    493:                                putsmsg(&cfg,destuser[j],str); }
                    494:                        sprintf(str,"%4.4u %12.12s %4.4u\r\n"
                    495:                                ,destuser[j],f.name,useron.number);
                    496:                        write(file,str,strlen(str)); }
                    497:                close(file); 
                    498:        }
                    499: }
                    500: 
                    501: /****************************************************************************/
                    502: /* Checks directory for 'dir' and prompts user to enter description for     */
                    503: /* the files that aren't in the database.                                   */
                    504: /* Returns 1 if the user aborted, 0 if not.                                 */
                    505: /****************************************************************************/
                    506: bool sbbs_t::bulkupload(uint dirnum)
                    507: {
                    508:     char       str[MAX_PATH];
                    509:        char    path[MAX_PATH];
                    510:        char    spath[MAX_PATH];
                    511:     file_t     f;
                    512:        DIR*    dir;
                    513:        DIRENT* dirent;
                    514: 
                    515:        memset(&f,0,sizeof(file_t));
                    516:        f.dir=dirnum;
                    517:        f.altpath=altul;
                    518:        bprintf(text[BulkUpload],cfg.lib[cfg.dir[dirnum]->lib]->sname,cfg.dir[dirnum]->sname);
                    519:        strcpy(path,altul>0 && altul<=cfg.altpaths ? cfg.altpath[altul-1]
                    520:                : cfg.dir[dirnum]->path);
                    521:        action=NODE_ULNG;
                    522:        SYNC;
                    523:        dir=opendir(path);
                    524:        while((dirent=readdir(dir))!=NULL && !msgabort()) {
                    525:                if(gettotalfiles(dirnum)>cfg.dir[dirnum]->maxfiles) {
                    526:                        bputs(text[DirFull]);
                    527:                        break; 
                    528:                }
                    529:                sprintf(str,"%s%s",path,dirent->d_name);
                    530:                if(isdir(str))
                    531:                        continue;
                    532: #ifdef _WIN32
                    533:                GetShortPathName(str,spath,sizeof(spath));
                    534: #else
                    535:                strcpy(spath,str);
                    536: #endif
                    537:                padfname(getfname(spath),str);
                    538: 
                    539:                if(findfile(&cfg,f.dir,str)==0) {
                    540:                        strcpy(f.name,str);
                    541:                        f.cdt=flength(spath);
                    542:                        bprintf(text[BulkUploadDescPrompt],f.name,f.cdt);
                    543:                        getstr(f.desc,LEN_FDESC,K_LINE);
                    544:                        if(sys_status&SS_ABORT)
                    545:                                break;
                    546:                        uploadfile(&f); 
                    547:                }
                    548:        }
                    549:        closedir(dir);
                    550:        if(sys_status&SS_ABORT)
                    551:                return(true);
                    552:        return(false);
                    553: }
                    554: 

unix.superglobalmegacorp.com

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