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