diff --git a/src/sbbs3/js_system.c b/src/sbbs3/js_system.c index f5b04265c3622729d3ed55c7cc15e35fdb255db1..6bd4e275c5ebb01ae28af916f3a9a7c0a2f8c0c8 100644 --- a/src/sbbs3/js_system.c +++ b/src/sbbs3/js_system.c @@ -756,7 +756,7 @@ static JSBool js_node_get(JSContext *cx, JSObject *obj, jsval id, jsval *vp) node_num=(uint)JS_GetPrivate(cx,obj)>>1; memset(&node,0,sizeof(node)); - if(getnodedat(cfg, node_num, &node, 0)) { + if(getnodedat(cfg, node_num, &node, NULL)) { *vp = INT_TO_JSVAL(0); return(JS_TRUE); } @@ -793,6 +793,7 @@ static JSBool js_node_get(JSContext *cx, JSObject *obj, jsval id, jsval *vp) static JSBool js_node_set(JSContext *cx, JSObject *obj, jsval id, jsval *vp) { uint node_num; + int file; jsint val=0; jsint tiny; node_t node; @@ -812,7 +813,7 @@ static JSBool js_node_set(JSContext *cx, JSObject *obj, jsval id, jsval *vp) node_num=(uint)JS_GetPrivate(cx,obj)>>1; memset(&node,0,sizeof(node)); - if(getnodedat(cfg, node_num, &node, 1)) + if(getnodedat(cfg, node_num, &node, &file)) return(JS_TRUE); if(JSVAL_IS_INT(*vp)) @@ -846,7 +847,7 @@ static JSBool js_node_set(JSContext *cx, JSObject *obj, jsval id, jsval *vp) node.extaux=val; break; } - putnodedat(cfg,node_num,&node); + putnodedat(cfg,node_num,&node,file); return(JS_TRUE); } diff --git a/src/sbbs3/userdat.c b/src/sbbs3/userdat.c index a68540ce72761797e92c78ca34916c640bd91b59..94aa8d3052c58e1a36a6c5f2a9b1946ce4956920 100644 --- a/src/sbbs3/userdat.c +++ b/src/sbbs3/userdat.c @@ -467,12 +467,12 @@ int DLLCALL putuserdat(scfg_t* cfg, user_t* user) for(i=1;i<=cfg->sys_nodes;i++) { /* instant user data update */ if(i==cfg->node_num) continue; - getnodedat(cfg, i,&node,0); + getnodedat(cfg, i,&node,NULL); if(node.useron==user->number && (node.status==NODE_INUSE || node.status==NODE_QUIET)) { - getnodedat(cfg, i,&node,1); + getnodedat(cfg, i,&node,&file); node.misc|=NODE_UDAT; - putnodedat(cfg, i,&node); + putnodedat(cfg, i,&node,file); break; } } @@ -639,7 +639,7 @@ char DLLCALL getage(scfg_t* cfg, char *birth) /* from node.dab */ /* if lockit is non-zero, locks this node's record. putnodedat() unlocks it */ /****************************************************************************/ -int DLLCALL getnodedat(scfg_t* cfg, uint number, node_t *node, char lockit) +int DLLCALL getnodedat(scfg_t* cfg, uint number, node_t *node, int* fp) { char str[MAX_PATH+1]; int count; @@ -651,6 +651,8 @@ int DLLCALL getnodedat(scfg_t* cfg, uint number, node_t *node, char lockit) sprintf(str,"%snode.dab",cfg->ctrl_dir); if((file=nopen(str,O_RDONLY|O_DENYNONE))==-1) { memset(node,0,sizeof(node_t)); + if(fp!=NULL) + *fp=file; return(errno); } @@ -659,14 +661,18 @@ int DLLCALL getnodedat(scfg_t* cfg, uint number, node_t *node, char lockit) if(count) mswait(100); lseek(file,(long)number*sizeof(node_t),SEEK_SET); - if(lockit + if(fp!=NULL && lock(file,(long)number*sizeof(node_t),sizeof(node_t))==-1) continue; if(read(file,node,sizeof(node_t))==sizeof(node_t)) break; } - close(file); + if(fp==NULL) + close(file); + else + *fp=file; + if(count==LOOP_NODEDAB) return(-2); @@ -675,26 +681,16 @@ int DLLCALL getnodedat(scfg_t* cfg, uint number, node_t *node, char lockit) /****************************************************************************/ /* Write the data from the structure 'node' into node.dab */ -/* getnodedat(num,&node,1); must have been called before calling this func */ -/* NOTE: ------^ the indicates the node record has been locked */ /****************************************************************************/ -int DLLCALL putnodedat(scfg_t* cfg, uint number, node_t* node) +int DLLCALL putnodedat(scfg_t* cfg, uint number, node_t* node, int file) { - char str[MAX_PATH+1]; size_t wr; int wrerr; - int file; int attempts; if(!number || number>cfg->sys_nodes) return(-1); - sprintf(str,"%snode.dab",cfg->ctrl_dir); - if((file=nopen(str,O_RDWR|O_CREAT|O_DENYNONE))==-1) { - memset(node,0,sizeof(node_t)); - return(errno); - } - number--; /* make zero based */ for(attempts=0;attempts<10;attempts++) { lseek(file,(long)number*sizeof(node_t),SEEK_SET); @@ -784,13 +780,13 @@ int DLLCALL putsmsg(scfg_t* cfg, int usernumber, char *strin) } close(file); for(i=1;i<=cfg->sys_nodes;i++) { /* flag node if user on that msg waiting */ - getnodedat(cfg,i,&node,0); + getnodedat(cfg,i,&node,NULL); if(node.useron==usernumber && (node.status==NODE_INUSE || node.status==NODE_QUIET) && !(node.misc&NODE_MSGW)) { - getnodedat(cfg,i,&node,1); + getnodedat(cfg,i,&node,&file); node.misc|=NODE_MSGW; - putnodedat(cfg,i,&node); + putnodedat(cfg,i,&node,file); } } return(0); @@ -1247,12 +1243,12 @@ int DLLCALL putuserrec(scfg_t* cfg, int usernumber,int start, uint length, char for(i=1;i<=cfg->sys_nodes;i++) { /* instant user data update */ if(i==cfg->node_num) continue; - getnodedat(cfg, i,&node,0); + getnodedat(cfg, i,&node,NULL); if(node.useron==usernumber && (node.status==NODE_INUSE || node.status==NODE_QUIET)) { - getnodedat(cfg, i,&node,1); + getnodedat(cfg, i,&node,&file); node.misc|=NODE_UDAT; - putnodedat(cfg, i,&node); + putnodedat(cfg, i,&node,file); break; } } @@ -1323,12 +1319,12 @@ ulong DLLCALL adjustuserrec(scfg_t* cfg, int usernumber, int start, int length, for(i=1;i<=cfg->sys_nodes;i++) { /* instant user data update */ if(i==cfg->node_num) continue; - getnodedat(cfg, i,&node,0); + getnodedat(cfg, i,&node,NULL); if(node.useron==usernumber && (node.status==NODE_INUSE || node.status==NODE_QUIET)) { - getnodedat(cfg, i,&node,1); + getnodedat(cfg, i,&node,&file); node.misc|=NODE_UDAT; - putnodedat(cfg, i,&node); + putnodedat(cfg, i,&node,file); break; } } diff --git a/src/sbbs3/userdat.h b/src/sbbs3/userdat.h index f297825670b1cd19cf893861f25d00a137285661..d6b055aedbc7296129effa8a83a940b79ff352c7 100644 --- a/src/sbbs3/userdat.h +++ b/src/sbbs3/userdat.h @@ -82,8 +82,8 @@ DLLEXPORT BOOL DLLCALL del_lastuser(scfg_t* cfg); DLLEXPORT char DLLCALL getage(scfg_t* cfg, char *birthdate); DLLEXPORT char* DLLCALL username(scfg_t* cfg, int usernumber, char * str); DLLEXPORT char* DLLCALL usermailaddr(scfg_t* cfg, char* addr, char* name); -DLLEXPORT int DLLCALL getnodedat(scfg_t* cfg, uint number, node_t *node, char lockit); -DLLEXPORT int DLLCALL putnodedat(scfg_t* cfg, uint number, node_t *node); +DLLEXPORT int DLLCALL getnodedat(scfg_t* cfg, uint number, node_t *node, int* file); +DLLEXPORT int DLLCALL putnodedat(scfg_t* cfg, uint number, node_t *node, int file); DLLEXPORT uint DLLCALL userdatdupe(scfg_t* cfg, uint usernumber, uint offset, uint datlen, char *dat ,BOOL del);