dgaudet 97/06/21 15:27:13
Modified: src http_config.c http_main.c Log: That last fix didn't quite fix the USR1 problem. This one seems to. Eliminate all the "listeners == NULL" code by making sure there's always at least one listener, the default one. This gets rid of some code duplication. Revision Changes Path 1.50 +22 -1 apache/src/http_config.c Index: http_config.c =================================================================== RCS file: /export/home/cvs/apache/src/http_config.c,v retrieving revision 1.49 retrieving revision 1.50 diff -C3 -r1.49 -r1.50 *** http_config.c 1997/05/15 23:39:20 1.49 --- http_config.c 1997/06/21 22:27:10 1.50 *************** *** 1074,1079 **** --- 1074,1099 ---- return s; } + + static void default_listeners(pool *p, server_rec *s) + { + listen_rec *new; + + if (listeners != NULL) { + return; + } + /* allocate a default listener */ + new = pcalloc(p, sizeof(listen_rec)); + new->local_addr.sin_family = AF_INET; + new->local_addr.sin_addr.s_addr = htonl(INADDR_ANY); + new->local_addr.sin_port = htons(s->port); + new->fd = -1; + new->used = 0; + new->next = NULL; + listeners = new; + } + + server_rec *read_config(pool *p, pool *ptemp, char *confname) { server_rec *s = init_server_config(p); *************** *** 1088,1098 **** process_resource_config (s, s->access_confname, p, ptemp); fixup_virtual_hosts (p, s); for (m = top_module; m; m = m->next) if (m->init) (*m->init) (s, p); ! return s; } --- 1108,1119 ---- process_resource_config (s, s->access_confname, p, ptemp); fixup_virtual_hosts (p, s); + default_listeners (p, s); for (m = top_module; m; m = m->next) if (m->init) (*m->init) (s, p); ! return s; } 1.157 +76 -127 apache/src/http_main.c Index: http_main.c =================================================================== RCS file: /export/home/cvs/apache/src/http_main.c,v retrieving revision 1.156 retrieving revision 1.157 diff -C3 -r1.156 -r1.157 *** http_main.c 1997/06/21 20:48:14 1.156 --- http_main.c 1997/06/21 22:27:11 1.157 *************** *** 1894,1944 **** static listen_rec *old_listeners; static void copy_listeners(pool *p) ! { listen_rec *lr; assert(old_listeners == NULL); ! for(lr=listeners ; lr ; lr=lr->next) ! { ! listen_rec *nr=malloc(sizeof *nr); if (nr == NULL) { ! fprintf (stderr, "Ouch! malloc failed in copy_listeners()\n"); ! exit (1); } ! *nr=*lr; ! kill_cleanups_for_socket(p,nr->fd); ! nr->next=old_listeners; assert(!nr->used); ! old_listeners=nr; ! } } static int find_listener(listen_rec *lr) ! { listen_rec *or; ! for(or=old_listeners ; or ; or=or->next) ! if(!memcmp(&or->local_addr,&lr->local_addr,sizeof or->local_addr)) ! { ! or->used=1; return or->fd; ! } ! return -1; } static void close_unused_listeners() ! { ! listen_rec *or,*next; ! for(or=old_listeners ; or ; or=next) ! { ! next=or->next; ! if(!or->used) closesocket(or->fd); free(or); - } - old_listeners=NULL; } static int s_iInitCount = 0; --- 1894,1944 ---- static listen_rec *old_listeners; static void copy_listeners(pool *p) ! { listen_rec *lr; assert(old_listeners == NULL); ! for (lr = listeners; lr; lr = lr->next) { ! listen_rec *nr = malloc(sizeof *nr); if (nr == NULL) { ! fprintf (stderr, "Ouch! malloc failed in copy_listeners()\n"); ! exit (1); } ! *nr = *lr; ! kill_cleanups_for_socket(p, nr->fd); ! nr->next = old_listeners; assert(!nr->used); ! old_listeners = nr; } + } + static int find_listener(listen_rec *lr) ! { listen_rec *or; ! for (or = old_listeners; or; or = or->next) { ! if (!memcmp(&or->local_addr, &lr->local_addr, sizeof(or->local_addr))) { ! or->used = 1; return or->fd; ! } } + return -1; + } + static void close_unused_listeners() ! { ! listen_rec *or, *next; ! for (or = old_listeners; or; or = next) { ! next = or->next; ! if (!or->used) closesocket(or->fd); free(or); } + old_listeners = NULL; + } static int s_iInitCount = 0; *************** *** 2019,2024 **** --- 2019,2025 ---- #endif struct sockaddr sa_server; struct sockaddr sa_client; + listen_rec *lr; csd = -1; dupped_csd = -1; *************** *** 2090,2101 **** (void)update_child_status(child_num, SERVER_READY, (request_rec*)NULL); - if (listeners == NULL) { - FD_ZERO(&listenfds); - FD_SET(sd, &listenfds); - listenmaxfd = sd; - } - /* * Wait for an acceptable connection to arrive. */ --- 2091,2096 ---- *************** *** 2122,2133 **** if (srv <= 0) continue; ! if (listeners != NULL) { ! for (sd = listenmaxfd; sd >= 0; sd--) ! if (FD_ISSET(sd, &main_fds)) break; ! if (sd < 0) ! continue; } /* if we accept() something we don't want to die, so we have to * defer the exit --- 2117,2127 ---- if (srv <= 0) continue; ! for (lr = listeners; lr; lr = lr->next) { ! if (FD_ISSET(lr->fd, &main_fds)) break; } + if (lr == NULL) continue; + sd = lr->fd; /* if we accept() something we don't want to die, so we have to * defer the exit *************** *** 2338,2348 **** void standalone_main(int argc, char **argv) { struct sockaddr_in sa_server; - int saved_sd; int remaining_children_to_start; standalone = 1; ! sd = listenmaxfd = -1; is_graceful = 0; ++generation; --- 2332,2342 ---- void standalone_main(int argc, char **argv) { struct sockaddr_in sa_server; int remaining_children_to_start; + listen_rec *lr; standalone = 1; ! listenmaxfd = -1; is_graceful = 0; ++generation; *************** *** 2351,2357 **** do { copy_listeners(pconf); - saved_sd = sd; if (!is_graceful) { restart_time = time(NULL); } --- 2345,2350 ---- *************** *** 2379,2416 **** default_server_hostnames (server_conf); ! if (listeners == NULL) { ! if (!is_graceful) { ! memset ((char *)&sa_server, 0, sizeof (sa_server)); ! sa_server.sin_family = AF_INET; ! sa_server.sin_addr = bind_address; ! sa_server.sin_port = htons (server_conf->port); ! sd = make_sock (pconf, &sa_server); ! } ! else { ! sd = saved_sd; ! note_cleanups_for_fd(pconf, sd); ! } ! } ! else { ! listen_rec *lr; int fd; ! ! listenmaxfd = -1; ! FD_ZERO (&listenfds); ! for (lr = listeners; lr != NULL; lr = lr->next) ! { ! fd = find_listener (lr); ! if (fd < 0) { ! fd = make_sock (pconf, &lr->local_addr); ! } ! FD_SET (fd, &listenfds); ! if (fd > listenmaxfd) listenmaxfd = fd; ! lr->fd = fd; } ! close_unused_listeners (); ! sd = -1; } set_signals (); log_pid (pconf, pid_fname); --- 2372,2391 ---- default_server_hostnames (server_conf); ! listenmaxfd = -1; ! FD_ZERO (&listenfds); ! for (lr = listeners; lr != NULL; lr = lr->next) { int fd; ! ! fd = find_listener (lr); ! if (fd < 0) { ! fd = make_sock (pconf, &lr->local_addr); } ! FD_SET (fd, &listenfds); ! if (fd > listenmaxfd) listenmaxfd = fd; ! lr->fd = fd; } + close_unused_listeners (); set_signals (); log_pid (pconf, pid_fname); *************** *** 2519,2525 **** update_scoreboard_global (); log_error ("SIGUSR1 received. Doing graceful restart",server_conf); - kill_cleanups_for_socket (pconf, sd); /* kill off the idle ones */ if (ap_killpg(pgrp, SIGUSR1) < 0) { log_unixerr ("killpg SIGUSR1", NULL, NULL, server_conf); --- 2494,2499 ---- *************** *** 3018,3024 **** * useful on Unix (not sure it even makes sense * in a multi-threaded env. */ - int saved_sd; int nthreads; fd_set main_fds; int srv; --- 2992,2997 ---- *************** *** 3056,3062 **** ++generation; copy_listeners(pconf); - saved_sd=sd; restart_time = time(NULL); reinit_scoreboard(pconf); --- 3029,3034 ---- *************** *** 3064,3101 **** acquire_mutex(start_mutex); { listenmaxfd = -1; FD_ZERO(&listenfds); ! if (listeners == NULL) { ! memset((char *) &sa_server, 0, sizeof(sa_server)); ! sa_server.sin_family=AF_INET; ! sa_server.sin_addr=bind_address; ! sa_server.sin_port=htons(server_conf->port); ! ! sd = make_sock(pconf, &sa_server); ! FD_SET(sd, &listenfds); ! listenmaxfd = sd; ! } ! else { ! listen_rec *lr; ! int fd; ! ! ! for (lr=listeners; lr != NULL; lr=lr->next) { ! fd=find_listener(lr); ! if(fd < 0) ! { ! fd = make_sock(pconf, &lr->local_addr); ! } ! FD_SET(fd, &listenfds); ! if (fd > listenmaxfd) listenmaxfd = fd; ! lr->fd=fd; } ! close_unused_listeners(); ! sd = -1; ! } } set_signals(); --- 3036,3060 ---- acquire_mutex(start_mutex); { + listen_rec *lr; + int fd; + listenmaxfd = -1; FD_ZERO(&listenfds); ! for (lr=listeners; lr != NULL; lr=lr->next) ! { ! fd=find_listener(lr); ! if(fd < 0) { ! fd = make_sock(pconf, &lr->local_addr); } ! FD_SET(fd, &listenfds); ! if (fd > listenmaxfd) listenmaxfd = fd; ! lr->fd=fd; ! } ! close_unused_listeners(); ! sd = -1; } set_signals(); *************** *** 3140,3159 **** start_mutex_released = 1; /* set the listen queue to 1 */ { ! if (listeners == NULL) { ! listen(sd, 1); ! } ! else { ! listen_rec *lr; ! ! for (lr=listeners; lr != NULL; lr=lr->next) ! { ! if(lr->used) ! { ! listen(lr->fd, 1); ! } ! } ! } } } if(!start_exit) --- 3099,3113 ---- start_mutex_released = 1; /* set the listen queue to 1 */ { ! listen_rec *lr; ! ! for (lr=listeners; lr != NULL; lr=lr->next) ! { ! if(lr->used) ! { ! listen(lr->fd, 1); ! } ! } } } if(!start_exit) *************** *** 3200,3206 **** continue; } ! if (listeners != NULL) { listen_rec *lr; int fd; --- 3154,3160 ---- continue; } ! { listen_rec *lr; int fd; *************** *** 3254,3274 **** } { ! if (listeners == NULL) { ! closesocket(sd); ! } ! else { ! listen_rec *lr; ! ! for (lr=listeners; lr != NULL; lr=lr->next) { ! if(lr->used) ! { ! closesocket(lr->fd); ! lr->fd = -1; ! } } ! } } for(i=0; i<nthreads; i++) --- 3208,3223 ---- } { ! listen_rec *lr; ! ! for (lr=listeners; lr != NULL; lr=lr->next) ! { ! if(lr->used) { ! closesocket(lr->fd); ! lr->fd = -1; } ! } } for(i=0; i<nthreads; i++)