struct MetaData has an unused member "mimetype" that doesn't
[citadel.git] / citadel / msgbase.c
index bd58be4bde4a80e11317ba02f2b104ea15b14a83..339650a8f14e7a189679f884da1ce0c2e09016d4 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * 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.
@@ -55,23 +55,23 @@ char *msgkeys[91] = {
        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   */
@@ -147,22 +147,25 @@ eMsgField FieldOrder[]  = {
 
 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];
@@ -170,6 +173,8 @@ void CM_SetFieldLONG(struct CtdlMessage *Msg, eMsgField which, long lvalue)
        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)
@@ -182,6 +187,7 @@ void CM_CutFieldAt(struct CtdlMessage *Msg, eMsgField WhichToCut, long maxlen)
        }
 }
 
+
 void CM_FlushField(struct CtdlMessage *Msg, eMsgField which)
 {
        if (Msg->cm_fields[which] != NULL)
@@ -189,35 +195,37 @@ void CM_FlushField(struct CtdlMessage *Msg, eMsgField which)
        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;
        }
@@ -249,48 +257,53 @@ void CM_PrependToField(struct CtdlMessage *Msg, eMsgField which, const char *buf
        }
 }
 
+
 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;
@@ -298,6 +311,7 @@ int CM_IsValidMsg(struct CtdlMessage *msg) {
        return 1;
 }
 
+
 void CM_FreeContents(struct CtdlMessage *msg)
 {
        int i;
@@ -310,13 +324,14 @@ void CM_FreeContents(struct CtdlMessage *msg)
 
        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;
        }
@@ -324,40 +339,42 @@ void CM_Free(struct CtdlMessage *msg)
        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;
                        }
@@ -368,9 +385,6 @@ struct CtdlMessage * CM_Duplicate(struct CtdlMessage *OrgMsg)
 }
 
 
-
-
-
 /* Determine if a given message matches the fields in a message template.
  * Return 0 for a successful match.
  */
@@ -1045,14 +1059,14 @@ void mime_download(char *name, char *filename, char *partnum, char *disp,
        ) {
                CC->download_fp = tmpfile();
                if (CC->download_fp == NULL) {
-                       syslog(LOG_EMERG, "msgbase: mime_download() couldn't write: %s", strerror(errno));
+                       syslog(LOG_EMERG, "msgbase: mime_download() couldn't write: %m");
                        cprintf("%d cannot open temporary file: %s\n", ERROR + INTERNAL_ERROR, strerror(errno));
                        return;
                }
        
                rv = fwrite(content, length, 1, CC->download_fp);
                if (rv <= 0) {
-                       syslog(LOG_EMERG, "msgbase: mime_download() Couldn't write: %s", strerror(errno));
+                       syslog(LOG_EMERG, "msgbase: mime_download() Couldn't write: %m");
                        cprintf("%d unable to write tempfile.\n", ERROR + TOO_BIG);
                        fclose(CC->download_fp);
                        CC->download_fp = NULL;
@@ -2093,7 +2107,6 @@ int CtdlOutputPreLoadedMsg(
 
        if (!CM_IsValidMsg(TheMessage)) {
                syslog(LOG_ERR, "msgbase: error; invalid preloaded message for output");
-               cit_backtrace ();
                return(om_no_such_msg);
        }
 
@@ -2639,9 +2652,7 @@ void CtdlSerializeMessage(struct ser_ret *ret,            /* return values */
 
        ret->ser = malloc(ret->len);
        if (ret->ser == NULL) {
-               syslog(LOG_ERR, "msgbase: CtdlSerializeMessage() malloc(%ld) failed: %s",
-                          (long)ret->len, strerror(errno)
-               );
+               syslog(LOG_ERR, "msgbase: CtdlSerializeMessage() malloc(%ld) failed: %m", (long)ret->len);
                ret->len = 0;
                ret->ser = NULL;
                return;
@@ -2914,12 +2925,12 @@ long CtdlSubmitMsg(struct CtdlMessage *msg,     /* message to save */
        /* 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;
        }
                
@@ -3503,8 +3514,6 @@ int CtdlDeleteMessages(const char *room_name,             /* which room */
 }
 
 
-
-
 /*
  * GetMetaData()  -  Get the supplementary record for a message
  */
@@ -3525,7 +3534,7 @@ void GetMetaData(struct MetaData *smibuf, long msgnum)
        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);
@@ -3592,7 +3601,7 @@ void AdjRefCount(long msgnum, int incr)
        new_arcq.arcq_delta = incr;
        rv = fwrite(&new_arcq, sizeof(struct arcq), 1, arcfp);
        if (rv == -1) {
-               syslog(LOG_EMERG, "%s: %s", file_arcq, strerror(errno));
+               syslog(LOG_EMERG, "%s: %m", file_arcq);
        }
        fflush(arcfp);
 
@@ -3605,8 +3614,6 @@ void AdjRefCountList(long *msgnum, long nmsg, int incr)
        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+");
@@ -3627,6 +3634,7 @@ void AdjRefCountList(long *msgnum, long nmsg, int incr)
        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;
        }
@@ -3636,7 +3644,7 @@ void AdjRefCountList(long *msgnum, long nmsg, int incr)
        {
                rv = fwrite(new_arcq + offset, 1, the_size - offset, arcfp);
                if (rv == -1) {
-                       syslog(LOG_EMERG, "%s: %s", file_arcq, strerror(errno));
+                       syslog(LOG_ERR, "%s: %m", file_arcq);
                }
                else {
                        offset += rv;
@@ -3674,7 +3682,7 @@ int TDAP_ProcessAdjRefCountQueue(void)
 
        r = link(file_arcq, file_arcq_temp);
        if (r != 0) {
-               syslog(LOG_ERR, "%s: %s", file_arcq_temp, strerror(errno));
+               syslog(LOG_ERR, "%s: %m", file_arcq_temp);
                end_critical_section(S_SUPPMSGMAIN);
                return(num_records_processed);
        }
@@ -3684,7 +3692,7 @@ int TDAP_ProcessAdjRefCountQueue(void)
 
        fp = fopen(file_arcq_temp, "rb");
        if (fp == NULL) {
-               syslog(LOG_ERR, "%s: %s", file_arcq_temp, strerror(errno));
+               syslog(LOG_ERR, "%s: %m", file_arcq_temp);
                return(num_records_processed);
        }
 
@@ -3696,7 +3704,7 @@ int TDAP_ProcessAdjRefCountQueue(void)
        fclose(fp);
        r = unlink(file_arcq_temp);
        if (r != 0) {
-               syslog(LOG_ERR, "%s: %s", file_arcq_temp, strerror(errno));
+               syslog(LOG_ERR, "%s: %m", file_arcq_temp);
        }
 
        return(num_records_processed);