From f1243ec47b48128a725400db33e1ae19fc7c9666 Mon Sep 17 00:00:00 2001
From: "Rob Swindell (on Windows 11)" <rob@synchro.net>
Date: Tue, 24 Dec 2024 03:48:30 -0800
Subject: [PATCH] Use opennodedat() always to open the node.dab file

Include O_CREAT access mode flag in opennodedat().

I experimented with excluding O_DENYNONE when the NM_CLOSENODEDAB flag is set
(to hopefully work-around MacOS Samba node.dab corruption issue), but that
didn't work with SBBSCTRL leaving the file open in SH_DENYNONE mode, so will
have revist that, but using a common open function helps.
---
 src/sbbs3/getnode.cpp |  5 ++---
 src/sbbs3/main.cpp    | 11 +++++------
 src/sbbs3/userdat.c   |  2 +-
 3 files changed, 8 insertions(+), 10 deletions(-)

diff --git a/src/sbbs3/getnode.cpp b/src/sbbs3/getnode.cpp
index 1249685a6c..5e0d13c811 100644
--- a/src/sbbs3/getnode.cpp
+++ b/src/sbbs3/getnode.cpp
@@ -43,12 +43,11 @@ bool sbbs_t::getnodedat(uint number, node_t *node, bool lockit)
 
 	if(node!=&thisnode)
 		memset(node,0,sizeof(node_t));
-	SAFEPRINTF(str,"%snode.dab",cfg.ctrl_dir);
 	pthread_mutex_lock(&nodefile_mutex);
 	if(nodefile==-1) {
-		if((nodefile=nopen(str,O_RDWR|O_DENYNONE))==-1) {
+		if((nodefile=opennodedat(&cfg))==-1) {
 			pthread_mutex_unlock(&nodefile_mutex);
-			errormsg(WHERE,ERR_OPEN,str,O_RDWR|O_DENYNONE);
+			errormsg(WHERE,ERR_OPEN,"nodefile",number);
 			return false;
 		}
 	}
diff --git a/src/sbbs3/main.cpp b/src/sbbs3/main.cpp
index 9cac3aabff..2b28fafdde 100644
--- a/src/sbbs3/main.cpp
+++ b/src/sbbs3/main.cpp
@@ -3630,11 +3630,10 @@ bool sbbs_t::init()
 	}
 
 	/* Shared NODE files */
-	SAFEPRINTF2(str,"%s%s",cfg.ctrl_dir,"node.dab");
 	pthread_mutex_lock(&nodefile_mutex);
-	if((nodefile=nopen(str,O_DENYNONE|O_RDWR|O_CREAT))==-1) {
+	if((nodefile=opennodedat(&cfg))==-1) {
 		pthread_mutex_unlock(&nodefile_mutex);
-		errormsg(WHERE, ERR_OPEN, str, cfg.node_num);
+		errormsg(WHERE, ERR_OPEN, "nodefile", cfg.node_num);
 		return(false);
 	}
 	memset(&node,0,sizeof(node_t));  /* write NULL to node struct */
@@ -3643,13 +3642,13 @@ bool sbbs_t::init()
 		lseek(nodefile,0L,SEEK_END);
 		if(write(nodefile,&node,sizeof(node_t))!=sizeof(node_t)) {
 			pthread_mutex_unlock(&nodefile_mutex);
-			errormsg(WHERE,ERR_WRITE,str,sizeof(node_t));
+			errormsg(WHERE,ERR_WRITE,"nodefile",sizeof(node_t));
 			break;
 		}
 	}
 	if(chsize(nodefile, (off_t)(cfg.sys_nodes*sizeof(node_t))) != 0) {
 		pthread_mutex_unlock(&nodefile_mutex);
-		errormsg(WHERE, ERR_LEN, str, cfg.sys_nodes*sizeof(node_t));
+		errormsg(WHERE, ERR_LEN, "ndoefile", cfg.sys_nodes*sizeof(node_t));
 	}
 	for(i=0; cfg.node_num>0 && i<LOOP_NODEDAB; i++) {
 		if(lock(nodefile,(cfg.node_num-1)*sizeof(node_t),sizeof(node_t))==0) {
@@ -3665,7 +3664,7 @@ bool sbbs_t::init()
 	pthread_mutex_unlock(&nodefile_mutex);
 
 	if(i>=LOOP_NODEDAB) {
-		errormsg(WHERE, ERR_LOCK, str, cfg.node_num);
+		errormsg(WHERE, ERR_LOCK, "nodefile", cfg.node_num);
 		return(false);
 	}
 
diff --git a/src/sbbs3/userdat.c b/src/sbbs3/userdat.c
index 65c1a79e4a..ad3e15c702 100644
--- a/src/sbbs3/userdat.c
+++ b/src/sbbs3/userdat.c
@@ -1099,7 +1099,7 @@ int opennodedat(scfg_t* cfg)
 		return -1;
 
 	SAFEPRINTF(fname, "%snode.dab", cfg->ctrl_dir);
-	return nopen(fname, O_RDWR|O_DENYNONE);
+	return nopen(fname, O_RDWR | O_CREAT | O_DENYNONE);
 }
 
 /****************************************************************************/
-- 
GitLab