diff --git a/src/sbbs3/getnode.cpp b/src/sbbs3/getnode.cpp index 4ec584b233d29d87fb408640ea6dbb3e9b68e57d..475e59fda456a692ba836243b3214945ec0ac51d 100644 --- a/src/sbbs3/getnode.cpp +++ b/src/sbbs3/getnode.cpp @@ -55,18 +55,18 @@ bool sbbs_t::getnodedat(uint number, node_t *node, bool lockit) else utime(str,NULL); /* NFS fix... utime() forces a cache refresh */ #endif - number--; /* make zero based */ for(count=0;count<LOOP_NODEDAB;count++) { - if(lockit && lock(nodefile,(long)number*sizeof(node_t),sizeof(node_t))!=0) { - unlock(nodefile,(long)number*sizeof(node_t),sizeof(node_t)); + if(lockit && lock(nodefile, nodedatoffset(number), sizeof(node_t))!=0) { + unlock(nodefile, nodedatoffset(number), sizeof(node_t)); continue; } - lseek(nodefile,(long)number*sizeof(node_t),SEEK_SET); - rd=read(nodefile,node,sizeof(node_t)); - if(rd!=sizeof(node_t)) - unlock(nodefile,(long)number*sizeof(node_t),sizeof(node_t)); - if(rd==sizeof(node_t)) - break; + if(seeknodedat(nodefile, number)) { + rd=read(nodefile,node,sizeof(node_t)); + if(rd!=sizeof(node_t)) + unlock(nodefile, nodedatoffset(number), sizeof(node_t)); + if(rd==sizeof(node_t)) + break; + } FILE_RETRY_DELAY(count + 1); } if(!lockit && cfg.node_misc&NM_CLOSENODEDAB) { diff --git a/src/sbbs3/putnode.cpp b/src/sbbs3/putnode.cpp index e8b9c183ae97142275cfff0d9843a715a1becc0a..4ebb40427ab297dc3df8a2181da5a5ffa866884f 100644 --- a/src/sbbs3/putnode.cpp +++ b/src/sbbs3/putnode.cpp @@ -60,11 +60,12 @@ bool sbbs_t::putnodedat(uint number, node_t* node) } for(attempts=0;attempts<10;attempts++) { - lseek(nodefile, (number - 1) * sizeof(node_t), SEEK_SET); - wr=write(nodefile,node,sizeof(node_t)); - if(wr==sizeof(node_t)) - break; - wrerr=errno; /* save write error */ + if(seeknodedat(nodefile, number)) { + wr=write(nodefile,node,sizeof(node_t)); + if(wr==sizeof(node_t)) + break; + wrerr=errno; /* save write error */ + } FILE_RETRY_DELAY(attempts + 1); } unlocknodedat(number); diff --git a/src/sbbs3/userdat.c b/src/sbbs3/userdat.c index 4b77d6d1087975b8cba13483ee8ecf9002e57e7f..42c6ab0a838c6c03d1112c3103c82c4f2e258c27 100644 --- a/src/sbbs3/userdat.c +++ b/src/sbbs3/userdat.c @@ -1101,6 +1101,16 @@ int opennodedat(scfg_t* cfg) return nopen(fname, O_RDWR | O_CREAT | O_DENYNONE); } +off_t nodedatoffset(unsigned node_number) +{ + return (node_number - 1) * sizeof(node_t); +} + +bool seeknodedat(int file, unsigned node_number) +{ + return lseek(file, nodedatoffset(node_number), SEEK_SET) == nodedatoffset(node_number); +} + /****************************************************************************/ /****************************************************************************/ int opennodeext(scfg_t* cfg) @@ -1138,18 +1148,20 @@ int getnodedat(scfg_t* cfg, uint number, node_t *node, bool lockit, int* fdp) int result = USER_SIZE_ERROR; if(filelength(file)>=(long)(number*sizeof(node_t))) { - number--; /* make zero based */ for(count=0;count<LOOP_NODEDAB;count++) { - (void)lseek(file,(long)number*sizeof(node_t),SEEK_SET); + if(!seeknodedat(file, number)) { + result = USER_SEEK_ERROR; + continue; + } if(lockit - && lock(file,(long)number*sizeof(node_t),sizeof(node_t))!=0) { + && lock(file, nodedatoffset(number), sizeof(node_t))!=0) { result = USER_LOCK_ERROR; continue; } rd=read(file,node,sizeof(node_t)); if(rd!=sizeof(node_t)) { result = USER_READ_ERROR; - unlock(file,(long)number*sizeof(node_t),sizeof(node_t)); + unlock(file, nodedatoffset(number), sizeof(node_t)); } else { result = USER_SUCCESS; break; @@ -1172,8 +1184,8 @@ int getnodedat(scfg_t* cfg, uint number, node_t *node, bool lockit, int* fdp) /****************************************************************************/ int putnodedat(scfg_t* cfg, uint number, node_t* node, bool closeit, int file) { - size_t wr=0; int attempts; + int result = -1; if(file<0) return USER_INVALID_ARG; @@ -1184,20 +1196,22 @@ int putnodedat(scfg_t* cfg, uint number, node_t* node, bool closeit, int file) return USER_INVALID_ARG; } - number--; /* make zero based */ for(attempts=0;attempts<LOOP_USERDAT;attempts++) { - (void)lseek(file,(long)number*sizeof(node_t),SEEK_SET); - if((wr=write(file,node,sizeof(node_t)))==sizeof(node_t)) + if(!seeknodedat(file, number)) + result = USER_SEEK_ERROR; + else if(write(file,node,sizeof(node_t)) != sizeof(node_t)) + result = USER_WRITE_ERROR; + else { + result = USER_SUCCESS; break; + } FILE_RETRY_DELAY(attempts + 1); } - unlock(file,(long)number*sizeof(node_t),sizeof(node_t)); + unlock(file, nodedatoffset(number), sizeof(node_t)); if(closeit) close(file); - if(wr!=sizeof(node_t)) - return USER_WRITE_ERROR; - return USER_SUCCESS; + return result; } /****************************************************************************/ diff --git a/src/sbbs3/userdat.h b/src/sbbs3/userdat.h index 0d60262daabb0151f4d1f4d5644c75b3cf21288c..4f6077c05d331f15cb059a9c8b524ab172cfce0f 100644 --- a/src/sbbs3/userdat.h +++ b/src/sbbs3/userdat.h @@ -90,6 +90,8 @@ DLLEXPORT char* username(scfg_t*, int usernumber, char * str); DLLEXPORT char* usermailaddr(scfg_t*, char* addr, const char* name); DLLEXPORT void smtp_netmailaddr(scfg_t*, smbmsg_t*, char* name, size_t namelen, char* addr, size_t addrlen); DLLEXPORT int opennodedat(scfg_t*); +DLLEXPORT off_t nodedatoffset(unsigned node_number); +DLLEXPORT bool seeknodedat(int file, unsigned node_number); DLLEXPORT int opennodeext(scfg_t*); DLLEXPORT int getnodedat(scfg_t*, uint number, node_t *node, bool lockit, int* file); DLLEXPORT int putnodedat(scfg_t*, uint number, node_t *node, bool closeit, int file);