int paranoid;
int quiet;
+char *default_search_field;
/********************************************************************/
fprintf(out, " index mails\n");
fprintf(out, " -o <output filename>, --output <output filename>\n");
fprintf(out, " set the result file, use stdout if unset\n");
+ fprintf(out, " -a <search field>, --default-search <search field>\n");
+ fprintf(out, " set the default search field\n");
}
/*********************************************************************/
(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,
}
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;
}
}
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');
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",
{ "search", 1, 0, 's' },
{ "index", 0, 0, 'i' },
{ "output", 1, 0, 'o' },
+ { "default-search", 1, 0, 'a' },
{ 0, 0, 0, 0 }
};
/*********************************************************************/
-void init_condition(struct search_condition *condition, char *string) {
+void init_condition(struct search_condition *condition, char *full_string) {
char full_search_field[TOKEN_BUFFER_SIZE], *search_field;
int m;
+ char *string;
- string = parse_token(full_search_field, TOKEN_BUFFER_SIZE, ' ', string);
+ string = parse_token(full_search_field, TOKEN_BUFFER_SIZE, ' ', full_string);
search_field = full_search_field;
if(search_field[0] == '!') {
condition->negation = 0;
}
- /* Last 8 hours */
+ /* Recently */
if(strcmp(search_field, "8h") == 0) {
condition->field_id = ID_INTERVAL;
condition->interval_stop = 0;
}
- /* Today and yesterday */
+ else if(strcmp(search_field, "month") == 0) {
+ condition->field_id = ID_INTERVAL;
+ condition->interval_start = time(0) - 3600 * 24 * 31;
+ condition->interval_stop = 0;
+ }
else if(strcmp(search_field, "24h") == 0 ||
strcmp(search_field, "today") == 0) {
condition->interval_stop = 0;
}
+ /* Yesterday */
+
else if(strcmp(search_field, "yesterday") == 0) {
condition->field_id = ID_INTERVAL;
condition->interval_start = time(0) - 2 * 3600 * 24;
}
else {
+
+ /* header-related conditions */
+
condition->field_id = -1;
for(m = 0; (m < MAX_ID) && condition->field_id == -1; m++) {
}
}
+ if(condition->field_id == -1) {
+ if(default_search_field) {
+ for(m = 0; (m < MAX_ID) && condition->field_id == -1; m++) {
+ if(strncmp(field_names[m],
+ default_search_field, strlen(default_search_field)) == 0) {
+ condition->field_id = m;
+ }
+ }
+ string = full_string;
+ }
+ }
+
if(condition->field_id == -1) {
fprintf(stderr,
"mymail: Syntax error in field name \"%s\".\n",
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;
db_root_path = 0;
db_filename_list = 0;
quiet = 0;
+ default_search_field = 0;
setlocale(LC_ALL, "");
nb_search_conditions = 0;
- while ((c = getopt_long(argc, argv, "hvqip:s:d:r:l:o:",
+ while ((c = getopt_long(argc, argv, "hvqip:s:d:r:l:o:a:",
long_options, NULL)) != -1) {
switch(c) {
nb_search_conditions++;
break;
+ case 'a':
+ default_search_field = optarg;
+ break;
+
default:
error = 1;
break;