unofficial mirror of notmuch@notmuchmail.org
 help / color / mirror / code / Atom feed
* [RFC PATCH 1/1] add --stderr option
@ 2013-05-21 18:42 Tomi Ollila
  2013-05-21 19:21 ` Mark Walters
  2013-05-21 19:55 ` Justus Winter
  0 siblings, 2 replies; 5+ messages in thread
From: Tomi Ollila @ 2013-05-21 18:42 UTC (permalink / raw)
  To: notmuch; +Cc: tomi.ollila

---

Note quickly written untested code (but compiles!), just to show an idea...

This implements (i hope) curl(1) --stderr option in notmuch(1):

       --stderr <file>
              Redirect  all writes to stderr to the specified file instead. If
              the file name is a plain '-', it is instead written to stdout.

This would be useful in emacs interface.

Please comment; I'll do help and manual page changes (and NEWS) if
this is good idea :D

Tomi


 notmuch.c | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/notmuch.c b/notmuch.c
index f51a84f..3b8bd5d 100644
--- a/notmuch.c
+++ b/notmuch.c
@@ -21,6 +21,7 @@
  */
 
 #include "notmuch-client.h"
+#include <fcntl.h>
 
 typedef int (*command_function_t) (notmuch_config_t *config, int argc, char *argv[]);
 
@@ -259,6 +260,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 +270,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", 'c', 0 },
 	{ 0, 0, 0, 0, 0 }
     };
 
@@ -295,6 +298,23 @@ main (int argc, char *argv[])
 	return 0;
     }
 
+    if (stderr_file) {
+	if (strcmp (stderr_file, "-") == 0)
+	    dup2 (STDOUT_FILENO, STDERR_FILENO);
+	else {
+	    int fd = open (stderr_file, O_WRONLY|O_CREAT|O_APPEND, 0644);
+	    if (fd < 0) {
+		fprintf (stderr, "Error: Cannot redirect stderr to '%s': %s\n",
+			 stderr_file, strerror(errno));
+		return 1;
+	    }
+	    if (fd != STDERR_FILENO) {
+		dup2 (fd, STDERR_FILENO);
+		close (fd);
+	    }
+	}
+    }
+
     if (opt_index < argc)
 	command_name = argv[opt_index];
 
-- 
1.8.1.4

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [RFC PATCH 1/1] add --stderr option
  2013-05-21 18:42 [RFC PATCH 1/1] add --stderr option Tomi Ollila
@ 2013-05-21 19:21 ` Mark Walters
  2013-05-21 19:55 ` Justus Winter
  1 sibling, 0 replies; 5+ messages in thread
From: Mark Walters @ 2013-05-21 19:21 UTC (permalink / raw)
  To: Tomi Ollila, notmuch; +Cc: tomi.ollila


On Tue, 21 May 2013, Tomi Ollila <tomi.ollila@iki.fi> wrote:
> ---
>
> Note quickly written untested code (but compiles!), just to show an idea...
>
> This implements (i hope) curl(1) --stderr option in notmuch(1):
>
>        --stderr <file>
>               Redirect  all writes to stderr to the specified file instead. If
>               the file name is a plain '-', it is instead written to stdout.
>
> This would be useful in emacs interface.
>
> Please comment; I'll do help and manual page changes (and NEWS) if
> this is good idea :D

I think this looks really nice. +1 for something like this.

Mark

> Tomi
>
>
>  notmuch.c | 20 ++++++++++++++++++++
>  1 file changed, 20 insertions(+)
>
> diff --git a/notmuch.c b/notmuch.c
> index f51a84f..3b8bd5d 100644
> --- a/notmuch.c
> +++ b/notmuch.c
> @@ -21,6 +21,7 @@
>   */
>  
>  #include "notmuch-client.h"
> +#include <fcntl.h>
>  
>  typedef int (*command_function_t) (notmuch_config_t *config, int argc, char *argv[]);
>  
> @@ -259,6 +260,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 +270,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", 'c', 0 },
>  	{ 0, 0, 0, 0, 0 }
>      };
>  
> @@ -295,6 +298,23 @@ main (int argc, char *argv[])
>  	return 0;
>      }
>  
> +    if (stderr_file) {
> +	if (strcmp (stderr_file, "-") == 0)
> +	    dup2 (STDOUT_FILENO, STDERR_FILENO);
> +	else {
> +	    int fd = open (stderr_file, O_WRONLY|O_CREAT|O_APPEND, 0644);
> +	    if (fd < 0) {
> +		fprintf (stderr, "Error: Cannot redirect stderr to '%s': %s\n",
> +			 stderr_file, strerror(errno));
> +		return 1;
> +	    }
> +	    if (fd != STDERR_FILENO) {
> +		dup2 (fd, STDERR_FILENO);
> +		close (fd);
> +	    }
> +	}
> +    }
> +
>      if (opt_index < argc)
>  	command_name = argv[opt_index];
>  
> -- 
> 1.8.1.4
>
> _______________________________________________
> notmuch mailing list
> notmuch@notmuchmail.org
> http://notmuchmail.org/mailman/listinfo/notmuch

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [RFC PATCH 1/1] add --stderr option
  2013-05-21 18:42 [RFC PATCH 1/1] add --stderr option Tomi Ollila
  2013-05-21 19:21 ` Mark Walters
@ 2013-05-21 19:55 ` Justus Winter
  2013-05-22  7:50   ` Tomi Ollila
  1 sibling, 1 reply; 5+ messages in thread
From: Justus Winter @ 2013-05-21 19:55 UTC (permalink / raw)
  To: Tomi Ollila, notmuch; +Cc: tomi.ollila

Quoting Tomi Ollila (2013-05-21 20:42:30)
> ---
> 
> Note quickly written untested code (but compiles!), just to show an idea...
> 
> This implements (i hope) curl(1) --stderr option in notmuch(1):
> 
>        --stderr <file>
>               Redirect  all writes to stderr to the specified file instead. If
>               the file name is a plain '-', it is instead written to stdout.
> 
> This would be useful in emacs interface.

Hm, shouldn't it be possible to bind a pipe(2) to stderr instead? I
mean in the process of running the notmuch binary (i.e. somewhere
along the lines of fork and exec)?

I've implemented this for alot, which does not use the binary but
directly calls into libnotmuch, but does so in a helper process. Said
helper has a pipe(2) on stderr and the alot process reads from it and
turns any line into a log message.

Justus

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [RFC PATCH 1/1] add --stderr option
  2013-05-21 19:55 ` Justus Winter
