--- sbbs/sbbs3/listfile.cpp 2018/04/24 16:39:34 1.1 +++ sbbs/sbbs3/listfile.cpp 2018/04/24 16:40:22 1.1.1.2 @@ -2,7 +2,7 @@ /* Synchronet file database listing functions */ -/* $Id: listfile.cpp,v 1.1 2018/04/24 16:39:34 root Exp $ */ +/* $Id: listfile.cpp,v 1.1.1.2 2018/04/24 16:40:22 root Exp $ */ /**************************************************************************** * @format.tab-size 4 (Plain Text/Source Code File Header) * @@ -56,7 +56,7 @@ int sbbs_t::listfiles(uint dirnum, char uchar flagprompt=0; uint i,j; int file,found=0,lastbat=0,disp; - long l,m=0,n,anchor,next,datbuflen; + long l,m=0,n,anchor=0,next,datbuflen; file_t f,bf[26]; /* bf is batch flagged files */ if(mode&FL_ULTIME) { @@ -106,9 +106,12 @@ int sbbs_t::listfiles(uint dirnum, char action=NODE_LFIL; getnodedat(cfg.node_num,&thisnode,0); if(thisnode.action!=NODE_LFIL) { /* was a sync */ - getnodedat(cfg.node_num,&thisnode,1); - thisnode.action=NODE_LFIL; - putnodedat(cfg.node_num,&thisnode); } } + if(getnodedat(cfg.node_num,&thisnode,true)==0) { + thisnode.action=NODE_LFIL; + putnodedat(cfg.node_num,&thisnode); + } + } + } while(online && found' ' ? '.' : ' '; else str[j]=ixbbuf[m++]; /* Turns FILENAMEEXT into FILENAME.EXT */ str[j]=0; @@ -173,9 +176,9 @@ int sbbs_t::listfiles(uint dirnum, char continue; } getrec((char *)&datbuf[n],F_MISC,1,tmp); j=tmp[0]; /* misc bits */ - if(j) j-=SP; + if(j) j-=' '; if(mode&FL_EXFIND && j&FM_EXTDESC) { /* search extended description */ - getextdesc(dirnum,n,ext); + getextdesc(&cfg,dirnum,n,ext); strupr(ext); if(!strstr(ext,filespec) && !p) { /* not in description or */ m+=11; /* extended description */ @@ -203,7 +206,7 @@ int sbbs_t::listfiles(uint dirnum, char if((!mode || !(useron.misc&EXPERT)) && !tofile && (!filespec[0] || (strchr(filespec,'*') || strchr(filespec,'?')))) { sprintf(hdr,"%s%s.hdr",cfg.dir[dirnum]->data_dir,cfg.dir[dirnum]->code); - if(fexist(hdr)) + if(fexistcase(hdr)) printfile(hdr,0); /* Use DATA\DIRS\.HDR */ else { if(useron.misc&BATCHFLAG) @@ -222,17 +225,17 @@ int sbbs_t::listfiles(uint dirnum, char sprintf(hdr,text[BoxHdrLib],i+1,cfg.lib[usrlib[i]]->lname); bputs(hdr); for(c=bstrlen(hdr);clname); bputs(hdr); for(c=bstrlen(hdr);c=rows-2 && letter!='A') return(false); } + attr(cfg.color[clr_filename]); bputs(fname); - if(buf[F_MISC]!=ETX && (buf[F_MISC]-SP)&FM_EXTDESC) { + + getrec((char *)buf,F_ALTPATH,2,str); + alt=(uchar)ahtoul(str); + sprintf(path,"%s%s",alt>0 && alt<=cfg.altpaths ? cfg.altpath[alt-1]:cfg.dir[dirnum]->path + ,unpadfname(fname,tmp)); + + if(buf[F_MISC]!=ETX && (buf[F_MISC]-' ')&FM_EXTDESC) { if(!(useron.misc&EXTDESC)) outchar('+'); else - outchar(SP); } + outchar(' '); } else - outchar(SP); + outchar(' '); if(useron.misc&BATCHFLAG) { attr(cfg.color[clr_filedesc]); bprintf("%c",letter); } - getrec((char *)buf,F_ALTPATH,2,str); - alt=(uchar)ahtoul(str); - sprintf(str,"%s%s",alt>0 && alt<=cfg.altpaths ? cfg.altpath[alt-1]:cfg.dir[dirnum]->path - ,unpadfname(fname,tmp)); - if(cfg.dir[dirnum]->misc&DIR_FCHK && !fexist(str)) { + if(cfg.dir[dirnum]->misc&DIR_FCHK && !fexistcase(path)) { exist=0; attr(cfg.color[clr_err]); } else @@ -411,7 +418,10 @@ bool sbbs_t::listfile(char *fname, char else { if(cdt<1024) /* 1k is smallest size */ cdt=1024; - bprintf("%5luk",cdt/1024L); } } + if(cdt>(99999*1024)) + bprintf("%5luM",cdt/(1024*1024)); + else + bprintf("%5luk",cdt/1024L); } } else { if(!cdt) { /* FREE file */ attr(curatr^(HIGH|BLINK)); @@ -421,11 +431,23 @@ bool sbbs_t::listfile(char *fname, char else bprintf("%7lu",cdt); } if(exist) - outchar(SP); + outchar(' '); else outchar('-'); getrec((char *)buf,F_DESC,LEN_FDESC,str); attr(cfg.color[clr_filedesc]); + +#ifdef _WIN32 + + if(exist && !(cfg.file_misc&FM_NO_LFN)) { + fexistcase(path); /* Get real (long?) filename */ + ptr=getfname(path); + if(stricmp(ptr,fname) && stricmp(ptr,str)) + bprintf("%.*s\r\n%21s",LEN_FDESC,ptr,""); + } + +#endif + if(!ext[0]) { if(search[0]) { /* high-light string in string */ strcpy(tmp,str); @@ -450,7 +472,6 @@ bool sbbs_t::listfile(char *fname, char cr=ptr+LEN_FDESC; else if(cr) *cr=0; - // bprintf("%.*s\r\n",LEN_FDESC,ptr); sprintf(str,"%.*s\r\n",LEN_FDESC,ptr); putmsg(str,P_NOATCODES|P_SAVEATR); if(!cr) { @@ -467,19 +488,6 @@ bool sbbs_t::listfile(char *fname, char return(true); } -void sbbs_t::clearline(void) -{ - int i; - - outchar(CR); - if(useron.misc&ANSI) - bputs("\x1b[K"); - else { - for(i=0;i<79;i++) - outchar(SP); - outchar(CR); } -} - /****************************************************************************/ /* Remove credits from uploader of file 'f' */ /****************************************************************************/ @@ -490,7 +498,7 @@ bool sbbs_t::removefcdt(file_t* f) int u; long cdt; - if((u=matchuser(&cfg,f->uler))==0) { + if((u=matchuser(&cfg,f->uler,TRUE /*sysop_alias*/))==0) { bputs(text[UnknownUser]); return(false); } cdt=0L; @@ -534,7 +542,7 @@ bool sbbs_t::movefile(file_t* f, int new if(findfile(&cfg,newdir,f->name)) { bprintf(text[FileAlreadyThere],f->name); return(false); } - getextdesc(olddir,f->datoffset,ext); + getextdesc(&cfg,olddir,f->datoffset,ext); if(cfg.dir[olddir]->misc&DIR_MOVENEW) f->dateuled=time(NULL); unpadfname(f->name,fname); @@ -543,16 +551,17 @@ bool sbbs_t::movefile(file_t* f, int new addfiledat(&cfg,f); bprintf(text[MovedFile],f->name ,cfg.lib[cfg.dir[f->dir]->lib]->sname,cfg.dir[f->dir]->sname); - sprintf(str,"Moved %s to %s %s",f->name + sprintf(str,"%s moved %s to %s %s",f->name + ,useron.alias ,cfg.lib[cfg.dir[f->dir]->lib]->sname,cfg.dir[f->dir]->sname); logline(nulstr,str); if(!f->altpath) { /* move actual file */ sprintf(str,"%s%s",cfg.dir[olddir]->path,fname); - if(fexist(str)) { + if(fexistcase(str)) { sprintf(path,"%s%s",cfg.dir[f->dir]->path,fname); mv(str,path,0); } } if(f->misc&FM_EXTDESC) - putextdesc(f->dir,f->datoffset,ext); + putextdesc(&cfg,f->dir,f->datoffset,ext); return(true); } @@ -564,9 +573,9 @@ bool sbbs_t::movefile(file_t* f, int new int sbbs_t::batchflagprompt(uint dirnum, file_t* bf, uint total ,long totalfiles) { - char ch,c,d,str[256],fname[128],*p,remcdt,remfile; + char ch,c,d,str[256],fname[128],*p,remcdt=0,remfile=0; char tmp[512]; - uint i,j,ml,md,udir,ulib; + uint i,j,ml=0,md=0,udir,ulib; file_t f; for(ulib=0;uliblname); SYNC; bprintf(text[MoveToLibPrompt],cfg.dir[dirnum]->lib+1); - if((ml=getnum(usrlibs))==-1) + if((int)(ml=getnum(usrlibs))==-1) return(2); if(!ml) ml=cfg.dir[dirnum]->lib; @@ -744,7 +753,7 @@ int sbbs_t::batchflagprompt(uint dirnum, ,j+1,cfg.dir[usrdir[ml][j]]->lname); SYNC; bprintf(text[MoveToDirPrompt],usrdirs[ml]); - if((md=getnum(usrdirs[ml]))==-1) + if((int)(md=getnum(usrdirs[ml]))==-1) return(2); if(!md) md=usrdirs[ml]-1; @@ -754,7 +763,7 @@ int sbbs_t::batchflagprompt(uint dirnum, for(c=0;c0L) { + if(mode==FI_USERXFER) { + if(flength(str)<1L) + return(0); if((file=nopen(str,O_RDONLY))==-1) { errormsg(WHERE,ERR_OPEN,str,O_RDONLY); return(0); } @@ -886,7 +898,7 @@ int sbbs_t::listfileinfo(uint dirnum, ch break; } for(i=0;i<12 && m' ' ? '.' : ' '; else str[i]=ixbbuf[m++]; /* Turns FILENAMEEXT into FILENAME.EXT */ str[i]=0; @@ -965,10 +977,12 @@ int sbbs_t::listfileinfo(uint dirnum, ch if(dir_op(dirnum)) { bputs(text[EditFilename]); strcpy(str,fname); - getstr(str,12,K_EDIT|K_AUTODEL|K_UPPER); + if(!getstr(str,12,K_EDIT|K_AUTODEL)) + break; if(strcmp(str,fname)) { /* rename */ padfname(str,path); - if(findfile(&cfg,f.dir,path)) + if(stricmp(str,fname) + && findfile(&cfg,f.dir,path)) bprintf(text[FileAlreadyThere],path); else { sprintf(path,"%s%s",dirpath,fname); @@ -980,9 +994,15 @@ int sbbs_t::listfileinfo(uint dirnum, ch strcpy(fname,str); removefiledat(&cfg,&f); strcpy(f.name,padfname(str,tmp)); - addfiledat(&cfg,&f); } } } } + addfiledat(&cfg,&f); + } + } + } + } bputs(text[EditDescription]); getstr(f.desc,LEN_FDESC,K_LINE|K_EDIT|K_AUTODEL); + if(sys_status&SS_ABORT) + break; if(f.misc&FM_EXTDESC) { if(!noyes(text[DeleteExtDescriptionQ])) { remove(str); @@ -991,14 +1011,19 @@ int sbbs_t::listfileinfo(uint dirnum, ch putfiledat(&cfg,&f); break; } bputs(text[EditUploader]); - getstr(f.uler,LEN_ALIAS,K_UPRLWR|K_EDIT|K_AUTODEL); + if(!getstr(f.uler,LEN_ALIAS,K_EDIT|K_AUTODEL)) + break; ultoa(f.cdt,str,10); bputs(text[EditCreditValue]); getstr(str,7,K_NUMBER|K_EDIT|K_AUTODEL); + if(sys_status&SS_ABORT) + break; f.cdt=atol(str); ultoa(f.timesdled,str,10); bputs(text[EditTimesDownloaded]); getstr(str,5,K_NUMBER|K_EDIT|K_AUTODEL); + if(sys_status&SS_ABORT) + break; f.timesdled=atoi(str); if(f.opencount) { ultoa(f.opencount,str,10); @@ -1012,38 +1037,52 @@ int sbbs_t::listfileinfo(uint dirnum, ch f.altpath=atoi(str); if(f.altpath>cfg.altpaths) f.altpath=0; } + if(sys_status&SS_ABORT) + break; putfiledat(&cfg,&f); inputnstime(&f.dateuled); - update_uldate(&f); + update_uldate(&cfg, &f); break; case 'F': /* delete file only */ sprintf(str,"%s%s",dirpath,fname); - if(!fexist(str)) + if(!fexistcase(str)) bputs(text[FileNotThere]); else { if(!noyes(text[AreYouSureQ])) { if(remove(str)) bprintf(text[CouldntRemoveFile],str); else { - sprintf(tmp,"Deleted %s",str); - logline(nulstr,tmp); } } } + sprintf(tmp,"%s deleted %s" + ,useron.alias + ,str); + logline(nulstr,tmp); + } + } + } break; case 'R': /* remove file from database */ if(noyes(text[AreYouSureQ])) break; removefiledat(&cfg,&f); - sprintf(str,"Removed %s from %s %s",f.name + sprintf(str,"%s removed %s from %s %s" + ,useron.alias + ,f.name ,cfg.lib[cfg.dir[f.dir]->lib]->sname,cfg.dir[f.dir]->sname); logline("U-",str); sprintf(str,"%s%s",dirpath,fname); - if(fexist(str)) { + if(fexistcase(str)) { if(dir_op(dirnum)) { if(!noyes(text[DeleteFileQ])) { if(remove(str)) bprintf(text[CouldntRemoveFile],str); else { - sprintf(tmp,"Deleted %s",str); - logline(nulstr,tmp); } } } + sprintf(tmp,"%s deleted %s" + ,useron.alias + ,str); + logline(nulstr,tmp); + } + } + } else if(remove(str)) /* always remove if not sysop */ bprintf(text[CouldntRemoveFile],str); } if(dir_op(dirnum) || useron.exempt&FLAG('R')) { @@ -1053,16 +1092,16 @@ int sbbs_t::listfileinfo(uint dirnum, ch sprintf(str,text[AddToOfflineDirQ] ,fname,cfg.lib[cfg.dir[i]->lib]->sname,cfg.dir[i]->sname); if(yesno(str)) { - getextdesc(f.dir,f.datoffset,ext); + getextdesc(&cfg,f.dir,f.datoffset,ext); f.dir=i; addfiledat(&cfg,&f); if(f.misc&FM_EXTDESC) - putextdesc(f.dir,f.datoffset,ext); } } } + putextdesc(&cfg,f.dir,f.datoffset,ext); } } } if(dir_op(dirnum) || stricmp(f.uler,useron.alias)) { if(noyes(text[RemoveCreditsQ])) /* Fall through */ break; } case 'C': /* remove credits only */ - if((i=matchuser(&cfg,f.uler))==0) { + if((i=matchuser(&cfg,f.uler,TRUE /*sysop_alias*/))==0) { bputs(text[UnknownUser]); break; } if(dir_op(dirnum)) { @@ -1093,7 +1132,7 @@ int sbbs_t::listfileinfo(uint dirnum, ch bprintf(text[MoveToLibLstFmt],i+1,cfg.lib[usrlib[i]]->lname); SYNC; bprintf(text[MoveToLibPrompt],cfg.dir[dirnum]->lib+1); - if((i=getnum(usrlibs))==-1) + if((int)(i=getnum(usrlibs))==-1) continue; if(!i) i=cfg.dir[dirnum]->lib; @@ -1105,7 +1144,7 @@ int sbbs_t::listfileinfo(uint dirnum, ch ,j+1,cfg.dir[usrdir[i][j]]->lname); SYNC; bprintf(text[MoveToDirPrompt],usrdirs[i]); - if((j=getnum(usrdirs[i]))==-1) + if((int)(j=getnum(usrdirs[i]))==-1) continue; if(!j) j=usrdirs[i]-1; @@ -1114,7 +1153,7 @@ int sbbs_t::listfileinfo(uint dirnum, ch if(findfile(&cfg,usrdir[i][j],f.name)) { bprintf(text[FileAlreadyThere],f.name); break; } - getextdesc(f.dir,f.datoffset,ext); + getextdesc(&cfg,f.dir,f.datoffset,ext); removefiledat(&cfg,&f); if(f.dir==cfg.upload_dir || f.dir==cfg.sysop_dir) f.dateuled=time(NULL); @@ -1122,16 +1161,18 @@ int sbbs_t::listfileinfo(uint dirnum, ch addfiledat(&cfg,&f); bprintf(text[MovedFile],f.name ,cfg.lib[cfg.dir[f.dir]->lib]->sname,cfg.dir[f.dir]->sname); - sprintf(str,"Moved %s to %s %s",f.name + sprintf(str,"%s moved %s to %s %s" + ,useron.alias + ,f.name ,cfg.lib[cfg.dir[f.dir]->lib]->sname,cfg.dir[f.dir]->sname); logline(nulstr,str); if(!f.altpath) { /* move actual file */ sprintf(str,"%s%s",cfg.dir[dirnum]->path,fname); - if(fexist(str)) { + if(fexistcase(str)) { sprintf(path,"%s%s",cfg.dir[f.dir]->path,fname); mv(str,path,0); } } if(f.misc&FM_EXTDESC) - putextdesc(f.dir,f.datoffset,ext); + putextdesc(&cfg,f.dir,f.datoffset,ext); break; case 'Q': /* quit */ found=-1; @@ -1146,7 +1187,7 @@ int sbbs_t::listfileinfo(uint dirnum, ch found=-1; break; } continue; } - if(!(cfg.dir[f.dir]->misc&DIR_FREE) && !(useron.exempt&FLAG('D')) + if(!is_download_free(&cfg,f.dir,&useron) && f.cdt>(useron.cdt+useron.freecdt)) { SYNC; bprintf(text[YouOnlyHaveNCredits] @@ -1173,7 +1214,7 @@ int sbbs_t::listfileinfo(uint dirnum, ch found=-1; break; } continue; } - menu("dlprot"); + xfer_prot_menu(XFER_DOWNLOAD); openfile(&f); SYNC; mnemonics(text[ProtocolBatchQuitOrNext]); @@ -1200,7 +1241,7 @@ int sbbs_t::listfileinfo(uint dirnum, ch if(iext,f.name+9) && chk_ar(cfg.dlevent[j]->ar,&useron)) { @@ -1238,29 +1281,23 @@ int sbbs_t::listfileinfo(uint dirnum, ch getnodedat(cfg.node_num,&thisnode,1); action=NODE_DLNG; t=now+f.timetodl; - tm=gmtime(&t); - if(tm==NULL) - break; - thisnode.aux=(tm->tm_hour*60)+tm->tm_min; + localtime_r(&t,&tm); + thisnode.aux=(tm.tm_hour*60)+tm.tm_min; putnodedat(cfg.node_num,&thisnode); /* calculate ETA */ start=time(NULL); - j=protocol(cmdstr(cfg.prot[i]->dlcmd,path,nulstr,NULL),0); + error=protocol(cfg.prot[i],XFER_DOWNLOAD,path,nulstr,false); end=time(NULL); if(cfg.dir[f.dir]->misc&DIR_TFREE) starttime+=end-start; - if(cfg.prot[i]->misc&PROT_DSZLOG) { - if(checkprotlog(&f)) - downloadfile(&f); - else - notdownloaded(f.size,start,end); } - else { - if(!j) - downloadfile(&f); - else { - bprintf(text[FileNotSent],f.name); - notdownloaded(f.size,start,end); } } + if(checkprotresult(cfg.prot[i],error,&f)) + downloadfile(&f); + else + notdownloaded(f.size,start,end); delfiles(cfg.temp_dir,ALLFILES); - autohangup(); } } } + autohangup(); + } + } + } closefile(&f); } if(filespec[0] && !strchr(filespec,'*') && !strchr(filespec,'?')) break; @@ -1283,7 +1320,7 @@ void sbbs_t::listfiletofile(char *fname, bool exist=true; strcpy(str,fname); - if(buf[F_MISC]!=ETX && (buf[F_MISC]-SP)&FM_EXTDESC) + if(buf[F_MISC]!=ETX && (buf[F_MISC]-' ')&FM_EXTDESC) strcat(str,"+"); else strcat(str," "); @@ -1292,7 +1329,7 @@ void sbbs_t::listfiletofile(char *fname, alt=(uchar)ahtoul(str); sprintf(str,"%s%s",alt>0 && alt<=cfg.altpaths ? cfg.altpath[alt-1] : cfg.dir[dirnum]->path,unpadfname(fname,tmp)); - if(cfg.dir[dirnum]->misc&DIR_FCHK && !fexist(str)) + if(cfg.dir[dirnum]->misc&DIR_FCHK && !fexistcase(str)) exist=false; getrec((char *)buf,F_CDT,LEN_FCDT,str); cdt=atol(str);