On Thu, Jan 03, 2002 at 08:28:14AM -0800, Aaron Bannert wrote: > I see no reason why this can't be implemented in apache2, and I'll > even test and commit a patch that properly implements it. :) Sorry > I can't offer much more than that. Maybe if I get some more time > later this week I can look into it, but the more surefire way to get > it in would be to provide a patch.
Here's a patch that appears to dtrt. I chose DONT_FORK as the keyword but I would happily change this or any other name to something else, just let me know. The main thing is that the patch goes in :-) Btw, the patch is against 2.0.28, I hope that is not too big of a problem; I can look into bringing it up to HEAD if desired. Thanks! lizzy:/usr/ports/www/apache2# ps -ax -o pid,ppid,pgid,command|grep httpd 297 252 252 supervise httpd 73061 297 73061 httpd -DDONT_FORK 73064 73061 73061 httpd -DDONT_FORK 73067 73061 73061 httpd -DDONT_FORK 73068 73061 73061 httpd -DDONT_FORK 73069 73061 73061 httpd -DDONT_FORK 73070 73061 73061 httpd -DDONT_FORK 73071 73061 73061 httpd -DDONT_FORK diff -ru work.dist/httpd-2_0_28/server/mpm/beos/beos.c work/httpd-2_0_28/server/mpm/beos/beos.c --- work.dist/httpd-2_0_28/server/mpm/beos/beos.c Tue Nov 6 21:29:36 2001 +++ work/httpd-2_0_28/server/mpm/beos/beos.c Fri Jan 4 15:47:09 2002 @@ -946,16 +946,19 @@ static void beos_pre_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp) { static int restart_num = 0; - int no_detach, debug; + int no_detach, dont_fork, debug; debug = ap_exists_config_define("DEBUG"); - if (debug) + if (debug) { no_detach = one_process = 1; + dont_fork = 0; + } else { one_process = ap_exists_config_define("ONE_PROCESS"); no_detach = ap_exists_config_define("NO_DETACH"); + dont_fork = ap_exists_config_define("DONT_FORK"); } /* sigh, want this only the second time around */ @@ -963,7 +966,7 @@ is_graceful = 0; if (!one_process && !no_detach) - apr_proc_detach(); + apr_proc_detach(dont_fork); server_pid = getpid(); } diff -ru work.dist/httpd-2_0_28/server/mpm/perchild/perchild.c work/httpd-2_0_28/server/mpm/perchild/perchild.c --- work.dist/httpd-2_0_28/server/mpm/perchild/perchild.c Tue Nov 6 21:29:36 2001 +++ work/httpd-2_0_28/server/mpm/perchild/perchild.c Fri Jan 4 15:49:09 2002 @@ -1327,17 +1327,20 @@ static void perchild_pre_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp) { static int restart_num = 0; - int no_detach, debug; + int no_detach, dont_fork, debug; int i; debug = ap_exists_config_define("DEBUG"); - if (debug) + if (debug) { no_detach = one_process = 1; + dont_fork = 0; + } else { one_process = ap_exists_config_define("ONE_PROCESS"); no_detach = ap_exists_config_define("NO_DETACH"); + dont_fork = ap_exists_config_define("DONT_FORK"); } /* sigh, want this only the second time around */ @@ -1345,7 +1348,7 @@ is_graceful = 0; if (!one_process && !no_detach) { - apr_proc_detach(); + apr_proc_detach(dont_fork); } my_pid = getpid(); diff -ru work.dist/httpd-2_0_28/server/mpm/prefork/prefork.c work/httpd-2_0_28/server/mpm/prefork/prefork.c --- work.dist/httpd-2_0_28/server/mpm/prefork/prefork.c Tue Nov 6 21:29:36 2001 +++ work/httpd-2_0_28/server/mpm/prefork/prefork.c Fri Jan 4 15:48:13 2002 @@ -1292,16 +1292,19 @@ static void prefork_pre_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp) { static int restart_num = 0; - int no_detach, debug; + int no_detach, dont_fork, debug; debug = ap_exists_config_define("DEBUG"); - if (debug) + if (debug) { no_detach = one_process = 1; + dont_fork = 0; + } else { no_detach = ap_exists_config_define("NO_DETACH"); one_process = ap_exists_config_define("ONE_PROCESS"); + dont_fork = ap_exists_config_define("DONT_FORK"); } /* sigh, want this only the second time around */ @@ -1309,7 +1312,7 @@ is_graceful = 0; if (!one_process && !no_detach) { - apr_proc_detach(); + apr_proc_detach(dont_fork); } parent_pid = ap_my_pid = getpid(); diff -ru work.dist/httpd-2_0_28/server/mpm/threaded/threaded.c work/httpd-2_0_28/server/mpm/threaded/threaded.c --- work.dist/httpd-2_0_28/server/mpm/threaded/threaded.c Tue Nov 6 21:29:36 2001 +++ work/httpd-2_0_28/server/mpm/threaded/threaded.c Fri Jan 4 15:41:19 2002 @@ -1359,7 +1359,7 @@ static void threaded_pre_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp) { static int restart_num = 0; - int no_detach, debug; + int no_detach, dont_fork, debug; ap_directive_t *pdir; ap_directive_t *max_clients = NULL; @@ -1401,11 +1401,14 @@ debug = ap_exists_config_define("DEBUG"); - if (debug) + if (debug) { no_detach = one_process = 1; + dont_fork = 0; + } else { no_detach = ap_exists_config_define("NO_DETACH"); + dont_fork = ap_exists_config_define("DONT_FORK"); one_process = ap_exists_config_define("ONE_PROCESS"); } @@ -1414,7 +1417,7 @@ is_graceful = 0; if (!one_process && !no_detach) { - apr_proc_detach(); + apr_proc_detach(dont_fork); } parent_pid = ap_my_pid = getpid(); } diff -ru work.dist/httpd-2_0_28/server/mpm/worker/worker.c work/httpd-2_0_28/server/mpm/worker/worker.c --- work.dist/httpd-2_0_28/server/mpm/worker/worker.c Tue Nov 6 21:29:36 2001 +++ work/httpd-2_0_28/server/mpm/worker/worker.c Fri Jan 4 15:42:01 2002 @@ -1424,7 +1424,7 @@ static void worker_pre_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp) { static int restart_num = 0; - int no_detach, debug; + int no_detach, dont_fork, debug; ap_directive_t *pdir; ap_directive_t *max_clients = NULL; @@ -1466,8 +1466,10 @@ debug = ap_exists_config_define("DEBUG"); - if (debug) + if (debug) { no_detach = one_process = 1; + dont_fork = 0; + } else { one_process = ap_exists_config_define("ONE_PROCESS"); @@ -1479,7 +1481,7 @@ is_graceful = 0; if (!one_process && !no_detach) { - apr_proc_detach(); + apr_proc_detach(dont_fork); } parent_pid = ap_my_pid = getpid(); } diff -ru work.dist/httpd-2_0_28/srclib/apr/threadproc/netware/proc.c work/httpd-2_0_28/srclib/apr/threadproc/netware/proc.c --- work.dist/httpd-2_0_28/srclib/apr/threadproc/netware/proc.c Tue Oct 23 10:29:46 2001 +++ work/httpd-2_0_28/srclib/apr/threadproc/netware/proc.c Fri Jan 4 14:20:19 +2002 @@ -345,13 +345,13 @@ } newargs[i + 2] = NULL; if (attr->detached) { - apr_proc_detach(); + apr_proc_detach(0); } execve(SHELL_PATH, (char * const *) newargs, (char * const *)env); } else { if (attr->detached) { - apr_proc_detach(); + apr_proc_detach(0); } execve(progname, (char * const *)args, (char * const *)env); } diff -ru work.dist/httpd-2_0_28/srclib/apr/threadproc/netware/procsup.c work/httpd-2_0_28/srclib/apr/threadproc/netware/procsup.c --- work.dist/httpd-2_0_28/srclib/apr/threadproc/netware/procsup.c Thu Aug 2 13:28:52 2001 +++ work/httpd-2_0_28/srclib/apr/threadproc/netware/procsup.c Fri Jan 4 14:16:37 +2002 @@ -54,7 +54,7 @@ #include "threadproc.h" -apr_status_t apr_proc_detach(void) +apr_status_t apr_proc_detach(int dont_fork) { #if 0 int x; diff -ru work.dist/httpd-2_0_28/srclib/apr/threadproc/os2/proc.c work/httpd-2_0_28/srclib/apr/threadproc/os2/proc.c --- work.dist/httpd-2_0_28/srclib/apr/threadproc/os2/proc.c Thu Oct 25 19:30:42 2001 +++ work/httpd-2_0_28/srclib/apr/threadproc/os2/proc.c Fri Jan 4 14:17:23 2002 @@ -620,7 +620,7 @@ -APR_DECLARE(apr_status_t) apr_proc_detach() +APR_DECLARE(apr_status_t) apr_proc_detach(int dont_fork) { return APR_ENOTIMPL; } diff -ru work.dist/httpd-2_0_28/srclib/apr/threadproc/unix/proc.c work/httpd-2_0_28/srclib/apr/threadproc/unix/proc.c --- work.dist/httpd-2_0_28/srclib/apr/threadproc/unix/proc.c Fri Oct 26 17:47:57 2001 +++ work/httpd-2_0_28/srclib/apr/threadproc/unix/proc.c Fri Jan 4 15:43:49 2002 @@ -347,13 +347,13 @@ } newargs[i + 2] = NULL; if (attr->detached) { - apr_proc_detach(); + apr_proc_detach(0); } execve(SHELL_PATH, (char * const *) newargs, (char * const *)env); } else { if (attr->detached) { - apr_proc_detach(); + apr_proc_detach(0); } execve(progname, (char * const *)args, (char * const *)env); } diff -ru work.dist/httpd-2_0_28/srclib/apr/threadproc/unix/procsup.c work/httpd-2_0_28/srclib/apr/threadproc/unix/procsup.c --- work.dist/httpd-2_0_28/srclib/apr/threadproc/unix/procsup.c Fri Aug 10 14:04:26 2001 +++ work/httpd-2_0_28/srclib/apr/threadproc/unix/procsup.c Fri Jan 4 14:12:29 +2002 @@ -54,7 +54,7 @@ #include "threadproc.h" -APR_DECLARE(apr_status_t) apr_proc_detach(void) +APR_DECLARE(apr_status_t) apr_proc_detach(int dont_fork) { int x; pid_t pgrp; @@ -63,14 +63,16 @@ #if !defined(MPE) && !defined(OS2) && !defined(TPF) && !defined(BEOS) /* Don't detach for MPE because child processes can't survive the death of the parent. */ - if ((x = fork()) > 0) - exit(0); - else if (x == -1) { - perror("fork"); - fprintf(stderr, "unable to fork new process\n"); - exit(1); /* we can't do anything here, so just exit. */ + if (!dont_fork) { + if ((x = fork()) > 0) + exit(0); + else if (x == -1) { + perror("fork"); + fprintf(stderr, "unable to fork new process\n"); + exit(1); /* we can't do anything here, so just exit. */ + } + /* RAISE_SIGSTOP(DETACH);*/ } -/* RAISE_SIGSTOP(DETACH);*/ #endif #if APR_HAVE_SETSID if ((pgrp = setsid()) == -1) { -- Jos Backus _/ _/_/_/ Santa Clara, CA _/ _/ _/ _/ _/_/_/ _/ _/ _/ _/ [EMAIL PROTECTED] _/_/ _/_/_/ use Std::Disclaimer;