@ 2013-05-22  7:50   ` Tomi Ollila
  2013-05-22 11:15     ` Justus Winter
  0 siblings, 1 reply; 5+ messages in thread
From: Tomi Ollila @ 2013-05-22  7:50 UTC (permalink / raw)
  To: Justus Winter, notmuch

On Tue, May 21 2013, Justus Winter <4winter@informatik.uni-hamburg.de> wrote:

> Quoting Tomi Ollila (2013-05-21 20:42:30)
>> ---
>> 
>> Note quickly written untested code (but compiles!), just to show an idea...
>> 
>> This implements (i hope) curl(1) --stderr option in notmuch(1):
>> 
>>        --stderr <file>
>>               Redirect  all writes to stderr to the specified file instead. If
>>               the file name is a plain '-', it is instead written to stdout.
>> 
>> This would be useful in emacs interface.
>
> Hm, shouldn't it be possible to bind a pipe(2) to stderr instead? I
> mean in the process of running the notmuch binary (i.e. somewhere
> along the lines of fork and exec)?

Yes, if emacs(1) were smarter ;/

> I've implemented this for alot, which does not use the binary but
> directly calls into libnotmuch, but does so in a helper process. Said
> helper has a pipe(2) on stderr and the alot process reads from it and
> turns any line into a log message.

It is unfortunate that you have to do that -- libnotmuch should not
emit anything to stderr... We've briefly discussed what changes
are needed to libnotmuch what could be done there but... :)

<questionable advice>
Instead of running separate process you could have both ends of the
pipe in same process and check after libnotmuch call whether there 
is data in the reading end of the pipe. I think pipe buffers like 4k
of data. If you used socketpair(2) that buffers 100k of data by
default in Linux systems. Still, using nonblocking fds are
advisable if using this hack ;D
</questionable advice>

>
> Justus

Tomi

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [RFC PATCH 1/1] add --stderr option
  2013-05-22  7:50   ` Tomi Ollila
@ 2013-05-22 11:15     ` Justus Winter
  0 siblings, 0 replies; 5+ messages in thread
From: Justus Winter @ 2013-05-22 11:15 UTC (permalink / raw)
  To: Tomi Ollila, notmuch

Quoting Tomi Ollila (2013-05-22 09:50:46)
> On Tue, May 21 2013, Justus Winter <4winter@informatik.uni-hamburg.de> wrote:
> 
> > Quoting Tomi Ollila (2013-05-21 20:42:30)
> >> ---
> >> 
> >> Note quickly written untested code (but compiles!), just to show an idea...
> >> 
> >> This implements (i hope) curl(1) --stderr option in notmuch(1):
> >> 
> >>        --stderr <file>
> >>               Redirect  all writes to stderr to the specified file instead. If
> >>               the file name is a plain '-', it is instead written to stdout.
> >> 
> >> This would be useful in emacs interface.
> >
> > Hm, shouldn't it be possible to bind a pipe(2) to stderr instead? I
> > mean in the process of running the notmuch binary (i.e. somewhere
> > along the lines of fork and exec)?
> 
> Yes, if emacs(1) were smarter ;/

Uh >,<

> > I've implemented this for alot, which does not use the binary but
> > directly calls into libnotmuch, but does so in a helper process. Said
> > helper has a pipe(2) on stderr and the alot process reads from it and
> > turns any line into a log message.
> 
> It is unfortunate that you have to do that -- libnotmuch should not
> emit anything to stderr... We've briefly discussed what changes
> are needed to libnotmuch what could be done there but... :)
> 
> <questionable advice>
> Instead of running separate process you could have both ends of the
> pipe in same process and check after libnotmuch call whether there 
> is data in the reading end of the pipe. I think pipe buffers like 4k
> of data. If you used socketpair(2) that buffers 100k of data by
> default in Linux systems. Still, using nonblocking fds are
> advisable if using this hack ;D
> </questionable advice>

Umm, no I don't see how that would work. I mean I'd have to dup(2) a
fd to 2, but that means not only libnotmuch will write stuff to it but
anything ever written to stderr by alot also ends up there.

It is also a means of protecting alot against any fatal errors in
libnotmuch, like segfaults and stuff like this. I'm not sure if that's
changed, but libnotmuch used to call exit once in a while taking alot
with it. With a separate subprocess you can just log this and restart
the process and you don't ever lose any mail.

But yes, it's kind of a hack.

Justus

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2013-05-22 11:15 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-05-21 18:42 [RFC PATCH 1/1] add --stderr option Tomi Ollila
2013-05-21 19:21 ` Mark Walters
2013-05-21 19:55 ` Justus Winter
2013-05-22  7:50   ` Tomi Ollila
2013-05-22 11:15     ` Justus Winter

Code repositories for project(s) associated with this public inbox

	https://yhetil.org/notmuch.git/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).