stoddard 99/10/12 12:14:04
Modified: src/lib/apr/threadproc/win32 proc.c
Log:
ap_create_process was ignoring the program name passed in on the call.
Fix some alignment problems.
Revision Changes Path
1.8 +105 -77 apache-2.0/src/lib/apr/threadproc/win32/proc.c
Index: proc.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/lib/apr/threadproc/win32/proc.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- proc.c 1999/10/12 01:09:54 1.7
+++ proc.c 1999/10/12 19:13:52 1.8
@@ -83,15 +83,15 @@
(*new)->child_err = NULL;
(*new)->currdir = NULL;
(*new)->cmdtype = APR_PROGRAM;
- (*new)->detached = TRUE;
+ (*new)->detached = TRUE;
memset(&(*new)->si, 0, sizeof((*new)->si));
- return APR_SUCCESS;
+ return APR_SUCCESS;
}
ap_status_t ap_setprocattr_io(struct procattr_t *attr, ap_int32_t in,
- ap_int32_t out, ap_int32_t err)
+ ap_int32_t out, ap_int32_t err)
{
ap_status_t stat;
if (in) {
@@ -99,7 +99,7 @@
attr->cntxt)) != APR_SUCCESS) {
return stat;
}
- }
+ }
if (out) {
if ((stat = ap_create_pipe(&attr->parent_out, &attr->child_out,
attr->cntxt)) != APR_SUCCESS) {
@@ -114,7 +114,40 @@
}
return APR_SUCCESS;
}
+#if 0
+ap_status_t ap_setprocattr_childin(struct procattr_t *attr, ap_file_t
*child_in,
+ ap_file_t *parent_in)
+{
+}
+ap_status_t ap_setprocattr_childout(struct procattr_t *attr, ap_file_t
*child_out,
+ ap_file_t *parent_out)
+{
+
+ if (attr->child_out == NULL && attr->parent_out == NULL)
+ ap_create_pipe(&attr->child_out, &attr->parent_out, attr->cntxt);
+
+ if (child_out != NULL)
+ ap_dupfile(&attr->child_out, child_out);
+
+ if (parent_out != NULL)
+ ap_dupfile(&attr->parent_out, parent_out);
+
+ return APR_SUCCESS;
+}
+ap_status_t ap_setprocattr_childerr(struct procattr_t *attr, ap_file_t
*child_err,
+ ap_file_t *parent_err)
+{
+ if (attr->child_err == NULL && attr->parent_err == NULL)
+ ap_create_pipe(&attr->child_err, &attr->parent_err, attr->cntxt);
+
+ if (child_err != NULL)
+ ap_dupfile(&attr->child_err, child_err);
+ if (parent_err != NULL)
+ ap_dupfile(&attr->parent_err, parent_err);
+ return APR_SUCCESS;
+}
+#endif
ap_status_t ap_setprocattr_dir(struct procattr_t *attr,
const char *dir)
{
@@ -132,8 +165,7 @@
return APR_SUCCESS;
}
-ap_status_t ap_setprocattr_detach(struct procattr_t *attr,
-
ap_int32_t det)
+ap_status_t ap_setprocattr_detach(struct procattr_t *attr, ap_int32_t det)
{
attr->detached = det;
return APR_SUCCESS;
@@ -151,8 +183,6 @@
char *envstr;
char *pEnvBlock, *pNext;
-
-
(*new) = (struct proc_t *)ap_palloc(cont, sizeof(struct proc_t));
if ((*new) == NULL) {
@@ -160,16 +190,16 @@
}
(*new)->cntxt = cont;
- (*new)->attr = attr;
+ (*new)->attr = attr;
- attr->si.cb = sizeof(attr->si);
+ attr->si.cb = sizeof(attr->si);
if (attr->detached) {
/* If we are creating ourselves detached, Then we should hide the
* window we are starting in. And we had better redfine our
* handles for STDIN, STDOUT, and STDERR.
*/
attr->si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
- attr->si.wShowWindow = SW_HIDE;
+ attr->si.wShowWindow = SW_HIDE;
if (attr->child_in) {
attr->si.hStdInput = attr->child_in->filehand;
@@ -183,13 +213,12 @@
attr->si.hStdError = attr->child_err->filehand;
}
}
-
- cmdline = args[0];
- i = 1;
- while (args[i]) {
- cmdline = ap_pstrcat(cont, cmdline, " ", args[i], NULL);
- i++;
- }
+ cmdline = ap_pstrdup(cont, progname);
+ i = 0;
+ while (args[i]) {
+ cmdline = ap_pstrcat(cont, cmdline, " ", args[i], NULL);
+ i++;
+ }
/*
* When the pipe handles are created, the security descriptor
* indicates that the handle can be inherited. However, we do not
@@ -204,47 +233,46 @@
*/
hCurrentProcess = GetCurrentProcess();
if ((attr->child_in && !DuplicateHandle(hCurrentProcess,
attr->parent_in->filehand,
- hCurrentProcess,
- &hParentindup, 0,
FALSE,
-
DUPLICATE_SAME_ACCESS))
+ hCurrentProcess,
+ &hParentindup, 0, FALSE,
+ DUPLICATE_SAME_ACCESS))
|| (attr->child_out && !DuplicateHandle(hCurrentProcess,
attr->parent_out->filehand,
-
hCurrentProcess, &hParentoutdup,
-
0, FALSE, DUPLICATE_SAME_ACCESS))
+ hCurrentProcess,
&hParentoutdup,
+ 0, FALSE,
DUPLICATE_SAME_ACCESS))
|| (attr->child_err && !DuplicateHandle(hCurrentProcess,
attr->parent_err->filehand,
-
hCurrentProcess, &hParenterrdup,
-
0, FALSE, DUPLICATE_SAME_ACCESS))) {
- if (attr->child_in) {
- ap_close(attr->child_in);
- ap_close(attr->parent_in);
- }
- if (attr->child_out) {
- ap_close(attr->child_out);
- ap_close(attr->parent_out);
- }
- if (attr->child_err) {
- ap_close(attr->child_err);
- ap_close(attr->parent_err);
- }
- return APR_EEXIST;
+ hCurrentProcess,
&hParenterrdup,
+ 0, FALSE,
DUPLICATE_SAME_ACCESS))) {
+ if (attr->child_in) {
+ ap_close(attr->child_in);
+ ap_close(attr->parent_in);
+ }
+ if (attr->child_out) {
+ ap_close(attr->child_out);
+ ap_close(attr->parent_out);
+ }
+ if (attr->child_err) {
+ ap_close(attr->child_err);
+ ap_close(attr->parent_err);
+ }
+ return APR_EEXIST;
}
else {
- if (attr->child_in) {
- ap_close(attr->parent_in);
- attr->parent_in->filehand = hParentindup;
- }
- if (attr->child_out) {
- ap_close(attr->parent_out);
- attr->parent_out->filehand = hParentoutdup;
- }
- if (attr->child_err) {
- ap_close(attr->parent_err);
- attr->parent_err->filehand = hParenterrdup;
- }
+ if (attr->child_in) {
+ ap_close(attr->parent_in);
+ attr->parent_in->filehand = hParentindup;
+ }
+ if (attr->child_out) {
+ ap_close(attr->parent_out);
+ attr->parent_out->filehand = hParentoutdup;
+ }
+ if (attr->child_err) {
+ ap_close(attr->parent_err);
+ attr->parent_err->filehand = hParenterrdup;
+ }
}
_itoa(_getpid(), ppid, 10);
if (env) {
-
envstr = ap_pstrcat(cont, "parentpid=", ppid, NULL);
/*
* Win32's CreateProcess call requires that the environment
@@ -272,28 +300,28 @@
else {
SetEnvironmentVariable("parentpid", ppid);
pEnvBlock = NULL;
- }
+ }
if (CreateProcess(NULL, cmdline, NULL, NULL, TRUE, 0, pEnvBlock,
attr->currdir,
- &attr->si, &(*new)->pi)) {
- if (attr->detached) {
- CloseHandle((*new)->pi.hProcess);
- }
- if (attr->child_in) {
- ap_close(attr->child_in);
- }
- if (attr->child_out) {
- ap_close(attr->child_out);
- }
- if (attr->child_err) {
- ap_close(attr->child_err);
- }
- CloseHandle((*new)->pi.hThread);
- return APR_SUCCESS;
- }
+ &attr->si, &(*new)->pi)) {
+ if (attr->detached) {
+ CloseHandle((*new)->pi.hProcess);
+ }
+ if (attr->child_in) {
+ ap_close(attr->child_in);
+ }
+ if (attr->child_out) {
+ ap_close(attr->child_out);
+ }
+ if (attr->child_err) {
+ ap_close(attr->child_err);
+ }
+ CloseHandle((*new)->pi.hThread);
+ return APR_SUCCESS;
+ }
- return GetLastError();
+ return GetLastError();
}
ap_status_t ap_get_childin(ap_file_t **new, struct proc_t *proc)
@@ -315,7 +343,7 @@
}
ap_status_t ap_wait_proc(struct proc_t *proc,
- ap_wait_how_e wait)
+ ap_wait_how_e wait)
{
pid_t stat;
if (!proc)
@@ -330,13 +358,13 @@
return APR_EEXIST;
}
if ((stat = WaitForSingleObject(proc->pi.hProcess, 0)) == WAIT_OBJECT_0)
{
- return APR_CHILD_DONE;
- }
- else if (stat == WAIT_TIMEOUT) {
- return APR_CHILD_NOTDONE;
- }
- return APR_EEXIST;
-}
+ return APR_CHILD_DONE;
+ }
+ else if (stat == WAIT_TIMEOUT) {
+ return APR_CHILD_NOTDONE;
+ }
+ return APR_EEXIST;
+}
ap_status_t ap_get_procdata(char *key, void *data, struct proc_t *proc)
{