rse 98/05/28 04:09:47
Modified: src CHANGES
src/modules/standard mod_rewrite.c mod_rewrite.h
Log:
Upgrade the child spawning code in mod_rewrite for the RewriteMap programs:
ap_spawn_child_err() is used and the Win32 case now uses CreateProcess()
instead of a low-level execl() (which caused problems in the past under
Win32).
Reviewed by: Ben Laurie
Revision Changes Path
1.869 +6 -0 apache-1.3/src/CHANGES
Index: CHANGES
===================================================================
RCS file: /export/home/cvs/apache-1.3/src/CHANGES,v
retrieving revision 1.868
retrieving revision 1.869
diff -u -r1.868 -r1.869
--- CHANGES 1998/05/28 10:57:56 1.868
+++ CHANGES 1998/05/28 11:09:44 1.869
@@ -1,4 +1,10 @@
Changes with Apache 1.3b8
+
+ *) Upgrade the child spawning code in mod_rewrite for the RewriteMap
+ programs: ap_spawn_child_err() is used and the Win32 case now uses
+ CreateProcess() instead of a low-level execl() (which caused problems in
+ the past under Win32).
+ [Ralf S. Engelschall]
*) A few cosmetics and trivial enhancements to APXS to make the
generated Makefile more user friendly. [Ralf S. Engelschall]
1.108 +40 -6 apache-1.3/src/modules/standard/mod_rewrite.c
Index: mod_rewrite.c
===================================================================
RCS file: /export/home/cvs/apache-1.3/src/modules/standard/mod_rewrite.c,v
retrieving revision 1.107
retrieving revision 1.108
diff -u -r1.107 -r1.108
--- mod_rewrite.c 1998/05/27 14:01:38 1.107
+++ mod_rewrite.c 1998/05/28 11:09:45 1.108
@@ -3127,6 +3127,7 @@
rewrite_server_conf *conf;
FILE *fpin;
FILE *fpout;
+ FILE *fperr;
array_header *rewritemaps;
rewritemap_entry *entries;
rewritemap_entry *map;
@@ -3154,16 +3155,18 @@
continue;
fpin = NULL;
fpout = NULL;
- rc = spawn_child(p, rewritemap_program_child, (void *)map->datafile,
- kill_after_timeout, &fpin, &fpout);
+ rc = ap_spawn_child_err(p, rewritemap_program_child,
+ (void *)map->datafile, kill_after_timeout,
+ &fpin, &fpout, &fperr);
if (rc == 0 || fpin == NULL || fpout == NULL) {
- perror("spawn_child");
+ perror("ap_spawn_child");
fprintf(stderr, "mod_rewrite: "
"could not fork child for RewriteMap process\n");
exit(1);
}
map->fpin = fileno(fpin);
map->fpout = fileno(fpout);
+ map->fperr = fileno(fperr);
}
return;
}
@@ -3173,17 +3176,48 @@
{
int child_pid = 1;
+ /*
+ * Prepare for exec
+ */
ap_cleanup_for_exec();
#ifdef SIGHUP
signal(SIGHUP, SIG_IGN);
#endif
+
+ /*
+ * Exec() the child program
+ */
#if defined(WIN32)
- child_pid = spawnl(_P_NOWAIT, SHELL_PATH, SHELL_PATH,
- "/c", (char *)cmd, NULL);
+ /* MS Windows */
+ {
+ char *pCommand;
+ STARTUPINFO si;
+ PROCESS_INFORMATION pi;
+
+ pCommand = strcat(SHELL_PATH, " /C ", cmd, NULL);
+
+ memset(&si, 0, sizeof(si));
+ memset(&pi, 0, sizeof(pi));
+
+ si.cb = sizeof(si);
+ si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
+ si.wShowWindow = SW_HIDE;
+ si.hStdInput = pinfo->hPipeInputRead;
+ si.hStdOutput = pinfo->hPipeOutputWrite;
+ si.hStdError = pinfo->hPipeErrorWrite;
+
+ if (CreateProcess(NULL, pCommand, NULL, NULL, TRUE, 0,
+ environ, NULL, &si, &pi)) {
+ CloseHandle(pi.hProcess);
+ CloseHandle(pi.hThread);
+ child_pid = pi.dwProcessId;
+ }
+ }
#elif defined(__EMX__)
- /* OS/2 needs a '/' */
+ /* IBM OS/2 */
execl(SHELL_PATH, SHELL_PATH, "/c", (char *)cmd, NULL);
#else
+ /* Standard Unix */
execl(SHELL_PATH, SHELL_PATH, "-c", (char *)cmd, NULL);
#endif
return(child_pid);
1.52 +1 -0 apache-1.3/src/modules/standard/mod_rewrite.h
Index: mod_rewrite.h
===================================================================
RCS file: /export/home/cvs/apache-1.3/src/modules/standard/mod_rewrite.h,v
retrieving revision 1.51
retrieving revision 1.52
diff -u -r1.51 -r1.52
--- mod_rewrite.h 1998/05/20 15:34:27 1.51
+++ mod_rewrite.h 1998/05/28 11:09:46 1.52
@@ -252,6 +252,7 @@
int type; /* the type of the map */
int fpin; /* in file pointer for program maps */
int fpout; /* out file pointer for program maps */
+ int fperr; /* err file pointer for program maps */
char *(*func)(request_rec *, /* function pointer for internal maps */
char *);
} rewritemap_entry;