From c6808b3f554dc2b39b7e05b744e792a2d0953b78 Mon Sep 17 00:00:00 2001
From: Rob Swindell <rob@synchro.net>
Date: Sun, 22 Nov 2020 21:03:35 -0800
Subject: [PATCH] The great C function dependency refactor of 2020

The goal of this commit is that: only modules that either are part-of sbbs.dll/libsbbs.so or need to link with/use that library, will #include "sbbs.h" and thus be dependent on its subsequent includes (e.g. cryptlib.h, jsapi.h). This should mean extdeps.mk can be trimmed way down.

I also removed CVS keyword/comments and trimmed up the boilerplate copyright notice in modified and added source/header files in this commit.

There is no functional change in behavior in this comment.
---
 src/sbbs3/addfiles.c      |  25 +++-----
 src/sbbs3/allusers.c      |  17 +----
 src/sbbs3/ars.c           |  18 +-----
 src/sbbs3/dat_rec.c       |  20 +-----
 src/sbbs3/date_str.c      |  19 +-----
 src/sbbs3/date_str.h      |  46 +++++++++++++
 src/sbbs3/delfiles.c      |  23 ++-----
 src/sbbs3/dllexport.h     |  13 ++++
 src/sbbs3/dstsedit.c      |   5 +-
 src/sbbs3/dupefind.c      |  28 ++++++--
 src/sbbs3/echocfg.c       |  18 +-----
 src/sbbs3/filedat.c       |  38 ++++-------
 src/sbbs3/filedat.h       |  52 +++++++++++++++
 src/sbbs3/filelist.c      |  25 +++-----
 src/sbbs3/getmail.c       |  16 +----
 src/sbbs3/getmail.h       |  40 ++++++++++++
 src/sbbs3/getstats.h      |  39 +++++++++++
 src/sbbs3/load_cfg.c      |  23 +++----
 src/sbbs3/load_cfg.h      |  43 +++++++++++++
 src/sbbs3/makeuser.c      |  22 ++-----
 src/sbbs3/msg_id.c        |  17 +----
 src/sbbs3/msg_id.h        |  43 +++++++++++++
 src/sbbs3/msgdate.c       |  21 ++----
 src/sbbs3/msgdate.h       |  41 ++++++++++++
 src/sbbs3/nopen.c         |  21 +-----
 src/sbbs3/qwknodes.c      |  20 ++----
 src/sbbs3/rechocfg.c      |  16 +----
 src/sbbs3/sbbs.h          | 132 +++-----------------------------------
 src/sbbs3/sbbsecho.c      |  29 ++++-----
 src/sbbs3/sbbsecho.h      |  15 +----
 src/sbbs3/scfg/scfg.c     |  15 -----
 src/sbbs3/scfg/scfg.h     |  24 +++----
 src/sbbs3/scfg/scfgchat.c |  12 ----
 src/sbbs3/scfg/scfgmsg.c  |  13 +---
 src/sbbs3/scfglib1.c      |  26 +-------
 src/sbbs3/scfglib2.c      |  19 +-----
 src/sbbs3/scfgsave.c      |  20 ++----
 src/sbbs3/scfgsave.h      |  45 +++++++++++++
 src/sbbs3/smbactiv.c      |  29 +++++++--
 src/sbbs3/smbutil.c       |  19 +-----
 src/sbbs3/str_util.c      |  16 +----
 src/sbbs3/str_util.h      |  73 +++++++++++++++++++++
 src/sbbs3/userdat.c       |  28 ++++----
 src/sbbs3/userdat.h       |  34 +---------
 44 files changed, 622 insertions(+), 636 deletions(-)
 create mode 100644 src/sbbs3/date_str.h
 create mode 100644 src/sbbs3/dllexport.h
 create mode 100644 src/sbbs3/filedat.h
 create mode 100644 src/sbbs3/getmail.h
 create mode 100644 src/sbbs3/getstats.h
 create mode 100644 src/sbbs3/load_cfg.h
 create mode 100644 src/sbbs3/msg_id.h
 create mode 100644 src/sbbs3/msgdate.h
 create mode 100644 src/sbbs3/scfgsave.h
 create mode 100644 src/sbbs3/str_util.h

diff --git a/src/sbbs3/addfiles.c b/src/sbbs3/addfiles.c
index d087ae9f6b..090f3f3a17 100644
--- a/src/sbbs3/addfiles.c
+++ b/src/sbbs3/addfiles.c
@@ -1,7 +1,5 @@
 /* Program to add files to a Synchronet file database */
 
-/* $Id: addfiles.c,v 1.63 2020/08/17 00:48:27 rswindell Exp $ */
-
 /****************************************************************************
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
@@ -15,26 +13,21 @@
  * See the GNU General Public License for more details: gpl.txt or			*
  * http://www.fsf.org/copyleft/gpl.html										*
  *																			*
- * Anonymous FTP access to the most recent released source is available at	*
- * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net	*
- *																			*
- * Anonymous CVS access to the development source and modification history	*
- * is available at cvs.synchro.net:/cvsroot/sbbs, example:					*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login			*
- *     (just hit return, no password is necessary)							*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src		*
- *																			*
  * For Synchronet coding style and modification guidelines, see				*
  * http://www.synchro.net/source.html										*
  *																			*
- * You are encouraged to submit any modifications (preferably in Unix diff	*
- * format) via e-mail to mods@synchro.net									*
- *																			*
  * Note: If this box doesn't appear square, then you need to fix your tabs.	*
  ****************************************************************************/
 
-#include "sbbs.h"
+#include "nopen.h"
+#include "str_util.h"
+#include "datewrap.h"
+#include "date_str.h"
+#include "userdat.h"
+#include "filedat.h"
+#include "load_cfg.h"
 #include <stdbool.h>
+#include <stdarg.h>
 
 #define ADDFILES_VER "3.04"
 
@@ -600,7 +593,7 @@ void synclist(char *inpath, int dirnum)
 		printf("ERR_ALLOC %s\n",str);
 		return;
 	}
