From 30d8973c42fc5c684c65ea0a345ef261eee2d89c Mon Sep 17 00:00:00 2001
From: "Rob Swindell (on Windows 11)" <rob@synchro.net>
Date: Sat, 10 Feb 2024 16:42:47 -0800
Subject: [PATCH] nodestatus() use the user record's curxtrn internal code
 rather than aux value

... to determine/print the current external progarm being run.

This fixes issue #716
---
 src/sbbs3/scfglib.h  |  2 ++
 src/sbbs3/scfglib1.c | 16 ++++++++++++++++
 src/sbbs3/userdat.c  | 22 +++++++++++++++-------
 3 files changed, 33 insertions(+), 7 deletions(-)

diff --git a/src/sbbs3/scfglib.h b/src/sbbs3/scfglib.h
index e5049de0dc..6cbfb67796 100644
--- a/src/sbbs3/scfglib.h
+++ b/src/sbbs3/scfglib.h
@@ -59,6 +59,7 @@ int		getlibnum_from_name(scfg_t*, const char* name);
 int		getsubnum(scfg_t*, const char* code);
 int		getgrpnum(scfg_t*, const char* code);
 int		getgrpnum_from_name(scfg_t*, const char* name);
+int		getxtrnnum(scfg_t*, const char* code);
 int		getxtrnsec(scfg_t*, const char* code);
 int		getgurunum(scfg_t*, const char* code);
 int		getchatactset(scfg_t*, const char* name);
@@ -69,6 +70,7 @@ DLLEXPORT bool	is_valid_dirnum(scfg_t*, int);
 DLLEXPORT bool	is_valid_libnum(scfg_t*, int);
 DLLEXPORT bool	is_valid_subnum(scfg_t*, int);
 DLLEXPORT bool	is_valid_grpnum(scfg_t*, int);
+DLLEXPORT bool	is_valid_xtrnnum(scfg_t*, int);
 DLLEXPORT bool	is_valid_xtrnsec(scfg_t*, int);
 
 DLLEXPORT char *	trashcan_fname(scfg_t* cfg, const char *name, char* fname, size_t);
diff --git a/src/sbbs3/scfglib1.c b/src/sbbs3/scfglib1.c
index 80e0e83066..2b14c5ac6b 100644
--- a/src/sbbs3/scfglib1.c
+++ b/src/sbbs3/scfglib1.c
@@ -761,6 +761,17 @@ int getlibnum_from_name(scfg_t* cfg, const char* name)
 	return i;
 }
 
+int getxtrnnum(scfg_t* cfg, const char* code)
+{
+	int i;
+
+	for(i = 0; i < cfg->total_xtrns; i++) {
+		if(stricmp(cfg->xtrn[i]->code, code) == 0)
+			break;
+	}
+	return i;
+}
+
 int getxtrnsec(scfg_t* cfg, const char* code)
 {
 	int i;
@@ -838,6 +849,11 @@ bool is_valid_grpnum(scfg_t* cfg, int grpnum)
 	return (grpnum >= 0) && (cfg != NULL) && (grpnum < cfg->total_grps);
 }
 
+bool is_valid_xtrnnum(scfg_t* cfg, int xtrnnum)
+{
+	return (xtrnnum >= 0) && (cfg != NULL) && (xtrnnum < cfg->total_xtrns);
+}
+
 bool is_valid_xtrnsec(scfg_t* cfg, int secnum)
 {
 	return (secnum >= 0) && (cfg != NULL) && (secnum < cfg->total_xtrnsecs);
diff --git a/src/sbbs3/userdat.c b/src/sbbs3/userdat.c
index f588d6e04e..11e20001b3 100644
--- a/src/sbbs3/userdat.c
+++ b/src/sbbs3/userdat.c
@@ -1106,7 +1106,7 @@ int opennodeext(scfg_t* cfg)
 }
 
 /****************************************************************************/
-/* Reads the data for node number 'number' into the structure 'node'        */
+/* Reads the data for 1-based node number 'number' into the node structure	*/
 /* from node.dab															*/
 /****************************************************************************/
 int getnodedat(scfg_t* cfg, uint number, node_t *node, bool lockit, int* fdp)
@@ -1157,6 +1157,7 @@ int getnodedat(scfg_t* cfg, uint number, node_t *node, bool lockit, int* fdp)
 
 /****************************************************************************/
 /* Write the data from the structure 'node' into node.dab  					*/
+/* number is the 1-based node number										*/
 /****************************************************************************/
 int putnodedat(scfg_t* cfg, uint number, node_t* node, bool closeit, int file)
 {
@@ -1395,6 +1396,8 @@ char* nodestatus(scfg_t* cfg, node_t* node, char* buf, size_t buflen, int num)
 	char	tmp[128];
 	char*	mer;
 	int		hour;
+	int		xtrnnum;
+	user_t	user = {0};
 
 	if(node==NULL) {
 		strncpy(buf,"(null)",buflen);
@@ -1467,13 +1470,18 @@ char* nodestatus(scfg_t* cfg, node_t* node, char* buf, size_t buflen, int num)
                     strcat(str,"posting auto-message");
                     break;
                 case NODE_XTRN:
-                    if(!node->aux)
+                    if(node->aux == 0) {
                         strcat(str,"at external program menu");
-                    else if(node->aux<=cfg->total_xtrns)
-                        sprintf(str+strlen(str),"running %s"
- 	                       ,cfg->xtrn[node->aux-1]->name);
-                    else
-                        sprintf(str+strlen(str),"running external program #%d"
+						break;
+					}
+					user.number = node->useron;
+					getuserdat(cfg, &user);
+					xtrnnum = getxtrnnum(cfg, user.curxtrn);
+					if(is_valid_xtrnnum(cfg, xtrnnum))
+						sprintf(str+strlen(str),"running %s"
+							,cfg->xtrn[xtrnnum]->name);
+					else
+						sprintf(str+strlen(str),"running external program #%d"
                             ,node->aux);
                     break;
                 case NODE_DFLT:
-- 
GitLab