Changeset ec3e411
- Timestamp:
- 2006-02-12T07:20:49Z (19 years ago)
- Branches:
- master
- Children:
- 58bc4e6
- Parents:
- 9fae35c (diff), 1d2e3c2 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Files:
-
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
bitlbee.c
r9fae35c rec3e411 45 45 int i; 46 46 GIOChannel *ch; 47 FILE *fp; 47 48 48 49 log_link( LOGLVL_ERROR, LOGOUTPUT_SYSLOG ); … … 104 105 else if( i != 0 ) 105 106 exit( 0 ); 106 close( 0 ); 107 close( 1 ); 108 close( 2 ); 107 109 108 chdir( "/" ); 109 110 /* Sometimes std* are already closed (for example when we're in a RESTARTed 111 BitlBee process. So let's only close TTY-fds. */ 112 if( isatty( 0 ) ) close( 0 ); 113 if( isatty( 0 ) ) close( 1 ); 114 if( isatty( 0 ) ) close( 2 ); 110 115 } 111 116 #endif 117 118 if( global.conf->runmode == RUNMODE_FORKDAEMON ) 119 ipc_master_load_state(); 120 121 if( ( fp = fopen( global.conf->pidfile, "w" ) ) ) 122 { 123 fprintf( fp, "%d\n", (int) getpid() ); 124 fclose( fp ); 125 } 126 else 127 { 128 log_message( LOGLVL_WARNING, "Warning: Couldn't write PID to `%s'", global.conf->pidfile ); 129 } 112 130 113 131 return( 0 ); … … 235 253 int new_socket = accept( global.listen_socket, (struct sockaddr *) &conn_info, &size ); 236 254 pid_t client_pid = 0; 255 256 if( new_socket == -1 ) 257 { 258 log_message( LOGLVL_WARNING, "Could not accept new connection: %s", strerror( errno ) ); 259 return TRUE; 260 } 237 261 238 262 if( global.conf->runmode == RUNMODE_FORKDAEMON ) -
bitlbee.h
r9fae35c rec3e411 121 121 char *helpfile; 122 122 GMainLoop *loop; 123 int restart; 123 124 } global_t; 124 125 -
conf.c
r9fae35c rec3e411 32 32 #include "ini.h" 33 33 #include "url.h" 34 #include "ipc.h" 34 35 35 36 #include "protocols/proxy.h" … … 61 62 conf->configdir = g_strdup( CONFIG ); 62 63 conf->plugindir = g_strdup( PLUGINDIR ); 64 conf->pidfile = g_strdup( "/var/run/bitlbee.pid" ); 63 65 conf->motdfile = g_strdup( ETCDIR "/motd.txt" ); 64 66 conf->ping_interval = 180; … … 77 79 } 78 80 79 while( argc > 0 && ( opt = getopt( argc, argv, "i:p: nvIDFc:d:h" ) ) >= 0 )81 while( argc > 0 && ( opt = getopt( argc, argv, "i:p:P:nvIDFc:d:hR:" ) ) >= 0 ) 80 82 /* ^^^^ Just to make sure we skip this step from the REHASH handler. */ 81 83 { … … 92 94 } 93 95 conf->port = i; 96 } 97 else if( opt == 'p' ) 98 { 99 g_free( conf->pidfile ); 100 conf->pidfile = g_strdup( optarg ); 94 101 } 95 102 else if( opt == 'n' ) … … 142 149 return( NULL ); 143 150 } 151 else if( opt == 'R' ) 152 { 153 /* We can't load the statefile yet (and should make very sure we do this 154 only once), so set the filename here and load the state information 155 when initializing ForkDaemon. (This option only makes sense in that 156 mode anyway!) */ 157 ipc_master_set_statefile( optarg ); 158 } 144 159 } 145 160 … … 175 190 else 176 191 conf->runmode = RUNMODE_INETD; 192 } 193 else if( g_strcasecmp( ini->key, "pidfile" ) == 0 ) 194 { 195 g_free( conf->pidfile ); 196 conf->pidfile = g_strdup( ini->value ); 177 197 } 178 198 else if( g_strcasecmp( ini->key, "daemoninterface" ) == 0 ) -
conf.h
r9fae35c rec3e411 43 43 char *configdir; 44 44 char *plugindir; 45 char *pidfile; 45 46 char *motdfile; 46 47 char *primary_storage; -
configure
r9fae35c rec3e411 14 14 datadir='$prefix/share/bitlbee/' 15 15 config='/var/lib/bitlbee/' 16 pidfile='/var/run/bitlbee.pid' 16 17 plugindir='$prefix/lib/bitlbee' 17 18 … … 46 47 --datadir=... $datadir 47 48 --plugindir=... $plugindir 49 --pidfile=... $pidfile 48 50 --config=... $config 49 51 … … 74 76 config=`eval echo "$config/" | sed 's/\/\{1,\}/\//g'` 75 77 plugindir=`eval echo "$plugindir/" | sed 's/\/\{1,\}/\//g'` 78 pidfile=`eval echo "$pidfile/" | sed 's/\/\{1,\}/\//g'` 76 79 77 80 cat<<EOF>Makefile.settings … … 83 86 DATADIR=$datadir 84 87 PLUGINDIR=$plugindir 88 PIDFILE=$pidfile 85 89 CONFIG=$config 86 90 … … 104 108 #define VARDIR "$datadir" 105 109 #define PLUGINDIR "$plugindir" 110 #define PIDFILE "$pidfile" 106 111 #define ARCH "$arch" 107 112 #define CPU "$cpu" -
ipc.c
r9fae35c rec3e411 2 2 * BitlBee -- An IRC to other IM-networks gateway * 3 3 * * 4 * Copyright 2002-200 4Wilmer van der Gaast and others *4 * Copyright 2002-2006 Wilmer van der Gaast and others * 5 5 \********************************************************************/ 6 6 … … 30 30 31 31 GSList *child_list = NULL; 32 32 static char *statefile = NULL; 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 )38 if( child && cmd[1] ) 39 39 { 40 40 child->host = g_strdup( cmd[1] ); … … 43 43 } 44 44 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] ); 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] ); 47 48 } 48 49 … … 74 75 } 75 76 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 76 91 static const command_t ipc_master_commands[] = { 77 92 { "client", 3, ipc_master_cmd_client, 0 }, 93 { "hello", 0, ipc_master_cmd_client, 0 }, 78 94 { "die", 0, ipc_master_cmd_die, 0 }, 79 95 { "wallops", 1, NULL, IPC_CMD_TO_CHILDREN }, … … 82 98 { "rehash", 0, ipc_master_cmd_rehash, 0 }, 83 99 { "kill", 2, NULL, IPC_CMD_TO_CHILDREN }, 100 { "restart", 0, ipc_master_cmd_restart, 0 }, 84 101 { NULL } 85 102 }; … … 140 157 irc_write( irc, ":%s!%s@%s KILL %s :%s", irc->mynick, irc->mynick, irc->myhost, irc->nick, cmd[2] ); 141 158 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 else 166 ipc_to_master_str( "HELLO %s %s :%s\r\n", irc->host, irc->nick, irc->realname ); 142 167 } 143 168 … … 149 174 { "rehash", 0, ipc_child_cmd_rehash, 0 }, 150 175 { "kill", 2, ipc_child_cmd_kill, 0 }, 176 { "hello", 0, ipc_child_cmd_hello, 0 }, 151 177 { NULL } 152 178 }; … … 385 411 child_list = NULL; 386 412 } 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 else 447 { 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
r9fae35c rec3e411 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 56 60 57 61 extern GSList *child_list; -
irc_commands.c
r9fae35c rec3e411 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 }, 575 576 { "kill", 2, NULL, IRC_CMD_OPER_ONLY | IRC_CMD_TO_MASTER }, 576 577 { NULL } -
protocols/msn/msn.c
r9fae35c rec3e411 84 84 { 85 85 m = l->data; 86 87 serv_got_crap( gc, "Warning: Closing down MSN connection with unsent message to %s, you'll have to resend it.", m->who ); 86 88 g_free( m->who ); 87 89 g_free( m->text ); … … 89 91 } 90 92 g_slist_free( md->msgq ); 91 92 serv_got_crap( gc, "Warning: Closing down MSN connection with unsent message(s), you'll have to resend them." );93 93 } 94 94 -
protocols/msn/sb.c
r9fae35c rec3e411 213 213 { 214 214 m = l->data; 215 215 216 g_free( m->who ); 216 217 g_free( m->text ); … … 219 220 g_slist_free( sb->msgq ); 220 221 221 serv_got_crap( gc, "Warning: Closing down MSN switchboard connection with unsent message(s), you'll have to resend them." ); 222 serv_got_crap( gc, "Warning: Closing down MSN switchboard connection with " 223 "unsent message to %s, you'll have to resend it.", 224 m->who ? m->who : "(unknown)" ); 222 225 } 223 226 -
root_commands.c
r9fae35c rec3e411 601 601 { 602 602 set_setstr( irc, cmd[1], cmd[2] ); 603 604 if( ( strcmp( cmd[2], "=" ) ) == 0 && cmd[3] ) 605 irc_usermsg( irc, "Warning: Correct syntax: \002set <variable> <value>\002 (without =)" ); 603 606 } 604 607 if( cmd[1] ) /* else 'forgotten' on purpose.. Must show new value after changing */ -
unix.c
r9fae35c rec3e411 29 29 #include "protocols/nogaim.h" 30 30 #include "help.h" 31 #include "ipc.h" 31 32 #include <signal.h> 32 33 #include <unistd.h> … … 38 39 static void sighandler( int signal ); 39 40 40 int main( int argc, char *argv[] )41 int main( int argc, char *argv[], char **envp ) 41 42 { 42 43 int i = 0; 44 char *old_cwd; 43 45 struct sigaction sig, old; 44 46 … … 73 75 else if( global.conf->runmode == RUNMODE_FORKDAEMON ) 74 76 { 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 75 86 i = bitlbee_daemon_init(); 76 87 log_message( LOGLVL_INFO, "Bitlbee %s starting in forking daemon mode.", BITLBEE_VERSION ); … … 108 119 g_main_run( global.loop ); 109 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 110 150 return( 0 ); 111 151 }
Note: See TracChangeset
for help on using the changeset viewer.