diff --git a/src/sbbs3/ftpsrvr.c b/src/sbbs3/ftpsrvr.c
index c69cb4cd47144020c6494edd50da3ec6c55f67d9..95384f1819c8f41df323f4c4caf8b44ddf08ca43 100644
--- a/src/sbbs3/ftpsrvr.c
+++ b/src/sbbs3/ftpsrvr.c
@@ -549,8 +549,11 @@ bool ftp_remove(SOCKET sock, int line, const char* fname, const char* username,
 	int ret=0;
 
 	if(fexist(fname) && (ret=remove(fname))!=0) {
-		if(fexist(fname))	// In case there was a race condition (other host deleted file first)
-			lprintf(err_level, "%04d <%s> !ERROR %d (%s) (line %d) removing file: %s", sock, username, errno, strerror(errno), line, fname);
+		if(fexist(fname)) {	// In case there was a race condition (other host deleted file first)
+			char error[256];
+			lprintf(err_level, "%04d <%s> !ERROR %d (%s) (line %d) removing file: %s"
+				,sock, username, errno, safe_strerror(errno, error, sizeof error), line, fname);
+		}
 	}
 	return ret == 0;
 }
@@ -579,6 +582,7 @@ static void send_thread(void* arg)
 {
 	char		buf[8192];
 	char		str[256];
+	char		errstr[256];
 	char		tmp[128];
 	char		username[128];
 	char		host_ip[INET6_ADDRSTRLEN];
@@ -631,8 +635,8 @@ static void send_thread(void* arg)
 	if((fp=fnopen(NULL,xfer.filename,O_RDONLY|O_BINARY))==NULL	/* non-shareable open failed */
 		&& (fp=fopen(xfer.filename,"rb"))==NULL) {				/* shareable open failed */
 		lprintf(LOG_ERR,"%04d <%s> !DATA ERROR %d (%s) line %d opening %s"
-			,xfer.ctrl_sock, xfer.user->alias, errno, strerror(errno), __LINE__, xfer.filename);
-		sockprintf(xfer.ctrl_sock,xfer.ctrl_sess,"450 ERROR %d (%s) opening %s", errno, strerror(errno), xfer.filename);
+			,xfer.ctrl_sock, xfer.user->alias, errno, safe_strerror(errno, errstr, sizeof errstr), __LINE__, xfer.filename);
+		sockprintf(xfer.ctrl_sock,xfer.ctrl_sess,"450 ERROR %d (%s) opening %s", errno, safe_strerror(errno, errstr, sizeof errstr), xfer.filename);
 		if(xfer.tmpfile && !(startup->options&FTP_OPT_KEEP_TEMP_FILES))
 			ftp_remove(xfer.ctrl_sock, __LINE__, xfer.filename, xfer.user->alias, LOG_ERR);
 		ftp_close_socket(xfer.data_sock,xfer.data_sess,__LINE__);
@@ -756,8 +760,8 @@ static void send_thread(void* arg)
 	}
 
 	if((i=ferror(fp))!=0)
-		lprintf(LOG_ERR,"%04d <%s> !DATA FILE ERROR %d (%d, %s)"
-			,xfer.ctrl_sock, xfer.user->alias, i, errno, strerror(errno));
+		lprintf(LOG_ERR,"%04d <%s> !DATA FILE ERROR %d (errno=%d: %s)"
+			,xfer.ctrl_sock, xfer.user->alias, i, errno, safe_strerror(errno, errstr, sizeof errstr));
 
 	ftp_close_socket(xfer.data_sock,xfer.data_sess,__LINE__);	/* Signal end of file */
 	if(startup->options&FTP_OPT_DEBUG_DATA)
