/*
* Implements the message store.
*
- * Copyright (c) 1987-2012 by the citadel.org team
+ * Copyright (c) 1987-2015 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.
#include "ctdl_module.h"
#include "citserver.h"
#include "control.h"
+#include "config.h"
#include "clientsocket.h"
#include "genstamp.h"
#include "room_ops.h"
void OutputRFC822MsgHeaders(
struct CtdlMessage *TheMessage,
int flags, /* should the bessage be exported clean */
- const char *nl,
+ const char *nl, int nlen,
char *mid, long sizeof_mid,
char *suser, long sizeof_suser,
char *luser, long sizeof_luser,
if (haschar(mptr, '@') == 0)
{
sanitize_truncated_recipient(mptr);
- cprintf("To: %s@%s", mptr, config.c_fqdn);
+ cprintf("To: %s@%s", mptr, CtdlGetConfigStr("c_fqdn"));
cprintf("%s", nl);
}
else
int headers_only, /* eschew the message body? */
int flags, /* should the bessage be exported clean? */
- const char *nl)
+ const char *nl, int nlen)
{
cit_uint8_t prev_ch;
int eoh = 0;
int outlen = 0;
int nllen = strlen(nl);
char *mptr;
+ int lfSent = 0;
mptr = TheMessage->cm_fields[eMesageText];
MSGM_syslog(LOG_ERR, "Dump_RFC822HeadersBody(): aborting due to write failure.\n");
return;
}
+ lfSent = (outbuf[outlen - 1] == '\n');
outlen = 0;
}
}
if (outlen > 0) {
client_write(outbuf, outlen);
+ lfSent = (outbuf[outlen - 1] == '\n');
}
+ if (!lfSent)
+ client_write(nl, nlen);
}
void DumpFormatFixed(
struct CtdlMessage *TheMessage,
int mode, /* how would you like that message? */
- const char *nl)
+ const char *nl, int nllen)
{
cit_uint8_t ch;
char buf[SIZ];
int buflen;
int xlline = 0;
- int nllen = strlen (nl);
char *mptr;
mptr = TheMessage->cm_fields[eMesageText];
struct CitContext *CCC = CC;
int i;
const char *nl; /* newline string */
+ int nlen;
struct ma_info ma;
/* Buffers needed for RFC822 translation. These are all filled
strcpy(mid, "unknown");
nl = (crlf ? "\r\n" : "\n");
+ nlen = crlf ? 2 : 1;
if (!CM_IsValidMsg(TheMessage)) {
MSGM_syslog(LOG_ERR,
strcpy(suser, "");
strcpy(luser, "");
strcpy(fuser, "");
- memcpy(snode, CFG_KEY(c_nodename) + 1);
+ memcpy(snode, CtdlGetConfigStr("c_nodename"), strlen(CtdlGetConfigStr("c_nodename")) + 1);
if (mode == MT_RFC822)
OutputRFC822MsgHeaders(
TheMessage,
flags,
- nl,
+ nl, nlen,
mid, sizeof(mid),
suser, sizeof(suser),
luser, sizeof(luser),
TheMessage,
headers_only,
flags,
- nl);
+ nl, nlen);
goto DONE;
}
}
DumpFormatFixed(
TheMessage,
mode, /* how would you like that message? */
- nl);
+ nl, nlen);
/* If the message on disk is format 0 (Citadel vari-format), we
* output using the formatter at 80 columns. This is the final output
msgidbuflen = snprintf(msgidbuf, sizeof msgidbuf, "%08lX-%08lX@%s",
(long unsigned int) time(NULL),
(long unsigned int) newmsgid,
- config.c_fqdn
+ CtdlGetConfigStr("c_fqdn")
);
CM_SetField(msg, emessageId, msgidbuf, msgidbuflen);
if (TWITDETECT) {
if (CCC->user.axlevel == AxProbU) {
strcpy(hold_rm, actual_rm);
- strcpy(actual_rm, config.c_twitroom);
+ strcpy(actual_rm, CtdlGetConfigStr("c_twitroom"));
MSGM_syslog(LOG_DEBUG, "Diverting to twit room\n");
}
}
if ((!CCC->internal_pgm) || (recps == NULL)) {
if (CtdlSaveMsgPointerInRoom(actual_rm, newmsgid, 1, msg) != 0) {
MSGM_syslog(LOG_ERR, "ERROR saving message pointer!\n");
- CtdlSaveMsgPointerInRoom(config.c_aideroom, newmsgid, 0, msg);
+ CtdlSaveMsgPointerInRoom(CtdlGetConfigStr("c_aideroom"), newmsgid, 0, msg);
}
}
{
if (CCC->logged_in)
snprintf(bounce_to, sizeof bounce_to, "%s@%s",
- CCC->user.fullname, config.c_nodename);
+ CCC->user.fullname, CtdlGetConfigStr("c_nodename"));
else
snprintf(bounce_to, sizeof bounce_to, "%s@%s",
msg->cm_fields[eAuthor], msg->cm_fields[eNodeName]);
}
else {
MSG_syslog(LOG_DEBUG, "No user <%s>\n", recipient);
- CtdlSaveMsgPointerInRoom(config.c_aideroom, newmsgid, 0, msg);
+ CtdlSaveMsgPointerInRoom(CtdlGetConfigStr("c_aideroom"), newmsgid, 0, msg);
}
}
recps->recp_local = pch;
}
else {
if (recps == NULL) {
- qualified_for_journaling = config.c_journal_pubmsgs;
+ qualified_for_journaling = CtdlGetConfigInt("c_journal_pubmsgs");
}
else if (recps->num_local + recps->num_ignet + recps->num_internet > 0) {
- qualified_for_journaling = config.c_journal_email;
+ qualified_for_journaling = CtdlGetConfigInt("c_journal_email");
}
else {
- qualified_for_journaling = config.c_journal_pubmsgs;
+ qualified_for_journaling = CtdlGetConfigInt("c_journal_pubmsgs");
}
}
if (fromaddr != NULL) CM_SetField(msg, erFc822Addr, fromaddr, strlen(fromaddr));
if (room != NULL) CM_SetField(msg, eOriginalRoom, room, strlen(room));
- CM_SetField(msg, eNodeName, CFG_KEY(c_nodename));
+ CM_SetField(msg, eNodeName, CtdlGetConfigStr("c_nodename"), strlen(CtdlGetConfigStr("c_nodename")));
if (to != NULL) {
CM_SetField(msg, eRecipient, to, strlen(to));
recp = validate_recipients(to, NULL, 0);
CM_SetField(msg, eOriginalRoom, CCC->room.QRname, strlen(CCC->room.QRname));
}
- CM_SetField(msg, eNodeName, CFG_KEY(c_nodename));
- CM_SetField(msg, eHumanNode, CFG_KEY(c_humannode));
+ CM_SetField(msg, eNodeName, CtdlGetConfigStr("c_nodename"), strlen(CtdlGetConfigStr("c_nodename")));
+ CM_SetField(msg, eHumanNode, CtdlGetConfigStr("c_humannode"), strlen(CtdlGetConfigStr("c_humannode")));
if (rcplen > 0) {
CM_SetField(msg, eRecipient, recipient, rcplen);
}
else {
StrBuf *MsgBody;
- MsgBody = CtdlReadMessageBodyBuf(HKEY("000"), config.c_maxmsglen, NULL, 0, 0);
+ MsgBody = CtdlReadMessageBodyBuf(HKEY("000"), CtdlGetConfigLong("c_maxmsglen"), NULL, 0, 0);
if (MsgBody != NULL) {
CM_SetAsFieldSB(msg, eMesageText, &MsgBody);
}
* API function to delete messages which match a set of criteria
* (returns the actual number of messages deleted)
*/
-int CtdlDeleteMessages(char *room_name, /* which room */
+int CtdlDeleteMessages(const char *room_name, /* which room */
long *dmsgnums, /* array of msg numbers to be deleted */
int num_dmsgnums, /* number of msgs to be deleted, or 0 for "any" */
char *content_type /* or "" for any. regular expressions expected. */
msg->cm_format_type = 4;
CM_SetField(msg, eAuthor, CCC->user.fullname, strlen(CCC->user.fullname));
CM_SetField(msg, eOriginalRoom, req_room, strlen(req_room));
- CM_SetField(msg, eNodeName, CFG_KEY(c_nodename));
- CM_SetField(msg, eHumanNode, CFG_KEY(c_humannode));
+ CM_SetField(msg, eNodeName, CtdlGetConfigStr("c_nodename"), strlen(CtdlGetConfigStr("c_nodename")));
+ CM_SetField(msg, eHumanNode, CtdlGetConfigStr("c_humannode"), strlen(CtdlGetConfigStr("c_humannode")));
msg->cm_flags = flags;
CM_SetAsFieldSB(msg, eMesageText, &encoded_message);