fielding    97/08/03 22:42:47

  Modified:    src       Tag: APACHE_1_2_X  http_main.c
  Log:
  Really fix solaris -HUP problem with slack dup of sockets.  Undo prior
  change and move ap_slack after all of the rest of the socket initialization,
  which apparently is needed for SO_REUSEADDR to survive the dup on Solaris.
  Also block SIGHUP and SIGUSR1 during restart on all platforms.
  
  PR: 832
  Submitted by: Dean Gaudet
  Reviewed by:  Roy Fielding
  
  Revision  Changes    Path
  No                   revision
  
  
  No                   revision
  
  
  1.149.2.6 +35 -33    apache/src/http_main.c
  
  Index: http_main.c
  ===================================================================
  RCS file: /export/home/cvs/apache/src/http_main.c,v
  retrieving revision 1.149.2.5
  retrieving revision 1.149.2.6
  diff -u -r1.149.2.5 -r1.149.2.6
  --- http_main.c       1997/07/20 18:18:56     1.149.2.5
  +++ http_main.c       1997/08/04 05:42:45     1.149.2.6
  @@ -1971,32 +1971,6 @@
       return 0;
   }
   
  -
  -static void sock_bind (int s, const struct sockaddr_in *server)
  -{
  -#ifdef MPE
  -/* MPE requires CAP=PM and GETPRIVMODE to bind to ports less than 1024 */
  -    if (ntohs(server->sin_port) < 1024) GETPRIVMODE();
  -#endif
  -    if(bind(s, (struct sockaddr *)server,sizeof(struct sockaddr_in)) == -1)
  -    {
  -        perror("bind");
  -#ifdef MPE
  -        if (ntohs(server->sin_port) < 1024) GETUSERMODE();
  -#endif
  -     if (server->sin_addr.s_addr != htonl(INADDR_ANY))
  -         fprintf(stderr,"httpd: could not bind to address %s port %d\n",
  -                 inet_ntoa(server->sin_addr), ntohs(server->sin_port));
  -     else
  -         fprintf(stderr,"httpd: could not bind to port %d\n",
  -                 ntohs(server->sin_port));
  -        exit(1);
  -    }
  -#ifdef MPE
  -    if (ntohs(server->sin_port) < 1024) GETUSERMODE();
  -#endif
  -}
  -
   static int make_sock(pool *pconf, const struct sockaddr_in *server)
   {
       int s;
  @@ -2008,13 +1982,16 @@
           exit(1);
       }
   
  -#ifdef SOLARIS2
  -    sock_bind (s, server);
  -#endif
  -     
  +    /* Solaris (probably versions 2.4, 2.5, and 2.5.1 with various levels
  +     * of tcp patches) has some really weird bugs where if you dup the
  +     * socket now it breaks things across SIGHUP restarts.  It'll either
  +     * be unable to bind, or it won't respond.
  +     */
  +#ifndef SOLARIS2
       s = ap_slack(s, AP_SLACK_HIGH);
   
       note_cleanups_for_fd(pconf, s); /* arrange to close on exec or restart */
  +#endif
       
   #ifndef MPE
   /* MPE does not support SO_REUSEADDR and SO_KEEPALIVE */
  @@ -2061,11 +2038,34 @@
        }
       }
   
  -#ifndef SOLARIS2
  -    sock_bind (s, server);
  +#ifdef MPE
  +/* MPE requires CAP=PM and GETPRIVMODE to bind to ports less than 1024 */
  +    if (ntohs(server->sin_port) < 1024) GETPRIVMODE();
  +#endif
  +    if(bind(s, (struct sockaddr *)server,sizeof(struct sockaddr_in)) == -1)
  +    {
  +        perror("bind");
  +#ifdef MPE
  +        if (ntohs(server->sin_port) < 1024) GETUSERMODE();
  +#endif
  +     if (server->sin_addr.s_addr != htonl(INADDR_ANY))
  +         fprintf(stderr,"httpd: could not bind to address %s port %d\n",
  +                 inet_ntoa(server->sin_addr), ntohs(server->sin_port));
  +     else
  +         fprintf(stderr,"httpd: could not bind to port %d\n",
  +                 ntohs(server->sin_port));
  +        exit(1);
  +    }
  +#ifdef MPE
  +    if (ntohs(server->sin_port) < 1024) GETUSERMODE();
   #endif
  -
       listen(s, 512);
  +
  +#ifdef SOLARIS2
  +    s = ap_slack(s, AP_SLACK_HIGH);
  +
  +    note_cleanups_for_fd(pconf, s); /* arrange to close on exec or restart */
  +#endif
       return s;
   }
   
  @@ -2291,6 +2291,8 @@
        }
   
        /* we've been told to restart */
  +        signal (SIGHUP, SIG_IGN);
  +        signal (SIGUSR1, SIG_IGN);
   
        if (one_process) {
            /* not worth thinking about */
  
  
  

Reply via email to