summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2008-11-04 09:14:58 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2008-11-04 09:14:58 +0000
commit8fe2a9c3c458ef7205254f25e06ca5aa28bcb0f2 (patch)
treec80e389f266feccf6a633a0eb6a3b06cf3273efe
parent36281e03695b974e5b836d9d3e66d1a117dcecf5 (diff)
Tunnel stderr.
-rw-r--r--src/main.c55
-rw-r--r--src/sphinx.h1
2 files changed, 49 insertions, 7 deletions
diff --git a/src/main.c b/src/main.c
index 124aa26..000b1b9 100644
--- a/src/main.c
+++ b/src/main.c
@@ -411,6 +411,8 @@ execute_command_dlg (GtkAction *action, sphinx_t *sphinx)
gtk_widget_show (w);
w = gtk_entry_new ();
+ if (sphinx->last_command)
+ gtk_entry_set_text (GTK_ENTRY (w), sphinx->last_command);
gtk_entry_set_activates_default (GTK_ENTRY (w), TRUE);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), w,
FALSE, FALSE, 0);
@@ -962,13 +964,42 @@ done:
}
static gboolean
+stderr_read (GIOChannel *io, GIOCondition cond)
+{
+ int fd;
+
+ fd = g_io_channel_unix_get_fd (io);
+ do {
+ char buf[4096];
+ int len;
+
+ len = read (fd, buf, sizeof (buf));
+ if (len <= 0) {
+ int err = len ? errno : 0;
+ switch (err) {
+ case EAGAIN:
+ case EINTR:
+ return TRUE;
+ default:
+ g_io_channel_unref (io);
+ return FALSE;
+ }
+ }
+
+ buf[len] = '\0';
+ g_printerr ("%s", buf);
+ } while (TRUE);
+}
+
+static gboolean
sphinx_trace_command (sphinx_t *sphinx, const char *command, GError **error)
{
- gint output;
+ gint stdout_fd, stderr_fd;
GtkTextIter start, stop;
long flags;
char **argv, **argv0;
int argc;
+ GIOChannel *io;
gchar *str;
if (! g_shell_parse_argv (command, &argc, &argv, error))
@@ -981,10 +1012,9 @@ sphinx_trace_command (sphinx_t *sphinx, const char *command, GError **error)
g_free (argv);
if (! g_spawn_async_with_pipes (NULL, argv0, NULL,
- G_SPAWN_SEARCH_PATH |
- G_SPAWN_STDERR_TO_DEV_NULL,
+ G_SPAWN_SEARCH_PATH,
NULL, NULL, NULL,
- NULL, &output, NULL,
+ NULL, &stdout_fd, &stderr_fd,
error))
{
g_strfreev (argv0);
@@ -1002,6 +1032,9 @@ sphinx_trace_command (sphinx_t *sphinx, const char *command, GError **error)
str);
g_free (str);
+ g_free (sphinx->last_command);
+ sphinx->last_command = g_strdup (command);
+
g_free (sphinx->trace_name);
sphinx->trace_name = g_strdup (command);
@@ -1009,13 +1042,21 @@ sphinx_trace_command (sphinx_t *sphinx, const char *command, GError **error)
gtk_text_buffer_delete (GTK_TEXT_BUFFER (sphinx->buffer), &start, &stop);
gtk_source_buffer_remove_source_marks (sphinx->buffer, &start, &stop, NULL);
- flags = fcntl (output, F_GETFL);
+ flags = fcntl (stdout_fd, F_GETFL);
if ((flags & O_NONBLOCK) == 0)
- fcntl (output, F_SETFL, flags | O_NONBLOCK);
+ fcntl (stdout_fd, F_SETFL, flags | O_NONBLOCK);
- sphinx->trace_io = g_io_channel_unix_new (output);
+ sphinx->trace_io = g_io_channel_unix_new (stdout_fd);
g_io_add_watch (sphinx->trace_io,
G_IO_IN | G_IO_HUP, (GIOFunc) trace_read, sphinx);
+
+ flags = fcntl (stderr_fd, F_GETFL);
+ if ((flags & O_NONBLOCK) == 0)
+ fcntl (stderr_fd, F_SETFL, flags | O_NONBLOCK);
+
+ io = g_io_channel_unix_new (stderr_fd);
+ g_io_add_watch (io, G_IO_IN | G_IO_HUP, (GIOFunc) stderr_read, NULL);
+
return TRUE;
}
diff --git a/src/sphinx.h b/src/sphinx.h
index 23c70b3..e6fa306 100644
--- a/src/sphinx.h
+++ b/src/sphinx.h
@@ -35,6 +35,7 @@ typedef struct _sphinx {
cairo_script_interpreter_t *csi;
gchar *trace_name;
+ gchar *last_command;
GtkWidget *tv;
GtkSourceBuffer *buffer;