Changeset 5005

Show
Ignore:
Timestamp:
10/24/07 16:39:08 (9 months ago)
Author:
morris
Message:

Use fork()+execv() instead of doing daemon()

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • wired/trunk/wired/main.c

    r4754 r5005  
    6565 
    6666 
    67 static wi_boolean_t                             wd_daemonize = true; 
    68  
    6967wi_boolean_t                                    wd_running = true; 
    7068 
     
    8078 
    8179int main(int argc, const char **argv) { 
     80        wi_array_t                      *arguments; 
    8281        wi_pool_t                       *pool; 
    8382        wi_string_t                     *string; 
     83        const char                      **xargv; 
    8484        int                                     ch, facility; 
    85         wi_boolean_t            no_chroot, test_config
     85        wi_boolean_t            no_chroot, test_config, daemonize
    8686 
    8787        /* init libwired */ 
     
    104104        no_chroot                               = false; 
    105105        test_config                             = false; 
     106        daemonize                               = true; 
     107         
     108        /* init reexec argument list */ 
     109        arguments                               = wi_array_init(wi_array_alloc()); 
    106110 
    107111        /* parse command line switches */ 
    108         while((ch = getopt(argc, (char * const *) argv, "46Dd:f:hi:L:ls:tuVv")) != -1) { 
     112        while((ch = getopt(argc, (char * const *) argv, "46Dd:f:hi:L:ls:tuVvX")) != -1) { 
    109113                switch(ch) { 
    110114                        case '4': 
    111115                                wd_address_family = WI_ADDRESS_IPV4; 
     116                                 
    112117                                break; 
    113118 
     
    117122 
    118123                        case 'D': 
    119                                 wd_daemonize =false; 
     124                                daemonize = false; 
    120125                                wi_log_stderr = true; 
    121126                                break; 
     
    171176                                wd_version(); 
    172177                                break; 
     178                         
     179                        case 'X': 
     180                                daemonize = false; 
     181                                break; 
    173182 
    174183                        case '?': 
     
    178187                                break; 
    179188                } 
    180         } 
    181  
     189                 
     190                wi_array_add_data(arguments, wi_string_with_format(WI_STR("-%c"), ch)); 
     191                 
     192                if(optarg) 
     193                        wi_array_add_data(arguments, wi_string_with_cstring(optarg)); 
     194        } 
     195 
     196        /* detach */ 
     197        if(daemonize) { 
     198                wi_array_insert_data_at_index(arguments, WI_STR("-X"), 0); 
     199                wi_array_insert_data_at_index(arguments, wi_string_with_cstring(argv[0]), 0); 
     200                 
     201                switch(fork()) { 
     202                        case -1: 
     203                                wi_log_err(WI_STR("Could not fork: %m")); 
     204                                break; 
     205                                 
     206                        case 0: 
     207                                xargv = wi_array_argv(arguments); 
     208                                 
     209                                if(execv(argv[0], (char * const *) xargv) < 0) 
     210                                        wi_log_err(WI_STR("Could not execute %s: %m"), argv[0]); 
     211                                break; 
     212                                 
     213                                default: 
     214                                _exit(0); 
     215                                break; 
     216                } 
     217        } 
     218         
     219        wi_release(arguments); 
     220         
    182221        /* open log */ 
    183222        wi_log_open(); 
     
    225264        wd_server_init(); 
    226265         
    227         /* detach */ 
    228         if(wd_daemonize) { 
    229                 if(!wi_daemon()) 
    230                         wi_log_err(WI_STR("Could not become a daemon: %m")); 
    231         } 
    232  
    233266        /* switch user/group */ 
    234267        wi_switch_user(wd_settings.user, wd_settings.group);