@@ -870,6 +874,7 @@ static void send_thread(void* arg)
 static void receive_thread(void* arg)
 {
 	char		str[128];
+	char		errstr[256];
 	char		buf[8192];
 	char		extdesc[LEN_EXTDESC + 1] = "";
 	char		tmp[MAX_PATH+1];
@@ -896,8 +901,8 @@ static void receive_thread(void* arg)
 
 	if((fp=fopen(xfer.filename,xfer.append ? "ab" : "wb"))==NULL) {
 		lprintf(LOG_ERR,"%04d <%s> !DATA ERROR %d (%s) line %d opening %s"
-			,xfer.ctrl_sock, xfer.user->alias, errno, strerror(errno), __LINE__, xfer.filename);
-		sockprintf(xfer.ctrl_sock,xfer.ctrl_sess,"450 ERROR %d (%s) opening %s", errno, strerror(errno), xfer.filename);
+			,xfer.ctrl_sock, xfer.user->alias, errno, safe_strerror(errno, errstr, sizeof errstr), __LINE__, xfer.filename);
+		sockprintf(xfer.ctrl_sock,xfer.ctrl_sess,"450 ERROR %d (%s) opening %s", errno, safe_strerror(errno, errstr, sizeof errstr), xfer.filename);
 		ftp_close_socket(xfer.data_sock,xfer.data_sess,__LINE__);
 		*xfer.inprogress=FALSE;
 		thread_down();
@@ -2119,6 +2124,7 @@ static void ctrl_thread(void* arg)
 	char		str[128];
 	char		uniq[33];
 	char		owner[33];
+	char		error[256];
 	char*		cmd;
 	char*		p;
 	char*		np;
@@ -2510,8 +2516,8 @@ static void ctrl_thread(void* arg)
 			SKIP_WHITESPACE(p);
 
 			SAFECOPY(password,p);
-			int usernum = find_login_id(&scfg, user.alias);
-			if(usernum < 1) {
+			uint usernum = find_login_id(&scfg, user.alias);
+			if(usernum == 0) {
 				if(scfg.sys_misc&SM_ECHO_PW)
 					lprintf(LOG_NOTICE,"%04d !UNKNOWN USER: '%s' (password: %s)",sock,user.alias,p);
 				else
@@ -2522,8 +2528,8 @@ static void ctrl_thread(void* arg)
 			}
 			user.number = usernum;
 			if((i=getuserdat(&scfg, &user))!=0) {
-				lprintf(LOG_ERR,"%04d <%s> !ERROR %d (errno=%d) getting data for user #%d"
-					,sock, user.alias, i, errno, usernum);
+				lprintf(LOG_ERR,"%04d <%s> !ERROR %d (errno=%d: %s) getting data for user #%d"
+					,sock, user.alias, i, errno, safe_strerror(errno, error, sizeof error), usernum);
 				sockprintf(sock,sess,"530 Database error %d",i);
 				continue;
 			}
@@ -3224,7 +3230,7 @@ static void ctrl_thread(void* arg)
 					if (cmd[3] == 'D') {
 						if((fp=fopen(ftp_tmpfname(fname,"lst",sock),"w+b"))==NULL) {
 							lprintf(LOG_ERR,"%04d <%s> !ERROR %d (%s) line %d opening %s"
-								,sock, user.alias, errno, strerror(errno), __LINE__, fname);
+								,sock, user.alias, errno, safe_strerror(errno, error, sizeof error), __LINE__, fname);
 							sockprintf(sock,sess, "451 Insufficient system storage");
 							continue;
 						}
@@ -3305,7 +3311,7 @@ static void ctrl_thread(void* arg)
 
 				if((fp=fopen(ftp_tmpfname(fname,"lst",sock),"w+b"))==NULL) {
 					lprintf(LOG_ERR,"%04d <%s> !ERROR %d (%s) line %d opening %s"
-						,sock, user.alias, errno, strerror(errno), __LINE__, fname);
+						,sock, user.alias, errno, safe_strerror(errno, error, sizeof error), __LINE__, fname);
 					sockprintf(sock,sess, "451 Insufficient system storage");
 					continue;
 				}
@@ -3450,7 +3456,7 @@ static void ctrl_thread(void* arg)
 				} else {
 					sockprintf(sock,sess,"521 Error %d creating directory: %s",errno,fname);
 					lprintf(LOG_WARNING,"%04d <%s> !ERROR %d (%s) attempting to create directory: %s"
-						,sock,user.alias,errno,strerror(errno),fname);
+						,sock,user.alias,errno,safe_strerror(errno, error, sizeof error),fname);
 				}
 				continue;
 			}
@@ -3469,7 +3475,7 @@ static void ctrl_thread(void* arg)
 				} else {
 					sockprintf(sock,sess,"450 Error %d removing directory: %s", errno, fname);
 					lprintf(LOG_WARNING,"%04d <%s> !ERROR %d (%s) removing directory: %s"
-						,sock, user.alias, errno, strerror(errno), fname);
+						,sock, user.alias, errno, safe_strerror(errno, error, sizeof error), fname);
 				}
 				continue;
 			}
@@ -3504,7 +3510,7 @@ static void ctrl_thread(void* arg)
 				} else {
 					sockprintf(sock,sess,"450 Error %d renaming file: %s", errno, ren_from);
 					lprintf(LOG_WARNING,"%04d <%s> !ERRROR %d (%s) renaming file: %s"
-						,sock, user.alias, errno, strerror(errno), ren_from);
+						,sock, user.alias, errno, safe_strerror(errno, error, sizeof error), ren_from);
 				}
 				continue;
 			}
@@ -3549,7 +3555,7 @@ static void ctrl_thread(void* arg)
 					} else {
 						sockprintf(sock,sess,"450 Error %d removing file: %s", errno, fname);
 						lprintf(LOG_WARNING,"%04d <%s> !ERROR %d (%s) deleting file: %s"
-							,sock, user.alias, errno, strerror(errno), fname);
+							,sock, user.alias, errno, safe_strerror(errno, error, sizeof error), fname);
 					}
 					continue;
 				}
@@ -3640,7 +3646,7 @@ static void ctrl_thread(void* arg)
 				if (cmd[3] == 'D') {
 					if((fp=fopen(ftp_tmpfname(fname,"lst",sock),"w+b"))==NULL) {
 						lprintf(LOG_ERR,"%04d <%s> !ERROR %d (%s) line %d opening %s"
-							,sock, user.alias, errno, strerror(errno), __LINE__, fname);
+							,sock, user.alias, errno, safe_strerror(errno, error, sizeof error), __LINE__, fname);
 						sockprintf(sock,sess, "451 Insufficient system storage");
 						continue;
 					}
@@ -3913,7 +3919,7 @@ static void ctrl_thread(void* arg)
 
 			if((fp=fopen(ftp_tmpfname(fname,"lst",sock),"w+b"))==NULL) {
 				lprintf(LOG_ERR,"%04d <%s> !ERROR %d (%s) line %d opening %s"
-					,sock, user.alias, errno, strerror(errno), __LINE__, fname);
+					,sock, user.alias, errno, safe_strerror(errno, error, sizeof error), __LINE__, fname);
 				sockprintf(sock,sess, "451 Insufficient system storage");
 				continue;
 			}
@@ -4268,10 +4274,13 @@ static void ctrl_thread(void* arg)
 				&& !stricmp(p,str) && !delecmd) {
 				if(!fexistcase(qwkfile)) {
 					lprintf(LOG_INFO,"%04d <%s> creating QWK packet...",sock,user.alias);
-					sprintf(str,"%spack%04u.now",scfg.data_dir,user.number);
+					char hostname[128];
+					if(gethostname(hostname, sizeof hostname) != 0)
+						SAFECOPY(hostname, server_host_name());
+					snprintf(str, sizeof str, "%spack%04u.%s.now",scfg.data_dir,user.number,hostname);
 					if(!fmutex(str, startup->host_name, /* max_age: */60 * 60, /* time: */NULL)) {
 						lprintf(LOG_WARNING, "%04d <%s> !ERROR %d (%s) creating mutex-semaphore file: %s"
-							,sock, user.alias, errno, strerror(errno), str);
+							,sock, user.alias, errno, safe_strerror(errno, error, sizeof error), str);
 						sockprintf(sock,sess,"451 Packet creation already in progress (are you logged-in concurrently?)");
 						filepos=0;
 						continue;
@@ -4331,7 +4340,7 @@ static void ctrl_thread(void* arg)
 				}
 				if((fp=fopen(ftp_tmpfname(fname,"ndx",sock),"wb"))==NULL) {
 					lprintf(LOG_ERR,"%04d <%s> !ERROR %d (%s) line %d opening %s"
-						,sock, user.alias, errno, strerror(errno), __LINE__, fname);
+						,sock, user.alias, errno, safe_strerror(errno, error, sizeof error), __LINE__, fname);
 					sockprintf(sock,sess, "451 Insufficient system storage");
 					filepos=0;
 					continue;
@@ -4527,7 +4536,8 @@ static void ctrl_thread(void* arg)
 					,tm.tm_hour,tm.tm_min,tm.tm_sec);
 			} else if(delecmd && success) {
 				if(removecase(fname)!=0) {
-					lprintf(LOG_ERR,"%04d <%s> !ERROR %d (%s) deleting %s", sock, user.alias, errno, strerror(errno), fname);
+					lprintf(LOG_ERR,"%04d <%s> !ERROR %d (%s) deleting %s"
+						,sock, user.alias, errno, safe_strerror(errno, error, sizeof error), fname);
 					sockprintf(sock,sess,"450 %s could not be deleted (error: %d)"
 						,fname,errno);
 				} else {
@@ -5130,7 +5140,8 @@ void ftp_server(void* arg)
 			,ctime_r(&t,str),startup->options);
 
 		if(chdir(startup->ctrl_dir)!=0)
-			lprintf(LOG_ERR,"!ERROR %d (%s) changing directory to: %s", errno, strerror(errno), startup->ctrl_dir);
+			lprintf(LOG_ERR,"!ERROR %d (%s) changing directory to: %s"
+				,errno, safe_strerror(errno, error, sizeof error), startup->ctrl_dir);
 
 		/* Initial configuration and load from CNF files */
 		SAFECOPY(scfg.ctrl_dir, startup->ctrl_dir);