From 1d87f77c80c768ca2a61f714ec52125e8754c594 Mon Sep 17 00:00:00 2001
From: rswindell <>
Date: Fri, 9 Nov 2001 01:46:54 +0000
Subject: [PATCH] Improved support for importing posts/e-mail/netmail from the
 command-line: o Added support for specifying to/from user name/number/address
 and message subject on the command-line. o Added support for using stdin for
 message text (no filename specified). Added display of smb.last_error (error
 description) when errors occur.

---
 src/sbbs3/smbutil.c | 282 ++++++++++++++++++++++++++++----------------
 1 file changed, 179 insertions(+), 103 deletions(-)

diff --git a/src/sbbs3/smbutil.c b/src/sbbs3/smbutil.c
index f799889521..6c7a4255c7 100644
--- a/src/sbbs3/smbutil.c
+++ b/src/sbbs3/smbutil.c
@@ -74,8 +74,6 @@
 smb_t smb;
 ulong mode=0L;
 ushort tzone=PST;
-char filein[128];
-char attach[128];
 
 /************************/
 /* Program usage/syntax */
@@ -88,9 +86,9 @@ char *usage=
 "       l[n] = list msgs starting at number n\n"
 "       r[n] = read msgs starting at number n\n"
 "       v[n] = view msg headers starting at number n\n"
-"       i<f> = import msg from text file f\n"
-"       e<f> = import e-mail from text file f\n"
-"       n<f> = import netmail from text file f\n"
+"       i[f] = import msg from text file f (or use stdin)\n"
+"       e[f] = import e-mail from text file f (or use stdin)\n"
+"       n[f] = import netmail from text file f (or use stdin)\n"
 "       s    = display msg base status\n"
 "       c    = change msg base status\n"
 "       m    = maintain msg base - delete old msgs and msgs over max\n"
@@ -98,6 +96,12 @@ char *usage=
 "opts:\n"
 "       c    = create message base if it doesn't exist\n"
 "       a    = always pack msg base (disable compression analysis)\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"
+"       f<s> = set 'from' user name for imported message\n"
+"       e<s> = set 'from' user number for imported message\n"
+"       s<s> = set 'subject' for imported message\n"
 "       z[n] = set time zone (n=min +/- from UT or 'EST','EDT','CST',etc)\n"
 ;
 
@@ -162,52 +166,54 @@ static void truncsp(char *str)
 /****************************************************************************/
 /* Adds a new message to the message base									*/
 /****************************************************************************/
-void postmsg(char type)
+void postmsg(char type, char* to, char* to_number, char* to_address, 
+			 char* from, char* from_number, char* subject, FILE* fp)
 {
-	char	str[128],buf[SDT_BLOCK_LEN];
+	char	str[128];
+	char	buf[128];
+	char	pad=0;
+	char*	msgtxt=NULL;
+	long	msgtxtlen;
 	ushort	xlat,net;
-	int 	i,j,k,file;
-	long	length;
-	ulong	offset,crc=0xffffffffUL;
-	FILE	*instream;
+	int 	i;
+	long	l,length;
+	ulong	offset,crc;
 	smbmsg_t	msg;
 
-	length=flength(filein);
-	if(length<1L) {
-		printf("\n\7!Invalid file size for '%s'\n",filein);
-		exit(1); }
-	length+=2;	/* for translation string */
+	/* Read message text from stream (file or stdin) */
+	msgtxtlen=0;
+	while(!feof(fp)) {
+		i=fread(buf,1,sizeof(buf),fp);
+		if(i<1)
+			break;
+		if((msgtxt=(char*)realloc(msgtxt,msgtxtlen+i))==NULL) {
+			printf("\n\7malloc(%ld) failure\n",msgtxtlen+i);
+			exit(1);
+		}
+		memcpy(msgtxt+msgtxtlen,buf,i);
+		msgtxtlen+=i;
+	}
+
+	/* Allocate space in message base */
+	length=msgtxtlen+sizeof(xlat);	/* for translation string */
 	if(!(smb.status.attr&SMB_HYPERALLOC)) {
 		i=smb_open_da(&smb);
 		if(i) {
-			printf("\n\7!smb_open_da returned %d\n",i);
-			exit(1); }
+			printf("\n\7!smb_open_da returned %d: %s\n",i,smb.last_error);
+			exit(1); 
+		}
 		offset=smb_allocdat(&smb,length,1);
-		smb_close_da(&smb); }
-	else
+		smb_close_da(&smb); 
+	} else
 		offset=smb_hallocdat(&smb);
 
