#define BUFFER_SIZE 65536
#define TOKEN_BUFFER_SIZE 1024
-#define LEADING_FROM_LINE_REGEXP "^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$"
+#define LEADING_FROM_LINE_REGEXP_STRING "^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$"
regex_t leading_from_line_regexp;
return string;
}
-/********************************************************************/
-
-/* malloc with error checking. */
+char *default_value(char *current_value,
+ const char *env_variable,
+ const char *hard_default_value) {
+ if(current_value) {
+ return current_value;
+ } else {
+ char *env_value = getenv(env_variable);
+ if(env_value) {
+ return strdup(env_value);
+ } else if(hard_default_value) {
+ return strdup(hard_default_value);
+ } else {
+ return 0;
+ }
+ }
+}
-void *safe_malloc(size_t n) {
- void *p = malloc(n);
- if(!p && n != 0) {
+FILE *safe_fopen(const char *path, const char *mode, const char *comment) {
+ FILE *result = fopen(path, mode);
+ if(result) {
+ return result;
+ } else {
fprintf(stderr,
- "mymail: cannot allocate memory: %s\n", strerror(errno));
+ "mymail: Cannot open file '%s' (%s) with mode \"%s\".\n",
+ path, comment, mode);
exit(EXIT_FAILURE);
}
- return p;
}
/*********************************************************************/
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);
- }
+ mail_file = safe_fopen(mail_filename, "r", "mbox for body scan");
fseek(mail_file, position_in_mail, SEEK_SET);
char raw_mbox_line[BUFFER_SIZE];
FILE *mail_file;
- mail_file = fopen(mail_filename, "r");
-
- if(!mail_file) {
- fprintf(stderr,
- "mymail: Cannot open mbox '%s' for mail extraction.\n",
- mail_filename);
- exit(EXIT_FAILURE);
- }
-
+ mail_file = safe_fopen(mail_filename, "r", "mbox for mail extraction");
fseek(mail_file, position_in_mail, SEEK_SET);
if(fgets(raw_mbox_line, BUFFER_SIZE, mail_file)) {
fflush(stdout);
}
- db_file = fopen(db_filename, "r");
-
- if(!db_file) {
- fprintf(stderr,
- "mymail: Cannot open \"%s\" for reading: %s\n",
- db_filename,
- strerror(errno));
- exit(EXIT_FAILURE);
- }
+ db_file = safe_fopen(db_filename, "r", "index file for search");
/* First, check the db file leading line integrity */
int in_header, new_header;
unsigned long int position_in_file;
- file = fopen(mbox_filename, "r");
-
- if(!file) {
- fprintf(stderr, "mymail: Cannot open '%s'.\n", mbox_filename);
- if(paranoid) { exit(EXIT_FAILURE); }
- return;
- }
+ file = safe_fopen(mbox_filename, "r", "mbox for indexing");
in_header = 0;
new_header = 0;
int nb_search_conditions;
struct search_condition search_conditions[MAX_NB_SEARCH_CONDITIONS];
- if(regcomp(&leading_from_line_regexp, LEADING_FROM_LINE_REGEXP, 0)) {
+ if(regcomp(&leading_from_line_regexp, LEADING_FROM_LINE_REGEXP_STRING, 0)) {
fprintf(stderr,
"mymail: Cannot compile leading \"from\" line regexp. That is strange.\n");
exit(EXIT_FAILURE);
/* Set all the values that may defined in the arguments, through
environment variables, or hard-coded */
- if(!db_filename) {
- char *default_db_filename = getenv("MYMAIL_DB_FILE");
+ db_filename = default_value(db_filename,
+ "MYMAIL_DB_FILE",
+ "mymail.db");
- if(!default_db_filename) {
- default_db_filename = "mymail.db";
- }
-
- db_filename = strdup(default_db_filename);
- }
-
- if(!db_filename_regexp_string) {
- char *default_db_filename_regexp_string = getenv("MYMAIL_DB_PATTERN");
+ db_filename_regexp_string = default_value(db_filename_regexp_string,
+ "MYMAIL_DB_FILE",
+ "^mymail.db$");
- if(!default_db_filename_regexp_string) {
- default_db_filename_regexp_string = "^mymail.db$";
- }
-
- db_filename_regexp_string = strdup(default_db_filename_regexp_string);
- }
+ db_root_path = default_value(db_root_path,
+ "MYMAIL_DB_ROOT",
+ 0);
- if(!db_root_path) {
- char *default_db_root_path = getenv("MYMAIL_DB_ROOT");
+ db_filename_list = default_value(db_filename_list,
+ "MYMAIL_DB_LIST",
+ 0);
- if(default_db_root_path) {
- db_root_path = strdup(default_db_root_path);
- }
- }
-
- if(!db_filename_list) {
- char *default_db_filename_list = getenv("MYMAIL_DB_LIST");
-
- if(default_db_filename_list) {
- db_filename_list = strdup(default_db_filename_list);
- }
- }
-
- if(!mbox_filename_regexp_string) {
- char *default_mbox_filename_regexp_string = getenv("MYMAIL_MBOX_PATTERN");
-
- if(default_mbox_filename_regexp_string) {
- mbox_filename_regexp_string = strdup(default_mbox_filename_regexp_string);
- }
- }
+ mbox_filename_regexp_string = default_value(mbox_filename_regexp_string,
+ "MYMAIL_MBOX_PATTERN",
+ "mbox$");
/* Start the processing */
mbox_filename_regexp = 0;
}
- db_file = fopen(db_filename, "w");
-
- if(!db_file) {
- fprintf(stderr,
- "mymail: Cannot open \"%s\" for writing: %s\n",
- db_filename,
- strerror(errno));
- exit(EXIT_FAILURE);
- }
+ db_file = safe_fopen(db_filename, "w", "index file for indexing");
for(f = 0; f < nb_fields_to_parse; f++) {
if(regcomp(&fields_to_parse[f].regexp,
int nb_extracted_mails = 0;
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);
- }
+ output_file = safe_fopen(output_filename, "w", "result mbox");
} else {
output_file = stdout;
quiet = 1;