From 80c1e4d9e8c82a83499d6b66cdf3a95d15bf0fa1 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Thu, 25 May 2006 01:31:20 +0200 Subject: #ifdef out some Win32-incompatible code blocks --- ipc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'ipc.c') diff --git a/ipc.c b/ipc.c index 18d3284e..a9f3ea34 100644 --- a/ipc.c +++ b/ipc.c @@ -416,6 +416,7 @@ void ipc_master_free_all() child_list = NULL; } +#ifndef _WIN32 char *ipc_master_save_state() { char *fn = g_strdup( "/tmp/bee-restart.XXXXXX" ); @@ -483,7 +484,6 @@ static gboolean new_ipc_client (GIOChannel *gio, GIOCondition cond, gpointer dat return TRUE; } -#ifndef _WIN32 int ipc_master_listen_socket() { struct sockaddr_un un_addr; -- cgit v1.2.3 From 1cda4f348372a755d99b291e6f4f9973a949f441 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Fri, 26 May 2006 17:02:09 +0200 Subject: Fix some unresolved symbols. --- ipc.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'ipc.c') diff --git a/ipc.c b/ipc.c index a9f3ea34..c926197f 100644 --- a/ipc.c +++ b/ipc.c @@ -527,7 +527,11 @@ int ipc_master_listen_socket() return 1; } #else +int ipc_master_listen_socket() +{ /* FIXME: Open named pipe \\.\BITLBEE */ + return 0; +} #endif int ipc_master_load_state() -- cgit v1.2.3 From 171ef85781e08ccbd8a6a018e88b1ad3cb802f78 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Sun, 2 Mar 2008 23:17:15 +0000 Subject: Some saner error handling in ipc.c. One of the things I wanted to do for 1.2. --- ipc.c | 60 +++++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 39 insertions(+), 21 deletions(-) (limited to 'ipc.c') diff --git a/ipc.c b/ipc.c index 384a9c33..54f026ac 100644 --- a/ipc.c +++ b/ipc.c @@ -257,19 +257,7 @@ gboolean ipc_master_read( gpointer data, gint source, b_input_condition cond ) } else { - GSList *l; - struct bitlbee_child *c; - - for( l = child_list; l; l = l->next ) - { - c = l->data; - if( c->ipc_fd == source ) - { - ipc_master_free_one( c ); - child_list = g_slist_remove( child_list, c ); - break; - } - } + ipc_master_free_fd( source ); } return TRUE; @@ -287,10 +275,7 @@ gboolean ipc_child_read( gpointer data, gint source, b_input_condition cond ) } else { - b_event_remove( global.listen_watch_source_id ); - close( global.listen_socket ); - - global.listen_socket = -1; + ipc_child_disable(); } return TRUE; @@ -325,7 +310,9 @@ void ipc_to_master_str( char *format, ... ) } else if( global.conf->runmode == RUNMODE_FORKDAEMON ) { - write( global.listen_socket, msg_buf, strlen( msg_buf ) ); + if( global.listen_socket >= 0 ) + if( write( global.listen_socket, msg_buf, strlen( msg_buf ) ) <= 0 ) + ipc_child_disable(); } else if( global.conf->runmode == RUNMODE_DAEMON ) { @@ -375,12 +362,18 @@ void ipc_to_children_str( char *format, ... ) else if( global.conf->runmode == RUNMODE_FORKDAEMON ) { int msg_len = strlen( msg_buf ); - GSList *l; + GSList *l, *next; - for( l = child_list; l; l = l->next ) + for( l = child_list; l; l = next ) { struct bitlbee_child *c = l->data; - write( c->ipc_fd, msg_buf, msg_len ); + + next = l->next; + if( write( c->ipc_fd, msg_buf, msg_len ) <= 0 ) + { + ipc_master_free_one( c ); + child_list = g_slist_remove( child_list, c ); + } } } else if( global.conf->runmode == RUNMODE_DAEMON ) @@ -409,6 +402,23 @@ void ipc_master_free_one( struct bitlbee_child *c ) g_free( c ); } +void ipc_master_free_fd( int fd ) +{ + GSList *l; + struct bitlbee_child *c; + + for( l = child_list; l; l = l->next ) + { + c = l->data; + if( c->ipc_fd == fd ) + { + ipc_master_free_one( c ); + child_list = g_slist_remove( child_list, c ); + break; + } + } +} + void ipc_master_free_all() { GSList *l; @@ -420,6 +430,14 @@ void ipc_master_free_all() child_list = NULL; } +void ipc_child_disable() +{ + b_event_remove( global.listen_watch_source_id ); + close( global.listen_socket ); + + global.listen_socket = -1; +} + char *ipc_master_save_state() { char *fn = g_strdup( "/tmp/bee-restart.XXXXXX" ); -- cgit v1.2.3 From da7b4847f5561dcf9b4aefa2968d3d27327e5183 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Sat, 21 Jun 2008 18:09:20 +0100 Subject: Fixed memory leaking ipc_readline(). --- ipc.c | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) (limited to 'ipc.c') diff --git a/ipc.c b/ipc.c index 54f026ac..06618695 100644 --- a/ipc.c +++ b/ipc.c @@ -208,19 +208,19 @@ static void ipc_command_exec( void *data, char **cmd, const command_t *commands } } +/* Return just one line. Returns NULL if something broke, an empty string + on temporary "errors" (EAGAIN and friends). */ static char *ipc_readline( int fd ) { - char *buf, *eol; + char buf[513], *eol; int size; - buf = g_new0( char, 513 ); - /* Because this is internal communication, it should be pretty safe to just peek at the message, find its length (by searching for the end-of-line) and then just read that message. With internal sockets and limites message length, messages should always be complete. Saves us quite a lot of code and buffering. */ - size = recv( fd, buf, 512, MSG_PEEK ); + size = recv( fd, buf, sizeof( buf ) - 1, MSG_PEEK ); if( size == 0 || ( size < 0 && !sockerr_again() ) ) return NULL; else if( size < 0 ) /* && sockerr_again() */ @@ -228,21 +228,15 @@ static char *ipc_readline( int fd ) else buf[size] = 0; - eol = strstr( buf, "\r\n" ); - if( eol == NULL ) + if( ( eol = strstr( buf, "\r\n" ) ) == NULL ) return NULL; else size = eol - buf + 2; - g_free( buf ); - buf = g_new0( char, size + 1 ); - if( recv( fd, buf, size, 0 ) != size ) return NULL; else - buf[size-2] = 0; - - return buf; + return g_strndup( buf, size - 2 ); } gboolean ipc_master_read( gpointer data, gint source, b_input_condition cond ) -- cgit v1.2.3 From edc767b8781d7c56ab3cfe67e2c816694722f5d0 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Sat, 21 Jun 2008 18:19:27 +0100 Subject: Fixed two more embarassing memory leaks. --- ipc.c | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'ipc.c') diff --git a/ipc.c b/ipc.c index 06618695..f853a18f 100644 --- a/ipc.c +++ b/ipc.c @@ -247,7 +247,11 @@ gboolean ipc_master_read( gpointer data, gint source, b_input_condition cond ) { cmd = irc_parse_line( buf ); if( cmd ) + { ipc_command_exec( data, cmd, ipc_master_commands ); + g_free( cmd ); + } + g_free( buf ); } else { @@ -265,7 +269,11 @@ gboolean ipc_child_read( gpointer data, gint source, b_input_condition cond ) { cmd = irc_parse_line( buf ); if( cmd ) + { ipc_command_exec( data, cmd, ipc_child_commands ); + g_free( cmd ); + } + g_free( buf ); } else { -- cgit v1.2.3 From 565a1eaa8b36ca64a7806e6ad74a9a26495c0c6e Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Sun, 29 Jun 2008 10:35:41 +0100 Subject: Added the DEAF command, which makes the daemon stop listening for new connections. This makes it easier to upgrade a BitlBee without having to disconnect all current users immediately. Closes #428. --- ipc.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'ipc.c') diff --git a/ipc.c b/ipc.c index f853a18f..9121026a 100644 --- a/ipc.c +++ b/ipc.c @@ -62,6 +62,25 @@ static void ipc_master_cmd_die( irc_t *data, char **cmd ) bitlbee_shutdown( NULL, -1, 0 ); } +static void ipc_master_cmd_deaf( irc_t *data, char **cmd ) +{ + if( global.conf->runmode == RUNMODE_DAEMON ) + { + b_event_remove( global.listen_watch_source_id ); + close( global.listen_socket ); + + global.listen_socket = global.listen_watch_source_id = -1; + + ipc_to_children_str( "OPERMSG :Closed listening socket, waiting " + "for all users to disconnect." ); + } + else + { + ipc_to_children_str( "OPERMSG :The DEAF command only works in " + "normal daemon mode. Try DIE instead." ); + } +} + void ipc_master_cmd_rehash( irc_t *data, char **cmd ) { runmode_t oldmode; @@ -97,6 +116,7 @@ static const command_t ipc_master_commands[] = { { "client", 3, ipc_master_cmd_client, 0 }, { "hello", 0, ipc_master_cmd_client, 0 }, { "die", 0, ipc_master_cmd_die, 0 }, + { "deaf", 0, ipc_master_cmd_deaf, 0 }, { "wallops", 1, NULL, IPC_CMD_TO_CHILDREN }, { "wall", 1, NULL, IPC_CMD_TO_CHILDREN }, { "opermsg", 1, NULL, IPC_CMD_TO_CHILDREN }, -- cgit v1.2.3 From cd63d5822e76a6126bb3017567c9ce2869a44e0b Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Sun, 29 Jun 2008 13:47:39 +0100 Subject: Now using an environment variable instead of a flag to pass state info when restarting the ForkDaemon. Preparing for a proper fallback when execv() fails. (Bug #425) --- ipc.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) (limited to 'ipc.c') diff --git a/ipc.c b/ipc.c index 9121026a..5232832e 100644 --- a/ipc.c +++ b/ipc.c @@ -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 ) -- cgit v1.2.3