]> git.notmuchmail.org Git - notmuch/blobdiff - notmuch.c
contrib: pick: use the sexp parser
[notmuch] / notmuch.c
index f51a84f5e1f55c89aaf974f6de68aaac855e2272..99ddd6d080fb6a23068ee904b2c6c0f23832da3b 100644 (file)
--- a/notmuch.c
+++ b/notmuch.c
@@ -28,7 +28,6 @@ typedef struct command {
     const char *name;
     command_function_t function;
     notmuch_bool_t create_config;
-    const char *arguments;
     const char *summary;
 } command_t;
 
@@ -40,40 +39,28 @@ notmuch_command (notmuch_config_t *config, int argc, char *argv[]);
 
 static command_t commands[] = {
     { NULL, notmuch_command, TRUE,
-      NULL,
       "Notmuch main command." },
     { "setup", notmuch_setup_command, TRUE,
-      NULL,
       "Interactively setup notmuch for first use." },
     { "new", notmuch_new_command, FALSE,
-      "[options...]",
       "Find and import new messages to the notmuch database." },
     { "search", notmuch_search_command, FALSE,
-      "[options...] <search-terms> [...]",
       "Search for messages matching the given search terms." },
     { "show", notmuch_show_command, FALSE,
-      "<search-terms> [...]",
       "Show all messages matching the search terms." },
     { "count", notmuch_count_command, FALSE,
-      "[options...] <search-terms> [...]",
       "Count messages matching the search terms." },
     { "reply", notmuch_reply_command, FALSE,
-      "[options...] <search-terms> [...]",
       "Construct a reply template for a set of messages." },
     { "tag", notmuch_tag_command, FALSE,
-      "+<tag>|-<tag> [...] [--] <search-terms> [...]" ,
       "Add/remove tags for all messages matching the search terms." },
     { "dump", notmuch_dump_command, FALSE,
-      "[<filename>] [--] [<search-terms>]",
       "Create a plain-text dump of the tags for each message." },
     { "restore", notmuch_restore_command, FALSE,
-      "[--accumulate] [<filename>]",
       "Restore the tags from the given dump file (see 'dump')." },
     { "config", notmuch_config_command, FALSE,
-      "[get|set] <section>.<item> [value ...]",
       "Get or set settings in the notmuch configuration file." },
     { "help", notmuch_help_command, TRUE, /* create but don't save config */
-      "[<command>]",
       "This message, or more detailed help for the named command." }
 };
 
@@ -251,6 +238,32 @@ notmuch_command (notmuch_config_t *config,
     return 0;
 }
 
+static int
+redirect_stderr (const char * stderr_file)
+{
+    if (strcmp (stderr_file, "-") == 0) {
+       if (dup2 (STDOUT_FILENO, STDERR_FILENO) < 0) {
+           perror ("dup2");
+           return 1;
+       }
+    } else {
+       int fd = open (stderr_file, O_WRONLY|O_CREAT|O_TRUNC, 0666);
+       if (fd < 0) {
+           fprintf (stderr, "Error: Cannot redirect stderr to '%s': %s\n",
+                    stderr_file, strerror (errno));
+           return 1;
+       }
+       if (fd != STDERR_FILENO) {
+           if (dup2 (fd, STDERR_FILENO) < 0) {
+               perror ("dup2");
+               return 1;
+           }
+           close (fd);
+       }
+    }
+    return 0;
+}
+
 int
 main (int argc, char *argv[])
 {
@@ -259,6 +272,7 @@ main (int argc, char *argv[])
     const char *command_name = NULL;
     command_t *command;
     char *config_file_name = NULL;
+    char *stderr_file = NULL;
     notmuch_config_t *config;
     notmuch_bool_t print_help=FALSE, print_version=FALSE;
     int opt_index;
@@ -268,6 +282,7 @@ main (int argc, char *argv[])
        { NOTMUCH_OPT_BOOLEAN, &print_help, "help", 'h', 0 },
        { NOTMUCH_OPT_BOOLEAN, &print_version, "version", 'v', 0 },
        { NOTMUCH_OPT_STRING, &config_file_name, "config", 'c', 0 },
+       { NOTMUCH_OPT_STRING, &stderr_file, "stderr", '\0', 0 },
        { 0, 0, 0, 0, 0 }
     };
 
@@ -287,6 +302,10 @@ main (int argc, char *argv[])
        return 1;
     }
 
+    if (stderr_file && redirect_stderr (stderr_file) != 0) {
+       /* error already printed */
+       return 1;
+    }
     if (print_help)
        return notmuch_help_command (NULL, argc - 1, &argv[1]);