X-Git-Url: https://www.fleuret.org/cgi-bin/gitweb/gitweb.cgi?p=mymail.git;a=blobdiff_plain;f=mymail.c;h=ffc562145f6ef7bf69bf4d8cdc4b50610987481b;hp=5d16bb3b31f8e18f610a1a7b2df11eb3c95adcaf;hb=c2a75b190fced9a626a70fb2886889ce0e231af7;hpb=ed9a958f95d7436aa585bc57a5e4761e8120be02 diff --git a/mymail.c b/mymail.c index 5d16bb3..ffc5621 100644 --- a/mymail.c +++ b/mymail.c @@ -101,6 +101,7 @@ struct search_condition { struct parsable_field { int id; + int cflags; char *regexp_string; regex_t regexp; }; @@ -108,31 +109,36 @@ struct parsable_field { static struct parsable_field fields_to_parse[] = { { ID_LEADING_LINE, + 0, "^From ", { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, { ID_FROM, - "^\\([Ff][Rr][Oo][Mm]:\\|[Rr][Ee][Pp][Ll][Yy]-[Tt][Oo]:\\|[Ss][Ee][Nn][Dd][Ee][Rr]:\\)", + REG_ICASE, + "^\\(from\\|reply-to\\|sender\\|return-path\\): ", { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, { ID_TO, - "^\\([Tt][Oo]\\|[Cc][Cc]\\|[Bb][Cc][Cc]\\): ", + REG_ICASE, + "^\\(to\\|cc\\|bcc\\): ", { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, { ID_SUBJECT, - "^[Ss][Uu][Bb][Jj][Ee][Cc][Tt]: ", + REG_ICASE, + "^subject: ", { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, { ID_DATE, - "^[Dd][Aa][Tt][Ee]: ", + REG_ICASE, + "^date: ", { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, @@ -232,9 +238,22 @@ int ignore_entry(const char *name) { (name[0] == '.' && name[1] != '/'); } -int is_a_leading_from_line(char *s) { - return strncmp(s, "From ", 5) == 0 && - regexec(&leading_from_line_regexp, s, 0, 0, 0) == 0; +int is_a_leading_from_line(int last_mbox_line_was_empty, char *mbox_line) { + return + + /* + + The mbox man page in qmail documentation states: + + > The reader should not attempt to take advantage of the fact + > that every From_ line (past the beginning of the file) is + > preceded by a blank line. + + */ + + /* last_mbox_line_was_empty && */ + strncmp(mbox_line, "From ", 5) == 0 && + regexec(&leading_from_line_regexp, mbox_line, 0, 0, 0) == 0; } int mbox_line_match_search(struct search_condition *condition, @@ -273,7 +292,9 @@ int mbox_line_match_search(struct search_condition *condition, (condition->field_id == ID_FROM && mbox_id == ID_LEADING_LINE) ) + && + regexec(&condition->regexp, mbox_value, 0, 0, 0) == 0; } } @@ -321,8 +342,7 @@ void update_body_hits(char *mail_filename, int position_in_mail, } if(!fgets(raw_mbox_line, BUFFER_SIZE, mail_file) || - (last_mbox_line_was_empty && - is_a_leading_from_line(raw_mbox_line))) + (is_a_leading_from_line(last_mbox_line_was_empty, raw_mbox_line))) break; } } @@ -444,8 +464,7 @@ void search_in_db(const char *db_filename, fprintf(output_file, "%s", raw_mbox_line); while(1) { if(!fgets(raw_mbox_line, BUFFER_SIZE, mail_file) || - (last_mbox_line_was_empty && - is_a_leading_from_line(raw_mbox_line)) + (is_a_leading_from_line(last_mbox_line_was_empty, raw_mbox_line)) ) break; last_mbox_line_was_empty = (raw_mbox_line[0] == '\n'); @@ -571,8 +590,7 @@ void index_mbox(const char *mbox_filename, last_mbox_line_was_empty = 1; while(fgets(raw_mbox_line, BUFFER_SIZE, file)) { - if(last_mbox_line_was_empty && - is_a_leading_from_line(raw_mbox_line)) { + if(is_a_leading_from_line(last_mbox_line_was_empty, raw_mbox_line)) { if(in_header) { fprintf(stderr, "Got a ^\"From \" in the header in %s:%lu.\n", @@ -1012,7 +1030,7 @@ int main(int argc, char **argv) { for(f = 0; f < nb_fields_to_parse; f++) { if(regcomp(&fields_to_parse[f].regexp, fields_to_parse[f].regexp_string, - REG_ICASE)) { + fields_to_parse[f].cflags)) { fprintf(stderr, "mymail: Syntax error in regexp \"%s\" for field \"%s\".\n", fields_to_parse[f].regexp_string,