-	if((file=open(filein,O_RDONLY|O_BINARY))==-1
-		|| (instream=fdopen(file,"rb"))==NULL) {
-		printf("\n\7!Error opening %s for read\n",filein);
-		smb_freemsgdat(&smb,offset,length,1);
-		exit(1); }
-	setvbuf(instream,NULL,_IOFBF,32*1024);
 	fseek(smb.sdt_fp,offset,SEEK_SET);
 	xlat=XLAT_NONE;
-	fwrite(&xlat,2,1,smb.sdt_fp);
-	k=SDT_BLOCK_LEN-2;
-	while(!feof(instream)) {
-		memset(buf,0,k);
-		j=fread(buf,1,k,instream);
-		if(smb.status.max_crcs)
-			for(i=0;i<j;i++)
-				crc=ucrc32(buf[i],crc);
-		fwrite(buf,k,1,smb.sdt_fp);
-		k=SDT_BLOCK_LEN; }
+	smb_fwrite(&xlat,sizeof(xlat),smb.sdt_fp);
+	smb_fwrite(msgtxt,msgtxtlen,smb.sdt_fp);
+	for(l=length;l%SDT_BLOCK_LEN;l++)
+		smb_fwrite(&pad,1,smb.sdt_fp);
 	fflush(smb.sdt_fp);
-	fclose(instream);
-	crc=~crc;
 
 	memset(&msg,0,sizeof(smbmsg_t));
 	memcpy(msg.hdr.id,"SHD\x1a",4);
@@ -217,41 +223,59 @@ void postmsg(char type)
 	msg.hdr.when_imported=msg.hdr.when_written;
 
 	if(smb.status.max_crcs) {
+		crc=0xffffffffUL;
+		for(l=0;l<msgtxtlen;l++) 
+			crc=ucrc32(msgtxt[l],crc);
+		crc=~crc;
 		i=smb_addcrc(&smb,crc);
 		if(i) {
-			printf("\n\7!smb_addcrc returned %d\n",i);
+			printf("\n\7!smb_addcrc returned %d: %s\n",i,smb.last_error);
 			smb_freemsgdat(&smb,offset,length,1);
-			exit(1); } }
+			exit(1); 
+		} 
+	}
 
 	msg.hdr.offset=offset;
 
-	printf("To User Name: ");
-	fgets(str,sizeof(str)-1,stdin);
+	if(to==NULL) {
+		printf("To User Name: ");
+		fgets(str,sizeof(str)-1,stdin); 
+	} else
+		sprintf(str,"%.*s",sizeof(str)-1,to);
+
 	truncsp(str);
 	i=smb_hfield(&msg,RECIPIENT,(ushort)strlen(str),str);
 	if(i) {
-		printf("\n\7!smb_hfield returned %d\n",i);
+		printf("\n\7!smb_hfield returned %d: %s\n",i,smb.last_error);
 		smb_freemsgdat(&smb,offset,length,1);
 		exit(1); }
 	if(type=='E' || type=='N')
 		smb.status.attr|=SMB_EMAIL;
 	if(smb.status.attr&SMB_EMAIL) {
-		printf("To User Number (0=QWKnet or Internet): ");
-		gets(str);
+		if(to_number==NULL) {
+			printf("To User Number (0=QWKnet or Internet): ");
+			gets(str);
+		} else
+			sprintf(str,"%.*s",sizeof(str)-1,to_number);
 		truncsp(str);
 		i=smb_hfield(&msg,RECIPIENTEXT,(ushort)strlen(str),str);
 		if(i) {
-			printf("\n\7!smb_hfield returned %d\n",i);
+			printf("\n\7!smb_hfield returned %d: %s\n",i,smb.last_error);
 			smb_freemsgdat(&smb,offset,length,1);
-			exit(1); }
+			exit(1); 
+		}
 		msg.idx.to=atoi(str); }
 	else {
 		strlwr(str);
-		msg.idx.to=crc16(str); }
+		msg.idx.to=crc16(str); 
+	}
 
 	if(smb.status.attr&SMB_EMAIL && (type=='N' || !msg.idx.to)) {
-		printf("To Address: ");
-		gets(str);
+		if(to_address==NULL) {
+			printf("To Address: ");
+			gets(str);
+		} else
+			sprintf(str,"%.*s",sizeof(str)-1,to_address);
 		truncsp(str);
 		if(*str) {
 			if(strchr(str,'.'))
@@ -260,63 +284,79 @@ void postmsg(char type)
 				net=NET_QWK;
 			i=smb_hfield(&msg,RECIPIENTNETTYPE,sizeof(net),&net);
 			if(i) {
-				printf("\n\7!smb_hfield returned %d\n",i);
+				printf("\n\7!smb_hfield returned %d: %s\n",i,smb.last_error);
 				smb_freemsgdat(&smb,offset,length,1);
 				exit(1); }
 			i=smb_hfield(&msg,RECIPIENTNETADDR,(ushort)strlen(str),str);
 			if(i) {
-				printf("\n\7!smb_hfield returned %d\n",i);
+				printf("\n\7!smb_hfield returned %d: %s\n",i,smb.last_error);
 				smb_freemsgdat(&smb,offset,length,1);
-				exit(1); } } }
+				exit(1); 
+			} 
+		} 
+	}
 
-	printf("From User Name: ");
-	gets(str);
+	if(from==NULL) {
+		printf("From User Name: ");
+		gets(str);
+	} else
+		sprintf(str,"%.*s",sizeof(str)-1,from);
 	truncsp(str);
 	i=smb_hfield(&msg,SENDER,(ushort)strlen(str),str);
 	if(i) {
-		printf("\n\7!smb_hfield returned %d\n",i);
+		printf("\n\7!smb_hfield returned %d: %s\n",i,smb.last_error);
 		smb_freemsgdat(&smb,offset,length,1);
 		exit(1); }
 	if(smb.status.attr&SMB_EMAIL) {
-		printf("From User Number: ");
-		gets(str);
+		if(from_number==NULL) {
+			printf("From User Number: ");
+			gets(str);
+		} else
+			sprintf(str,"%.*s",sizeof(str)-1,from_number);
 		truncsp(str);
 		i=smb_hfield(&msg,SENDEREXT,(ushort)strlen(str),str);
 		if(i) {
-			printf("\n\7!smb_hfield returned %d\n",i);
+			printf("\n\7!smb_hfield returned %d: %s\n",i,smb.last_error);
 			smb_freemsgdat(&smb,offset,length,1);
-			exit(1); }
-		msg.idx.from=atoi(str); }
-	else {
+			exit(1); 
+		}
+		msg.idx.from=atoi(str); 
+	} else {
 		strlwr(str);
-		msg.idx.from=crc16(str); }
+		msg.idx.from=crc16(str); 
+	}
 
-	printf("Subject: ");
-	gets(str);
+	if(subject==NULL) {
+		printf("Subject: ");
+		gets(str);
+	} else
+		sprintf(str,"%.*s",sizeof(str)-1,subject);
 	truncsp(str);
 	i=smb_hfield(&msg,SUBJECT,(ushort)strlen(str),str);
 	if(i) {
-		printf("\n\7!smb_hfield returned %d\n",i);
+		printf("\n\7!smb_hfield returned %d: %s\n",i,smb.last_error);
 		smb_freemsgdat(&smb,offset,length,1);
-		exit(1); }
+		exit(1); 
+	}
 	remove_re(str);
 	strlwr(str);
 	msg.idx.subj=crc16(str);
 
 	i=smb_dfield(&msg,TEXT_BODY,length);
 	if(i) {
-		printf("\n\7!smb_dfield returned %d\n",i);
+		printf("\n\7!smb_dfield returned %d: %s\n",i,smb.last_error);
 		smb_freemsgdat(&smb,offset,length,1);
 		exit(1); }
 
 	i=smb_addmsghdr(&smb,&msg,smb.status.attr&SMB_HYPERALLOC);
 
 	if(i) {
-		printf("\n\7!smb_addmsghdr returned %d\n",i);
+		printf("\n\7!smb_addmsghdr returned %d: %s\n",i,smb.last_error);
 		smb_freemsgdat(&smb,offset,length,1);
 		exit(1); }
 	smb_freemsgmem(&msg);
 
+	free(msgtxt);
 }
 
 /****************************************************************************/
@@ -328,12 +368,12 @@ void showstatus(void)
 
 	i=smb_locksmbhdr(&smb);
 	if(i) {
-		printf("\n\7!smb_locksmbhdr returned %d\n",i);
+		printf("\n\7!smb_locksmbhdr returned %d: %s\n",i,smb.last_error);
 		return; }
 	i=smb_getstatus(&smb);
 	smb_unlocksmbhdr(&smb);
 	if(i) {
-		printf("\n\7!smb_getstatus returned %d\n",i);
+		printf("\n\7!smb_getstatus returned %d: %s\n",i,smb.last_error);
 		return; }
 	printf("last_msg        =%lu\n"
 		   "total_msgs      =%lu\n"
@@ -362,12 +402,12 @@ void config(void)
 
 	i=smb_locksmbhdr(&smb);
 	if(i) {
-		printf("\n\7!smb_locksmbhdr returned %d\n",i);
+		printf("\n\7!smb_locksmbhdr returned %d: %s\n",i,smb.last_error);
 		return; }
 	i=smb_getstatus(&smb);
 	smb_unlocksmbhdr(&smb);
 	if(i) {
-		printf("\n\7!smb_getstatus returned %d\n",i);
+		printf("\n\7!smb_getstatus returned %d: %s\n",i,smb.last_error);
 		return; }
 	printf("Header offset =%-5lu  New value (CR=No Change): "
 		,smb.status.header_offset);
@@ -386,11 +426,11 @@ void config(void)
 	gets(attr);
 	i=smb_locksmbhdr(&smb);
 	if(i) {
-		printf("\n\7!smb_locksmbhdr returned %d\n",i);
+		printf("\n\7!smb_locksmbhdr returned %d: %s\n",i,smb.last_error);
 		return; }
 	i=smb_getstatus(&smb);
 	if(i) {
-		printf("\n\7!smb_getstatus returned %d\n",i);
+		printf("\n\7!smb_getstatus returned %d: %s\n",i,smb.last_error);
 		smb_unlocksmbhdr(&smb);
 		return; }
 	if(isdigit(max_msgs[0]))
@@ -406,7 +446,7 @@ void config(void)
 	i=smb_putstatus(&smb);
 	smb_unlocksmbhdr(&smb);
 	if(i)
-		printf("\n\7!smb_putstatus returned %d\n",i);
+		printf("\n\7!smb_putstatus returned %d: %s\n",i,smb.last_error);
 }
 
 /****************************************************************************/
@@ -426,12 +466,12 @@ void listmsgs(ulong start, ulong count)
 			break;
 		i=smb_lockmsghdr(&smb,&msg);
 		if(i) {
-			printf("\n\7!smb_lockmsghdr returned %d\n",i);
+			printf("\n\7!smb_lockmsghdr returned %d: %s\n",i,smb.last_error);
 			break; }
 		i=smb_getmsghdr(&smb,&msg);
 		smb_unlockmsghdr(&smb,&msg);
 		if(i) {
-			printf("\n\7!smb_getmsghdr returned %d\n",i);
+			printf("\n\7!smb_getmsghdr returned %d: %s\n",i,smb.last_error);
 			break; }
 		printf("%4lu %-25.25s %-25.25s %.20s\n"
 			,msg.hdr.number,msg.from,msg.to,msg.subj);
@@ -586,12 +626,12 @@ void viewmsgs(ulong start, ulong count)
 			break;
 		i=smb_lockmsghdr(&smb,&msg);
 		if(i) {
-			printf("\n\7!smb_lockmsghdr returned %d\n",i);
+			printf("\n\7!smb_lockmsghdr returned %d: %s\n",i,smb.last_error);
 			break; }
 		i=smb_getmsghdr(&smb,&msg);
 		smb_unlockmsghdr(&smb,&msg);
 		if(i) {
-			printf("\n\7!smb_getmsghdr returned %d\n",i);
+			printf("\n\7!smb_getmsghdr returned %d: %s\n",i,smb.last_error);
 			break; }
 
 		sprintf(when_written,"%.24s %s"
@@ -741,12 +781,12 @@ void maint(void)
 	now=time(NULL);
 	i=smb_locksmbhdr(&smb);
 	if(i) {
-		printf("\n\7!smb_locksmbhdr returned %d\n",i);
+		printf("\n\7!smb_locksmbhdr returned %d: %s\n",i,smb.last_error);
 		return; }
 	i=smb_getstatus(&smb);
 	if(i) {
 		smb_unlocksmbhdr(&smb);
-		printf("\n\7!smb_getstatus returned %d\n",i);
+		printf("\n\7!smb_getstatus returned %d: %s\n",i,smb.last_error);
 		return; }
 	if(!smb.status.total_msgs) {
 		smb_unlocksmbhdr(&smb);
@@ -821,12 +861,12 @@ void maint(void)
 			i=smb_open_da(&smb);
 			if(i) {
 				smb_unlocksmbhdr(&smb);
-				printf("\n\7!smb_open_da returned %d\n",i);
+				printf("\n\7!smb_open_da returned %d: %s\n",i,smb.last_error);
 				exit(1); }
 			i=smb_open_ha(&smb);
 			if(i) {
 				smb_unlocksmbhdr(&smb);
-				printf("\n\7!smb_open_ha returned %d\n",i);
+				printf("\n\7!smb_open_ha returned %d: %s\n",i,smb.last_error);
 				exit(1); } }
 
 		for(m=n=0;m<l;m++) {
@@ -835,26 +875,26 @@ void maint(void)
 				msg.idx=idx[m];
 				msg.hdr.number=msg.idx.number;
 				if((i=smb_getmsgidx(&smb,&msg))!=0) {
-					printf("\n\7!smb_getmsgidx returned %d\n",i);
+					printf("\n\7!smb_getmsgidx returned %d: %s\n",i,smb.last_error);
 					continue; }
 				i=smb_lockmsghdr(&smb,&msg);
 				if(i) {
-					printf("\n\7!smb_lockmsghdr returned %d\n",i);
+					printf("\n\7!smb_lockmsghdr returned %d: %s\n",i,smb.last_error);
 					break; }
 				if((i=smb_getmsghdr(&smb,&msg))!=0) {
 					smb_unlockmsghdr(&smb,&msg);
-					printf("\n\7!smb_getmsghdr returned %d\n",i);
+					printf("\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);
-					printf("\n\7!smb_putmsg returned %d\n",i);
+					printf("\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);
-					printf("\n\7!smb_freemsg returned %d\n",i);
+					printf("\n\7!smb_freemsg returned %d: %s\n",i,smb.last_error);
 					break; }
 				smb_freemsgmem(&msg); } }
 		if(!(smb.status.attr&SMB_HYPERALLOC)) {
@@ -902,25 +942,25 @@ void packmsgs(ulong packable)
 	printf("Packing %s\n",smb.file);
 	i=smb_locksmbhdr(&smb);
 	if(i) {
-		printf("\n\7!smb_locksmbhdr returned %d\n",i);
+		printf("\n\7!smb_locksmbhdr returned %d: %s\n",i,smb.last_error);
 		return; }
 	i=smb_getstatus(&smb);
 	if(i) {
 		smb_unlocksmbhdr(&smb);
-		printf("\n\7!smb_getstatus returned %d\n",i);
+		printf("\n\7!smb_getstatus returned %d: %s\n",i,smb.last_error);
 		return; }
 
 	if(!(smb.status.attr&SMB_HYPERALLOC)) {
 		i=smb_open_ha(&smb);
 		if(i) {
 			smb_unlocksmbhdr(&smb);
-			printf("\n\7!smb_open_ha returned %d\n",i);
+			printf("\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);
-			printf("\n\7!smb_open_da returned %d\n",i);
+			printf("\n\7!smb_open_da returned %d: %s\n",i,smb.last_error);
 			return; } }
 
 	if(!smb.status.total_msgs) {
@@ -1083,12 +1123,12 @@ void packmsgs(ulong packable)
 			continue; }
 		i=smb_lockmsghdr(&smb,&msg);
 		if(i) {
-			printf("\n\7!smb_lockmsghdr returned %d\n",i);
+			printf("\n\7!smb_lockmsghdr returned %d: %s\n",i,smb.last_error);
 			continue; }
 		i=smb_getmsghdr(&smb,&msg);
 		smb_unlockmsghdr(&smb,&msg);
 		if(i) {
-			printf("\n\7!smb_getmsghdr returned %d\n",i);
+			printf("\n\7!smb_getmsghdr returned %d: %s\n",i,smb.last_error);
 			continue; }
 		if(msg.hdr.attr&MSG_DELETE) {
 			printf("\nDeleted header.\n");
@@ -1229,7 +1269,7 @@ void packmsgs(ulong packable)
 
 	smb.status.total_msgs=total;
 	if((i=smb_putstatus(&smb))!=0)
-		printf("\n\7!smb_putstatus returned %d\n",i);
+		printf("\n\7!smb_putstatus returned %d: %s\n",i,smb.last_error);
 	printf("\nDone.\n\n");
 }
 
@@ -1254,11 +1294,11 @@ void readmsgs(ulong start)
 				break;
 			i=smb_lockmsghdr(&smb,&msg);
 			if(i) {
-				printf("\n\7!smb_lockmsghdr returned %d\n",i);
+				printf("\n\7!smb_lockmsghdr returned %d: %s\n",i,smb.last_error);
 				break; }
 			i=smb_getmsghdr(&smb,&msg);
 			if(i) {
-				printf("\n\7!smb_getmsghdr returned %d\n",i);
+				printf("\n\7!smb_getmsghdr returned %d: %s\n",i,smb.last_error);
 				break; }
 
 			printf("\n%lu (%lu)\n",msg.hdr.number,msg.offset+1);
@@ -1284,7 +1324,7 @@ void readmsgs(ulong start)
 
 			i=smb_unlockmsghdr(&smb,&msg);
 			if(i) {
-				printf("\n\7!smb_unlockmsghdr returned %d\n",i);
+				printf("\n\7!smb_unlockmsghdr returned %d: %s\n",i,smb.last_error);
 				break; }
 			smb_freemsgmem(&msg); }
 		domsg=1;
@@ -1353,6 +1393,13 @@ time_t checktime(void)
 int main(int argc, char **argv)
 {
 	char	cmd[128]="",*p,*s;
+	char*	to=NULL;
+	char*	to_number=NULL;
+	char*	to_address=NULL;
+	char*	from=NULL;
+	char*	from_number=NULL;
+	char*	subj=NULL;
+	FILE*	fp;
 	int		i,j,x,y;
 	time_t	t;
 	BOOL	create=FALSE;
@@ -1424,6 +1471,30 @@ int main(int argc, char **argv)
 					case 'C':
 						create=TRUE;
 						break;
+					case 'T':
+						to=argv[x]+j+1;
+						j=strlen(argv[x])-1;
+						break;
+					case 'U':
+						to_number=argv[x]+j+1;
+						j=strlen(argv[x])-1;
+						break;
+					case 'N':
+						to_address=argv[x]+j+1;
+						j=strlen(argv[x])-1;
+						break;
+					case 'F':
+						from=argv[x]+j+1;
+						j=strlen(argv[x])-1;
+						break;
+					case 'E':
+						from_number=argv[x]+j+1;
+						j=strlen(argv[x])-1;
+						break;
+					case 'S':
+						subj=argv[x]+j+1;
+						j=strlen(argv[x])-1;
+						break;
 					default:
 						printf("\nUnknown opt '%c'\n",argv[x][j]);
 					case '?':
@@ -1443,7 +1514,8 @@ int main(int argc, char **argv)
 				smb.retry_time=30;
 				printf("Opening %s\r\n",smb.file);
 				if((i=smb_open(&smb))!=0) {
-					printf("\n\7!Error %d opening %s message base\n",i,smb.file);
+					printf("\n\7!Error %d (%s) opening %s message base\n"
+						,i,smb.last_error,smb.file);
 					exit(1); }
 				if(!filelength(fileno(smb.shd_fp))) {
 					if(!create) {
@@ -1465,12 +1537,16 @@ int main(int argc, char **argv)
 						case 'I':
 						case 'E':
 						case 'N':
-							strcpy(filein,cmd+1);
+							if(cmd[1]!=0 && cmd[1]!='-')
+								fp=fopen(cmd+1,"r");
+							else
+								fp=stdin;
 							i=smb_locksmbhdr(&smb);
 							if(i) {
-								printf("\n\7!smb_locksmbhdr returned %d\n",i);
+								printf("\n\7!smb_locksmbhdr returned %d: %s\n",i,smb.last_error);
 								return(1); }
-							postmsg((char)toupper(cmd[y]));
+							postmsg((char)toupper(cmd[y]),to,to_number,to_address,from,from_number,subj,fp);
+							fclose(fp);
 							y=strlen(cmd)-1;
 							break;
 						case 'S':
-- 
GitLab