/*
* Implements the message store.
*
- * Copyright (c) 1987-2017 by the citadel.org team
+ * Copyright (c) 1987-2018 by the citadel.org team
*
* This program is open source software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3.
NULL,
"from", /* A -> eAuthor */
NULL, /* B -> eBig_message */
- NULL, /* C -> eRemoteRoom */
- NULL, /* D -> eDestination */
+ NULL, /* C -> eRemoteRoom FIXME no more ignet */
+ NULL, /* D -> eDestination FIXME no more ignet */
"exti", /* E -> eXclusivID */
"rfca", /* F -> erFc822Addr */
NULL, /* G */
- "hnod", /* H -> eHumanNode */
+ "hnod", /* H -> eHumanNode FIXME no more ignet */
"msgn", /* I -> emessageId */
"jrnl", /* J -> eJournal */
"rep2", /* K -> eReplyTo */
"list", /* L -> eListID */
"text", /* M -> eMesageText */
- "node", /* N -> eNodeName */
+ "node", /* N -> eNodeName FIXME no more ignet */
"room", /* O -> eOriginalRoom */
"path", /* P -> eMessagePath */
NULL, /* Q */
"rcpt", /* R -> eRecipient */
- "spec", /* S -> eSpecialField */
+ "spec", /* S -> eSpecialField FIXME we might not be using this anymore */
"time", /* T -> eTimestamp */
"subj", /* U -> eMsgSubject */
"nvto", /* V -> eenVelopeTo */
static const long NDiskFields = sizeof(FieldOrder) / sizeof(eMsgField);
+
int CM_IsEmpty(struct CtdlMessage *Msg, eMsgField which)
{
- return !((Msg->cm_fields[which] != NULL) &&
- (Msg->cm_fields[which][0] != '\0'));
+ return !((Msg->cm_fields[which] != NULL) && (Msg->cm_fields[which][0] != '\0'));
}
+
void CM_SetField(struct CtdlMessage *Msg, eMsgField which, const char *buf, long length)
{
- if (Msg->cm_fields[which] != NULL)
+ if (Msg->cm_fields[which] != NULL) {
free (Msg->cm_fields[which]);
+ }
Msg->cm_fields[which] = malloc(length + 1);
memcpy(Msg->cm_fields[which], buf, length);
Msg->cm_fields[which][length] = '\0';
Msg->cm_lengths[which] = length;
}
+
void CM_SetFieldLONG(struct CtdlMessage *Msg, eMsgField which, long lvalue)
{
char buf[128];
len = snprintf(buf, sizeof(buf), "%ld", lvalue);
CM_SetField(Msg, which, buf, len);
}
+
+
void CM_CutFieldAt(struct CtdlMessage *Msg, eMsgField WhichToCut, long maxlen)
{
if (Msg->cm_fields[WhichToCut] == NULL)
}
}
+
void CM_FlushField(struct CtdlMessage *Msg, eMsgField which)
{
if (Msg->cm_fields[which] != NULL)
Msg->cm_fields[which] = NULL;
Msg->cm_lengths[which] = 0;
}
+
+
void CM_Flush(struct CtdlMessage *Msg)
{
int i;
- if (CM_IsValidMsg(Msg) == 0)
+ if (CM_IsValidMsg(Msg) == 0) {
return;
+ }
- for (i = 0; i < 256; ++i)
- {
+ for (i = 0; i < 256; ++i) {
CM_FlushField(Msg, i);
}
}
+
void CM_CopyField(struct CtdlMessage *Msg, eMsgField WhichToPutTo, eMsgField WhichtToCopy)
{
long len;
- if (Msg->cm_fields[WhichToPutTo] != NULL)
+ if (Msg->cm_fields[WhichToPutTo] != NULL) {
free (Msg->cm_fields[WhichToPutTo]);
+ }
- if (Msg->cm_fields[WhichtToCopy] != NULL)
- {
+ if (Msg->cm_fields[WhichtToCopy] != NULL) {
len = Msg->cm_lengths[WhichtToCopy];
Msg->cm_fields[WhichToPutTo] = malloc(len + 1);
memcpy(Msg->cm_fields[WhichToPutTo], Msg->cm_fields[WhichtToCopy], len);
Msg->cm_fields[WhichToPutTo][len] = '\0';
Msg->cm_lengths[WhichToPutTo] = len;
}
- else
- {
+ else {
Msg->cm_fields[WhichToPutTo] = NULL;
Msg->cm_lengths[WhichToPutTo] = 0;
}
}
}
+
void CM_SetAsField(struct CtdlMessage *Msg, eMsgField which, char **buf, long length)
{
- if (Msg->cm_fields[which] != NULL)
+ if (Msg->cm_fields[which] != NULL) {
free (Msg->cm_fields[which]);
+ }
Msg->cm_fields[which] = *buf;
*buf = NULL;
Msg->cm_lengths[which] = length;
}
+
void CM_SetAsFieldSB(struct CtdlMessage *Msg, eMsgField which, StrBuf **buf)
{
- if (Msg->cm_fields[which] != NULL)
+ if (Msg->cm_fields[which] != NULL) {
free (Msg->cm_fields[which]);
+ }
Msg->cm_lengths[which] = StrLength(*buf);
Msg->cm_fields[which] = SmashStrBuf(buf);
}
+
void CM_GetAsField(struct CtdlMessage *Msg, eMsgField which, char **ret, long *retlen)
{
- if (Msg->cm_fields[which] != NULL)
- {
+ if (Msg->cm_fields[which] != NULL) {
*retlen = Msg->cm_lengths[which];
*ret = Msg->cm_fields[which];
Msg->cm_fields[which] = NULL;
Msg->cm_lengths[which] = 0;
}
- else
- {
+ else {
*ret = NULL;
*retlen = 0;
}
}
+
/*
* Returns 1 if the supplied pointer points to a valid Citadel message.
* If the pointer is NULL or the magic number check fails, returns 0.
*/
int CM_IsValidMsg(struct CtdlMessage *msg) {
- if (msg == NULL)
+ if (msg == NULL) {
return 0;
+ }
if ((msg->cm_magic) != CTDLMESSAGE_MAGIC) {
syslog(LOG_WARNING, "msgbase: CM_IsValidMsg() self-check failed");
return 0;
return 1;
}
+
void CM_FreeContents(struct CtdlMessage *msg)
{
int i;
msg->cm_magic = 0; /* just in case */
}
+
+
/*
* 'Destructor' for struct CtdlMessage
*/
void CM_Free(struct CtdlMessage *msg)
{
- if (CM_IsValidMsg(msg) == 0)
- {
+ if (CM_IsValidMsg(msg) == 0) {
if (msg != NULL) free (msg);
return;
}
free(msg);
}
+
int CM_DupField(eMsgField i, struct CtdlMessage *OrgMsg, struct CtdlMessage *NewMsg)
{
long len;
len = OrgMsg->cm_lengths[i];
NewMsg->cm_fields[i] = malloc(len + 1);
- if (NewMsg->cm_fields[i] == NULL)
+ if (NewMsg->cm_fields[i] == NULL) {
return 0;
+ }
memcpy(NewMsg->cm_fields[i], OrgMsg->cm_fields[i], len);
NewMsg->cm_fields[i][len] = '\0';
NewMsg->cm_lengths[i] = len;
return 1;
}
+
struct CtdlMessage * CM_Duplicate(struct CtdlMessage *OrgMsg)
{
int i;
struct CtdlMessage *NewMsg;
- if (CM_IsValidMsg(OrgMsg) == 0)
+ if (CM_IsValidMsg(OrgMsg) == 0) {
return NULL;
+ }
NewMsg = (struct CtdlMessage *)malloc(sizeof(struct CtdlMessage));
- if (NewMsg == NULL)
+ if (NewMsg == NULL) {
return NULL;
+ }
memcpy(NewMsg, OrgMsg, sizeof(struct CtdlMessage));
memset(&NewMsg->cm_fields, 0, sizeof(char*) * 256);
- for (i = 0; i < 256; ++i)
- {
- if (OrgMsg->cm_fields[i] != NULL)
- {
- if (!CM_DupField(i, OrgMsg, NewMsg))
- {
+ for (i = 0; i < 256; ++i) {
+ if (OrgMsg->cm_fields[i] != NULL) {
+ if (!CM_DupField(i, OrgMsg, NewMsg)) {
CM_Free(NewMsg);
return NULL;
}
}
-
-
-
/* Determine if a given message matches the fields in a message template.
* Return 0 for a successful match.
*/
if (!CM_IsValidMsg(TheMessage)) {
syslog(LOG_ERR, "msgbase: error; invalid preloaded message for output");
- cit_backtrace ();
return(om_no_such_msg);
}
/* Decide where bounces need to be delivered */
if ((recps != NULL) && (recps->bounce_to == NULL))
{
- if (CC->logged_in)
- snprintf(bounce_to, sizeof bounce_to, "%s@%s",
- CC->user.fullname, CtdlGetConfigStr("c_nodename"));
- else
- snprintf(bounce_to, sizeof bounce_to, "%s@%s",
- msg->cm_fields[eAuthor], msg->cm_fields[eNodeName]);
+ if (CC->logged_in) {
+ snprintf(bounce_to, sizeof bounce_to, "%s@%s", CC->user.fullname, CtdlGetConfigStr("c_nodename"));
+ }
+ else {
+ snprintf(bounce_to, sizeof bounce_to, "%s@%s", msg->cm_fields[eAuthor], msg->cm_fields[eNodeName]);
+ }
recps->bounce_to = bounce_to;
}
}
-
-
/*
* GetMetaData() - Get the supplementary record for a message
*/
if (cdbsmi == NULL) {
return; /* record not found; go with defaults */
}
- memcpy(smibuf, cdbsmi->ptr,
+ memcpy(smibuf, cdbsmi->ptr, // FIXME can we do this without a memcpy?
((cdbsmi->len > sizeof(struct MetaData)) ?
sizeof(struct MetaData) : cdbsmi->len));
cdb_free(cdbsmi);
struct arcq *new_arcq;
int rv = 0;
- syslog(LOG_DEBUG, "msgbase: AdjRefCountList() msg %ld ref count delta %+d", nmsg, incr);
-
begin_critical_section(S_SUPPMSGMAIN);
if (arcfp == NULL) {
arcfp = fopen(file_arcq, "ab+");
the_size = sizeof(struct arcq) * nmsg;
new_arcq = malloc(the_size);
for (i = 0; i < nmsg; i++) {
+ syslog(LOG_DEBUG, "msgbase: AdjRefCountList() msg %ld ref count delta %+d", msgnum[i], incr);
new_arcq[i].arcq_msgnum = msgnum[i];
new_arcq[i].arcq_delta = incr;
}