Fyi, as an aside, when building from CVS I am seeing

    ./config.status: 765: Syntax error: "done" unexpected (expecting ")")

    The script:

    #
    # CONFIG_COMMANDS section.
    #
    for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue
      ac_dest=`echo "$ac_file" | sed 's,:.*,,'`
      ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'`

      case $ac_dest in          <- line 765
      esac
    done

    { (exit 0); exit 0; }

On Fri, Jan 04, 2002 at 04:42:24PM -0800, Aaron Bannert wrote:
> A couple things:
> 
> This looks good in concept.

Thanks!

> This will have to apply to HEAD cleanly, so please modify/test/repost.

See below. I have changed the flag to NEW_SESSID for now. I have kept the
dont_fork variable name because because it describes exactly what it does.
Also, when debug is set, I now set dont_fork to 1.  Comments?

> I'm not sure I like overloading the use of apr_proc_detach, and I'd prefer
> to see us come up with another function. I'm open to suggestions here.
> Maybe apr_proc_detach can only fork if it detects we are the process
> group leader?

I guess I could implement that, if that's the way we want to go.

> Another option would be to move the fork() out of apr_proc_detach()
> entirely.

Yes.

> DONT_FORK is misleading, since we're still going to fork() in other
> places, just not in the parent process and with the sole purpose of
> killing off the original parent. Any reason why this isn't just NEW_SESSID
> or something akin to that?

Sure, renamed accordingly.

> Given this patch I don't really see the purpose of NO_DETACH anymore, so
> maybe we could just steal that name?

Sounds good, but I'm not sure if it is a drop-in replacement. Are you thinking
of changing

        if (!one_process && !no_detach) {
            apr_proc_detach(new_sessid);
        }

to

        if (!one_process) {
            apr_proc_detach(!no_detach);
        }

?
 
Index: server/mpm/beos/beos.c
===================================================================
RCS file: /home/cvspublic/httpd-2.0/server/mpm/beos/beos.c,v
retrieving revision 1.75
diff -u -r1.75 beos.c
--- server/mpm/beos/beos.c      29 Dec 2001 23:16:23 -0000      1.75
+++ server/mpm/beos/beos.c      5 Jan 2002 05:07:12 -0000
@@ -993,16 +993,17 @@
 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)
-        no_detach = one_process = 1;
+        no_detach = dont_fork = one_process = 1;
     else
     {
         one_process = ap_exists_config_define("ONE_PROCESS");
         no_detach = ap_exists_config_define("NO_DETACH");
+        dont_fork = ap_exists_config_define("NEW_SESSID");
     }
 
     /* sigh, want this only the second time around */
@@ -1010,7 +1011,7 @@
         is_graceful = 0;
         
         if (!one_process && !no_detach)
-               apr_proc_detach();
+               apr_proc_detach(dont_fork);
 
         server_pid = getpid();
     }
Index: server/mpm/perchild/perchild.c
===================================================================
RCS file: /home/cvspublic/httpd-2.0/server/mpm/perchild/perchild.c,v
retrieving revision 1.97
diff -u -r1.97 perchild.c
--- server/mpm/perchild/perchild.c      29 Dec 2001 23:16:23 -0000      1.97
+++ server/mpm/perchild/perchild.c      5 Jan 2002 05:07:14 -0000
@@ -1425,7 +1425,7 @@
 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;
     ap_directive_t *pdir;
     int i;
     int tmp_server_limit = DEFAULT_SERVER_LIMIT;
@@ -1433,12 +1433,12 @@
 
     debug = ap_exists_config_define("DEBUG");
 
-    if (debug) {
-        no_detach = one_process = 1;
-    }
+    if (debug)
+        no_detach = dont_fork = one_process = 1;
     else {
         one_process = ap_exists_config_define("ONE_PROCESS");
         no_detach = ap_exists_config_define("NO_DETACH");
+        dont_fork = ap_exists_config_define("NEW_SESSID");
     }
 
     /* sigh, want this only the second time around */
@@ -1446,7 +1446,7 @@
         is_graceful = 0;
 
         if (!one_process && !no_detach) {
-            apr_proc_detach();
+            apr_proc_detach(dont_fork);
         }
 
         my_pid = getpid();
Index: server/mpm/prefork/prefork.c
===================================================================
RCS file: /home/cvspublic/httpd-2.0/server/mpm/prefork/prefork.c,v
retrieving revision 1.227
diff -u -r1.227 prefork.c
--- server/mpm/prefork/prefork.c        29 Dec 2001 23:16:24 -0000      1.227
+++ server/mpm/prefork/prefork.c        5 Jan 2002 05:07:15 -0000
@@ -1200,16 +1200,17 @@
 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)
-        no_detach = one_process = 1;
+        no_detach = dont_fork = one_process = 1;
     else
     {
         no_detach = ap_exists_config_define("NO_DETACH");
         one_process = ap_exists_config_define("ONE_PROCESS");
+        dont_fork = ap_exists_config_define("NEW_SESSID");
     }
 
     /* sigh, want this only the second time around */
@@ -1217,7 +1218,7 @@
        is_graceful = 0;
 
        if (!one_process && !no_detach) {
-           apr_proc_detach();
+           apr_proc_detach(dont_fork);
        }
 
        parent_pid = ap_my_pid = getpid();
Index: server/mpm/worker/worker.c
===================================================================
RCS file: /home/cvspublic/httpd-2.0/server/mpm/worker/worker.c,v
retrieving revision 1.58
diff -u -r1.58 worker.c
--- server/mpm/worker/worker.c  29 Dec 2001 23:16:24 -0000      1.58
+++ server/mpm/worker/worker.c  5 Jan 2002 05:07:16 -0000
@@ -1542,7 +1542,7 @@
                               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;
 
@@ -1585,11 +1585,12 @@
     debug = ap_exists_config_define("DEBUG");
 
     if (debug)
-        no_detach = one_process = 1;
+        no_detach = dont_fork = one_process = 1;
     else
     {
         one_process = ap_exists_config_define("ONE_PROCESS");
         no_detach = ap_exists_config_define("NO_DETACH");
+        dont_fork = ap_exists_config_define("NEW_SESSID");
     }
 
     /* sigh, want this only the second time around */
@@ -1597,7 +1598,7 @@
         is_graceful = 0;
 
         if (!one_process && !no_detach) {
-            apr_proc_detach();
+            apr_proc_detach(dont_fork);
         }
         parent_pid = ap_my_pid = getpid();
     }
Index: srclib/apr/include/apr_thread_proc.h
===================================================================
RCS file: /home/cvspublic/apr/include/apr_thread_proc.h,v
retrieving revision 1.78
diff -u -r1.78 apr_thread_proc.h
--- srclib/apr/include/apr_thread_proc.h        27 Dec 2001 17:02:59 -0000      1.78
+++ srclib/apr/include/apr_thread_proc.h        5 Jan 2002 05:07:17 -0000
@@ -552,7 +552,7 @@
 /**
  * Detach the process from the controlling terminal.
  */
-APR_DECLARE(apr_status_t) apr_proc_detach(void);
+APR_DECLARE(apr_status_t) apr_proc_detach(int dont_fork);
 
 #if APR_HAS_OTHER_CHILD
 
Index: srclib/apr/threadproc/netware/proc.c
===================================================================
RCS file: /home/cvspublic/apr/threadproc/netware/proc.c,v
retrieving revision 1.3
diff -u -r1.3 proc.c
--- srclib/apr/threadproc/netware/proc.c        23 Oct 2001 17:30:08 -0000      1.3
+++ srclib/apr/threadproc/netware/proc.c        5 Jan 2002 05:07:18 -0000
@@ -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);
         }
Index: srclib/apr/threadproc/netware/procsup.c
===================================================================
RCS file: /home/cvspublic/apr/threadproc/netware/procsup.c,v
retrieving revision 1.1
diff -u -r1.1 procsup.c
--- srclib/apr/threadproc/netware/procsup.c     2 Aug 2001 20:29:14 -0000       1.1
+++ srclib/apr/threadproc/netware/procsup.c     5 Jan 2002 05:07:18 -0000
@@ -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;
@@ -64,14 +64,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) {
Index: srclib/apr/threadproc/os2/proc.c
===================================================================
RCS file: /home/cvspublic/apr/threadproc/os2/proc.c,v
retrieving revision 1.47
diff -u -r1.47 proc.c
--- srclib/apr/threadproc/os2/proc.c    26 Oct 2001 02:31:04 -0000      1.47
+++ srclib/apr/threadproc/os2/proc.c    5 Jan 2002 05:07:19 -0000
@@ -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;
 }
Index: srclib/apr/threadproc/unix/proc.c
===================================================================
RCS file: /home/cvspublic/apr/threadproc/unix/proc.c,v
retrieving revision 1.53
diff -u -r1.53 proc.c
--- srclib/apr/threadproc/unix/proc.c   11 Nov 2001 05:51:00 -0000      1.53
+++ srclib/apr/threadproc/unix/proc.c   5 Jan 2002 05:07:19 -0000
@@ -362,13 +362,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);
         }
Index: srclib/apr/threadproc/unix/procsup.c
===================================================================
RCS file: /home/cvspublic/apr/threadproc/unix/procsup.c,v
retrieving revision 1.33
diff -u -r1.33 procsup.c
--- srclib/apr/threadproc/unix/procsup.c        28 Dec 2001 19:03:48 -0000      1.33
+++ srclib/apr/threadproc/unix/procsup.c        5 Jan 2002 05:07:19 -0000
@@ -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
 #ifdef HAVE_SETSID
     if ((pgrp = setsid()) == -1) {

-- 
Jos Backus                 _/  _/_/_/        Santa Clara, CA
                          _/  _/   _/
                         _/  _/_/_/             
                    _/  _/  _/    _/
[EMAIL PROTECTED]     _/_/   _/_/_/            use Std::Disclaimer;

Reply via email to