X-Git-Url: https://fleuret.org/cgi-bin/gitweb/gitweb.cgi?a=blobdiff_plain;f=mymail.c;h=af3ef6c44e9895cc1d3f8388b7b94ecac1b7a2b3;hb=28a390db0115b52f2faa9f0c2746abd2e318105f;hp=3d5efc066e5ae5db1ea5752537801c4b989296fb;hpb=ebdee6d9d900ad41e561502b2a6597433b57f485;p=mymail.git diff --git a/mymail.c b/mymail.c index 3d5efc0..af3ef6c 100644 --- a/mymail.c +++ b/mymail.c @@ -55,9 +55,11 @@ char *db_filename; char *db_filename_regexp_string; char *db_root_path; char *db_filename_list; +char output_filename[PATH_MAX + 1]; int paranoid; int action_index; +int quiet; /********************************************************************/ @@ -173,6 +175,8 @@ void print_usage(FILE *out) { fprintf(out, " show this help\n"); fprintf(out, " -v, --version\n"); fprintf(out, " print the version number\n"); + fprintf(out, " -q, --quiet\n"); + fprintf(out, " do not print information during search\n"); fprintf(out, " -p , --db-pattern \n"); fprintf(out, " set the db filename pattern for recursive search\n"); fprintf(out, " -r , --db-root \n"); @@ -185,6 +189,8 @@ void print_usage(FILE *out) { fprintf(out, " set the db filename for indexing\n"); fprintf(out, " -i, --index\n"); fprintf(out, " index mails\n"); + fprintf(out, " -o , --output \n"); + fprintf(out, " set the result file, use stdout if unset\n"); } /*********************************************************************/ @@ -205,9 +211,11 @@ int mbox_line_match_search(struct search_condition *condition, regexec(&condition->regexp, mbox_value, 0, 0, 0) == 0; } -void search_in_db(int nb_search_conditions, +void search_in_db(FILE *db_file, + int nb_search_conditions, struct search_condition *search_conditions, - FILE *db_file) { + FILE *output_file) { + int hits[MAX_NB_SEARCH_CONDITIONS]; char raw_db_line[BUFFER_SIZE]; char raw_mbox_line[BUFFER_SIZE]; @@ -231,6 +239,8 @@ void search_in_db(int nb_search_conditions, } } + strcpy(current_mail_filename, ""); + while(fgets(raw_db_line, BUFFER_SIZE, db_file)) { mbox_name = raw_db_line; mbox_value = segment_next_field(raw_db_line); @@ -239,84 +249,92 @@ void search_in_db(int nb_search_conditions, char *position_in_file_string; char *mail_filename; - /* We first check all conditions but the body ones */ + if(current_mail_filename[0]) { - for(n = 0; n < nb_search_conditions && - ((search_conditions[n].field_id == ID_BODY) || - xor(hits[n], search_conditions[n].negation)); n++); + /* We first check all conditions but the body ones */ - if(n == nb_search_conditions) { + for(n = 0; n < nb_search_conditions && + ((search_conditions[n].field_id == ID_BODY) || + xor(hits[n], search_conditions[n].negation)); n++); - /* all conditions but the body ones are fine, check the body - ones */ + if(n == nb_search_conditions) { - nb_fulfilled_body_conditions = 0; + /* all conditions but the body ones are fine, check the body + ones */ - if(nb_body_conditions > 0) { - FILE *mail_file; - int header; + nb_fulfilled_body_conditions = 0; - header = 1; - mail_file = fopen(current_mail_filename, "r"); + if(nb_body_conditions > 0) { + FILE *mail_file; + int header; - if(!mail_file) { - fprintf(stderr, "mymail: Cannot open mbox '%s'.\n", current_mail_filename); - exit(EXIT_FAILURE); - } + 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); + 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(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; } + 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]) { - fprintf(stderr, "** %d %s", header, raw_mbox_line); - nb_fulfilled_body_conditions++; + 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++; + } } } } - } - if(!fgets(raw_mbox_line, BUFFER_SIZE, mail_file) || - (last_mbox_line_was_empty && strncmp(raw_mbox_line, "From ", 5) == 0)) break; + if(!fgets(raw_mbox_line, BUFFER_SIZE, mail_file) || + (last_mbox_line_was_empty && strncmp(raw_mbox_line, "From ", 5) == 0)) + break; + } } - } - fclose(mail_file); - } + fclose(mail_file); + } - if(nb_body_conditions == nb_fulfilled_body_conditions) { - FILE *mail_file; + if(nb_body_conditions == nb_fulfilled_body_conditions) { + FILE *mail_file; - mail_file = fopen(current_mail_filename, "r"); + mail_file = fopen(current_mail_filename, "r"); - if(!mail_file) { - fprintf(stderr, "mymail: Cannot open mbox '%s'.\n", current_mail_filename); - exit(EXIT_FAILURE); - } - - fseek(mail_file, current_position_in_mail, SEEK_SET); + if(!mail_file) { + fprintf(stderr, + "mymail: Cannot open mbox '%s' for mail extraction.\n", + current_mail_filename); + exit(EXIT_FAILURE); + } - if(fgets(raw_mbox_line, BUFFER_SIZE, mail_file)) { - last_mbox_line_was_empty = 1; - printf("%s", raw_mbox_line); - while(1) { - if(!fgets(raw_mbox_line, BUFFER_SIZE, mail_file) || - (last_mbox_line_was_empty && strncmp(raw_mbox_line, "From ", 5) == 0)) break; - last_mbox_line_was_empty = (raw_mbox_line[0] == '\n'); - printf("%s", raw_mbox_line); + fseek(mail_file, current_position_in_mail, SEEK_SET); + + if(fgets(raw_mbox_line, BUFFER_SIZE, mail_file)) { + last_mbox_line_was_empty = 1; + fprintf(output_file, "%s", raw_mbox_line); + while(1) { + if(!fgets(raw_mbox_line, BUFFER_SIZE, mail_file) || + (last_mbox_line_was_empty && strncmp(raw_mbox_line, "From ", 5) == 0)) + break; + last_mbox_line_was_empty = (raw_mbox_line[0] == '\n'); + fprintf(output_file, "%s", raw_mbox_line); + } } - } - fclose(mail_file); + fclose(mail_file); + } } } @@ -347,7 +365,9 @@ void search_in_db(int nb_search_conditions, } void recursive_search_in_db(const char *entry_name, regex_t *db_filename_regexp, - int nb_search_conditions, struct search_condition *search_conditions) { + int nb_search_conditions, + struct search_condition *search_conditions, + FILE *output_file) { DIR *dir; struct dirent *dir_e; struct stat sb; @@ -369,7 +389,8 @@ void recursive_search_in_db(const char *entry_name, regex_t *db_filename_regexp, if(!ignore_entry(dir_e->d_name)) { snprintf(subname, PATH_MAX, "%s/%s", entry_name, dir_e->d_name); recursive_search_in_db(subname, db_filename_regexp, - nb_search_conditions, search_conditions); + nb_search_conditions, search_conditions, + output_file); } } closedir(dir); @@ -382,6 +403,10 @@ void recursive_search_in_db(const char *entry_name, regex_t *db_filename_regexp, if(regexec(db_filename_regexp, filename, 0, 0, 0) == 0) { FILE *db_file = fopen(entry_name, "r"); + if(!quiet) { + printf("Searching in '%s' ... ", entry_name); + } + if(!db_file) { fprintf(stderr, "mymail: Cannot open \"%s\" for reading: %s\n", @@ -404,9 +429,13 @@ void recursive_search_in_db(const char *entry_name, regex_t *db_filename_regexp, exit(EXIT_FAILURE); } - search_in_db(nb_search_conditions, search_conditions, db_file); + search_in_db(db_file, nb_search_conditions, search_conditions, output_file); fclose(db_file); + + if(!quiet) { + printf("done.\n"); + } } } } @@ -558,12 +587,14 @@ enum { static struct option long_options[] = { { "help", no_argument, 0, 'h' }, { "version", no_argument, 0, 'v' }, + { "quiet", no_argument, 0, 'q' }, { "db-file", 1, 0, 'd' }, { "db-pattern", 1, 0, 'p' }, { "db-root", 1, 0, 'r' }, { "db-list", 1, 0, 'l' }, { "search", 1, 0, 's' }, { "index", 0, 0, 'i' }, + { "output", 1, 0, 'o' }, { 0, 0, 0, 0 } }; @@ -576,22 +607,20 @@ int main(int argc, char **argv) { int f; int nb_search_conditions; char *search_condition_strings[MAX_NB_SEARCH_CONDITIONS]; - - /* for(f = 0; f < argc; f++) { */ - /* printf("arg %d \"%s\"\n", f, argv[f]); */ - /* } */ + FILE *output_file; paranoid = 0; action_index = 0; db_filename = 0; db_root_path = 0; db_filename_list = 0; + quiet = 0; setlocale(LC_ALL, ""); nb_search_conditions = 0; - while ((c = getopt_long(argc, argv, "hvip:s:d:r:l:", + while ((c = getopt_long(argc, argv, "hvqip:s:d:r:l:o:", long_options, NULL)) != -1) { switch(c) { @@ -604,6 +633,10 @@ int main(int argc, char **argv) { print_version(stdout); break; + case 'q': + quiet = 1; + break; + case 'i': action_index = 1; break; @@ -616,6 +649,10 @@ int main(int argc, char **argv) { db_filename_regexp_string = strdup(optarg); break; + case 'o': + strncpy(output_filename, optarg, PATH_MAX); + break; + case 'r': db_root_path = strdup(optarg); break; @@ -674,6 +711,21 @@ int main(int argc, char **argv) { } } + if(output_filename[0]) { + output_file = fopen(output_filename, "w"); + + if(!output_file) { + fprintf(stderr, + "mymail: Cannot open result file \"%s\" for writing: %s\n", + output_filename, + strerror(errno)); + exit(EXIT_FAILURE); + } + } else { + output_file = stdout; + quiet = 1; + } + if(error) { print_usage(stderr); exit(EXIT_FAILURE); @@ -782,7 +834,8 @@ int main(int argc, char **argv) { } recursive_search_in_db(db_root_path, &db_filename_regexp, - nb_search_conditions, search_conditions); + nb_search_conditions, search_conditions, + output_file); regfree(&db_filename_regexp); } @@ -813,7 +866,7 @@ int main(int argc, char **argv) { exit(EXIT_FAILURE); } - search_in_db(nb_search_conditions, search_conditions, db_file); + search_in_db(db_file, nb_search_conditions, search_conditions, output_file); fclose(db_file); } @@ -833,7 +886,7 @@ int main(int argc, char **argv) { exit(EXIT_FAILURE); } - search_in_db(nb_search_conditions, search_conditions, db_file); + search_in_db(db_file, nb_search_conditions, search_conditions, output_file); fclose(db_file); optind++; @@ -846,6 +899,10 @@ int main(int argc, char **argv) { } } + if(output_file != stdout) { + fclose(output_file); + } + free(db_filename); free(db_filename_regexp_string); free(db_root_path);