diff --git a/src/smblib/smbdefs.h b/src/smblib/smbdefs.h index baf75c087d0fb3736b34c741da391eb18b701d4d..61d3ea5b06eaa3de35c33375b94c2b5fb5ff9af1 100644 --- a/src/smblib/smbdefs.h +++ b/src/smblib/smbdefs.h @@ -657,7 +657,7 @@ typedef struct { /* Message base */ /* Private member variables (not initialized by or used by smblib) */ uint32_t subnum; /* Sub-board number */ uint32_t msgs; /* Number of messages loaded (for user) */ - uint32_t curmsg; /* Current message number (for user) */ + uint32_t curmsg; /* Current message number (for user, 0-based) */ } smb_t; diff --git a/src/smblib/smblib.c b/src/smblib/smblib.c index ba19655137d1df00196f7308f9e584fba872f5f4..4ad9b2ba26cf7beb89ff9c6831555422e8442c90 100644 --- a/src/smblib/smblib.c +++ b/src/smblib/smblib.c @@ -2004,4 +2004,32 @@ int SMBCALL smb_updatethread(smb_t* smb, smbmsg_t* remsg, ulong newmsgnum) return(retval); } +long SMBCALL smb_first_in_thread(smb_t* smb, smbmsg_t* remsg) +{ + smbmsg_t msg; + + if(!remsg->hdr.thread_back) + return remsg->hdr.number; + + memset(&msg, 0, sizeof(msg)); + msg.hdr.number = remsg->hdr.thread_id; + if(smb_getmsgidx(smb, &msg) == SMB_SUCCESS) + return msg.hdr.number; + + /* Walk the thread backwards to find the oldest msg in thread */ + long msgnum = msg.hdr.number = remsg->hdr.number; + msg.hdr.thread_back = remsg->hdr.thread_back; + while(msg.hdr.thread_back != 0 && msg.hdr.thread_back < msg.hdr.number) { + msg.hdr.number = msg.hdr.thread_back; + if(smb_getmsgidx(smb, &msg) != SMB_SUCCESS) + break; + if(smb_getmsghdr(smb, &msg) != SMB_SUCCESS) + break; + smb_freemsgmem(&msg); + msgnum = msg.hdr.number; + } + + return msgnum; +} + /* End of SMBLIB.C */ diff --git a/src/smblib/smblib.h b/src/smblib/smblib.h index 7e5e3d314aa2271df5469ef58331b8e4f0a290a5..eae371e7fa484fe73c2a408b1dfb3f4dc4da54b7 100644 --- a/src/smblib/smblib.h +++ b/src/smblib/smblib.h @@ -186,6 +186,7 @@ SMBEXPORT BOOL SMBCALL smb_valid_hdr_offset(smb_t* smb, ulong offset); SMBEXPORT int SMBCALL smb_init_idx(smb_t* smb, smbmsg_t* msg); SMBEXPORT uint16_t SMBCALL smb_voted_already(smb_t*, uint32_t msgnum, const char* name, enum smb_net_type, void* net_addr); SMBEXPORT BOOL SMBCALL smb_msg_is_from(smbmsg_t* msg, const char* name, enum smb_net_type net_type, const void* net_addr); +SMBEXPORT long SMBCALL smb_first_in_thread(smb_t*, smbmsg_t*); /* smbadd.c */ SMBEXPORT int SMBCALL smb_addmsg(smb_t* smb, smbmsg_t* msg, int storage, long dupechk_hashes