diff --git a/src/smblib/smblib.c b/src/smblib/smblib.c index d4a7d1b0c49fc9a972397f8a30079f540ee7c0b9..177a375246d203695ad20f805930a5e0d9641357 100644 --- a/src/smblib/smblib.c +++ b/src/smblib/smblib.c @@ -53,7 +53,7 @@ #include "filewrap.h" /* Use smb_ver() and smb_lib_ver() to obtain these values */ -#define SMBLIB_VERSION "2.30" /* SMB library version */ +#define SMBLIB_VERSION "2.31" /* SMB library version */ #define SMB_VERSION 0x0121 /* SMB format version */ /* High byte major, low byte minor */ @@ -2339,5 +2339,49 @@ char* SMBCALL smb_dfieldtype(ushort type) return(str); } -/* End of SMBLIB.C */ +int SMBCALL smb_updatethread(smb_t* smb, smbmsg_t* msg, ulong newmsgnum) +{ + int retval=SMB_ERR_NOT_FOUND; + ulong nextmsgnum; + smbmsg_t nextmsg; + + if(!msg->hdr.thread_first) { /* New msg is first reply */ + msg->hdr.thread_first=newmsgnum; + if((retval=smb_lockmsghdr(smb,msg))!=SMB_SUCCESS) + return(retval); + retval=smb_putmsghdr(smb,msg); + smb_unlockmsghdr(smb,msg); + return(retval); + } + + /* Search for last reply and extend chain */ + memset(&nextmsg,0,sizeof(nextmsg)); + nextmsgnum=msg->hdr.thread_first; /* start with first reply */ + while(1) { + nextmsg.idx.offset=0; + nextmsg.hdr.number=nextmsgnum; + if(smb_getmsgidx(smb, &nextmsg)!=SMB_SUCCESS) /* invalid thread origin */ + break; + if(smb_lockmsghdr(smb,msg)!=SMB_SUCCESS) + break; + if(smb_getmsghdr(smb, msg)!=SMB_SUCCESS) { + smb_unlockmsghdr(smb,msg); + break; + } + if(nextmsg.hdr.thread_next && nextmsg.hdr.thread_next!=nextmsgnum) { + nextmsgnum=nextmsg.hdr.thread_next; + smb_unlockmsghdr(smb,&nextmsg); + smb_freemsgmem(&nextmsg); + continue; + } + nextmsg.hdr.thread_next=newmsgnum; + retval=smb_putmsghdr(smb,&nextmsg); + smb_unlockmsghdr(smb,&nextmsg); + smb_freemsgmem(&nextmsg); + break; + } + return(retval); +} + +/* End of SMBLIB.C */ diff --git a/src/smblib/smblib.h b/src/smblib/smblib.h index dc3e09149f0bb6e700d807e448c52372f5505efa..6d8f110fdd0f00d0170a4fa997c3a6180b28ff23 100644 --- a/src/smblib/smblib.h +++ b/src/smblib/smblib.h @@ -153,6 +153,7 @@ 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 int SMBCALL smb_tzutc(short timezone); +SMBEXPORT int SMBCALL smb_updatethread(smb_t* smb, smbmsg_t* remsg, ulong newmsgnum); /* smbtxt.c */ SMBEXPORT char* SMBCALL smb_getmsgtxt(smb_t* smb, smbmsg_t* msg, ulong mode);