diff --git a/src/sbbs3/main.cpp b/src/sbbs3/main.cpp
index 9ad676c4175d0b3a01346479c407d2d072d5a852..74613d30590d98d018df5a0dd66f284a37d68222 100644
--- a/src/sbbs3/main.cpp
+++ b/src/sbbs3/main.cpp
@@ -1046,11 +1046,16 @@ void input_thread(void *arg)
 			&& sbbs->rio_abortable 
 			&& !(sbbs->telnet_mode&(TELNET_MODE_BIN_RX|TELNET_MODE_GATE))
 			&& memchr(wrbuf, CTRL_C, wr)) {	
+			if(RingBufFull(&sbbs->inbuf))
+    			lprintf("Node %d Ctrl-C hit with %lu bytes in input buffer"
+					,sbbs->cfg.node_num,RingBufFull(&sbbs->inbuf));
 			if(RingBufFull(&sbbs->outbuf))
     			lprintf("Node %d Ctrl-C hit with %lu bytes in output buffer"
 					,sbbs->cfg.node_num,RingBufFull(&sbbs->outbuf));
 			sbbs->sys_status|=SS_ABORT;
-    		RingBufReInit(&sbbs->outbuf);	/* Flush output buffer */
+			RingBufReInit(&sbbs->inbuf);	/* Purge input buffer */
+    		RingBufReInit(&sbbs->outbuf);	/* Purge output buffer */
+			continue;	// Ignore the entire buffer
 		}
 
 		avail=RingBufFree(&sbbs->inbuf);
@@ -2610,8 +2615,9 @@ int sbbs_t::incom(void)
 	if(!RingBufRead(&inbuf, &ch, 1))
 		return(NOINP);
 
-	if(rio_abortable && ch==CTRL_C)
-		return(NOINP); 
+	if(!(cfg.ctrlkey_passthru&(1<<CTRL_C))	
+		&& rio_abortable && ch==CTRL_C)
+		return(NOINP); /* this should never happen since input_thread eats Ctrl-C chars */
 
 	return(ch);
 }
@@ -2620,7 +2626,8 @@ int sbbs_t::outcom(uchar ch)
 {
 	if(!RingBufFree(&outbuf))
 		return(TXBOF);
-    RingBufWrite(&outbuf, &ch, 1);
+    if(!RingBufWrite(&outbuf, &ch, 1))
+		return(TXBOF);
 	sem_post(&output_sem);
 	return(0);
 }
@@ -2676,11 +2683,11 @@ int sbbs_t::rioctl(ushort action)
 			// ioctlsocket (client_socket,FIONREAD,&cnt);
  			return(/* cnt+ */RingBufFull(&inbuf));
 		case RXBS:		/* Get receive buffer size */
-			return(RingBufFree(&inbuf));
+			return(inbuf.size);
 		case TXBC:		/* Get transmit buffer count */
 			return(RingBufFull(&outbuf));
 		case TXBS:		/* Get transmit buffer size */
-			return(RingBufFree(&outbuf));
+			return(outbuf.size);
 		case TXBF:		/* Get transmit buffer free space */
  			return(RingBufFree(&outbuf));
 		case IOMODE: