]> code.citadel.org Git - citadel.git/blobdiff - citadel/msgbase.c
* Coded up some more of the SMTP-sender (still not done)
[citadel.git] / citadel / msgbase.c
index 062d1a80ad6edb9d4def275bc16000068f203c55..bd118964f741f912a60181c0f9eae0fb34491fac 100644 (file)
@@ -545,46 +545,6 @@ void list_this_part(char *name, char *filename, char *partnum, char *disp,
 }
 
 
-/*
- * Callback function for mime parser that wants to display text
- */
-void fixed_output(char *name, char *filename, char *partnum, char *disp,
-                 void *content, char *cbtype, size_t length)
-{
-       char *ptr;
-
-       if (!strcasecmp(cbtype, "multipart/alternative")) {
-               strcpy(ma->prefix, partnum);
-               strcat(ma->prefix, ".");
-               ma->is_ma = 1;
-               ma->did_print = 0;
-               return;
-       }
-
-       if ( (!strncasecmp(partnum, ma->prefix, strlen(ma->prefix)))
-          && (ma->is_ma == 1) 
-          && (ma->did_print == 1) ) {
-               lprintf(9, "Skipping part %s (%s)\n", partnum, cbtype);
-               return;
-       }
-
-       ma->did_print = 1;
-
-       if (!strcasecmp(cbtype, "text/plain")) {
-               client_write(content, length);
-       }
-       else if (!strcasecmp(cbtype, "text/html")) {
-               ptr = html_to_ascii(content, 80, 0);
-               client_write(ptr, strlen(ptr));
-               phree(ptr);
-       }
-       else if (strncasecmp(cbtype, "multipart/", 10)) {
-               cprintf("Part %s: %s (%s) (%d bytes)\n",
-                       partnum, filename, cbtype, length);
-       }
-}
-
-
 /*
  * Callback function for mime parser that opens a section for downloading
  */
