--- sbbs/src/sbbs3/tmp_xfer.cpp 2018/04/24 16:41:23 1.1.1.1 +++ sbbs/src/sbbs3/tmp_xfer.cpp 2018/04/24 16:42:58 1.1.1.2 @@ -2,13 +2,13 @@ /* Synchronet temp directory file transfer routines */ -/* $Id: tmp_xfer.cpp,v 1.1.1.1 2018/04/24 16:41:23 root Exp $ */ +/* $Id: tmp_xfer.cpp,v 1.1.1.2 2018/04/24 16:42:58 root Exp $ */ /**************************************************************************** * @format.tab-size 4 (Plain Text/Source Code File Header) * * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * * * - * Copyright 2005 Rob Swindell - http://www.synchro.net/copyright.html * + * Copyright 2011 Rob Swindell - http://www.synchro.net/copyright.html * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * @@ -58,13 +58,15 @@ void sbbs_t::temp_xfer() return; if(useron.rest&FLAG('D')) { bputs(text[R_Download]); - return; } + return; + } /*************************************/ /* Create TEMP directory information */ /*************************************/ if((cfg.dir[dirnum]=(dir_t *)malloc(sizeof(dir_t)))==0) { errormsg(WHERE,ERR_ALLOC,"temp_dir",sizeof(dir_t)); - return; } + return; + } memset(cfg.dir[dirnum],0,sizeof(dir_t)); SAFECOPY(cfg.dir[dirnum]->lname,"Temporary"); SAFECOPY(cfg.dir[dirnum]->sname,"Temp"); @@ -95,8 +97,10 @@ void sbbs_t::temp_xfer() SYNC; CRLF; if(lncntr) /* CRLF or SYNC can cause pause */ - pause(); } - menu("tempxfer"); } + pause(); + } + menu("tempxfer"); + } ASYNC; bputs(text[TempDirPrompt]); SAFECOPY(f.uler,temp_uler); @@ -105,33 +109,39 @@ void sbbs_t::temp_xfer() logch(ch,0); switch(ch) { case 'A': /* add to temp file */ + if(!isdir(cfg.temp_dir)) { + bprintf(text[DirectoryDoesNotExist], cfg.temp_dir); + lprintf(LOG_ERR,"Temp directory does not exist: %s", cfg.temp_dir); + break; + } /* free disk space */ space=getfreediskspace(cfg.temp_dir,1024); if(space<(ulong)cfg.min_dspace) { bputs(text[LowDiskSpace]); - sprintf(str,"Diskspace is low: %s (%lu kilobytes)" + lprintf(LOG_ERR,"Diskspace is low: %s (%lu kilobytes)" ,cfg.temp_dir,space); - errorlog(str); if(!dir_op(dirnum)) - break; } + break; + } bprintf(text[DiskNBytesFree],ultoac(space,tmp)); if(!getfilespec(str)) break; if(!checkfname(str)) break; - sprintf(tmp2,"%s added %s to %s" + SAFEPRINTF3(tmp2,"%s added %s to %s" ,useron.alias,str,f.name); logline(nulstr,tmp2); - sprintf(tmp2,"%s%s",cfg.temp_dir,str); - sprintf(str,"%s%s",cfg.temp_dir,f.name); - external(cmdstr(temp_cmd(),str,tmp2,NULL),EX_WILDCARD|EX_OUTL|EX_OUTR); + SAFEPRINTF2(tmp2,"%s%s",cfg.temp_dir,str); + SAFEPRINTF2(str,"%s%s",cfg.temp_dir,f.name); + external(cmdstr(temp_cmd(),str,tmp2,NULL),EX_WILDCARD|EX_STDOUT); break; case 'D': /* download from temp dir */ - sprintf(str,"%s%s",cfg.temp_dir,f.name); + SAFEPRINTF2(str,"%s%s",cfg.temp_dir,f.name); if(!fexist(str)) { bprintf(text[TempFileNotCreatedYet],f.name); - break; } - f.size=f.cdt=flength(str); + break; + } + f.size=f.cdt=(long)flength(str); f.opencount=0; if(temp_cdt) /* if file was not free */ f.cdt=f.size; @@ -141,29 +151,33 @@ void sbbs_t::temp_xfer() && f.cdt>useron.cdt+useron.freecdt) { bprintf(text[YouOnlyHaveNCredits] ,ultoac(useron.cdt+useron.freecdt,tmp)); - break; } /* f.cdt must equal size here */ + break; /* f.cdt must equal size here */ + } if(!(useron.exempt&FLAG('T')) && !dir_op(dirnum) && !(cfg.dir[temp_dirnum]->misc&DIR_TFREE) && cur_cps && f.size/(ulong)cur_cps>timeleft) { bputs(text[NotEnoughTimeToDl]); - break; } - if(!chk_ar(cfg.dir[temp_dirnum]->dl_ar,&useron)) { + break; + } + if(!chk_ar(cfg.dir[temp_dirnum]->dl_ar,&useron,&client)) { bputs(text[CantDownloadFromDir]); - break; } + break; + } addfiledat(&cfg,&f); xfer_prot_menu(XFER_DOWNLOAD); SYNC; mnemonics(text[ProtocolOrQuit]); SAFECOPY(tmp2,"Q"); for(i=0;idlcmd[0] && chk_ar(cfg.prot[i]->ar,&useron)) { + if(cfg.prot[i]->dlcmd[0] && chk_ar(cfg.prot[i]->ar,&useron,&client)) { sprintf(tmp,"%c",cfg.prot[i]->mnemonic); - strcat(tmp2,tmp); } + strcat(tmp2,tmp); + } ungetkey(useron.prot); ch=(char)getkeys(tmp2,0); for(i=0;idlcmd[0] && cfg.prot[i]->mnemonic==ch - && chk_ar(cfg.prot[i]->ar,&useron)) + && chk_ar(cfg.prot[i]->ar,&useron,&client)) break; if(icode,"TEMP")) intmp=1; + if(!isdir(cfg.temp_dir)) { + bprintf(text[DirectoryDoesNotExist], cfg.temp_dir); + lprintf(LOG_ERR,"Temp directory does not exist: %s", cfg.temp_dir); + return; + } + /* get free disk space */ space=getfreediskspace(cfg.temp_dir,1024); if(space<(ulong)cfg.min_dspace) { bputs(text[LowDiskSpace]); - sprintf(str,"Diskspace is low: %s (%lu kilobytes)",cfg.temp_dir,space); - errorlog(str); + lprintf(LOG_ERR,"Diskspace is low: %s (%lu kilobytes)",cfg.temp_dir,space); if(!dir_op(dirnum)) - return; } + return; + } else if(!intmp) { /* not in temp dir */ - CRLF; } + CRLF; + } bprintf(text[DiskNBytesFree],ultoac(space,tmp)); if(!intmp) { /* not extracting FROM temp directory */ - sprintf(str,"%s%s",cfg.temp_dir,ALLFILES); + SAFEPRINTF2(str,"%s%s",cfg.temp_dir,ALLFILES); if(fexist(str)) { bputs(text[RemovingTempFiles]); dir=opendir(cfg.temp_dir); while(dir!=NULL && (dirent=readdir(dir))!=NULL) { - sprintf(str,"%s%s",cfg.temp_dir,dirent->d_name); + SAFEPRINTF2(str,"%s%s",cfg.temp_dir,dirent->d_name); if(!isdir(str)) remove(str); } @@ -311,25 +334,28 @@ void sbbs_t::extract(uint dirnum) } } bputs(text[ExtractFrom]); - if(!getstr(fname,64,K_NONE) || !checkfname(fname) || strchr(fname,'*') + if(!getstr(fname,sizeof(fname)-1,K_NONE) || !checkfname(fname) || strchr(fname,'*') || strchr(fname,'?')) return; padfname(fname,f.name); SAFECOPY(str,f.name); truncsp(str); for(i=0;iext) && chk_ar(cfg.fextr[i]->ar,&useron)) { + if(!stricmp(str+9,cfg.fextr[i]->ext) && chk_ar(cfg.fextr[i]->ar,&useron,&client)) { SAFECOPY(excmd,cfg.fextr[i]->cmd); - break; } + break; + } if(i==cfg.total_fextrs) { bputs(text[UnextractableFile]); - return; } + return; + } if(!intmp && !findfile(&cfg,dirnum,f.name)) { /* not temp dir */ bputs(text[SearchingAllDirs]); for(i=0;ipath,fname); + SAFEPRINTF2(path,"%s%s",cfg.dir[dirnum]->path,fname); if(!intmp) { /* not temp dir, so get temp_file info */ f.datoffset=f.dateuled=f.datedled=0L; f.dir=dirnum; @@ -358,17 +388,19 @@ void sbbs_t::extract(uint dirnum) getfiledat(&cfg,&f); fileinfo(&f); if(f.altpath>0 && f.altpath<=cfg.altpaths) - sprintf(path,"%s%s",cfg.altpath[f.altpath-1],fname); + SAFEPRINTF2(path,"%s%s",cfg.altpath[f.altpath-1],fname); temp_dirnum=dirnum; if(cfg.dir[f.dir]->misc&DIR_FREE) temp_cdt=0L; else temp_cdt=f.cdt; SAFECOPY(temp_uler,f.uler); - SAFECOPY(temp_file,f.name); } /* padded filename */ + SAFECOPY(temp_file,f.name); /* padded filename */ + } if(!fexistcase(path)) { - bputs(text[FileNotThere]); /* not on disk */ - return; } + bprintf(text[FileDoesNotExist],path); /* not on disk */ + return; + } done=0; while(online && !done) { mnemonics(text[ExtractFilesPrompt]); @@ -378,11 +410,11 @@ void sbbs_t::extract(uint dirnum) break; if(!checkfname(str)) break; - if((i=external(cmdstr(excmd,path,str,NULL) - ,EX_INR|EX_OUTL|EX_OUTR))!=0) { + if((i=external(cmdstr(excmd,path,str,NULL),EX_STDIO))!=0) { errormsg(WHERE,ERR_EXEC,cmdstr(excmd,path,str,NULL),i); - return; } - sprintf(tmp,"%s extracted %s from %s",useron.alias,str,path); + return; + } + SAFEPRINTF3(tmp,"%s extracted %s from %s",useron.alias,str,path); logline(nulstr,tmp); CRLF; break; @@ -391,14 +423,16 @@ void sbbs_t::extract(uint dirnum) break; default: done=1; - break; } } + break; + } + } } /****************************************************************************/ /* Creates a text file named NEWFILES.DAT in the temp directory that */ /* all new files since p-date. Returns number of files in list. */ /****************************************************************************/ -ulong sbbs_t::create_filelist(char *name, long mode) +ulong sbbs_t::create_filelist(const char *name, long mode) { char str[256]; int file; @@ -406,14 +440,16 @@ ulong sbbs_t::create_filelist(char *name ulong l,k; bprintf(text[CreatingFileList],name); - sprintf(str,"%s%s",cfg.temp_dir,name); + SAFEPRINTF2(str,"%s%s",cfg.temp_dir,name); if((file=nopen(str,O_CREAT|O_WRONLY|O_APPEND))==-1) { errormsg(WHERE,ERR_OPEN,str,O_CREAT|O_WRONLY|O_APPEND); - return(0); } + return(0); + } k=0; if(mode&FL_ULTIME) { - sprintf(str,"New files since: %s\r\n",timestr(&ns_time)); - write(file,str,strlen(str)); } + SAFEPRINTF(str,"New files since: %s\r\n",timestr(ns_time)); + write(file,str,strlen(str)); + } for(i=j=d=0;i1) { - sprintf(str,"\r\n%ld Files Listed.\r\n",k); - write(file,str,strlen(str)); } + SAFEPRINTF(str,"\r\n%ld Files Listed.\r\n",k); + write(file,str,strlen(str)); + } close(file); if(k) bprintf(text[CreatedFileList],name); else { bputs(text[NoFiles]); - sprintf(str,"%s%s",cfg.temp_dir,name); - remove(str); } + SAFEPRINTF2(str,"%s%s",cfg.temp_dir,name); + remove(str); + } SAFECOPY(temp_file,name); SAFECOPY(temp_uler,"File List"); return(k); @@ -454,10 +494,11 @@ char * sbbs_t::temp_cmd(void) if(!cfg.total_fcomps) { errormsg(WHERE,ERR_CHK,"compressible file types",0); - return(nulstr); } + return(nulstr); + } for(i=0;iext) - && chk_ar(cfg.fcomp[i]->ar,&useron)) + && chk_ar(cfg.fcomp[i]->ar,&useron,&client)) return(cfg.fcomp[i]->cmd); return(cfg.fcomp[0]->cmd); }