diff --git a/src/sbbs3/smbutil.c b/src/sbbs3/smbutil.c
index 63ad12dac988b2a3c9600a6693d8f3756c62d16c..cb58fc3864e0b098f1e265610652e6b578f0a765 100644
--- a/src/sbbs3/smbutil.c
+++ b/src/sbbs3/smbutil.c
@@ -87,11 +87,15 @@ const char *mon[]={"Jan","Feb","Mar","Apr","May","Jun"
 /* Global variables */
 /********************/
 
-smb_t smb;
-ulong mode=0L;
-ushort tzone=0;
-ushort xlat=XLAT_NONE;
-FILE* err_fp;
+smb_t		smb;
+ulong		mode=0L;
+ushort		tzone=0;
+ushort		xlat=XLAT_NONE;
+FILE*		nulfp;
+FILE*		errfp;
+FILE*		statfp;
+BOOL		pause_on_exit=FALSE;
+BOOL		pause_on_error=FALSE;
 
 /************************/
 /* Program usage/syntax */
@@ -118,8 +122,10 @@ char *usage=
 "       a    = always pack msg base (disable compression analysis)\n"
 "       i    = ignore dupes (do not store CRCs or search for duplicate hashes)\n"
 "       d    = use default values (no prompt) for to, from, and subject\n"
-"       o    = print errors on stdout (instead of stderr)\n"
 "       l    = LZH-compress message text\n"
+"       o    = print errors on stdout (instead of stderr)\n"
+"       p    = wait for keypress (pause) on exit\n"
+"       !    = wait for keypress (pause) on error\n"
 "       t<s> = set 'to' user name for imported message\n"
 "       n<s> = set 'to' netmail address for imported message\n"
 "       u<s> = set 'to' user number for imported message\n"
@@ -130,6 +136,19 @@ char *usage=
 "       #    = set number of messages to view/list (e.g. -1)\n"
 ;
 
+void bail(int code)
+{
+
+	if(pause_on_exit || (code && pause_on_error)) {
+		fprintf(statfp,"\nHit enter to continue...");
+		getchar();
+	}
+
+	if(code)
+		fprintf(statfp,"\nReturning error code: %d\n",code);
+	exit(code);
+}
+
 /*****************************************************************************/
 // Expands Unix LF to CRLF
 /*****************************************************************************/
@@ -171,17 +190,20 @@ void postmsg(char type, char* to, char* to_number, char* to_address,
 		if(i<1)
 			break;
 		if((msgtxt=(char*)realloc(msgtxt,msgtxtlen+i+1))==NULL) {
-			fprintf(err_fp,"\n\7realloc(%ld) failure\n",msgtxtlen+i+1);
-			exit(1);
+			fprintf(errfp,"\n\7realloc(%ld) failure\n",msgtxtlen+i+1);
+			bail(1);
 		}
-		strncpy(msgtxt+msgtxtlen,buf,i);
+		memcpy(msgtxt+msgtxtlen,buf,i);
 		msgtxtlen+=i;
 	}
 
 	if(msgtxt!=NULL) {
+
+		msgtxt[msgtxtlen]=0;	/* Must be NULL-terminated */
+
 		if((newtxt=(char*)malloc((msgtxtlen*2)+1))==NULL) {
-			fprintf(err_fp,"\n\7malloc(%ld) failure\n",(msgtxtlen*2)+1);
-			exit(1);
+			fprintf(errfp,"\n\7malloc(%ld) failure\n",(msgtxtlen*2)+1);
+			bail(1);
 		}
 
 		/* Expand LFs to CRLFs */
@@ -203,9 +225,9 @@ void postmsg(char type, char* to, char* to_number, char* to_address,
 	truncsp(str);
 
 	if((i=smb_hfield_str(&msg,RECIPIENT,str))!=SMB_SUCCESS) {
-		fprintf(err_fp,"\n\7!smb_hfield_str(0x%02X) returned %d: %s\n"
+		fprintf(errfp,"\n\7!smb_hfield_str(0x%02X) returned %d: %s\n"
 			,RECIPIENT,i,smb.last_error);
-		exit(1); 
+		bail(1); 
 	}
 	if(type=='E' || type=='N')
 		smb.status.attr|=SMB_EMAIL;
@@ -217,9 +239,9 @@ void postmsg(char type, char* to, char* to_number, char* to_address,
 			SAFECOPY(str,to_number);
 		truncsp(str);
 		if((i=smb_hfield_str(&msg,RECIPIENTEXT,str))!=SMB_SUCCESS) {
-			fprintf(err_fp,"\n\7!smb_hfield_str(0x%02X) returned %d: %s\n"
+			fprintf(errfp,"\n\7!smb_hfield_str(0x%02X) returned %d: %s\n"
 				,RECIPIENTEXT,i,smb.last_error);
-			exit(1); 
+			bail(1); 
 		}
 		msg.idx.to=atoi(str); 
 	}
@@ -241,14 +263,14 @@ void postmsg(char type, char* to, char* to_number, char* to_address,
 			else
 				net=NET_QWK;
 			if((i=smb_hfield(&msg,RECIPIENTNETTYPE,sizeof(net),&net))!=SMB_SUCCESS) {
-				fprintf(err_fp,"\n\7!smb_hfield(0x%02X) returned %d: %s\n"
+				fprintf(errfp,"\n\7!smb_hfield(0x%02X) returned %d: %s\n"
 					,RECIPIENTNETTYPE,i,smb.last_error);
-				exit(1); 
+				bail(1); 
 			}
 			if((i=smb_hfield_str(&msg,RECIPIENTNETADDR,str))!=SMB_SUCCESS) {
-				fprintf(err_fp,"\n\7!smb_hfield_str(0x%02X) returned %d: %s\n"
+				fprintf(errfp,"\n\7!smb_hfield_str(0x%02X) returned %d: %s\n"
 					,RECIPIENTNETADDR,i,smb.last_error);
-				exit(1); 
+				bail(1); 
 			} 
 		} 
 	}
@@ -260,9 +282,9 @@ void postmsg(char type, char* to, char* to_number, char* to_address,
 		SAFECOPY(str,from);
 	truncsp(str);
 	if((i=smb_hfield_str(&msg,SENDER,str))!=SMB_SUCCESS) {
-		fprintf(err_fp,"\n\7!smb_hfield_str(0x%02X) returned %d: %s\n"
+		fprintf(errfp,"\n\7!smb_hfield_str(0x%02X) returned %d: %s\n"
 			,SENDER,i,smb.last_error);
-		exit(1); 
+		bail(1); 
 	}
 	if(smb.status.attr&SMB_EMAIL) {
 		if(from_number==NULL) {
@@ -272,9 +294,9 @@ void postmsg(char type, char* to, char* to_number, char* to_address,
 			SAFECOPY(str,from_number);
 		truncsp(str);
 		if((i=smb_hfield_str(&msg,SENDEREXT,str))!=SMB_SUCCESS) {
-			fprintf(err_fp,"\n\7!smb_hfield_str(0x%02X) returned %d: %s\n"
+			fprintf(errfp,"\n\7!smb_hfield_str(0x%02X) returned %d: %s\n"
 				,SENDEREXT,i,smb.last_error);
-			exit(1); 
+			bail(1); 
 		}
 		msg.idx.from=atoi(str); 
 	} else {
@@ -282,9 +304,9 @@ void postmsg(char type, char* to, char* to_number, char* to_address,
 		msg.idx.from=crc16(str,0); 
 	}
 	if((i=smb_hfield(&msg, SENDERAGENT, sizeof(agent), &agent))!=SMB_SUCCESS) {
-		fprintf(err_fp,"\n\7!smb_hfield(0x%02X) returned %d: %s\n"
+		fprintf(errfp,"\n\7!smb_hfield(0x%02X) returned %d: %s\n"
 			,SENDERAGENT,i,smb.last_error);
-		exit(1);
+		bail(1);
 	}
 
 	if(subject==NULL) {
@@ -294,9 +316,9 @@ void postmsg(char type, char* to, char* to_number, char* to_address,
 		SAFECOPY(str,subject);
 	truncsp(str);
 	if((i=smb_hfield_str(&msg,SUBJECT,str))!=SMB_SUCCESS) {
-		fprintf(err_fp,"\n\7!smb_hfield_str(0x%02X) returned %d: %s\n"
+		fprintf(errfp,"\n\7!smb_hfield_str(0x%02X) returned %d: %s\n"
 			,SUBJECT,i,smb.last_error);
-		exit(1); 
+		bail(1); 
 	}
 	msg.idx.subj=smb_subject_crc(str);
 
@@ -308,15 +330,15 @@ void postmsg(char type, char* to, char* to_number, char* to_address,
 		,compiler
 		);
 	if((i=smb_hfield_str(&msg,FIDOPID,str))!=SMB_SUCCESS) {
-		fprintf(err_fp,"\n\7!smb_hfield_str(0x%02X) returned %d: %s\n"
+		fprintf(errfp,"\n\7!smb_hfield_str(0x%02X) returned %d: %s\n"
 			,FIDOPID,i,smb.last_error);
-		exit(1); 
+		bail(1); 
 	}
 
 	if((i=smb_addmsg(&smb,&msg,smb.status.attr&SMB_HYPERALLOC
 		,INT_TO_BOOL(mode&NOCRC),xlat,msgtxt,NULL))!=SMB_SUCCESS) {
-		fprintf(err_fp,"\n\7!smb_addmsg returned %d: %s\n",i,smb.last_error);
-		exit(1); 
+		fprintf(errfp,"\n\7!smb_addmsg returned %d: %s\n",i,smb.last_error);
+		bail(1); 
 	}
 	smb_freemsgmem(&msg);
 
@@ -332,13 +354,13 @@ void showstatus(void)
 
 	i=smb_locksmbhdr(&smb);
 	if(i) {
-		fprintf(err_fp,"\n\7!smb_locksmbhdr returned %d: %s\n",i,smb.last_error);
+		fprintf(errfp,"\n\7!smb_locksmbhdr returned %d: %s\n",i,smb.last_error);
 		return; 
 	}
 	i=smb_getstatus(&smb);
 	smb_unlocksmbhdr(&smb);
 	if(i) {
-		fprintf(err_fp,"\n\7!smb_getstatus returned %d: %s\n",i,smb.last_error);
+		fprintf(errfp,"\n\7!smb_getstatus returned %d: %s\n",i,smb.last_error);
 		return; 
 	}
 	printf("last_msg        =%lu\n"
@@ -368,13 +390,13 @@ void config(void)
 
 	i=smb_locksmbhdr(&smb);
 	if(i) {
-		fprintf(err_fp,"\n\7!smb_locksmbhdr returned %d: %s\n",i,smb.last_error);
+		fprintf(errfp,"\n\7!smb_locksmbhdr returned %d: %s\n",i,smb.last_error);
 		return; 
 	}
 	i=smb_getstatus(&smb);
 	smb_unlocksmbhdr(&smb);
 	if(i) {
-		fprintf(err_fp,"\n\7!smb_getstatus returned %d: %s\n",i,smb.last_error);
+		fprintf(errfp,"\n\7!smb_getstatus returned %d: %s\n",i,smb.last_error);
 		return; 
 	}
 	printf("Header offset =%-5lu  New value (CR=No Change): "
@@ -394,12 +416,12 @@ void config(void)
 	gets(attr);
 	i=smb_locksmbhdr(&smb);
 	if(i) {
-		fprintf(err_fp,"\n\7!smb_locksmbhdr returned %d: %s\n",i,smb.last_error);
+		fprintf(errfp,"\n\7!smb_locksmbhdr returned %d: %s\n",i,smb.last_error);
 		return; 
 	}
 	i=smb_getstatus(&smb);
 	if(i) {
-		fprintf(err_fp,"\n\7!smb_getstatus returned %d: %s\n",i,smb.last_error);
+		fprintf(errfp,"\n\7!smb_getstatus returned %d: %s\n",i,smb.last_error);
 		smb_unlocksmbhdr(&smb);
 		return; 
 	}
@@ -416,7 +438,7 @@ void config(void)
 	i=smb_putstatus(&smb);
 	smb_unlocksmbhdr(&smb);
 	if(i)
-		fprintf(err_fp,"\n\7!smb_putstatus returned %d: %s\n",i,smb.last_error);
+		fprintf(errfp,"\n\7!smb_putstatus returned %d: %s\n",i,smb.last_error);
 }
 
 /****************************************************************************/
@@ -436,13 +458,13 @@ void listmsgs(ulong start, ulong count)
 			break;
 		i=smb_lockmsghdr(&smb,&msg);
 		if(i) {
-			fprintf(err_fp,"\n\7!smb_lockmsghdr returned %d: %s\n",i,smb.last_error);
+			fprintf(errfp,"\n\7!smb_lockmsghdr returned %d: %s\n",i,smb.last_error);
 			break; 
 		}
 		i=smb_getmsghdr(&smb,&msg);
 		smb_unlockmsghdr(&smb,&msg);
 		if(i) {
-			fprintf(err_fp,"\n\7!smb_getmsghdr returned %d: %s\n",i,smb.last_error);
+			fprintf(errfp,"\n\7!smb_getmsghdr returned %d: %s\n",i,smb.last_error);
 			break; 
 		}
 		printf("%4lu %-25.25s %-25.25s %.20s\n"
@@ -528,13 +550,13 @@ void viewmsgs(ulong start, ulong count)
 			break;
 		i=smb_lockmsghdr(&smb,&msg);
 		if(i) {
-			fprintf(err_fp,"\n\7!smb_lockmsghdr returned %d: %s\n",i,smb.last_error);
+			fprintf(errfp,"\n\7!smb_lockmsghdr returned %d: %s\n",i,smb.last_error);
 			break; 
 		}
 		i=smb_getmsghdr(&smb,&msg);
 		smb_unlockmsghdr(&smb,&msg);
 		if(i) {
-			fprintf(err_fp,"\n\7!smb_getmsghdr returned %d: %s\n",i,smb.last_error);
+			fprintf(errfp,"\n\7!smb_getmsghdr returned %d: %s\n",i,smb.last_error);
 			break; 
 		}
 
@@ -556,7 +578,7 @@ void dump_hashes(void)
 	hash_t	hash;
 
 	if((retval=smb_open_hash(&smb))!=SMB_SUCCESS) {
-		fprintf(err_fp,"\n\7!smb_open_hash returned %d: %s\n", retval, smb.last_error);
+		fprintf(errfp,"\n\7!smb_open_hash returned %d: %s\n", retval, smb.last_error);
 		return;
 	}
 
@@ -595,13 +617,13 @@ void maint(void)
 	now=time(NULL);
 	i=smb_locksmbhdr(&smb);
 	if(i) {
-		fprintf(err_fp,"\n\7!smb_locksmbhdr returned %d: %s\n",i,smb.last_error);
+		fprintf(errfp,"\n\7!smb_locksmbhdr returned %d: %s\n",i,smb.last_error);
 		return; 
 	}
 	i=smb_getstatus(&smb);
 	if(i) {
 		smb_unlocksmbhdr(&smb);
-		fprintf(err_fp,"\n\7!smb_getstatus returned %d: %s\n",i,smb.last_error);
+		fprintf(errfp,"\n\7!smb_getstatus returned %d: %s\n",i,smb.last_error);
 		return; 
 	}
 	if(!smb.status.total_msgs) {
@@ -613,7 +635,7 @@ void maint(void)
 	if((idx=(idxrec_t *)LMALLOC(sizeof(idxrec_t)*smb.status.total_msgs))
 		==NULL) {
 		smb_unlocksmbhdr(&smb);
-		fprintf(err_fp,"\n\7!Error allocating %lu bytes of memory\n"
+		fprintf(errfp,"\n\7!Error allocating %lu bytes of memory\n"
 			,sizeof(idxrec_t)*smb.status.total_msgs);
 		return; 
 	}
@@ -689,14 +711,14 @@ void maint(void)
 			i=smb_open_da(&smb);
 			if(i) {
 				smb_unlocksmbhdr(&smb);
-				fprintf(err_fp,"\n\7!smb_open_da returned %d: %s\n",i,smb.last_error);
-				exit(1); 
+				fprintf(errfp,"\n\7!smb_open_da returned %d: %s\n",i,smb.last_error);
+				bail(1); 
 			}
 			i=smb_open_ha(&smb);
 			if(i) {
 				smb_unlocksmbhdr(&smb);
-				fprintf(err_fp,"\n\7!smb_open_ha returned %d: %s\n",i,smb.last_error);
-				exit(1); 
+				fprintf(errfp,"\n\7!smb_open_ha returned %d: %s\n",i,smb.last_error);
+				bail(1); 
 			} 
 		}
 
@@ -706,30 +728,30 @@ void maint(void)
 				msg.idx=idx[m];
 				msg.hdr.number=msg.idx.number;
 				if((i=smb_getmsgidx(&smb,&msg))!=0) {
-					fprintf(err_fp,"\n\7!smb_getmsgidx returned %d: %s\n",i,smb.last_error);
+					fprintf(errfp,"\n\7!smb_getmsgidx returned %d: %s\n",i,smb.last_error);
 					continue; 
 				}
 				i=smb_lockmsghdr(&smb,&msg);
 				if(i) {
-					fprintf(err_fp,"\n\7!smb_lockmsghdr returned %d: %s\n",i,smb.last_error);
+					fprintf(errfp,"\n\7!smb_lockmsghdr returned %d: %s\n",i,smb.last_error);
 					break; 
 				}
 				if((i=smb_getmsghdr(&smb,&msg))!=0) {
 					smb_unlockmsghdr(&smb,&msg);
-					fprintf(err_fp,"\n\7!smb_getmsghdr returned %d: %s\n",i,smb.last_error);
+					fprintf(errfp,"\n\7!smb_getmsghdr returned %d: %s\n",i,smb.last_error);
 					break; 
 				}
 				msg.hdr.attr|=MSG_DELETE;			/* mark header as deleted */
 				if((i=smb_putmsg(&smb,&msg))!=0) {
 					smb_freemsgmem(&msg);
 					smb_unlockmsghdr(&smb,&msg);
-					fprintf(err_fp,"\n\7!smb_putmsg returned %d: %s\n",i,smb.last_error);
+					fprintf(errfp,"\n\7!smb_putmsg returned %d: %s\n",i,smb.last_error);
 					break; 
 				}
 				smb_unlockmsghdr(&smb,&msg);
 				if((i=smb_freemsg(&smb,&msg))!=0) {
 					smb_freemsgmem(&msg);
-					fprintf(err_fp,"\n\7!smb_freemsg returned %d: %s\n",i,smb.last_error);
+					fprintf(errfp,"\n\7!smb_freemsg returned %d: %s\n",i,smb.last_error);
 					break; 
 				}
 				smb_freemsgmem(&msg); 
@@ -783,13 +805,13 @@ void packmsgs(ulong packable)
 	printf("Packing %s\n",smb.file);
 	i=smb_locksmbhdr(&smb);
 	if(i) {
-		fprintf(err_fp,"\n\7!smb_locksmbhdr returned %d: %s\n",i,smb.last_error);
+		fprintf(errfp,"\n\7!smb_locksmbhdr returned %d: %s\n",i,smb.last_error);
 		return; 
 	}
 	i=smb_getstatus(&smb);
 	if(i) {
 		smb_unlocksmbhdr(&smb);
-		fprintf(err_fp,"\n\7!smb_getstatus returned %d: %s\n",i,smb.last_error);
+		fprintf(errfp,"\n\7!smb_getstatus returned %d: %s\n",i,smb.last_error);
 		return; 
 	}
 
@@ -797,14 +819,14 @@ void packmsgs(ulong packable)
 		i=smb_open_ha(&smb);
 		if(i) {
 			smb_unlocksmbhdr(&smb);
-			fprintf(err_fp,"\n\7!smb_open_ha returned %d: %s\n",i,smb.last_error);
+			fprintf(errfp,"\n\7!smb_open_ha returned %d: %s\n",i,smb.last_error);
 			return; 
 		}
 		i=smb_open_da(&smb);
 		if(i) {
 			smb_unlocksmbhdr(&smb);
 			smb_close_ha(&smb);
-			fprintf(err_fp,"\n\7!smb_open_da returned %d: %s\n",i,smb.last_error);
+			fprintf(errfp,"\n\7!smb_open_da returned %d: %s\n",i,smb.last_error);
 			return; 
 		} 
 	}
@@ -945,7 +967,7 @@ void packmsgs(ulong packable)
 			smb_close_ha(&smb);
 			smb_close_da(&smb); 
 		}
-		fprintf(err_fp,"\n\7!Error opening temp files\n");
+		fprintf(errfp,"\n\7!Error opening temp files\n");
 		return; 
 	}
 	setvbuf(tmp_sdt,NULL,_IOFBF,2*1024);
@@ -960,7 +982,7 @@ void packmsgs(ulong packable)
 		fclose(tmp_sdt);
 		fclose(tmp_shd);
 		fclose(tmp_sid);
-		fprintf(err_fp,"\n\7!Error allocating memory\n");
+		fprintf(errfp,"\n\7!Error allocating memory\n");
 		return; 
 	}
 	fseek(smb.shd_fp,0L,SEEK_SET);
@@ -983,13 +1005,13 @@ void packmsgs(ulong packable)
 		}
 		i=smb_lockmsghdr(&smb,&msg);
 		if(i) {
-			fprintf(err_fp,"\n\7!smb_lockmsghdr returned %d: %s\n",i,smb.last_error);
+			fprintf(errfp,"\n\7!smb_lockmsghdr returned %d: %s\n",i,smb.last_error);
 			continue; 
 		}
 		i=smb_getmsghdr(&smb,&msg);
 		smb_unlockmsghdr(&smb,&msg);
 		if(i) {
-			fprintf(err_fp,"\n\7!smb_getmsghdr returned %d: %s\n",i,smb.last_error);
+			fprintf(errfp,"\n\7!smb_getmsghdr returned %d: %s\n",i,smb.last_error);
 			continue; 
 		}
 		if(msg.hdr.attr&MSG_DELETE) {
@@ -1018,7 +1040,7 @@ void packmsgs(ulong packable)
 
 			m=smb_getmsgdatlen(&msg);
 			if(m>16L*1024L*1024L) {
-				fprintf(err_fp,"\n\7!Invalid data length (%lu)\n",m);
+				fprintf(errfp,"\n\7!Invalid data length (%lu)\n",m);
 				continue; 
 			}
 
@@ -1109,12 +1131,12 @@ void packmsgs(ulong packable)
 	sprintf(fname,"%s.shd",smb.file);
 	if(remove(fname)!=0) {
 		error=TRUE;
-		fprintf(err_fp,"\n\7!Error %d removing %s\n",errno,fname);
+		fprintf(errfp,"\n\7!Error %d removing %s\n",errno,fname);
 	}
 	sprintf(tmpfname,"%s.sh$",smb.file);
 	if(!error && rename(tmpfname,fname)!=0) {
 		error=TRUE;
-		fprintf(err_fp,"\n\7!Error %d renaming %s to %s\n",errno,tmpfname,fname);
+		fprintf(errfp,"\n\7!Error %d renaming %s to %s\n",errno,tmpfname,fname);
 	}
 
 
@@ -1124,13 +1146,13 @@ void packmsgs(ulong packable)
 	sprintf(fname,"%s.sdt",smb.file);
 	if(!error && remove(fname)!=0) {
 		error=TRUE;
-		fprintf(err_fp,"\n\7!Error %d removing %s\n",errno,fname);
+		fprintf(errfp,"\n\7!Error %d removing %s\n",errno,fname);
 	}
 
 	sprintf(tmpfname,"%s.sd$",smb.file);
 	if(!error && rename(tmpfname,fname)!=0) {
 		error=TRUE;
-		fprintf(err_fp,"\n\7!Error %d renaming %s to %s\n",errno,tmpfname,fname);
+		fprintf(errfp,"\n\7!Error %d renaming %s to %s\n",errno,tmpfname,fname);
 	}
 
 	/* Change *.si$ into *.sid */
@@ -1139,27 +1161,27 @@ void packmsgs(ulong packable)
 	sprintf(fname,"%s.sid",smb.file);
 	if(!error && remove(fname)!=0) {
 		error=TRUE;
-		fprintf(err_fp,"\n\7!Error %d removing %s\n",errno,fname);
+		fprintf(errfp,"\n\7!Error %d removing %s\n",errno,fname);
 	}
 
 	sprintf(tmpfname,"%s.si$",smb.file);
 	if(!error && rename(tmpfname,fname)!=0) {
 		error=TRUE;
-		fprintf(err_fp,"\n\7!Error %d renaming %s to %s\n",errno,tmpfname,fname);
+		fprintf(errfp,"\n\7!Error %d renaming %s to %s\n",errno,tmpfname,fname);
 	}
 
 	if((i=smb_unlock(&smb))!=0)
-		fprintf(err_fp,"\n\7!ERROR %d (%s) unlocking %s\n",i,smb.last_error,smb.file);
+		fprintf(errfp,"\n\7!ERROR %d (%s) unlocking %s\n",i,smb.last_error,smb.file);
 
 	if((i=smb_open(&smb))!=0) {
-		fprintf(err_fp,"\n\7!Error %d (%s) reopening %s\n",i,smb.last_error,smb.file);
+		fprintf(errfp,"\n\7!Error %d (%s) reopening %s\n",i,smb.last_error,smb.file);
 		return; 
 	}
 	if((i=smb_locksmbhdr(&smb))!=0)
-		fprintf(err_fp,"\n\7!smb_locksmbhdr returned %d: %s\n",i,smb.last_error);
+		fprintf(errfp,"\n\7!smb_locksmbhdr returned %d: %s\n",i,smb.last_error);
 	smb.status.total_msgs=total;
 	if((i=smb_putstatus(&smb))!=0)
-		fprintf(err_fp,"\n\7!smb_putstatus returned %d: %s\n",i,smb.last_error);
+		fprintf(errfp,"\n\7!smb_putstatus returned %d: %s\n",i,smb.last_error);
 	smb_unlocksmbhdr(&smb);
 	printf("\nDone.\n\n");
 }
@@ -1172,27 +1194,27 @@ void delmsgs(void)
 
 	i=smb_locksmbhdr(&smb);
 	if(i) {
-		fprintf(err_fp,"\n\7!smb_locksmbhdr returned %d: %s\n",i,smb.last_error);
+		fprintf(errfp,"\n\7!smb_locksmbhdr returned %d: %s\n",i,smb.last_error);
 		return; 
 	}
 	i=smb_getstatus(&smb);
 	if(i) {
 		smb_unlocksmbhdr(&smb);
-		fprintf(err_fp,"\n\7!smb_getstatus returned %d: %s\n",i,smb.last_error);
+		fprintf(errfp,"\n\7!smb_getstatus returned %d: %s\n",i,smb.last_error);
 		return; 
 	}
 	if(!(smb.status.attr&SMB_HYPERALLOC)) {
 		i=smb_open_da(&smb);
 		if(i) {
 			smb_unlocksmbhdr(&smb);
-			fprintf(err_fp,"\n\7!smb_open_da returned %d: %s\n",i,smb.last_error);
-			exit(1); 
+			fprintf(errfp,"\n\7!smb_open_da returned %d: %s\n",i,smb.last_error);
+			bail(1); 
 		}
 		i=smb_open_ha(&smb);
 		if(i) {
 			smb_unlocksmbhdr(&smb);
-			fprintf(err_fp,"\n\7!smb_open_ha returned %d: %s\n",i,smb.last_error);
-			exit(1); 
+			fprintf(errfp,"\n\7!smb_open_ha returned %d: %s\n",i,smb.last_error);
+			bail(1); 
 		} 
 		/* Reset both allocation tables */
 		CHSIZE_FP(smb.sha_fp,0);
@@ -1208,7 +1230,7 @@ void delmsgs(void)
 	/* re-write status header */
 	smb.status.total_msgs=0;
 	if((i=smb_putstatus(&smb))!=0)
-		fprintf(err_fp,"\n\7!smb_putstatus returned %d: %s\n",i,smb.last_error);
+		fprintf(errfp,"\n\7!smb_putstatus returned %d: %s\n",i,smb.last_error);
 	smb_unlocksmbhdr(&smb);
 	printf("\nDone.\n\n");
 }
@@ -1233,12 +1255,12 @@ void readmsgs(ulong start)
 				break;
 			i=smb_lockmsghdr(&smb,&msg);
 			if(i) {
-				fprintf(err_fp,"\n\7!smb_lockmsghdr returned %d: %s\n",i,smb.last_error);
+				fprintf(errfp,"\n\7!smb_lockmsghdr returned %d: %s\n",i,smb.last_error);
 				break; 
 			}
 			i=smb_getmsghdr(&smb,&msg);
 			if(i) {
-				fprintf(err_fp,"\n\7!smb_getmsghdr returned %d: %s\n",i,smb.last_error);
+				fprintf(errfp,"\n\7!smb_getmsghdr returned %d: %s\n",i,smb.last_error);
 				break; 
 			}
 
@@ -1263,7 +1285,7 @@ void readmsgs(ulong start)
 
 			i=smb_unlockmsghdr(&smb,&msg);
 			if(i) {
-				fprintf(err_fp,"\n\7!smb_unlockmsghdr returned %d: %s\n",i,smb.last_error);
+				fprintf(errfp,"\n\7!smb_unlockmsghdr returned %d: %s\n",i,smb.last_error);
 				break; 
 			}
 			smb_freemsgmem(&msg); 
@@ -1377,14 +1399,23 @@ int main(int argc, char **argv)
 	struct	tm* tm;
 
 	setvbuf(stdout,0,_IONBF,0);
-	err_fp=stderr;
+
+	errfp=stderr;
+	if((nulfp=fopen(_PATH_DEVNULL,"w+"))==NULL) {
+		perror(_PATH_DEVNULL);
+		bail(-1);
+	}
+	if(isatty(fileno(stderr)))
+		statfp=stderr;
+	else	/* if redirected, don't send status messages to stderr */
+		statfp=nulfp;
 
 	sscanf("$Revision$", "%*s %s", revision);
 
 	DESCRIBE_COMPILER(compiler);
 
 	smb.file[0]=0;
-	fprintf(err_fp,"\nSMBUTIL v%s-%s (rev %s) SMBLIB %s - Synchronet Message Base "\
+	fprintf(statfp,"\nSMBUTIL v%s-%s (rev %s) SMBLIB %s - Synchronet Message Base "\
 		"Utility\n\n"
 		,SMBUTIL_VER
 		,PLATFORM_DESC
@@ -1458,16 +1489,22 @@ int main(int argc, char **argv)
 						j=strlen(argv[x])-1;
 						break;
 					case 'O':
-						err_fp=stdout;
+						errfp=stdout;
 						break;
 					case 'L':
 						xlat=XLAT_LZH;
 						break;
+					case 'P':
+						pause_on_exit=TRUE;
+						break;
+					case '!':
+						pause_on_error=TRUE;
+						break;
 					default:
 						printf("\nUnknown opt '%c'\n",argv[x][j]);
 					case '?':
 						printf("%s",usage);
-						exit(1);
+						bail(1);
 						break; 
 			} 
 		}
@@ -1481,15 +1518,15 @@ int main(int argc, char **argv)
 
 				sprintf(path,"%s.shd",smb.file);
 				if(!fexistcase(path) && !create) {
-					fprintf(err_fp,"\n%s doesn't exist (use -c to create)\n",path);
-					exit(1);
+					fprintf(errfp,"\n%s doesn't exist (use -c to create)\n",path);
+					bail(1);
 				}
 				smb.retry_time=30;
-				fprintf(err_fp,"Opening %s\r\n",smb.file);
+				fprintf(statfp,"Opening %s\r\n",smb.file);
 				if((i=smb_open(&smb))!=0) {
-					fprintf(err_fp,"\n\7!Error %d (%s) opening %s message base\n"
+					fprintf(errfp,"\n\7!Error %d (%s) opening %s message base\n"
 						,i,smb.last_error,smb.file);
-					exit(1); 
+					bail(1); 
 				}
 				if(!filelength(fileno(smb.shd_fp))) {
 					if(!create) {
@@ -1511,15 +1548,15 @@ int main(int argc, char **argv)
 						case 'N':
 							if(cmd[1]!=0) {
 								if((fp=fopen(cmd+1,"r"))==NULL) {
-									fprintf(err_fp,"\n\7!Error %d opening %s\n"
+									fprintf(errfp,"\n\7!Error %d opening %s\n"
 										,errno,cmd+1);
-									exit(1);
+									bail(1);
 								}
 							} else
 								fp=stdin;
 							i=smb_locksmbhdr(&smb);
 							if(i) {
-								fprintf(err_fp,"\n\7!smb_locksmbhdr returned %d: %s\n",i,smb.last_error);
+								fprintf(errfp,"\n\7!smb_locksmbhdr returned %d: %s\n",i,smb.last_error);
 								return(1); 
 							}
 							postmsg((char)toupper(cmd[y]),to,to_number,to_address,from,from_number,subj,fp);
@@ -1539,7 +1576,7 @@ int main(int argc, char **argv)
 						case 'P':
 						case 'D':
 							if((i=smb_lock(&smb))!=0) {
-								fprintf(err_fp,"\n\7!smb_lock returned %d: %s\n",i,smb.last_error);
+								fprintf(errfp,"\n\7!smb_lock returned %d: %s\n",i,smb.last_error);
 								return(i);
 							}
 							switch(toupper(cmd[y])) {
@@ -1577,5 +1614,8 @@ int main(int argc, char **argv)
 	}
 	if(!cmd[0])
 		printf("%s",usage);
-	return(0);
+
+	bail(0);
+
+	return(-1);	/* never gets here */
 }