On 05/10/2012 01:50 PM, Luiz Capitulino wrote: > This fixes a bug where qemu-ga doesn't suspend the guest because it > fails to detect suspend support even when the guest does support > suspend. This happens because of the way qemu-ga fds are managed in > daemon mode. > > When starting qemu-ga with --daemon, become_daemon() will close all > standard fds. This will cause qemu-ga to end up with the following > fds (if started with 'qemu-ga --daemon'): > > 0 -> /dev/vport0p1 > 3 -> /run/qemu-ga.pid > > Then a guest-suspend-* function is issued. They call bios_supports_mode(), > which will call pipe(), and qemu-ga's fd will be: > > 0 -> /dev/vport0p1 > 1 -> pipe:[16247] > 2 -> pipe:[16247] > 3 -> /run/qemu-ga.pid Very nasty. > To solve this problem we have to reopen standard fds to /dev/null > in become_daemon(), instead of closing them. Yes, POSIX warns that applications should never call exec() with fd 0, 1, or 2 closed, at least not if the application wants the child to behave in a conforming environment. > > Signed-off-by: Luiz Capitulino > --- > qemu-ga.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/qemu-ga.c b/qemu-ga.c > index 7896565..c64bc71 100644 > --- a/qemu-ga.c > +++ b/qemu-ga.c > @@ -445,9 +445,9 @@ static void become_daemon(const char *pidfile) > goto fail; > } > > - close(STDIN_FILENO); > - close(STDOUT_FILENO); > - close(STDERR_FILENO); > + reopen_fd_to_null(STDIN_FILENO); > + reopen_fd_to_null(STDOUT_FILENO); > + reopen_fd_to_null(STDERR_FILENO); Reviewed-by: Eric Blake -- Eric Blake eblake@redhat.com +1-919-301-3266 Libvirt virtualization library http://libvirt.org