diff options
-rw-r--r-- | bitlbee.c | 2 | ||||
-rw-r--r-- | conf.c | 10 | ||||
-rw-r--r-- | ipc.c | 9 | ||||
-rw-r--r-- | ipc.h | 3 | ||||
-rw-r--r-- | unix.c | 27 |
5 files changed, 13 insertions, 38 deletions
@@ -117,7 +117,7 @@ int bitlbee_daemon_init() #endif if( global.conf->runmode == RUNMODE_FORKDAEMON ) - ipc_master_load_state(); + ipc_master_load_state( getenv( "_BITLBEE_RESTART_STATE" ) ); if( global.conf->runmode == RUNMODE_DAEMON || global.conf->runmode == RUNMODE_FORKDAEMON ) ipc_master_listen_socket(); @@ -77,7 +77,7 @@ conf_t *conf_load( int argc, char *argv[] ) at a *valid* configuration file. */ } - while( argc > 0 && ( opt = getopt( argc, argv, "i:p:P:nvIDFc:d:hR:u:" ) ) >= 0 ) + while( argc > 0 && ( opt = getopt( argc, argv, "i:p:P:nvIDFc:d:hu:" ) ) >= 0 ) /* ^^^^ Just to make sure we skip this step from the REHASH handler. */ { if( opt == 'i' ) @@ -145,14 +145,6 @@ conf_t *conf_load( int argc, char *argv[] ) " -h Show this help page.\n" ); return NULL; } - else if( opt == 'R' ) - { - /* We can't load the statefile yet (and should make very sure we do this - only once), so set the filename here and load the state information - when initializing ForkDaemon. (This option only makes sense in that - mode anyway!) */ - ipc_master_set_statefile( optarg ); - } else if( opt == 'u' ) { g_free( conf->user ); @@ -32,7 +32,6 @@ #endif GSList *child_list = NULL; -static char *statefile = NULL; static void ipc_master_cmd_client( irc_t *data, char **cmd ) { @@ -500,11 +499,6 @@ char *ipc_master_save_state() } } -void ipc_master_set_statefile( char *fn ) -{ - statefile = g_strdup( fn ); -} - static gboolean new_ipc_client( gpointer data, gint serversock, b_input_condition cond ) { @@ -565,7 +559,7 @@ int ipc_master_listen_socket() /* FIXME: Open named pipe \\.\BITLBEE */ #endif -int ipc_master_load_state() +int ipc_master_load_state( char *statefile ) { struct bitlbee_child *child; FILE *fp; @@ -573,6 +567,7 @@ int ipc_master_load_state() if( statefile == NULL ) return 0; + fp = fopen( statefile, "r" ); unlink( statefile ); /* Why do it later? :-) */ if( fp == NULL ) @@ -57,8 +57,7 @@ void ipc_to_children_str( char *format, ... ) G_GNUC_PRINTF( 1, 2 ); void ipc_master_cmd_rehash( irc_t *data, char **cmd ); char *ipc_master_save_state(); -void ipc_master_set_statefile( char *fn ); -int ipc_master_load_state(); +int ipc_master_load_state( char *statefile ); int ipc_master_listen_socket(); extern GSList *child_list; @@ -39,7 +39,7 @@ global_t global; /* Against global namespace pollution */ static void sighandler( int signal ); -int main( int argc, char *argv[], char **envp ) +int main( int argc, char *argv[] ) { int i = 0; char *old_cwd = NULL; @@ -134,30 +134,19 @@ int main( int argc, char *argv[], char **envp ) if( global.restart ) { char *fn = ipc_master_save_state(); - char **args; - int n, i; chdir( old_cwd ); - n = 0; - args = g_new0( char *, argc + 3 ); - args[n++] = argv[0]; - if( fn ) - { - args[n++] = "-R"; - args[n++] = fn; - } - for( i = 1; argv[i] && i < argc; i ++ ) - { - if( strcmp( argv[i], "-R" ) == 0 ) - i += 2; - - args[n++] = argv[i]; - } + setenv( "_BITLBEE_RESTART_STATE", fn, 1 ); + g_free( fn ); close( global.listen_socket ); - execve( args[0], args, envp ); + if( execv( argv[0], argv ) == -1 ) + /* Apparently the execve() failed, so let's just + jump back into our own/current main(). */ + /* Need more cleanup code to make this work. */ + return 1; /* main( argc, argv ); */ } return( 0 ); |