]> code.citadel.org Git - citadel.git/blobdiff - citadel/msgbase.c
* dump message headers on artv dump
[citadel.git] / citadel / msgbase.c
index 361f791a3e626776bbdaa6c95170da50028b36f8..733e34ad688baa1e3033e742a0c2d47079d02404 100644 (file)
@@ -53,6 +53,7 @@
 #include "euidindex.h"
 #include "journaling.h"
 #include "citadel_dirs.h"
+#include "clientsocket.h"
 
 
 long config_msgnum;
@@ -541,9 +542,7 @@ int CtdlForEachMessage(int mode, long ref, char *search_string,
        cdbfr = cdb_fetch(CDB_MSGLISTS, &CC->room.QRnumber, sizeof(long));
        if (cdbfr != NULL) {
                msglist = (long *) cdbfr->ptr;
-               cdbfr->ptr = NULL;      /* CtdlForEachMessage() now owns this memory */
                num_msgs = cdbfr->len / sizeof(long);
-               cdb_free(cdbfr);
        } else {
                if (need_to_free_re) regfree(&re);
                return 0;       /* No messages at all?  No further action. */
@@ -679,7 +678,7 @@ int CtdlForEachMessage(int mode, long ref, char *search_string,
                                ++num_processed;
                        }
                }
-       free(msglist);          /* Clean up */
+       cdb_free(cdbfr);        /* Clean up */
        if (need_to_free_re) regfree(&re);
        return num_processed;
 }
@@ -1035,9 +1034,7 @@ struct CtdlMessage *CtdlFetchMessage(long msgnum, int with_body)
         */
        ch = *mptr++;
        if (ch != 255) {
-               lprintf(CTDL_ERR,
-                       "Message %ld appears to be corrupted.\n",
-                       msgnum);
+               lprintf(CTDL_ERR, "Message %ld appears to be corrupted.\n", msgnum);
                cdb_free(dmsgtext);
                return NULL;
        }
@@ -1200,8 +1197,7 @@ void fixed_output(char *name, char *filename, char *partnum, char *disp,
         * we've already printed another section, skip this one.
         */     
        if ( (ma->is_ma) && (ma->did_print) ) {
-               lprintf(CTDL_DEBUG, "Skipping part %s (%s)\n",
-                       partnum, cbtype);
+               lprintf(CTDL_DEBUG, "Skipping part %s (%s)\n", partnum, cbtype);
                return;
        }
        ma->did_print = 1;
@@ -1264,14 +1260,18 @@ void choose_preferred(char *name, char *filename, char *partnum, char *disp,
        
        ma = (struct ma_info *)cbuserdata;
 
-       if (ma->is_ma > 0) {
-               for (i=0; i<num_tokens(CC->preferred_formats, '|'); ++i) {
-                       extract_token(buf, CC->preferred_formats, i, '|', sizeof buf);
-                       if ( (!strcasecmp(buf, cbtype)) && (!ma->freeze) ) {
-                               if (i < ma->chosen_pref) {
-                                       safestrncpy(ma->chosen_part, partnum, sizeof ma->chosen_part);
-                                       ma->chosen_pref = i;
-                               }
+       // NOTE: REMOVING THIS CONDITIONAL FIXES BUG 220
+       //       http://bugzilla.citadel.org/show_bug.cgi?id=220
+       // I don't know if there are any side effects!  Please TEST TEST TEST
+       //if (ma->is_ma > 0) {
+
+       for (i=0; i<num_tokens(CC->preferred_formats, '|'); ++i) {
+               extract_token(buf, CC->preferred_formats, i, '|', sizeof buf);
+               if ( (!strcasecmp(buf, cbtype)) && (!ma->freeze) ) {
+                       if (i < ma->chosen_pref) {
+                               lprintf(CTDL_DEBUG, "Setting chosen part: <%s>\n", partnum);
+                               safestrncpy(ma->chosen_part, partnum, sizeof ma->chosen_part);
+                               ma->chosen_pref = i;
                        }
                }
        }
@@ -1446,9 +1446,7 @@ int CtdlOutputMsg(long msg_num,           /* message number (local) to fetch */
        }
 
        /* Ok, output the message now */
-       retcode = CtdlOutputPreLoadedMsg(
-               TheMessage, mode,
-               headers_only, do_proto, crlf);
+       retcode = CtdlOutputPreLoadedMsg(TheMessage, mode, headers_only, do_proto, crlf);
        CtdlFreeMessage(TheMessage);
 
        return(retcode);
@@ -1457,7 +1455,6 @@ int CtdlOutputMsg(long msg_num,           /* message number (local) to fetch */
 
 /*
  * Get a message off disk.  (returns om_* values found in msgbase.h)
- * 
  */
 int CtdlOutputPreLoadedMsg(
                struct CtdlMessage *TheMessage,
@@ -1814,21 +1811,26 @@ START_TEXT:
         * what message transfer format is in use.
         */
        if (TheMessage->cm_format_type == FMT_FIXED) {
+               int buflen;
                if (mode == MT_MIME) {
                        cprintf("Content-type: text/plain\n\n");
                }
-               strcpy(buf, "");
+               *buf = '\0';
+               buflen = 0;
                while (ch = *mptr++, ch > 0) {
                        if (ch == 13)
                                ch = 10;
-                       if ((ch == 10) || (strlen(buf) > 250)) {
+                       if ((ch == 10) || (buflen > 250)) {
+                               buf[buflen] = '\0';
                                cprintf("%s%s", buf, nl);
-                               strcpy(buf, "");
+                               *buf = '\0';
+                               buflen = 0;
                        } else {
-                               buf[strlen(buf) + 1] = 0;
-                               buf[strlen(buf)] = ch;
+                               buf[buflen] = ch;
+                               buflen++;
                        }
                }
+               buf[buflen] = '\0';
                if (!IsEmptyStr(buf))
                        cprintf("%s%s", buf, nl);
        }
@@ -2318,6 +2320,43 @@ void serialize_message(struct ser_ret *ret,              /* return values */
 }
 
 
+/*
+ * Serialize a struct CtdlMessage into the format used on disk and network.
+ * 
+ * This function loads up a "struct ser_ret" (defined in server.h) which
+ * contains the length of the serialized message and a pointer to the
+ * serialized message in memory.  THE LATTER MUST BE FREED BY THE CALLER.
+ */
+void dump_message(struct CtdlMessage *msg,     /* unserialized msg */
+                 long Siz)                     /* how many chars ? */
+{
+       size_t wlen;
+       int i;
+       static char *forder = FORDER;
+       char *buf;
+
+       /*
+        * Check for valid message format
+        */
+       if (is_valid_message(msg) == 0) {
+               lprintf(CTDL_ERR, "dump_message() aborting due to invalid message\n");
+               return;
+       }
+
+       buf = (char*) malloc (Siz + 1);
+
+       wlen = 3;
+       
+       for (i=0; i<26; ++i) if (msg->cm_fields[(int)forder[i]] != NULL) {
+                       snprintf (buf, Siz, " msg[%c] = %s ...\n", (char) forder[i], 
+                                  msg->cm_fields[(int)forder[i]]);
+                       client_write (buf, strlen(buf));
+               }
+
+       return;
+}
+
+
 
 /*
  * Check to see if any messages already exist in the current room which
@@ -2583,7 +2622,7 @@ long CtdlSubmitMsg(struct CtdlMessage *msg,       /* message to save */
                        MailboxName(actual_rm, sizeof actual_rm, &userbuf, MAILROOM);
                        CtdlSaveMsgPointerInRoom(actual_rm, newmsgid, 0, msg);
                        BumpNewMailCounter(userbuf.usernum);
-                       if (!IsEmptyStr(config.c_funambol_host)) {
+                       if (!IsEmptyStr(config.c_funambol_host) || !IsEmptyStr(config.c_pager_program)) {
                        /* Generate a instruction message for the Funambol notification
                         * server, in the same style as the SMTP queue
                         */
@@ -2819,7 +2858,8 @@ char *CtdlReadMessageBody(char *terminator,       /* token signalling EOT */
                        size_t maxlen,          /* maximum message length */
                        char *exist,            /* if non-null, append to it;
                                                   exist is ALWAYS freed  */
-                       int crlf                /* CRLF newlines instead of LF */
+                       int crlf,               /* CRLF newlines instead of LF */
+                       int sock                /* socket handle or 0 for this session's client socket */
                        ) {
        char buf[1024];
        int linelen;
@@ -2859,7 +2899,12 @@ char *CtdlReadMessageBody(char *terminator,      /* token signalling EOT */
 
        /* read in the lines of message text one by one */
        do {
-               if (client_getln(buf, (sizeof buf - 3)) < 1) finished = 1;
+               if (sock > 0) {
+                       if (sock_getln(sock, buf, (sizeof buf - 3)) < 0) finished = 1;
+               }
+               else {
+                       if (client_getln(buf, (sizeof buf - 3)) < 1) finished = 1;
+               }
                if (!strcmp(buf, terminator)) finished = 1;
                if (crlf) {
                        strcat(buf, "\r\n");
@@ -3029,7 +3074,7 @@ struct CtdlMessage *CtdlMakeMessage(
                msg->cm_fields['M'] = preformatted_text;
        }
        else {
-               msg->cm_fields['M'] = CtdlReadMessageBody("000", config.c_maxmsglen, NULL, 0);
+               msg->cm_fields['M'] = CtdlReadMessageBody("000", config.c_maxmsglen, NULL, 0, 0);
        }
 
        return(msg);
@@ -3180,6 +3225,7 @@ struct recptypes *validate_recipients(char *supplied_recipients) {
                mailtype = alias(this_recp);
                mailtype = alias(this_recp);
                mailtype = alias(this_recp);
+               j = 0;
                for (j=0; !IsEmptyStr(&this_recp[j]); ++j) {
                        if (this_recp[j]=='_') {
                                this_recp_cooked[j] = ' ';
@@ -3188,6 +3234,7 @@ struct recptypes *validate_recipients(char *supplied_recipients) {
                                this_recp_cooked[j] = this_recp[j];
                        }
                }
+               this_recp_cooked[j] = '\0';
                invalid = 0;
                switch(mailtype) {
                        case MES_LOCAL: