diff options
| -rw-r--r-- | bitlbee.c | 4 | ||||
| -rwxr-xr-x | configure | 8 | ||||
| -rw-r--r-- | ipc.c | 48 | ||||
| -rw-r--r-- | ipc.h | 2 | 
4 files changed, 59 insertions, 3 deletions
| @@ -117,6 +117,10 @@ int bitlbee_daemon_init()  	if( global.conf->runmode == RUNMODE_FORKDAEMON )  		ipc_master_load_state(); + +	if( global.conf->runmode == RUNMODE_DAEMON ||  +		global.conf->runmode == RUNMODE_FORKDAEMON ) +		ipc_master_listen_socket();  	if( ( fp = fopen( global.conf->pidfile, "w" ) ) )  	{ @@ -14,6 +14,7 @@ mandir='$prefix/share/man/'  datadir='$prefix/share/bitlbee/'  config='/var/lib/bitlbee/'  pidfile='/var/run/bitlbee.pid' +ipcsocket='/var/run/bitlbee'  plugindir='$prefix/lib/bitlbee'  msn=1 @@ -48,6 +49,7 @@ Option		Description				Default  --plugindir=...						$plugindir  --pidfile=...						$pidfile  --config=...						$config +--ipcsocket=...						$ipcsocket  --msn=0/1	Disable/enable MSN part			$msn  --jabber=0/1	Disable/enable Jabber part		$jabber @@ -75,7 +77,8 @@ mandir=`eval echo "$mandir/" | sed 's/\/\{1,\}/\//g'`  datadir=`eval echo "$datadir/" | sed 's/\/\{1,\}/\//g'`  config=`eval echo "$config/" | sed 's/\/\{1,\}/\//g'`  plugindir=`eval echo "$plugindir/" | sed 's/\/\{1,\}/\//g'` -pidfile=`eval echo "$pidfile/" | sed 's/\/\{1,\}/\//g'` +pidfile=`eval echo "$pidfile" | sed 's/\/\{1,\}/\//g'` +ipcsocket=`eval echo "$ipcsocket" | sed 's/\/\{1,\}/\//g'`  cat<<EOF>Makefile.settings  ## BitlBee settings, generated by configure @@ -85,8 +88,8 @@ ETCDIR=$etcdir  MANDIR=$mandir  DATADIR=$datadir  PLUGINDIR=$plugindir -PIDFILE=$pidfile  CONFIG=$config +IPCSOCKET=$ipcsocket  ARCH=$arch  CPU=$cpu @@ -108,6 +111,7 @@ cat<<EOF>config.h  #define VARDIR "$datadir"  #define PLUGINDIR "$plugindir"  #define PIDFILE "$pidfile" +#define IPCSOCKET "$ipcsocket"  #define ARCH "$arch"  #define CPU "$cpu"  EOF @@ -27,6 +27,9 @@  #include "bitlbee.h"  #include "ipc.h"  #include "commands.h" +#ifndef _WIN32 +#include <sys/un.h> +#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; @@ -56,6 +56,6 @@ 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_listen_socket();  extern GSList *child_list; | 
