From 03db7f439f02d29a19fbf426efc447baed66a907 Mon Sep 17 00:00:00 2001
From: rswindell <>
Date: Tue, 20 Jul 2004 09:11:19 +0000
Subject: [PATCH] Created smb_dump module with smb_dump_msghdr() routine for
 common message header debug/dump function (used by chksmb and smbutil).

---
 src/sbbs3/Makefile   |   2 +-
 src/sbbs3/chksmb.c   |  54 ++--------------
 src/sbbs3/smbutil.c  |  87 ++-----------------------
 src/smblib/smbdump.c | 147 +++++++++++++++++++++++++++++++++++++++++++
 src/smblib/smblib.h  |   9 ++-
 5 files changed, 164 insertions(+), 135 deletions(-)
 create mode 100644 src/smblib/smbdump.c

diff --git a/src/sbbs3/Makefile b/src/sbbs3/Makefile
index f434d2e25e..c22ecd6f49 100644
--- a/src/sbbs3/Makefile
+++ b/src/sbbs3/Makefile
@@ -146,7 +146,7 @@ $(NODE): node.c
 	$(QUIET)$(CC) $(CFLAGS) -n$(EXEODIR) $** 
 
 SMBLIB = $(LIBODIR)\smblib.obj $(LIBODIR)\genwrap.obj $(LIBODIR)\filewrap.obj \
-	 $(LIBODIR)\crc16.obj
+	 $(LIBODIR)\crc16.obj $(LIBODIR)\smbdump.obj
 
 # FIXSMB Utility
 $(FIXSMB): fixsmb.c $(SMBLIB) $(LIBODIR)\str_util.obj $(LIBODIR)\dirwrap.obj
diff --git a/src/sbbs3/chksmb.c b/src/sbbs3/chksmb.c
index 5537450d7c..232c335fe2 100644
--- a/src/sbbs3/chksmb.c
+++ b/src/sbbs3/chksmb.c
@@ -8,7 +8,7 @@
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
  *																			*
- * Copyright 2003 Rob Swindell - http://www.synchro.net/copyright.html		*
+ * Copyright 2004 Rob Swindell - http://www.synchro.net/copyright.html		*
  *																			*
  * This program is free software; you can redistribute it and/or			*
  * modify it under the terms of the GNU General Public License				*
