RFC 3676 establishes two parameters (Format and DelSP) to be used with
the Text/Plain media type. In the presence of these parameters, trailing
whitespace is used to indicate flowed lines and a canonical quote
indicator is used to indicate quoted lines.
mailinfo now unfolds, unquotes, and un-space-stuffs such messages.
Signed-off-by: Jay Soffian <jaysoffian@gmail.com>
---
It's been a while since I hacked C, so mucho scrutiny appreciated. The
mailinfo testsuite still passes, and this patch is followed by one which
adds a new test for this code, which also passes.
This is based off next, but mailinfo hasn't changed in a while, so it should apply cleanly to master (didn't test that though).
builtin-mailinfo.c | 40 ++++++++++++++++++++++++++++++++++++++++
1 files changed, 40 insertions(+), 0 deletions(-)
diff --git a/builtin-mailinfo.c b/builtin-mailinfo.c
index 2600847..deaf92b 100644
--- a/builtin-mailinfo.c
+++ b/builtin-mailinfo.c
@@ -20,6 +20,13 @@ static enum {
static enum {
TYPE_TEXT, TYPE_OTHER,
} message_type;
+/* RFC 3676 Text/Plain Format and DelSp Parameters */
+static enum {
+ FORMAT_NONE, FORMAT_FIXED, FORMAT_FLOWED,
+} tp_format;
+static enum {
+ DELSP_NONE, DELSP_YES, DELSP_NO,
+} tp_delsp;
static char charset[256];
static int patch_lines;
@@ -193,6 +200,18 @@ static int handle_content_type(char *line)
if (strcasestr(line, "text/") == NULL)
message_type = TYPE_OTHER;
+ else if (strcasestr(line, "text/plain")) {
+ char attr[256];
+ if (slurp_attr(line, "format=", attr) && !strcasecmp(attr, "flowed")) {
+ tp_format = FORMAT_FLOWED;
+ if (slurp_attr(line, "delsp=", attr) && !strcasecmp(attr, "yes"))
+ tp_delsp = DELSP_YES;
+ else
+ tp_delsp = DELSP_NO;
+ }
+ else
+ tp_format = FORMAT_FIXED;
+ }
if (slurp_attr(line, "boundary=", boundary + 2)) {
memcpy(boundary, "--", 2);
if (content_top++ >= &content[MAX_BOUNDARIES]) {
@@ -681,6 +700,8 @@ again:
transfer_encoding = TE_DONTCARE;
charset[0] = 0;
message_type = TYPE_TEXT;
+ tp_format = FORMAT_NONE;
+ tp_delsp = DELSP_NONE;
/* slurp in this section's info */
while (read_one_header_line(line, sizeof(line), fin))
@@ -770,6 +791,24 @@ static int handle_filter(char *line, unsigned linesize)
{
static int filter = 0;
+ if (tp_format == FORMAT_FLOWED && !!strcmp(line, "-- \n")) {
+ char *cp = line;
+ while (*cp == '>' && *cp != 0)
+ cp++;
+ if (*cp == ' ')
+ cp++;
+ line = cp;
+ if (!!strcmp(line, "-- \n")) {
+ while (*cp != '\n' && *cp !=0)
+ cp++;
+ if (cp > line && *cp == '\n' && *(cp-1) == ' ') {
+ if (tp_delsp == DELSP_YES)
+ *(cp-1) = '\0';
+ else
+ *cp = '\0';
+ }
+ }
+ }
/* filter tells us which part we left off on
* a non-zero return indicates we hit a filter point
*/
@@ -818,6 +857,7 @@ static void handle_body(void)
switch (transfer_encoding) {
case TE_BASE64:
+ case TE_QP:
{
char *op = line;
--
1.5.4.1.1281.g75df
-
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html| James Bottomley | Re: Integration of SCST in the mainstream Linux kernel |
| Greg Kroah-Hartman | [PATCH 005/196] Chinese: add translation of SubmittingDrivers |
| majkls | sys_chroot+sys_fchdir Fix |
| Paul Mackerras | Re: [linux-pm] [PATCH] Remove process freezer from suspend to RAM pathway |
git: | |
| Jarek Poplawski | [PATCH] pkt_sched: Destroy gen estimators under rtnl_lock(). |
| David Miller | [GIT]: Networking |
| KOSAKI Motohiro | [bug?] tg3: Failed to load firmware "tigon/tg3_tso.bin" |
