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

1.1       root        1: /* upload.cpp */
                      2: 
                      3: /* Synchronet file upload-related routines */
                      4: 
1.1.1.2 ! root        5: /* $Id: upload.cpp,v 1.42 2004/10/21 08:43:33 rswindell Exp $ */
1.1       root        6: 
                      7: /****************************************************************************
                      8:  * @format.tab-size 4          (Plain Text/Source Code File Header)                    *
                      9:  * @format.use-tabs true       (see http://www.synchro.net/ptsc_hdr.html)              *
                     10:  *                                                                                                                                                     *
1.1.1.2 ! root       11:  * Copyright 2003 Rob Swindell - http://www.synchro.net/copyright.html         *
1.1       root       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: {
1.1.1.2 ! root       48:        char    path[MAX_PATH+1];
        !            49:        char    str[MAX_PATH+1],fname[25];
        !            50:        char    ext[F_EXBSIZE+1];
        !            51:        char    desc[F_EXBSIZE+1];
        !            52:        char    tmp[MAX_PATH+1];
        !            53:        int             file;
        !            54:     uint       i;
        !            55:     long       length;
        !            56:        FILE*   stream;
1.1       root       57: 
1.1.1.2 ! root       58:        // f->misc=0; Removed AUG-22-2001 - broken anonymous uploads
1.1       root       59:        curdirnum=f->dir;
                     60:        if(findfile(&cfg,f->dir,f->name)) {
                     61:                errormsg(WHERE,ERR_CHK,f->name,f->dir);
1.1.1.2 ! root       62:                return(0)        !            63:        }
1.1       root       64:        sprintf(path,"%s%s",f->altpath>0 && f->altpath<=cfg.altpaths
                     65:                ? cfg.altpath[f->altpath-1]
                     66:                : cfg.dir[f->dir]->path,unpadfname(f->name,fname));
1.1.1.2 ! root       67:        sprintf(tmp,"%s%s",cfg.temp_dir,fname);
        !            68:        if(!fexistcase(path) && fexistcase(tmp))
        !            69:                mv(tmp,path,0);
        !            70:        if(!fexistcase(path)) {
1.1       root       71:                bprintf(text[FileNotReceived],f->name);
1.1.1.2 ! root       72:                sprintf(str,"%s attempted to upload %s to %s %s (Not received)"
        !            73:                        ,useron.alias
        !            74:                        ,f->name
1.1       root       75:                        ,cfg.lib[cfg.dir[f->dir]->lib]->sname,cfg.dir[f->dir]->sname);
                     76:                logline("U!",str);
1.1.1.2 ! root       77:                return(0)        !            78:        }
1.1       root       79:        strcpy(tmp,f->name);
                     80:        truncsp(tmp);
                     81:        for(i=0;i<cfg.total_ftests;i++)
1.1.1.2 ! root       82:                if(cfg.ftest[i]->ext[0]=='*' || !stricmp(tmp+9,cfg.ftest[i]->ext)) {
1.1       root       83:                        if(!chk_ar(cfg.ftest[i]->ar,&useron))
                     84:                                continue;
                     85:                        attr(LIGHTGRAY);
                     86:                        bputs(cfg.ftest[i]->workstr);
                     87: 
1.1.1.2 ! root       88:                        sprintf(sbbsfilename,"SBBSFILENAME=%.64s",unpadfname(f->name,fname));
1.1       root       89:                        putenv(sbbsfilename);
                     90:                        sprintf(sbbsfiledesc,"SBBSFILEDESC=%.*s",LEN_FDESC,f->desc);
                     91:                        putenv(sbbsfiledesc);
1.1.1.2 ! root       92:                        sprintf(str,"%ssbbsfile.nam",cfg.node_dir);
1.1       root       93:                        if((stream=fopen(str,"w"))!=NULL) {
                     94:                                fwrite(fname,1,strlen(fname),stream);
1.1.1.2 ! root       95:                                fclose(stream); 
        !            96:                        }
        !            97:                        sprintf(str,"%ssbbsfile.des",cfg.node_dir);
1.1       root       98:                        if((stream=fopen(str,"w"))!=NULL) {
                     99:                                fwrite(f->desc,1,strlen(f->desc),stream);
1.1.1.2 ! root      100:                                fclose(stream); 
        !           101:                        }
        !           102:                        if(external(cmdstr(cfg.ftest[i]->cmd,path,f->desc,NULL),EX_OFFLINE)) {
1.1       root      103:                                bprintf(text[FileHadErrors],f->name,cfg.ftest[i]->ext);
                    104:                                if(SYSOP) {
1.1.1.2 ! root      105:                                        if(!yesno(text[DeleteFileQ])) return(0)        !           106:                                }
1.1       root      107:                                remove(path);
1.1.1.2 ! root      108:                                sprintf(str,"%s attempted to upload %s to %s %s (%s Errors)"
        !           109:                                        ,useron.alias
        !           110:                                        ,f->name
1.1       root      111:                                        ,cfg.lib[cfg.dir[f->dir]->lib]->sname,cfg.dir[f->dir]->sname,cfg.ftest[i]->ext);
                    112:                                logline("U!",str);
1.1.1.2 ! root      113:                                return(0)        !           114:                        } else {
1.1       root      115:                                sprintf(str,"%ssbbsfile.nam",cfg.node_dir);
                    116:                                if((stream=fopen(str,"r"))!=NULL) {
                    117:                                        if(fgets(str,128,stream)) {
                    118:                                                truncsp(str);
                    119:                                                padfname(str,f->name);
                    120:                                                strcpy(tmp,f->name);
                    121:                                                truncsp(tmp);
                    122:                                                sprintf(path,"%s%s",f->altpath>0 && f->altpath<=cfg.altpaths
                    123:                                                        ? cfg.altpath[f->altpath-1] : cfg.dir[f->dir]->path
1.1.1.2 ! root      124:                                                        ,unpadfname(f->name,fname)); 
        !           125:                                        }
1.1       root      126:                                        fclose(stream);
                    127:                                        }
                    128:                                sprintf(str,"%ssbbsfile.des",cfg.node_dir);
                    129:                                if((stream=fopen(str,"r"))!=NULL) {
                    130:                                        if(fgets(str,128,stream)) {
                    131:                                                truncsp(str);
1.1.1.2 ! root      132:                                                sprintf(f->desc,"%.*s",LEN_FDESC,str); 
        !           133:                                        }
        !           134:                                        fclose(stream); 
        !           135:                                }
        !           136:                                CRLF; 
        !           137:                        } 
        !           138:                }
1.1       root      139: 
                    140:        if((length=flength(path))<=0L) {
                    141:                bprintf(text[FileZeroLength],f->name);
                    142:                remove(path);
1.1.1.2 ! root      143:                sprintf(str,"%s attempted to upload %s to %s %s (Zero length)"
        !           144:                        ,useron.alias
        !           145:                        ,f->name
1.1       root      146:                        ,cfg.lib[cfg.dir[f->dir]->lib]->sname,cfg.dir[f->dir]->sname);
                    147:                logline("U!",str);
1.1.1.2 ! root      148:                return(0)        !           149:        }
1.1       root      150:        if(cfg.dir[f->dir]->misc&DIR_DIZ) {
                    151:                for(i=0;i<cfg.total_fextrs;i++)
                    152:                        if(!stricmp(cfg.fextr[i]->ext,tmp+9) && chk_ar(cfg.fextr[i]->ar,&useron))
                    153:                                break;
                    154:                if(i<cfg.total_fextrs) {
                    155:                        sprintf(str,"%sFILE_ID.DIZ",cfg.temp_dir);
1.1.1.2 ! root      156:                        if(fexistcase(str))
1.1       root      157:                                remove(str);
1.1.1.2 ! root      158:                        external(cmdstr(cfg.fextr[i]->cmd,path,"FILE_ID.DIZ",NULL),EX_OFFLINE);
        !           159:                        if(!fexistcase(str)) {
        !           160:                                sprintf(str,"%sDESC.SDI",cfg.temp_dir);
        !           161:                                if(fexistcase(str))
        !           162:                                        remove(str);
        !           163:                                external(cmdstr(cfg.fextr[i]->cmd,path,"DESC.SDI",NULL),EX_OFFLINE); 
        !           164:                                fexistcase(str);
        !           165:                        }
1.1       root      166:                        if((file=nopen(str,O_RDONLY))!=-1) {
1.1.1.2 ! root      167:                                memset(ext,0,F_EXBSIZE+1);
        !           168:                                read(file,ext,F_EXBSIZE);
        !           169:                                for(i=F_EXBSIZE;i;i--)
        !           170:                                        if(ext[i-1]>' ')
1.1       root      171:                                                break;
                    172:                                ext[i]=0;
                    173:                                if(!f->desc[0]) {
                    174:                                        strcpy(desc,ext);
                    175:                                        strip_exascii(desc);
1.1.1.2 ! root      176:                                        prep_file_desc(desc);
1.1       root      177:                                        for(i=0;desc[i];i++)
                    178:                                                if(isalnum(desc[i]))
                    179:                                                        break;
1.1.1.2 ! root      180:                                        sprintf(f->desc,"%.*s",LEN_FDESC,desc+i); 
        !           181:                                }
1.1       root      182:                                close(file);
                    183:                                remove(str);
1.1.1.2 ! root      184:                                f->misc|=FM_EXTDESC; 
        !           185:                        } 
        !           186:                } 
        !           187:        }
1.1       root      188: 
1.1.1.2 ! root      189:        if(!(cfg.dir[f->dir]->misc&DIR_NOSTAT)) {
        !           190:                logon_ulb+=length;  /* Update 'this call' stats */
        !           191:                logon_uls++;
        !           192:        }
