From 2ef79cb150f1c5557a8d91b8980d61d1bfd2ac8e Mon Sep 17 00:00:00 2001
From: rswindell <>
Date: Thu, 16 Nov 2017 06:13:21 +0000
Subject: [PATCH] Don't "manage the HASH file" unless either max_msgs or
 max_crcs is set (if both are zero, that implies infinite hash storage - why
 not). Display message attr value in the 'r'ead mode. Added 'D'elete message
 (toggle Delete attribute) in 'r'ead mode.

---
 src/sbbs3/smbutil.c | 38 ++++++++++++++++++++++++++++++++++++--
 1 file changed, 36 insertions(+), 2 deletions(-)

diff --git a/src/sbbs3/smbutil.c b/src/sbbs3/smbutil.c
index 155a70ca08..e2c76aa614 100644
--- a/src/sbbs3/smbutil.c
+++ b/src/sbbs3/smbutil.c
@@ -651,7 +651,7 @@ void maint(void)
 			,beep,i,smb.last_error);
 		return; 
 	}
-	if(smb_open_hash(&smb) == SMB_SUCCESS)
+	if((smb.status.max_msgs || smb.status.max_crcs) && smb_open_hash(&smb) == SMB_SUCCESS)
 	{
 		ulong max_hashes=0;
 
@@ -1067,7 +1067,7 @@ void packmsgs(ulong packable)
 		if(!fread(&msg.idx,1,sizeof(idxrec_t),smb.sid_fp))
 			break;
 		if(msg.idx.attr&MSG_DELETE) {
-			printf("\nDeleted index.\n");
+			printf("\nDeleted index %lu: msg number %lu\n", l,(ulong) msg.idx.number);
 			continue; 
 		}
 		i=smb_lockmsghdr(&smb,&msg);
@@ -1292,6 +1292,33 @@ void delmsgs(void)
 	printf("\nDone.\n\n");
 }
 
+int setmsgattr(smb_t* smb, ulong number, uint16_t attr)
+{
+	int i;
+	smbmsg_t msg;
+	ZERO_VAR(msg);
+
+	if((i = smb_locksmbhdr(smb) != SMB_SUCCESS))
+		return i;
+
+	msg.hdr.number=number;
+	do {
+		if((i=smb_getmsgidx(smb, &msg))!=SMB_SUCCESS)				 /* Message is deleted */
+			break;
+		if((i=smb_lockmsghdr(smb, &msg))!=SMB_SUCCESS)
+			break;
+		if((i=smb_getmsghdr(smb, &msg))!=SMB_SUCCESS)
+			break;
+		msg.hdr.attr = attr;
+		i=smb_putmsg(smb, &msg);
+	} while(0);
+
+	smb_freemsgmem(&msg);
+	smb_unlockmsghdr(smb, &msg);
+	smb_unlocksmbhdr(smb);
+
+	return i;
+}
 /****************************************************************************/
 /* Read messages in message base											*/
 /****************************************************************************/
@@ -1320,11 +1347,13 @@ void readmsgs(ulong start)
 			if(i) {
 				fprintf(errfp,"\n%s!smb_getmsghdr returned %d: %s\n"
 					,beep,i,smb.last_error);
+				smb_unlockmsghdr(&smb, &msg);
 				break; 
 			}
 
 			printf("\n%"PRIu32" (%d)\n",msg.hdr.number,msg.offset+1);
 			printf("Subj : %s\n",msg.subj);
+			printf("Attr : %04hX\n", msg.hdr.attr);
 			printf("To   : %s",msg.to);
 			if(msg.to_net.type)
 				printf(" (%s)",smb_netaddr(&msg.to_net));
@@ -1360,6 +1389,7 @@ void readmsgs(ulong start)
 					   "(L)ist messages\n"
 					   "(T)en more titles\n"
 					   "(V)iew message headers\n"
+					   "(D)elete message\n"
 					   "(Q)uit\n"
 					   "(+/-) Forward/Backward\n"
 					   "\n");
@@ -1393,6 +1423,10 @@ void readmsgs(ulong start)
 				viewmsgs(1,-1, FALSE);
 				domsg=0;
 				break;
+			case 'D':
+				printf("Deleting message\n");
+				setmsgattr(&smb, msg.hdr.number, msg.hdr.attr^MSG_DELETE);
+				break;
 			case CR:
 			case '+':
 				printf("Next\n");
-- 
GitLab