guestfs___print_timestamped_argv (g, (const char **)g->cmdline);
if (!g->direct) {
- /* Set up stdin, stdout. */
+ /* Set up stdin, stdout, stderr. */
close (0);
close (1);
close (wfd[1]);
close (rfd[0]);
+ /* Stdin. */
if (dup (wfd[0]) == -1) {
dup_failed:
perror ("dup failed");
_exit (EXIT_FAILURE);
}
+ /* Stdout. */
+ if (dup (rfd[1]) == -1)
+ goto dup_failed;
+
+ /* Particularly since qemu 0.15, qemu spews all sorts of debug
+ * information on stderr. It is useful to both capture this and
+ * not confuse casual users, so send stderr to the pipe as well.
+ */
+ close (2);
if (dup (rfd[1]) == -1)
goto dup_failed;
close (rfd[1]);
}
-#if 0
- /* Set up a new process group, so we can signal this process
- * and all subprocesses (eg. if qemu is really a shell script).
- */
- setpgid (0, 0);
-#endif
+ /* Put qemu in a new process group. */
+ if (g->pgroup)
+ setpgid (0, 0);
setenv ("LC_ALL", "C", 1);
pid_t qemu_pid = g->pid;
pid_t parent_pid = getppid ();
+ /* It would be nice to be able to put this in the same process
+ * group as qemu (ie. setpgid (0, qemu_pid)). However this is
+ * not possible because we don't have any guarantee here that
+ * the qemu process has started yet.
+ */
+ if (g->pgroup)
+ setpgid (0, 0);
+
/* Writing to argv is hideously complicated and error prone. See:
* http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/backend/utils/misc/ps_status.c?rev=1.33.2.1;content-type=text%2Fplain
*/