diff --git a/src/sbbs3/logfile.cpp b/src/sbbs3/logfile.cpp
index 6d51b63b5d14ba8a019f35ae421482751128dfb0..7dd30168974aab744704061cb1f06d903af8c76f 100644
--- a/src/sbbs3/logfile.cpp
+++ b/src/sbbs3/logfile.cpp
@@ -313,3 +313,46 @@ void sbbs_t::errormsg(int line, const char* function, const char *src, const cha
 
 	errormsg_inside=false;
 }
+
+/****************************************************************************/
+/* Open a log file for append, supporting log rotation based on size		*/
+/****************************************************************************/
+extern "C" FILE* fopenlog(scfg_t* cfg, const char* path)
+{
+	const int mode = O_WRONLY|O_CREAT|O_APPEND;
+	int file;
+	FILE* fp;
+
+	if((fp = fnopen(&file, path, mode)) == NULL)
+		return NULL;
+
+	if(cfg->max_log_size && cfg->max_logs_kept && filelength(file) >= (off_t)cfg->max_log_size) {
+#ifdef _WIN32 // Can't rename an open file on Windows
+		fclose(fp);
+#endif
+		backup(path, cfg->max_logs_kept, /* rename: */TRUE);
+#ifndef _WIN32
+		fclose(fp);
+#endif
+		if((fp = fnopen(NULL, path, mode)) == NULL)
+			return NULL;
+	}
+
+	return fp;
+}
+
+// Write to a log file and may close it if reached max size
+extern "C" size_t fwritelog(scfg_t* cfg, void* buf, size_t size, FILE** fp)
+{
+	size_t result = fwrite(buf, 1, size, *fp);
+	if(cfg->max_log_size && ftell(*fp) >= (off_t)cfg->max_log_size) {
+		fclose(*fp);
+		*fp = NULL;
+	}
+	return result;
+}
+
+extern "C" void fcloselog(FILE* fp)
+{
+	fclose(fp);
+}
diff --git a/src/sbbs3/nopen.c b/src/sbbs3/nopen.c
index 6202e501b9406fa77b2a1f321a95ffd406ce800a..ec1e176e1180cfa573aed4e5ef781a99d5ac869a 100644
--- a/src/sbbs3/nopen.c
+++ b/src/sbbs3/nopen.c
@@ -19,11 +19,15 @@
  * Note: If this box doesn't appear square, then you need to fix your tabs.	*
  ****************************************************************************/
 
+#include "genwrap.h"
+#include "dirwrap.h"
 #include "filewrap.h"
 #include "sockwrap.h"
-#include "sbbsdefs.h"
 #include "nopen.h"
 
+#define FNOPEN_BUF_SIZE		(2*1024)
+#define LOOP_NOPEN	  50	/* Retries before file access denied			*/
+
 /****************************************************************************/
 /* Network open function. Opens all files DENYALL, DENYWRITE, or DENYNONE	*/
 /* depending on access, and retries LOOP_NOPEN number of times if the		*/
@@ -50,7 +54,7 @@ int nopen(const char* str, uint access)
     while(((file=sopen(str,access,share,DEFFILEMODE))==-1)
         && (errno==EACCES || errno==EAGAIN || errno==EDEADLOCK) && count++<LOOP_NOPEN)
         if(count)
-            mswait(100);
+            SLEEP(100);
     return(file);
 }
 
@@ -208,46 +212,3 @@ BOOL backup(const char *fname, int backup_level, BOOL ren)
 
 	return TRUE;
 }
