aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ipc.c3
-rw-r--r--ipc.h3
-rw-r--r--irc_channel.c18
-rw-r--r--irc_commands.c26
-rw-r--r--irc_im.c36
5 files changed, 61 insertions, 25 deletions
diff --git a/ipc.c b/ipc.c
index aff6f994..b327d717 100644
--- a/ipc.c
+++ b/ipc.c
@@ -1,7 +1,7 @@
/********************************************************************\
* BitlBee -- An IRC to other IM-networks gateway *
* *
- * Copyright 2002-2006 Wilmer van der Gaast and others *
+ * Copyright 2002-2010 Wilmer van der Gaast and others *
\********************************************************************/
/* IPC - communication between BitlBee processes */
@@ -28,6 +28,7 @@
#include "ipc.h"
#include "commands.h"
#ifndef _WIN32
+#include <sys/uio.h>
#include <sys/un.h>
#endif
diff --git a/ipc.h b/ipc.h
index fc1c65b4..3e71a070 100644
--- a/ipc.h
+++ b/ipc.h
@@ -1,7 +1,7 @@
/********************************************************************\
* BitlBee -- An IRC to other IM-networks gateway *
* *
- * Copyright 2002-2004 Wilmer van der Gaast and others *
+ * Copyright 2002-2010 Wilmer van der Gaast and others *
\********************************************************************/
/* IPC - communication between BitlBee processes */
@@ -25,7 +25,6 @@
#define BITLBEE_CORE
#include "bitlbee.h"
-#include <sys/uio.h>
struct bitlbee_child
diff --git a/irc_channel.c b/irc_channel.c
index 70770bfb..6f9de637 100644
--- a/irc_channel.c
+++ b/irc_channel.c
@@ -548,24 +548,6 @@ static gboolean control_channel_init( irc_channel_t *ic )
ic->data = icc = g_new0( struct irc_control_channel, 1 );
icc->type = IRC_CC_TYPE_DEFAULT;
- if( bee_group_by_name( ic->irc->b, ic->name + 1, FALSE ) )
- {
- set_setstr( &ic->set, "group", ic->name + 1 );
- set_setstr( &ic->set, "fill_by", "group" );
- }
- else if( set_setstr( &ic->set, "protocol", ic->name + 1 ) )
- {
- set_setstr( &ic->set, "fill_by", "protocol" );
- }
- else if( set_setstr( &ic->set, "account", ic->name + 1 ) )
- {
- set_setstr( &ic->set, "fill_by", "account" );
- }
- else
- {
- bee_irc_channel_update( ic->irc, ic, NULL );
- }
-
return TRUE;
}
diff --git a/irc_commands.c b/irc_commands.c
index 0573601d..0bf20cfc 100644
--- a/irc_commands.c
+++ b/irc_commands.c
@@ -140,7 +140,31 @@ static void irc_cmd_join( irc_t *irc, char **cmd )
*comma = '\0';
if( ( ic = irc_channel_by_name( irc, s ) ) == NULL )
+ {
ic = irc_channel_new( irc, s );
+
+ if( strcmp( set_getstr( &ic->set, "type" ), "control" ) != 0 )
+ {
+ /* Autoconfiguration is for control channels only ATM. */
+ }
+ else if( bee_group_by_name( ic->irc->b, ic->name + 1, FALSE ) )
+ {
+ set_setstr( &ic->set, "group", ic->name + 1 );
+ set_setstr( &ic->set, "fill_by", "group" );
+ }
+ else if( set_setstr( &ic->set, "protocol", ic->name + 1 ) )
+ {
+ set_setstr( &ic->set, "fill_by", "protocol" );
+ }
+ else if( set_setstr( &ic->set, "account", ic->name + 1 ) )
+ {
+ set_setstr( &ic->set, "fill_by", "account" );
+ }
+ else
+ {
+ bee_irc_channel_update( ic->irc, ic, NULL );
+ }
+ }
if( ic == NULL )
{
@@ -201,7 +225,7 @@ static void irc_cmd_part( irc_t *irc, char **cmd )
{
irc_send_num( irc, 403, "%s :No such channel", cmd[1] );
}
- else if( irc_channel_del_user( ic, irc->user, FALSE, cmd[2] ) )
+ else if( irc_channel_del_user( ic, irc->user, IRC_CDU_PART, cmd[2] ) )
{
if( ic->f->part )
ic->f->part( ic, NULL );
diff --git a/irc_im.c b/irc_im.c
index 150b8607..f467a666 100644
--- a/irc_im.c
+++ b/irc_im.c
@@ -450,6 +450,9 @@ static gboolean bee_irc_chat_free( bee_t *bee, struct groupchat *c )
{
irc_channel_t *ic = c->ui_data;
+ if( ic == NULL )
+ return FALSE;
+
if( ic->flags & IRC_CHANNEL_JOINED )
irc_channel_printf( ic, "Cleaning up channel, bye!" );
@@ -463,6 +466,9 @@ static gboolean bee_irc_chat_log( bee_t *bee, struct groupchat *c, const char *t
{
irc_channel_t *ic = c->ui_data;
+ if( ic == NULL )
+ return FALSE;
+
irc_channel_printf( ic, "%s", text );
return TRUE;
@@ -475,6 +481,9 @@ static gboolean bee_irc_chat_msg( bee_t *bee, struct groupchat *c, bee_user_t *b
irc_channel_t *ic = c->ui_data;
char *ts = NULL;
+ if( ic == NULL )
+ return FALSE;
+
if( sent_at > 0 && set_getbool( &bee->set, "display_timestamps" ) )
ts = irc_format_timestamp( irc, sent_at );
@@ -487,8 +496,12 @@ static gboolean bee_irc_chat_msg( bee_t *bee, struct groupchat *c, bee_user_t *b
static gboolean bee_irc_chat_add_user( bee_t *bee, struct groupchat *c, bee_user_t *bu )
{
irc_t *irc = bee->ui_data;
+ irc_channel_t *ic = c->ui_data;
- irc_channel_add_user( c->ui_data, bu == bee->user ? irc->user : bu->ui_data );
+ if( ic == NULL )
+ return FALSE;
+
+ irc_channel_add_user( ic, bu == bee->user ? irc->user : bu->ui_data );
return TRUE;
}
@@ -496,20 +509,28 @@ static gboolean bee_irc_chat_add_user( bee_t *bee, struct groupchat *c, bee_user
static gboolean bee_irc_chat_remove_user( bee_t *bee, struct groupchat *c, bee_user_t *bu )
{
irc_t *irc = bee->ui_data;
+ irc_channel_t *ic = c->ui_data;
+
+ if( ic == NULL )
+ return FALSE;
/* TODO: Possible bug here: If a module removes $user here instead of just
using imcb_chat_free() and the channel was IRC_CHANNEL_TEMP, we get into
a broken state around here. */
- irc_channel_del_user( c->ui_data, bu == bee->user ? irc->user : bu->ui_data, IRC_CDU_PART, NULL );
+ irc_channel_del_user( ic, bu == bee->user ? irc->user : bu->ui_data, IRC_CDU_PART, NULL );
return TRUE;
}
static gboolean bee_irc_chat_topic( bee_t *bee, struct groupchat *c, const char *new, bee_user_t *bu )
{
+ irc_channel_t *ic = c->ui_data;
irc_t *irc = bee->ui_data;
irc_user_t *iu;
+ if( ic == NULL )
+ return FALSE;
+
if( bu == NULL )
iu = irc->root;
else if( bu == bee->user )
@@ -517,7 +538,7 @@ static gboolean bee_irc_chat_topic( bee_t *bee, struct groupchat *c, const char
else
iu = bu->ui_data;
- irc_channel_set_topic( c->ui_data, new, iu );
+ irc_channel_set_topic( ic, new, iu );
return TRUE;
}
@@ -528,6 +549,9 @@ static gboolean bee_irc_chat_name_hint( bee_t *bee, struct groupchat *c, const c
irc_channel_t *ic = c->ui_data, *oic;
char stripped[MAX_NICK_LENGTH+1], *full_name;
+ if( ic == NULL )
+ return FALSE;
+
/* Don't rename a channel if the user's in it already. */
if( ic->flags & IRC_CHANNEL_JOINED )
return FALSE;
@@ -785,6 +809,8 @@ static char *set_eval_chat_type( set_t *set, char *value )
static gboolean bee_irc_channel_free( irc_channel_t *ic )
{
+ struct groupchat *c = ic->data;
+
set_del( &ic->set, "account" );
set_del( &ic->set, "chat_type" );
set_del( &ic->set, "nick" );
@@ -793,6 +819,10 @@ static gboolean bee_irc_channel_free( irc_channel_t *ic )
ic->flags &= ~IRC_CHANNEL_TEMP;
+ /* That one still points at this channel. Don't. */
+ if( c )
+ c->ui_data = NULL;
+
return TRUE;
}