From b02beaded21a5611cdbbe5cf56659b5119e27ad7 Mon Sep 17 00:00:00 2001
From: rswindell <>
Date: Wed, 11 Oct 2017 19:35:23 +0000
Subject: [PATCH] When saving file.cnf, write the corrected/actual number of
 total_dirs. If one or more directories has an invalid library number, then it
 won't be written and the previously stored "total_dirs" value would be wrong
 (and cause the loss of text file sections which follow directories in
 file.cnf).

---
 src/sbbs3/scfgsave.c | 107 ++++++++++++++++++++++++-------------------
 1 file changed, 59 insertions(+), 48 deletions(-)

diff --git a/src/sbbs3/scfgsave.c b/src/sbbs3/scfgsave.c
index 584bd70d6e..ed8a8e0516 100644
--- a/src/sbbs3/scfgsave.c
+++ b/src/sbbs3/scfgsave.c
@@ -863,71 +863,82 @@ BOOL DLLCALL write_file_cfg(scfg_t* cfg, int backup_level)
 
 	/* File Directories */
 
+	long total_dirs_offset = ftell(stream);
 	put_int(cfg->total_dirs,stream);
-	for(j=0;j<cfg->total_libs;j++)
-		for(i=0;i<cfg->total_dirs;i++)
-			if(cfg->dir[i]->lib==j) {
-				put_int(cfg->dir[i]->lib,stream);
-				put_str(cfg->dir[i]->lname,stream);
-				put_str(cfg->dir[i]->sname,stream);
-				put_str(cfg->dir[i]->code_suffix,stream);
+	uint16_t total_dirs = 0;
+	for (j = 0; j < cfg->total_libs; j++) {
+		for (i = 0; i < cfg->total_dirs; i++) {
+			if (cfg->dir[i]->lib == j) {
+				put_int(cfg->dir[i]->lib, stream);
+				put_str(cfg->dir[i]->lname, stream);
+				put_str(cfg->dir[i]->sname, stream);
+				put_str(cfg->dir[i]->code_suffix, stream);
 #if 1
-				if(cfg->dir[i]->data_dir[0]) {
+				if (cfg->dir[i]->data_dir[0]) {
 					backslash(cfg->dir[i]->data_dir);
 					md(cfg->dir[i]->data_dir);
 				}
 #endif
-				put_str(cfg->dir[i]->data_dir,stream);
-				put_str(cfg->dir[i]->arstr,stream);
-				put_str(cfg->dir[i]->ul_arstr,stream);
-				put_str(cfg->dir[i]->dl_arstr,stream);
-				put_str(cfg->dir[i]->op_arstr,stream);
+				put_str(cfg->dir[i]->data_dir, stream);
+				put_str(cfg->dir[i]->arstr, stream);
+				put_str(cfg->dir[i]->ul_arstr, stream);
+				put_str(cfg->dir[i]->dl_arstr, stream);
+				put_str(cfg->dir[i]->op_arstr, stream);
 				backslash(cfg->dir[i]->path);
-				put_str(cfg->dir[i]->path,stream);
+				put_str(cfg->dir[i]->path, stream);
 #if 1
-				if(cfg->dir[i]->misc&DIR_FCHK) {
-					SAFECOPY(path,cfg->dir[i]->path);
-					if(!path[0]) {		/* no file storage path specified */
-						SAFEPRINTF2(str,"%s%s"
-							,cfg->lib[cfg->dir[i]->lib]->code_prefix
-							,cfg->dir[i]->code_suffix);
+				if (cfg->dir[i]->misc&DIR_FCHK) {
+					SAFECOPY(path, cfg->dir[i]->path);
+					if (!path[0]) {		/* no file storage path specified */
+						SAFEPRINTF2(str, "%s%s"
+							, cfg->lib[cfg->dir[i]->lib]->code_prefix
+							, cfg->dir[i]->code_suffix);
 						strlwr(str);
-						safe_snprintf(path,sizeof(path),"%sdirs/%s/"
-							,cfg->data_dir
-							,str);
+						safe_snprintf(path, sizeof(path), "%sdirs/%s/"
+							, cfg->data_dir
+							, str);
 					}
-					else if(cfg->lib[cfg->dir[i]->lib]->parent_path[0]) {
-						SAFECOPY(path,cfg->lib[cfg->dir[i]->lib]->parent_path);
-						prep_dir(cfg->ctrl_dir,path,sizeof(path));
+					else if (cfg->lib[cfg->dir[i]->lib]->parent_path[0]) {
+						SAFECOPY(path, cfg->lib[cfg->dir[i]->lib]->parent_path);
+						prep_dir(cfg->ctrl_dir, path, sizeof(path));
 						md(path);
 						backslash(path);
-						strcat(path,cfg->dir[i]->path);
+						strcat(path, cfg->dir[i]->path);
 					}
 					else
-						prep_dir(cfg->ctrl_dir, path,sizeof(path));
-					md(path); 
+						prep_dir(cfg->ctrl_dir, path, sizeof(path));
+					md(path);
 				}
 #endif
 
-				put_str(cfg->dir[i]->upload_sem,stream);
-				put_int(cfg->dir[i]->maxfiles,stream);
-				put_str(cfg->dir[i]->exts,stream);
-				put_int(cfg->dir[i]->misc,stream);
-				put_int(cfg->dir[i]->seqdev,stream);
-				put_int(cfg->dir[i]->sort,stream);
-				put_str(cfg->dir[i]->ex_arstr,stream);
-				put_int(cfg->dir[i]->maxage,stream);
-				put_int(cfg->dir[i]->up_pct,stream);
-				put_int(cfg->dir[i]->dn_pct,stream);
-				c=0;
-				put_int(c,stream);
-				n=0;
-				for(k=0;k<8;k++)
-					put_int(n,stream);
-				n=0xffff;
-				for(k=0;k<16;k++)
-					put_int(n,stream);
-				}
+				put_str(cfg->dir[i]->upload_sem, stream);
+				put_int(cfg->dir[i]->maxfiles, stream);
+				put_str(cfg->dir[i]->exts, stream);
+				put_int(cfg->dir[i]->misc, stream);
+				put_int(cfg->dir[i]->seqdev, stream);
+				put_int(cfg->dir[i]->sort, stream);
+				put_str(cfg->dir[i]->ex_arstr, stream);
+				put_int(cfg->dir[i]->maxage, stream);
+				put_int(cfg->dir[i]->up_pct, stream);
+				put_int(cfg->dir[i]->dn_pct, stream);
+				c = 0;
+				put_int(c, stream);
+				n = 0;
+				for (k = 0; k < 8; k++)
+					put_int(n, stream);
+				n = 0xffff;
+				for (k = 0; k < 16; k++)
+					put_int(n, stream);
+				total_dirs++;
+			}
+		}
+	}
+
+	/* Write the actual number of directories */
+	long text_files_sec_offset = ftell(stream);
+	fseek(stream, total_dirs_offset, SEEK_SET);
+	put_int(total_dirs, stream);
+	fseek(stream, text_files_sec_offset, SEEK_SET);
 
 	/* Text File Sections */
 
-- 
GitLab