aboutsummaryrefslogtreecommitdiffstats
path: root/irc_channel.c
diff options
context:
space:
mode:
authorIndent <please@skip.me>2015-02-19 02:47:20 -0300
committerdequis <dx@dxzone.com.ar>2015-02-20 19:50:54 -0300
commit5ebff60479fc7a9f7f50ac03b124c91d4e6ebe11 (patch)
tree9fc0d50cb1f4bc9768d9f00de94eafd876bb55b0 /irc_channel.c
parentaf359b4316f9d392c6b752495a1b2ed631576ed8 (diff)
Reindent everything to K&R style with tabs
Used uncrustify, with the configuration file in ./doc/uncrustify.cfg Commit author set to "Indent <please@skip.me>" so that it's easier to skip while doing git blame.
Diffstat (limited to 'irc_channel.c')
-rw-r--r--irc_channel.c972
1 files changed, 502 insertions, 470 deletions
diff --git a/irc_channel.c b/irc_channel.c
index 4fe0fad4..b4257ba6 100644
--- a/irc_channel.c
+++ b/irc_channel.c
@@ -1,4 +1,4 @@
- /********************************************************************\
+/********************************************************************\
* BitlBee -- An IRC to other IM-networks gateway *
* *
* Copyright 2002-2013 Wilmer van der Gaast and others *
@@ -25,796 +25,827 @@
#include "bitlbee.h"
-static char *set_eval_channel_type( set_t *set, char *value );
-static gint irc_channel_user_cmp( gconstpointer a_, gconstpointer b_ );
+static char *set_eval_channel_type(set_t *set, char *value);
+static gint irc_channel_user_cmp(gconstpointer a_, gconstpointer b_);
static const struct irc_channel_funcs control_channel_funcs;
extern const struct irc_channel_funcs irc_channel_im_chat_funcs;
-irc_channel_t *irc_channel_new( irc_t *irc, const char *name )
+irc_channel_t *irc_channel_new(irc_t *irc, const char *name)
{
irc_channel_t *ic;
set_t *s;
-
- if( !irc_channel_name_ok( name ) || irc_channel_by_name( irc, name ) )
+
+ if (!irc_channel_name_ok(name) || irc_channel_by_name(irc, name)) {
return NULL;
-
- ic = g_new0( irc_channel_t, 1 );
+ }
+
+ ic = g_new0(irc_channel_t, 1);
ic->irc = irc;
- ic->name = g_strdup( name );
- strcpy( ic->mode, CMODE );
-
- irc_channel_add_user( ic, irc->root );
-
- irc->channels = g_slist_append( irc->channels, ic );
-
- set_add( &ic->set, "auto_join", "false", set_eval_bool, ic );
-
- s = set_add( &ic->set, "type", "control", set_eval_channel_type, ic );
+ ic->name = g_strdup(name);
+ strcpy(ic->mode, CMODE);
+
+ irc_channel_add_user(ic, irc->root);
+
+ irc->channels = g_slist_append(irc->channels, ic);
+
+ set_add(&ic->set, "auto_join", "false", set_eval_bool, ic);
+
+ s = set_add(&ic->set, "type", "control", set_eval_channel_type, ic);
s->flags |= SET_NOSAVE; /* Layer violation (XML format detail) */
-
- if( name[0] == '&' )
- set_setstr( &ic->set, "type", "control" );
- else /* if( name[0] == '#' ) */
- set_setstr( &ic->set, "type", "chat" );
-
+
+ if (name[0] == '&') {
+ set_setstr(&ic->set, "type", "control");
+ } else { /* if( name[0] == '#' ) */
+ set_setstr(&ic->set, "type", "chat");
+ }
+
return ic;
}
-irc_channel_t *irc_channel_by_name( irc_t *irc, const char *name )
+irc_channel_t *irc_channel_by_name(irc_t *irc, const char *name)
{
GSList *l;
-
- for( l = irc->channels; l; l = l->next )
- {
+
+ for (l = irc->channels; l; l = l->next) {
irc_channel_t *ic = l->data;
-
- if( irc_channel_name_cmp( name, ic->name ) == 0 )
+
+ if (irc_channel_name_cmp(name, ic->name) == 0) {
return ic;
+ }
}
-
+
return NULL;
}
-irc_channel_t *irc_channel_get( irc_t *irc, char *id )
+irc_channel_t *irc_channel_get(irc_t *irc, char *id)
{
irc_channel_t *ic, *ret = NULL;
GSList *l;
int nr;
-
- if( sscanf( id, "%d", &nr ) == 1 && nr < 1000 )
- {
- for( l = irc->channels; l; l = l->next )
- {
+
+ if (sscanf(id, "%d", &nr) == 1 && nr < 1000) {
+ for (l = irc->channels; l; l = l->next) {
ic = l->data;
- if( ( nr-- ) == 0 )
+ if ((nr--) == 0) {
return ic;
+ }
}
-
+
return NULL;
}
-
+
/* Exact match first: Partial match only sucks if there's a channel
#aa and #aabb */
- if( ( ret = irc_channel_by_name( irc, id ) ) )
+ if ((ret = irc_channel_by_name(irc, id))) {
return ret;
-
- for( l = irc->channels; l; l = l->next )
- {
+ }
+
+ for (l = irc->channels; l; l = l->next) {
ic = l->data;
-
- if( strstr( ic->name, id ) )
- {
+
+ if (strstr(ic->name, id)) {
/* Make sure it's a unique match. */
- if( !ret )
+ if (!ret) {
ret = ic;
- else
+ } else {
return NULL;
+ }
}
}
-
+
return ret;
}
-int irc_channel_free( irc_channel_t *ic )
+int irc_channel_free(irc_channel_t *ic)
{
irc_t *irc;
GSList *l;
-
- if( ic == NULL )
+
+ if (ic == NULL) {
return 0;
+ }
irc = ic->irc;
-
- if( ic->flags & IRC_CHANNEL_JOINED )
- irc_channel_del_user( ic, irc->user, IRC_CDU_KICK, "Cleaning up channel" );
-
- if( ic->f->_free )
- ic->f->_free( ic );
-
- while( ic->set )
- set_del( &ic->set, ic->set->key );
-
- irc->channels = g_slist_remove( irc->channels, ic );
- while( ic->users )
- {
- g_free( ic->users->data );
- ic->users = g_slist_remove( ic->users, ic->users->data );
- }
-
- for( l = irc->users; l; l = l->next )
- {
+
+ if (ic->flags & IRC_CHANNEL_JOINED) {
+ irc_channel_del_user(ic, irc->user, IRC_CDU_KICK, "Cleaning up channel");
+ }
+
+ if (ic->f->_free) {
+ ic->f->_free(ic);
+ }
+
+ while (ic->set) {
+ set_del(&ic->set, ic->set->key);
+ }
+
+ irc->channels = g_slist_remove(irc->channels, ic);
+ while (ic->users) {
+ g_free(ic->users->data);
+ ic->users = g_slist_remove(ic->users, ic->users->data);
+ }
+
+ for (l = irc->users; l; l = l->next) {
irc_user_t *iu = l->data;
-
- if( iu->last_channel == ic )
+
+ if (iu->last_channel == ic) {
iu->last_channel = irc->default_channel;
+ }
+ }
+
+ if (ic->pastebuf_timer) {
+ b_event_remove(ic->pastebuf_timer);
}
-
- if( ic->pastebuf_timer ) b_event_remove( ic->pastebuf_timer );
-
- g_free( ic->name );
- g_free( ic->topic );
- g_free( ic->topic_who );
- g_free( ic );
-
+
+ g_free(ic->name);
+ g_free(ic->topic);
+ g_free(ic->topic_who);
+ g_free(ic);
+
return 1;
}
-struct irc_channel_free_data
-{
+struct irc_channel_free_data {
irc_t *irc;
irc_channel_t *ic;
char *name;
};
-static gboolean irc_channel_free_callback( gpointer data, gint fd, b_input_condition cond )
+static gboolean irc_channel_free_callback(gpointer data, gint fd, b_input_condition cond)
{
struct irc_channel_free_data *d = data;
-
- if( g_slist_find( irc_connection_list, d->irc ) &&
- irc_channel_by_name( d->irc, d->name ) == d->ic &&
- !( d->ic->flags & IRC_CHANNEL_JOINED ) )
- irc_channel_free( d->ic );
-
- g_free( d->name );
- g_free( d );
+
+ if (g_slist_find(irc_connection_list, d->irc) &&
+ irc_channel_by_name(d->irc, d->name) == d->ic &&
+ !(d->ic->flags & IRC_CHANNEL_JOINED)) {
+ irc_channel_free(d->ic);
+ }
+
+ g_free(d->name);
+ g_free(d);
return FALSE;
}
/* Free the channel, but via the event loop, so after finishing whatever event
we're currently handling. */
-void irc_channel_free_soon( irc_channel_t *ic )
+void irc_channel_free_soon(irc_channel_t *ic)
{
- struct irc_channel_free_data *d = g_new0( struct irc_channel_free_data, 1 );
-
+ struct irc_channel_free_data *d = g_new0(struct irc_channel_free_data, 1);
+
d->irc = ic->irc;
d->ic = ic;
- d->name = g_strdup( ic->name );
-
- b_timeout_add( 0, irc_channel_free_callback, d );
+ d->name = g_strdup(ic->name);
+
+ b_timeout_add(0, irc_channel_free_callback, d);
}
-static char *set_eval_channel_type( set_t *set, char *value )
+static char *set_eval_channel_type(set_t *set, char *value)
{
struct irc_channel *ic = set->data;
const struct irc_channel_funcs *new;
-
- if( strcmp( value, "control" ) == 0 )
+
+ if (strcmp(value, "control") == 0) {
new = &control_channel_funcs;
- else if( ic != ic->irc->default_channel && strcmp( value, "chat" ) == 0 )
+ } else if (ic != ic->irc->default_channel && strcmp(value, "chat") == 0) {
new = &irc_channel_im_chat_funcs;
- else
+ } else {
return SET_INVALID;
-
+ }
+
/* TODO: Return values. */
- if( ic->f && ic->f->_free )
- ic->f->_free( ic );
-
+ if (ic->f && ic->f->_free) {
+ ic->f->_free(ic);
+ }
+
ic->f = new;
-
- if( ic->f && ic->f->_init )
- ic->f->_init( ic );
-
+
+ if (ic->f && ic->f->_init) {
+ ic->f->_init(ic);
+ }
+
return value;
}
-int irc_channel_add_user( irc_channel_t *ic, irc_user_t *iu )
+int irc_channel_add_user(irc_channel_t *ic, irc_user_t *iu)
{
irc_channel_user_t *icu;
-
- if( irc_channel_has_user( ic, iu ) )
+
+ if (irc_channel_has_user(ic, iu)) {
return 0;
-
- icu = g_new0( irc_channel_user_t, 1 );
+ }
+
+ icu = g_new0(irc_channel_user_t, 1);
icu->iu = iu;
-
- ic->users = g_slist_insert_sorted( ic->users, icu, irc_channel_user_cmp );
-
- irc_channel_update_ops( ic, set_getstr( &ic->irc->b->set, "ops" ) );
-
- if( iu == ic->irc->user || ic->flags & IRC_CHANNEL_JOINED )
- {
+
+ ic->users = g_slist_insert_sorted(ic->users, icu, irc_channel_user_cmp);
+
+ irc_channel_update_ops(ic, set_getstr(&ic->irc->b->set, "ops"));
+
+ if (iu == ic->irc->user || ic->flags & IRC_CHANNEL_JOINED) {
ic->flags |= IRC_CHANNEL_JOINED;
- irc_send_join( ic, iu );
+ irc_send_join(ic, iu);
}
-
+
return 1;
}
-int irc_channel_del_user( irc_channel_t *ic, irc_user_t *iu, irc_channel_del_user_type_t type, const char *msg )
+int irc_channel_del_user(irc_channel_t *ic, irc_user_t *iu, irc_channel_del_user_type_t type, const char *msg)
{
irc_channel_user_t *icu;
-
- if( !( icu = irc_channel_has_user( ic, iu ) ) )
+
+ if (!(icu = irc_channel_has_user(ic, iu))) {
return 0;
-
- ic->users = g_slist_remove( ic->users, icu );
- g_free( icu );
-
- if( !( ic->flags & IRC_CHANNEL_JOINED ) || type == IRC_CDU_SILENT ) {}
- /* Do nothing. The caller should promise it won't screw
- up state of the IRC client. :-) */
- else if( type == IRC_CDU_PART )
- irc_send_part( ic, iu, msg );
- else if( type == IRC_CDU_KICK )
- irc_send_kick( ic, iu, ic->irc->root, msg );
-
- if( iu == ic->irc->user )
- {
+ }
+
+ ic->users = g_slist_remove(ic->users, icu);
+ g_free(icu);
+
+ if (!(ic->flags & IRC_CHANNEL_JOINED) || type == IRC_CDU_SILENT) {
+ }
+ /* Do nothing. The caller should promise it won't screw
+ up state of the IRC client. :-) */
+ else if (type == IRC_CDU_PART) {
+ irc_send_part(ic, iu, msg);
+ } else if (type == IRC_CDU_KICK) {
+ irc_send_kick(ic, iu, ic->irc->root, msg);
+ }
+
+ if (iu == ic->irc->user) {
ic->flags &= ~IRC_CHANNEL_JOINED;
-
- if( ic->irc->status & USTATUS_SHUTDOWN )
- {
+
+ if (ic->irc->status & USTATUS_SHUTDOWN) {
/* Don't do anything fancy when we're shutting down anyway. */
- }
- else if( ic->flags & IRC_CHANNEL_TEMP )
- {
- irc_channel_free_soon( ic );
- }
- else
- {
+ } else if (ic->flags & IRC_CHANNEL_TEMP) {
+ irc_channel_free_soon(ic);
+ } else {
/* Flush userlist now. The user won't see it anyway. */
- while( ic->users )
- {
- g_free( ic->users->data );
- ic->users = g_slist_remove( ic->users, ic->users->data );
+ while (ic->users) {
+ g_free(ic->users->data);
+ ic->users = g_slist_remove(ic->users, ic->users->data);
}
- irc_channel_add_user( ic, ic->irc->root );
+ irc_channel_add_user(ic, ic->irc->root);
}
}
-
+
return 1;
}
-irc_channel_user_t *irc_channel_has_user( irc_channel_t *ic, irc_user_t *iu )
+irc_channel_user_t *irc_channel_has_user(irc_channel_t *ic, irc_user_t *iu)
{
GSList *l;
-
- for( l = ic->users; l; l = l->next )
- {
+
+ for (l = ic->users; l; l = l->next) {
irc_channel_user_t *icu = l->data;
-
- if( icu->iu == iu )
+
+ if (icu->iu == iu) {
return icu;
+ }
}
-
+
return NULL;
}
/* Find a channel we're currently in, that currently has iu in it. */
-struct irc_channel *irc_channel_with_user( irc_t *irc, irc_user_t *iu )
+struct irc_channel *irc_channel_with_user(irc_t *irc, irc_user_t *iu)
{
GSList *l;
-
- for( l = irc->channels; l; l = l->next )
- {
+
+ for (l = irc->channels; l; l = l->next) {
irc_channel_t *ic = l->data;
-
- if( strcmp( set_getstr( &ic->set, "type" ), "control" ) != 0 )
+
+ if (strcmp(set_getstr(&ic->set, "type"), "control") != 0) {
continue;
-
- if( ( ic->flags & IRC_CHANNEL_JOINED ) &&
- irc_channel_has_user( ic, iu ) )
+ }
+
+ if ((ic->flags & IRC_CHANNEL_JOINED) &&
+ irc_channel_has_user(ic, iu)) {
return ic;
+ }
}
-
+
/* If there was no match, try once more but just see if the user
*would* be in the channel, i.e. if s/he were online. */
- if( iu->bu == NULL )
+ if (iu->bu == NULL) {
return NULL;
-
- for( l = irc->channels; l; l = l->next )
- {
+ }
+
+ for (l = irc->channels; l; l = l->next) {
irc_channel_t *ic = l->data;
-
- if( strcmp( set_getstr( &ic->set, "type" ), "control" ) != 0 )
+
+ if (strcmp(set_getstr(&ic->set, "type"), "control") != 0) {
continue;
-
- if( ( ic->flags & IRC_CHANNEL_JOINED ) &&
- irc_channel_wants_user( ic, iu ) )
+ }
+
+ if ((ic->flags & IRC_CHANNEL_JOINED) &&
+ irc_channel_wants_user(ic, iu)) {
return ic;
+ }
}
-
+
return NULL;
}
-int irc_channel_set_topic( irc_channel_t *ic, const char *topic, const irc_user_t *iu )
+int irc_channel_set_topic(irc_channel_t *ic, const char *topic, const irc_user_t *iu)
{
- g_free( ic->topic );
- ic->topic = g_strdup( topic );
-
- g_free( ic->topic_who );
- if( iu )
- ic->topic_who = g_strdup_printf( "%s!%s@%s", iu->nick, iu->user, iu->host );
- else
+ g_free(ic->topic);
+ ic->topic = g_strdup(topic);
+
+ g_free(ic->topic_who);
+ if (iu) {
+ ic->topic_who = g_strdup_printf("%s!%s@%s", iu->nick, iu->user, iu->host);
+ } else {
ic->topic_who = NULL;
-
- ic->topic_time = time( NULL );
-
- if( ic->flags & IRC_CHANNEL_JOINED )
- irc_send_topic( ic, TRUE );
-
+ }
+
+ ic->topic_time = time(NULL);
+
+ if (ic->flags & IRC_CHANNEL_JOINED) {
+ irc_send_topic(ic, TRUE);
+ }
+
return 1;
}
-void irc_channel_user_set_mode( irc_channel_t *ic, irc_user_t *iu, irc_channel_user_flags_t flags )
+void irc_channel_user_set_mode(irc_channel_t *ic, irc_user_t *iu, irc_channel_user_flags_t flags)
{
- irc_channel_user_t *icu = irc_channel_has_user( ic, iu );
-
- if( !icu || icu->flags == flags )
+ irc_channel_user_t *icu = irc_channel_has_user(ic, iu);
+
+ if (!icu || icu->flags == flags) {
return;
-
- if( ic->flags & IRC_CHANNEL_JOINED )
- irc_send_channel_user_mode_diff( ic, iu, icu->flags, flags );
-
+ }
+
+ if (ic->flags & IRC_CHANNEL_JOINED) {
+ irc_send_channel_user_mode_diff(ic, iu, icu->flags, flags);
+ }
+
icu->flags = flags;
}
-void irc_channel_set_mode( irc_channel_t *ic, const char *s )
+void irc_channel_set_mode(irc_channel_t *ic, const char *s)
{
irc_t *irc = ic->irc;
char m[128], st = 1;
const char *t;
int i;
char changes[512], *p, st2 = 2;
-
- memset( m, 0, sizeof( m ) );
-
- for( t = ic->mode; *t; t ++ )
- if( *t < sizeof( m ) )
- m[(int)*t] = 1;
-
+
+ memset(m, 0, sizeof(m));
+
+ for (t = ic->mode; *t; t++) {
+ if (*t < sizeof(m)) {
+ m[(int) *t] = 1;
+ }
+ }
+
p = changes;
- for( t = s; *t; t ++ )
- {
- if( *t == '+' || *t == '-' )
+ for (t = s; *t; t++) {
+ if (*t == '+' || *t == '-') {
st = *t == '+';
- else if( strchr( CMODES, *t ) )
- {
- if( m[(int)*t] != st)
- {
- if( st != st2 )
+ } else if (strchr(CMODES, *t)) {
+ if (m[(int) *t] != st) {
+ if (st != st2) {
st2 = st, *p++ = st ? '+' : '-';
+ }
*p++ = *t;
}
- m[(int)*t] = st;
+ m[(int) *t] = st;
}
}
*p = '\0';
-
- memset( ic->mode, 0, sizeof( ic->mode ) );
-
- for( i = 'A'; i <= 'z' && strlen( ic->mode ) < ( sizeof( ic->mode ) - 1 ); i ++ )
- if( m[i] )
+
+ memset(ic->mode, 0, sizeof(ic->mode));
+
+ for (i = 'A'; i <= 'z' && strlen(ic->mode) < (sizeof(ic->mode) - 1); i++) {
+ if (m[i]) {
ic->mode[strlen(ic->mode)] = i;
-
- if( *changes && ( ic->flags & IRC_CHANNEL_JOINED ) )
- irc_write( irc, ":%s!%s@%s MODE %s :%s", irc->root->nick,
- irc->root->user, irc->root->host, ic->name,
- changes );
+ }
+ }
+
+ if (*changes && (ic->flags & IRC_CHANNEL_JOINED)) {
+ irc_write(irc, ":%s!%s@%s MODE %s :%s", irc->root->nick,
+ irc->root->user, irc->root->host, ic->name,
+ changes);
+ }
}
-void irc_channel_auto_joins( irc_t *irc, account_t *acc )
+void irc_channel_auto_joins(irc_t *irc, account_t *acc)
{
GSList *l;
-
- for( l = irc->channels; l; l = l->next )
- {
+
+ for (l = irc->channels; l; l = l->next) {
irc_channel_t *ic = l->data;
- gboolean aj = set_getbool( &ic->set, "auto_join" );
+ gboolean aj = set_getbool(&ic->set, "auto_join");
char *type;
-
- if( acc &&
- ( type = set_getstr( &ic->set, "chat_type" ) ) &&
- strcmp( type, "room" ) == 0 )
- {
+
+ if (acc &&
+ (type = set_getstr(&ic->set, "chat_type")) &&
+ strcmp(type, "room") == 0) {
/* Bit of an ugly special case: Handle chatrooms here, we
can only auto-join them if their account is online. */
char *acc_s;
-
- if( !aj || ( ic->flags & IRC_CHANNEL_JOINED ) )
+
+ if (!aj || (ic->flags & IRC_CHANNEL_JOINED)) {
/* Only continue if this one's marked as auto_join
or if we're in it already. (Possible if the
client auto-rejoined it before identyfing.) */
continue;
- else if( !( acc_s = set_getstr( &ic->set, "account" ) ) )
+ } else if (!(acc_s = set_getstr(&ic->set, "account"))) {
continue;
- else if( account_get( irc->b, acc_s ) != acc )
+ } else if (account_get(irc->b, acc_s) != acc) {
continue;
- else if( acc->ic == NULL || !( acc->ic->flags & OPT_LOGGED_IN ) )
+ } else if (acc->ic == NULL || !(acc->ic->flags & OPT_LOGGED_IN)) {
continue;
- else
- ic->f->join( ic );
- }
- else if( aj )
- {
- irc_channel_add_user( ic, irc->user );
+ } else {
+ ic->f->join(ic);
+ }
+ } else if (aj) {
+ irc_channel_add_user(ic, irc->user);
}
}
}
-void irc_channel_printf( irc_channel_t *ic, char *format, ... )
+void irc_channel_printf(irc_channel_t *ic, char *format, ...)
{
va_list params;
char *text;
-
- va_start( params, format );
- text = g_strdup_vprintf( format, params );
- va_end( params );
-
- irc_send_msg( ic->irc->root, "PRIVMSG", ic->name, text, NULL );
- g_free( text );
+
+ va_start(params, format);
+ text = g_strdup_vprintf(format, params);
+ va_end(params);
+
+ irc_send_msg(ic->irc->root, "PRIVMSG", ic->name, text, NULL);
+ g_free(text);
}
-gboolean irc_channel_name_ok( const char *name_ )
+gboolean irc_channel_name_ok(const char *name_)
{
- const unsigned char *name = (unsigned char*) name_;
+ const unsigned char *name = (unsigned char *) name_;
int i;
-
- if( name_[0] == '\0' )
+
+ if (name_[0] == '\0') {
return FALSE;
-
+ }
+
/* Check if the first character is in CTYPES (#&) */
- if( strchr( CTYPES, name_[0] ) == NULL )
+ if (strchr(CTYPES, name_[0]) == NULL) {
return FALSE;
-
+ }
+
/* RFC 1459 keeps amazing me: While only a "few" chars are allowed
in nicknames, channel names can be pretty much anything as long
as they start with # or &. I'll be a little bit more strict and
disallow all non-printable characters. */
- for( i = 1; name[i]; i ++ )
- if( name[i] <= ' ' || name[i] == ',' )
+ for (i = 1; name[i]; i++) {
+ if (name[i] <= ' ' || name[i] == ',') {
return FALSE;
-
+ }
+ }
+
return TRUE;
}
-void irc_channel_name_strip( char *name )
+void irc_channel_name_strip(char *name)
{
int i, j;
-
- for( i = j = 0; name[i]; i ++ )
- if( name[i] > ' ' && name[i] != ',' )
+
+ for (i = j = 0; name[i]; i++) {
+ if (name[i] > ' ' && name[i] != ',') {
name[j++] = name[i];
-
+ }
+ }
+
name[j] = '\0';
}
-int irc_channel_name_cmp( const char *a_, const char *b_ )
+int irc_channel_name_cmp(const char *a_, const char *b_)
{
static unsigned char case_map[256];
- const unsigned char *a = (unsigned char*) a_, *b = (unsigned char*) b_;
+ const unsigned char *a = (unsigned char *) a_, *b = (unsigned char *) b_;
int i;
-
- if( case_map['A'] == '\0' )
- {
- for( i = 33; i < 256; i ++ )
- if( i != ',' )
+
+ if (case_map['A'] == '\0') {
+ for (i = 33; i < 256; i++) {
+ if (i != ',') {
case_map[i] = i;
-
- for( i = 0; i < 26; i ++ )
- case_map['A'+i] = 'a' + i;
-
+ }
+ }
+
+ for (i = 0; i < 26; i++) {
+ case_map['A' + i] = 'a' + i;
+ }
+
case_map['['] = '{';
case_map[']'] = '}';
case_map['~'] = '`';
case_map['\\'] = '|';
}
-
- if( !irc_channel_name_ok( a_ ) || !irc_channel_name_ok( b_ ) )
+
+ if (!irc_channel_name_ok(a_) || !irc_channel_name_ok(b_)) {
return -1;
-
- for( i = 0; a[i] && b[i] && case_map[a[i]] && case_map[b[i]]; i ++ )
- {
- if( case_map[a[i]] == case_map[b[i]] )
+ }
+
+ for (i = 0; a[i] && b[i] && case_map[a[i]] && case_map[b[i]]; i++) {
+ if (case_map[a[i]] == case_map[b[i]]) {
continue;
- else
+ } else {
return case_map[a[i]] - case_map[b[i]];
+ }
}
-
+
return case_map[a[i]] - case_map[b[i]];
}
-static gint irc_channel_user_cmp( gconstpointer a_, gconstpointer b_ )
+static gint irc_channel_user_cmp(gconstpointer a_, gconstpointer b_)
{
const irc_channel_user_t *a = a_, *b = b_;
-
- return irc_user_cmp( a->iu, b->iu );
+
+ return irc_user_cmp(a->iu, b->iu);
}
-void irc_channel_update_ops( irc_channel_t *ic, char *value )
+void irc_channel_update_ops(irc_channel_t *ic, char *value)
{
- irc_channel_user_set_mode( ic, ic->irc->root,
- ( strcmp( value, "both" ) == 0 ||
- strcmp( value, "root" ) == 0 ) ? IRC_CHANNEL_USER_OP : 0 );
- irc_channel_user_set_mode( ic, ic->irc->user,
- ( strcmp( value, "both" ) == 0 ||
- strcmp( value, "user" ) == 0 ) ? IRC_CHANNEL_USER_OP : 0 );
+ irc_channel_user_set_mode(ic, ic->irc->root,
+ (strcmp(value, "both") == 0 ||
+ strcmp(value, "root") == 0) ? IRC_CHANNEL_USER_OP : 0);
+ irc_channel_user_set_mode(ic, ic->irc->user,
+ (strcmp(value, "both") == 0 ||
+ strcmp(value, "user") == 0) ? IRC_CHANNEL_USER_OP : 0);
}
-char *set_eval_irc_channel_ops( set_t *set, char *value )
+char *set_eval_irc_channel_ops(set_t *set, char *value)
{
irc_t *irc = set->data;
GSList *l;
-
- if( strcmp( value, "both" ) != 0 && strcmp( value, "none" ) != 0 &&
- strcmp( value, "user" ) != 0 && strcmp( value, "root" ) != 0 )
+
+ if (strcmp(value, "both") != 0 && strcmp(value, "none") != 0 &&
+ strcmp(value, "user") != 0 && strcmp(value, "root") != 0) {
return SET_INVALID;
-
- for( l = irc->channels; l; l = l->next )
- irc_channel_update_ops( l->data, value );
-
+ }
+
+ for (l = irc->channels; l; l = l->next) {
+ irc_channel_update_ops(l->data, value);
+ }
+
return value;
}
/* Channel-type dependent functions, for control channels: */
-static gboolean control_channel_privmsg( irc_channel_t *ic, const char *msg )
+static gboolean control_channel_privmsg(irc_channel_t *ic, const char *msg)
{
irc_t *irc = ic->irc;
irc_user_t *iu;
const char *s;
-
+
/* Scan for non-whitespace chars followed by a colon: */
- for( s = msg; *s && !g_ascii_isspace( *s ) && *s != ':' && *s != ','; s ++ ) {}
-
- if( *s == ':' || *s == ',' )
- {
- char to[s-msg+1];
-
- memset( to, 0, sizeof( to ) );
- strncpy( to, msg, s - msg );
- while( *(++s) && g_ascii_isspace( *s ) ) {}
+ for (s = msg; *s && !g_ascii_isspace(*s) && *s != ':' && *s != ','; s++) {
+ }
+
+ if (*s == ':' || *s == ',') {
+ char to[s - msg + 1];
+
+ memset(to, 0, sizeof(to));
+ strncpy(to, msg, s - msg);
+ while (*(++s) && g_ascii_isspace(*s)) {
+ }
msg = s;
-
- if( !( iu = irc_user_by_name( irc, to ) ) )
- irc_channel_printf( ic, "User does not exist: %s", to );
- else
+
+ if (!(iu = irc_user_by_name(irc, to))) {
+ irc_channel_printf(ic, "User does not exist: %s", to);
+ } else {
ic->last_target = iu;
- }
- else if( g_strcasecmp( set_getstr( &irc->b->set, "default_target" ), "last" ) == 0 &&
- ic->last_target && g_slist_find( irc->users, ic->last_target ) )
+ }
+ } else if (g_strcasecmp(set_getstr(&irc->b->set, "default_target"), "last") == 0 &&
+ ic->last_target && g_slist_find(irc->users, ic->last_target)) {
iu = ic->last_target;
- else
+ } else {
iu = irc->root;
-
- if( iu && iu->f->privmsg )
- {
+ }
+
+ if (iu && iu->f->privmsg) {
iu->last_channel = ic;
- iu->f->privmsg( iu, msg );
+ iu->f->privmsg(iu, msg);
}
-
+
return TRUE;
}
-static gboolean control_channel_invite( irc_channel_t *ic, irc_user_t *iu )
+static gboolean control_channel_invite(irc_channel_t *ic, irc_user_t *iu)
{
struct irc_control_channel *icc = ic->data;
bee_user_t *bu = iu->bu;
-
- if( bu == NULL )
+
+ if (bu == NULL) {
return FALSE;
-
- if( icc->type != IRC_CC_TYPE_GROUP )
- {
- irc_send_num( ic->irc, 482, "%s :Invitations are only possible to fill_by=group channels", ic->name );
+ }
+
+ if (icc->type != IRC_CC_TYPE_GROUP) {
+ irc_send_num(ic->irc, 482, "%s :Invitations are only possible to fill_by=group channels", ic->name);
return FALSE;
}
-
- bu->ic->acc->prpl->add_buddy( bu->ic, bu->handle,
- icc->group ? icc->group->name : NULL );
-
+
+ bu->ic->acc->prpl->add_buddy(bu->ic, bu->handle,
+ icc->group ? icc->group->name : NULL);
+
return TRUE;
}
-static void control_channel_kick( irc_channel_t *ic, irc_user_t *iu, const char *msg )
+static void control_channel_kick(irc_channel_t *ic, irc_user_t *iu, const char *msg)
{
struct irc_control_channel *icc = ic->data;
bee_user_t *bu = iu->bu;
-
- if( bu == NULL )
+
+ if (bu == NULL) {
return;
-
- if( icc->type != IRC_CC_TYPE_GROUP )
- {
- irc_send_num( ic->irc, 482, "%s :Kicks are only possible to fill_by=group channels", ic->name );
+ }
+
+ if (icc->type != IRC_CC_TYPE_GROUP) {
+ irc_send_num(ic->irc, 482, "%s :Kicks are only possible to fill_by=group channels", ic->name);
return;
}
-
- bu->ic->acc->prpl->remove_buddy( bu->ic, bu->handle,
- icc->group ? icc->group->name : NULL );
+
+ bu->ic->acc->prpl->remove_buddy(bu->ic, bu->handle,
+ icc->group ? icc->group->name : NULL);
}
-static char *set_eval_by_account( set_t *set, char *value );
-static char *set_eval_fill_by( set_t *set, char *value );
-static char *set_eval_by_group( set_t *set, char *value );
-static char *set_eval_by_protocol( set_t *set, char *value );
-static char *set_eval_show_users( set_t *set, char *value );
+static char *set_eval_by_account(set_t *set, char *value);
+static char *set_eval_fill_by(set_t *set, char *value);
+static char *set_eval_by_group(set_t *set, char *value);
+static char *set_eval_by_protocol(set_t *set, char *value);
+static char *set_eval_show_users(set_t *set, char *value);
-static gboolean control_channel_init( irc_channel_t *ic )
+static gboolean control_channel_init(irc_channel_t *ic)
{
struct irc_control_channel *icc;
-
- set_add( &ic->set, "account", NULL, set_eval_by_account, ic );
- set_add( &ic->set, "fill_by", "all", set_eval_fill_by, ic );
- set_add( &ic->set, "group", NULL, set_eval_by_group, ic );
- set_add( &ic->set, "protocol", NULL, set_eval_by_protocol, ic );
-
+
+ set_add(&ic->set, "account", NULL, set_eval_by_account, ic);
+ set_add(&ic->set, "fill_by", "all", set_eval_fill_by, ic);
+ set_add(&ic->set, "group", NULL, set_eval_by_group, ic);
+ set_add(&ic->set, "protocol", NULL, set_eval_by_protocol, ic);
+
/* When changing the default, also change it below. */
- set_add( &ic->set, "show_users", "online+,special%,away", set_eval_show_users, ic );
-
- ic->data = icc = g_new0( struct irc_control_channel, 1 );
+ set_add(&ic->set, "show_users", "online+,special%,away", set_eval_show_users, ic);
+
+ ic->data = icc = g_new0(struct irc_control_channel, 1);
icc->type = IRC_CC_TYPE_DEFAULT;
-
+
/* Have to run the evaluator to initialize icc->modes. */
- set_setstr( &ic->set, "show_users", "online+,special%,away" );
-
+ set_setstr(&ic->set, "show_users", "online+,special%,away");
+
/* For scripts that care. */
- irc_channel_set_mode( ic, "+C" );
-
+ irc_channel_set_mode(ic, "+C");
+
return TRUE;
}
-static gboolean control_channel_join( irc_channel_t *ic )
+static gboolean control_channel_join(irc_channel_t *ic)
{
- bee_irc_channel_update( ic->irc, ic, NULL );
-
+ bee_irc_channel_update(ic->irc, ic, NULL);
+
return TRUE;
}
-static char *set_eval_by_account( set_t *set, char *value )
+static char *set_eval_by_account(set_t *set, char *value)
{
struct irc_channel *ic = set->data;
struct irc_control_channel *icc = ic->data;
account_t *acc;
-
- if( !( acc = account_get( ic->irc->b, value ) ) )
+
+ if (!(acc = account_get(ic->irc->b, value))) {
return SET_INVALID;
-
+ }
+
icc->account = acc;
- if( ( icc->type & IRC_CC_TYPE_MASK ) == IRC_CC_TYPE_ACCOUNT )
- bee_irc_channel_update( ic->irc, ic, NULL );
-
- return g_strdup( acc->tag );
+ if ((icc->type & IRC_CC_TYPE_MASK) == IRC_CC_TYPE_ACCOUNT) {
+ bee_irc_channel_update(ic->irc, ic, NULL);
+ }
+
+ return g_strdup(acc->tag);
}
-static char *set_eval_fill_by( set_t *set, char *value )
+static char *set_eval_fill_by(set_t *set, char *value)
{
struct irc_channel *ic = set->data;
struct irc_control_channel *icc = ic->data;
char *s;
-
- icc->type &= ~( IRC_CC_TYPE_MASK | IRC_CC_TYPE_INVERT );
-
+
+ icc->type &= ~(IRC_CC_TYPE_MASK | IRC_CC_TYPE_INVERT);
+
s = value;
- if( s[0] == '!' )
- {
+ if (s[0] == '!') {
icc->type |= IRC_CC_TYPE_INVERT;
- s ++;
+ s++;
}
-
- if( strcmp( s, "all" ) == 0 )
+
+ if (strcmp(s, "all") == 0) {
icc->type |= IRC_CC_TYPE_DEFAULT;
- else if( strcmp( s, "rest" ) == 0 )
+ } else if (strcmp(s, "rest") == 0) {
icc->type |= IRC_CC_TYPE_REST;
- else if( strcmp( s, "group" ) == 0 )
+ } else if (strcmp(s, "group") == 0) {
icc->type |= IRC_CC_TYPE_GROUP;
- else if( strcmp( s, "account" ) == 0 )
+ } else if (strcmp(s, "account") == 0) {
icc->type |= IRC_CC_TYPE_ACCOUNT;
- else if( strcmp( s, "protocol" ) == 0 )
+ } else if (strcmp(s, "protocol") == 0) {
icc->type |= IRC_CC_TYPE_PROTOCOL;
- else
+ } else {
return SET_INVALID;
-
- bee_irc_channel_update( ic->irc, ic, NULL );
+ }
+
+ bee_irc_channel_update(ic->irc, ic, NULL);
return value;
}
-static char *set_eval_by_group( set_t *set, char *value )
+static char *set_eval_by_group(set_t *set, char *value)
{
struct irc_channel *ic = set->data;
struct irc_control_channel *icc = ic->data;
-
- icc->group = bee_group_by_name( ic->irc->b, value, TRUE );
- if( ( icc->type & IRC_CC_TYPE_MASK ) == IRC_CC_TYPE_GROUP )
- bee_irc_channel_update( ic->irc, ic, NULL );
-
- return g_strdup( icc->group->name );
+
+ icc->group = bee_group_by_name(ic->irc->b, value, TRUE);
+ if ((icc->type & IRC_CC_TYPE_MASK) == IRC_CC_TYPE_GROUP) {
+ bee_irc_channel_update(ic->irc, ic, NULL);
+ }
+
+ return g_strdup(icc->group->name);
}
-static char *set_eval_by_protocol( set_t *set, char *value )
+static char *set_eval_by_protocol(set_t *set, char *value)
{
struct irc_channel *ic = set->data;
struct irc_control_channel *icc = ic->data;
struct prpl *prpl;
-
- if( !( prpl = find_protocol( value ) ) )
+
+ if (!(prpl = find_protocol(value))) {
return SET_INVALID;
-
+ }
+
icc->protocol = prpl;
- if( ( icc->type & IRC_CC_TYPE_MASK ) == IRC_CC_TYPE_PROTOCOL )
- bee_irc_channel_update( ic->irc, ic, NULL );
-
+ if ((icc->type & IRC_CC_TYPE_MASK) == IRC_CC_TYPE_PROTOCOL) {
+ bee_irc_channel_update(ic->irc, ic, NULL);
+ }
+
return value;
}
-static char *set_eval_show_users( set_t *set, char *value )
+static char *set_eval_show_users(set_t *set, char *value)
{
struct irc_channel *ic = set->data;
struct irc_control_channel *icc = ic->data;
- char **parts = g_strsplit( value, ",", 0 ), **part;
+ char **parts = g_strsplit(value, ",", 0), **part;
char modes[5];
-
- memset( modes, 0, 5 );
- for( part = parts; *part; part ++ )
- {
+
+ memset(modes, 0, 5);
+ for (part = parts; *part; part++) {
char last, modechar = IRC_CHANNEL_USER_NONE;
-
- if( **part == '\0' )
+
+ if (**part == '\0') {
goto fail;
-
- last = (*part)[strlen(*part+1)];
- if( last == '+' )
+ }
+
+ last = (*part)[strlen(*part + 1)];
+ if (last == '+') {
modechar = IRC_CHANNEL_USER_VOICE;
- else if( last == '%' )
+ } else if (last == '%') {
modechar = IRC_CHANNEL_USER_HALFOP;
- else if( last == '@' )
+ } else if (last == '@') {
modechar = IRC_CHANNEL_USER_OP;
-
- if( strncmp( *part, "offline", 7 ) == 0 )
+ }
+
+ if (strncmp(*part, "offline", 7) == 0) {
modes[0] = modechar;
- else if( strncmp( *part, "away", 4 ) == 0 )
+ } else if (strncmp(*part, "away", 4) == 0) {
modes[1] = modechar;
- else if( strncmp( *part, "special", 7 ) == 0 )
+ } else if (strncmp(*part, "special", 7) == 0) {
modes[2] = modechar;
- else if( strncmp( *part, "online", 6 ) == 0 )
+ } else if (strncmp(*part, "online", 6) == 0) {
modes[3] = modechar;
- else
+ } else {
goto fail;
+ }
}
- memcpy( icc->modes, modes, 5 );
- bee_irc_channel_update( ic->irc, ic, NULL );
-
- g_strfreev( parts );
+ memcpy(icc->modes, modes, 5);
+ bee_irc_channel_update(ic->irc, ic, NULL);
+
+ g_strfreev(parts);
return value;
-
+
fail:
- g_strfreev( parts );
- return SET_INVALID;
+ g_strfreev(parts);
+ return SET_INVALID;
}
/* Figure out if a channel is supposed to have the user, assuming s/he is
online or otherwise also selected by the show_users setting. Only works
for control channels, but does *not* check if this channel is of that
type. Beware! */
-gboolean irc_channel_wants_user( irc_channel_t *ic, irc_user_t *iu )
+gboolean irc_channel_wants_user(irc_channel_t *ic, irc_user_t *iu)
{
struct irc_control_channel *icc = ic->data;
gboolean ret = FALSE;
-
- if( iu->bu == NULL )
+
+ if (iu->bu == NULL) {
return FALSE;
-
- switch( icc->type & IRC_CC_TYPE_MASK )
- {
+ }
+
+ switch (icc->type & IRC_CC_TYPE_MASK) {
case IRC_CC_TYPE_GROUP:
ret = iu->bu->group == icc->group;
break;
@@ -829,29 +860,30 @@ gboolean irc_channel_wants_user( irc_channel_t *ic, irc_user_t *iu )
ret = TRUE;
break;
}
-
- if( icc->type & IRC_CC_TYPE_INVERT )
+
+ if (icc->type & IRC_CC_TYPE_INVERT) {
ret = !ret;
-
+ }
+
return ret;
}
-static gboolean control_channel_free( irc_channel_t *ic )
+static gboolean control_channel_free(irc_channel_t *ic)
{
struct irc_control_channel *icc = ic->data;
-
- set_del( &ic->set, "account" );
- set_del( &ic->set, "fill_by" );
- set_del( &ic->set, "group" );
- set_del( &ic->set, "protocol" );
- set_del( &ic->set, "show_users" );
-
- g_free( icc );
+
+ set_del(&ic->set, "account");
+ set_del(&ic->set, "fill_by");
+ set_del(&ic->set, "group");
+ set_del(&ic->set, "protocol");
+ set_del(&ic->set, "show_users");
+
+ g_free(icc);
ic->data = NULL;
-
+
/* For scripts that care. */
- irc_channel_set_mode( ic, "-C" );
-
+ irc_channel_set_mode(ic, "-C");
+
return TRUE;
}
@@ -862,7 +894,7 @@ static const struct irc_channel_funcs control_channel_funcs = {
NULL,
control_channel_invite,
control_channel_kick,
-
+
control_channel_init,
control_channel_free,
};