From 6845989edc7ecea35bbb980b1b76313b4827040e Mon Sep 17 00:00:00 2001
From: rswindell <>
Date: Tue, 24 Mar 2009 10:31:31 +0000
Subject: [PATCH] smb_msghashes() now accepts a bit-mask of hash source-types
 (instead of always hashing all source types).

---
 src/sbbs3/chksmb.c   |  4 ++--
 src/smblib/smbadd.c  |  4 ++--
 src/smblib/smbhash.c | 10 +++++-----
 src/smblib/smblib.h  |  2 +-
 4 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/src/sbbs3/chksmb.c b/src/sbbs3/chksmb.c
index 7e71e87771..13d3774eb2 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 2008 Rob Swindell - http://www.synchro.net/copyright.html		*
+ * Copyright 2009 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				*
@@ -344,7 +344,7 @@ int main(int argc, char **argv)
 
 		if(!(smb.status.attr&SMB_EMAIL) && chkhash) {
 			/* Look-up the message hashes */
-			hashes=smb_msghashes(&msg,body);
+			hashes=smb_msghashes(&msg,body,SMB_HASH_SOURCE_ALL);
 			if(hashes!=NULL 
 				&& hashes[0]!=NULL 
 				&& (i=smb_findhash(&smb,hashes,NULL,SMB_HASH_SOURCE_ALL,/* mark */TRUE ))
diff --git a/src/smblib/smbadd.c b/src/smblib/smbadd.c
index e5b6bbab85..c336419492 100644
--- a/src/smblib/smbadd.c
+++ b/src/smblib/smbadd.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 2008 Rob Swindell - http://www.synchro.net/copyright.html		*
+ * Copyright 2009 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		*
@@ -85,7 +85,7 @@ int SMBCALL smb_addmsg(smb_t* smb, smbmsg_t* msg, int storage, long dupechk_hash
 		msg->hdr.number=smb->status.last_msg+1;
 		if(!(smb->status.attr&(SMB_EMAIL|SMB_NOHASH))) {
 
-			hashes=smb_msghashes(msg,body);
+			hashes=smb_msghashes(msg,body,SMB_HASH_SOURCE_ALL);
 
 			if(smb_findhash(smb, hashes, &found, dupechk_hashes, /* mark? */FALSE)==SMB_SUCCESS) {
 				safe_snprintf(smb->last_error,sizeof(smb->last_error)
diff --git a/src/smblib/smbhash.c b/src/smblib/smbhash.c
index f80976170a..bf6423c649 100644
--- a/src/smblib/smbhash.c
+++ b/src/smblib/smbhash.c
@@ -238,7 +238,7 @@ hash_t* SMBCALL smb_hashstr(ulong msgnum, ulong t, unsigned source, unsigned fla
 
 /* Allocates and calculates all hashes for a single message					*/
 /* Returns NULL on failure													*/
-hash_t** SMBCALL smb_msghashes(smbmsg_t* msg, const uchar* body)
+hash_t** SMBCALL smb_msghashes(smbmsg_t* msg, const uchar* body, long source_mask)
 {
 	size_t		h=0;
 	uchar		flags=SMB_HASH_CRC16|SMB_HASH_CRC32|SMB_HASH_MD5;
@@ -251,16 +251,16 @@ hash_t** SMBCALL smb_msghashes(smbmsg_t* msg, const uchar* body)
 
 	memset(hashes, 0, sizeof(hash_t*)*(SMB_HASH_SOURCE_TYPES+1));
 
-	if(msg->id!=NULL && 
+	if(msg->id!=NULL && (source_mask&(1<<SMB_HASH_SOURCE_MSG_ID)) &&
 		(hash=smb_hashstr(msg->hdr.number, t, SMB_HASH_SOURCE_MSG_ID, flags, msg->id))!=NULL)
 		hashes[h++]=hash;
 
-	if(msg->ftn_msgid!=NULL	&& 
+	if(msg->ftn_msgid!=NULL	&& (source_mask&(1<<SMB_HASH_SOURCE_FTN_ID)) &&
 		(hash=smb_hashstr(msg->hdr.number, t, SMB_HASH_SOURCE_FTN_ID, flags, msg->ftn_msgid))!=NULL)
 		hashes[h++]=hash;
 
 	flags|=SMB_HASH_STRIP_WSP|SMB_HASH_STRIP_CTRL_A;
-	if(body!=NULL && 
+	if(body!=NULL && (source_mask&(1<<SMB_HASH_SOURCE_BODY)) &&
 		(hash=smb_hashstr(msg->hdr.number, t, SMB_HASH_SOURCE_BODY, flags, body))!=NULL)
 		hashes[h++]=hash;
 
@@ -285,7 +285,7 @@ int SMBCALL smb_hashmsg(smb_t* smb, smbmsg_t* msg, const uchar* text, BOOL updat
 	if(smb->status.attr&(SMB_EMAIL|SMB_NOHASH))
 		return(SMB_SUCCESS);
 
-	hashes=smb_msghashes(msg,text);
+	hashes=smb_msghashes(msg,text,SMB_HASH_SOURCE_ALL);
 
 	if(smb_findhash(smb, hashes, &found, SMB_HASH_SOURCE_ALL, update)==SMB_SUCCESS && !update) {
 		retval=SMB_DUPE_MSG;
diff --git a/src/smblib/smblib.h b/src/smblib/smblib.h
index 6ae52594cc..932ec118c9 100644
--- a/src/smblib/smblib.h
+++ b/src/smblib/smblib.h
@@ -182,7 +182,7 @@ SMBEXPORT hash_t*	SMBCALL	smb_hash(ulong msgnum, ulong time, unsigned source
 SMBEXPORT hash_t*	SMBCALL	smb_hashstr(ulong msgnum, ulong time, unsigned source
 								,unsigned flags, const char* str);
 
-SMBEXPORT hash_t**	SMBCALL smb_msghashes(smbmsg_t* msg, const uchar* text);
+SMBEXPORT hash_t**	SMBCALL smb_msghashes(smbmsg_t* msg, const uchar* text, long source_mask);
 SMBEXPORT int		SMBCALL smb_addhashes(smb_t* smb, hash_t** hash_list, BOOL skip_marked);
 SMBEXPORT uint16_t	SMBCALL smb_name_crc(const char* name);
 SMBEXPORT uint16_t	SMBCALL smb_subject_crc(const char *subj);
-- 
GitLab