-
-/****************************************************************************/
-/* Open a log file for append, supporting log rotation based on size		*/
-/****************************************************************************/
-FILE* fopenlog(scfg_t* cfg, const char* path)
-{
-	const int mode = O_WRONLY|O_CREAT|O_APPEND;
-	int file;
-	FILE* fp;
-
-	if((fp = fnopen(&file, path, mode)) == NULL)
-		return NULL;
-
-	if(cfg->max_log_size && cfg->max_logs_kept && filelength(file) >= (off_t)cfg->max_log_size) {
-#ifdef _WIN32 // Can't rename an open file on Windows
-		fclose(fp);
-#endif
-		backup(path, cfg->max_logs_kept, /* rename: */TRUE);
-#ifndef _WIN32
-		fclose(fp);
-#endif
-		if((fp = fnopen(NULL, path, mode)) == NULL)
-			return NULL;
-	}
-
-	return fp;
-}
-
-// Write to a log file and may close it if reached max size
-size_t fwritelog(scfg_t* cfg, void* buf, size_t size, FILE** fp)
-{
-	size_t result = fwrite(buf, 1, size, *fp);
-	if(cfg->max_log_size && ftell(*fp) >= (off_t)cfg->max_log_size) {
-		fclose(*fp);
-		*fp = NULL;
-	}
-	return result;
-}
-
-void fcloselog(FILE* fp)
-{
-	fclose(fp);
-}
diff --git a/src/sbbs3/nopen.h b/src/sbbs3/nopen.h
index eea75a380d4d49e1d5e600c0dfe4b1910196f966..bf916a6e9e410c00c00bdcbd1a907cdde14734b1 100644
--- a/src/sbbs3/nopen.h
+++ b/src/sbbs3/nopen.h
@@ -23,8 +23,8 @@
 #define _NOPEN_H
 
 #include <stdio.h>			/* FILE */
+#include <fcntl.h>			/* O_RDONLY */
 #include "gen_defs.h"		/* BOOL (switch to stdbool when we stop using BCB6) */
-#include "scfgdefs.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -36,9 +36,6 @@ BOOL	ftouch(const char* fname);
 BOOL	fmutex(const char* fname, const char* text, long max_age);
 BOOL	fcompare(const char* fn1, const char* fn2);
 BOOL	backup(const char* org, int backup_level, BOOL ren);
-FILE*	fopenlog(scfg_t*, const char* path);
-size_t	fwritelog(scfg_t*, void* buf, size_t size, FILE**);
-void	fcloselog(FILE*);
 
 #ifdef __cplusplus
 }
diff --git a/src/sbbs3/sbbs.h b/src/sbbs3/sbbs.h
index 668baee1d37fae1a013e308aa8ddcc4b67c7ecdc..1b39babb6c9313ef3d0a85a5f6547a88c341efe1 100644
--- a/src/sbbs3/sbbs.h
+++ b/src/sbbs3/sbbs.h
@@ -1301,6 +1301,9 @@ extern "C" {
 										,const char* host, union xp_sockaddr* addr);
 	DLLEXPORT BOOL		spamlog(scfg_t* cfg, struct mqtt*, char* prot, char* action, char* reason
 										,char* host, char* ip_addr, char* to, char* from);
+	DLLEXPORT FILE*		fopenlog(scfg_t*, const char* path);
+	DLLEXPORT size_t	fwritelog(scfg_t*, void* buf, size_t size, FILE**);
+	DLLEXPORT void		fcloselog(FILE*);
 
 	/* data.cpp */
 	DLLEXPORT time_t	getnextevent(scfg_t* cfg, event_t* event);
diff --git a/src/sbbs3/sbbsdefs.h b/src/sbbs3/sbbsdefs.h
index 71515a18e3c598a0018c95dd8bc05492ed87dae7..29f62cd571c1896bde6dea681f972f34b9c128af 100644
--- a/src/sbbs3/sbbsdefs.h
+++ b/src/sbbs3/sbbsdefs.h
@@ -24,7 +24,7 @@
 
 #include <time.h>
 
-#include "gen_defs.h"	/* uchar, ushort, uint, ulong, etc. */
+#include "smbdefs.h"
 #include "nodedefs.h"	/* node_t */
 #include "fidodefs.h"	/* fmsghdr_t, fpkthdr_t, FIDO_*, etc. */
 #include "xpbeep.h"		/* BEEP() */
@@ -47,8 +47,6 @@
 
 #define Y2K_2DIGIT_WINDOW	70
 
-#define FNOPEN_BUF_SIZE		(2*1024)
-
 #define MAX_FILENAME_LEN		64
 #define MAX_FILEEXT_LEN			15
 #define ILLEGAL_FILENAME_CHARS	"\\/|<>:\";,%?*"
@@ -511,7 +509,6 @@ typedef enum {						/* Values for xtrn_t.event				*/
 #define SEC_CID 	  10	/* Ten second pause for caller ID				*/
 #define SEC_RING	   6	/* Maximum seconds between rings				*/
 
-#define LOOP_NOPEN	  50	/* Retries before file access denied			*/
 #define LOOP_NODEDAB  50	/* Retries on node.dab locking/unlocking		*/
 
 							/* String lengths								*/