cli: add global option --stderr=FILE

With this option all writes to stderr are redirected to the specified
FILE (or to stdout on case FILE is '-'). This is immediately useful
in emacs interface as some of its exec intefaces do not provide
separation of stdout and stderr.
This commit is contained in:
Tomi Ollila 2013-05-28 21:38:52 +03:00 committed by David Bremner
parent e7ade21d56
commit 8a0e85025a
2 changed files with 33 additions and 0 deletions

View file

@ -54,6 +54,7 @@ typedef GMimeCipherContext notmuch_crypto_context_t;
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/time.h> #include <sys/time.h>
#include <unistd.h> #include <unistd.h>
#include <fcntl.h>
#include <dirent.h> #include <dirent.h>
#include <errno.h> #include <errno.h>
#include <signal.h> #include <signal.h>

View file

@ -251,6 +251,32 @@ notmuch_command (notmuch_config_t *config,
return 0; 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 int
main (int argc, char *argv[]) main (int argc, char *argv[])
{ {
@ -259,6 +285,7 @@ main (int argc, char *argv[])
const char *command_name = NULL; const char *command_name = NULL;
command_t *command; command_t *command;
char *config_file_name = NULL; char *config_file_name = NULL;
char *stderr_file = NULL;
notmuch_config_t *config; notmuch_config_t *config;
notmuch_bool_t print_help=FALSE, print_version=FALSE; notmuch_bool_t print_help=FALSE, print_version=FALSE;
int opt_index; int opt_index;
@ -268,6 +295,7 @@ main (int argc, char *argv[])
{ NOTMUCH_OPT_BOOLEAN, &print_help, "help", 'h', 0 }, { NOTMUCH_OPT_BOOLEAN, &print_help, "help", 'h', 0 },
{ NOTMUCH_OPT_BOOLEAN, &print_version, "version", 'v', 0 }, { NOTMUCH_OPT_BOOLEAN, &print_version, "version", 'v', 0 },
{ NOTMUCH_OPT_STRING, &config_file_name, "config", 'c', 0 }, { NOTMUCH_OPT_STRING, &config_file_name, "config", 'c', 0 },
{ NOTMUCH_OPT_STRING, &stderr_file, "stderr", '\0', 0 },
{ 0, 0, 0, 0, 0 } { 0, 0, 0, 0, 0 }
}; };
@ -287,6 +315,10 @@ main (int argc, char *argv[])
return 1; return 1;
} }
if (stderr_file && redirect_stderr (stderr_file) != 0) {
/* error already printed */
return 1;
}
if (print_help) if (print_help)
return notmuch_help_command (NULL, argc - 1, &argv[1]); return notmuch_help_command (NULL, argc - 1, &argv[1]);