diff options
| author | Wilmer van der Gaast <wilmer@gaast.net> | 2010-03-26 21:57:00 -0400 | 
|---|---|---|
| committer | Wilmer van der Gaast <wilmer@gaast.net> | 2010-03-26 21:57:00 -0400 | 
| commit | ebaebfe35c82460581fa6db518d8848996c9a0f4 (patch) | |
| tree | 6b0aab8542a40e7af5999b940f60374d808df887 | |
| parent | 3ddb7477f51d3cf1632e2a8b6f7da4c0609a52cb (diff) | |
PING and QUIT work now, and adding some files that weren't checked in so
far.
| -rw-r--r-- | irc.c | 10 | ||||
| -rw-r--r-- | irc.h | 1 | ||||
| -rw-r--r-- | irc_commands.c | 7 | ||||
| -rw-r--r-- | irc_send.c | 153 | ||||
| -rw-r--r-- | irc_user.c | 113 | ||||
| -rw-r--r-- | protocols/bee.c | 47 | ||||
| -rw-r--r-- | protocols/bee.h | 18 | ||||
| -rw-r--r-- | protocols/bee.o | bin | 0 -> 8692 bytes | 
8 files changed, 344 insertions, 5 deletions
@@ -123,13 +123,16 @@ irc_t *irc_new( int fd )  	irc->user = g_new0( irc_user_t, 1 );  	irc->user->host = g_strdup( host ); -	conf_loaddefaults( b ); +	conf_loaddefaults( irc );  	/* Evaluator sets the iconv/oconv structures. */  	set_eval_charset( set_find( &b->set, "charset" ), set_getstr( &b->set, "charset" ) );  	irc_write( irc, ":%s NOTICE AUTH :%s", irc->root->host, "BitlBee-IRCd initialized, please go on" ); +	g_free( myhost ); +	g_free( host ); +	  	return irc;  } @@ -202,7 +205,10 @@ void irc_free( irc_t * irc )  	*/  	while( irc->users ) -		irc_user_free( irc, irc->users->data ); +	{ +		irc_user_t *iu = irc->users->data; +		irc_user_free( irc, iu->nick ); +	}  	if( irc->ping_source_id > 0 )  		b_event_remove( irc->ping_source_id ); @@ -138,5 +138,6 @@ irc_user_t *irc_user_new( irc_t *irc, const char *nick );  int irc_user_free( irc_t *irc, const char *nick );  irc_user_t *irc_user_find( irc_t *irc, const char *nick );  int irc_user_rename( irc_t *irc, const char *old, const char *new ); +gint irc_user_cmp( gconstpointer a_, gconstpointer b_ );  #endif diff --git a/irc_commands.c b/irc_commands.c index 81ddd588..7a4ba57e 100644 --- a/irc_commands.c +++ b/irc_commands.c @@ -93,7 +93,6 @@ static void irc_cmd_nick( irc_t *irc, char **cmd )  	}  } -#if 0  static void irc_cmd_quit( irc_t *irc, char **cmd )  {  	if( cmd[1] && *cmd[1] ) @@ -104,9 +103,11 @@ static void irc_cmd_quit( irc_t *irc, char **cmd )  static void irc_cmd_ping( irc_t *irc, char **cmd )  { -	irc_write( irc, ":%s PONG %s :%s", irc->myhost, irc->myhost, cmd[1]?cmd[1]:irc->myhost ); +	irc_write( irc, ":%s PONG %s :%s", irc->root->host, +	           irc->root->host, cmd[1]?cmd[1]:irc->root->host );  } +#if 0  static void irc_cmd_oper( irc_t *irc, char **cmd )  {  	if( global.conf->oper_pass && @@ -579,9 +580,9 @@ static const command_t irc_commands[] = {  	{ "pass",        1, irc_cmd_pass,        0 },  	{ "user",        4, irc_cmd_user,        IRC_CMD_PRE_LOGIN },  	{ "nick",        1, irc_cmd_nick,        0 }, -#if 0  	{ "quit",        0, irc_cmd_quit,        0 },  	{ "ping",        0, irc_cmd_ping,        0 }, +#if 0  	{ "oper",        2, irc_cmd_oper,        IRC_CMD_LOGGED_IN },  	{ "mode",        1, irc_cmd_mode,        IRC_CMD_LOGGED_IN },  	{ "names",       0, irc_cmd_names,       IRC_CMD_LOGGED_IN }, diff --git a/irc_send.c b/irc_send.c new file mode 100644 index 00000000..7b4c567a --- /dev/null +++ b/irc_send.c @@ -0,0 +1,153 @@ +  /********************************************************************\ +  * BitlBee -- An IRC to other IM-networks gateway                     * +  *                                                                    * +  * Copyright 2002-2010 Wilmer van der Gaast and others                * +  \********************************************************************/ + +/* The IRC-based UI - Sending responses to commands/etc.                */ + +/* +  This program is free software; you can redistribute it and/or modify +  it under the terms of the GNU General Public License as published by +  the Free Software Foundation; either version 2 of the License, or +  (at your option) any later version. + +  This program is distributed in the hope that it will be useful, +  but WITHOUT ANY WARRANTY; without even the implied warranty of +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +  GNU General Public License for more details. + +  You should have received a copy of the GNU General Public License with +  the Debian GNU/Linux distribution in /usr/share/common-licenses/GPL; +  if not, write to the Free Software Foundation, Inc., 59 Temple Place, +  Suite 330, Boston, MA  02111-1307  USA +*/ + +#include "bitlbee.h" + +void irc_send_num( irc_t *irc, int code, char *format, ... ) +{ +	char text[IRC_MAX_LINE]; +	va_list params; +	 +	va_start( params, format ); +	g_vsnprintf( text, IRC_MAX_LINE, format, params ); +	va_end( params ); +	irc_write( irc, ":%s %03d %s %s", irc->root->host, code, irc->user->nick ? : "*", text ); +	 +	return; +} + +void irc_send_login( irc_t *irc ) +{ +	irc_user_t *iu = irc->user; +	 +	irc->user = irc_user_new( irc, iu->nick ); +	irc->user->user = iu->user; +	irc->user->fullname = iu->fullname; +	g_free( iu->nick ); +	g_free( iu ); +	 +	irc_send_num( irc,   1, ":Welcome to the BitlBee gateway, %s", irc->user->nick ); +	irc_send_num( irc,   2, ":Host %s is running BitlBee " BITLBEE_VERSION " " ARCH "/" CPU ".", irc->root->host ); +	irc_send_num( irc,   3, ":%s", IRCD_INFO ); +	irc_send_num( irc,   4, "%s %s %s %s", irc->root->host, BITLBEE_VERSION, UMODES UMODES_PRIV, CMODES ); +	irc_send_num( irc,   5, "PREFIX=(ov)@+ CHANTYPES=%s CHANMODES=,,,%s NICKLEN=%d NETWORK=BitlBee " +	                        "CASEMAPPING=rfc1459 MAXTARGETS=1 WATCH=128 :are supported by this server", +	                        CTYPES, CMODES, MAX_NICK_LENGTH - 1 ); +	irc_send_motd( irc ); +	irc->umode[0] = '\0'; +	/*irc_umode_set( irc, "+" UMODE, 1 );*/ +	 +	irc_usermsg( irc, "Welcome to the BitlBee gateway!\n\n" +	                  "If you've never used BitlBee before, please do read the help " +	                  "information using the \x02help\x02 command. Lots of FAQs are " +	                  "answered there.\n" +	                  "If you already have an account on this server, just use the " +	                  "\x02identify\x02 command to identify yourself." ); +	 +	if( global.conf->runmode == RUNMODE_FORKDAEMON || global.conf->runmode == RUNMODE_DAEMON ) +		ipc_to_master_str( "CLIENT %s %s :%s\r\n", irc->user->host, irc->user->nick, irc->user->fullname ); +	 +	irc->status |= USTATUS_LOGGED_IN; +	 +	/* This is for bug #209 (use PASS to identify to NickServ). */ +	if( irc->password != NULL ) +	{ +		char *send_cmd[] = { "identify", g_strdup( irc->password ), NULL }; +		 +		/*irc_setpass( irc, NULL );*/ +		/*root_command( irc, send_cmd );*/ +		g_free( send_cmd[1] ); +	} +} + +void irc_send_motd( irc_t *irc ) +{ +	int fd; +	 +	fd = open( global.conf->motdfile, O_RDONLY ); +	if( fd == -1 ) +	{ +		irc_send_num( irc, 422, ":We don't need MOTDs." ); +	} +	else +	{ +		char linebuf[80];	/* Max. line length for MOTD's is 79 chars. It's what most IRC networks seem to do. */ +		char *add, max; +		int len; +		 +		linebuf[79] = len = 0; +		max = sizeof( linebuf ) - 1; +		 +		irc_send_num( irc, 375, ":- %s Message Of The Day - ", irc->root->host ); +		while( read( fd, linebuf + len, 1 ) == 1 ) +		{ +			if( linebuf[len] == '\n' || len == max ) +			{ +				linebuf[len] = 0; +				irc_send_num( irc, 372, ":- %s", linebuf ); +				len = 0; +			} +			else if( linebuf[len] == '%' ) +			{ +				read( fd, linebuf + len, 1 ); +				if( linebuf[len] == 'h' ) +					add = irc->root->host; +				else if( linebuf[len] == 'v' ) +					add = BITLBEE_VERSION; +				else if( linebuf[len] == 'n' ) +					add = irc->user->nick; +				else +					add = "%"; +				 +				strncpy( linebuf + len, add, max - len ); +				while( linebuf[++len] ); +			} +			else if( len < max ) +			{ +				len ++; +			} +		} +		irc_send_num( irc, 376, ":End of MOTD" ); +		close( fd ); +	} +} + +/* FIXME/REPLACEME */ +int irc_usermsg( irc_t *irc, char *format, ... ) +{ +	char text[1024]; +	va_list params; +	//irc_user_t *iu; +	 +	va_start( params, format ); +	g_vsnprintf( text, sizeof( text ), format, params ); +	va_end( params ); +	 +	fprintf( stderr, "%s\n", text ); +	 +	return 1; +	 +	/*return( irc_msgfrom( irc, u->nick, text ) );*/ +} diff --git a/irc_user.c b/irc_user.c new file mode 100644 index 00000000..d1f07bb6 --- /dev/null +++ b/irc_user.c @@ -0,0 +1,113 @@ +  /********************************************************************\ +  * BitlBee -- An IRC to other IM-networks gateway                     * +  *                                                                    * +  * Copyright 2002-2004 Wilmer van der Gaast and others                * +  \********************************************************************/ + +/* Stuff to handle, save and search IRC buddies                         */ + +/* +  This program is free software; you can redistribute it and/or modify +  it under the terms of the GNU General Public License as published by +  the Free Software Foundation; either version 2 of the License, or +  (at your option) any later version. + +  This program is distributed in the hope that it will be useful, +  but WITHOUT ANY WARRANTY; without even the implied warranty of +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +  GNU General Public License for more details. + +  You should have received a copy of the GNU General Public License with +  the Debian GNU/Linux distribution in /usr/share/common-licenses/GPL; +  if not, write to the Free Software Foundation, Inc., 59 Temple Place, +  Suite 330, Boston, MA  02111-1307  USA +*/ + +#include "bitlbee.h" + +irc_user_t *irc_user_new( irc_t *irc, const char *nick ) +{ +	irc_user_t *iu = g_new0( irc_user_t, 1 ); +	 +	iu->nick = g_strdup( nick ); +	iu->user = iu->host = iu->fullname = iu->nick; +	 +	iu->is_private = set_getbool( &irc->b->set, "private" ); +	 +	iu->key = g_strdup( nick ); +	nick_lc( iu->key ); +	/* Using the hash table for speed and irc->users for easy iteration +	   through the list (since the GLib API doesn't have anything sane +	   for that.) */ +	g_hash_table_insert( irc->nick_user_hash, iu->key, iu ); +	irc->users = g_slist_insert_sorted( irc->users, iu, irc_user_cmp ); +	 +	return iu; +} + +int irc_user_free( irc_t *irc, const char *nick ) +{ +	irc_user_t *iu; +	 +	if( !( iu = irc_user_find( irc, nick ) ) ) +		return 0; +	 +	irc->users = g_slist_remove( irc->users, iu ); +	g_hash_table_remove( irc->nick_user_hash, iu->key ); +	 +	g_free( iu->nick ); +	if( iu->nick != iu->user ) g_free( iu->user ); +	if( iu->nick != iu->host ) g_free( iu->host ); +	if( iu->nick != iu->fullname ) g_free( iu->fullname ); +	g_free( iu->sendbuf ); +	if( iu->sendbuf_timer ) b_event_remove( iu->sendbuf_timer ); +	g_free( iu->key ); +	 +	return 1; +} + +irc_user_t *irc_user_find( irc_t *irc, const char *nick ) +{ +	char key[strlen(nick)+1]; +	 +	strcpy( key, nick ); +	if( nick_lc( key ) ) +		return g_hash_table_lookup( irc->nick_user_hash, key ); +	else +		return NULL; +} + +int irc_user_rename( irc_t *irc, const char *old, const char *new ) +{ +	irc_user_t *iu = irc_user_find( irc, old ); +	char key[strlen(new)+1]; +	 +	strcpy( key, new ); +	if( iu == NULL || !nick_lc( key ) || irc_user_find( irc, new ) ) +		return 0; +	 +	irc->users = g_slist_remove( irc->users, iu ); +	g_hash_table_remove( irc->nick_user_hash, iu->key ); +	 +	if( iu->nick == iu->user ) iu->user = NULL; +	if( iu->nick == iu->host ) iu->host = NULL; +	if( iu->nick == iu->fullname ) iu->fullname = NULL; +	g_free( iu->nick ); +	iu->nick = g_strdup( new ); +	if( iu->user == NULL ) iu->user = g_strdup( iu->nick ); +	if( iu->host == NULL ) iu->host = g_strdup( iu->nick ); +	if( iu->fullname == NULL ) iu->fullname = g_strdup( iu->nick ); +	 +	iu->key = g_strdup( key ); +	g_hash_table_insert( irc->nick_user_hash, iu->key, iu ); +	irc->users = g_slist_insert_sorted( irc->users, iu, irc_user_cmp ); +	 +	return 1; +} + +gint irc_user_cmp( gconstpointer a_, gconstpointer b_ ) +{ +	const irc_user_t *a = a_, *b = b_; +	 +	return strcmp( a->key, b->key ); +} diff --git a/protocols/bee.c b/protocols/bee.c new file mode 100644 index 00000000..c6f48901 --- /dev/null +++ b/protocols/bee.c @@ -0,0 +1,47 @@ +#include "bitlbee.h" + +bee_t *bee_new() +{ +	bee_t *b = g_new0( bee_t, 1 ); +	set_t *s; +	 +	s = set_add( &b->set, "away", NULL, NULL/*set_eval_away_status*/, b ); +	s->flags |= SET_NULL_OK; +	s = set_add( &b->set, "auto_connect", "true", set_eval_bool, b ); +	s = set_add( &b->set, "auto_reconnect", "true", set_eval_bool, b ); +	s = set_add( &b->set, "auto_reconnect_delay", "5*3<900", NULL/*set_eval_account_reconnect_delay*/, b ); +	s = set_add( &b->set, "debug", "false", set_eval_bool, b ); +	s = set_add( &b->set, "password", NULL, NULL/*set_eval_password*/, b ); +	s->flags |= SET_NULL_OK; +	s = set_add( &b->set, "save_on_quit", "true", set_eval_bool, b ); +	s = set_add( &b->set, "status", NULL, NULL/*set_eval_away_status*/, b ); +	s->flags |= SET_NULL_OK; +	s = set_add( &b->set, "strip_html", "true", NULL, b ); +	 +	return b; +} + +void bee_free( bee_t *b ) +{ +	while( b->accounts ) +	{ +		account_t *acc = b->accounts->data; +		 +		/* +		if( acc->ic ) +			imc_logout( acc->ic, FALSE ); +		else if( acc->reconnect ) +			cancel_auto_reconnect( acc ); +		*/ +		 +		if( acc->ic == NULL ) +			{} //account_del( b, acc ); +		else +			/* Nasty hack, but account_del() doesn't work in this +			   case and we don't want infinite loops, do we? ;-) */ +			b->accounts = g_slist_remove( b->accounts, acc ); +	} +	 +	while( b->set ) +		set_del( &b->set, b->set->key ); +} diff --git a/protocols/bee.h b/protocols/bee.h new file mode 100644 index 00000000..b25f0e08 --- /dev/null +++ b/protocols/bee.h @@ -0,0 +1,18 @@ +typedef struct bee_ui +{ +	void *data; +} bee_ui_t; + +typedef struct bee +{ +	struct set *set; +	 +	GSList *users; +	GSList *accounts; +	 +	//const bee_ui_funcs_t *ui; +	void *ui_data; +} bee_t; + +bee_t *bee_new(); +void bee_free( bee_t *b ); diff --git a/protocols/bee.o b/protocols/bee.o Binary files differnew file mode 100644 index 00000000..38c9044f --- /dev/null +++ b/protocols/bee.o  | 