-	if(lread(file,ixbbuf,length)!=length) {
+	if(read(file,ixbbuf,length)!=length) {
 		close(file);
 		free((char *)ixbbuf);
 		printf("ERR_READ %s\n",str);
diff --git a/src/sbbs3/allusers.c b/src/sbbs3/allusers.c
index ef8d3525f1..7ac0bdec2e 100644
--- a/src/sbbs3/allusers.c
+++ b/src/sbbs3/allusers.c
@@ -1,5 +1,3 @@
-/* $Id: allusers.c,v 1.7 2018/02/20 11:56:26 rswindell Exp $ */
-
 /****************************************************************************
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
@@ -13,21 +11,9 @@
  * See the GNU General Public License for more details: gpl.txt or			*
  * http://www.fsf.org/copyleft/gpl.html										*
  *																			*
- * Anonymous FTP access to the most recent released source is available at	*
- * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net	*
- *																			*
- * Anonymous CVS access to the development source and modification history	*
- * is available at cvs.synchro.net:/cvsroot/sbbs, example:					*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login			*
- *     (just hit return, no password is necessary)							*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src		*
- *																			*
  * For Synchronet coding style and modification guidelines, see				*
  * http://www.synchro.net/source.html										*
  *																			*
- * You are encouraged to submit any modifications (preferably in Unix diff	*
- * format) via e-mail to mods@synchro.net									*
- *																			*
  * Note: If this box doesn't appear square, then you need to fix your tabs.	*
  ****************************************************************************/
 
@@ -37,7 +23,8 @@
 #include <stdlib.h>
 #include <sys/stat.h>
 
-#include "sbbs.h"
+#include "sbbsdefs.h"
+#include "str_util.h"
 
 int  min=0,max=99;
 long reqflags[4]={0},reqrest=0,reqexempt=0;
diff --git a/src/sbbs3/ars.c b/src/sbbs3/ars.c
index d03edddd55..0acc14dd23 100644
--- a/src/sbbs3/ars.c
+++ b/src/sbbs3/ars.c
@@ -1,9 +1,5 @@
-/* ars.c */
-
 /* Synchronet Access Requirement String (ARS) functions */
 
-/* $Id: ars.c,v 1.24 2020/05/14 07:49:58 rswindell Exp $ */
-
 /****************************************************************************
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
@@ -17,25 +13,13 @@
  * See the GNU General Public License for more details: gpl.txt or			*
  * http://www.fsf.org/copyleft/gpl.html										*
  *																			*
- * Anonymous FTP access to the most recent released source is available at	*
- * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net	*
- *																			*
- * Anonymous CVS access to the development source and modification history	*
- * is available at cvs.synchro.net:/cvsroot/sbbs, example:					*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login			*
- *     (just hit return, no password is necessary)							*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src		*
- *																			*
  * For Synchronet coding style and modification guidelines, see				*
  * http://www.synchro.net/source.html										*
  *																			*
- * You are encouraged to submit any modifications (preferably in Unix diff	*
- * format) via e-mail to mods@synchro.net									*
- *																			*
  * Note: If this box doesn't appear square, then you need to fix your tabs.	*
  ****************************************************************************/
 
-#include "sbbs.h"
+#include "ars_defs.h"
 
 static BOOL ar_string_arg(int artype)
 {
diff --git a/src/sbbs3/dat_rec.c b/src/sbbs3/dat_rec.c
index b8ccaf78a0..c985970428 100644
--- a/src/sbbs3/dat_rec.c
+++ b/src/sbbs3/dat_rec.c
@@ -1,9 +1,5 @@
-/* dat_rec.c */
-
 /* Synchronet text data-related routines (exported) */
 
-/* $Id: dat_rec.c,v 1.3 2018/02/20 11:56:26 rswindell Exp $ */
-
 /****************************************************************************
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
@@ -17,25 +13,15 @@
  * See the GNU General Public License for more details: gpl.txt or			*
  * http://www.fsf.org/copyleft/gpl.html										*
  *																			*
- * Anonymous FTP access to the most recent released source is available at	*
- * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net	*
- *																			*
- * Anonymous CVS access to the development source and modification history	*
- * is available at cvs.synchro.net:/cvsroot/sbbs, example:					*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login			*
- *     (just hit return, no password is necessary)							*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src		*
- *																			*
  * For Synchronet coding style and modification guidelines, see				*
  * http://www.synchro.net/source.html										*
  *																			*
- * You are encouraged to submit any modifications (preferably in Unix diff	*
- * format) via e-mail to mods@synchro.net									*
- *																			*
  * Note: If this box doesn't appear square, then you need to fix your tabs.	*
  ****************************************************************************/
 
-#include "sbbs.h"
+#include "dat_rec.h"
+#include "gen_defs.h"
+#include <string.h>
 
 /****************************************************************************/
 /* Places into 'strout' CR or ETX terminated string starting at             */
diff --git a/src/sbbs3/date_str.c b/src/sbbs3/date_str.c
index c2f2b4d384..4da3fc1a2e 100644
--- a/src/sbbs3/date_str.c
+++ b/src/sbbs3/date_str.c
@@ -1,9 +1,5 @@
-/* date_str.c */
-
 /* Synchronet date/time string conversion routines */
 
-/* $Id: date_str.c,v 1.29 2016/05/27 07:44:46 rswindell Exp $ */
-
 /****************************************************************************
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
@@ -17,25 +13,14 @@
  * See the GNU General Public License for more details: gpl.txt or			*
  * http://www.fsf.org/copyleft/gpl.html										*
  *																			*
- * Anonymous FTP access to the most recent released source is available at	*
- * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net	*
- *																			*
- * Anonymous CVS access to the development source and modification history	*
- * is available at cvs.synchro.net:/cvsroot/sbbs, example:					*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login			*
- *     (just hit return, no password is necessary)							*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src		*
- *																			*
  * For Synchronet coding style and modification guidelines, see				*
  * http://www.synchro.net/source.html										*
  *																			*
- * You are encouraged to submit any modifications (preferably in Unix diff	*
- * format) via e-mail to mods@synchro.net									*
- *																			*
  * Note: If this box doesn't appear square, then you need to fix your tabs.	*
  ****************************************************************************/
 
-#include "sbbs.h"
+#include "date_str.h"
+#include "datewrap.h"
 
 const char *wday[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
 const char *mon[]={"Jan","Feb","Mar","Apr","May","Jun"
diff --git a/src/sbbs3/date_str.h b/src/sbbs3/date_str.h
new file mode 100644
index 0000000000..013d0eede4
--- /dev/null
+++ b/src/sbbs3/date_str.h
@@ -0,0 +1,46 @@
+/* Synchronet date/time string conversion routines */
+
+/****************************************************************************
+ * @format.tab-size 4		(Plain Text/Source Code File Header)			*
+ * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
+ *																			*
+ * Copyright Rob Swindell - http://www.synchro.net/copyright.html			*
+ *																			*
+ * This program is free software; you can redistribute it and/or			*
+ * modify it under the terms of the GNU General Public License				*
+ * as published by the Free Software Foundation; either version 2			*
+ * of the License, or (at your option) any later version.					*
+ * See the GNU General Public License for more details: gpl.txt or			*
+ * http://www.fsf.org/copyleft/gpl.html										*
+ *																			*
+ * For Synchronet coding style and modification guidelines, see				*
+ * http://www.synchro.net/source.html										*
+ *																			*
+ * Note: If this box doesn't appear square, then you need to fix your tabs.	*
+ ****************************************************************************/
+
+#ifndef _DATE_STR_H_
+#define _DATE_STR_H_
+
+#include "scfgdefs.h"	// scfg_t
+#include "dllexport.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern const char* wday[];	/* abbreviated weekday names */
+extern const char* mon[];	/* abbreviated month names */
+
+DLLEXPORT char *	zonestr(short zone);
+DLLEXPORT time32_t	dstrtounix(scfg_t*, const char *str);
+DLLEXPORT char *	unixtodstr(scfg_t*, time32_t, char *str);
+DLLEXPORT char *	sectostr(uint sec, char *str);
+DLLEXPORT char *	seconds_to_str(uint, char*);
+DLLEXPORT char *	hhmmtostr(scfg_t* cfg, struct tm* tm, char* str);
+DLLEXPORT char *	timestr(scfg_t* cfg, time32_t intime, char* str);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* Don't add anything after this line */
\ No newline at end of file
diff --git a/src/sbbs3/delfiles.c b/src/sbbs3/delfiles.c
index 0aa828d7e5..c38e8fad6d 100644
--- a/src/sbbs3/delfiles.c
+++ b/src/sbbs3/delfiles.c
@@ -1,9 +1,5 @@
-/* delfiles.c */
-
 /* Program to delete expired files from a Synchronet file database */
 
-/* $Id: delfiles.c,v 1.14 2020/08/17 00:48:28 rswindell Exp $ */
-
 /****************************************************************************
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
@@ -17,25 +13,18 @@
  * See the GNU General Public License for more details: gpl.txt or			*
  * http://www.fsf.org/copyleft/gpl.html										*
  *																			*
- * Anonymous FTP access to the most recent released source is available at	*
- * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net	*
- *																			*
- * Anonymous CVS access to the development source and modification history	*
- * is available at cvs.synchro.net:/cvsroot/sbbs, example:					*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login			*
- *     (just hit return, no password is necessary)							*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src		*
- *																			*
  * For Synchronet coding style and modification guidelines, see				*
  * http://www.synchro.net/source.html										*
  *																			*
- * You are encouraged to submit any modifications (preferably in Unix diff	*
- * format) via e-mail to mods@synchro.net									*
- *																			*
  * Note: If this box doesn't appear square, then you need to fix your tabs.	*
  ****************************************************************************/
 
-#include "sbbs.h"
+#include "scfgdefs.h"
+#include "load_cfg.h"
+#include "filedat.h"
+#include "nopen.h"
+#include "str_util.h"
+#include <stdarg.h>
 
 #define DELFILES_VER "1.01"
 
diff --git a/src/sbbs3/dllexport.h b/src/sbbs3/dllexport.h
new file mode 100644
index 0000000000..5308120b53
--- /dev/null
+++ b/src/sbbs3/dllexport.h
@@ -0,0 +1,13 @@
+#ifdef DLLEXPORT
+#undef DLLEXPORT
+#endif
+#if defined(_WIN32) && ! defined(__MINGW32__)
+	#ifdef SBBS_EXPORTS
+		#define DLLEXPORT	__declspec(dllexport)
+	#else
+		#define DLLEXPORT	__declspec(dllimport)
+	#endif
+#endif
+#ifndef DLLEXPORT
+#define DLLEXPORT
+#endif
diff --git a/src/sbbs3/dstsedit.c b/src/sbbs3/dstsedit.c
index 18fc8a2785..3e3c4b53ac 100644
--- a/src/sbbs3/dstsedit.c
+++ b/src/sbbs3/dstsedit.c
@@ -37,11 +37,12 @@
 #include <errno.h>
 #include <stdlib.h>
 
-#include "sbbs.h"
+#include "str_util.h"
 #include "dirwrap.h"
 #include "nopen.h"
-#include "sbbsdefs.h"
+#include "scfgdefs.h"
 #include "conwrap.h"
+#include "date_str.h"
 
 int 
 main(int argc, char **argv)
diff --git a/src/sbbs3/dupefind.c b/src/sbbs3/dupefind.c
index 61cf7ef0aa..554436aace 100644
--- a/src/sbbs3/dupefind.c
+++ b/src/sbbs3/dupefind.c
@@ -1,8 +1,28 @@
-/* $Id: dupefind.c,v 1.8 2020/08/17 00:48:28 rswindell Exp $ */
-// vi: tabstop=4
-
-#include "sbbs.h"
+/****************************************************************************
+ * @format.tab-size 4		(Plain Text/Source Code File Header)			*
+ * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
+ *																			*
+ * Copyright Rob Swindell - http://www.synchro.net/copyright.html			*
+ *																			*
+ * This program is free software; you can redistribute it and/or			*
+ * modify it under the terms of the GNU General Public License				*
+ * as published by the Free Software Foundation; either version 2			*
+ * of the License, or (at your option) any later version.					*
+ * See the GNU General Public License for more details: gpl.txt or			*
+ * http://www.fsf.org/copyleft/gpl.html										*
+ *																			*
+ * For Synchronet coding style and modification guidelines, see				*
+ * http://www.synchro.net/source.html										*
+ *																			*
+ * Note: If this box doesn't appear square, then you need to fix your tabs.	*
+ ****************************************************************************/
+
+#include "scfgdefs.h"
+#include "str_util.h"
+#include "load_cfg.h"
+#include "nopen.h"
 #include "crc32.h"
+#include <stdarg.h>
 
 #define DUPEFIND_VER "1.02"
 
diff --git a/src/sbbs3/echocfg.c b/src/sbbs3/echocfg.c
index e491e5395f..ec7e8e3ce4 100644
--- a/src/sbbs3/echocfg.c
+++ b/src/sbbs3/echocfg.c
@@ -1,7 +1,5 @@
 /* FidoNet configuration utility 											*/
 
-/* $Id: echocfg.c,v 3.58 2020/08/17 00:48:28 rswindell Exp $ */
-
 /****************************************************************************
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
@@ -15,21 +13,9 @@
  * See the GNU General Public License for more details: gpl.txt or			*
  * http://www.fsf.org/copyleft/gpl.html										*
  *																			*
- * Anonymous FTP access to the most recent released source is available at	*
- * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net	*
- *																			*
- * Anonymous CVS access to the development source and modification history	*
- * is available at cvs.synchro.net:/cvsroot/sbbs, example:					*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login			*
- *     (just hit return, no password is necessary)							*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src		*
- *																			*
  * For Synchronet coding style and modification guidelines, see				*
  * http://www.synchro.net/source.html										*
  *																			*
- * You are encouraged to submit any modifications (preferably in Unix diff	*
- * format) via e-mail to mods@synchro.net									*
- *																			*
  * Note: If this box doesn't appear square, then you need to fix your tabs.	*
  ****************************************************************************/
 
@@ -45,8 +31,10 @@
 #define __COLORS
 #include "ciolib.h"
 #include "uifc.h"
-#include "sbbs.h"
+#include "scfgdefs.h"
 #include "sbbsecho.h"
+#include "sockwrap.h"
+#include "str_util.h"
 
 char **opt;
 
diff --git a/src/sbbs3/filedat.c b/src/sbbs3/filedat.c
index a47c1cc5ac..11f8e7625e 100644
--- a/src/sbbs3/filedat.c
+++ b/src/sbbs3/filedat.c
@@ -1,9 +1,5 @@
-/* filedat.c */
-
 /* Synchronet file database-related exported functions */
 
-/* $Id: filedat.c,v 1.40 2019/01/12 08:11:13 rswindell Exp $ */
-
 /****************************************************************************
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
@@ -17,25 +13,19 @@
  * See the GNU General Public License for more details: gpl.txt or			*
  * http://www.fsf.org/copyleft/gpl.html										*
  *																			*
- * Anonymous FTP access to the most recent released source is available at	*
- * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net	*
- *																			*
- * Anonymous CVS access to the development source and modification history	*
- * is available at cvs.synchro.net:/cvsroot/sbbs, example:					*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login			*
- *     (just hit return, no password is necessary)							*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src		*
- *																			*
  * For Synchronet coding style and modification guidelines, see				*
  * http://www.synchro.net/source.html										*
  *																			*
- * You are encouraged to submit any modifications (preferably in Unix diff	*
- * format) via e-mail to mods@synchro.net									*
- *																			*
  * Note: If this box doesn't appear square, then you need to fix your tabs.	*
  ****************************************************************************/
 
-#include "sbbs.h"
+#include "filedat.h"
+#include "dat_rec.h"
+#include "datewrap.h"	// time32()
+#include "str_util.h"
+#include "nopen.h"
+
+static char* crlf = "\r\n";
 
 /****************************************************************************/
 /* Gets filedata from dircode.DAT file										*/
@@ -246,7 +236,7 @@ BOOL DLLCALL addfiledat(scfg_t* cfg, file_t* f)
 			close(file);
 			return(FALSE); 
 		}
-		if(lread(file,ixbbuf,length)!=length) {
+		if(read(file,ixbbuf,length)!=length) {
 			close(file);
 			free(ixbbuf);
 			return(FALSE); 
@@ -293,7 +283,7 @@ BOOL DLLCALL addfiledat(scfg_t* cfg, file_t* f)
 		}
 		write(file,&f->dateuled,4);
 		write(file,&f->datedled,4);              /* Write 0 for datedled */
-		if(lwrite(file,&ixbbuf[l],length-l)!=length-l) { /* Write rest of IXB */
+		if(write(file,&ixbbuf[l],length-l)!=length-l) { /* Write rest of IXB */
 			close(file);
 			free(ixbbuf);
 			return(FALSE); 
@@ -342,7 +332,7 @@ BOOL DLLCALL getfileixb(scfg_t* cfg, file_t* f)
 		close(file);
 		return(FALSE); 
 	}
-	if(lread(file,ixbbuf,length)!=length) {
+	if(read(file,ixbbuf,length)!=length) {
 		close(file);
 		free(ixbbuf);
 		return(FALSE); 
@@ -393,7 +383,7 @@ BOOL DLLCALL putfileixb(scfg_t* cfg, file_t* f)
 		close(file);
 		return(FALSE); 
 	}
-	if(lread(file,ixbbuf,length)!=length) {
+	if(read(file,ixbbuf,length)!=length) {
 		close(file);
 		free(ixbbuf);
 		return(FALSE); 
@@ -449,7 +439,7 @@ BOOL DLLCALL removefiledat(scfg_t* cfg, file_t* f)
 		close(file);
 		return(FALSE); 
 	}
-	if(lread(file,ixbbuf,length)!=length) {
+	if(read(file,ixbbuf,length)!=length) {
 		close(file);
 		free(ixbbuf);
 		return(FALSE); 
@@ -464,7 +454,7 @@ BOOL DLLCALL removefiledat(scfg_t* cfg, file_t* f)
 			ixbname[i]=ixbbuf[l+i];
 		ixbname[i]=0;
 		if(stricmp(ixbname,fname))
-			if(lwrite(file,&ixbbuf[l],F_IXBSIZE)!=F_IXBSIZE) {
+			if(write(file,&ixbbuf[l],F_IXBSIZE)!=F_IXBSIZE) {
 				close(file);
 				free(ixbbuf);
 				return(FALSE); 
@@ -514,7 +504,7 @@ BOOL DLLCALL findfile(scfg_t* cfg, uint dirnum, char *filename)
 		close(file);
 		return(FALSE); 
 	}
-	if(lread(file,ixbbuf,length)!=length) {
+	if(read(file,ixbbuf,length)!=length) {
 		close(file);
 		free(ixbbuf);
 		return(FALSE); 
diff --git a/src/sbbs3/filedat.h b/src/sbbs3/filedat.h
new file mode 100644
index 0000000000..67f3d3e837
--- /dev/null
+++ b/src/sbbs3/filedat.h
@@ -0,0 +1,52 @@
+/* Synchronet Filebase Access functions */
+
+/****************************************************************************
+ * @format.tab-size 4		(Plain Text/Source Code File Header)			*
+ * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
+ *																			*
+ * Copyright Rob Swindell - http://www.synchro.net/copyright.html			*
+ *																			*
+ * This program is free software; you can redistribute it and/or			*
+ * modify it under the terms of the GNU General Public License				*
+ * as published by the Free Software Foundation; either version 2			*
+ * of the License, or (at your option) any later version.					*
+ * See the GNU General Public License for more details: gpl.txt or			*
+ * http://www.fsf.org/copyleft/gpl.html										*
+ *																			*
+ * For Synchronet coding style and modification guidelines, see				*
+ * http://www.synchro.net/source.html										*
+ *																			*
+ * Note: If this box doesn't appear square, then you need to fix your tabs.	*
+ ****************************************************************************/
+
+#ifndef _FILEDAT_H_
+#define _FILEDAT_H_
+
+#include "scfgdefs.h"	// scfg_t
+#include "dllexport.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+DLLEXPORT BOOL		getfileixb(scfg_t* cfg, file_t* f);
+DLLEXPORT BOOL		putfileixb(scfg_t* cfg, file_t* f);
+DLLEXPORT BOOL		getfiledat(scfg_t* cfg, file_t* f);
+DLLEXPORT BOOL		putfiledat(scfg_t* cfg, file_t* f);
+DLLEXPORT void		putextdesc(scfg_t* cfg, uint dirnum, ulong datoffset, char *ext);
+DLLEXPORT void		getextdesc(scfg_t* cfg, uint dirnum, ulong datoffset, char *ext);
+DLLEXPORT char*		getfilepath(scfg_t* cfg, file_t* f, char* path);
+
+DLLEXPORT BOOL		removefiledat(scfg_t* cfg, file_t* f);
+DLLEXPORT BOOL		addfiledat(scfg_t* cfg, file_t* f);
+DLLEXPORT BOOL		findfile(scfg_t* cfg, uint dirnum, char *filename);
+DLLEXPORT char *	padfname(const char *filename, char *str);
+DLLEXPORT char *	unpadfname(const char *filename, char *str);
+DLLEXPORT BOOL		rmuserxfers(scfg_t* cfg, int fromuser, int destuser, char *fname);
+
+DLLEXPORT int		update_uldate(scfg_t* cfg, file_t* f);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* Don't add anything after this line */
\ No newline at end of file
diff --git a/src/sbbs3/filelist.c b/src/sbbs3/filelist.c
index dfed141029..ee1a762714 100644
--- a/src/sbbs3/filelist.c
+++ b/src/sbbs3/filelist.c
@@ -1,11 +1,7 @@
-/* filelist.c */
-
 /* Utility to create list of files from Synchronet file directories */
 /* Default list format is FILES.BBS, but file size, uploader, upload date */
 /* and other information can be included. */
 
-/* $Id: filelist.c,v 1.22 2020/08/17 00:48:28 rswindell Exp $ */
-
 /****************************************************************************
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
@@ -19,25 +15,20 @@
  * See the GNU General Public License for more details: gpl.txt or			*
  * http://www.fsf.org/copyleft/gpl.html										*
  *																			*
- * Anonymous FTP access to the most recent released source is available at	*
- * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net	*
- *																			*
- * Anonymous CVS access to the development source and modification history	*
- * is available at cvs.synchro.net:/cvsroot/sbbs, example:					*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login			*
- *     (just hit return, no password is necessary)							*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src		*
- *																			*
  * For Synchronet coding style and modification guidelines, see				*
  * http://www.synchro.net/source.html										*
  *																			*
- * You are encouraged to submit any modifications (preferably in Unix diff	*
- * format) via e-mail to mods@synchro.net									*
- *																			*
  * Note: If this box doesn't appear square, then you need to fix your tabs.	*
  ****************************************************************************/
 
-#include "sbbs.h"
+#include "datewrap.h"
+#include "load_cfg.h"
+#include "str_util.h"
+#include "date_str.h"
+#include "nopen.h"
+#include "filedat.h"
+#include "dat_rec.h"
+#include <stdarg.h>
 
 #define FILELIST_VER "3.15"
 
diff --git a/src/sbbs3/getmail.c b/src/sbbs3/getmail.c
index fbd4580239..a38d143906 100644
--- a/src/sbbs3/getmail.c
+++ b/src/sbbs3/getmail.c
@@ -1,7 +1,5 @@
 /* Synchronet DLL-exported mail-related routines */
 
-/* $Id: getmail.c,v 1.20 2018/12/30 04:33:48 rswindell Exp $ */
-
 /****************************************************************************
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
@@ -15,25 +13,13 @@
  * See the GNU General Public License for more details: gpl.txt or			*
  * http://www.fsf.org/copyleft/gpl.html										*
  *																			*
- * Anonymous FTP access to the most recent released source is available at	*
- * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net	*
- *																			*
- * Anonymous CVS access to the development source and modification history	*
- * is available at cvs.synchro.net:/cvsroot/sbbs, example:					*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login			*
- *     (just hit return, no password is necessary)							*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src		*
- *																			*
  * For Synchronet coding style and modification guidelines, see				*
  * http://www.synchro.net/source.html										*
  *																			*
- * You are encouraged to submit any modifications (preferably in Unix diff	*
- * format) via e-mail to mods@synchro.net									*
- *																			*
  * Note: If this box doesn't appear square, then you need to fix your tabs.	*
  ****************************************************************************/
 
-#include "sbbs.h"
+#include "getmail.h"
 
 /****************************************************************************/
 /* Returns the number of pieces of mail waiting for usernumber              */
diff --git a/src/sbbs3/getmail.h b/src/sbbs3/getmail.h
new file mode 100644
index 0000000000..949db78e9d
--- /dev/null
+++ b/src/sbbs3/getmail.h
@@ -0,0 +1,40 @@
+/****************************************************************************
+ * @format.tab-size 4		(Plain Text/Source Code File Header)			*
+ * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
+ *																			*
+ * Copyright Rob Swindell - http://www.synchro.net/copyright.html			*
+ *																			*
+ * This program is free software; you can redistribute it and/or			*
+ * modify it under the terms of the GNU General Public License				*
+ * as published by the Free Software Foundation; either version 2			*
+ * of the License, or (at your option) any later version.					*
+ * See the GNU General Public License for more details: gpl.txt or			*
+ * http://www.fsf.org/copyleft/gpl.html										*
+ *																			*
+ * For Synchronet coding style and modification guidelines, see				*
+ * http://www.synchro.net/source.html										*
+ *																			*
+ * Note: If this box doesn't appear square, then you need to fix your tabs.	*
+ ****************************************************************************/
+
+#ifndef _GETMAIL_H_
+#define _GETMAIL_H_
+
+#include "scfgdefs.h"
+#include "smblib.h"
+#include "dllexport.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+DLLEXPORT int		getmail(scfg_t* cfg, int usernumber, BOOL sent, uint16_t attr);
+DLLEXPORT mail_t *	loadmail(smb_t* smb, uint32_t* msgs, uint usernumber
+							,int which, long mode);
+DLLEXPORT void		freemail(mail_t* mail);
+DLLEXPORT BOOL		delfattach(scfg_t*, smbmsg_t*);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* Don't add anything after this line */
\ No newline at end of file
diff --git a/src/sbbs3/getstats.h b/src/sbbs3/getstats.h
new file mode 100644
index 0000000000..6b8a5ddb23
--- /dev/null
+++ b/src/sbbs3/getstats.h
@@ -0,0 +1,39 @@
+/****************************************************************************
+ * @format.tab-size 4		(Plain Text/Source Code File Header)			*
+ * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
+ *																			*
+ * Copyright Rob Swindell - http://www.synchro.net/copyright.html			*
+ *																			*
+ * This program is free software; you can redistribute it and/or			*
+ * modify it under the terms of the GNU General Public License				*
+ * as published by the Free Software Foundation; either version 2			*
+ * of the License, or (at your option) any later version.					*
+ * See the GNU General Public License for more details: gpl.txt or			*
+ * http://www.fsf.org/copyleft/gpl.html										*
+ *																			*
+ * For Synchronet coding style and modification guidelines, see				*
+ * http://www.synchro.net/source.html										*
+ *																			*
+ * Note: If this box doesn't appear square, then you need to fix your tabs.	*
+ ****************************************************************************/
+
+#ifndef _GETSTATS_H_
+#define _GETSTATS_H_
+
+#include "scfgdefs.h"	// scfg_t
+#include "dllexport.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+DLLEXPORT BOOL		getstats(scfg_t* cfg, char node, stats_t* stats);
+DLLEXPORT ulong		getposts(scfg_t* cfg, uint subnum);
+DLLEXPORT long		getfiles(scfg_t* cfg, uint dirnum);
+DLLEXPORT BOOL		inc_sys_upload_stats(scfg_t*, ulong files, ulong bytes);
+DLLEXPORT BOOL		inc_sys_download_stats(scfg_t*, ulong files, ulong bytes);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* Don't add anything after this line */
\ No newline at end of file
diff --git a/src/sbbs3/load_cfg.c b/src/sbbs3/load_cfg.c
index 1c6ced9ba6..d9e10f09f1 100644
--- a/src/sbbs3/load_cfg.c
+++ b/src/sbbs3/load_cfg.c
@@ -1,7 +1,5 @@
 /* Synchronet configuration load routines (exported) */
 
-/* $Id: load_cfg.c,v 1.82 2020/05/26 01:49:22 rswindell Exp $ */
-
 /****************************************************************************
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
@@ -15,25 +13,17 @@
  * See the GNU General Public License for more details: gpl.txt or			*
  * http://www.fsf.org/copyleft/gpl.html										*
  *																			*
- * Anonymous FTP access to the most recent released source is available at	*
- * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net	*
- *																			*
- * Anonymous CVS access to the development source and modification history	*
- * is available at cvs.synchro.net:/cvsroot/sbbs, example:					*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login			*
- *     (just hit return, no password is necessary)							*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src		*
- *																			*
  * For Synchronet coding style and modification guidelines, see				*
  * http://www.synchro.net/source.html										*
  *																			*
- * You are encouraged to submit any modifications (preferably in Unix diff	*
- * format) via e-mail to mods@synchro.net									*
- *																			*
  * Note: If this box doesn't appear square, then you need to fix your tabs.	*
  ****************************************************************************/
 
-#include "sbbs.h"
+#include "load_cfg.h"
+#include "scfglib.h"
+#include "str_util.h"
+#include "nopen.h"
+#include "datewrap.h"
 #include "text.h"	/* TOTAL_TEXT */
 #ifdef USE_CRYPTLIB
 #include "cryptlib.h"
@@ -44,6 +34,9 @@ static void free_attr_cfg(scfg_t* cfg);
 
 int 	lprintf(int level, const char *fmt, ...);	/* log output */
 
+/* readtext.c */
+char *	readtext(long *line, FILE *stream, long dflt);
+
 /****************************************************************************/
 /* Initializes system and node configuration information and data variables */
 /****************************************************************************/
diff --git a/src/sbbs3/load_cfg.h b/src/sbbs3/load_cfg.h
new file mode 100644
index 0000000000..7f36380c65
--- /dev/null
+++ b/src/sbbs3/load_cfg.h
@@ -0,0 +1,43 @@
+/* Synchronet Configuration Load/Preparation functions */
+
+/****************************************************************************
+ * @format.tab-size 4		(Plain Text/Source Code File Header)			*
+ * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
+ *																			*
+ * Copyright Rob Swindell - http://www.synchro.net/copyright.html			*
+ *																			*
+ * This program is free software; you can redistribute it and/or			*
+ * modify it under the terms of the GNU General Public License				*
+ * as published by the Free Software Foundation; either version 2			*
+ * of the License, or (at your option) any later version.					*
+ * See the GNU General Public License for more details: gpl.txt or			*
+ * http://www.fsf.org/copyleft/gpl.html										*
+ *																			*
+ * For Synchronet coding style and modification guidelines, see				*
+ * http://www.synchro.net/source.html										*
+ *																			*
+ * Note: If this box doesn't appear square, then you need to fix your tabs.	*
+ ****************************************************************************/
+
+#ifndef _LOAD_CFG_H_
+#define _LOAD_CFG_H_
+
+#include "scfgdefs.h"	// scfg_t
+#include "dllexport.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+DLLEXPORT BOOL		load_cfg(scfg_t* cfg, char* text[], BOOL prep, char* error);
+DLLEXPORT void		free_cfg(scfg_t* cfg);
+DLLEXPORT void		free_text(char* text[]);
+DLLEXPORT ushort	sys_timezone(scfg_t* cfg);
+DLLEXPORT char *	prep_dir(const char* base, char* dir, size_t buflen);
+DLLEXPORT char *	prep_code(char *str, const char* prefix);
+DLLEXPORT int 		md(const char *path);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* Don't add anything after this line */
\ No newline at end of file
diff --git a/src/sbbs3/makeuser.c b/src/sbbs3/makeuser.c
index d9c244483f..14274aaf28 100644
--- a/src/sbbs3/makeuser.c
+++ b/src/sbbs3/makeuser.c
@@ -1,9 +1,5 @@
-/* makeuser.c */
-
 /* Program to add a user to a Synchronet user database */
 
-/* $Id: makeuser.c,v 1.12 2020/08/17 00:48:28 rswindell Exp $ */
-
 /****************************************************************************
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
@@ -17,25 +13,17 @@
  * See the GNU General Public License for more details: gpl.txt or			*
  * http://www.fsf.org/copyleft/gpl.html										*
  *																			*
- * Anonymous FTP access to the most recent released source is available at	*
- * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net	*
- *																			*
- * Anonymous CVS access to the development source and modification history	*
- * is available at cvs.synchro.net:/cvsroot/sbbs, example:					*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login			*
- *     (just hit return, no password is necessary)							*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src		*
- *																			*
  * For Synchronet coding style and modification guidelines, see				*
  * http://www.synchro.net/source.html										*
  *																			*
- * You are encouraged to submit any modifications (preferably in Unix diff	*
- * format) via e-mail to mods@synchro.net									*
- *																			*
  * Note: If this box doesn't appear square, then you need to fix your tabs.	*
  ****************************************************************************/
 
-#include "sbbs.h"
+#include "load_cfg.h"
+#include "str_util.h"
+#include "userdat.h"
+#include "scfglib.h"
+#include <stdarg.h>
 
 scfg_t scfg;
 
diff --git a/src/sbbs3/msg_id.c b/src/sbbs3/msg_id.c
index 0e22c0683d..26a5ad216f 100644
--- a/src/sbbs3/msg_id.c
+++ b/src/sbbs3/msg_id.c
@@ -1,7 +1,5 @@
 /* Synchronet Message-ID generation routines */
 
-/* $Id: msg_id.c,v 1.16 2020/07/15 06:12:56 rswindell Exp $ */
-
 /****************************************************************************
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
@@ -15,25 +13,14 @@
  * See the GNU General Public License for more details: gpl.txt or			*
  * http://www.fsf.org/copyleft/gpl.html										*
  *																			*
- * Anonymous FTP access to the most recent released source is available at	*
- * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net	*
- *																			*
- * Anonymous CVS access to the development source and modification history	*
- * is available at cvs.synchro.net:/cvsroot/sbbs, example:					*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login			*
- *     (just hit return, no password is necessary)							*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src		*
- *																			*
  * For Synchronet coding style and modification guidelines, see				*
  * http://www.synchro.net/source.html										*
  *																			*
- * You are encouraged to submit any modifications (preferably in Unix diff	*
- * format) via e-mail to mods@synchro.net									*
- *																			*
  * Note: If this box doesn't appear square, then you need to fix your tabs.	*
  ****************************************************************************/
 
-#include "sbbs.h"
+#include "msg_id.h"
+#include "smblib.h"
 
 static ulong msg_number(smbmsg_t* msg)
 {
diff --git a/src/sbbs3/msg_id.h b/src/sbbs3/msg_id.h
new file mode 100644
index 0000000000..8de3cf614b
--- /dev/null
+++ b/src/sbbs3/msg_id.h
@@ -0,0 +1,43 @@
+/****************************************************************************
+ * @format.tab-size 4		(Plain Text/Source Code File Header)			*
+ * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
+ *																			*
+ * Copyright Rob Swindell - http://www.synchro.net/copyright.html			*
+ *																			*
+ * This program is free software; you can redistribute it and/or			*
+ * modify it under the terms of the GNU General Public License				*
+ * as published by the Free Software Foundation; either version 2			*
+ * of the License, or (at your option) any later version.					*
+ * See the GNU General Public License for more details: gpl.txt or			*
+ * http://www.fsf.org/copyleft/gpl.html										*
+ *																			*
+ * For Synchronet coding style and modification guidelines, see				*
+ * http://www.synchro.net/source.html										*
+ *																			*
+ * Note: If this box doesn't appear square, then you need to fix your tabs.	*
+ ****************************************************************************/
+
+#ifndef _MSG_ID_H_
+#define _MSG_ID_H_
+
+#include "smbdefs.h"
+#include "scfgdefs.h"
+#include "dllexport.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+DLLEXPORT char *	ftn_msgid(sub_t*, smbmsg_t*, char* msgid, size_t);
+DLLEXPORT char *	get_msgid(scfg_t*, uint subnum, smbmsg_t*, char* msgid, size_t);
+DLLEXPORT char *	get_replyid(scfg_t*, smb_t*, smbmsg_t*, char* msgid, size_t maxlen);
+DLLEXPORT uint32_t	get_new_msg_number(smb_t*);
+DLLEXPORT BOOL		add_msg_ids(scfg_t*, smb_t*, smbmsg_t*, smbmsg_t* remsg);
+DLLEXPORT BOOL		add_reply_ids(scfg_t*, smb_t*, smbmsg_t*, smbmsg_t* remsg);
+DLLEXPORT char*		msg_program_id(char* pid, size_t);
+DLLEXPORT uint		nearest_sysfaddr(scfg_t*, faddr_t* dest_addr);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* Don't add anything after this line */
diff --git a/src/sbbs3/msgdate.c b/src/sbbs3/msgdate.c
index 34a2028455..d2ce643933 100644
--- a/src/sbbs3/msgdate.c
+++ b/src/sbbs3/msgdate.c
@@ -1,9 +1,5 @@
-/* msgdate.c */
-
 /* Synchronet RFC822 message date/time string conversion routines */
 
-/* $Id: msgdate.c,v 1.7 2018/07/24 11:37:38 rswindell Exp $ */
-
 /****************************************************************************
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
@@ -17,25 +13,16 @@
  * See the GNU General Public License for more details: gpl.txt or			*
  * http://www.fsf.org/copyleft/gpl.html										*
  *																			*
- * Anonymous FTP access to the most recent released source is available at	*
- * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net	*
- *																			*
- * Anonymous CVS access to the development source and modification history	*
- * is available at cvs.synchro.net:/cvsroot/sbbs, example:					*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login			*
- *     (just hit return, no password is necessary)							*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src		*
- *																			*
  * For Synchronet coding style and modification guidelines, see				*
  * http://www.synchro.net/source.html										*
  *																			*
- * You are encouraged to submit any modifications (preferably in Unix diff	*
- * format) via e-mail to mods@synchro.net									*
- *																			*
  * Note: If this box doesn't appear square, then you need to fix your tabs.	*
  ****************************************************************************/
 
-#include "sbbs.h"
+#include "msgdate.h"
+#include "smblib.h"
+#include "datewrap.h"
+#include "date_str.h"
 
 /****************************************************************************/
 /* Convert when_t structure to RFC822 date header field (string)			*/
diff --git a/src/sbbs3/msgdate.h b/src/sbbs3/msgdate.h
new file mode 100644
index 0000000000..5df0564ff4
--- /dev/null
+++ b/src/sbbs3/msgdate.h
@@ -0,0 +1,41 @@
+/* Synchronet RFC822 message date/time string conversion routines */
+
+/****************************************************************************
+ * @format.tab-size 4		(Plain Text/Source Code File Header)			*
+ * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
+ *																			*
+ * Copyright Rob Swindell - http://www.synchro.net/copyright.html			*
+ *																			*
+ * This program is free software; you can redistribute it and/or			*
+ * modify it under the terms of the GNU General Public License				*
+ * as published by the Free Software Foundation; either version 2			*
+ * of the License, or (at your option) any later version.					*
+ * See the GNU General Public License for more details: gpl.txt or			*
+ * http://www.fsf.org/copyleft/gpl.html										*
+ *																			*
+ * For Synchronet coding style and modification guidelines, see				*
+ * http://www.synchro.net/source.html										*
+ *																			*
+ * Note: If this box doesn't appear square, then you need to fix your tabs.	*
+ ****************************************************************************/
+
+#ifndef _MSGDATE_H_
+#define _MSGDATE_H_
+
+#include <time.h>		// time_t
+#include "scfgdefs.h"	// scfg_t
+#include "smbdefs.h"	// when_t
+#include "dllexport.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+DLLEXPORT when_t	rfc822date(char* p);
+DLLEXPORT char *	msgdate(when_t when, char* buf);
+DLLEXPORT BOOL		newmsgs(smb_t*, time_t);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* Don't add anything after this line */
\ No newline at end of file
diff --git a/src/sbbs3/nopen.c b/src/sbbs3/nopen.c
index b712188b0e..17b10664d1 100644
--- a/src/sbbs3/nopen.c
+++ b/src/sbbs3/nopen.c
@@ -1,9 +1,5 @@
-/* nopen.c */
-
 /* Network open functions (nopen and fnopen) and friends */
 
-/* $Id: nopen.c,v 1.30 2018/11/23 17:08:42 rswindell Exp $ */
-
 /****************************************************************************
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
@@ -17,26 +13,15 @@
  * See the GNU General Public License for more details: gpl.txt or			*
  * http://www.fsf.org/copyleft/gpl.html										*
  *																			*
- * Anonymous FTP access to the most recent released source is available at	*
- * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net	*
- *																			*
- * Anonymous CVS access to the development source and modification history	*
- * is available at cvs.synchro.net:/cvsroot/sbbs, example:					*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login			*
- *     (just hit return, no password is necessary)							*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src		*
- *																			*
  * For Synchronet coding style and modification guidelines, see				*
  * http://www.synchro.net/source.html										*
  *																			*
- * You are encouraged to submit any modifications (preferably in Unix diff	*
- * format) via e-mail to mods@synchro.net									*
- *																			*
  * Note: If this box doesn't appear square, then you need to fix your tabs.	*
  ****************************************************************************/
 
-#include "sbbs.h"
-#include "crc32.h"
+#include "filewrap.h"
+#include "sockwrap.h"
+#include "sbbsdefs.h"
 
 /****************************************************************************/
 /* Network open function. Opens all files DENYALL, DENYWRITE, or DENYNONE	*/
diff --git a/src/sbbs3/qwknodes.c b/src/sbbs3/qwknodes.c
index de128146e4..1532403201 100644
--- a/src/sbbs3/qwknodes.c
+++ b/src/sbbs3/qwknodes.c
@@ -1,5 +1,3 @@
-/* $Id: qwknodes.c,v 1.25 2020/08/17 00:48:28 rswindell Exp $ */
-
 /* Synchronet QWKnet node list or route.dat file generator */
 
 /****************************************************************************
@@ -15,29 +13,21 @@
  * See the GNU General Public License for more details: gpl.txt or			*
  * http://www.fsf.org/copyleft/gpl.html										*
  *																			*
- * Anonymous FTP access to the most recent released source is available at	*
- * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net	*
- *																			*
- * Anonymous CVS access to the development source and modification history	*
- * is available at cvs.synchro.net:/cvsroot/sbbs, example:					*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login			*
- *     (just hit return, no password is necessary)							*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src		*
- *																			*
  * For Synchronet coding style and modification guidelines, see				*
  * http://www.synchro.net/source.html										*
  *																			*
- * You are encouraged to submit any modifications (preferably in Unix diff	*
- * format) via e-mail to mods@synchro.net									*
- *																			*
  * Note: If this box doesn't appear square, then you need to fix your tabs.	*
  ****************************************************************************/
 
-#include "sbbs.h"
+#include "load_cfg.h"
+#include "str_util.h"
+#include "date_str.h"
+#include "smblib.h"
 #include "nopen.h"
 #include "crc16.h"
 #include "crc32.h"
 #include "conwrap.h"	/* kbhit */
+#include <stdarg.h>
 
 unsigned _stklen=10000;
 smb_t		smb;
diff --git a/src/sbbs3/rechocfg.c b/src/sbbs3/rechocfg.c
index 08b6804539..19079bf54f 100644
--- a/src/sbbs3/rechocfg.c
+++ b/src/sbbs3/rechocfg.c
@@ -1,7 +1,5 @@
 /* Synchronet FidoNet EchoMail Scanning/Tossing and NetMail Tossing Utility */
 
-/* $Id: rechocfg.c,v 3.48 2020/05/04 03:14:51 rswindell Exp $ */
-
 /****************************************************************************
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
@@ -15,21 +13,9 @@
  * See the GNU General Public License for more details: gpl.txt or			*
  * http://www.fsf.org/copyleft/gpl.html										*
  *																			*
- * Anonymous FTP access to the most recent released source is available at	*
- * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net	*
- *																			*
- * Anonymous CVS access to the development source and modification history	*
- * is available at cvs.synchro.net:/cvsroot/sbbs, example:					*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login			*
- *     (just hit return, no password is necessary)							*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src		*
- *																			*
  * For Synchronet coding style and modification guidelines, see				*
  * http://www.synchro.net/source.html										*
  *																			*
- * You are encouraged to submit any modifications (preferably in Unix diff	*
- * format) via e-mail to mods@synchro.net									*
- *																			*
  * Note: If this box doesn't appear square, then you need to fix your tabs.	*
  ****************************************************************************/
 
@@ -45,9 +31,9 @@
 #include <string.h>
 #include <sys/stat.h>
 
-#include "sbbs.h"
 #include "sbbsecho.h"
 #include "filewrap.h"	/* O_DENYNONE */
+#include "nopen.h"		/* backup() */
 
 /****************************************************************************/
 /* Returns the FidoNet address kept in str as ASCII.                        */
diff --git a/src/sbbs3/sbbs.h b/src/sbbs3/sbbs.h
index 3a4d24f175..82385ab199 100644
--- a/src/sbbs3/sbbs.h
+++ b/src/sbbs3/sbbs.h
@@ -290,8 +290,8 @@ extern int	thread_suid_broken;			/* NPTL is no longer broken */
 
 #include "smblib.h"
 #include "ars_defs.h"
-#include "scfgdefs.h"
 #include "scfglib.h"
+#include "scfgsave.h"
 #include "userdat.h"
 #include "riodefs.h"
 #include "cmdshell.h"
@@ -302,6 +302,14 @@ extern int	thread_suid_broken;			/* NPTL is no longer broken */
 #include "telnet.h"
 #include "nopen.h"
 #include "text.h"
+#include "str_util.h"
+#include "date_str.h"
+#include "load_cfg.h"
+#include "filedat.h"
+#include "getstats.h"
+#include "msgdate.h"
+#include "getmail.h"
+#include "msg_id.h"
 
 /* Synchronet Node Instance class definition */
 #if defined(__cplusplus) && defined(JAVASCRIPT)
@@ -1167,20 +1175,6 @@ extern "C" {
 	DLLEXPORT int		DLLCALL sbbs_random(int);
 	DLLEXPORT void		DLLCALL sbbs_srand(void);
 
-	/* getstats.c */
-	DLLEXPORT BOOL		DLLCALL getstats(scfg_t* cfg, char node, stats_t* stats);
-	DLLEXPORT ulong		DLLCALL	getposts(scfg_t* cfg, uint subnum);
-	DLLEXPORT long		DLLCALL getfiles(scfg_t* cfg, uint dirnum);
-	DLLEXPORT BOOL		DLLCALL inc_sys_upload_stats(scfg_t*, ulong files, ulong bytes);
-	DLLEXPORT BOOL		DLLCALL inc_sys_download_stats(scfg_t*, ulong files, ulong bytes);
-
-	/* getmail.c */
-	DLLEXPORT int		DLLCALL getmail(scfg_t* cfg, int usernumber, BOOL sent, uint16_t attr);
-	DLLEXPORT mail_t *	DLLCALL loadmail(smb_t* smb, uint32_t* msgs, uint usernumber
-										,int which, long mode);
-	DLLEXPORT void		DLLCALL freemail(mail_t* mail);
-	DLLEXPORT BOOL		DLLCALL delfattach(scfg_t*, smbmsg_t*);
-
 	/* postmsg.cpp */
 	DLLEXPORT int		DLLCALL savemsg(scfg_t*, smb_t*, smbmsg_t*, client_t*, const char* server, char* msgbuf, smbmsg_t* remsg);
 	DLLEXPORT int		DLLCALL votemsg(scfg_t*, smb_t*, smbmsg_t*, const char* msgfmt, const char* votefmt);
@@ -1190,101 +1184,6 @@ extern "C" {
 	DLLEXPORT int		DLLCALL msg_client_hfields(smbmsg_t*, client_t*);
 	DLLEXPORT int		DLLCALL notify(scfg_t*, uint usernumber, const char* subject, const char* msg);
 
-	/* filedat.c */
-	DLLEXPORT BOOL		DLLCALL getfileixb(scfg_t* cfg, file_t* f);
-	DLLEXPORT BOOL		DLLCALL putfileixb(scfg_t* cfg, file_t* f);
-	DLLEXPORT BOOL		DLLCALL getfiledat(scfg_t* cfg, file_t* f);
-	DLLEXPORT BOOL		DLLCALL putfiledat(scfg_t* cfg, file_t* f);
-	DLLEXPORT void		DLLCALL putextdesc(scfg_t* cfg, uint dirnum, ulong datoffset, char *ext);
-	DLLEXPORT void		DLLCALL getextdesc(scfg_t* cfg, uint dirnum, ulong datoffset, char *ext);
-	DLLEXPORT char*		DLLCALL getfilepath(scfg_t* cfg, file_t* f, char* path);
-
-	DLLEXPORT BOOL		DLLCALL removefiledat(scfg_t* cfg, file_t* f);
-	DLLEXPORT BOOL		DLLCALL addfiledat(scfg_t* cfg, file_t* f);
-	DLLEXPORT BOOL		DLLCALL findfile(scfg_t* cfg, uint dirnum, char *filename);
-	DLLEXPORT char *	DLLCALL padfname(const char *filename, char *str);
-	DLLEXPORT char *	DLLCALL unpadfname(const char *filename, char *str);
-	DLLEXPORT BOOL		DLLCALL rmuserxfers(scfg_t* cfg, int fromuser, int destuser, char *fname);
-
-	DLLEXPORT int		DLLCALL update_uldate(scfg_t* cfg, file_t* f);
-
-	/* str_util.c */
-	DLLEXPORT char *	remove_ctrl_a(const char* instr, char* outstr);
-	DLLEXPORT char 		ctrl_a_to_ascii_char(char code);
-	DLLEXPORT char *	truncstr(char* str, const char* set);
-	DLLEXPORT char *	ascii_str(uchar* str);
-	DLLEXPORT char *	condense_whitespace(char* str);
-	DLLEXPORT char		exascii_to_ascii_char(uchar ch);
-	DLLEXPORT BOOL		findstr(const char *insearch, const char *fname);
-	DLLEXPORT BOOL		findstr_in_string(const char* insearchof, char* string);
-	DLLEXPORT BOOL		findstr_in_list(const char* insearchof, str_list_t list);
-	DLLEXPORT str_list_t findstr_list(const char* fname);
-	DLLEXPORT BOOL		trashcan(scfg_t* cfg, const char *insearch, const char *name);
-	DLLEXPORT char *	trashcan_fname(scfg_t* cfg, const char *name, char* fname, size_t);
-	DLLEXPORT str_list_t trashcan_list(scfg_t* cfg, const char* name);
-	DLLEXPORT char *	strip_ansi(char* str);
-	DLLEXPORT char *	strip_exascii(const char *str, char* dest);
-	DLLEXPORT char *	strip_space(const char *str, char* dest);
-	DLLEXPORT char *	prep_file_desc(const char *str, char* dest);
-	DLLEXPORT char *	strip_ctrl(const char *str, char* dest);
-	DLLEXPORT char *	strip_char(const char* str, char* dest, char);
-	DLLEXPORT char *	net_addr(net_t* net);
-	DLLEXPORT BOOL		valid_ctrl_a_attr(char a);
-	DLLEXPORT BOOL		valid_ctrl_a_code(char a);
-	DLLEXPORT size_t	strip_invalid_attr(char *str);
-	DLLEXPORT char *	ultoac(ulong l,char *str);
-	DLLEXPORT char *	rot13(char* str);
-	DLLEXPORT uint32_t	str_to_bits(uint32_t currval, const char *str);
-	DLLEXPORT BOOL		str_has_ctrl(const char*);
-	DLLEXPORT BOOL		str_is_ascii(const char*);
-	DLLEXPORT char *	utf8_to_cp437_str(char* str);
-	DLLEXPORT char *	subnewsgroupname(scfg_t*, sub_t*, char*, size_t);
-	DLLEXPORT char * 	get_ctrl_dir(BOOL warn);
-
-	/* msg_id.c */
-	DLLEXPORT char *	DLLCALL ftn_msgid(sub_t*, smbmsg_t*, char* msgid, size_t);
-	DLLEXPORT char *	DLLCALL get_msgid(scfg_t*, uint subnum, smbmsg_t*, char* msgid, size_t);
-	DLLEXPORT char *	DLLCALL get_replyid(scfg_t*, smb_t*, smbmsg_t*, char* msgid, size_t maxlen);
-	DLLEXPORT uint32_t	DLLCALL get_new_msg_number(smb_t*);
-	DLLEXPORT BOOL		DLLCALL add_msg_ids(scfg_t*, smb_t*, smbmsg_t*, smbmsg_t* remsg);
-	DLLEXPORT BOOL		DLLCALL add_reply_ids(scfg_t*, smb_t*, smbmsg_t*, smbmsg_t* remsg);
-	DLLEXPORT char*		DLLCALL msg_program_id(char* pid, size_t);
-	DLLEXPORT uint		nearest_sysfaddr(scfg_t*, faddr_t* dest_addr);
-
-	/* date_str.c */
-	DLLEXPORT char *	DLLCALL zonestr(short zone);
-	DLLEXPORT time32_t	DLLCALL dstrtounix(scfg_t*, const char *str);
-	DLLEXPORT char *	DLLCALL unixtodstr(scfg_t*, time32_t, char *str);
-	DLLEXPORT char *	DLLCALL sectostr(uint sec, char *str);
-	DLLEXPORT char *	DLLCALL seconds_to_str(uint, char*);
-	DLLEXPORT char *	DLLCALL hhmmtostr(scfg_t* cfg, struct tm* tm, char* str);
-	DLLEXPORT char *	DLLCALL timestr(scfg_t* cfg, time32_t intime, char* str);
-
-	/* msgdate.c */
-	DLLEXPORT when_t	DLLCALL rfc822date(char* p);
-	DLLEXPORT char *	DLLCALL msgdate(when_t when, char* buf);
-	DLLEXPORT BOOL		DLLCALL newmsgs(smb_t*, time_t);
-
-	/* load_cfg.c */
-	DLLEXPORT BOOL		DLLCALL load_cfg(scfg_t* cfg, char* text[], BOOL prep, char* error);
-	DLLEXPORT void		DLLCALL free_cfg(scfg_t* cfg);
-	DLLEXPORT void		DLLCALL free_text(char* text[]);
-	DLLEXPORT ushort	DLLCALL sys_timezone(scfg_t* cfg);
-	DLLEXPORT char *	DLLCALL prep_dir(const char* base, char* dir, size_t buflen);
-	DLLEXPORT int 		DLLCALL md(const char *path);
-
-	/* scfgsave.c */
-	DLLEXPORT BOOL		DLLCALL save_cfg(scfg_t* cfg, int backup_level);
-	DLLEXPORT BOOL		DLLCALL write_node_cfg(scfg_t* cfg, int backup_level);
-	DLLEXPORT BOOL		DLLCALL write_main_cfg(scfg_t* cfg, int backup_level);
-	DLLEXPORT BOOL		DLLCALL write_msgs_cfg(scfg_t* cfg, int backup_level);
-	DLLEXPORT BOOL		DLLCALL write_file_cfg(scfg_t* cfg, int backup_level);
-	DLLEXPORT BOOL		DLLCALL write_chat_cfg(scfg_t* cfg, int backup_level);
-	DLLEXPORT BOOL		DLLCALL write_xtrn_cfg(scfg_t* cfg, int backup_level);
-	DLLEXPORT void		DLLCALL refresh_cfg(scfg_t* cfg);
-	DLLEXPORT int		DLLCALL smb_storage_mode(scfg_t*, smb_t*);
-	DLLEXPORT int		DLLCALL smb_open_sub(scfg_t*, smb_t*, unsigned int subnum);
-
 	/* logfile.cpp */
 	DLLEXPORT int		DLLCALL errorlog(scfg_t* cfg, int level, const char* host, const char* text);
 
@@ -1506,17 +1405,6 @@ extern "C" {
 
 #endif
 
-/* str_util.c */
-char*	backslashcolon(char *str);
-ulong	ahtoul(const char *str);	/* Converts ASCII hex to ulong */
-char *	hexplus(uint num, char *str); 	/* Hex plus for 3 digits up to 9000 */
-uint	hptoi(const char *str);
-int		pstrcmp(const char **str1, const char **str2);  /* Compares pointers to pointers */
-int		strsame(const char *str1, const char *str2);	/* Compares number of same chars */
-
-/* load_cfg.c */
-char*	prep_code(char *str, const char* prefix);
-
 #ifdef SBBS /* These aren't exported */
 
 	/* main.c */
@@ -1553,8 +1441,6 @@ char*	prep_code(char *str, const char* prefix);
 
 #endif /* SBBS */
 
-extern const char* wday[];	/* abbreviated weekday names */
-extern const char* mon[];	/* abbreviated month names */
 extern char lastuseron[LEN_ALIAS+1];  /* Name of user last online */
 
 #ifdef __cplusplus
diff --git a/src/sbbs3/sbbsecho.c b/src/sbbs3/sbbsecho.c
index cf8236dab3..83ee49abc6 100644
--- a/src/sbbs3/sbbsecho.c
+++ b/src/sbbs3/sbbsecho.c
@@ -1,8 +1,5 @@
 /* Synchronet FidoNet EchoMail Scanning/Tossing and NetMail Tossing Utility */
 
-/* $Id: sbbsecho.c,v 3.177 2020/08/17 00:48:28 rswindell Exp $ */
-// vi: tabstop=4
-
 /****************************************************************************
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
@@ -16,21 +13,9 @@
  * See the GNU General Public License for more details: gpl.txt or			*
  * http://www.fsf.org/copyleft/gpl.html										*
  *																			*
- * Anonymous FTP access to the most recent released source is available at	*
- * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net	*
- *																			*
- * Anonymous CVS access to the development source and modification history	*
- * is available at cvs.synchro.net:/cvsroot/sbbs, example:					*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login			*
- *     (just hit return, no password is necessary)							*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src		*
- *																			*
  * For Synchronet coding style and modification guidelines, see				*
  * http://www.synchro.net/source.html										*
  *																			*
- * You are encouraged to submit any modifications (preferably in Unix diff	*
- * format) via e-mail to mods@synchro.net									*
- *																			*
  * Note: If this box doesn't appear square, then you need to fix your tabs.	*
  ****************************************************************************/
 
@@ -50,14 +35,24 @@
 #endif
 
 #include "conwrap.h"		/* getch() */
-#include "sbbs.h"			/* load_cfg() */
-#include "sbbsdefs.h"
+#include "load_cfg.h"		/* load_cfg() */
 #include "smblib.h"
 #include "scfglib.h"
 #include "sbbsecho.h"
 #include "genwrap.h"		/* PLATFORM_DESC */
 #include "xpendian.h"
 #include "utf8.h"
+#include "date_str.h"
+#include "link_list.h"
+#include "str_list.h"
+#include "str_util.h"
+#include "datewrap.h"
+#include "nopen.h"
+#include "crc32.h"
+#include "userdat.h"
+#include "msg_id.h"
+#include "scfgsave.h"
+#include "getmail.h"
 
 #define MAX_OPEN_SMBS	10
 
diff --git a/src/sbbs3/sbbsecho.h b/src/sbbs3/sbbsecho.h
index 6722500830..a90892d18a 100644
--- a/src/sbbs3/sbbsecho.h
+++ b/src/sbbs3/sbbsecho.h
@@ -1,7 +1,5 @@
 /* Synchronet FidoNet EchoMail tosser/scanner/areafix program */
 
-/* $Id: sbbsecho.h,v 3.42 2020/06/12 13:00:35 rswindell Exp $ */
-
 /****************************************************************************
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
@@ -15,21 +13,9 @@
  * See the GNU General Public License for more details: gpl.txt or			*
  * http://www.fsf.org/copyleft/gpl.html										*
  *																			*
- * Anonymous FTP access to the most recent released source is available at	*
- * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net	*
- *																			*
- * Anonymous CVS access to the development source and modification history	*
- * is available at cvs.synchro.net:/cvsroot/sbbs, example:					*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login			*
- *     (just hit return, no password is necessary)							*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src		*
- *																			*
  * For Synchronet coding style and modification guidelines, see				*
  * http://www.synchro.net/source.html										*
  *																			*
- * You are encouraged to submit any modifications (preferably in Unix diff	*
- * format) via e-mail to mods@synchro.net									*
- *																			*
  * Note: If this box doesn't appear square, then you need to fix your tabs.	*
  ****************************************************************************/
 
@@ -40,6 +26,7 @@
 #include <smbdefs.h>
 #include "sbbsdefs.h"
 #include "fidodefs.h"
+#include "ini_file.h"
 
 #define SBBSECHO_VERSION_MAJOR		3
 #define SBBSECHO_VERSION_MINOR		11
diff --git a/src/sbbs3/scfg/scfg.c b/src/sbbs3/scfg/scfg.c
index 9b43ad3bf3..b27faa64d2 100644
--- a/src/sbbs3/scfg/scfg.c
+++ b/src/sbbs3/scfg/scfg.c
@@ -1,8 +1,5 @@
 /* Synchronet configuration utility 										*/
 
-/* $Id: scfg.c,v 1.118 2020/08/17 00:48:43 rswindell Exp $ */
-// vi: tabstop=4
-
 /****************************************************************************
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
@@ -16,21 +13,9 @@
  * See the GNU General Public License for more details: gpl.txt or			*
  * http://www.fsf.org/copyleft/gpl.html										*
  *																			*
- * Anonymous FTP access to the most recent released source is available at	*
- * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net	*
- *																			*
- * Anonymous CVS access to the development source and modification history	*
- * is available at cvs.synchro.net:/cvsroot/sbbs, example:					*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login			*
- *     (just hit return, no password is necessary)							*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src		*
- *																			*
  * For Synchronet coding style and modification guidelines, see				*
  * http://www.synchro.net/source.html										*
  *																			*
- * You are encouraged to submit any modifications (preferably in Unix diff	*
- * format) via e-mail to mods@synchro.net									*
- *																			*
  * Note: If this box doesn't appear square, then you need to fix your tabs.	*
  ****************************************************************************/
 
diff --git a/src/sbbs3/scfg/scfg.h b/src/sbbs3/scfg/scfg.h
index c3992d81ed..f050dc0542 100644
--- a/src/sbbs3/scfg/scfg.h
+++ b/src/sbbs3/scfg/scfg.h
@@ -1,6 +1,3 @@
-/* $Id: scfg.h,v 1.35 2020/06/12 15:57:17 rswindell Exp $ */
-// vi: tabstop=4
-
 /****************************************************************************
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
@@ -14,21 +11,9 @@
  * See the GNU General Public License for more details: gpl.txt or			*
  * http://www.fsf.org/copyleft/gpl.html										*
  *																			*
- * Anonymous FTP access to the most recent released source is available at	*
- * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net	*
- *																			*
- * Anonymous CVS access to the development source and modification history	*
- * is available at cvs.synchro.net:/cvsroot/sbbs, example:					*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login			*
- *     (just hit return, no password is necessary)							*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src		*
- *																			*
  * For Synchronet coding style and modification guidelines, see				*
  * http://www.synchro.net/source.html										*
  *																			*
- * You are encouraged to submit any modifications (preferably in Unix diff	*
- * format) via e-mail to mods@synchro.net									*
- *																			*
  * Note: If this box doesn't appear square, then you need to fix your tabs.	*
  ****************************************************************************/
 
@@ -37,9 +22,16 @@
 #include <stdbool.h>
 #include <limits.h>	/* USHRT_MAX */
 
+#include "scfgsave.h"
+#include "scfglib.h"
+#include "date_str.h"
+#include "str_util.h"
 #include "gen_defs.h"
+#include "smblib.h"
+#include "load_cfg.h"
+#include "ini_file.h"
 #include "uifc.h"
-#include "sbbs.h"
+#include "nopen.h"
 
 /**********/
 /* Macros */
diff --git a/src/sbbs3/scfg/scfgchat.c b/src/sbbs3/scfg/scfgchat.c
index f1953c31c4..9867776d61 100644
--- a/src/sbbs3/scfg/scfgchat.c
+++ b/src/sbbs3/scfg/scfgchat.c
@@ -13,21 +13,9 @@
  * See the GNU General Public License for more details: gpl.txt or			*
  * http://www.fsf.org/copyleft/gpl.html										*
  *																			*
- * Anonymous FTP access to the most recent released source is available at	*
- * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net	*
- *																			*
- * Anonymous CVS access to the development source and modification history	*
- * is available at cvs.synchro.net:/cvsroot/sbbs, example:					*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login			*
- *     (just hit return, no password is necessary)							*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src		*
- *																			*
  * For Synchronet coding style and modification guidelines, see				*
  * http://www.synchro.net/source.html										*
  *																			*
- * You are encouraged to submit any modifications (preferably in Unix diff	*
- * format) via e-mail to mods@synchro.net									*
- *																			*
  * Note: If this box doesn't appear square, then you need to fix your tabs.	*
  ****************************************************************************/
 
diff --git a/src/sbbs3/scfg/scfgmsg.c b/src/sbbs3/scfg/scfgmsg.c
index 080b2572a8..30183d3945 100644
--- a/src/sbbs3/scfg/scfgmsg.c
+++ b/src/sbbs3/scfg/scfgmsg.c
@@ -15,26 +15,15 @@
  * See the GNU General Public License for more details: gpl.txt or			*
  * http://www.fsf.org/copyleft/gpl.html										*
  *																			*
- * Anonymous FTP access to the most recent released source is available at	*
- * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net	*
- *																			*
- * Anonymous CVS access to the development source and modification history	*
- * is available at cvs.synchro.net:/cvsroot/sbbs, example:					*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login			*
- *     (just hit return, no password is necessary)							*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src		*
- *																			*
  * For Synchronet coding style and modification guidelines, see				*
  * http://www.synchro.net/source.html										*
  *																			*
- * You are encouraged to submit any modifications (preferably in Unix diff	*
- * format) via e-mail to mods@synchro.net									*
- *																			*
  * Note: If this box doesn't appear square, then you need to fix your tabs.	*
  ****************************************************************************/
 
 #include "scfg.h"
 #include "strwrap.h"	/* itoa() */
+#include "str_util.h"
 #include <stdbool.h>
 
 #define CUT_GROUPNUM	USHRT_MAX
diff --git a/src/sbbs3/scfglib1.c b/src/sbbs3/scfglib1.c
index f6a01ee948..6fc8fbdc76 100644
--- a/src/sbbs3/scfglib1.c
+++ b/src/sbbs3/scfglib1.c
@@ -1,7 +1,5 @@
 /* Synchronet configuration library routines */
 
-/* $Id: scfglib1.c,v 1.86 2020/08/08 19:04:07 rswindell Exp $ */
-
 /****************************************************************************
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
@@ -15,34 +13,16 @@
  * See the GNU General Public License for more details: gpl.txt or			*
  * http://www.fsf.org/copyleft/gpl.html										*
  *																			*
- * Anonymous FTP access to the most recent released source is available at	*
- * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net	*
- *																			*
- * Anonymous CVS access to the development source and modification history	*
- * is available at cvs.synchro.net:/cvsroot/sbbs, example:					*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login			*
- *     (just hit return, no password is necessary)							*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src		*
- *																			*
  * For Synchronet coding style and modification guidelines, see				*
  * http://www.synchro.net/source.html										*
  *																			*
- * You are encouraged to submit any modifications (preferably in Unix diff	*
- * format) via e-mail to mods@synchro.net									*
- *																			*
  * Note: If this box doesn't appear square, then you need to fix your tabs.	*
  ****************************************************************************/
 
-#include "sbbs.h"
 #include "scfglib.h"
-
-/***********************************************************/
-/* These functions are called from here and must be linked */
-/***********************************************************/
-/***
-	nopen()
-	truncsp()
-***/
+#include "load_cfg.h"
+#include "nopen.h"
+#include "ars_defs.h"
 
 BOOL allocerr(FILE* fp, char* error, long offset, char *fname, uint size)
 {
diff --git a/src/sbbs3/scfglib2.c b/src/sbbs3/scfglib2.c
index 9f529dffe7..f714bc7cd1 100644
--- a/src/sbbs3/scfglib2.c
+++ b/src/sbbs3/scfglib2.c
@@ -1,9 +1,5 @@
-/* scfglib2.c */
-
 /* Synchronet configuration library routines */
 
-/* $Id: scfglib2.c,v 1.53 2020/08/08 20:17:03 rswindell Exp $ */
-
 /****************************************************************************
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
@@ -17,26 +13,15 @@
  * See the GNU General Public License for more details: gpl.txt or			*
  * http://www.fsf.org/copyleft/gpl.html										*
  *																			*
- * Anonymous FTP access to the most recent released source is available at	*
- * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net	*
- *																			*
- * Anonymous CVS access to the development source and modification history	*
- * is available at cvs.synchro.net:/cvsroot/sbbs, example:					*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login			*
- *     (just hit return, no password is necessary)							*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src		*
- *																			*
  * For Synchronet coding style and modification guidelines, see				*
  * http://www.synchro.net/source.html										*
  *																			*
- * You are encouraged to submit any modifications (preferably in Unix diff	*
- * format) via e-mail to mods@synchro.net									*
- *																			*
  * Note: If this box doesn't appear square, then you need to fix your tabs.	*
  ****************************************************************************/
 
-#include "sbbs.h"
 #include "scfglib.h"
+#include "nopen.h"
+#include "ars_defs.h"
 
 /****************************************************************************/
 /* Reads in FILE.CNF and initializes the associated variables				*/
diff --git a/src/sbbs3/scfgsave.c b/src/sbbs3/scfgsave.c
index 9f40f4a4ca..29b2a217ca 100644
--- a/src/sbbs3/scfgsave.c
+++ b/src/sbbs3/scfgsave.c
@@ -1,7 +1,5 @@
 /* Synchronet configuration file save routines */
 
-/* $Id: scfgsave.c,v 1.98 2020/08/08 20:17:03 rswindell Exp $ */
-
 /****************************************************************************
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
@@ -15,25 +13,17 @@
  * See the GNU General Public License for more details: gpl.txt or			*
  * http://www.fsf.org/copyleft/gpl.html										*
  *																			*
- * Anonymous FTP access to the most recent released source is available at	*
- * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net	*
- *																			*
- * Anonymous CVS access to the development source and modification history	*
- * is available at cvs.synchro.net:/cvsroot/sbbs, example:					*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login			*
- *     (just hit return, no password is necessary)							*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src		*
- *																			*
  * For Synchronet coding style and modification guidelines, see				*
  * http://www.synchro.net/source.html										*
  *																			*
- * You are encouraged to submit any modifications (preferably in Unix diff	*
- * format) via e-mail to mods@synchro.net									*
- *																			*
  * Note: If this box doesn't appear square, then you need to fix your tabs.	*
  ****************************************************************************/
 
-#include "sbbs.h"
+#include "scfgsave.h"
+#include "load_cfg.h"
+#include "smblib.h"
+#include "userdat.h"
+#include "nopen.h"
 
 BOOL no_msghdr=FALSE,all_msghdr=FALSE;
 
diff --git a/src/sbbs3/scfgsave.h b/src/sbbs3/scfgsave.h
new file mode 100644
index 0000000000..e0363a72bb
--- /dev/null
+++ b/src/sbbs3/scfgsave.h
@@ -0,0 +1,45 @@
+/****************************************************************************
+ * @format.tab-size 4		(Plain Text/Source Code File Header)			*
+ * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
+ *																			*
+ * Copyright Rob Swindell - http://www.synchro.net/copyright.html			*
+ *																			*
+ * This program is free software; you can redistribute it and/or			*
+ * modify it under the terms of the GNU General Public License				*
+ * as published by the Free Software Foundation; either version 2			*
+ * of the License, or (at your option) any later version.					*
+ * See the GNU General Public License for more details: gpl.txt or			*
+ * http://www.fsf.org/copyleft/gpl.html										*
+ *																			*
+ * For Synchronet coding style and modification guidelines, see				*
+ * http://www.synchro.net/source.html										*
+ *																			*
+ * Note: If this box doesn't appear square, then you need to fix your tabs.	*
+ ****************************************************************************/
+
+#ifndef _SCFGSAVE_H_
+#define _SCFGSAVE_H_
+
+#include "scfgdefs.h"
+#include "smbdefs.h"
+#include "dllexport.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+DLLEXPORT BOOL		save_cfg(scfg_t* cfg, int backup_level);
+DLLEXPORT BOOL		write_node_cfg(scfg_t* cfg, int backup_level);
+DLLEXPORT BOOL		write_main_cfg(scfg_t* cfg, int backup_level);
+DLLEXPORT BOOL		write_msgs_cfg(scfg_t* cfg, int backup_level);
+DLLEXPORT BOOL		write_file_cfg(scfg_t* cfg, int backup_level);
+DLLEXPORT BOOL		write_chat_cfg(scfg_t* cfg, int backup_level);
+DLLEXPORT BOOL		write_xtrn_cfg(scfg_t* cfg, int backup_level);
+DLLEXPORT void		refresh_cfg(scfg_t* cfg);
+DLLEXPORT int		smb_storage_mode(scfg_t*, smb_t*);
+DLLEXPORT int		smb_open_sub(scfg_t*, smb_t*, unsigned int subnum);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* Don't add anything after this line */
diff --git a/src/sbbs3/smbactiv.c b/src/sbbs3/smbactiv.c
index 4fb72c54c3..055fc32d2c 100644
--- a/src/sbbs3/smbactiv.c
+++ b/src/sbbs3/smbactiv.c
@@ -1,8 +1,27 @@
-/* SMBACTIV.C */
-
-/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
-
-#include "sbbs.h"
+/****************************************************************************
+ * @format.tab-size 4		(Plain Text/Source Code File Header)			*
+ * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
+ *																			*
+ * Copyright Rob Swindell - http://www.synchro.net/copyright.html			*
+ *																			*
+ * This program is free software; you can redistribute it and/or			*
+ * modify it under the terms of the GNU General Public License				*
+ * as published by the Free Software Foundation; either version 2			*
+ * of the License, or (at your option) any later version.					*
+ * See the GNU General Public License for more details: gpl.txt or			*
+ * http://www.fsf.org/copyleft/gpl.html										*
+ *																			*
+ * For Synchronet coding style and modification guidelines, see				*
+ * http://www.synchro.net/source.html										*
+ *																			*
+ * Note: If this box doesn't appear square, then you need to fix your tabs.	*
+ ****************************************************************************/
+
+#include "load_cfg.h"
+#include "smblib.h"
+#include "str_util.h"
+#include "nopen.h"
+#include <stdarg.h>
 
 #define SMBACTIV_VER "1.01"
 
diff --git a/src/sbbs3/smbutil.c b/src/sbbs3/smbutil.c
index f651220e6b..daeddf3447 100644
--- a/src/sbbs3/smbutil.c
+++ b/src/sbbs3/smbutil.c
@@ -1,8 +1,5 @@
 /* Synchronet message base (SMB) utility */
 
-/* $Id: smbutil.c,v 1.136 2020/05/25 00:40:34 rswindell Exp $ */
-// vi: tabstop=4
-
 /****************************************************************************
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
@@ -16,21 +13,9 @@
  * See the GNU General Public License for more details: gpl.txt or			*
  * http://www.fsf.org/copyleft/gpl.html										*
  *																			*
- * Anonymous FTP access to the most recent released source is available at	*
- * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net	*
- *																			*
- * Anonymous CVS access to the development source and modification history	*
- * is available at cvs.synchro.net:/cvsroot/sbbs, example:					*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login			*
- *     (just hit return, no password is necessary)							*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src		*
- *																			*
  * For Synchronet coding style and modification guidelines, see				*
  * http://www.synchro.net/source.html										*
  *																			*
- * You are encouraged to submit any modifications (preferably in Unix diff	*
- * format) via e-mail to mods@synchro.net									*
- *																			*
  * Note: If this box doesn't appear square, then you need to fix your tabs.	*
  ****************************************************************************/
 
@@ -63,8 +48,10 @@ const char *mon[]={"Jan","Feb","Mar","Apr","May","Jun"
 #include <string.h>		/* strrchr */
 #include <ctype.h>		/* toupper */
 
+#include "fidodefs.h"
+#include "smblib.h"
+#include "str_util.h"
 #include "utf8.h"
-#include "sbbs.h"
 #include "conwrap.h"
 
 /* gets is dangerous */
diff --git a/src/sbbs3/str_util.c b/src/sbbs3/str_util.c
index e64133be0e..23457c2535 100644
--- a/src/sbbs3/str_util.c
+++ b/src/sbbs3/str_util.c
@@ -1,7 +1,5 @@
 /* Synchronet string utility routines */
 
-/* $Id: str_util.c,v 1.68 2020/08/17 00:48:29 rswindell Exp $ */
-
 /****************************************************************************
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
@@ -15,25 +13,13 @@
  * See the GNU General Public License for more details: gpl.txt or			*
  * http://www.fsf.org/copyleft/gpl.html										*
  *																			*
- * Anonymous FTP access to the most recent released source is available at	*
- * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net	*
- *																			*
- * Anonymous CVS access to the development source and modification history	*
- * is available at cvs.synchro.net:/cvsroot/sbbs, example:					*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login			*
- *     (just hit return, no password is necessary)							*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src		*
- *																			*
  * For Synchronet coding style and modification guidelines, see				*
  * http://www.synchro.net/source.html										*
  *																			*
- * You are encouraged to submit any modifications (preferably in Unix diff	*
- * format) via e-mail to mods@synchro.net									*
- *																			*
  * Note: If this box doesn't appear square, then you need to fix your tabs.	*
  ****************************************************************************/
 
-#include "sbbs.h"
+#include "str_util.h"
 #include "utf8.h"
 #include "unicode.h"
 #include "cp437defs.h"
diff --git a/src/sbbs3/str_util.h b/src/sbbs3/str_util.h
new file mode 100644
index 0000000000..4ffac35a80
--- /dev/null
+++ b/src/sbbs3/str_util.h
@@ -0,0 +1,73 @@
+/* Synchronet string utility functions */
+
+/****************************************************************************
+ * @format.tab-size 4		(Plain Text/Source Code File Header)			*
+ * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
+ *																			*
+ * Copyright Rob Swindell - http://www.synchro.net/copyright.html			*
+ *																			*
+ * This program is free software; you can redistribute it and/or			*
+ * modify it under the terms of the GNU General Public License				*
+ * as published by the Free Software Foundation; either version 2			*
+ * of the License, or (at your option) any later version.					*
+ * See the GNU General Public License for more details: gpl.txt or			*
+ * http://www.fsf.org/copyleft/gpl.html										*
+ *																			*
+ * For Synchronet coding style and modification guidelines, see				*
+ * http://www.synchro.net/source.html										*
+ *																			*
+ * Note: If this box doesn't appear square, then you need to fix your tabs.	*
+ ****************************************************************************/
+
+#ifndef _STR_UTIL_H_
+#define _STR_UTIL_H_
+
+#include "scfgdefs.h"	// scfg_t
+#include "dllexport.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+DLLEXPORT char*		backslashcolon(char *str);
+DLLEXPORT ulong		ahtoul(const char *str);	/* Converts ASCII hex to ulong */
+DLLEXPORT char *	hexplus(uint num, char *str); 	/* Hex plus for 3 digits up to 9000 */
+DLLEXPORT uint		hptoi(const char *str);
+DLLEXPORT int		pstrcmp(const char **str1, const char **str2);  /* Compares pointers to pointers */
+DLLEXPORT int		strsame(const char *str1, const char *str2);	/* Compares number of same chars */
+DLLEXPORT char *	remove_ctrl_a(const char* instr, char* outstr);
+DLLEXPORT char 		ctrl_a_to_ascii_char(char code);
+DLLEXPORT char *	truncstr(char* str, const char* set);
+DLLEXPORT char *	ascii_str(uchar* str);
+DLLEXPORT char *	condense_whitespace(char* str);
+DLLEXPORT char		exascii_to_ascii_char(uchar ch);
+DLLEXPORT BOOL		findstr(const char *insearch, const char *fname);
+DLLEXPORT BOOL		findstr_in_string(const char* insearchof, char* string);
+DLLEXPORT BOOL		findstr_in_list(const char* insearchof, str_list_t list);
+DLLEXPORT str_list_t findstr_list(const char* fname);
+DLLEXPORT BOOL		trashcan(scfg_t* cfg, const char *insearch, const char *name);
+DLLEXPORT char *	trashcan_fname(scfg_t* cfg, const char *name, char* fname, size_t);
+DLLEXPORT str_list_t trashcan_list(scfg_t* cfg, const char* name);
+DLLEXPORT char *	strip_ansi(char* str);
+DLLEXPORT char *	strip_exascii(const char *str, char* dest);
+DLLEXPORT char *	strip_space(const char *str, char* dest);
+DLLEXPORT char *	prep_file_desc(const char *str, char* dest);
+DLLEXPORT char *	strip_ctrl(const char *str, char* dest);
+DLLEXPORT char *	strip_char(const char* str, char* dest, char);
+DLLEXPORT char *	net_addr(net_t* net);
+DLLEXPORT BOOL		valid_ctrl_a_attr(char a);
+DLLEXPORT BOOL		valid_ctrl_a_code(char a);
+DLLEXPORT size_t	strip_invalid_attr(char *str);
+DLLEXPORT char *	ultoac(ulong l,char *str);
+DLLEXPORT char *	rot13(char* str);
+DLLEXPORT uint32_t	str_to_bits(uint32_t currval, const char *str);
+DLLEXPORT BOOL		str_has_ctrl(const char*);
+DLLEXPORT BOOL		str_is_ascii(const char*);
+DLLEXPORT char *	utf8_to_cp437_str(char* str);
+DLLEXPORT char *	subnewsgroupname(scfg_t*, sub_t*, char*, size_t);
+DLLEXPORT char * 	get_ctrl_dir(BOOL warn);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* Don't add anything after this line */
\ No newline at end of file
diff --git a/src/sbbs3/userdat.c b/src/sbbs3/userdat.c
index 2ed12a4e7b..723952e512 100644
--- a/src/sbbs3/userdat.c
+++ b/src/sbbs3/userdat.c
@@ -1,7 +1,4 @@
 /* Synchronet user data-related routines (exported) */
-// vi: tabstop=4
-
-/* $Id: userdat.c,v 1.230 2020/08/16 00:47:36 rswindell Exp $ */
 
 /****************************************************************************
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
@@ -16,26 +13,25 @@
  * See the GNU General Public License for more details: gpl.txt or			*
  * http://www.fsf.org/copyleft/gpl.html										*
  *																			*
- * Anonymous FTP access to the most recent released source is available at	*
- * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net	*
- *																			*
- * Anonymous CVS access to the development source and modification history	*
- * is available at cvs.synchro.net:/cvsroot/sbbs, example:					*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login			*
- *     (just hit return, no password is necessary)							*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src		*
- *																			*
  * For Synchronet coding style and modification guidelines, see				*
  * http://www.synchro.net/source.html										*
  *																			*
- * You are encouraged to submit any modifications (preferably in Unix diff	*
- * format) via e-mail to mods@synchro.net									*
- *																			*
  * Note: If this box doesn't appear square, then you need to fix your tabs.	*
  ****************************************************************************/
 
-#include "sbbs.h"
+#include "str_util.h"
 #include "cmdshell.h"
+#include "userdat.h"
+#include "filedat.h"
+#include "ars_defs.h"
+#include "text.h"
+#include "nopen.h"
+#include "datewrap.h"
+#include "date_str.h"
+#include "smblib.h"
+#include "getstats.h"
+#include "msgdate.h"
+
 #ifndef USHRT_MAX
 	#define USHRT_MAX ((unsigned short)~0)
 #endif
diff --git a/src/sbbs3/userdat.h b/src/sbbs3/userdat.h
index 8978c531b8..36c4624402 100644
--- a/src/sbbs3/userdat.h
+++ b/src/sbbs3/userdat.h
@@ -1,7 +1,5 @@
 /* Synchronet user data access routines (exported) */
 
-/* $Id: userdat.h,v 1.77 2020/04/30 18:25:58 rswindell Exp $ */
-
 /****************************************************************************
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
@@ -15,21 +13,9 @@
  * See the GNU General Public License for more details: gpl.txt or			*
  * http://www.fsf.org/copyleft/gpl.html										*
  *																			*
- * Anonymous FTP access to the most recent released source is available at	*
- * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net	*
- *																			*
- * Anonymous CVS access to the development source and modification history	*
- * is available at cvs.synchro.net:/cvsroot/sbbs, example:					*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login			*
- *     (just hit return, no password is necessary)							*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src		*
- *																			*
  * For Synchronet coding style and modification guidelines, see				*
  * http://www.synchro.net/source.html										*
  *																			*
- * You are encouraged to submit any modifications (preferably in Unix diff	*
- * format) via e-mail to mods@synchro.net									*
- *																			*
  * Note: If this box doesn't appear square, then you need to fix your tabs.	*
  ****************************************************************************/
 
@@ -40,24 +26,8 @@
 #include "dat_rec.h"	/* getrec/putrec prototypes */
 #include "client.h"		/* client_t */
 #include "link_list.h"
-
-#ifdef DLLEXPORT
-#undef DLLEXPORT
-#endif
-
-#ifdef _WIN32
-	#ifdef __MINGW32__
-		#define DLLEXPORT
-	#else
-		#ifdef SBBS_EXPORTS
-			#define DLLEXPORT __declspec(dllexport)
-		#else
-			#define DLLEXPORT __declspec(dllimport)
-		#endif
-	#endif
-#else
-	#define DLLEXPORT
-#endif
+#include "startup.h"	/* struct login_attempt_settings */
+#include "dllexport.h"
 
 #ifdef __cplusplus
 extern "C" {
-- 
GitLab