apr-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From br...@apache.org
Subject cvs commit: apr/threadproc/win32 proc.c
Date Tue, 02 Jul 2002 22:25:53 GMT
brane       2002/07/02 15:25:52

  Modified:    threadproc/win32 proc.c
  Log:
  Reverting the 1.76 and 1.77 changes, because they didn't work.
  The child handles weren't properly inheritable, and redirected command
  output got lost in the bit bucket.
  
  Revision  Changes    Path
  1.78      +81 -56    apr/threadproc/win32/proc.c
  
  Index: proc.c
  ===================================================================
  RCS file: /home/cvs/apr/threadproc/win32/proc.c,v
  retrieving revision 1.77
  retrieving revision 1.78
  diff -u -r1.77 -r1.78
  --- proc.c	1 Jul 2002 17:43:02 -0000	1.77
  +++ proc.c	2 Jul 2002 22:25:52 -0000	1.78
  @@ -154,110 +154,135 @@
   #endif
   }
   
  +static apr_status_t make_inheritable_duplicate(apr_file_t *original,
  +                                               apr_file_t *duplicate)
  +{
  +#ifdef _WIN32_WCE
  +    return APR_ENOTIMPL;
  +#else
  +    if (original == NULL)
  +        return APR_SUCCESS;
  +
  +    /* XXX: Can't use apr_file_dup here because it creates a non-inhertible 
  +     * handle, and apr_open_file'd apr_file_t's are non-inheritable,
  +     * so we must assume we need to make an inheritable handle.
  +     */
  +    if (!CloseHandle(duplicate->filehand))
  +        return apr_get_os_error();
  +    else
  +    {
  +        HANDLE hproc = GetCurrentProcess();
  +        if (!DuplicateHandle(hproc, original->filehand, 
  +                             hproc, &duplicate->filehand, 0,
  +                             TRUE, DUPLICATE_SAME_ACCESS))
  +            return apr_get_os_error();
  +    }
  +
  +    return APR_SUCCESS;
  +#endif
  +}
  +
   APR_DECLARE(apr_status_t) apr_procattr_io_set(apr_procattr_t *attr,
                                                apr_int32_t in, 
                                                apr_int32_t out,
                                                apr_int32_t err)
   {
  -    apr_status_t stat = APR_SUCCESS;
  +    apr_status_t stat;
   
       if (in) {
           stat = open_nt_process_pipe(&attr->child_in, &attr->parent_in, in,
                                       attr->pool);
           if (stat == APR_SUCCESS)
               stat = make_handle_private(attr->parent_in);
  +        if (stat != APR_SUCCESS)
  +            return stat;
       }
  -    if (out && stat == APR_SUCCESS) {
  +    if (out) {
           stat = open_nt_process_pipe(&attr->parent_out, &attr->child_out,
out,
                                       attr->pool);
           if (stat == APR_SUCCESS)
               stat = make_handle_private(attr->parent_out);
  +        if (stat != APR_SUCCESS)
  +            return stat;
       }
  -    if (err && stat == APR_SUCCESS) {
  +    if (err) {
           stat = open_nt_process_pipe(&attr->parent_err, &attr->child_err,
err,
                                       attr->pool);
           if (stat == APR_SUCCESS)
               stat = make_handle_private(attr->parent_err);
  +        if (stat != APR_SUCCESS)
  +            return stat;
       }
  -    return stat;
  +    return APR_SUCCESS;
   }
   
   APR_DECLARE(apr_status_t) apr_procattr_child_in_set(apr_procattr_t *attr, 
                                                     apr_file_t *child_in, 
                                                     apr_file_t *parent_in)
   {
  -    apr_status_t rv = APR_SUCCESS;
  -
  -    if (child_in) {
  -        if (attr->child_in == NULL)
  -            rv = apr_file_dup(&attr->child_in, child_in, attr->pool);
  -        else
  -            rv = apr_file_dup2(attr->child_in, child_in, attr->pool);
  +    apr_status_t stat;
   
  -        if (rv == APR_SUCCESS)
  -            apr_file_inherit_set(attr->child_in);
  +    if (attr->child_in == NULL && attr->parent_in == NULL) {
  +        stat = open_nt_process_pipe(&attr->child_in, &attr->parent_in,
  +                                    APR_FULL_BLOCK,
  +                                    attr->pool);
  +        if (stat == APR_SUCCESS)
  +            stat = make_handle_private(attr->parent_in);
  +        if (stat != APR_SUCCESS)
  +            return stat;
       }
   
  -    if (parent_in && rv == APR_SUCCESS) {
  -        if (attr->parent_in == NULL)
  -            rv = apr_file_dup(&attr->parent_in, parent_in, attr->pool);
  -        else
  -            rv = apr_file_dup2(attr->parent_in, parent_in, attr->pool);
  -    }
  +    stat = make_inheritable_duplicate (child_in, attr->child_in);
  +    if (stat == APR_SUCCESS)
  +        stat = make_inheritable_duplicate (parent_in, attr->parent_in);
   
  -    return rv;
  +    return stat;
   }
   
   APR_DECLARE(apr_status_t) apr_procattr_child_out_set(apr_procattr_t *attr,
                                                      apr_file_t *child_out,
                                                      apr_file_t *parent_out)
   {
  -    apr_status_t rv = APR_SUCCESS;
  -
  -    if (child_out) {
  -        if (attr->child_out == NULL)
  -            rv = apr_file_dup(&attr->child_out, child_out, attr->pool);
  -        else
  -            rv = apr_file_dup2(attr->child_out, child_out, attr->pool);
  -
  -        if (rv == APR_SUCCESS)
  -            apr_file_inherit_set(attr->child_out);
  -    }
  +    apr_status_t stat;
   
  -    if (parent_out && rv == APR_SUCCESS) {
  -        if (attr->parent_out == NULL)
  -            rv = apr_file_dup(&attr->parent_out, parent_out, attr->pool);
  -        else
  -            rv = apr_file_dup2(attr->parent_out, parent_out, attr->pool);
  -    }
  +    if (attr->child_out == NULL && attr->parent_out == NULL) {
  +        stat = open_nt_process_pipe(&attr->child_out, &attr->parent_out,
  +                                    APR_FULL_BLOCK,
  +                                    attr->pool);
  +        if (stat == APR_SUCCESS)
  +            stat = make_handle_private(attr->parent_out);
  +        if (stat != APR_SUCCESS)
  +            return stat;
  +    }        
  +        
  +    stat = make_inheritable_duplicate (child_out, attr->child_out);
  +    if (stat == APR_SUCCESS)
  +        stat = make_inheritable_duplicate (parent_out, attr->parent_out);
   
  -    return rv;
  +    return stat;
   }
   
   APR_DECLARE(apr_status_t) apr_procattr_child_err_set(apr_procattr_t *attr,
                                                      apr_file_t *child_err,
                                                      apr_file_t *parent_err)
   {
  -    apr_status_t rv = APR_SUCCESS;
  -
  -    if (child_err) {
  -        if (attr->child_err == NULL)
  -            rv = apr_file_dup(&attr->child_err, child_err, attr->pool);
  -        else
  -            rv = apr_file_dup2(attr->child_err, child_err, attr->pool);
  +    apr_status_t stat;
   
  -        if (rv == APR_SUCCESS)
  -            apr_file_inherit_set(attr->child_err);
  -    }
  -
  -    if (parent_err && rv == APR_SUCCESS) {
  -        if (attr->parent_err == NULL)
  -            rv = apr_file_dup(&attr->parent_err, parent_err, attr->pool);
  -        else
  -            rv = apr_file_dup2(attr->parent_err, parent_err, attr->pool);
  -    }
  +    if (attr->child_err == NULL && attr->parent_err == NULL) {
  +        stat = open_nt_process_pipe(&attr->child_err, &attr->parent_err,
  +                                    APR_FULL_BLOCK,
  +                                    attr->pool);
  +        if (stat == APR_SUCCESS)
  +            stat = make_handle_private(attr->parent_err);
  +        if (stat != APR_SUCCESS)
  +            return stat;
  +    }        
  +        
  +    stat = make_inheritable_duplicate (child_err, attr->child_err);
  +    if (stat == APR_SUCCESS)
  +        stat = make_inheritable_duplicate (parent_err, attr->parent_err);
   
  -    return rv;
  +    return stat;
   }
   
   APR_DECLARE(apr_status_t) apr_procattr_dir_set(apr_procattr_t *attr,
  
  
  

Mime
View raw message