gboolean mcview_load_command_output (WView * view, const char *command) { mc_pipe_t *p; GError *error = NULL; mcview_close_datasource (view); p = mc_popen (command, &error); if (p == NULL) { mcview_display (view); mcview_show_error (view, error->message); g_error_free (error); return FALSE; } /* Check if filter produced any output */ mcview_set_datasource_stdio_pipe (view, p); if (!mcview_get_byte (view, 0, NULL)) { mcview_close_datasource (view); mcview_display (view); return FALSE; } return TRUE; }
gboolean mcview_load_command_output (mcview_t * view, const char *command) { FILE *fp; mcview_close_datasource (view); open_error_pipe (); fp = popen (command, "r"); if (fp == NULL) { /* Avoid two messages. Message from stderr has priority. */ mcview_display (view); if (!close_error_pipe (mcview_is_in_panel (view) ? -1 : D_ERROR, NULL)) mcview_show_error (view, _("Cannot spawn child process")); return FALSE; } /* First, check if filter produced any output */ mcview_set_datasource_stdio_pipe (view, fp); if (!mcview_get_byte (view, 0, NULL)) { mcview_close_datasource (view); /* Avoid two messages. Message from stderr has priority. */ mcview_display (view); if (!close_error_pipe (mcview_is_in_panel (view) ? -1 : D_ERROR, NULL)) mcview_show_error (view, _("Empty output from child filter")); return FALSE; } else { /* * At least something was read correctly. Close stderr and let * program die if it will try to write something there. * * Ideally stderr should be read asynchronously to prevent programs * from blocking (poll/select multiplexor). */ close_error_pipe (D_NORMAL, NULL); } return TRUE; }