You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by wr...@apache.org on 2001/10/04 07:48:25 UTC
cvs commit: apache-1.3/src/modules/standard mod_mime_magic.c
wrowe 01/10/03 22:48:25
Modified: src/modules/standard mod_mime_magic.c
Log:
Should work, no change for non-win32, and use an appropriate, simple
port of the complex code from ap_call_exec for Win32
Revision Changes Path
1.44 +49 -15 apache-1.3/src/modules/standard/mod_mime_magic.c
Index: mod_mime_magic.c
===================================================================
RCS file: /home/cvs/apache-1.3/src/modules/standard/mod_mime_magic.c,v
retrieving revision 1.43
retrieving revision 1.44
diff -u -r1.43 -r1.44
--- mod_mime_magic.c 2001/08/21 12:46:00 1.43
+++ mod_mime_magic.c 2001/10/04 05:48:24 1.44
@@ -131,8 +131,9 @@
#include "http_log.h"
#include "http_protocol.h"
+#ifndef WIN32
#include <utime.h>
-
+#endif
/*
* data structures and related constants
@@ -2146,31 +2147,64 @@
static int uncompress_child(void *data, child_info *pinfo)
{
struct uncompress_parms *parm = data;
- char *new_argv[4];
+#ifndef WIN32
+ char *new_argv[4];
- new_argv[0] = compr[parm->method].argv[0];
- new_argv[1] = compr[parm->method].argv[1];
- new_argv[2] = parm->r->filename;
- new_argv[3] = NULL;
-
-#if defined(WIN32)
- int child_pid;
-#endif
+ new_argv[0] = compr[parm->method].argv[0];
+ new_argv[1] = compr[parm->method].argv[1];
+ new_argv[2] = parm->r->filename;
+ new_argv[3] = NULL;
if (compr[parm->method].silent) {
close(STDERR_FILENO);
}
-#if defined(WIN32)
- child_pid = spawnvp(compr[parm->method].argv[0],
- new_argv);
- return (child_pid);
-#else
execvp(compr[parm->method].argv[0], new_argv);
ap_log_rerror(APLOG_MARK, APLOG_ERR, parm->r,
MODNAME ": could not execute `%s'.",
compr[parm->method].argv[0]);
return -1;
+#else
+ char *pCommand;
+ STARTUPINFO si;
+ PROCESS_INFORMATION pi;
+ pid_t pid;
+
+ memset(&si, 0, sizeof(si));
+ memset(&pi, 0, sizeof(pi));
+
+ pid = -1;
+
+ /*
+ * Look at the arguments...
+ */
+ pCommand = ap_pstrcat(parm->r->pool, compr[parm->method].argv[0], " ",
+ compr[parm->method].argv[1], " \"",
+ parm->r->filename, "\"", NULL);
+
+ /*
+ * Make child process use hPipeOutputWrite as standard out,
+ * and make sure it does not show on screen.
+ */
+ si.cb = sizeof(si);
+ si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
+ si.wShowWindow = SW_HIDE;
+ si.hStdInput = pinfo->hPipeInputRead;
+ si.hStdOutput = pinfo->hPipeOutputWrite;
+ si.hStdError = pinfo->hPipeErrorWrite;
+
+ if (CreateProcess(NULL, pCommand, NULL, NULL, TRUE, 0, NULL,
+ ap_make_dirstr_parent(parm->r->pool, parm->r->filename),
+ &si, &pi)) {
+ pid = pi.dwProcessId;
+ /*
+ * We must close the handles to the new process and its main thread
+ * to prevent handle and memory leaks.
+ */
+ CloseHandle(pi.hProcess);
+ CloseHandle(pi.hThread);
+ }
+ return (pid);
#endif
}