+
+ /* The new born child tar is here! */
+
+ program_name = _("tar (child)");
+
+ xdup2 (parent_pipe[PWRITE], STDOUT_FILENO, _("(child) Pipe to stdout"));
+ xclose (parent_pipe[PREAD]);
+
+ /* Check if we need a grandchild tar. This happens only if either:
+ a) we're reading stdin: to force unblocking;
+ b) the file is to be accessed by rmt: compressor doesn't know how;
+ c) the file is not a plain file. */
+
+ if (strcmp (archive_name_array[0], "-") != 0
+ && !_remdev (archive_name_array[0])
+ && is_regular_file (archive_name_array[0]))
+ {
+ /* We don't need a grandchild tar. Open the archive and lauch the
+ uncompressor. */
+
+ archive = open (archive_name_array[0], O_RDONLY | O_BINARY, MODE_RW);
+ if (archive < 0)
+ FATAL_ERROR ((0, errno, _("Cannot open archive %s"),
+ archive_name_array[0]));
+ xdup2 (archive, STDIN_FILENO, _("Archive to stdin"));
+ execlp (use_compress_program_option, use_compress_program_option,
+ "-d", (char *) 0);
+ FATAL_ERROR ((0, errno, _("Cannot exec %s"),
+ use_compress_program_option));
+ }
+
+ /* We do need a grandchild tar. */
+
+ if (pipe (child_pipe) < 0)
+ FATAL_ERROR ((0, errno, _("Cannot open pipe")));
+
+ grandchild_pid = fork ();
+ if (grandchild_pid < 0)
+ FATAL_ERROR ((0, errno, _("Child cannot fork")));
+
+ if (grandchild_pid > 0)
+ {
+ /* The child tar is still here! Launch the uncompressor. */
+
+ xdup2 (child_pipe[PREAD], STDIN_FILENO, _("((child)) Pipe to stdin"));
+ xclose (child_pipe[PWRITE]);
+ execlp (use_compress_program_option, use_compress_program_option,
+ "-d", (char *) 0);
+ FATAL_ERROR ((0, errno, _("Cannot exec %s"),
+ use_compress_program_option));
+ }
+
+ /* The new born grandchild tar is here! */
+
+ program_name = _("tar (grandchild)");
+
+ /* Prepare for unblocking the data from the archive into the uncompressor. */
+
+ xdup2 (child_pipe[PWRITE], STDOUT_FILENO, _("(grandchild) Pipe to stdout"));
+ xclose (child_pipe[PREAD]);
+
+ if (strcmp (archive_name_array[0], "-") == 0)
+ archive = STDIN_FILENO;