diff --git a/src/sbbs3/atcodes.cpp b/src/sbbs3/atcodes.cpp
index 59f43ef825f00bec9cfce7e84e3f8273cf58adf7..2cd6fae9dd52075040a07ca849025260ac399f88 100644
--- a/src/sbbs3/atcodes.cpp
+++ b/src/sbbs3/atcodes.cpp
@@ -101,7 +101,7 @@ int sbbs_t::show_atcode(const char *instr)
 	} else if(zero_padded) {
 		int vlen = strlen(cp);
 		if(vlen < disp_len)
-			bprintf("%-.*s%s", disp_len - strlen(cp), "0000000000", cp);
+			bprintf("%-.*s%s", (int)(disp_len - strlen(cp)), "0000000000", cp);
 		else
 			bprintf("%.*s", disp_len, cp);
 	} else
diff --git a/src/sbbs3/execmisc.cpp b/src/sbbs3/execmisc.cpp
index 496911b57226a77226cd6072ab413c30b7f82388..8362cf7484d1956a5423e49b8bb3253d290574ba 100644
--- a/src/sbbs3/execmisc.cpp
+++ b/src/sbbs3/execmisc.cpp
@@ -85,7 +85,7 @@ int sbbs_t::exec_misc(csi_t* csi, char *path)
 					if(!pp || !*pp) {
 						lp=getintvar(csi,*(int32_t *)csi->ip);
 						if(lp)
-							bprintf("%ld",*lp); 
+							bprintf("%d",*lp);
 					}
 					else
 						putmsg(cmdstr(*pp,path,csi->str,buf)
@@ -107,25 +107,25 @@ int sbbs_t::exec_misc(csi_t* csi, char *path)
 					free(p);
 					return(0);
 				case SHOW_VARS:
-					bprintf("shell     str=(%08lX) %s\r\n"
+					bprintf("shell     str=(%p) %s\r\n"
 						,csi->str,csi->str);
 					for(i=0;i<csi->str_vars;i++)
-						bprintf("local  str[%d]=(%08lX) (%08lX) %s\r\n"
+						bprintf("local  str[%d]=(%08X) (%p) %s\r\n"
 							,i,csi->str_var_name[i]
 							,csi->str_var[i]
 							,csi->str_var[i]);
 					for(i=0;i<csi->int_vars;i++)
-						bprintf("local  int[%d]=(%08lX) (%08lX) %ld\r\n"
+						bprintf("local  int[%d]=(%08X) (%08X) %d\r\n"
 							,i,csi->int_var_name[i]
 							,csi->int_var[i]
 							,csi->int_var[i]);
 					for(i=0;i<global_str_vars;i++)
-						bprintf("global str[%d]=(%08lX) (%08lX) %s\r\n"
+						bprintf("global str[%d]=(%08X) (%p) %s\r\n"
 							,i,global_str_var_name[i]
 							,global_str_var[i]
 							,global_str_var[i]);
 					for(i=0;i<global_int_vars;i++)
-						bprintf("global int[%d]=(%08lX) (%08lX) %ld\r\n"
+						bprintf("global int[%d]=(%08X) (%08X) %d\r\n"
 							,i,global_int_var_name[i]
 							,global_int_var[i]
 							,global_int_var[i]);
diff --git a/src/sbbs3/getstr.cpp b/src/sbbs3/getstr.cpp
index 0b598d9263499cfedb950471136fc534011da397..cc18acd0c8911d3e4651c87561517a58d7c37b28 100644
--- a/src/sbbs3/getstr.cpp
+++ b/src/sbbs3/getstr.cpp
@@ -153,7 +153,7 @@ size_t sbbs_t::getstr(char *strout, size_t maxlen, long mode)
 						l++;
 					for(x=l;x>i;x--)
 						str1[x]=str1[x-1];
-					column+=rprintf("%.*s",l-i,str1+i);
+					column+=rprintf("%.*s",(int)(l-i),str1+i);
 					cursor_left(l-i);
 #if 0
 					if(i==maxlen-1)
@@ -526,7 +526,7 @@ size_t sbbs_t::getstr(char *strout, size_t maxlen, long mode)
 							l++;
 						for(x=l;x>i;x--)
 							str1[x]=str1[x-1];
-						column+=rprintf("%.*s",l-i,str1+i);
+						column+=rprintf("%.*s",(int)(l-i),str1+i);
 						cursor_left(l-i);
 #if 0
 						if(i==maxlen-1) {
diff --git a/src/sbbs3/listfile.cpp b/src/sbbs3/listfile.cpp
index bc844751e61a5785652130ba17f3062e145387db..7341e558d0d69caa304b31df7d43ff543d19a4bc 100644
--- a/src/sbbs3/listfile.cpp
+++ b/src/sbbs3/listfile.cpp
@@ -530,7 +530,7 @@ bool sbbs_t::listfile(const char *fname, const char *buf, uint dirnum
 			attr(cfg.color[clr_filedesc]^HIGH);
 			bprintf("%.*s",i,str+j);
 			attr(cfg.color[clr_filedesc]);
-			bprintf("%.*s",strlen(str)-(j+i),str+j+i); 
+			bprintf("%.*s",(int)(strlen(str)-(j+i)),str+j+i); 
 		}
 		else
 			bputs(str);
diff --git a/src/sbbs3/pack_qwk.cpp b/src/sbbs3/pack_qwk.cpp
index 46397a7193ab451eb6d1bda89b39ab7aeaf25f64..614a5870afc6d472e97b4bac4b199f6496e67154 100644
--- a/src/sbbs3/pack_qwk.cpp
+++ b/src/sbbs3/pack_qwk.cpp
@@ -382,7 +382,7 @@ bool sbbs_t::pack_qwk(char *packet, ulong *msgcnt, bool prepack)
 
 			for(u=0;u<mailmsgs;u++) {
 				if(online == ON_REMOTE)
-					bprintf("\b\b\b\b\b\b\b\b\b\b\b\b%4lu of %-4lu"
+					bprintf("\b\b\b\b\b\b\b\b\b\b\b\b%4u of %-4u"
 						,u+1,mailmsgs);
 
 				memset(&msg,0,sizeof(msg));
@@ -509,7 +509,7 @@ bool sbbs_t::pack_qwk(char *packet, ulong *msgcnt, bool prepack)
 
 				for(u=0;u<posts && !msgabort();u++) {
 					if(online == ON_REMOTE)
-						bprintf("\b\b\b\b\b%-5lu",u+1);
+						bprintf("\b\b\b\b\b%-5u",u+1);
 
 					subscan[usrsub[i][j]].ptr=post[u].idx.number;	/* set ptr */
 					subscan[usrsub[i][j]].last=post[u].idx.number; /* set last read */
diff --git a/src/sbbs3/readmsgs.cpp b/src/sbbs3/readmsgs.cpp
index f7598a3b332bb7871e1ec9ef9cf5cc559d64d7b3..b5c9dbd4e3741f27d1f206c5e2acd466fca1bfe1 100644
--- a/src/sbbs3/readmsgs.cpp
+++ b/src/sbbs3/readmsgs.cpp
@@ -136,53 +136,53 @@ void sbbs_t::msghdr(smbmsg_t* msg)
 	}
 
 	/* fixed fields */
-	bprintf("%-16.16s %08lX %04hX %.24s %s\r\n","when_written"	
+	bprintf("%-16.16s %08X %04hX %.24s %s\r\n","when_written"	
 		,msg->hdr.when_written.time, msg->hdr.when_written.zone
 		,timestr(msg->hdr.when_written.time)
 		,smb_zonestr(msg->hdr.when_written.zone,NULL));
-	bprintf("%-16.16s %08lX %04hX %.24s %s\r\n","when_imported"	
+	bprintf("%-16.16s %08X %04hX %.24s %s\r\n","when_imported"	
 		,msg->hdr.when_imported.time, msg->hdr.when_imported.zone
 		,timestr(msg->hdr.when_imported.time)
 		,smb_zonestr(msg->hdr.when_imported.zone,NULL));
-	bprintf("%-16.16s %04Xh\r\n","type"				,msg->hdr.type);
-	bprintf("%-16.16s %04Xh\r\n","version"			,msg->hdr.version);
-	bprintf("%-16.16s %04Xh\r\n","attr"				,msg->hdr.attr);
-	bprintf("%-16.16s %08lXh\r\n","auxattr"			,msg->hdr.auxattr);
-	bprintf("%-16.16s %08lXh\r\n","netattr"			,msg->hdr.netattr);
-	bprintf("%-16.16s %06lXh\r\n","header offset"	,msg->idx.offset);
-	bprintf("%-16.16s %u\r\n"	 ,"header length"	,msg->hdr.length);
-	bprintf("%-16.16s %ld\r\n"	 ,"number"			,msg->hdr.number);
+	bprintf("%-16.16s %04Xh\r\n"	,"type"			,msg->hdr.type);
+	bprintf("%-16.16s %04Xh\r\n"	,"version"		,msg->hdr.version);
+	bprintf("%-16.16s %04Xh\r\n"	,"attr"			,msg->hdr.attr);
+	bprintf("%-16.16s %08Xh\r\n"	,"auxattr"		,msg->hdr.auxattr);
+	bprintf("%-16.16s %08Xh\r\n"	,"netattr"		,msg->hdr.netattr);
+	bprintf("%-16.16s %06Xh\r\n"	,"header offset"	,msg->idx.offset);
+	bprintf("%-16.16s %u\r\n"	,"header length"	,msg->hdr.length);
+	bprintf("%-16.16s %d\r\n"	,"number"		,msg->hdr.number);
 
 	/* optional fixed fields */
 	if(msg->hdr.thread_id)
-		bprintf("%-16.16s %ld\r\n"	,"thread_id"		,msg->hdr.thread_id);
+		bprintf("%-16.16s %d\r\n"	,"thread_id"		,msg->hdr.thread_id);
 	if(msg->hdr.thread_back)
-		bprintf("%-16.16s %ld\r\n"	,"thread_back"		,msg->hdr.thread_back);
+		bprintf("%-16.16s %d\r\n"	,"thread_back"		,msg->hdr.thread_back);
 	if(msg->hdr.thread_next)
-		bprintf("%-16.16s %ld\r\n"	,"thread_next"		,msg->hdr.thread_next);
+		bprintf("%-16.16s %d\r\n"	,"thread_next"		,msg->hdr.thread_next);
 	if(msg->hdr.thread_first)
-		bprintf("%-16.16s %ld\r\n"	,"thread_first"		,msg->hdr.thread_first);
+		bprintf("%-16.16s %d\r\n"	,"thread_first"		,msg->hdr.thread_first);
 	if(msg->hdr.delivery_attempts)
-		bprintf("%-16.16s %hu\r\n"	,"delivery_attempts",msg->hdr.delivery_attempts);
+		bprintf("%-16.16s %hu\r\n"	,"delivery_attempts"	,msg->hdr.delivery_attempts);
 	if(msg->hdr.times_downloaded)
-		bprintf("%-16.16s %lu\r\n"	,"times_downloaded"	,msg->hdr.times_downloaded);
+		bprintf("%-16.16s %u\r\n"	,"times_downloaded"	,msg->hdr.times_downloaded);
 	if(msg->hdr.last_downloaded)
 		bprintf("%-16.16s %s\r\n"	,"last_downloaded"	,timestr(msg->hdr.last_downloaded));
 	if(msg->hdr.votes)
-		bprintf("%-16.16s %hu\r\n"	,"votes"			,msg->hdr.votes);
+		bprintf("%-16.16s %hu\r\n"	,"votes"		,msg->hdr.votes);
 
 	/* convenience integers */
 	if(msg->expiration)
-		bprintf("%-16.16s %s\r\n"	,"expiration"	
+		bprintf("%-16.16s %s\r\n"	,"expiration"
 			,timestr(msg->expiration));
 	if(msg->priority)
-		bprintf("%-16.16s %lu\r\n"	,"priority"			,msg->priority);
+		bprintf("%-16.16s %u\r\n"	,"priority"			,msg->priority);
 	if(msg->cost)
-		bprintf("%-16.16s %lu\r\n"	,"cost"				,msg->cost);
+		bprintf("%-16.16s %u\r\n"	,"cost"				,msg->cost);
 
-	bprintf("%-16.16s %06lXh\r\n"	,"data offset"		,msg->hdr.offset);
+	bprintf("%-16.16s %06Xh\r\n"	,"data offset"		,msg->hdr.offset);
 	for(i=0;i<msg->hdr.total_dfields;i++)
-		bprintf("data field[%u]    %s, offset %lu, length %lu\r\n"
+		bprintf("data field[%u]    %s, offset %u, length %u\r\n"
 				,i
 				,smb_dfieldtype(msg->dfield[i].type)
 				,msg->dfield[i].offset
@@ -461,8 +461,8 @@ void sbbs_t::show_thread(uint32_t msgnum, post_t* post, unsigned curmsg, int thr
 //		,msg.hdr.number
 		,(unsigned)i == curmsg ? '>' : ':');
 	bprintf("\1w%-*.*s\1g%c\1g%c \1w%s\r\n"
-		,cols-column-12
-		,cols-column-12
+		,(int)(cols-column-12)
+		,(int)(cols-column-12)
 		,msg.hdr.attr&MSG_ANONYMOUS && !sub_op(smb.subnum)
 			? text[Anonymous] : msg.from
 		,(unsigned)i == curmsg ? '<' : ' '
@@ -735,7 +735,7 @@ int sbbs_t::scanposts(uint subnum, long mode, const char *find)
 				break;
 			}
 			bprintf("\1n\1l\1h\1bThread\1n\1b: \1h\1c");
-			bprintf("%-.*s\r\n", cols-(column+1), msg.subj);
+			bprintf("%-.*s\r\n", (int)(cols-(column+1)), msg.subj);
 			show_thread(first, post, smb.curmsg);
 			subscan[subnum].last = post[smb.curmsg].idx.number;
 		}
diff --git a/src/sbbs3/sbbs.h b/src/sbbs3/sbbs.h
index 61bcf7c4d40c063473420746ddc293ca361fcb6c..2107a006be047eb6b2f5e7559f5ac1292ec5eee0 100644
--- a/src/sbbs3/sbbs.h
+++ b/src/sbbs3/sbbs.h
@@ -686,8 +686,16 @@ public:
 	/* con_out.cpp */
 	int		bputs(const char *str);					/* BBS puts function */
 	int		rputs(const char *str, size_t len=0);	/* BBS raw puts function */
-	int		bprintf(const char *fmt, ...);			/* BBS printf function */
-	int		rprintf(const char *fmt, ...);			/* BBS raw printf function */
+	int		bprintf(const char *fmt, ...)			/* BBS printf function */
+#if defined(__GNUC__)   // Catch printf-format errors
+    __attribute__ ((format (printf, 2, 3)));		// 1 is 'this'
+#endif
+	;
+	int		rprintf(const char *fmt, ...)			/* BBS raw printf function */
+#if defined(__GNUC__)   // Catch printf-format errors
+    __attribute__ ((format (printf, 2, 3)));		// 1 is 'this'
+#endif
+	;
 	void	backspace(void);				/* Output a destructive backspace via outchar */
 	void	outchar(char ch);				/* Output a char - check echo and emu.  */
 	void	center(char *str);
@@ -811,7 +819,11 @@ public:
 
 	/* main.cpp */
 	int		lputs(int level, const char* str);
-	int		lprintf(int level, const char *fmt, ...);
+	int		lprintf(int level, const char *fmt, ...)
+#if defined(__GNUC__)   // Catch printf-format errors
+    __attribute__ ((format (printf, 3, 4)));		// 1 is 'this'
+#endif
+	;
 	void	printstatslog(uint node);
 	ulong	logonstats(void);
 	void	logoffstats(void);
diff --git a/src/sbbs3/str.cpp b/src/sbbs3/str.cpp
index 5dde5a9ac3409739319271d48be2d7b61c713fc2..ae3d1f12214c58f64f28edb55572ce0f90e0252c 100644
--- a/src/sbbs3/str.cpp
+++ b/src/sbbs3/str.cpp
@@ -1067,7 +1067,7 @@ bool sbbs_t::spy(uint i /* node_num */)
 		return(false);
 	}
 	if(spy_socket[i-1]!=INVALID_SOCKET) {
-		bprintf("Node %d already being spied (%lx)\r\n",i,spy_socket[i-1]);
+		bprintf("Node %d already being spied (%x)\r\n",i,spy_socket[i-1]);
 		return(false);
 	}
 	bprintf("*** Synchronet Remote Spy on Node %d: Ctrl-C to Abort ***"
diff --git a/src/sbbs3/writemsg.cpp b/src/sbbs3/writemsg.cpp
index c85c4dcac56aeeacc9f2ba79ac772371212a1d7c..89523eaa808ace5763f46eb51ddc09884d13e269 100644
--- a/src/sbbs3/writemsg.cpp
+++ b/src/sbbs3/writemsg.cpp
@@ -827,14 +827,14 @@ ulong sbbs_t::msgeditor(char *buf, const char *top, char *title)
 		if(sys_status&SS_ABORT) {
 			if(line==lines)
 				free(str[line]);
-			continue; 
+			continue;
 		}
 		if(strin[0]=='/' && strlen(strin)<8) {
 			if(!stricmp(strin,"/DEBUG") && SYSOP) {
 				if(line==lines)
 					free(str[line]);
-				bprintf("\r\nline=%d lines=%d rows=%d\r\n",line,lines,rows);
-				continue; 
+				bprintf("\r\nline=%d lines=%d rows=%ld\r\n",line,lines,rows);
+				continue;
 			}
 			else if(!stricmp(strin,"/ABT")) {
 				if(line==lines) 		/* delete a line */
@@ -842,7 +842,7 @@ ulong sbbs_t::msgeditor(char *buf, const char *top, char *title)
 				for(i=0;i<lines;i++)
 					free(str[i]);
 				free(str);
-				return(0); 
+				return(0);
 			}
 			else if(toupper(strin[1])=='D') {
 				if(line==lines)         /* delete a line */