X-Git-Url: https://git.cworth.org/git?p=notmuch;a=blobdiff_plain;f=notmuch-insert.c;h=e44607ad45a8fdf9058f3ddf9fa3fc88acb7614e;hp=e483b94905ff653f2e2602283903676bc12d7e91;hb=HEAD;hpb=f994f0e7df178eb31c656329bb28ffa832ac4364 diff --git a/notmuch-insert.c b/notmuch-insert.c index e483b949..e44607ad 100644 --- a/notmuch-insert.c +++ b/notmuch-insert.c @@ -34,7 +34,7 @@ static volatile sig_atomic_t interrupted; static void handle_sigint (unused (int sig)) { - static char msg[] = "Stopping... \n"; + static const char msg[] = "Stopping... \n"; /* This write is "opportunistic", so it's okay to ignore the * result. It is not required for correctness, and if it does @@ -241,6 +241,26 @@ maildir_mktemp (const void *ctx, const char *maildir, bool world_readable, char return fd; } +static bool +write_buf (const char *buf, int fdout, ssize_t remain) +{ + const char *p = buf; + + do { + ssize_t written = write (fdout, p, remain); + if (written < 0 && errno == EINTR) + continue; + if (written <= 0) { + fprintf (stderr, "Error: writing to temporary file: %s", + strerror (errno)); + return false; + } + p += written; + remain -= written; + } while (remain > 0); + return true; +} + /* * Copy fdin to fdout, return true on success, and false on errors and * empty input. @@ -249,11 +269,13 @@ static bool copy_fd (int fdout, int fdin) { bool empty = true; + bool first = true; + const char *header = "X-Envelope-From: "; while (! interrupted) { ssize_t remain; char buf[4096]; - char *p; + const char *p = buf; remain = read (fdin, buf, sizeof (buf)); if (remain == 0) @@ -266,20 +288,18 @@ copy_fd (int fdout, int fdin) return false; } - p = buf; - do { - ssize_t written = write (fdout, p, remain); - if (written < 0 && errno == EINTR) - continue; - if (written <= 0) { - fprintf (stderr, "Error: writing to temporary file: %s", - strerror (errno)); + if (first && remain >= 5 && 0 == strncmp (buf, "From ", 5)) { + if (! write_buf (header, fdout, strlen (header))) return false; - } - p += written; - remain -= written; - empty = false; - } while (remain > 0); + p += 5; + remain -= 5; + } + + first = false; + + if (! write_buf (p, fdout, remain)) + return false; + empty = false; } return (! interrupted && ! empty); @@ -444,11 +464,11 @@ add_file (notmuch_database_t *notmuch, const char *path, tag_op_list_t *tag_ops, } int -notmuch_insert_command (unused(notmuch_config_t *config),notmuch_database_t *notmuch, int argc, char *argv[]) +notmuch_insert_command (notmuch_database_t *notmuch, int argc, char *argv[]) { notmuch_status_t status, close_status; struct sigaction action; - const char *db_path; + const char *mail_root; notmuch_config_values_t *new_tags = NULL; tag_op_list_t *tag_ops; char *query_string = NULL; @@ -461,6 +481,8 @@ notmuch_insert_command (unused(notmuch_config_t *config),notmuch_database_t *not char *maildir; char *newpath; int opt_index; + notmuch_indexopts_t *indexopts = notmuch_database_get_default_indexopts (notmuch); + void *local = talloc_new (NULL); notmuch_opt_desc_t options[] = { @@ -478,16 +500,9 @@ notmuch_insert_command (unused(notmuch_config_t *config),notmuch_database_t *not if (opt_index < 0) return EXIT_FAILURE; - notmuch_process_shared_options (argv[0]); - - - /* XXX TODO replace this use of DATABASE_PATH with something specific to hooks */ - db_path = notmuch_config_get (notmuch, NOTMUCH_CONFIG_DATABASE_PATH); + notmuch_process_shared_options (notmuch, argv[0]); - if (! db_path) - INTERNAL_ERROR ("Unable to retrieve database path"); - else - db_path = talloc_strdup (local, db_path); + mail_root = notmuch_config_get (notmuch, NOTMUCH_CONFIG_MAIL_ROOT); new_tags = notmuch_config_get_values (notmuch, NOTMUCH_CONFIG_NEW_TAGS); @@ -533,7 +548,7 @@ notmuch_insert_command (unused(notmuch_config_t *config),notmuch_database_t *not return EXIT_FAILURE; } - maildir = talloc_asprintf (local, "%s/%s", db_path, folder); + maildir = talloc_asprintf (local, "%s/%s", mail_root, folder); if (! maildir) { fprintf (stderr, "Out of memory\n"); return EXIT_FAILURE; @@ -557,9 +572,7 @@ notmuch_insert_command (unused(notmuch_config_t *config),notmuch_database_t *not return EXIT_FAILURE; } - notmuch_exit_if_unmatched_db_uuid (notmuch); - - status = notmuch_process_shared_indexing_options (notmuch); + status = notmuch_process_shared_indexing_options (indexopts); if (status != NOTMUCH_STATUS_SUCCESS) { fprintf (stderr, "Error: Failed to process index options. (%s)\n", notmuch_status_to_string (status)); @@ -567,10 +580,10 @@ notmuch_insert_command (unused(notmuch_config_t *config),notmuch_database_t *not } /* Index the message. */ - status = add_file (notmuch, newpath, tag_ops, synchronize_flags, keep, indexing_cli_choices.opts); + status = add_file (notmuch, newpath, tag_ops, synchronize_flags, keep, indexopts); /* Commit changes. */ - close_status = notmuch_database_destroy (notmuch); + close_status = notmuch_database_close (notmuch); if (close_status) { /* Hold on to the first error, if any. */ if (! status) @@ -595,9 +608,11 @@ notmuch_insert_command (unused(notmuch_config_t *config),notmuch_database_t *not if (hooks && status == NOTMUCH_STATUS_SUCCESS) { /* Ignore hook failures. */ - notmuch_run_hook (db_path, "post-insert"); + notmuch_run_hook (notmuch, "post-insert"); } + notmuch_database_destroy (notmuch); + talloc_free (local); return status_to_exit (status);