From 6dff9d4ac2cbd279e25db60ae26086c830764682 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Wed, 1 Mar 2006 22:08:03 +0100 Subject: Also listen for admin connections on a unix domain socket at /var/run/bitlbee --- ipc.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) (limited to 'ipc.c') diff --git a/ipc.c b/ipc.c index 778f74c8..b05958ae 100644 --- a/ipc.c +++ b/ipc.c @@ -27,6 +27,9 @@ #include "bitlbee.h" #include "ipc.h" #include "commands.h" +#ifndef _WIN32 +#include +#endif GSList *child_list = NULL; static char *statefile = NULL; @@ -456,6 +459,51 @@ void ipc_master_set_statefile( char *fn ) statefile = g_strdup( fn ); } + +static gboolean new_ipc_client (GIOChannel *gio, GIOCondition cond, gpointer data) +{ + struct bitlbee_child *child = g_new0( struct bitlbee_child, 1 ); + int serversock; + + serversock = g_io_channel_unix_get_fd(gio); + + child->ipc_fd = accept(serversock, NULL, 0); + + child->ipc_inpa = gaim_input_add( child->ipc_fd, GAIM_INPUT_READ, ipc_master_read, child ); + + child_list = g_slist_append( child_list, child ); + + return TRUE; +} + +#ifndef _WIN32 +int ipc_master_listen_socket() +{ + struct sockaddr_un un_addr; + int serversock; + GIOChannel *gio; + + /* Clean up old socket files that were hanging around.. */ + unlink(IPCSOCKET); + + un_addr.sun_family = AF_UNIX; + strcpy(un_addr.sun_path, IPCSOCKET); + + serversock = socket(AF_UNIX, SOCK_STREAM, PF_UNIX); + + bind(serversock, &un_addr, sizeof(un_addr)); + + listen(serversock, 5); + + gio = g_io_channel_unix_new(serversock); + + g_io_add_watch(gio, G_IO_IN, new_ipc_client, NULL); + return 1; +} +#else + /* FIXME: Open named pipe \\.\BITLBEE */ +#endif + int ipc_master_load_state() { struct bitlbee_child *child; -- cgit v1.2.3 From 5e713f695f93f7dc88f225bf6a8cd16e228eff11 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Wed, 1 Mar 2006 23:17:57 +0100 Subject: Added a little comment for this scary cast. (-: --- ipc.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'ipc.c') diff --git a/ipc.c b/ipc.c index 778f74c8..60caba3e 100644 --- a/ipc.c +++ b/ipc.c @@ -33,6 +33,10 @@ static char *statefile = NULL; static void ipc_master_cmd_client( irc_t *data, char **cmd ) { + /* Normally data points at an irc_t block, but for the IPC master + this is different. We think this scary cast is better than + creating a new command_t structure, just to make the compiler + happy. */ struct bitlbee_child *child = (void*) data; if( child && cmd[1] ) -- cgit v1.2.3 From 8a56e52a518855150525eab9e0fcdbe776223ffc Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Wed, 1 Mar 2006 23:30:10 +0100 Subject: Improve error handling --- ipc.c | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) (limited to 'ipc.c') diff --git a/ipc.c b/ipc.c index b05958ae..366b1119 100644 --- a/ipc.c +++ b/ipc.c @@ -468,6 +468,11 @@ static gboolean new_ipc_client (GIOChannel *gio, GIOCondition cond, gpointer dat serversock = g_io_channel_unix_get_fd(gio); child->ipc_fd = accept(serversock, NULL, 0); + + if (child->ipc_fd == -1) { + log_message( LOGLVL_WARNING, "Unable to accept connection on UNIX domain socket: %s", strerror(errno) ); + return TRUE; + } child->ipc_inpa = gaim_input_add( child->ipc_fd, GAIM_INPUT_READ, ipc_master_read, child ); @@ -484,18 +489,37 @@ int ipc_master_listen_socket() GIOChannel *gio; /* Clean up old socket files that were hanging around.. */ - unlink(IPCSOCKET); + if (unlink(IPCSOCKET) == -1 && errno != ENOENT) { + log_message( LOGLVL_ERROR, "Could not remove old IPC socket at %s: %s", IPCSOCKET, strerror(errno) ); + return 0; + } un_addr.sun_family = AF_UNIX; strcpy(un_addr.sun_path, IPCSOCKET); serversock = socket(AF_UNIX, SOCK_STREAM, PF_UNIX); - bind(serversock, &un_addr, sizeof(un_addr)); + if (serversock == -1) { + log_message( LOGLVL_WARNING, "Unable to create UNIX socket: %s", strerror(errno) ); + return 0; + } + + if (bind(serversock, &un_addr, sizeof(un_addr)) == -1) { + log_message( LOGLVL_WARNING, "Unable to bind UNIX socket to %s: %s", IPCSOCKET, strerror(errno) ); + return 0; + } - listen(serversock, 5); + if (listen(serversock, 5) == -1) { + log_message( LOGLVL_WARNING, "Unable to listen on UNIX socket: %s", strerror(errno) ); + return 0; + } gio = g_io_channel_unix_new(serversock); + + if (gio == NULL) { + log_message( LOGLVL_WARNING, "Unable to create IO channel for unix socket" ); + return 0; + } g_io_add_watch(gio, G_IO_IN, new_ipc_client, NULL); return 1; -- cgit v1.2.3