diff options
-rw-r--r-- | generator/generator_actions.ml | 19 | ||||
-rw-r--r-- | src/guestfs-internal.h | 2 | ||||
-rw-r--r-- | src/guestfs.c | 13 | ||||
-rw-r--r-- | src/launch.c | 17 |
4 files changed, 45 insertions, 6 deletions
diff --git a/generator/generator_actions.ml b/generator/generator_actions.ml index 1ccacdb8..87c934aa 100644 --- a/generator/generator_actions.ml +++ b/generator/generator_actions.ml @@ -1526,6 +1526,25 @@ advice before using trademarks in applications. =back"); + ("set_pgroup", (RErr, [Bool "pgroup"], []), -1, [FishAlias "pgroup"], + [], + "set process group flag", + "\ +If C<pgroup> is true, child processes are placed into +their own process group. + +The practical upshot of this is that signals like C<SIGINT> (from +users pressing C<^C>) won't be received by the child process. + +The default for this flag is false, because usually you want +C<^C> to kill the subprocess."); + + ("get_pgroup", (RBool "pgroup", [], []), -1, [], + [], + "get process group flag", + "\ +This returns the process group flag."); + ] (* daemon_functions are any functions which cause some action diff --git a/src/guestfs-internal.h b/src/guestfs-internal.h index 96f81525..e2ffdf30 100644 --- a/src/guestfs-internal.h +++ b/src/guestfs-internal.h @@ -170,6 +170,8 @@ struct guestfs_h int selinux; /* selinux enabled? */ + int pgroup; /* Create process group for children? */ + char *last_error; int last_errnum; /* errno, or 0 if there was no errno */ diff --git a/src/guestfs.c b/src/guestfs.c index b02bdb9d..e2b71594 100644 --- a/src/guestfs.c +++ b/src/guestfs.c @@ -801,6 +801,19 @@ guestfs__get_attach_method (guestfs_h *g) return ret; } +int +guestfs__set_pgroup (guestfs_h *g, int v) +{ + g->pgroup = !!v; + return 0; +} + +int +guestfs__get_pgroup (guestfs_h *g) +{ + return g->pgroup; +} + /* Note the private data area is allocated lazily, since the vast * majority of callers will never use it. This means g->pda is * likely to be NULL. diff --git a/src/launch.c b/src/launch.c index 0b15ce98..1a47363d 100644 --- a/src/launch.c +++ b/src/launch.c @@ -643,12 +643,9 @@ launch_appliance (guestfs_h *g) 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); @@ -677,6 +674,14 @@ launch_appliance (guestfs_h *g) 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 */ |