From 09c83e17cc83aeea369d117e155aa4efd4f0eea6 Mon Sep 17 00:00:00 2001
From: Rob Swindell <rob@synchro.net>
Date: Sun, 8 Nov 2020 18:20:19 -0800
Subject: [PATCH] Save/restore padding bytes in .cnf files (instead of writing
 0's).

Some padding bytes are expected to be 0xff's (not 0x00's) when
unused by configuration properties.

Also, this insures that this library is compatible with future .cnf files
(i.e. it won't over-write new configuration properties with 0's).
---
 exec/load/cnfdefs.js | 70 ++++++++++++++++++++++----------------------
 exec/load/cnflib.js  |  9 +++---
 2 files changed, 39 insertions(+), 40 deletions(-)

diff --git a/exec/load/cnfdefs.js b/exec/load/cnfdefs.js
index a56abf6e4b..543bb75ceb 100644
--- a/exec/load/cnfdefs.js
+++ b/exec/load/cnfdefs.js
@@ -47,13 +47,13 @@ struct.xedit_t={
 	settings:	{bytes:UINT32_T,		type:"int"},	// was misc
 	ars:		{bytes:LEN_ARSTR+1,		type:"str"},	// was arstr
 	type:		{bytes:UCHAR,			type:"int"},
-	__PADDING__:15
+	__PADDING__:{bytes:15}
 };
 struct.xtrnsec_t={
 	name:		{bytes:41,				type:"str"},
 	code:		{bytes:LEN_CODE+1,		type:"str"},
 	ars:		{bytes:LEN_ARSTR+1,		type:"str"},	// was arstr
-	__PADDING__:16
+	__PADDING__:{bytes:16}
 };
 struct.xtrn_t={
 	sec:			{bytes:UINT16_T,		type:"int"},
@@ -70,7 +70,7 @@ struct.xtrn_t={
 	startup_dir:	{bytes:LEN_DIR+1,		type:"str"},	// was path
 	textra:			{bytes:UCHAR,			type:"int"},
 	max_time:		{bytes:UCHAR,			type:"int"},	// was maxtime
-	__PADDING__:14
+	__PADDING__:{bytes:14}
 };
 struct.event_t={
 	code:			{bytes:LEN_CODE+1,		type:"str"},
@@ -83,7 +83,7 @@ struct.event_t={
 	freq:			{bytes:UINT16_T,		type:"int"},
 	mdays:			{bytes:UINT32_T,		type:"int"},
 	months:			{bytes:UINT16_T,		type:"int"},
-	__PADDING__:8
+	__PADDING__:{bytes:8}
 };
 struct.natvpgm_t={
 	name:		{bytes:13,				type:"str"},
@@ -92,7 +92,7 @@ struct.natvpgm_t={
 struct.hotkey_t={
 	key:		{bytes:UCHAR,			type:"int"},
 	cmd:		{bytes:LEN_CMD+1,		type:"str"},
-	__PADDING__:16
+	__PADDING__:{bytes:16}
 };
 
 /* message group/sub record structures */
@@ -130,7 +130,7 @@ struct.sub_t={
 	moderated_ars:	{bytes:LEN_ARSTR+1,		type:"str"},	// was mod_arstr
 	// *mod_ar;
 	qwk_conf:		{bytes:UINT16_T,		type:"int"},	// was qwkconf
-	__PADDING__:53
+	__PADDING__:{bytes:53}
 };
 struct.grp_t={
 	description:	{bytes:LEN_GLNAME+1,	type:"str"},	// was lname
@@ -138,7 +138,7 @@ struct.grp_t={
 	ars:			{bytes:LEN_ARSTR+1,		type:"str"},	// was arstr
 	code_prefix:	{bytes:LEN_CODE+1,		type:"str"},
 	// uchar		*ar;
-	__PADDING__:87
+	__PADDING__:{bytes:87}
 };
 struct.qhubsub_t={
 	conf:		{bytes:UINT16_T,		type:"int"},
@@ -159,7 +159,7 @@ struct.qhub_t={
 	// 			*conf;					/* Conference number of ea. */
 	// ulong	*sub;					/* Number of local sub-board for ea. */
 	// time32_t	last;					/* Last network attempt */
-	__PADDING__:64
+	__PADDING__:{bytes:64}
 };
 struct.phub_t={
 	days:		{bytes:1,				type:"str"},
@@ -169,7 +169,7 @@ struct.phub_t={
 	node:		{bytes:UINT16_T,		type:"str"},
 	freq:		{bytes:UINT16_T,		type:"str"},
 // time32_t	last;						/* Last network attempt */
-	__PADDING__:64
+	__PADDING__:{bytes:64}
 };
 
 struct.node_dir_t={
@@ -186,7 +186,7 @@ struct.validation_set_t={
 	cdt:		{bytes:UINT32_T,			type:"int"},
 	exempt:		{bytes:UINT32_T,			type:"int"},
 	rest:		{bytes:UINT32_T,			type:"int"},
-	__PADDING__:16
+	__PADDING__:{bytes:16}
 };
 
 struct.sec_level_t={
@@ -199,7 +199,7 @@ struct.sec_level_t={
 	emailperday:{bytes:UINT16_T,			type:"int"},
 	misc:		{bytes:UINT32_T,			type:"int"},
 	expireto:	{bytes:UCHAR,				type:"int"},
-	__PADDING__:11
+	__PADDING__:{bytes:11}
 };
 
 struct.cmd_shell_t={
@@ -207,7 +207,7 @@ struct.cmd_shell_t={
 	code:		{bytes:LEN_CODE+1,			type:"str"},
 	ars:		{bytes:LEN_ARSTR+1,			type:"str"},
 	misc:		{bytes:UINT32_T,			type:"int"},
-	__PADDING__:16
+	__PADDING__:{bytes:16}
 };
 
 /* NOTE: top-level data structures only below this point 
@@ -238,7 +238,7 @@ struct.main={
 	sys_deldays:		{bytes:UINT16_T,			type:"int"},
 	sys_exp_warn:		{bytes:UCHAR,				type:"int"},
 	sys_autodel:		{bytes:UINT16_T,			type:"int"},
-	__PADDING__:1,
+	__PADDING__:		{bytes:1},
 	sys_chat_ars:		{bytes:LEN_ARSTR+1,			type:"str"},	// sys_chat_ar
 	cdt_min_value:		{bytes:UINT16_T,			type:"int"},
 	max_minutes:		{bytes:UINT32_T,			type:"int"},
@@ -265,7 +265,7 @@ struct.main={
 	newuser_msgscan_init:		{bytes:UINT16_T,	type:"int"},	// new_msgcan_init
 	guest_msgscan_init:			{bytes:UINT16_T,	type:"int"},
 	min_pwlen:					{bytes:UCHAR,		type:"int"},
-	__PADDING1__:9,
+	__PADDING1__:				{bytes:9},
 	expired_level:				{bytes:UCHAR,		type:"int"},
 	expired_flags1:				{bytes:UINT32_T,	type:"int"},
 	expired_flags2:				{bytes:UINT32_T,	type:"int"},
@@ -290,12 +290,12 @@ struct.main={
 	textsec_mod:		{bytes:LEN_MODNAME+1,		type:"str"},
 	automsg_mod:		{bytes:LEN_MODNAME+1,		type:"str"},
 	xtrnsec_mod:		{bytes:LEN_MODNAME+1,		type:"str"},
-	__PADDING2__:34,
+	__PADDING2__:		{bytes:34},
 	nodelist_mod:		{bytes:LEN_CMD+1,			type:"str"},
 	whosonline_mod:		{bytes:LEN_CMD+1,			type:"str"},
 	privatemsg_mod:		{bytes:LEN_CMD+1,			type:"str"},
 	logonlist_mod:		{bytes:LEN_CMD+1,			type:"str"},
-	__PADDING3__:252,
+	__PADDING3__:		{bytes:252},
 	user_backup_level:	{bytes:UINT16_T,			type:"int"},
 	mail_backup_level:	{bytes:UINT16_T,			type:"int"},
 	validation_set:		{bytes:struct.validation_set_t, type:"lst", length: 10},
@@ -323,9 +323,9 @@ struct.msg={
 	preqwk_ars:		{bytes:LEN_ARSTR+1, 	type:"str"},	// preqwk_ar
 	smb_retry_time:	{bytes:UCHAR, 			type:"int"},
 	max_qwkmsgage:	{bytes:UINT16_T, 		type:"int"},
-	__PADDING1__:466,
+	__PADDING1__:	{bytes:466},
 	settings:		{bytes:UINT32_T, 		type:"int"},	// was msg_misc
-	__PADDING2__:510,
+	__PADDING2__:	{bytes:510},
 	grp:			{bytes:struct.grp_t, 	type:"lst"},
 	sub:			{bytes:struct.sub_t, 	type:"lst"},
 	fido_addr_list:	{bytes:struct.faddr_t, 	type:"lst"},
@@ -338,15 +338,15 @@ struct.msg={
 	fido_netmail_misc:	{bytes:UINT16_T, 	type:"int"},
 	fido_netmail_cost:	{bytes:UINT32_T, 	type:"int"},
 	fido_default_addr:	{bytes:struct.faddr_t, 	type:"obj"},
-	__PADDING3__:56,
+	__PADDING3__:	{bytes:56},
 	qwknet_default_tagline:{bytes:128, 		type:"str"},
 	qwknet_hub:		{bytes:struct.qhub_t, 	type:"lst"},
-	__PADDING4__:64,
-	__PADDING5__:11,
+	__PADDING4__:	{bytes:64},
+	__PADDING5__:	{bytes:11},
 	postlink_num:	{bytes:UINT32_T, 		type:"int"},
 	postlink_hub:	{bytes:struct.phub_t, 	type:"lst"},
 	postlink_name:	{bytes:13, 				type:"str"},
-	__PADDING6__:64,
+	__PADDING6__:	{bytes:64},
 	sys_inetaddr:	{bytes:128, 			type:"str"},
 	inetmail_sem:	{bytes:LEN_DIR+1, 		type:"str"},
 	inetmail_misc:	{bytes:UINT32_T, 		type:"str"},
@@ -378,7 +378,7 @@ struct.dir_t={
 	max_age:		{bytes:UINT16_T,		type:"int"},
 	upload_pct:		{bytes:UINT16_T,		type:"int"},
 	download_pct:	{bytes:UINT16_T,		type:"int"},
-	__PADDING__:49
+	__PADDING__:	{bytes:49}
 };
 struct.lib_t={
 	description:	{bytes:LEN_GLNAME+1,	type:"str"},
@@ -388,7 +388,7 @@ struct.lib_t={
 	code_prefix:	{bytes:LEN_CODE+1,		type:"str"},
 	sort:			{bytes:1,				type:"int"},
 	settings:		{bytes:UINT32_T,		type:"int"},
-	__PADDING__:34
+	__PADDING__:	{bytes:34}
 };
 
 /* Extractable File Types */
@@ -396,7 +396,7 @@ struct.fextr_t={
 	extension:		{bytes:4,				type:"str"},
 	cmd:			{bytes:LEN_CMD+1,		type:"str"},
 	ars:			{bytes:LEN_ARSTR+1,		type:"str"},
-	__PADDING__:16
+	__PADDING__:	{bytes:16}
 };
 
 /* Compressable File Types */
@@ -404,7 +404,7 @@ struct.fcomp_t={
 	extension:		{bytes:4,				type:"str"},
 	cmd:			{bytes:LEN_CMD+1,		type:"str"},
 	ars:			{bytes:LEN_ARSTR+1,		type:"str"},
-	__PADDING__:16
+	__PADDING__:	{bytes:16}
 };
 
 /* Viewable File Types */
@@ -412,7 +412,7 @@ struct.fview_t={
 	extension:		{bytes:4,				type:"str"},
 	cmd:			{bytes:LEN_CMD+1,		type:"str"},
 	ars:			{bytes:LEN_ARSTR+1,		type:"str"},
-	__PADDING__:16
+	__PADDING__:	{bytes:16}
 };
 
 /* Testable File Types */
@@ -421,7 +421,7 @@ struct.ftest_t={
 	cmd:			{bytes:LEN_CMD+1,		type:"str"},
 	working:		{bytes:41,				type:"str"},
 	ars:			{bytes:LEN_ARSTR+1,		type:"str"},
-	__PADDING__:16
+	__PADDING__:	{bytes:16}
 };
 
 /* Download Events */
@@ -430,7 +430,7 @@ struct.dlevent_t={
 	cmd:			{bytes:LEN_CMD+1,		type:"str"},
 	working:		{bytes:41,				type:"str"},
 	ars:			{bytes:LEN_ARSTR+1,		type:"str"},
-	__PADDING__:16
+	__PADDING__:	{bytes:16}
 };
 
 /* File Transfer Protocol (drivers) */
@@ -445,19 +445,19 @@ struct.prot_t={
 	bicmd:			{bytes:LEN_CMD+1,		type:"str"},
 	settings:		{bytes:UINT32_T,		type:"int"},	// misc
 	ars:			{bytes:LEN_ARSTR+1,		type:"str"},
-	__PADDING__:16
+	__PADDING__:	{bytes:16}
 };
 
 struct.altpath_t={
 	path:			{bytes:LEN_DIR+1,		type:"str"},
-	__PADDING__:16
+	__PADDING__:	{bytes:16}
 };
 
 struct.txtsec_t={
 	name:			{bytes:41,				type:"str"},
 	code:			{bytes:LEN_CODE+1,		type:"str"},
 	ars:			{bytes:LEN_ARSTR+1,		type:"str"},
-	__PADDING__:16
+	__PADDING__:	{bytes:16}
 };
 
 /* file transfer configuration (file.cnf) */
@@ -466,14 +466,14 @@ struct.file={
 	max_batup:		{bytes:UINT16_T,		type:"int"},
 	max_batdn:		{bytes:UINT16_T,		type:"int"},
 	max_userxfer:	{bytes:UINT16_T,		type:"int"},
-	__PADDING1__:4,
+	__PADDING1__:	{bytes:4},
 	cdt_up_pct:		{bytes:UINT16_T,		type:"int"},
 	cdt_dn_pct:		{bytes:UINT16_T,		type:"int"},
-	__PADDING2__:68,
+	__PADDING2__:	{bytes:68},
 	leech_pct:		{bytes:UINT16_T,		type:"int"},
 	leech_sec:		{bytes:UINT16_T,		type:"int"},
 	settings:		{bytes:UINT32_T,		type:"int"},
-	__PADDING3__:60,
+	__PADDING3__:	{bytes:60},
 	fextr:			{bytes:struct.fextr_t,	type:"lst"},
 	fcomp:			{bytes:struct.fcomp_t,	type:"lst"},
 	fview:			{bytes:struct.fview_t,	type:"lst"},
diff --git a/exec/load/cnflib.js b/exec/load/cnflib.js
index 7078eaaf4b..ff797c7b66 100644
--- a/exec/load/cnflib.js
+++ b/exec/load/cnflib.js
@@ -42,13 +42,12 @@ var CNF = new (function() {
 
 	/* get record padding */
 	function getPadding(file,bytes) {
-		file.position += bytes;
-		return false;
+		return file.read(bytes);
 	}
 
 	/* set record padding */
-	function setPadding(file,bytes) {
-		setStr(file,bytes,"");
+	function setPadding(file,struct) {
+		file.write(struct.data,struct.bytes);
 	}
 
 	/* read a set of records from *.cnf */
@@ -70,7 +69,7 @@ var CNF = new (function() {
 			if(file.eof)
 				break;
 			if(p.match(/__PADDING\d*__/))
-				getPadding(file,struct[p]);
+				struct[p].data = getPadding(file,struct[p].bytes);
 			else {
 				switch(struct[p].type) {
 				case "int":
-- 
GitLab