1.1       root      193:        if(cfg.dir[f->dir]->misc&DIR_AONLY)  /* Forced anonymous */
                    194:                f->misc|=FM_ANON;
                    195:        f->cdt=length;
                    196:        f->dateuled=time(NULL);
                    197:        f->timesdled=0;
                    198:        f->datedled=0L;
                    199:        f->opencount=0;
                    200:        strcpy(f->uler,useron.alias);
                    201:        bprintf(text[FileNBytesReceived],f->name,ultoac(length,tmp));
                    202:        if(!f->desc[0])
                    203:                sprintf(f->desc,"%.*s",LEN_FDESC,text[NoDescription]);
                    204:        if(!addfiledat(&cfg,f))
                    205:                return(0);
                    206: 
                    207:        if(f->misc&FM_EXTDESC)
1.1.1.2 ! root      208:                putextdesc(&cfg,f->dir,f->datoffset,ext);
1.1       root      209: 
1.1.1.2 ! root      210:        sprintf(str,"%s uploaded %s to %s %s"
        !           211:                ,useron.alias
        !           212:                ,f->name,cfg.lib[cfg.dir[f->dir]->lib]->sname
1.1       root      213:                ,cfg.dir[f->dir]->sname);
                    214:        if(cfg.dir[f->dir]->upload_sem[0])
