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++)
  
  
  

Reply via email to