X-Git-Url: https://www.fleuret.org/cgi-bin/gitweb/gitweb.cgi?p=mymail.git;a=blobdiff_plain;f=mymail.c;h=bac2f45ebb0ad3fa1bd7b71451933c624a756fd4;hp=a77e5e2b503488395304f862fa90287ebe71131d;hb=cbe29e579b66cf31ec64c142286e7e2b865d84d7;hpb=e2794d56046669841db12c418620a8fa062e13ad diff --git a/mymail.c b/mymail.c index a77e5e2..bac2f45 100644 --- a/mymail.c +++ b/mymail.c @@ -55,18 +55,11 @@ regex_t leading_from_line_regexp; -char *db_filename; -char *db_filename_regexp_string; -char *db_root_path; -char *db_filename_list; -char output_filename[PATH_MAX + 1]; +/* Global variables! */ int paranoid; -int action_index; int quiet; -time_t being_today; - /********************************************************************/ enum { @@ -217,6 +210,18 @@ void print_usage(FILE *out) { /*********************************************************************/ +time_t time_for_past_day(int day) { + time_t t; + struct tm *tm; + int delta_day; + t = time(0); + tm = localtime(&t); + delta_day = (7 + tm->tm_wday - day) % 7 + 1; + return t - delta_day * 3600 * 24 + tm->tm_sec + 60 * tm->tm_min + 3600 * tm->tm_hour; +} + +/*********************************************************************/ + int ignore_entry(const char *name) { return /* strcmp(name, ".") == 0 || */ @@ -270,6 +275,58 @@ int mbox_line_match_search(struct search_condition *condition, } } +void update_body_hits(char *mail_filename, int position_in_mail, + int nb_search_conditions, struct search_condition *search_conditions, + int nb_body_conditions, + int *hits) { + FILE *mail_file; + int header, n; + int last_mbox_line_was_empty; + char raw_mbox_line[BUFFER_SIZE]; + int nb_body_hits; + + nb_body_hits = 0; + + header = 1; + mail_file = fopen(mail_filename, "r"); + + if(!mail_file) { + fprintf(stderr, + "mymail: Cannot open mbox '%s' for body scan.\n", + mail_filename); + exit(EXIT_FAILURE); + } + + fseek(mail_file, position_in_mail, SEEK_SET); + + if(fgets(raw_mbox_line, BUFFER_SIZE, mail_file)) { + while(nb_body_hits < nb_body_conditions) { + last_mbox_line_was_empty = (raw_mbox_line[0] == '\n'); + + if(last_mbox_line_was_empty) { header = 0; } + + if(!header) { + for(n = 0; n < nb_search_conditions; n++) { + if(search_conditions[n].field_id == ID_BODY && !hits[n]) { + hits[n] = + (regexec(&search_conditions[n].regexp, raw_mbox_line, 0, 0, 0) == 0); + if(hits[n]) { + nb_body_hits++; + } + } + } + } + + if(!fgets(raw_mbox_line, BUFFER_SIZE, mail_file) || + (last_mbox_line_was_empty && + is_a_leading_from_line(raw_mbox_line))) + break; + } + } + + fclose(mail_file); +} + void search_in_db(const char *db_filename, int nb_search_conditions, struct search_condition *search_conditions, @@ -287,6 +344,11 @@ void search_in_db(const char *db_filename, int nb_body_conditions, nb_fulfilled_body_conditions; FILE *db_file; + if(!quiet) { + printf("Searching in '%s' ... ", db_filename); + fflush(stdout); + } + db_file = fopen(db_filename, "r"); if(!db_file) { @@ -344,50 +406,20 @@ void search_in_db(const char *db_filename, /* all conditions but the body ones are fine, check the body ones */ - nb_fulfilled_body_conditions = 0; - if(nb_body_conditions > 0) { - FILE *mail_file; - int header; - - header = 1; - mail_file = fopen(current_mail_filename, "r"); - - if(!mail_file) { - fprintf(stderr, - "mymail: Cannot open mbox '%s' for body scan.\n", - current_mail_filename); - exit(EXIT_FAILURE); - } - - fseek(mail_file, current_position_in_mail, SEEK_SET); - - if(fgets(raw_mbox_line, BUFFER_SIZE, mail_file)) { - while(nb_fulfilled_body_conditions < nb_body_conditions) { - last_mbox_line_was_empty = (raw_mbox_line[0] == '\n'); - - if(last_mbox_line_was_empty) { header = 0; } + update_body_hits(current_mail_filename, current_position_in_mail, + nb_search_conditions, search_conditions, + nb_body_conditions, + hits); + } - if(!header) { - for(n = 0; n < nb_search_conditions; n++) { - if(search_conditions[n].field_id == ID_BODY && !hits[n]) { - hits[n] = - (regexec(&search_conditions[n].regexp, raw_mbox_line, 0, 0, 0) == 0); - if(hits[n]) { - nb_fulfilled_body_conditions++; - } - } - } - } + nb_fulfilled_body_conditions = 0; - if(!fgets(raw_mbox_line, BUFFER_SIZE, mail_file) || - (last_mbox_line_was_empty && - is_a_leading_from_line(raw_mbox_line))) - break; - } + for(n = 0; n < nb_search_conditions; n++) { + if(search_conditions[n].field_id == ID_BODY && + xor(hits[n], search_conditions[n].negation)) { + nb_fulfilled_body_conditions++; } - - fclose(mail_file); } if(nb_body_conditions == nb_fulfilled_body_conditions) { @@ -447,6 +479,11 @@ void search_in_db(const char *db_filename, } fclose(db_file); + + if(!quiet) { + printf("done.\n"); + fflush(stdout); + } } void recursive_search_in_db(const char *entry_name, regex_t *db_filename_regexp, @@ -485,18 +522,7 @@ void recursive_search_in_db(const char *entry_name, regex_t *db_filename_regexp, while(*s) { if(*s == '/') { filename = s+1; } s++; } if(regexec(db_filename_regexp, filename, 0, 0, 0) == 0) { - - if(!quiet) { - printf("Searching in '%s' ... ", entry_name); - fflush(stdout); - } - search_in_db(entry_name, nb_search_conditions, search_conditions, output_file); - - if(!quiet) { - printf("done.\n"); - fflush(stdout); - } } } } @@ -676,12 +702,16 @@ void init_condition(struct search_condition *condition, char *string) { condition->negation = 0; } - if(strcmp(search_field, "6h") == 0) { + /* Last 8 hours */ + + if(strcmp(search_field, "8h") == 0) { condition->field_id = ID_INTERVAL; - condition->interval_start = time(0) - 3600 * 6; + condition->interval_start = time(0) - 3600 * 8; condition->interval_stop = 0; } + /* Today and yesterday */ + else if(strcmp(search_field, "24h") == 0 || strcmp(search_field, "today") == 0) { condition->field_id = ID_INTERVAL; @@ -692,7 +722,51 @@ void init_condition(struct search_condition *condition, char *string) { else if(strcmp(search_field, "yesterday") == 0) { condition->field_id = ID_INTERVAL; condition->interval_start = time(0) - 2 * 3600 * 24; - condition->interval_stop = time(0) - 3600 * 24; + condition->interval_stop = condition->interval_start + 3600 * 24; + } + + /* Week days */ + + else if(strcmp(search_field, "monday") == 0) { + condition->field_id = ID_INTERVAL; + condition->interval_start = time_for_past_day(1); + condition->interval_stop = condition->interval_start + 3600 * 24; + } + + else if(strcmp(search_field, "tuesday") == 0) { + condition->field_id = ID_INTERVAL; + condition->interval_start = time_for_past_day(2); + condition->interval_stop = condition->interval_start + 3600 * 24; + } + + else if(strcmp(search_field, "wednesday") == 0) { + condition->field_id = ID_INTERVAL; + condition->interval_start = time_for_past_day(3); + condition->interval_stop = condition->interval_start + 3600 * 24; + } + + else if(strcmp(search_field, "thursday") == 0) { + condition->field_id = ID_INTERVAL; + condition->interval_start = time_for_past_day(4); + condition->interval_stop = condition->interval_start + 3600 * 24; + } + + else if(strcmp(search_field, "friday") == 0) { + condition->field_id = ID_INTERVAL; + condition->interval_start = time_for_past_day(5); + condition->interval_stop = condition->interval_start + 3600 * 24; + } + + else if(strcmp(search_field, "saturday") == 0) { + condition->field_id = ID_INTERVAL; + condition->interval_start = time_for_past_day(6); + condition->interval_stop = condition->interval_start + 3600 * 24; + } + + else if(strcmp(search_field, "sunday") == 0) { + condition->field_id = ID_INTERVAL; + condition->interval_start = time_for_past_day(7); + condition->interval_stop = condition->interval_start + 3600 * 24; } else { @@ -734,6 +808,13 @@ void free_condition(struct search_condition *condition) { /*********************************************************************/ int main(int argc, char **argv) { + char *db_filename; + char *db_filename_regexp_string; + char *db_root_path; + char *db_filename_list; + char output_filename[PATH_MAX + 1]; + int action_index; + int error = 0, show_help = 0; const int nb_fields_to_parse = sizeof(fields_to_parse) / sizeof(struct parsable_field); char c; @@ -743,7 +824,7 @@ int main(int argc, char **argv) { struct search_condition search_conditions[MAX_NB_SEARCH_CONDITIONS]; if(regcomp(&leading_from_line_regexp, - "^From [^ ]*@[^ ]* \\(Mon\\|Tue\\|Wed\\|Thu\\|Fri\\|Sat\\|Sun\\) \\(Jan\\|Feb\\|Mar\\|Apr\\|Jun\\|Jul\\|Aug\\|Sep\\|Oct\\|Nov\\|Dec\\) [ 123][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9] [0-9][0-9][0-9][0-9]\n$", + "^From [^ ]* \\(Mon\\|Tue\\|Wed\\|Thu\\|Fri\\|Sat\\|Sun\\) \\(Jan\\|Feb\\|Mar\\|Apr\\|May\\|Jun\\|Jul\\|Aug\\|Sep\\|Oct\\|Nov\\|Dec\\) [ 123][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9] [0-9][0-9][0-9][0-9]\n$", 0)) { fprintf(stderr, "mymail: Cannot compile leading \"from\" line regexp. That is strange.\n");