1.1.1.2 ! root      215:                ftouch(cmdstr(cfg.dir[f->dir]->upload_sem,nulstr,nulstr,NULL));
1.1       root      216:        logline("U+",str);
                    217:        /**************************/
                    218:        /* Update Uploader's Info */
                    219:        /**************************/
                    220:        useron.uls=(ushort)adjustuserrec(&cfg,useron.number,U_ULS,5,1);
                    221:        useron.ulb=(ushort)adjustuserrec(&cfg,useron.number,U_ULB,10,length);
                    222:        if(cfg.dir[f->dir]->up_pct && cfg.dir[f->dir]->misc&DIR_CDTUL) { /* credit for upload */
                    223:                if(cfg.dir[f->dir]->misc&DIR_CDTMIN && cur_cps)    /* Give min instead of cdt */
                    224:                        useron.min=adjustuserrec(&cfg,useron.number,U_MIN,10
                    225:                                ,((ulong)(length*(cfg.dir[f->dir]->up_pct/100.0))/cur_cps)/60);
                    226:                else
                    227:                        useron.cdt=adjustuserrec(&cfg,useron.number,U_CDT,10
1.1.1.2 ! root      228:                                ,(ulong)(f->cdt*(cfg.dir[f->dir]->up_pct/100.0))); 
        !           229:        }
1.1       root      230: 
1.1.1.2 ! root      231:        user_event(EVENT_UPLOAD);
1.1       root      232: 
1.1.1.2 ! root      233:        return(true);
1.1       root      234: }
                    235: 
                    236: /****************************************************************************/
                    237: /* Uploads files                                                            */
                    238: /****************************************************************************/
1.1.1.2 ! root      239: bool sbbs_t::upload(uint dirnum)
1.1       root      240: {
1.1.1.2 ! root      241:        char    descbeg[25]={""},descend[25]={""}
1.1       root      242:                                ,fname[13],keys[256],ch,*p;
1.1.1.2 ! root      243:        char    str[MAX_PATH+1];
        !           244:        char    path[MAX_PATH+1];
        !           245:        char    spath[MAX_PATH+1];
1.1       root      246:        char    tmp[512];
                    247:     time_t     start,end;
                    248:     uint       i,j,k,destuser[MAX_USERXFER],destusers=0;
                    249:        int             file;
                    250:        ulong   space;
                    251:     file_t     f;
                    252:     user_t     user;
                    253:     node_t     node;
                    254: 
1.1.1.2 ! root      255:        /* Security Checks */
        !           256:        if(useron.rest&FLAG('U')) {
        !           257:                bputs(text[R_Upload]);
        !           258:                return(false); 
        !           259:        }
        !           260:        if(dirnum==INVALID_DIR) {
        !           261:                bputs(text[CantUploadHere]);
        !           262:                return(false);
        !           263:        }
        !           264:        if(!chk_ar(cfg.dir[dirnum]->ul_ar,&useron)) {
        !           265:                bputs(dirnum==cfg.user_dir ? text[CantUploadToUser] : 
        !           266:                        dirnum==cfg.sysop_dir ? text[CantUploadToSysop] : text[CantUploadHere]);
        !           267:                return(false); 
        !           268:        }
        !           269:        if(getfiles(&cfg,dirnum)>=cfg.dir[dirnum]->maxfiles) {
        !           270:                bputs(dirnum==cfg.user_dir ? text[UserDirFull] : text[DirFull]);
        !           271:                return(false);
        !           272:        }
        !           273: 
1.1       root      274:        if(sys_status&SS_EVENT && online==ON_REMOTE && !dir_op(dirnum))
                    275:                bprintf(text[UploadBeforeEvent],timeleft/60);
                    276:        if(altul)
                    277:                strcpy(path,cfg.altpath[altul-1]);
                    278:        else
                    279:                strcpy(path,cfg.dir[dirnum]->path);
                    280: 
                    281: 
                    282:        /* get free disk space */
1.1.1.2 ! root      283:        space=getfreediskspace(path,1024);
        !           284:        if(space<(ulong)cfg.min_dspace) {
1.1       root      285:                bputs(text[LowDiskSpace]);
1.1.1.2 ! root      286:                sprintf(str,"Diskspace is low: %s (%lu kilobytes)",path,space);
1.1       root      287:                errorlog(str);
                    288:                if(!dir_op(dirnum))
1.1.1.2 ! root      289:                        return(false); 
        !           290:        }
1.1       root      291:        bprintf(text[DiskNBytesFree],ultoac(space,tmp));
                    292: 
                    293:        f.dir=curdirnum=dirnum;
                    294:        f.misc=0;
                    295:        f.altpath=altul;
                    296:        bputs(text[Filename]);
1.1.1.2 ! root      297:        if(!getstr(fname,12,0) || strchr(fname,'?') || strchr(fname,'*')
1.1       root      298:                || !checkfname(fname) || (trashcan(fname,"file") && !dir_op(dirnum))) {
                    299:                if(fname[0])
                    300:                        bputs(text[BadFilename]);
1.1.1.2 ! root      301:                return(false); 
        !           302:        }
1.1       root      303:        if(dirnum==cfg.sysop_dir)
                    304:                sprintf(str,text[UploadToSysopDirQ],fname);
                    305:        else if(dirnum==cfg.user_dir)
                    306:                sprintf(str,text[UploadToUserDirQ],fname);
                    307:        else
                    308:                sprintf(str,text[UploadToCurDirQ],fname,cfg.lib[cfg.dir[dirnum]->lib]->sname
                    309:                        ,cfg.dir[dirnum]->sname);
1.1.1.2 ! root      310:        if(!yesno(str)) return(false);
1.1       root      311:        action=NODE_ULNG;
                    312:        sprintf(str,"%s%s",path,fname);
1.1.1.2 ! root      313:        if(fexistcase(str)) {   /* File is on disk */
        !           314: #ifdef _WIN32
        !           315:                GetShortPathName(str, spath, sizeof(spath));
        !           316: #else
        !           317:                SAFECOPY(spath,str);
        !           318: #endif
        !           319:                SAFECOPY(fname,getfname(spath));
1.1       root      320:                if(!dir_op(dirnum) && online!=ON_LOCAL) {                /* local users or sysops */
                    321:                        bprintf(text[FileAlreadyThere],fname);
1.1.1.2 ! root      322:                        return(false); 
        !           323:                }
1.1       root      324:                if(!yesno(text[FileOnDiskAddQ]))
1.1.1.2 ! root      325:                        return(false); 
        !           326:        }
        !           327:        padfname(fname,f.name);
1.1       root      328:        strcpy(str,cfg.dir[dirnum]->exts);
                    329:        strcpy(tmp,f.name);
                    330:        truncsp(tmp);
                    331:        j=strlen(str);
                    332:        for(i=0;i<j;i+=ch+1) { /* Check extension of upload with allowable exts */
                    333:                p=strchr(str+i,',');
                    334:                if(p!=NULL)
                    335:                        *p=0;
                    336:                ch=strlen(str+i);
1.1.1.2 ! root      337:                if(!stricmp(tmp+9,str+i))
        !           338:                        break; 
        !           339:        }
1.1       root      340:        if(j && i>=j) {
                    341:                bputs(text[TheseFileExtsOnly]);
                    342:                bputs(cfg.dir[dirnum]->exts);
                    343:                CRLF;
1.1.1.2 ! root      344:                if(!dir_op(dirnum)) return(false); 
        !           345:        }
1.1       root      346:        bputs(text[SearchingForDupes]);
1.1.1.2 ! root      347:        if(findfile(&cfg,dirnum,f.name)) {
        !           348:                bputs(text[SearchedForDupes]);
        !           349:                bprintf(text[FileAlreadyOnline],fname);
        !           350:                return(false);   /* File is already in database */
        !           351:        }
        !           352:        for(i=k=0;i<usrlibs;i++) {
1.1       root      353:                for(j=0;j<usrdirs[i];j++,k++) {
                    354:                        outchar('.');
                    355:                        if(k && !(k%5))
                    356:                                bputs("\b\b\b\b\b     \b\b\b\b\b");
1.1.1.2 ! root      357:                        if(usrdir[i][j]==dirnum)
        !           358:                                continue;       /* we already checked this dir */
        !           359:                        if(cfg.dir[usrdir[i][j]]->misc&DIR_DUPES
1.1       root      360:                                && findfile(&cfg,usrdir[i][j],f.name)) {
                    361:                                bputs(text[SearchedForDupes]);
1.1.1.2 ! root      362:                                bprintf(text[FileAlreadyOnline],fname);
1.1       root      363:                                if(!dir_op(dirnum))
1.1.1.2 ! root      364:                                        return(false);   /* File is in database for another dir */
        !           365:                        }
        !           366:                }
        !           367:        }
1.1       root      368:        bputs(text[SearchedForDupes]);
                    369:        if(dirnum==cfg.user_dir) {  /* User to User transfer */
                    370:                bputs(text[EnterAfterLastDestUser]);
                    371:                while((!dir_op(dirnum) && destusers<cfg.max_userxfer) || destusers<MAX_USERXFER) {
                    372:                        bputs(text[SendFileToUser]);
1.1.1.2 ! root      373:                        if(!getstr(str,LEN_ALIAS,cfg.uq&UQ_NOUPRLWR ? K_NONE:K_UPRLWR))
1.1       root      374:                                break;
                    375:                        if((user.number=finduser(str))!=0) {
                    376:                                if(!dir_op(dirnum) && user.number==useron.number) {
                    377:                                        bputs(text[CantSendYourselfFiles]);
1.1.1.2 ! root      378:                                        continue; 
        !           379:                                }
1.1       root      380:                                for(i=0;i<destusers;i++)
                    381:                                        if(user.number==destuser[i])
                    382:                                                break;
                    383:                                if(i<destusers) {
                    384:                                        bputs(text[DuplicateUser]);
1.1.1.2 ! root      385:                                        continue; 
        !           386:                                }
1.1       root      387:                                getuserdat(&cfg,&user);
                    388:                                if((user.rest&(FLAG('T')|FLAG('D')))
                    389:                                        || !chk_ar(cfg.lib[cfg.dir[cfg.user_dir]->lib]->ar,&user)
                    390:                                        || !chk_ar(cfg.dir[cfg.user_dir]->dl_ar,&user)) {
1.1.1.2 ! root      391:                                        bprintf(text[UserWontBeAbleToDl],user.alias); 
        !           392:                                } else {
1.1       root      393:                                        bprintf(text[UserAddedToDestList],user.alias);
1.1.1.2 ! root      394:                                        destuser[destusers++]=user.number; 
        !           395:                                } 
        !           396:                        }
1.1       root      397:                        else {
1.1.1.2 ! root      398:                                CRLF; 
        !           399:                        } 
        !           400:                }
1.1       root      401:                if(!destusers)
1.1.1.2 ! root      402:                        return(false); 
        !           403:        }
1.1       root      404:        if(cfg.dir[dirnum]->misc&DIR_RATE) {
                    405:                SYNC;
                    406:                bputs(text[RateThisFile]);
                    407:                ch=getkey(K_ALPHA);
                    408:                if(!isalpha(ch) || sys_status&SS_ABORT)
1.1.1.2 ! root      409:                        return(false);
1.1       root      410:                CRLF;
1.1.1.2 ! root      411:                sprintf(descbeg,text[Rated],toupper(ch)); 
        !           412:        }
1.1       root      413:        if(cfg.dir[dirnum]->misc&DIR_ULDATE) {
                    414:                now=time(NULL);
                    415:                if(descbeg[0])
                    416:                        strcat(descbeg," ");
                    417:                sprintf(str,"%s  ",unixtodstr(&cfg,now,tmp));
1.1.1.2 ! root      418:                strcat(descbeg,str); 
        !           419:        }
1.1       root      420:        if(cfg.dir[dirnum]->misc&DIR_MULT) {
                    421:                SYNC;
                    422:                if(!noyes(text[MultipleDiskQ])) {
                    423:                        bputs(text[HowManyDisksTotal]);
                    424:                        if((int)(i=getnum(99))<2)
1.1.1.2 ! root      425:                                return(false);
1.1       root      426:                        bputs(text[NumberOfFile]);
                    427:                        if((int)(j=getnum(i))<1)
1.1.1.2 ! root      428:                                return(false);
1.1       root      429:                        if(j==1)
                    430:                                upload_lastdesc[0]=0;
                    431:                        if(i>9)
                    432:                                sprintf(descend,text[FileOneOfTen],j,i);
                    433:                        else
1.1.1.2 ! root      434:                                sprintf(descend,text[FileOneOfTwo],j,i); 
        !           435:                } else
        !           436:                        upload_lastdesc[0]=0; 
        !           437:        }
1.1       root      438:        else
                    439:                upload_lastdesc[0]=0;
                    440:        bputs(text[EnterDescNow]);
                    441:        i=LEN_FDESC-(strlen(descbeg)+strlen(descend));
                    442:        getstr(upload_lastdesc,i,K_LINE|K_EDIT|K_AUTODEL);
                    443:        if(sys_status&SS_ABORT)
1.1.1.2 ! root      444:                return(false);
1.1       root      445:        if(descend[0])      /* end of desc specified, so pad desc with spaces */
                    446:                sprintf(f.desc,"%s%-*s%s",descbeg,i,upload_lastdesc,descend);
                    447:        else                /* no end specified, so string ends at desc end */
                    448:                sprintf(f.desc,"%s%s",descbeg,upload_lastdesc);
                    449: 
                    450:        if(cfg.dir[dirnum]->misc&DIR_ANON && !(cfg.dir[dirnum]->misc&DIR_AONLY)
                    451:                && (dir_op(dirnum) || useron.exempt&FLAG('A'))) {
                    452:                if(!noyes(text[AnonymousQ]))
1.1.1.2 ! root      453:                        f.misc|=FM_ANON; 
        !           454:        }
1.1       root      455:        sprintf(str,"%s%s",path,fname);
1.1.1.2 ! root      456:        if(fexistcase(str)) {   /* File is on disk */
1.1       root      457:                if(!uploadfile(&f))
1.1.1.2 ! root      458:                        return(false); 
        !           459:        } else {
        !           460:                xfer_prot_menu(XFER_UPLOAD);
1.1       root      461:                SYNC;
                    462:                strcpy(keys,"Q");
                    463:                if(dirnum==cfg.user_dir || !cfg.max_batup)  /* no batch user to user xfers */
                    464:                        mnemonics(text[ProtocolOrQuit]);
                    465:                else {
                    466:                        mnemonics(text[ProtocolBatchOrQuit]);
1.1.1.2 ! root      467:                        strcat(keys,"B"); 
        !           468:                }
1.1       root      469:                for(i=0;i<cfg.total_prots;i++)
                    470:                        if(cfg.prot[i]->ulcmd[0] && chk_ar(cfg.prot[i]->ar,&useron)) {
                    471:                                sprintf(tmp,"%c",cfg.prot[i]->mnemonic);
1.1.1.2 ! root      472:                                strcat(keys,tmp); 
        !           473:                        }
1.1       root      474:                ch=(char)getkeys(keys,0);
                    475:                if(ch=='Q')
1.1.1.2 ! root      476:                        return(false);
1.1       root      477:                if(ch=='B') {
                    478:                        if(batup_total>=cfg.max_batup)
                    479:                                bputs(text[BatchUlQueueIsFull]);
                    480:                        else {
                    481:                                for(i=0;i<batup_total;i++)
                    482:                                        if(!strcmp(batup_name[i],f.name)) {
1.1.1.2 ! root      483:                                                bprintf(text[FileAlreadyInQueue],fname);
        !           484:                                                return(false); 
        !           485:                                        }
1.1       root      486:                                strcpy(batup_name[batup_total],f.name);
                    487:                                strcpy(batup_desc[batup_total],f.desc);
                    488:                                batup_dir[batup_total]=dirnum;
                    489:                                batup_misc[batup_total]=f.misc;
                    490:                                batup_alt[batup_total]=altul;
                    491:                                batup_total++;
                    492:                                bprintf(text[FileAddedToUlQueue]
1.1.1.2 ! root      493:                                        ,fname,batup_total,cfg.max_batup); 
        !           494:                        } 
        !           495:                } else {
1.1       root      496:                        for(i=0;i<cfg.total_prots;i++)
                    497:                                if(cfg.prot[i]->ulcmd[0] && cfg.prot[i]->mnemonic==ch
                    498:                                        && chk_ar(cfg.prot[i]->ar,&useron))
                    499:                                        break;
                    500:                        if(i<cfg.total_prots) {
                    501:                                start=time(NULL);
1.1.1.2 ! root      502:                                protocol(cfg.prot[i],XFER_UPLOAD,str,nulstr,true);
1.1       root      503:                                end=time(NULL);
                    504:                                if(!(cfg.dir[dirnum]->misc&DIR_ULTIME)) /* Don't deduct upload time */
                    505:                                        starttime+=end-start;
                    506:                                ch=uploadfile(&f);
                    507:                                autohangup();
                    508:                                if(!ch)  /* upload failed, don't process user to user xfer */
1.1.1.2 ! root      509:                                        return(false); 
        !           510:                        } 
        !           511:                } 
        !           512:        }
1.1       root      513:        if(dirnum==cfg.user_dir) {  /* Add files to XFER.IXT in INDX dir */
                    514:                sprintf(str,"%sxfer.ixt",cfg.data_dir);
                    515:                if((file=nopen(str,O_WRONLY|O_CREAT|O_APPEND))==-1) {
                    516:                        errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_APPEND);
1.1.1.2 ! root      517:                        return(false); 
        !           518:                }
1.1       root      519:                for(j=0;j<destusers;j++) {
                    520:                        for(i=1;i<=cfg.sys_nodes;i++) { /* Tell user, if online */
                    521:                                getnodedat(i,&node,0);
                    522:                                if(node.useron==destuser[j] && !(node.misc&NODE_POFF)
                    523:                                        && (node.status==NODE_INUSE || node.status==NODE_QUIET)) {
                    524:                                        sprintf(str,text[UserToUserXferNodeMsg],cfg.node_num,useron.alias);
1.1.1.2 ! root      525:                                        putnmsg(&cfg,i,str);
        !           526:                                        break; 
        !           527:                                } 
        !           528:                        }
1.1       root      529:                        if(i>cfg.sys_nodes) {   /* User not online */
                    530:                                sprintf(str,text[UserSentYouFile],useron.alias);
1.1.1.2 ! root      531:                                putsmsg(&cfg,destuser[j],str); 
        !           532:                        }
1.1       root      533:                        sprintf(str,"%4.4u %12.12s %4.4u\r\n"
                    534:                                ,destuser[j],f.name,useron.number);
1.1.1.2 ! root      535:                        write(file,str,strlen(str)); 
        !           536:                }
1.1       root      537:                close(file); 
                    538:        }
