rbb         99/02/05 12:23:12

  Modified:    pthreads/src/main http_main.c
  Log:
  Added back the code to make the server detach from the console.
  
  Revision  Changes    Path
  1.8       +69 -0     apache-apr/pthreads/src/main/http_main.c
  
  Index: http_main.c
  ===================================================================
  RCS file: /home/cvs/apache-apr/pthreads/src/main/http_main.c,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- http_main.c       1999/02/05 20:17:20     1.7
  +++ http_main.c       1999/02/05 20:23:10     1.8
  @@ -1545,6 +1545,75 @@
       }
   }
   
  +/*****************************************************************
  + * Here follows a long bunch of generic server bookkeeping stuff...
  + */
  +
  +static void detach(void)
  +{
  +#if !defined(WIN32)
  +    int x;
  +
  +    chdir("/");
  +#if !defined(MPE) && !defined(OS2) && !defined(TPF)
  +/* 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, "%s: unable to fork new process\n", ap_server_argv0);
  +     exit(1);
  +    }
  +    RAISE_SIGSTOP(DETACH);
  +#endif
  +#ifndef NO_SETSID
  +    if ((pgrp = setsid()) == -1) {
  +     perror("setsid");
  +     fprintf(stderr, "%s: setsid failed\n", ap_server_argv0);
  +     exit(1);
  +    }
  +#elif defined(NEXT) || defined(NEWSOS)
  +    if (setpgrp(0, getpid()) == -1 || (pgrp = getpgrp(0)) == -1) {
  +     perror("setpgrp");
  +     fprintf(stderr, "%s: setpgrp or getpgrp failed\n", ap_server_argv0);
  +     exit(1);
  +    }
  +#elif defined(OS2) || defined(TPF)
  +    /* OS/2 don't support process group IDs */
  +    pgrp = getpid();
  +#elif defined(MPE)
  +    /* MPE uses negative pid for process group */
  +    pgrp = -getpid();
  +#else
  +    if ((pgrp = setpgrp(getpid(), 0)) == -1) {
  +     perror("setpgrp");
  +     fprintf(stderr, "%s: setpgrp failed\n", ap_server_argv0);
  +     exit(1);
  +    }
  +#endif
  +
  +    /* close out the standard file descriptors */
  +    if (freopen("/dev/null", "r", stdin) == NULL) {
  +     fprintf(stderr, "%s: unable to replace stdin with /dev/null: %s\n",
  +             ap_server_argv0, strerror(errno));
  +     /* continue anyhow -- note we can't close out descriptor 0 because we
  +      * have nothing to replace it with, and if we didn't have a descriptor
  +      * 0 the next file would be created with that value ... leading to
  +      * havoc.
  +      */
  +    }
  +    if (freopen("/dev/null", "w", stdout) == NULL) {
  +     fprintf(stderr, "%s: unable to replace stdout with /dev/null: %s\n",
  +             ap_server_argv0, strerror(errno));
  +    }
  +    /* stderr is a tricky one, we really want it to be the error_log,
  +     * but we haven't opened that yet.  So leave it alone for now and it'll
  +     * be reopened moments later.
  +     */
  +#endif /* ndef WIN32 */
  +}
  +
   static void set_group_privs(void)
   {
   #ifndef WIN32
  
  
  

Reply via email to