]> code.citadel.org Git - citadel.git/blobdiff - citadel/msgbase.c
* More IMAP tweaks
[citadel.git] / citadel / msgbase.c
index b283b749e4bc8152bb0dfb137a571fa696bcd41e..e21bcd22ec6939e5c6edc5fce1e9a11e9a361f96 100644 (file)
@@ -785,31 +785,13 @@ int CtdlOutputMsg(long msg_num,           /* message number (local) to fetch */
                int do_proto,           /* do Citadel protocol responses? */
                int crlf                /* Use CRLF newlines instead of LF? */
 ) {
-       int i, k;
-       char buf[1024];
-       CIT_UBYTE ch;
-       char allkeys[256];
-       char display_name[256];
        struct CtdlMessage *TheMessage;
-       char *mptr;
-       char *nl;       /* newline string */
-
-       /* buffers needed for RFC822 translation */
-       char suser[256];
-       char luser[256];
-       char fuser[256];
-       char snode[256];
-       char lnode[256];
-       char mid[256];
-       char datestamp[256];
-       /*                                       */
+       int retcode;
 
        lprintf(7, "CtdlOutputMsg() msgnum=%ld, mode=%d\n", 
                msg_num, mode);
 
        TheMessage = NULL;
-       sprintf(mid, "%ld", msg_num);
-       nl = (crlf ? "\r\n" : "\n");
 
        if ((!(CC->logged_in)) && (!(CC->internal_pgm))) {
                if (do_proto) cprintf("%d Not logged in.\n",
@@ -839,6 +821,52 @@ int CtdlOutputMsg(long msg_num,            /* message number (local) to fetch */
                        ERROR, msg_num);
                return(om_no_such_msg);
        }
+       
+       retcode = CtdlOutputPreLoadedMsg(
+                       TheMessage, msg_num, mode,
+                       headers_only, do_proto, crlf);
+
+       CtdlFreeMessage(TheMessage);
+       return(retcode);
+}
+
+
+/*
+ * Get a message off disk.  (returns om_* values found in msgbase.h)
+ * 
+ */
+int CtdlOutputPreLoadedMsg(struct CtdlMessage *TheMessage,
+               long msg_num,
+               int mode,               /* how would you like that message? */
+               int headers_only,       /* eschew the message body? */
+               int do_proto,           /* do Citadel protocol responses? */
+               int crlf                /* Use CRLF newlines instead of LF? */
+) {
+       int i, k;
+       char buf[1024];
+       CIT_UBYTE ch;
+       char allkeys[256];
+       char display_name[256];
+       char *mptr;
+       char *nl;       /* newline string */
+
+       /* buffers needed for RFC822 translation */
+       char suser[256];
+       char luser[256];
+       char fuser[256];
+       char snode[256];
+       char lnode[256];
+       char mid[256];
+       char datestamp[256];
+       /*                                       */
+
+       sprintf(mid, "%ld", msg_num);
+       nl = (crlf ? "\r\n" : "\n");
+
+       if (!is_valid_message(TheMessage)) {
+               lprintf(1, "ERROR: invalid preloaded message for output\n");
+               return(om_no_such_msg);
+       }
 
        /* Are we downloading a MIME component? */
        if (mode == MT_DOWNLOAD) {
@@ -864,7 +892,6 @@ int CtdlOutputMsg(long msg_num,             /* message number (local) to fetch */
                                        desired_section);
                        }
                }
-               CtdlFreeMessage(TheMessage);
                return((CC->download_fp != NULL) ? om_ok : om_mime_error);
        }
 
@@ -1016,7 +1043,6 @@ int CtdlOutputMsg(long msg_num,           /* message number (local) to fetch */
                else if (mode == MT_MIME) {     /* list parts only */
                        mime_parser(mptr, NULL, *list_this_part, NULL, 0);
                        if (do_proto) cprintf("000\n");
-                       CtdlFreeMessage(TheMessage);
                        return(om_ok);
                }
                else if (mode == MT_RFC822) {   /* unparsed RFC822 dump */
@@ -1031,14 +1057,12 @@ int CtdlOutputMsg(long msg_num,         /* message number (local) to fetch */
                                else cprintf("%c", ch);
                        }
                        if (do_proto) cprintf("000\n");
-                       CtdlFreeMessage(TheMessage);
                        return(om_ok);
                }
        }
 
        if (headers_only) {
                if (do_proto) cprintf("000\n");
-               CtdlFreeMessage(TheMessage);
                return(om_ok);
        }
 
@@ -1097,7 +1121,6 @@ int CtdlOutputMsg(long msg_num,           /* message number (local) to fetch */
 
        /* now we're done */
        if (do_proto) cprintf("000\n");
-       CtdlFreeMessage(TheMessage);
        return(om_ok);
 }
 
@@ -1598,7 +1621,7 @@ long CtdlSaveMsg(struct CtdlMessage *msg, /* message to save */
                /* advance past header fields */
                mptr = msg->cm_fields['M'];
                a = strlen(mptr);
-               while (--a) {
+               while ((--a) > 0) {
                        if (!strncasecmp(mptr, "Content-type: ", 14)) {
                                safestrncpy(content_type, mptr,
                                            sizeof(content_type));