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 */ }