@@ -149,7 +149,7 @@ int main(int argc, char **argv)
 	smbmsg_t	msg;
 
 	fprintf(stderr,"\nCHKSMB v2.12 - Check Synchronet Message Base - "
-		"Copyright 2003 Rob Swindell\n");
+		"Copyright 2004 Rob Swindell\n");
 
 	if(argc<2) {
 		printf("%s",usage);
@@ -263,6 +263,7 @@ int main(int argc, char **argv)
 	for(l=smb.status.header_offset;l<length;l+=size) {
 		size=SHD_BLOCK_LEN;
 		fprintf(stderr,"\r%2lu%%  ",(long)(100.0/((float)length/l)));
+		memset(&msg,0,sizeof(msg));
 		msg.idx.offset=l;
 		msgerr=0;
 		if((i=smb_lockmsghdr(&smb,&msg))!=0) {
@@ -480,53 +481,8 @@ int main(int argc, char **argv)
 		headers++;
 		if(msgerr && extinfo) {
 			printf("\n");
-			printf("%-20s: %s\n","Message Base",smb.file);
-			printf("%-20s: %lu (%lu)\n","Message Number"
-				,msg.hdr.number,msg.offset+1);
-			printf("%-20s: %s\n","Subject",msg.subj);
-			printf("%-20s: %s","To",msg.to);
-			if(msg.to_net.type && msg.to_net.addr)
-				printf(" (%s)",msg.to_net.type==NET_FIDO
-					? faddrtoa(*(fidoaddr_t *)msg.to_net.addr) : (char*)msg.to_net.addr);
-			printf("\n%-20s: %s","From",msg.from);
-			if(msg.from_net.type && msg.from_net.addr)
-				printf(" (%s)",msg.from_net.type==NET_FIDO
-					? faddrtoa(*(fidoaddr_t *)msg.from_net.addr)
-						: (char*)msg.from_net.addr);
-			printf("\n");
-			printf("%-20s: %.24s  tz: %04hXh\n","When Written"
-				,ctime((time_t *)&msg.hdr.when_written.time)
-				,msg.hdr.when_written.zone);
-			printf("%-20s: %.24s  tz: %04hXh\n","When Imported"
-				,ctime((time_t *)&msg.hdr.when_imported.time)
-				,msg.hdr.when_imported.zone);
-			printf("%-20s: %04hXh\n","Type"
-				,msg.hdr.type);
-			printf("%-20s: %04hXh\n","Version"
-				,msg.hdr.version);
-			printf("%-20s: %u\n","Length"
-				,msg.hdr.length);
-			printf("%-20s: %lu\n","Calculated Length"
-				,smb_getmsghdrlen(&msg));
-			printf("%-20s: %04hXh\n","Attributes"
-				,msg.hdr.attr);
-			printf("%-20s: %08lXh\n","Auxilary Attributes"
-				,msg.hdr.auxattr);
-			printf("%-20s: %08lXh\n","Network Attributes"
-				,msg.hdr.netattr);
-			printf("%-20s: %06lXh\n","Header Offset"
-				,msg.idx.offset);
-			printf("%-20s: %06lXh\n","Data Offset"
-				,msg.hdr.offset);
-			printf("%-20s: %u\n","Total Data Fields"
-				,msg.hdr.total_dfields);
-			for(i=0;i<msg.hdr.total_dfields;i++)
-				printf("dfield[%u].type      : %02Xh\n"
-					   "dfield[%u].offset    : %lu (%lXh)\n"
-					   "dfield[%u].length    : %lu\n"
-					   ,i,msg.dfield[i].type
-					   ,i,msg.dfield[i].offset, msg.dfield[i].offset
-					   ,i,msg.dfield[i].length);
+			printf("%-20s %s\n","message base",smb.file);
+			smb_dump_msghdr(stdout,&msg);
 			printf("\n"); 
 		}
 
diff --git a/src/sbbs3/smbutil.c b/src/sbbs3/smbutil.c
index efa25d1c58..8b090f989c 100644
--- a/src/sbbs3/smbutil.c
+++ b/src/sbbs3/smbutil.c
@@ -8,7 +8,7 @@
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
  *																			*
- * Copyright 2003 Rob Swindell - http://www.synchro.net/copyright.html		*
+ * Copyright 2004 Rob Swindell - http://www.synchro.net/copyright.html		*
  *																			*
  * This program is free software; you can redistribute it and/or			*
  * modify it under the terms of the GNU General Public License				*
@@ -571,88 +571,9 @@ void viewmsgs(ulong start, ulong count)
 			break; 
 		}
 
-		printf("%-16.16s %ld\n"		,"index record",ftell(smb.sid_fp)/sizeof(idxrec_t));
-		printf("%-16.16s %ld\n"		,"number"			,msg.hdr.number);
-
-		/* convenience strings */
-		if(msg.subj)
-			printf("%-16.16s %s\n"	,"subject"			,msg.subj);
-		if(msg.to) {
-			printf("%-16.16s %s"	,"to"				,msg.to);
-			if(msg.to_net.addr && strchr(msg.to,'@')==NULL)
-				printf(" (%s)",net_addr(&msg.to_net)); 
-			if(msg.to_ext)
-				printf(" #%s",msg.to_ext);
-			printf("\n");
-		}
-		if(msg.from) {
-			printf("%-16.16s %s"	,"from"				,msg.from);
-			if(msg.from_net.addr && strchr(msg.from,'@')==NULL)
-				printf(" (%s)",net_addr(&msg.from_net)); 
-			if(msg.from_ext)
-				printf(" #%s",msg.from_ext);
-			printf("\n");
-		}
-		if(msg.replyto) {
-			printf("%-16.16s %s"	,"reply-to"			,msg.replyto);
-			if(msg.replyto_net.addr && strchr(msg.replyto,'@')==NULL)
-				printf(" (%s)",net_addr(&msg.replyto_net)); 
-			if(msg.replyto_ext)
-				printf(" #%s",msg.replyto_ext);
-			printf("\n");
-		}
-		if(msg.summary)
-			printf("%-16.16s %s\n"	,"summary"			,msg.summary);
-
-		/* optional fixed fields */
-		if(msg.hdr.thread_orig)
-			printf("%-16.16s %ld\n"	,"thread_orig"		,msg.hdr.thread_orig);
-		if(msg.hdr.thread_next)
-			printf("%-16.16s %ld\n"	,"thread_next"		,msg.hdr.thread_next);
-		if(msg.hdr.thread_first)
-			printf("%-16.16s %ld\n"	,"thread_first"		,msg.hdr.thread_first);
-		if(msg.hdr.delivery_attempts)
-			printf("%-16.16s %hu\n"	,"delivery_attempts",msg.hdr.delivery_attempts);
-		if(msg.hdr.times_downloaded)
-			printf("%-16.16s %lu\n"	,"times_downloaded"	,msg.hdr.times_downloaded);
-		if(msg.hdr.last_downloaded)
-			printf("%-16.16s %s\n"	,"last_downloaded"	,my_timestr((time_t*)&msg.hdr.last_downloaded));
-
-		/* convenience integers */
-		if(msg.cost)
-			printf("%-16.16s %lu\n"	,"cost"				,msg.cost);
-		if(msg.priority)
-			printf("%-16.16s %lu\n"	,"priority"			,msg.priority);
-		if(msg.expiration)
-			printf("%-16.16s %s\n"	,"expiration"	
-				,my_timestr((time_t *)&msg.expiration));
-
-		printf("%-16.16s %s %s\n"	,"when_written"	
-			,my_timestr((time_t *)&msg.hdr.when_written.time), zonestr(msg.hdr.when_written.zone));
-		printf("%-16.16s %s %s\n"	,"when_imported"	
-			,my_timestr((time_t *)&msg.hdr.when_imported.time), zonestr(msg.hdr.when_imported.zone));
-		printf("%-16.16s %04Xh\n"	,"type"				,msg.hdr.type);
-		printf("%-16.16s %04Xh\n"	,"version"			,msg.hdr.version);
-		printf("%-16.16s %04Xh\n"	,"attr"				,msg.hdr.attr);
-		printf("%-16.16s %08lXh\n"	,"auxattr"			,msg.hdr.auxattr);
-		printf("%-16.16s %08lXh\n"	,"netattr"			,msg.hdr.netattr);
-		printf("%-16.16s %06lXh\n"	,"header offset"	,msg.idx.offset);
-		printf("%-16.16s %u\n"		,"header length"	,msg.hdr.length);
-
-		/* variable fields */
-		for(i=0;i<msg.total_hfields;i++)
-			printf("%-16.16s %s\n"
-				,smb_hfieldtype(msg.hfield[i].type)
-				,binstr((uchar *)msg.hfield_dat[i],msg.hfield[i].length));
-
-		printf("%-16.16s %06lXh\n"	,"data offset"		,msg.hdr.offset);
-		for(i=0;i<msg.hdr.total_dfields;i++)
-			printf("data field[%u]    %s, offset %lu, length %lu\n"
-				,i
-				,smb_dfieldtype(msg.dfield[i].type)
-				,msg.dfield[i].offset
-				,msg.dfield[i].length);
-
+		printf("--------------------\n");
+		printf("%-20.20s %ld\n"		,"index record",ftell(smb.sid_fp)/sizeof(idxrec_t));
+		smb_dump_msghdr(stdout,&msg);
 		printf("\n");
 		smb_freemsgmem(&msg);
 		l++; 
diff --git a/src/smblib/smbdump.c b/src/smblib/smbdump.c
new file mode 100644
index 0000000000..7848e593b1
--- /dev/null
+++ b/src/smblib/smbdump.c
@@ -0,0 +1,147 @@
+/* smbdump.c */
+
+/* Synchronet message base (SMB) message header dumper */
+
+/* $Id$ */
+
+/****************************************************************************
+ * @format.tab-size 4		(Plain Text/Source Code File Header)			*
+ * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
+ *																			*
+ * Copyright 2004 Rob Swindell - http://www.synchro.net/copyright.html		*
+ *																			*
+ * This program is free software; you can redistribute it and/or			*
+ * modify it under the terms of the GNU General Public License				*
+ * as published by the Free Software Foundation; either version 2			*
+ * of the License, or (at your option) any later version.					*
+ * See the GNU General Public License for more details: gpl.txt or			*
+ * http://www.fsf.org/copyleft/gpl.html										*
+ *																			*
+ * Anonymous FTP access to the most recent released source is available at	*
+ * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net	*
+ *																			*
+ * Anonymous CVS access to the development source and modification history	*
+ * is available at cvs.synchro.net:/cvsroot/sbbs, example:					*
+ * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login			*
+ *     (just hit return, no password is necessary)							*
+ * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src		*
+ *																			*
+ * For Synchronet coding style and modification guidelines, see				*
+ * http://www.synchro.net/source.html										*
+ *																			*
+ * You are encouraged to submit any modifications (preferably in Unix diff	*
+ * format) via e-mail to mods@synchro.net									*
+ *																			*
+ * Note: If this box doesn't appear square, then you need to fix your tabs.	*
+ ****************************************************************************/
+
+#include "smblib.h"
+#include <time.h>		/* ctime */
+
+static char *binstr(uchar *buf, ushort length)
+{
+	static char str[512];
+	char tmp[128];
+	int i;
+
+	str[0]=0;
+	for(i=0;i<length;i++)
+		if(buf[i] && (buf[i]<' ' || buf[i]>=0x7f) 
+			&& buf[i]!='\r' && buf[i]!='\n' && buf[i]!='\t')
+			break;
+	if(i==length)		/* not binary */
+		return(buf);
+	for(i=0;i<length;i++) {
+		sprintf(tmp,"%02X ",buf[i]);
+		strcat(str,tmp); 
+		if(i>=100) {
+			strcat(str,"...");
+			break;
+		}
+	}
+	return(str);
+}
+
+void SMBCALL smb_dump_msghdr(FILE* fp, smbmsg_t* msg)
+{
+	int i;
+
+	fprintf(fp,"%-20.20s %ld\n"		,"number"			,msg->hdr.number);
+
+	/* convenience strings */
+	if(msg->subj)
+		fprintf(fp,"%-20.20s %s\n"	,"subject"			,msg->subj);
+	if(msg->to) {
+		fprintf(fp,"%-20.20s %s"	,"to"				,msg->to);
+		if(msg->to_ext)
+			fprintf(fp," #%s",msg->to_ext);
+		fprintf(fp,"\n");
+	}
+	if(msg->from) {
+		fprintf(fp,"%-20.20s %s"	,"from"				,msg->from);
+		if(msg->from_ext)
+			fprintf(fp," #%s",msg->from_ext);
+		fprintf(fp,"\n");
+	}
+	if(msg->replyto) {
+		fprintf(fp,"%-20.20s %s"	,"reply-to"			,msg->replyto);
+		if(msg->replyto_ext)
+			fprintf(fp," #%s",msg->replyto_ext);
+		fprintf(fp,"\n");
+	}
+	if(msg->summary)
+		fprintf(fp,"%-20.20s %s\n"	,"summary"			,msg->summary);
+
+	/* convenience integers */
+	if(msg->expiration)
+		fprintf(fp,"%-20.20s %.24s\n","expiration"	
+			,ctime((time_t *)&msg->expiration));
+
+	/* fixed header fields */
+	fprintf(fp,"%-20.20s %.24s  UTC%+d:%02d\n"	,"when_written"	
+		,ctime((time_t *)&msg->hdr.when_written.time)	
+		,smb_tzutc(msg->hdr.when_written.zone)/60
+		,abs(smb_tzutc(msg->hdr.when_written.zone)%60));
+	fprintf(fp,"%-20.20s %.24s  UTC%+d:%02d\n"	,"when_imported"	
+		,ctime((time_t *)&msg->hdr.when_imported.time)	
+		,smb_tzutc(msg->hdr.when_imported.zone)/60
+		,abs(smb_tzutc(msg->hdr.when_imported.zone)%60));
+	fprintf(fp,"%-20.20s %04Xh\n"	,"type"				,msg->hdr.type);
+	fprintf(fp,"%-20.20s %04Xh\n"	,"version"			,msg->hdr.version);
+	fprintf(fp,"%-20.20s %04Xh\n"	,"attr"				,msg->hdr.attr);
+	fprintf(fp,"%-20.20s %08lXh\n"	,"auxattr"			,msg->hdr.auxattr);
+	fprintf(fp,"%-20.20s %08lXh\n"	,"netattr"			,msg->hdr.netattr);
+
+	/* optional fixed fields */
+	if(msg->hdr.thread_orig)
+		fprintf(fp,"%-20.20s %ld\n"	,"thread_orig"		,msg->hdr.thread_orig);
+	if(msg->hdr.thread_next)
+		fprintf(fp,"%-20.20s %ld\n"	,"thread_next"		,msg->hdr.thread_next);
+	if(msg->hdr.thread_first)
+		fprintf(fp,"%-20.20s %ld\n"	,"thread_first"		,msg->hdr.thread_first);
+	if(msg->hdr.delivery_attempts)
+		fprintf(fp,"%-20.20s %hu\n"	,"delivery_attempts",msg->hdr.delivery_attempts);
+	if(msg->hdr.times_downloaded)
+		fprintf(fp,"%-20.20s %lu\n"	,"times_downloaded"	,msg->hdr.times_downloaded);
+	if(msg->hdr.last_downloaded)
+		fprintf(fp,"%-20.20s %.24s\n"	,"last_downloaded"	,ctime((time_t*)&msg->hdr.last_downloaded));
+
+	fprintf(fp,"%-20.20s %06lXh\n"	,"header offset"	,msg->idx.offset);
+	fprintf(fp,"%-20.20s %u\n"		,"header length"	,msg->hdr.length);
+	fprintf(fp,"%-20.20s %lu\n"		,"calculated length",smb_getmsghdrlen(msg));
+
+	/* variable fields */
+	for(i=0;i<msg->total_hfields;i++)
+		fprintf(fp,"%-20.20s %s\n"
+			,smb_hfieldtype(msg->hfield[i].type)
+			,binstr((uchar *)msg->hfield_dat[i],msg->hfield[i].length));
+
+	/* data fields */
+	fprintf(fp,"%-20.20s %06lXh\n"	,"data offset"		,msg->hdr.offset);
+	for(i=0;i<msg->hdr.total_dfields;i++)
+		fprintf(fp,"data field[%u]        %s, offset %lu, length %lu\n"
+			,i
+			,smb_dfieldtype(msg->dfield[i].type)
+			,msg->dfield[i].offset
+			,msg->dfield[i].length);
+}
diff --git a/src/smblib/smblib.h b/src/smblib/smblib.h
index d43ef2bce1..dc3e09149f 100644
--- a/src/smblib/smblib.h
+++ b/src/smblib/smblib.h
@@ -8,7 +8,7 @@
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
  *																			*
- * Copyright 2000 Rob Swindell - http://www.synchro.net/copyright.html		*
+ * Copyright 2004 Rob Swindell - http://www.synchro.net/copyright.html		*
  *																			*
  * This library is free software; you can redistribute it and/or			*
  * modify it under the terms of the GNU Lesser General Public License		*
@@ -152,9 +152,14 @@ SMBEXPORT int 		SMBCALL smb_freemsgdat(smb_t* smb, ulong offset, ulong length, u
 SMBEXPORT int 		SMBCALL smb_freemsghdr(smb_t* smb, ulong offset, ulong length);
 SMBEXPORT void		SMBCALL smb_freemsgtxt(char* buf);
 SMBEXPORT int		SMBCALL	smb_copymsgmem(smb_t* smb, smbmsg_t* destmsg, smbmsg_t* srcmsg);
-SMBEXPORT char*		SMBCALL smb_getmsgtxt(smb_t* smb, smbmsg_t* msg, ulong mode);
 SMBEXPORT int		SMBCALL smb_tzutc(short timezone);
 
+/* smbtxt.c */
+SMBEXPORT char*		SMBCALL smb_getmsgtxt(smb_t* smb, smbmsg_t* msg, ulong mode);
+
+/* smbdump.c */
+SMBEXPORT void		SMBCALL smb_dump_msghdr(FILE* fp, smbmsg_t* msg);
+
 /* FILE pointer I/O functions */
 
 SMBEXPORT int 		SMBCALL smb_feof(FILE* fp);
-- 
GitLab