aboutsummaryrefslogtreecommitdiffhomepage
path: root/notmuch-show.c
diff options
context:
space:
mode:
authorGravatar Michal Sojka <sojkam1@fel.cvut.cz>2010-10-22 11:28:03 +0200
committerGravatar Carl Worth <cworth@cworth.org>2010-11-05 17:51:18 -0700
commitd39d0e55f09d8cc2ba9683ec5622068bb7373f2a (patch)
treea492116e11f39879842f670b093b1d6d461512fb /notmuch-show.c
parent1fe7483d8d03fd981fd09e5770efbea5b9304da9 (diff)
Add 'cat' subcommand
This command outputs a raw message matched by search term to the standard output. It allows MUAs to access the messages for piping, attachment manipulation, etc. by running notmuch cat rather then directly access the file. This will simplify the MUAs when they need to operate on a remote database. Edited-by: Carl Worth <cworth@cworth.org>: Remove trailing whitespace, add missing "test_done" to new test script to avoid "Unexpected exit" error.
Diffstat (limited to 'notmuch-show.c')
-rw-r--r--notmuch-show.c83
1 files changed, 83 insertions, 0 deletions
diff --git a/notmuch-show.c b/notmuch-show.c
index ea465dec..f46e0c82 100644
--- a/notmuch-show.c
+++ b/notmuch-show.c
@@ -632,6 +632,89 @@ notmuch_show_command (void *ctx, unused (int argc), unused (char *argv[]))
}
int
+notmuch_cat_command (void *ctx, unused (int argc), unused (char *argv[]))
+{
+ notmuch_config_t *config;
+ notmuch_database_t *notmuch;
+ notmuch_query_t *query;
+ notmuch_messages_t *messages;
+ notmuch_message_t *message;
+ char *query_string;
+ int i;
+ const char *filename;
+ FILE *file;
+ size_t size;
+ char buf[4096];
+
+ for (i = 0; i < argc && argv[i][0] == '-'; i++) {
+ fprintf (stderr, "Unrecognized option: %s\n", argv[i]);
+ return 1;
+ }
+
+ config = notmuch_config_open (ctx, NULL, NULL);
+ if (config == NULL)
+ return 1;
+
+ query_string = query_string_from_args (ctx, argc, argv);
+ if (query_string == NULL) {
+ fprintf (stderr, "Out of memory\n");
+ return 1;
+ }
+
+ if (*query_string == '\0') {
+ fprintf (stderr, "Error: notmuch cat requires at least one search term.\n");
+ return 1;
+ }
+
+ notmuch = notmuch_database_open (notmuch_config_get_database_path (config),
+ NOTMUCH_DATABASE_MODE_READ_ONLY);
+ if (notmuch == NULL)
+ return 1;
+
+ query = notmuch_query_create (notmuch, query_string);
+ if (query == NULL) {
+ fprintf (stderr, "Error: Out of memory\n");
+ return 1;
+ }
+
+ if (notmuch_query_count_messages (query) != 1) {
+ fprintf (stderr, "Error: search term did not match precisely one message.\n");
+ return 1;
+ }
+
+ messages = notmuch_query_search_messages (query);
+ message = notmuch_messages_get (messages);
+
+ if (message == NULL) {
+ fprintf (stderr, "Error: Cannot find matching message.\n");
+ return 1;
+ }
+
+ filename = notmuch_message_get_filename (message);
+ if (filename == NULL) {
+ fprintf (stderr, "Error: Cannot message filename.\n");
+ return 1;
+ }
+
+ file = fopen (filename, "r");
+ if (file == NULL) {
+ fprintf (stderr, "Error: Cannot open file %s: %s\n", filename, strerror (errno));
+ return 1;
+ }
+
+ while (!feof (file)) {
+ size = fread (buf, 1, sizeof (buf), file);
+ fwrite (buf, size, 1, stdout);
+ }
+
+ fclose (file);
+ notmuch_query_destroy (query);
+ notmuch_database_close (notmuch);
+
+ return 0;
+}
+
+int
notmuch_part_command (void *ctx, unused (int argc), unused (char *argv[]))
{
notmuch_config_t *config;