summaryrefslogtreecommitdiff
path: root/threadproc/win32/proc.c
diff options
context:
space:
mode:
authorwrowe <wrowe@13f79535-47bb-0310-9956-ffa450edef68>2002-07-03 00:23:39 +0000
committerwrowe <wrowe@13f79535-47bb-0310-9956-ffa450edef68>2002-07-03 00:23:39 +0000
commit4be43ecad43ad80f8c0a029395db129a86d0b883 (patch)
tree42d87bcc1bae2476b3d42626bb30383f60e84b25 /threadproc/win32/proc.c
parent3f14d5295684d8ad7f137a5ccda928685f57f8bc (diff)
downloadlibapr-4be43ecad43ad80f8c0a029395db129a86d0b883.tar.gz
NEVER roll back more than one patch at a time. Reverting commit 1.78
which reverted 1.76 plus 1.77 ... this code is now restored to 1.77. This code should now behave as expected, since the include/arch/win32 flavor of inherit.h now makes handles inheritable. git-svn-id: http://svn.apache.org/repos/asf/apr/apr/trunk@63557 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'threadproc/win32/proc.c')
-rw-r--r--threadproc/win32/proc.c137
1 files changed, 56 insertions, 81 deletions
diff --git a/threadproc/win32/proc.c b/threadproc/win32/proc.c
index 895da48a2..ffee9e799 100644
--- a/threadproc/win32/proc.c
+++ b/threadproc/win32/proc.c
@@ -154,135 +154,110 @@ static apr_status_t make_handle_private(apr_file_t *file)
#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_status_t stat = APR_SUCCESS;
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) {
+ if (out && stat == APR_SUCCESS) {
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) {
+ if (err && stat == APR_SUCCESS) {
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 APR_SUCCESS;
+ return stat;
}
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 stat;
+ apr_status_t rv = APR_SUCCESS;
- 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 (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);
+
+ if (rv == APR_SUCCESS)
+ apr_file_inherit_set(attr->child_in);
}
- stat = make_inheritable_duplicate (child_in, attr->child_in);
- if (stat == APR_SUCCESS)
- stat = make_inheritable_duplicate (parent_in, attr->parent_in);
+ 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);
+ }
- return stat;
+ return rv;
}
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 stat;
+ apr_status_t rv = APR_SUCCESS;
- 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);
+ 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);
- return stat;
+ if (rv == APR_SUCCESS)
+ apr_file_inherit_set(attr->child_out);
+ }
+
+ 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);
+ }
+
+ return rv;
}
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 stat;
+ apr_status_t rv = APR_SUCCESS;
- 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);
+ 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);
- return 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);
+ }
+
+ return rv;
}
APR_DECLARE(apr_status_t) apr_procattr_dir_set(apr_procattr_t *attr,