1.1.1.2 ! root      539:        return(true);
1.1       root      540: }
                    541: 
                    542: /****************************************************************************/
                    543: /* Checks directory for 'dir' and prompts user to enter description for     */
                    544: /* the files that aren't in the database.                                   */
                    545: /* Returns 1 if the user aborted, 0 if not.                                 */
                    546: /****************************************************************************/
                    547: bool sbbs_t::bulkupload(uint dirnum)
                    548: {
1.1.1.2 ! root      549:     char       str[MAX_PATH+1];
        !           550:        char    path[MAX_PATH+1];
        !           551:        char    spath[MAX_PATH+1];
1.1       root      552:     file_t     f;
                    553:        DIR*    dir;
                    554:        DIRENT* dirent;
                    555: 
                    556:        memset(&f,0,sizeof(file_t));
                    557:        f.dir=dirnum;
                    558:        f.altpath=altul;
                    559:        bprintf(text[BulkUpload],cfg.lib[cfg.dir[dirnum]->lib]->sname,cfg.dir[dirnum]->sname);
                    560:        strcpy(path,altul>0 && altul<=cfg.altpaths ? cfg.altpath[altul-1]
                    561:                : cfg.dir[dirnum]->path);
                    562:        action=NODE_ULNG;
                    563:        SYNC;
                    564:        dir=opendir(path);
1.1.1.2 ! root      565:        while(dir!=NULL && (dirent=readdir(dir))!=NULL && !msgabort()) {
        !           566:                if(getfiles(&cfg,dirnum)>=cfg.dir[dirnum]->maxfiles) {
1.1       root      567:                        bputs(text[DirFull]);
                    568:                        break; 
                    569:                }
                    570:                sprintf(str,"%s%s",path,dirent->d_name);
                    571:                if(isdir(str))
                    572:                        continue;
                    573: #ifdef _WIN32
                    574:                GetShortPathName(str,spath,sizeof(spath));
                    575: #else
                    576:                strcpy(spath,str);
                    577: #endif
                    578:                padfname(getfname(spath),str);
                    579: 
                    580:                if(findfile(&cfg,f.dir,str)==0) {
                    581:                        strcpy(f.name,str);
                    582:                        f.cdt=flength(spath);
1.1.1.2 ! root      583:                        bprintf(text[BulkUploadDescPrompt],f.name,f.cdt/1024);
1.1       root      584:                        getstr(f.desc,LEN_FDESC,K_LINE);
                    585:                        if(sys_status&SS_ABORT)
                    586:                                break;
                    587:                        uploadfile(&f); 
                    588:                }
                    589:        }
1.1.1.2 ! root      590:        if(dir!=NULL)
        !           591:                closedir(dir);
1.1       root      592:        if(sys_status&SS_ABORT)
                    593:                return(true);
                    594:        return(false);
                    595: }
                    596: 

unix.superglobalmegacorp.com

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