diff --git a/src/sbbs3/userdat.c b/src/sbbs3/userdat.c index c37e7ab6c6d3465bb99068a0bdab147d064ed103..2f5f78dabd8c52ad3bf5bda08c84c776d1b942af 100644 --- a/src/sbbs3/userdat.c +++ b/src/sbbs3/userdat.c @@ -593,7 +593,10 @@ int DLLCALL getnodedat(scfg_t* cfg, uint number, node_t *node, char lockit) int DLLCALL putnodedat(scfg_t* cfg, uint number, node_t* node) { char str[MAX_PATH]; + size_t wr; + int wrerr; int file; + int attempts; if(!number || number>cfg->sys_nodes) return(-1); @@ -605,15 +608,19 @@ int DLLCALL putnodedat(scfg_t* cfg, uint number, node_t* node) } number--; /* make zero based */ - lseek(file,(long)number*sizeof(node_t),SEEK_SET); - if(write(file,node,sizeof(node_t))!=sizeof(node_t)) { - unlock(file,(long)number*sizeof(node_t),sizeof(node_t)); - close(file); - return(-2); + for(attempts=0;attempts<10;attempts++) { + lseek(file,(long)number*sizeof(node_t),SEEK_SET); + lock(file,(long)number*sizeof(node_t),sizeof(node_t)); + if((wr=write(file,node,sizeof(node_t)))==sizeof(node_t)) + break; + wrerr=errno; /* save write error */ + mswait(100); } unlock(file,(long)number*sizeof(node_t),sizeof(node_t)); close(file); + if(wr!=sizeof(node_t)) + return(wrerr); return(0); }