+/* Used to handle "<!" (execute command and inline result). */
+static int
+execute_and_inline (const char *cmd, int global_exit_on_error)
+{
+ FILE *pp;
+ char *line = NULL;
+ size_t len = 0;
+ ssize_t n;
+ int exit_on_error;
+ struct parsed_command pcmd;
+
+ pp = popen (cmd, "r");
+ if (!pp) {
+ perror ("popen");
+ return -1;
+ }
+
+ while ((n = getline (&line, &len, pp)) != -1) {
+ exit_on_error = global_exit_on_error;
+
+ /* Chomp final line ending which parse_command_line would not expect. */
+ if (n > 0 && line[n-1] == '\n')
+ line[n-1] = '\0';
+
+ pcmd = parse_command_line (line, &exit_on_error);
+ if (pcmd.status == -1 && exit_on_error)
+ exit (EXIT_FAILURE);
+ if (pcmd.status == 1) {
+ if (issue_command (pcmd.cmd, pcmd.argv, pcmd.pipe, exit_on_error) == -1) {
+ if (exit_on_error) exit (EXIT_FAILURE);
+ }
+ }
+ }
+
+ free (line);
+
+ if (pclose (pp) == -1) {
+ perror ("pclose");
+ return -1;
+ }
+
+ return 0;
+}
+