[PATCH] mailinfo: handle folded header.
Some people split their long E-mail address over two lines using the RFC2822 header "folding". We can lose authorship information this way, so make a minimum effort to deal with it, instead of special casing only the "Subject:" field. We could teach mailsplit to unfold the folded header, but teaching mailinfo about folding would make more sense; a single message can be fed to mailinfo without going through mailsplit. Signed-off-by: Junio C Hamano <junkio@cox.net> Signed-off-by: Linus Torvalds <torvalds@osdl.org>maint
parent
ce6f8e7ec2
commit
1d8fa411e0
|
@ -89,45 +89,14 @@ static void handle_subject(char *line)
|
||||||
strcpy(subject, line);
|
strcpy(subject, line);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void add_subject_line(char *line)
|
|
||||||
{
|
|
||||||
while (isspace(*line))
|
|
||||||
line++;
|
|
||||||
*--line = ' ';
|
|
||||||
strcat(subject, line);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void check_line(char *line, int len)
|
static void check_line(char *line, int len)
|
||||||
{
|
{
|
||||||
static int cont = -1;
|
if (!memcmp(line, "From:", 5) && isspace(line[5]))
|
||||||
if (!memcmp(line, "From:", 5) && isspace(line[5])) {
|
|
||||||
handle_from(line+6);
|
handle_from(line+6);
|
||||||
cont = 0;
|
else if (!memcmp(line, "Date:", 5) && isspace(line[5]))
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!memcmp(line, "Date:", 5) && isspace(line[5])) {
|
|
||||||
handle_date(line+6);
|
handle_date(line+6);
|
||||||
cont = 0;
|
else if (!memcmp(line, "Subject:", 8) && isspace(line[8]))
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!memcmp(line, "Subject:", 8) && isspace(line[8])) {
|
|
||||||
handle_subject(line+9);
|
handle_subject(line+9);
|
||||||
cont = 1;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (isspace(*line)) {
|
|
||||||
switch (cont) {
|
|
||||||
case 0:
|
|
||||||
fprintf(stderr, "I don't do 'Date:' or 'From:' line continuations\n");
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
add_subject_line(line);
|
|
||||||
return;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
cont = -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static char * cleanup_subject(char *subject)
|
static char * cleanup_subject(char *subject)
|
||||||
|
@ -246,9 +215,30 @@ static void handle_body(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int read_one_header_line(char *line, int sz, FILE *in)
|
||||||
|
{
|
||||||
|
int ofs = 0;
|
||||||
|
while (ofs < sz) {
|
||||||
|
int peek, len;
|
||||||
|
if (fgets(line + ofs, sz - ofs, in) == NULL)
|
||||||
|
return ofs;
|
||||||
|
len = eatspace(line + ofs);
|
||||||
|
if (len == 0)
|
||||||
|
return ofs;
|
||||||
|
peek = fgetc(in); ungetc(peek, in);
|
||||||
|
if (peek == ' ' || peek == '\t') {
|
||||||
|
/* Yuck, 2822 header "folding" */
|
||||||
|
ofs += len;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
return ofs + len;
|
||||||
|
}
|
||||||
|
return ofs;
|
||||||
|
}
|
||||||
|
|
||||||
static void usage(void)
|
static void usage(void)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "mailinfo msg-file path-file < email\n");
|
fprintf(stderr, "mailinfo msg-file patch-file < email\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -266,8 +256,8 @@ int main(int argc, char ** argv)
|
||||||
perror(argv[2]);
|
perror(argv[2]);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
while (fgets(line, sizeof(line), stdin) != NULL) {
|
while (1) {
|
||||||
int len = eatspace(line);
|
int len = read_one_header_line(line, sizeof(line), stdin);
|
||||||
if (!len) {
|
if (!len) {
|
||||||
handle_body();
|
handle_body();
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue