From 3f8b9ae7c5a4e84e70e7b0073af9600274005e8d Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Mon, 17 Jan 2000 20:57:43 +0000 Subject: [PATCH] * CR to CRLF hacks (lose, lose, lose) --- citadel/ChangeLog | 4 ++- citadel/msgbase.c | 60 +++++++++++++++++++++++++++------------------ citadel/msgbase.h | 4 +-- citadel/serv_pop3.c | 10 +++++--- 4 files changed, 48 insertions(+), 30 deletions(-) diff --git a/citadel/ChangeLog b/citadel/ChangeLog index 8ed2ad072..2561a507b 100644 --- a/citadel/ChangeLog +++ b/citadel/ChangeLog @@ -1,4 +1,7 @@ $Log$ +Revision 1.448 2000/01/17 20:57:43 ajc +* CR to CRLF hacks (lose, lose, lose) + Revision 1.447 2000/01/17 18:30:27 ajc * Completed POP3 server. All RFC1939 commands except APOP are implemented. @@ -1569,4 +1572,3 @@ Sat Jul 11 00:20:48 EDT 1998 Nathan Bryant Fri Jul 10 1998 Art Cancro * Initial CVS import - diff --git a/citadel/msgbase.c b/citadel/msgbase.c index b82004f93..f4513c6f7 100644 --- a/citadel/msgbase.c +++ b/citadel/msgbase.c @@ -688,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]; @@ -698,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]; @@ -752,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) @@ -760,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; } @@ -770,7 +772,7 @@ FMTA: ch = *mptr++; } if (ch == 32) { if ((strlen(aaa) + c) > (75)) { - omprintf("\n"); + omprintf("%s", nl); c = 1; } omprintf("%s ", aaa); @@ -780,14 +782,14 @@ 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() */ @@ -822,18 +824,26 @@ FMTEND: omprintf("%s\n", aaa); if (!strcasecmp(cbtype, "text/plain")) { wlen = length; wptr = content; - while (wlen--) omprintf("%c", *wptr++); + 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--) omprintf("%c", *wptr++); + 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)\n", - partnum, filename, cbtype, length); + omprintf("Part %s: %s (%s) (%d bytes)%s", + partnum, filename, cbtype, length, nl); } } @@ -842,6 +852,7 @@ FMTEND: omprintf("%s\n", aaa); 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", @@ -979,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]); @@ -988,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))); @@ -1011,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 */ @@ -1045,7 +1057,7 @@ FMTEND: omprintf("%s\n", aaa); if (do_proto) cprintf("text\n"); /* if ((mode == MT_RFC822) && (TheMessage->cm_format_type != FMT_RFC822)) { */ if (mode == MT_RFC822) { - omprintf("\n"); + omprintf("%s", nl); } /* If the format type on disk is 1 (fixed-format), then we want @@ -1058,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; @@ -1066,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 @@ -1110,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; } @@ -1126,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); } @@ -1178,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); } /* @@ -1193,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); } diff --git a/citadel/msgbase.h b/citadel/msgbase.h index d9a5cf325..9e55685b5 100644 --- a/citadel/msgbase.h +++ b/citadel/msgbase.h @@ -89,5 +89,5 @@ 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); diff --git a/citadel/serv_pop3.c b/citadel/serv_pop3.c index 52578a3f6..a415ee29f 100644 --- a/citadel/serv_pop3.c +++ b/citadel/serv_pop3.c @@ -118,7 +118,7 @@ void pop3_add_message(long msgnum) { POP3->msgs[POP3->num_msgs-1].deleted = 0; fp = tmpfile(); POP3->msgs[POP3->num_msgs-1].temp = fp; - CtdlOutputMsg(msgnum, MT_RFC822, 0, 0, fp, 0); + CtdlOutputMsg(msgnum, MT_RFC822, 0, 0, fp, 0, 1); POP3->msgs[POP3->num_msgs-1].rfc822_length = ftell(fp); } @@ -268,6 +268,7 @@ void pop3_top(char *argbuf) { char buf[1024]; char *ptr; int in_body = 0; + int done = 0; sscanf(argbuf, "%d %d", &which_one, &lines_requested); if ( (which_one < 1) || (which_one > POP3->num_msgs) ) { @@ -283,8 +284,11 @@ void pop3_top(char *argbuf) { cprintf("+OK Whoop, there it is:\r\n"); rewind(POP3->msgs[which_one - 1].temp); while (ptr = fgets(buf, sizeof buf, POP3->msgs[which_one - 1].temp), - ( (ptr!=NULL) && (lines_dumped < lines_requested) ) ) { - client_write(buf, strlen(buf)); + ( (ptr!=NULL) && (done == 0))) { + if (in_body == 1) + if (lines_dumped >= lines_requested) done = 1; + if ((in_body == 0) || (done == 0)) + client_write(buf, strlen(buf)); if (in_body) ++lines_dumped; if ((buf[0]==13)||(buf[0]==10)) in_body = 1; } -- 2.39.2