Skip to content
Snippets Groups Projects
Commit 2849731e authored by Rob Swindell's avatar Rob Swindell :speech_balloon:
Browse files

Better error detection in msgtoqwk()

Have msgtoqwk() return a negative number upon error (e.g. blank message, failed to read to body text), which means *no* message header was written to the messages.dat file, so don't increment the record (block) counter used to create the index (NDX) file.

If msgtoqwk() returns 0, that means that a header was written, but no body text (e.g. a vote message) and that is different than an error.
parent 085af70c
No related branches found
No related tags found
1 merge request!463MRC mods by Codefenix (2024-10-20)
Pipeline #331 passed
...@@ -44,8 +44,9 @@ ...@@ -44,8 +44,9 @@
/* Converts message 'msg' to QWK format, writing to file 'qwk_fp'. */ /* Converts message 'msg' to QWK format, writing to file 'qwk_fp'. */
/* mode determines how to handle Ctrl-A codes */ /* mode determines how to handle Ctrl-A codes */
/* Returns the number of bytes used for the body-text (multiple of 128) */ /* Returns the number of bytes used for the body-text (multiple of 128) */
/* or negative on error. */
/****************************************************************************/ /****************************************************************************/
ulong sbbs_t::msgtoqwk(smbmsg_t* msg, FILE *qwk_fp, long mode, smb_t* smb long sbbs_t::msgtoqwk(smbmsg_t* msg, FILE *qwk_fp, long mode, smb_t* smb
, int conf, FILE* hdrs, FILE* voting) , int conf, FILE* hdrs, FILE* voting)
{ {
char str[512],ch=0,tear=0,tearwatch=0,*buf,*p; char str[512],ch=0,tear=0,tearwatch=0,*buf,*p;
...@@ -75,7 +76,7 @@ ulong sbbs_t::msgtoqwk(smbmsg_t* msg, FILE *qwk_fp, long mode, smb_t* smb ...@@ -75,7 +76,7 @@ ulong sbbs_t::msgtoqwk(smbmsg_t* msg, FILE *qwk_fp, long mode, smb_t* smb
if(msg->hdr.type != SMB_MSG_TYPE_NORMAL) { if(msg->hdr.type != SMB_MSG_TYPE_NORMAL) {
if(voting == NULL) if(voting == NULL)
return 0; return -1;
fprintf(voting,"[%lx]\n",offset); fprintf(voting,"[%lx]\n",offset);
switch(msg->hdr.type) { switch(msg->hdr.type) {
case SMB_MSG_TYPE_BALLOT: case SMB_MSG_TYPE_BALLOT:
...@@ -257,7 +258,7 @@ ulong sbbs_t::msgtoqwk(smbmsg_t* msg, FILE *qwk_fp, long mode, smb_t* smb ...@@ -257,7 +258,7 @@ ulong sbbs_t::msgtoqwk(smbmsg_t* msg, FILE *qwk_fp, long mode, smb_t* smb
getmsgtxt_mode |= GETMSGTXT_PLAIN; getmsgtxt_mode |= GETMSGTXT_PLAIN;
buf=smb_getmsgtxt(smb, msg, getmsgtxt_mode); buf=smb_getmsgtxt(smb, msg, getmsgtxt_mode);
if(!buf) if(!buf)
return(0); return -2;
char qwk_newline = QWK_NEWLINE; char qwk_newline = QWK_NEWLINE;
if(smb_msg_is_utf8(msg) || (msg->hdr.auxattr & MSG_HFIELDS_UTF8)) { if(smb_msg_is_utf8(msg) || (msg->hdr.auxattr & MSG_HFIELDS_UTF8)) {
......
...@@ -389,8 +389,9 @@ bool sbbs_t::pack_qwk(char *packet, ulong *msgcnt, bool prepack) ...@@ -389,8 +389,9 @@ bool sbbs_t::pack_qwk(char *packet, ulong *msgcnt, bool prepack)
size=msgtoqwk(&msg, qwk, mode|QM_REPLYTO, &smb, /* confnum: */0, hdrs); size=msgtoqwk(&msg, qwk, mode|QM_REPLYTO, &smb, /* confnum: */0, hdrs);
smb_unlockmsghdr(&smb,&msg); smb_unlockmsghdr(&smb,&msg);
smb_freemsgmem(&msg); smb_freemsgmem(&msg);
if(size >= 0) {
msgndx++; msgndx++;
if(ndx && size) { if(ndx && size > 0) {
f=ltomsbin(msgndx); /* Record number */ f=ltomsbin(msgndx); /* Record number */
ch=0; /* Sub number, not used */ ch=0; /* Sub number, not used */
if(personal) { if(personal) {
...@@ -401,6 +402,7 @@ bool sbbs_t::pack_qwk(char *packet, ulong *msgcnt, bool prepack) ...@@ -401,6 +402,7 @@ bool sbbs_t::pack_qwk(char *packet, ulong *msgcnt, bool prepack)
fwrite(&ch,1,1,ndx); fwrite(&ch,1,1,ndx);
msgndx+=size/QWK_BLOCK_LEN; msgndx+=size/QWK_BLOCK_LEN;
} }
}
YIELD(); /* yield */ YIELD(); /* yield */
} }
if(online == ON_REMOTE) if(online == ON_REMOTE)
...@@ -528,9 +530,9 @@ bool sbbs_t::pack_qwk(char *packet, ulong *msgcnt, bool prepack) ...@@ -528,9 +530,9 @@ bool sbbs_t::pack_qwk(char *packet, ulong *msgcnt, bool prepack)
size=msgtoqwk(&msg, qwk, mode, &smb, conf, hdrs, voting); size=msgtoqwk(&msg, qwk, mode, &smb, conf, hdrs, voting);
smb_unlockmsghdr(&smb,&msg); smb_unlockmsghdr(&smb,&msg);
if(size >= 0) {
msgndx++; msgndx++;
if(ndx && size) { if(ndx && size > 0) {
f=ltomsbin(msgndx); /* Record number */ f=ltomsbin(msgndx); /* Record number */
ch=0; /* Sub number, not used */ ch=0; /* Sub number, not used */
if(personal if(personal
...@@ -543,9 +545,9 @@ bool sbbs_t::pack_qwk(char *packet, ulong *msgcnt, bool prepack) ...@@ -543,9 +545,9 @@ bool sbbs_t::pack_qwk(char *packet, ulong *msgcnt, bool prepack)
fwrite(&ch,1,1,ndx); fwrite(&ch,1,1,ndx);
msgndx+=size/QWK_BLOCK_LEN; msgndx+=size/QWK_BLOCK_LEN;
} }
}
smb_freemsgmem(&msg); smb_freemsgmem(&msg);
if(size) { if(size > 0) {
(*msgcnt)++; (*msgcnt)++;
submsgs++; submsgs++;
} }
......
...@@ -152,7 +152,7 @@ bool sbbs_t::pack_rep(uint hubnum) ...@@ -152,7 +152,7 @@ bool sbbs_t::pack_rep(uint hubnum)
mode |= (cfg.qhub[hubnum]->misc&(QHUB_EXT | QHUB_CTRL_A | QHUB_UTF8)); mode |= (cfg.qhub[hubnum]->misc&(QHUB_EXT | QHUB_CTRL_A | QHUB_UTF8));
/* For an unclear reason, kludge lines (including @VIA and @TZ) were not included in NetMail previously */ /* For an unclear reason, kludge lines (including @VIA and @TZ) were not included in NetMail previously */
if(!(cfg.qhub[hubnum]->misc&QHUB_NOHEADERS)) mode|=(QM_VIA|QM_TZ|QM_MSGID|QM_REPLYTO); if(!(cfg.qhub[hubnum]->misc&QHUB_NOHEADERS)) mode|=(QM_VIA|QM_TZ|QM_MSGID|QM_REPLYTO);
msgtoqwk(&msg, rep, mode, &smb, /* confnum: */0, hdrs); if(msgtoqwk(&msg, rep, mode, &smb, /* confnum: */0, hdrs) > 0)
packedmail++; packedmail++;
smb_unlockmsghdr(&smb,&msg); smb_unlockmsghdr(&smb,&msg);
smb_freemsgmem(&msg); smb_freemsgmem(&msg);
...@@ -228,12 +228,13 @@ bool sbbs_t::pack_rep(uint hubnum) ...@@ -228,12 +228,13 @@ bool sbbs_t::pack_rep(uint hubnum)
if(msg.from_net.type!=NET_QWK) if(msg.from_net.type!=NET_QWK)
mode|=QM_TAGLINE; mode|=QM_TAGLINE;
msgtoqwk(&msg, rep, mode, &smb, cfg.qhub[hubnum]->conf[i], hdrs, voting); if(msgtoqwk(&msg, rep, mode, &smb, cfg.qhub[hubnum]->conf[i], hdrs, voting) > 0) {
msgcnt++;
submsgs++;
}
smb_freemsgmem(&msg); smb_freemsgmem(&msg);
smb_unlockmsghdr(&smb,&msg); smb_unlockmsghdr(&smb,&msg);
msgcnt++;
submsgs++;
if(!(u%50)) if(!(u%50))
YIELD(); /* yield */ YIELD(); /* yield */
} }
......
...@@ -1081,7 +1081,7 @@ public: ...@@ -1081,7 +1081,7 @@ public:
bool unpack_rep(char* repfile=NULL); bool unpack_rep(char* repfile=NULL);
/* msgtoqwk.cpp */ /* msgtoqwk.cpp */
ulong msgtoqwk(smbmsg_t* msg, FILE *qwk_fp, long mode, smb_t*, int conf, FILE* hdrs_dat, FILE* voting_dat = NULL); long msgtoqwk(smbmsg_t* msg, FILE *qwk_fp, long mode, smb_t*, int conf, FILE* hdrs_dat, FILE* voting_dat = NULL);
/* qwktomsg.cpp */ /* qwktomsg.cpp */
bool qwk_new_msg(ulong confnum, smbmsg_t* msg, char* hdrblk, long offset, str_list_t headers, bool parse_sender_hfields); bool qwk_new_msg(ulong confnum, smbmsg_t* msg, char* hdrblk, long offset, str_list_t headers, bool parse_sender_hfields);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment