* have just processed the 'M' (message text) field.
*/
do {
+ field_header = '\0';
long len;
+
+ /* work around possibly buggy messages: */
+ while (field_header == '\0')
+ {
+ if (mptr >= upper_bound) {
+ break;
+ }
+ field_header = *mptr++;
+ }
if (mptr >= upper_bound) {
break;
}
- field_header = *mptr++;
which = field_header;
len = strlen(mptr);
+
CM_SetField(ret, which, mptr, len);
mptr += len + 1; /* advance to next field */
if ( (CM_IsEmpty(ret, eMesageText)) && (with_body) ) {
dmsgtext = cdb_fetch(CDB_BIGMSGS, &msgnum, sizeof(long));
if (dmsgtext != NULL) {
- CM_SetAsField(ret, eMesageText, &dmsgtext->ptr, dmsgtext->len);
+ CM_SetAsField(ret, eMesageText, &dmsgtext->ptr, dmsgtext->len - 1);
cdb_free(dmsgtext);
}
}
char *mpptr = NULL;
char *hptr;
- for (i = 0; i < 256; ++i) {
- if (TheMessage->cm_fields[i]) {
- mptr = mpptr = TheMessage->cm_fields[i];
-
- if (i == eAuthor) {
+ for (i = 0; i < NDiskFields; ++i) {
+ if (TheMessage->cm_fields[FieldOrder[i]]) {
+ mptr = mpptr = TheMessage->cm_fields[FieldOrder[i]];
+ switch (FieldOrder[i]) {
+ case eAuthor:
safestrncpy(luser, mptr, sizeof_luser);
safestrncpy(suser, mptr, sizeof_suser);
- }
- else if (i == 'Y') {
+ break;
+ case eCarbonCopY:
if ((flags & QP_EADDR) != 0) {
mptr = qp_encode_email_addrs(mptr);
}
sanitize_truncated_recipient(mptr);
cprintf("CC: %s%s", mptr, nl);
- }
- else if (i == 'P') {
+ break;
+ case eMessagePath:
cprintf("Return-Path: %s%s", mptr, nl);
- }
- else if (i == eListID) {
+ break;
+ case eListID:
cprintf("List-ID: %s%s", mptr, nl);
- }
- else if (i == 'V') {
+ break;
+ case eenVelopeTo:
if ((flags & QP_EADDR) != 0)
mptr = qp_encode_email_addrs(mptr);
hptr = mptr;
hptr ++;
if (!IsEmptyStr(hptr))
cprintf("Envelope-To: %s%s", hptr, nl);
- }
- else if (i == 'U') {
+ break;
+ case eMsgSubject:
cprintf("Subject: %s%s", mptr, nl);
subject_found = 1;
- }
- else if (i == 'I')
+ break;
+ case emessageId:
safestrncpy(mid, mptr, sizeof_mid); /// TODO: detect @ here and copy @nodename in if not found.
- else if (i == erFc822Addr)
+ break;
+ case erFc822Addr:
safestrncpy(fuser, mptr, sizeof_fuser);
- /* else if (i == 'O')
+ /* case eOriginalRoom:
cprintf("X-Citadel-Room: %s%s",
- mptr, nl); */
- else if (i == 'N')
+ mptr, nl)
+ break;
+ ; */
+ case eNodeName:
safestrncpy(snode, mptr, sizeof_snode);
- else if (i == 'R')
- {
+ break;
+ case eRecipient:
if (haschar(mptr, '@') == 0)
{
sanitize_truncated_recipient(mptr);
cprintf("To: %s", mptr);
cprintf("%s", nl);
}
- }
- else if (i == 'T') {
+ break;
+ case eTimestamp:
datestring(datestamp, sizeof datestamp,
atol(mptr), DATESTRING_RFC822);
cprintf("Date: %s%s", datestamp, nl);
- }
- else if (i == 'W') {
+ break;
+ case eWeferences:
cprintf("References: ");
k = num_tokens(mptr, '|');
for (j=0; j<k; ++j) {
cprintf(" ");
}
}
- }
- else if (i == eReplyTo) {
+ break;
+ case eReplyTo:
hptr = mptr;
while ((*hptr != '\0') && isspace(*hptr))
hptr ++;
if (!IsEmptyStr(hptr))
cprintf("Reply-To: %s%s", mptr, nl);
+ break;
+
+ case eRemoteRoom:
+ case eDestination:
+ case eExclusiveID:
+ case eHumanNode:
+ case eJournal:
+ case eMesageText:
+ case eBig_message:
+ case eOriginalRoom:
+ case eSpecialField:
+ case eErrorMsg:
+ case eSuppressIdx:
+ case eExtnotify:
+ case eVltMsgNum:
+ /* these don't map to mime message headers. */
+ break;
+
}
if (mptr != mpptr)
free (mptr);
CM_SetField(msg, eMesageText, preformatted_text, textlen);
}
else {
- preformatted_text = CtdlReadMessageBody(HKEY("000"), config.c_maxmsglen, NULL, 0, 0);
- if (preformatted_text != NULL) {
- CM_SetField(msg, eMesageText, preformatted_text, strlen(preformatted_text));
+ StrBuf *MsgBody;
+ MsgBody = CtdlReadMessageBodyBuf(HKEY("000"), config.c_maxmsglen, NULL, 0, 0);
+ if (MsgBody != NULL) {
+ CM_SetAsFieldSB(msg, eMesageText, &MsgBody);
}
}