@@ -728,7 +688,8 @@ int CtdlOutputMsg(long msg_num,             /* message number (local) to fetch */
                int headers_only,       /* eschew the message body? */
                int do_proto,           /* do Citadel protocol responses? */
                FILE *outfp,
-               int outsock
+               int outsock,
+               int crlf                /* Use CRLF newlines instead of LF? */
 ) {
        int a, i, k;
        char buf[1024];
@@ -738,6 +699,7 @@ int CtdlOutputMsg(long msg_num,             /* message number (local) to fetch */
        char display_name[256];
        struct CtdlMessage *TheMessage;
        char *mptr;
+       char *nl;       /* newline string */
 
        /* buffers needed for RFC822 translation */
        char suser[256];
@@ -792,7 +754,7 @@ FMTA:               ch = *mptr++;
                if (((ch == 13) || (ch == 10)) && (old != 13) && (old != 10))
                        ch = 32;
                if (((old == 13) || (old == 10)) && (isspace(real))) {
-                       omprintf("\n");
+                       omprintf("%s", nl);
                        c = 1;
                }
                if (ch > 126)
@@ -800,7 +762,7 @@ FMTA:               ch = *mptr++;
        
                if (ch > 32) {
                        if (((strlen(aaa) + c) > (75)) && (strlen(aaa) > (75))) {
-                               omprintf("\n%s", aaa);
+                               omprintf("%s%s", nl, aaa);
                                c = strlen(aaa);
                                aaa[0] = 0;
                        }
@@ -810,7 +772,7 @@ FMTA:               ch = *mptr++;
                }
                if (ch == 32) {
                        if ((strlen(aaa) + c) > (75)) {
-                               omprintf("\n");
+                               omprintf("%s", nl);
                                c = 1;
                        }
                        omprintf("%s ", aaa);
@@ -820,19 +782,77 @@ FMTA:             ch = *mptr++;
                        goto FMTA;
                }
                if ((ch == 13) || (ch == 10)) {
-                       omprintf("%s\n", aaa);
+                       omprintf("%s%s", aaa, nl);
                        c = 1;
                        strcpy(aaa, "");
                        goto FMTA;
                }
                goto FMTA;
 
-FMTEND:                omprintf("%s\n", aaa);
+FMTEND:                omprintf("%s%s", aaa, nl);
        }
        /* END NESTED FUNCTION omfmout() */
 
+       /* BEGIN NESTED FUNCTION fixed_output() */
+       /*
+       * Callback function for mime parser that wants to display text
+       */
+       void fixed_output(char *name, char *filename, char *partnum, char *disp,
+                       void *content, char *cbtype, size_t length)
+       {
+               char *ptr;
+               char *wptr;
+               size_t wlen;
+       
+               if (!strcasecmp(cbtype, "multipart/alternative")) {
+                       strcpy(ma->prefix, partnum);
+                       strcat(ma->prefix, ".");
+                       ma->is_ma = 1;
+                       ma->did_print = 0;
+                       return;
+               }
+       
+               if ( (!strncasecmp(partnum, ma->prefix, strlen(ma->prefix)))
+               && (ma->is_ma == 1) 
+               && (ma->did_print == 1) ) {
+                       lprintf(9, "Skipping part %s (%s)\n", partnum, cbtype);
+                       return;
+               }
+       
+               ma->did_print = 1;
+       
+               if (!strcasecmp(cbtype, "text/plain")) {
+                       wlen = length;
+                       wptr = content;
+                       while (wlen--) {
+                               ch = *wptr++;
+                               if (ch==10) omprintf("%s", nl);
+                               else omprintf("%c", ch);
+                       }
+               }
+               else if (!strcasecmp(cbtype, "text/html")) {
+                       ptr = html_to_ascii(content, 80, 0);
+                       wlen = strlen(ptr);
+                       wptr = ptr;
+                       while (wlen--) {
+                               ch = *wptr++;
+                               if (ch==10) omprintf("%s", nl);
+                               else omprintf("%c", ch);
+                       }
+                       phree(ptr);
+               }
+               else if (strncasecmp(cbtype, "multipart/", 10)) {
+                       omprintf("Part %s: %s (%s) (%d bytes)%s",
+                               partnum, filename, cbtype, length, nl);
+               }
+       }
+
+       /* END NESTED FUNCTION fixed_output() */
+
+
        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",
@@ -970,7 +990,7 @@ FMTEND:             omprintf("%s\n", aaa);
                                if (i == 'A') {
                                        strcpy(luser, mptr);
                                } else if (i == 'P') {
-                                       omprintf("Path: %s\n", mptr);
+                                       omprintf("Path: %s%s", mptr, nl);
                                        for (a = 0; a < strlen(mptr); ++a) {
                                                if (mptr[a] == '!') {
                                                        strcpy(mptr, &mptr[a + 1]);
@@ -979,17 +999,18 @@ FMTEND:           omprintf("%s\n", aaa);
                                        }
                                        strcpy(suser, mptr);
                                } else if (i == 'U')
-                                       omprintf("Subject: %s\n", mptr);
+                                       omprintf("Subject: %s%s", mptr, nl);
                                else if (i == 'I')
                                        strcpy(mid, mptr);
                                else if (i == 'H')
                                        strcpy(lnode, mptr);
                                else if (i == 'O')
-                                       omprintf("X-Citadel-Room: %s\n", mptr);
+                                       omprintf("X-Citadel-Room: %s%s",
+                                               mptr, nl);
                                else if (i == 'N')
                                        strcpy(snode, mptr);
                                else if (i == 'R')
-                                       omprintf("To: %s\n", mptr);
+                                       omprintf("To: %s%s", mptr, nl);
                                else if (i == 'T') {
                                        xtime = atol(mptr);
                                        omprintf("Date: %s", asctime(localtime(&xtime)));
@@ -1002,10 +1023,10 @@ FMTEND:         omprintf("%s\n", aaa);
                if (!strcasecmp(snode, NODENAME)) {
                        strcpy(snode, FQDN);
                }
-               omprintf("Message-ID: <%s@%s>\n", mid, snode);
+               omprintf("Message-ID: <%s@%s>%s", mid, snode, nl);
                PerformUserHooks(luser, (-1L), EVT_OUTPUTMSG);
-               omprintf("From: %s@%s (%s)\n", suser, snode, luser);
-               omprintf("Organization: %s\n", lnode);
+               omprintf("From: %s@%s (%s)%s", suser, snode, luser, nl);
+               omprintf("Organization: %s%s", lnode, nl);
        }
 
        /* end header processing loop ... at this point, we're in the text */
@@ -1034,8 +1055,10 @@ FMTEND:          omprintf("%s\n", aaa);
        /* signify start of msg text */
        if (mode == MT_CITADEL)
                if (do_proto) cprintf("text\n");
-       if ((mode == MT_RFC822) && (TheMessage->cm_format_type != FMT_RFC822))
-               omprintf("\n");
+       /* if ((mode == MT_RFC822) && (TheMessage->cm_format_type != FMT_RFC822)) { */
+       if (mode == MT_RFC822) {
+               omprintf("%s", nl);
+       }
 
        /* If the format type on disk is 1 (fixed-format), then we want
         * everything to be output completely literally ... regardless of
@@ -1047,7 +1070,7 @@ FMTEND:           omprintf("%s\n", aaa);
                        if (ch == 13)
                                ch = 10;
                        if ((ch == 10) || (strlen(buf) > 250)) {
-                               omprintf("%s\n", buf);
+                               omprintf("%s%s", buf, nl);
                                strcpy(buf, "");
                        } else {
                                buf[strlen(buf) + 1] = 0;
@@ -1055,7 +1078,7 @@ FMTEND:           omprintf("%s\n", aaa);
                        }
                }
                if (strlen(buf) > 0)
-                       omprintf("%s\n", buf);
+                       omprintf("%s%s", buf, nl);
        }
 
        /* If the message on disk is format 0 (Citadel vari-format), we
@@ -1099,7 +1122,7 @@ void cmd_msg0(char *cmdbuf)
        msgid = extract_long(cmdbuf, 0);
        headers_only = extract_int(cmdbuf, 1);
 
-       CtdlOutputMsg(msgid, MT_CITADEL, headers_only, 1, NULL, -1);
+       CtdlOutputMsg(msgid, MT_CITADEL, headers_only, 1, NULL, -1, 0);
        return;
 }
 
@@ -1115,7 +1138,7 @@ void cmd_msg2(char *cmdbuf)
        msgid = extract_long(cmdbuf, 0);
        headers_only = extract_int(cmdbuf, 1);
 
-       CtdlOutputMsg(msgid, MT_RFC822, headers_only, 1, NULL, -1);
+       CtdlOutputMsg(msgid, MT_RFC822, headers_only, 1, NULL, -1, 1);
 }
 
 
@@ -1167,7 +1190,7 @@ void cmd_msg4(char *cmdbuf)
        long msgid;
 
        msgid = extract_long(cmdbuf, 0);
-       CtdlOutputMsg(msgid, MT_MIME, 0, 1, NULL, -1);
+       CtdlOutputMsg(msgid, MT_MIME, 0, 1, NULL, -1, 0);
 }
 
 /*
@@ -1182,7 +1205,7 @@ void cmd_opna(char *cmdbuf)
        msgid = extract_long(cmdbuf, 0);
        extract(desired_section, cmdbuf, 1);
 
-       CtdlOutputMsg(msgid, MT_DOWNLOAD, 0, 1, NULL, -1);
+       CtdlOutputMsg(msgid, MT_DOWNLOAD, 0, 1, NULL, -1, 1);
 }                      
 
 
@@ -1506,6 +1529,8 @@ long CtdlSaveMsg(struct CtdlMessage *msg, /* message to save */
        struct SuppMsgInfo smi;
        FILE *network_fp = NULL;
        static int seqnum = 1;
+       struct CtdlMessage *imsg;
+       char *instr;
 
        lprintf(9, "CtdlSaveMsg() called\n");
        if (is_valid_message(msg) == 0) return(-1);     /* self check */
@@ -1655,10 +1680,25 @@ long CtdlSaveMsg(struct CtdlMessage *msg,       /* message to save */
        }
 
        /* For internet mail, drop a copy in the outbound queue room */
-       /* FIX  ...  nothing's going to get delivered until we add
-          some delivery instructions!!! */
        if (mailtype == MES_INTERNET) {
                CtdlSaveMsgPointerInRoom(SMTP_SPOOLOUT_ROOM, newmsgid, 0);
+
+               /* And generate delivery instructions */
+               lprintf(9, "Generating delivery instructions\n");
+               instr = mallok(2048);
+               sprintf(instr,
+                       "Content-type: %s\n\nmsgid|%ld\nsubmitted|%ld\n"
+                       "remote|%s|0||\n",
+                       SPOOLMIME, newmsgid, time(NULL), recipient );
+
+               imsg = mallok(sizeof(struct CtdlMessage));
+               memset(imsg, 0, sizeof(struct CtdlMessage));
+               imsg->cm_magic = CTDLMESSAGE_MAGIC;
+               imsg->cm_anon_type = MES_NORMAL;
+               imsg->cm_format_type = FMT_RFC822;
+               imsg->cm_fields['M'] = instr;
+               CtdlSaveMsg(imsg, "", SMTP_SPOOLOUT_ROOM, MES_LOCAL, 1);
+               CtdlFreeMessage(imsg);
        }
 
        /* Bump this user's messages posted counter. */