Changes in / [54879ab:f73b969]
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
bitlbee.c
r54879ab rf73b969 111 111 #endif 112 112 113 if( global.conf->runmode == RUNMODE_FORKDAEMON )114 ipc_master_load_state();115 116 113 return( 0 ); 117 114 } -
bitlbee.h
r54879ab rf73b969 121 121 char *helpfile; 122 122 GMainLoop *loop; 123 int restart;124 123 } global_t; 125 124 -
conf.c
r54879ab rf73b969 32 32 #include "ini.h" 33 33 #include "url.h" 34 #include "ipc.h"35 34 36 35 #include "protocols/proxy.h" … … 78 77 } 79 78 80 while( argc > 0 && ( opt = getopt( argc, argv, "i:p:nvIDFc:d:h R:" ) ) >= 0 )79 while( argc > 0 && ( opt = getopt( argc, argv, "i:p:nvIDFc:d:h" ) ) >= 0 ) 81 80 /* ^^^^ Just to make sure we skip this step from the REHASH handler. */ 82 81 { … … 142 141 " -h Show this help page.\n" ); 143 142 return( NULL ); 144 }145 else if( opt == 'R' )146 {147 /* We can't load the statefile yet (and should make very sure we do this148 only once), so set the filename here and load the state information149 when initializing ForkDaemon. (This option only makes sense in that150 mode anyway!) */151 ipc_master_set_statefile( optarg );152 143 } 153 144 } -
ipc.c
r54879ab rf73b969 2 2 * BitlBee -- An IRC to other IM-networks gateway * 3 3 * * 4 * Copyright 2002-200 6Wilmer van der Gaast and others *4 * Copyright 2002-2004 Wilmer van der Gaast and others * 5 5 \********************************************************************/ 6 6 … … 30 30 31 31 GSList *child_list = NULL; 32 static char *statefile = NULL; 32 33 33 34 34 static void ipc_master_cmd_client( irc_t *data, char **cmd ) … … 36 36 struct bitlbee_child *child = (void*) data; 37 37 38 if( child && cmd[1])38 if( child ) 39 39 { 40 40 child->host = g_strdup( cmd[1] ); … … 43 43 } 44 44 45 if( g_strcasecmp( cmd[0], "CLIENT" ) == 0 ) 46 ipc_to_children_str( "OPERMSG :Client connecting (PID=%d): %s@%s (%s)\r\n", 47 child ? child->pid : -1, cmd[2], cmd[1], cmd[3] ); 45 ipc_to_children_str( "OPERMSG :Client connecting (PID=%d): %s@%s (%s)\r\n", 46 child ? child->pid : -1, cmd[2], cmd[1], cmd[3] ); 48 47 } 49 48 … … 75 74 } 76 75 77 void ipc_master_cmd_restart( irc_t *data, char **cmd )78 {79 struct bitlbee_child *child = (void*) data;80 81 if( global.conf->runmode != RUNMODE_FORKDAEMON )82 {83 /* Tell child that this is unsupported. */84 return;85 }86 87 global.restart = -1;88 bitlbee_shutdown( NULL );89 }90 91 76 static const command_t ipc_master_commands[] = { 92 77 { "client", 3, ipc_master_cmd_client, 0 }, 93 { "hello", 0, ipc_master_cmd_client, 0 },94 78 { "die", 0, ipc_master_cmd_die, 0 }, 95 79 { "wallops", 1, NULL, IPC_CMD_TO_CHILDREN }, … … 98 82 { "rehash", 0, ipc_master_cmd_rehash, 0 }, 99 83 { "kill", 2, NULL, IPC_CMD_TO_CHILDREN }, 100 { "restart", 0, ipc_master_cmd_restart, 0 },101 84 { NULL } 102 85 }; … … 157 140 irc_write( irc, ":%s!%s@%s KILL %s :%s", irc->mynick, irc->mynick, irc->myhost, irc->nick, cmd[2] ); 158 141 irc_abort( irc, 0, "Killed by operator: %s", cmd[2] ); 159 }160 161 static void ipc_child_cmd_hello( irc_t *irc, char **cmd )162 {163 if( irc->status < USTATUS_LOGGED_IN )164 ipc_to_master_str( "HELLO\r\n" );165 else166 ipc_to_master_str( "HELLO %s %s :%s\r\n", irc->host, irc->nick, irc->realname );167 142 } 168 143 … … 174 149 { "rehash", 0, ipc_child_cmd_rehash, 0 }, 175 150 { "kill", 2, ipc_child_cmd_kill, 0 }, 176 { "hello", 0, ipc_child_cmd_hello, 0 },177 151 { NULL } 178 152 }; … … 181 155 static void ipc_command_exec( void *data, char **cmd, const command_t *commands ) 182 156 { 183 int i , j;157 int i; 184 158 185 159 if( !cmd[0] ) … … 189 163 if( g_strcasecmp( commands[i].command, cmd[0] ) == 0 ) 190 164 { 191 /* There is no typo in this line: */192 for( j = 1; cmd[j]; j ++ ); j --;193 194 if( j < commands[i].required_parameters )195 break;196 197 165 if( commands[i].flags & IPC_CMD_TO_CHILDREN ) 198 166 ipc_to_children( cmd ); … … 200 168 commands[i].execute( data, cmd ); 201 169 202 break;170 return; 203 171 } 204 172 } … … 411 379 child_list = NULL; 412 380 } 413 414 char *ipc_master_save_state()415 {416 char *fn = g_strdup( "/tmp/bee-restart.XXXXXX" );417 int fd = mkstemp( fn );418 GSList *l;419 FILE *fp;420 int i;421 422 if( fd == -1 )423 {424 log_message( LOGLVL_ERROR, "Could not create temporary file: %s", strerror( errno ) );425 g_free( fn );426 return NULL;427 }428 429 /* This is more convenient now. */430 fp = fdopen( fd, "w" );431 432 for( l = child_list, i = 0; l; l = l->next )433 i ++;434 435 /* Number of client processes. */436 fprintf( fp, "%d\n", i );437 438 for( l = child_list; l; l = l->next )439 fprintf( fp, "%d %d\n", ((struct bitlbee_child*)l->data)->pid,440 ((struct bitlbee_child*)l->data)->ipc_fd );441 442 if( fclose( fp ) == 0 )443 {444 return fn;445 }446 else447 {448 unlink( fn );449 g_free( fn );450 return NULL;451 }452 }453 454 void ipc_master_set_statefile( char *fn )455 {456 statefile = g_strdup( fn );457 }458 459 int ipc_master_load_state()460 {461 struct bitlbee_child *child;462 FILE *fp;463 int i, n;464 465 if( statefile == NULL )466 return 0;467 fp = fopen( statefile, "r" );468 unlink( statefile ); /* Why do it later? :-) */469 if( fp == NULL )470 return 0;471 472 if( fscanf( fp, "%d", &n ) != 1 )473 {474 log_message( LOGLVL_WARNING, "Could not import state information for child processes." );475 fclose( fp );476 return 0;477 }478 479 log_message( LOGLVL_INFO, "Importing information for %d child processes.", n );480 for( i = 0; i < n; i ++ )481 {482 child = g_new0( struct bitlbee_child, 1 );483 484 if( fscanf( fp, "%d %d", &child->pid, &child->ipc_fd ) != 2 )485 {486 log_message( LOGLVL_WARNING, "Unexpected end of file: Only processed %d clients.", i );487 g_free( child );488 fclose( fp );489 return 0;490 }491 child->ipc_inpa = gaim_input_add( child->ipc_fd, GAIM_INPUT_READ, ipc_master_read, child );492 493 child_list = g_slist_append( child_list, child );494 }495 496 ipc_to_children_str( "HELLO\r\n" );497 ipc_to_children_str( "OPERMSG :New BitlBee master process started (version " BITLBEE_VERSION ")\r\n" );498 499 return 1;500 } -
ipc.h
r54879ab rf73b969 54 54 void ipc_master_cmd_rehash( irc_t *data, char **cmd ); 55 55 56 char *ipc_master_save_state();57 void ipc_master_set_statefile( char *fn );58 int ipc_master_load_state();59 60 56 61 57 extern GSList *child_list; -
irc_commands.c
r54879ab rf73b969 573 573 { "lilo", 1, NULL, IRC_CMD_OPER_ONLY | IRC_CMD_TO_MASTER }, 574 574 { "rehash", 0, irc_cmd_rehash, IRC_CMD_OPER_ONLY }, 575 { "restart", 0, NULL, IRC_CMD_OPER_ONLY | IRC_CMD_TO_MASTER },576 575 { "kill", 2, NULL, IRC_CMD_OPER_ONLY | IRC_CMD_TO_MASTER }, 577 576 { NULL } … … 580 579 void irc_exec( irc_t *irc, char *cmd[] ) 581 580 { 582 int i , n_arg;581 int i; 583 582 584 583 if( !cmd[0] ) … … 588 587 if( g_strcasecmp( irc_commands[i].command, cmd[0] ) == 0 ) 589 588 { 590 /* There should be no typo in the next line: */591 for( n_arg = 0; cmd[n_arg]; n_arg ++ ); n_arg --;592 593 589 if( irc_commands[i].flags & IRC_CMD_PRE_LOGIN && irc->status >= USTATUS_LOGGED_IN ) 594 590 { … … 603 599 irc_reply( irc, 481, ":Permission denied - You're not an IRC operator" ); 604 600 } 605 else if( n_arg < irc_commands[i].required_parameters)601 else if( !cmd[irc_commands[i].required_parameters] ) 606 602 { 607 603 irc_reply( irc, 461, "%s :Need more parameters", cmd[0] ); -
unix.c
r54879ab rf73b969 29 29 #include "protocols/nogaim.h" 30 30 #include "help.h" 31 #include "ipc.h"32 31 #include <signal.h> 33 32 #include <unistd.h> … … 39 38 static void sighandler( int signal ); 40 39 41 int main( int argc, char *argv[] , char **envp)40 int main( int argc, char *argv[] ) 42 41 { 43 42 int i = 0; 44 char *old_cwd;45 43 struct sigaction sig, old; 46 44 … … 75 73 else if( global.conf->runmode == RUNMODE_FORKDAEMON ) 76 74 { 77 /* In case the operator requests a restart, we need this. */78 old_cwd = g_malloc( 256 );79 if( getcwd( old_cwd, 255 ) == NULL )80 {81 log_message( LOGLVL_WARNING, "Could not save current directory: %s", strerror( errno ) );82 g_free( old_cwd );83 old_cwd = NULL;84 }85 86 75 i = bitlbee_daemon_init(); 87 76 log_message( LOGLVL_INFO, "Bitlbee %s starting in forking daemon mode.", BITLBEE_VERSION ); … … 118 107 119 108 g_main_run( global.loop ); 120 121 if( global.restart )122 {123 char *fn = ipc_master_save_state();124 char **args;125 int n, i;126 127 chdir( old_cwd );128 129 n = 0;130 args = g_new0( char *, argc + 3 );131 args[n++] = argv[0];132 if( fn )133 {134 args[n++] = "-R";135 args[n++] = fn;136 }137 for( i = 1; argv[i] && i < argc; i ++ )138 {139 if( strcmp( argv[i], "-R" ) == 0 )140 i += 2;141 142 args[n++] = argv[i];143 }144 145 close( global.listen_socket );146 147 execve( args[0], args, envp );148 }149 109 150 110 return( 0 );
Note: See TracChangeset
for help on using the changeset viewer.