--- sbbs/sbbs3/filedat.c 2018/04/24 16:39:34 1.1.1.1 +++ sbbs/sbbs3/filedat.c 2018/04/24 16:40:31 1.1.1.2 @@ -2,13 +2,13 @@ /* Synchronet file database-related exported functions */ -/* $Id: filedat.c,v 1.1.1.1 2018/04/24 16:39:34 root Exp $ */ +/* $Id: filedat.c,v 1.1.1.2 2018/04/24 16:40:31 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 2000 Rob Swindell - http://www.synchro.net/copyright.html * + * Copyright 2003 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 * @@ -44,30 +44,26 @@ /****************************************************************************/ BOOL DLLCALL getfiledat(scfg_t* cfg, file_t* f) { - char buf[F_LEN+1],str[256],tmp[128]; + char buf[F_LEN+1],str[256]; int file; long length; sprintf(str,"%s%s.dat",cfg->dir[f->dir]->data_dir,cfg->dir[f->dir]->code); if((file=sopen(str,O_RDONLY|O_BINARY,SH_DENYWR))==-1) { - // errormsg(WHERE,ERR_OPEN,str,O_RDONLY); return(FALSE); } length=filelength(file); if(f->datoffset>length) { close(file); - // errormsg(WHERE,ERR_LEN,str,length); return(FALSE); } if(length%F_LEN) { close(file); - // errormsg(WHERE,ERR_LEN,str,length); return(FALSE); } lseek(file,f->datoffset,SEEK_SET); if(read(file,buf,F_LEN)!=F_LEN) { close(file); - // errormsg(WHERE,ERR_READ,str,F_LEN); return(FALSE); } close(file); @@ -77,10 +73,7 @@ BOOL DLLCALL getfiledat(scfg_t* cfg, fil f->cdt=atol(str); if(!f->size) { /* only read disk if this is null */ - // if(dir[f->dir]->misc&DIR_FCHK) { - sprintf(str,"%s%s" - ,f->altpath>0 && f->altpath<=cfg->altpaths ? cfg->altpath[f->altpath-1] - : cfg->dir[f->dir]->path,unpadfname(f->name,tmp)); + getfilepath(cfg,f,str); f->size=flength(str); f->date=fdate(str); /* @@ -104,7 +97,7 @@ BOOL DLLCALL getfiledat(scfg_t* cfg, fil getrec(buf,F_OPENCOUNT,3,str); f->opencount=atoi(str); if(buf[F_MISC]!=ETX) - f->misc=buf[F_MISC]-SP; + f->misc=buf[F_MISC]-' '; else f->misc=0; return(TRUE); @@ -129,35 +122,30 @@ BOOL DLLCALL putfiledat(scfg_t* cfg, fil putrec(buf,F_TIMESDLED+5,2,crlf); putrec(buf,F_OPENCOUNT,3,ultoa(f->opencount,tmp,10)); putrec(buf,F_OPENCOUNT+3,2,crlf); - buf[F_MISC]=f->misc+SP; + buf[F_MISC]=f->misc+' '; putrec(buf,F_ALTPATH,2,hexplus(f->altpath,tmp)); putrec(buf,F_ALTPATH+2,2,crlf); sprintf(str,"%s%s.dat",cfg->dir[f->dir]->data_dir,cfg->dir[f->dir]->code); if((file=sopen(str,O_WRONLY|O_BINARY,SH_DENYRW))==-1) { -// errormsg(WHERE,ERR_OPEN,str,O_WRONLY); return(FALSE); } length=filelength(file); if(length%F_LEN) { close(file); -// errormsg(WHERE,ERR_LEN,str,length); return(FALSE); } if(f->datoffset>length) { close(file); -// errormsg(WHERE,ERR_LEN,str,length); return(FALSE); } lseek(file,f->datoffset,SEEK_SET); if(write(file,buf,F_LEN)!=F_LEN) { close(file); -// errormsg(WHERE,ERR_WRITE,str,F_LEN); return(FALSE); } length=filelength(file); close(file); if(length%F_LEN) { -// errormsg(WHERE,ERR_LEN,str,length); return(FALSE); } return(TRUE); @@ -182,8 +170,7 @@ BOOL DLLCALL addfiledat(scfg_t* cfg, fil /* Add data to DAT File */ /************************/ sprintf(str,"%s%s.dat",cfg->dir[f->dir]->data_dir,cfg->dir[f->dir]->code); - if((file=sopen(str,O_RDWR|O_BINARY|O_CREAT,SH_DENYRW))==-1) { -// errormsg(WHERE,ERR_OPEN,str,O_RDWR|O_CREAT); + if((file=sopen(str,O_RDWR|O_BINARY|O_CREAT,SH_DENYRW,S_IREAD|S_IWRITE))==-1) { return(FALSE); } length=filelength(file); @@ -192,7 +179,6 @@ BOOL DLLCALL addfiledat(scfg_t* cfg, fil else { if(length%F_LEN) { close(file); -// errormsg(WHERE,ERR_LEN,str,length); return(FALSE); } for(l=0;l=MAX_FILES || l/F_LEN>=cfg->dir[f->dir]->maxfiles) { close(file); -#if 0 - bputs(text[DirFull]); - sprintf(str,"Directory Full: %s %s" - ,cfg->lib[cfg->dir[f->dir]->lib]->sname,cfg->dir[f->dir]->sname); - logline("U!",str); -#endif return(FALSE); } } @@ -220,7 +200,7 @@ BOOL DLLCALL addfiledat(scfg_t* cfg, fil putrec(fdat,F_TIMESDLED+5,2,crlf); putrec(fdat,F_OPENCOUNT,3,ultoa(f->opencount,tmp,10)); putrec(fdat,F_OPENCOUNT+3,2,crlf); - fdat[F_MISC]=f->misc+SP; + fdat[F_MISC]=f->misc+' '; putrec(fdat,F_ALTPATH,2,hexplus(f->altpath,tmp)); putrec(fdat,F_ALTPATH+2,2,crlf); f->datoffset=l; @@ -230,13 +210,11 @@ BOOL DLLCALL addfiledat(scfg_t* cfg, fil lseek(file,l,SEEK_SET); if(write(file,fdat,F_LEN)!=F_LEN) { close(file); -// errormsg(WHERE,ERR_WRITE,str,F_LEN); return(FALSE); } length=filelength(file); close(file); if(length%F_LEN) { -// errormsg(WHERE,ERR_LEN,str,length); return(FALSE); } @@ -244,7 +222,7 @@ BOOL DLLCALL addfiledat(scfg_t* cfg, fil /* Update last upload date/time stamp file */ /*******************************************/ sprintf(str,"%s%s.dab",cfg->dir[f->dir]->data_dir,cfg->dir[f->dir]->code); - if((file=sopen(str,O_WRONLY|O_CREAT|O_BINARY,SH_DENYRW))!=-1) { + if((file=sopen(str,O_WRONLY|O_CREAT|O_BINARY,SH_DENYRW,S_IREAD|S_IWRITE))!=-1) { now=time(NULL); write(file,&now,4); close(file); @@ -257,25 +235,21 @@ BOOL DLLCALL addfiledat(scfg_t* cfg, fil for(i=8;i<12;i++) /* Turn FILENAME.EXT into FILENAMEEXT */ fname[i]=fname[i+1]; sprintf(str,"%s%s.ixb",cfg->dir[f->dir]->data_dir,cfg->dir[f->dir]->code); - if((file=sopen(str,O_RDWR|O_CREAT|O_BINARY,SH_DENYRW))==-1) { -// errormsg(WHERE,ERR_OPEN,str,O_RDWR|O_CREAT); + if((file=sopen(str,O_RDWR|O_CREAT|O_BINARY,SH_DENYRW,S_IREAD|S_IWRITE))==-1) { return(FALSE); } length=filelength(file); if(length) { /* IXB file isn't empty */ if(length%F_IXBSIZE) { close(file); -// errormsg(WHERE,ERR_LEN,str,length); return(FALSE); } if((ixbbuf=(uchar *)MALLOC(length))==NULL) { close(file); -// errormsg(WHERE,ERR_ALLOC,str,length); return(FALSE); } if(lread(file,ixbbuf,length)!=length) { close(file); -// errormsg(WHERE,ERR_READ,str,length); FREE((char *)ixbbuf); return(FALSE); } @@ -284,16 +258,17 @@ BOOL DLLCALL addfiledat(scfg_t* cfg, fil /************************************************/ if(cfg->dir[f->dir]->sort==SORT_NAME_A || cfg->dir[f->dir]->sort==SORT_NAME_D) { for(l=0;ldir[f->dir]->sort==SORT_NAME_A && fname[i]dir[f->dir]->sort==SORT_NAME_A + && toupper(fname[i])dir[f->dir]->sort==SORT_NAME_D && fname[i]>ixbbuf[l+i]) + if(cfg->dir[f->dir]->sort==SORT_NAME_D + && toupper(fname[i])>toupper(ixbbuf[l+i])) break; } } @@ -310,13 +285,11 @@ BOOL DLLCALL addfiledat(scfg_t* cfg, fil lseek(file,l,SEEK_SET); if(write(file,fname,11)!=11) { /* Write filename to IXB file */ close(file); -// errormsg(WHERE,ERR_WRITE,str,11); FREE((char *)ixbbuf); return(FALSE); } if(write(file,idx,3)!=3) { /* Write DAT offset into IXB file */ close(file); -// errormsg(WHERE,ERR_WRITE,str,3); FREE((char *)ixbbuf); return(FALSE); } @@ -324,7 +297,6 @@ BOOL DLLCALL addfiledat(scfg_t* cfg, fil write(file,&f->datedled,4); /* Write 0 for datedled */ if(lwrite(file,&ixbbuf[l],length-l)!=length-l) { /* Write rest of IXB */ close(file); -// errormsg(WHERE,ERR_WRITE,str,length-l); FREE((char *)ixbbuf); return(FALSE); } @@ -332,12 +304,10 @@ BOOL DLLCALL addfiledat(scfg_t* cfg, fil else { /* IXB file is empty... No files */ if(write(file,fname,11)!=11) { /* Write filename it IXB file */ close(file); -// errormsg(WHERE,ERR_WRITE,str,11); return(FALSE); } if(write(file,idx,3)!=3) { /* Write DAT offset into IXB file */ close(file); -// errormsg(WHERE,ERR_WRITE,str,3); return(FALSE); } write(file,&f->dateuled,sizeof(time_t)); @@ -345,8 +315,6 @@ BOOL DLLCALL addfiledat(scfg_t* cfg, fil } length=filelength(file); close(file); -/// if(length%F_IXBSIZE) -// errormsg(WHERE,ERR_LEN,str,length); return(TRUE); } @@ -364,24 +332,20 @@ BOOL DLLCALL getfileixb(scfg_t* cfg, fil sprintf(str,"%s%s.ixb",cfg->dir[f->dir]->data_dir,cfg->dir[f->dir]->code); if((file=sopen(str,O_RDONLY|O_BINARY,SH_DENYWR))==-1) { - // errormsg(WHERE,ERR_OPEN,str,O_RDONLY); return(FALSE); } length=filelength(file); if(length%F_IXBSIZE) { close(file); - // errormsg(WHERE,ERR_LEN,str,length); return(FALSE); } if((ixbbuf=(uchar *)MALLOC(length))==NULL) { close(file); - // errormsg(WHERE,ERR_ALLOC,str,length); return(FALSE); } if(lread(file,ixbbuf,length)!=length) { close(file); FREE((char *)ixbbuf); - // errormsg(WHERE,ERR_READ,str,length); return(FALSE); } close(file); @@ -390,11 +354,10 @@ BOOL DLLCALL getfileixb(scfg_t* cfg, fil fname[l]=fname[l+1]; for(l=0;l=length) { - // errormsg(WHERE,ERR_CHK,str,0); FREE((char *)ixbbuf); return(FALSE); } @@ -414,15 +377,14 @@ BOOL DLLCALL getfileixb(scfg_t* cfg, fil BOOL DLLCALL removefiledat(scfg_t* cfg, file_t* f) { char c,str[256],ixbname[12],HUGE16 *ixbbuf,fname[13]; - int file; + int i,file; long l,length; strcpy(fname,f->name); - for(c=8;c<12;c++) /* Turn FILENAME.EXT into FILENAMEEXT */ - fname[c]=fname[c+1]; + for(i=8;i<12;i++) /* Turn FILENAME.EXT into FILENAMEEXT */ + fname[i]=fname[i+1]; sprintf(str,"%s%s.ixb",cfg->dir[f->dir]->data_dir,cfg->dir[f->dir]->code); if((file=sopen(str,O_RDONLY|O_BINARY,SH_DENYWR))==-1) { -// errormsg(WHERE,ERR_OPEN,str,O_RDONLY); return(FALSE); } length=filelength(file); @@ -432,28 +394,24 @@ BOOL DLLCALL removefiledat(scfg_t* cfg, } if((ixbbuf=(char *)MALLOC(length))==0) { close(file); -// errormsg(WHERE,ERR_ALLOC,str,length); return(FALSE); } if(lread(file,ixbbuf,length)!=length) { close(file); -// errormsg(WHERE,ERR_READ,str,length); FREE((char *)ixbbuf); return(FALSE); } close(file); if((file=sopen(str,O_WRONLY|O_TRUNC|O_BINARY,SH_DENYRW))==-1) { -// errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_TRUNC); return(FALSE); } for(l=0;ldir[f->dir]->data_dir,cfg->dir[f->dir]->code); if((file=sopen(str,O_WRONLY|O_BINARY,SH_DENYRW))==-1) { -// errormsg(WHERE,ERR_OPEN,str,O_WRONLY); return(FALSE); } lseek(file,f->datoffset,SEEK_SET); c=ETX; /* If first char of record is ETX, record is unused */ if(write(file,&c,1)!=1) { /* So write a D_T on the first byte of the record */ close(file); -// errormsg(WHERE,ERR_WRITE,str,1); return(FALSE); } close(file); @@ -485,14 +441,14 @@ BOOL DLLCALL removefiledat(scfg_t* cfg, /****************************************************************************/ BOOL DLLCALL findfile(scfg_t* cfg, uint dirnum, char *filename) { - char str[256],c,fname[13],HUGE16 *ixbbuf; - int file; + char str[256],fname[13],HUGE16 *ixbbuf; + int i,file; long length,l; sprintf(fname,"%.12s",filename); strupr(fname); - for(c=8;c<12;c++) /* Turn FILENAME.EXT into FILENAMEEXT */ - fname[c]=fname[c+1]; + for(i=8;i<12;i++) /* Turn FILENAME.EXT into FILENAMEEXT */ + fname[i]=fname[i+1]; sprintf(str,"%s%s.ixb",cfg->dir[dirnum]->data_dir,cfg->dir[dirnum]->code); if((file=sopen(str,O_RDONLY|O_BINARY,SH_DENYWR))==-1) return(FALSE); length=filelength(file); @@ -501,18 +457,16 @@ BOOL DLLCALL findfile(scfg_t* cfg, uint return(FALSE); } if((ixbbuf=(char *)MALLOC(length))==NULL) { close(file); - // errormsg(WHERE,ERR_ALLOC,str,length); return(FALSE); } if(lread(file,ixbbuf,length)!=length) { close(file); - // errormsg(WHERE,ERR_READ,str,length); FREE((char *)ixbbuf); return(FALSE); } close(file); for(l=0;l' ') /* Change "FILE" to "FILE " */ + str[d++]='.'; /* (don't add a dot if there's no extension) */ + else + str[d++]=' '; while(d<12) if(!filename[c]) break; else str[d++]=filename[c++]; while(d<12) - str[d++]=SP; + str[d++]=' '; str[d]=0; return(str); } -char* DLLCALL getfname(char* path) -{ - char *fname; - - fname=strrchr(path,'/'); - if(fname==NULL) - fname=strrchr(path,'\\'); - if(fname!=NULL) - fname++; - else - fname=path; - return(fname); -} - - /****************************************************************************/ /* Turns FILE .EXT into FILE.EXT */ /****************************************************************************/ char* DLLCALL unpadfname(char *filename, char *str) { - char c,d; + int c,d; for(c=0,d=0;filename[c];c++) - if(filename[c]!=SP) str[d++]=filename[c]; + if(filename[c]!=' ') str[d++]=filename[c]; str[d]=0; return(str); } @@ -589,25 +531,21 @@ BOOL DLLCALL rmuserxfers(scfg_t* cfg, in return(FALSE); } if((file=sopen(str,O_RDONLY|O_BINARY,SH_DENYWR))==-1) { -// errormsg(WHERE,ERR_OPEN,str,O_RDONLY); return(FALSE); } length=filelength(file); if((ixtbuf=(char *)MALLOC(length))==NULL) { close(file); -// errormsg(WHERE,ERR_ALLOC,str,length); return(FALSE); } if(read(file,ixtbuf,length)!=length) { close(file); FREE(ixtbuf); -// errormsg(WHERE,ERR_READ,str,length); return(FALSE); } close(file); if((file=sopen(str,O_WRONLY|O_TRUNC|O_BINARY,SH_DENYRW))==-1) { FREE(ixtbuf); -// errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_TRUNC); return(FALSE); } for(l=0;ldir[dirnum]->data_dir,cfg->dir[dirnum]->code); + if((file=nopen(str,O_RDONLY))==-1) + return; + lseek(file,(datoffset/F_LEN)*F_EXBSIZE,SEEK_SET); + read(file,ext,F_EXBSIZE); + close(file); +} + +void DLLCALL putextdesc(scfg_t* cfg, uint dirnum, ulong datoffset, char *ext) +{ + char str[256],nulbuf[F_EXBSIZE]; + int file; + + strip_invalid_attr(ext); /* eliminate bogus ctrl-a codes */ + memset(nulbuf,0,sizeof(nulbuf)); + sprintf(str,"%s%s.exb",cfg->dir[dirnum]->data_dir,cfg->dir[dirnum]->code); + if((file=nopen(str,O_WRONLY|O_CREAT))==-1) + return; + lseek(file,0L,SEEK_END); + while(filelength(file)<(long)(datoffset/F_LEN)*F_EXBSIZE) + write(file,nulbuf,sizeof(nulbuf)); + lseek(file,(datoffset/F_LEN)*F_EXBSIZE,SEEK_SET); + write(file,ext,F_EXBSIZE); + close(file); +} + +/****************************************************************************/ +/* Update the upload date for the file 'f' */ +/****************************************************************************/ +int DLLCALL update_uldate(scfg_t* cfg, file_t* f) +{ + char str[256],fname[13]; + int i,file; + long l,length; + + /*******************/ + /* Update IXB File */ + /*******************/ + sprintf(str,"%s%s.ixb",cfg->dir[f->dir]->data_dir,cfg->dir[f->dir]->code); + if((file=nopen(str,O_RDWR))==-1) + return(errno); + length=filelength(file); + if(length%F_IXBSIZE) { + close(file); + return(-1); + } + strcpy(fname,f->name); + for(i=8;i<12;i++) /* Turn FILENAME.EXT into FILENAMEEXT */ + fname[i]=fname[i+1]; + for(l=0;l=length) { + close(file); + return(-2); + } + lseek(file,l+14,SEEK_SET); + write(file,&f->dateuled,4); + close(file); + + /*******************************************/ + /* Update last upload date/time stamp file */ + /*******************************************/ + sprintf(str,"%s%s.dab",cfg->dir[f->dir]->data_dir,cfg->dir[f->dir]->code); + if((file=nopen(str,O_WRONLY|O_CREAT))==-1) + return(errno); + + write(file,&f->dateuled,4); + close(file); + return(0); +} + +/****************************************************************************/ +/* Returns full path to specified file */ +/****************************************************************************/ +char* DLLCALL getfilepath(scfg_t* cfg, file_t* f, char* path) +{ + char fname[MAX_PATH+1]; + + unpadfname(f->name,fname); + if(f->dir>=cfg->total_dirs) + sprintf(path,"%s%s",cfg->temp_dir,fname); + else + sprintf(path,"%s%s",f->altpath>0 && f->altpath<=cfg->altpaths + ? cfg->altpath[f->altpath-1] : cfg->dir[f->dir]->path + ,fname); + + return(path); +}