X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmsgbase.c;h=c65eef1a664a32918a30912e280b2a74fb7277a4;hb=00159d60a19a36105161c420aeb6a4d33dbd6b5f;hp=bcbc21c0e60c3ab5b24fe0796279541d7c5a470a;hpb=cf09c5cb779279f9ad24545e68414edc0340d6fa;p=citadel.git diff --git a/citadel/msgbase.c b/citadel/msgbase.c index bcbc21c0e..c65eef1a6 100644 --- a/citadel/msgbase.c +++ b/citadel/msgbase.c @@ -1,7 +1,7 @@ /* * 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. @@ -22,6 +22,7 @@ #include "ctdl_module.h" #include "citserver.h" #include "control.h" +#include "config.h" #include "clientsocket.h" #include "genstamp.h" #include "room_ops.h" @@ -1765,7 +1766,7 @@ void OutputCtdlMsgHeaders( 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, @@ -1831,7 +1832,7 @@ void OutputRFC822MsgHeaders( 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 @@ -1903,7 +1904,7 @@ void Dump_RFC822HeadersBody( 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; @@ -1912,6 +1913,7 @@ void Dump_RFC822HeadersBody( int outlen = 0; int nllen = strlen(nl); char *mptr; + int lfSent = 0; mptr = TheMessage->cm_fields[eMesageText]; @@ -1968,12 +1970,16 @@ void Dump_RFC822HeadersBody( 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); } @@ -1985,13 +1991,12 @@ void Dump_RFC822HeadersBody( 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]; @@ -2066,6 +2071,7 @@ int CtdlOutputPreLoadedMsg( 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 @@ -2084,6 +2090,7 @@ int CtdlOutputPreLoadedMsg( strcpy(mid, "unknown"); nl = (crlf ? "\r\n" : "\n"); + nlen = crlf ? 2 : 1; if (!CM_IsValidMsg(TheMessage)) { MSGM_syslog(LOG_ERR, @@ -2179,12 +2186,12 @@ int CtdlOutputPreLoadedMsg( 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), @@ -2248,7 +2255,7 @@ START_TEXT: TheMessage, headers_only, flags, - nl); + nl, nlen); goto DONE; } } @@ -2266,7 +2273,7 @@ START_TEXT: 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 @@ -2587,7 +2594,7 @@ long send_message(struct CtdlMessage *msg) { 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); @@ -2806,7 +2813,7 @@ long CtdlSubmitMsg(struct CtdlMessage *msg, /* message to save */ 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"); } } @@ -2889,7 +2896,7 @@ long CtdlSubmitMsg(struct CtdlMessage *msg, /* message to save */ 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); } } @@ -2918,7 +2925,7 @@ long CtdlSubmitMsg(struct CtdlMessage *msg, /* message to save */ { 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]); @@ -2951,7 +2958,7 @@ long CtdlSubmitMsg(struct CtdlMessage *msg, /* message to save */ } 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; @@ -2996,13 +3003,13 @@ long CtdlSubmitMsg(struct CtdlMessage *msg, /* message to save */ } 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"); } } @@ -3065,7 +3072,7 @@ void quickie_message(const char *from, 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); @@ -3538,8 +3545,8 @@ struct CtdlMessage *CtdlMakeMessageLen( 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); @@ -3591,7 +3598,7 @@ struct CtdlMessage *CtdlMakeMessageLen( } 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); } @@ -3607,7 +3614,7 @@ struct CtdlMessage *CtdlMakeMessageLen( * 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. */ @@ -4072,8 +4079,8 @@ void CtdlWriteObject(char *req_room, /* Room to stuff it in */ 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);