From: Roy T. Fielding Date: Mon, 4 Aug 1997 05:42:45 +0000 (+0000) Subject: Really fix solaris -HUP problem with slack dup of sockets. Undo prior X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=39169b7b6a5eee33d0e73a8dca128b6822d52c06;p=thirdparty%2Fapache%2Fhttpd.git 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 git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/1.3@78889 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/APACHE_1_2_X/src/main/http_main.c b/APACHE_1_2_X/src/main/http_main.c index 50824f80875..11193da7a55 100644 --- a/APACHE_1_2_X/src/main/http_main.c +++ b/APACHE_1_2_X/src/main/http_main.c @@ -1971,32 +1971,6 @@ int make_child(server_rec *server_conf, int child_num) 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 @@ static int make_sock(pool *pconf, const struct sockaddr_in *server) 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 @@ static int make_sock(pool *pconf, const struct sockaddr_in *server) } } -#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 @@ void standalone_main(int argc, char **argv) } /* we've been told to restart */ + signal (SIGHUP, SIG_IGN); + signal (SIGUSR1, SIG_IGN); if (one_process) { /* not worth thinking about */