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,