aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--camel/ChangeLog7
-rw-r--r--camel/camel-filter-driver.c23
-rw-r--r--camel/camel-filter-search.c14
3 files changed, 32 insertions, 12 deletions
diff --git a/camel/ChangeLog b/camel/ChangeLog
index a5730b0f11..54763b7388 100644
--- a/camel/ChangeLog
+++ b/camel/ChangeLog
@@ -1,7 +1,14 @@
2003-02-20 Jeffrey Stedfast <fejj@ximian.com>
+ * camel-filter-search.c (run_command): Redirect program's stdout
+ and stderr to /dev/null
+
* camel-filter-driver.c (pipe_to_system): Redirect the program's
stderr to /dev/null
+ (pipe_to_system): Write the pipe to a mem stream and use the mem
+ stream in the parser. Also, when setting an exception get the
+ errno from the parser so we can give more info about the error to
+ the user.
2003-02-19 Jeffrey Stedfast <fejj@ximian.com>
diff --git a/camel/camel-filter-driver.c b/camel/camel-filter-driver.c
index c6004a38df..a9a7bb004a 100644
--- a/camel/camel-filter-driver.c
+++ b/camel/camel-filter-driver.c
@@ -42,6 +42,7 @@
#include "camel-service.h"
#include "camel-stream-fs.h"
+#include "camel-stream-mem.h"
#include "camel-mime-message.h"
#include "e-util/e-sexp.h"
@@ -645,7 +646,7 @@ pipe_to_system (struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFil
int result, status, fds[4], i;
CamelMimeMessage *message;
CamelMimeParser *parser;
- CamelStream *stream;
+ CamelStream *stream, *mem;
pid_t pid;
if (argc < 1 || argv[0]->value.string[0] == '\0')
@@ -692,9 +693,9 @@ pipe_to_system (struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFil
maxfd = sysconf (_SC_OPEN_MAX);
if (maxfd > 0) {
- for (i = 0; i < maxfd; i++) {
- if (i != STDIN_FILENO && i != STDOUT_FILENO && i != STDERR_FILENO)
- close (i);
+ for (fd = 0; fd < maxfd; fd++) {
+ if (fd != STDIN_FILENO && fd != STDOUT_FILENO && fd != STDERR_FILENO)
+ close (fd);
}
}
@@ -726,15 +727,23 @@ pipe_to_system (struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFil
camel_stream_flush (stream);
camel_object_unref (stream);
+ stream = camel_stream_fs_new_with_fd (fds[2]);
+ mem = camel_stream_mem_new ();
+ camel_stream_write_to_stream (stream, mem);
+ camel_object_unref (stream);
+ camel_stream_reset (mem);
+
parser = camel_mime_parser_new ();
- camel_mime_parser_init_with_fd (parser, fds[2]);
+ camel_mime_parser_init_with_stream (parser, mem);
camel_mime_parser_scan_from (parser, FALSE);
+ camel_object_unref (mem);
message = camel_mime_message_new ();
if (camel_mime_part_construct_from_parser ((CamelMimePart *) message, parser) == -1) {
camel_exception_setv (p->ex, CAMEL_EXCEPTION_SYSTEM,
- _("Invalid message stream received from %s"),
- argv[0]->value.string);
+ _("Invalid message stream received from %s: %s"),
+ argv[0]->value.string,
+ g_strerror (camel_mime_parser_errno (parser)));
camel_object_unref (message);
message = NULL;
} else {
diff --git a/camel/camel-filter-search.c b/camel/camel-filter-search.c
index 9a42b5e002..e0e385346b 100644
--- a/camel/camel-filter-search.c
+++ b/camel/camel-filter-search.c
@@ -519,18 +519,22 @@ run_command (struct _ESExp *f, int argc, struct _ESExpResult **argv, FilterMessa
if (!(pid = fork ())) {
/* child process */
GPtrArray *args;
- int maxfd, i;
+ int maxfd, fd, i;
- if (dup2 (in_fds[0], STDIN_FILENO) < 0)
+ fd = open ("/dev/null", O_WRONLY);
+
+ if (dup2 (in_fds[0], STDIN_FILENO) < 0 ||
+ dup2 (fd, STDOUT_FILENO) < 0 ||
+ dup2 (fd, STDERR_FILENO) < 0)
_exit (255);
setsid ();
maxfd = sysconf (_SC_OPEN_MAX);
if (maxfd > 0) {
- for (i = 0; i < maxfd; i++) {
- if (i != STDIN_FILENO && i != STDOUT_FILENO && i != STDERR_FILENO)
- close (i);
+ for (fd = 0; fd < maxfd; fd++) {
+ if (fd != STDIN_FILENO && fd != STDOUT_FILENO && fd != STDERR_FILENO)
+ close (fd);
}
}