[libvirt] [PATCH 2/7] virExec: Delay daemonizing as long as possible.

Cole Robinson crobinso at redhat.com
Mon May 4 15:45:22 UTC 2009


Daniel P. Berrange wrote:
> On Tue, Apr 28, 2009 at 11:31:52AM -0400, Cole Robinson wrote:
>> This way the caller can catch more errors (e.g. from a hook callback) from
>> the intermediate process.
>> ---
>>  src/util.c |   56 ++++++++++++++++++++++++++++----------------------------
>>  1 files changed, 28 insertions(+), 28 deletions(-)
>>
>> diff --git a/src/util.c b/src/util.c
>> index 87e215d..47a1cd3 100644
>> --- a/src/util.c
>> +++ b/src/util.c
>> @@ -445,7 +445,7 @@ __virExec(virConnectPtr conn,
>>      if (pthread_sigmask(SIG_SETMASK, &newmask, NULL) != 0) {
>>          virReportSystemError(conn, errno,
>>                               "%s", _("cannot unblock signals"));
>> -        return -1;
>> +        _exit(1);
>>      }
>>  
>>      openmax = sysconf (_SC_OPEN_MAX);
>> @@ -458,31 +458,6 @@ __virExec(virConnectPtr conn,
>>               !FD_ISSET(i, keepfd)))
>>              close(i);
>>  
>> -    if (flags & VIR_EXEC_DAEMON) {
>> -        if (setsid() < 0) {
>> -            virReportSystemError(conn, errno,
>> -                                 "%s", _("cannot become session leader"));
>> -            _exit(1);
>> -        }
>> -
>> -        if (chdir("/") < 0) {
>> -            virReportSystemError(conn, errno,
>> -                                 "%s", _("cannot change to root directory: %s"));
>> -            _exit(1);
>> -        }
>> -
>> -        pid = fork();
>> -        if (pid < 0) {
>> -            virReportSystemError(conn, errno,
>> -                                 "%s", _("cannot fork child process"));
>> -            _exit(1);
>> -        }
>> -
>> -        if (pid > 0)
>> -            _exit(0);
>> -    }
>> -
>> -
>>      if (dup2(infd >= 0 ? infd : null, STDIN_FILENO) < 0) {
>>          virReportSystemError(conn, errno,
>>                               "%s", _("failed to setup stdin file handle"));
>> @@ -513,6 +488,33 @@ __virExec(virConnectPtr conn,
>>      if (hook)
>>          if ((hook)(data) != 0)
>>              _exit(1);
>> +
>> +    /* Daemonize as late as possible, so the parent process can detect
>> +     * the above errors with wait* */
>> +    if (flags & VIR_EXEC_DAEMON) {
>> +        if (setsid() < 0) {
>> +            virReportSystemError(conn, errno,
>> +                                 "%s", _("cannot become session leader"));
>> +            _exit(1);
>> +        }
>> +
>> +        if (chdir("/") < 0) {
>> +            virReportSystemError(conn, errno,
>> +                                 "%s", _("cannot change to root directory: %s"));
>> +            _exit(1);
>> +        }
>> +
>> +        pid = fork();
>> +        if (pid < 0) {
>> +            virReportSystemError(conn, errno,
>> +                                 "%s", _("cannot fork child process"));
>> +            _exit(1);
>> +        }
>> +
>> +        if (pid > 0)
>> +            _exit(0);
>> +    }
>> +
>>      if (envp)
>>          execve(argv[0], (char **) argv, (char**)envp);
>>      else
>> @@ -524,8 +526,6 @@ __virExec(virConnectPtr conn,
>>  
>>      _exit(1);
>>  
>> -    return 0;
>> -
>>   cleanup:
>>      /* This is cleanup of parent process only - child
>>         should never jump here on error */
>> -- 
> 
> ACK
> 
> Daniel

Thanks, committed.

- Cole




More information about the libvir-list mailing list