diff options
| -rw-r--r-- | bitlbee.c | 8 | ||||
| -rwxr-xr-x | debian/postinst | 9 | ||||
| -rwxr-xr-x | debian/prerm | 9 | ||||
| -rw-r--r-- | irc.c | 30 | ||||
| -rw-r--r-- | lib/misc.c | 38 | ||||
| -rw-r--r-- | lib/misc.h | 3 | 
6 files changed, 83 insertions, 14 deletions
| @@ -51,7 +51,8 @@ int bitlbee_daemon_init()  	i = getaddrinfo( global.conf->iface, global.conf->port, &hints,   						&addrinfo_bind ); -	if ( i ) { +	if( i ) +	{  		log_message( LOGLVL_ERROR, "Couldn't parse address `%s': %s",   					 global.conf->iface, gai_strerror(i) );  		return -1; @@ -59,10 +60,11 @@ int bitlbee_daemon_init()  	global.listen_socket = -1; -	for ( res = addrinfo_bind; res; res = res->ai_next ) { +	for( res = addrinfo_bind; res; res = res->ai_next ) +	{  		global.listen_socket = socket( res->ai_family, res->ai_socktype,   									   res->ai_protocol ); -		if ( global.listen_socket < 0 ) +		if( global.listen_socket < 0 )  			continue;  		/* TIME_WAIT (?) sucks.. */ diff --git a/debian/postinst b/debian/postinst index 6c99c40d..37608e47 100755 --- a/debian/postinst +++ b/debian/postinst @@ -45,6 +45,15 @@ EOF  ## Bye-bye DebConf, we don't need you anymore.  db_stop +## Restore the helpfile in case we weren't upgrading but just reconfiguring: +if [ -e /usr/share/bitlbee/help.upgrading ]; then +	if [ -e /usr/share/bitlbee/help.txt ]; then +		rm -f /usr/share/bitlbee/help.upgrading +	else +		mv /usr/share/bitlbee/help.upgrading /usr/share/bitlbee/help.txt +	fi +fi +  if [ -n "$2" -a "$BITLBEE_UPGRADE_DONT_RESTART" != "1" ]; then  	/etc/init.d/bitlbee restart  fi diff --git a/debian/prerm b/debian/prerm index c02b13f4..5272e273 100755 --- a/debian/prerm +++ b/debian/prerm @@ -1,8 +1,13 @@  #!/bin/sh -e  if [ "$1" = "upgrade" ]; then -	## To prevent the help function from breaking in currently running BitlBee processes -	rm -f /usr/share/bitlbee/help.txt +	## To prevent the help function from breaking in currently running +	## BitlBee processes. Have to do it like this because dpkg-reconfigure +	## looks a lot like an upgrade and we don't want to lose help.txt... +	if [ -e /usr/share/bitlbee/help.txt ]; then +		rm -f /usr/share/bitlbee/help.upgrading +		mv /usr/share/bitlbee/help.txt /usr/share/bitlbee/help.upgrading +	fi  else  	/etc/init.d/bitlbee stop || exit 0  fi @@ -65,26 +65,38 @@ irc_t *irc_new( int fd )  	irc->channel = g_strdup( ROOT_CHAN );  	if( global.conf->hostname ) +	{  		irc->myhost = g_strdup( global.conf->hostname ); +	}  	else if( getsockname( irc->fd, (struct sockaddr*) &sock, &socklen ) == 0 )   	{ -		irc->myhost = g_new0( char, NI_MAXHOST ); +		char buf[NI_MAXHOST+1]; -		if (getnameinfo( (struct sockaddr *) &sock, socklen, irc->myhost,  -						NI_MAXHOST, NULL, -1, 0) ) { +		if( getnameinfo( (struct sockaddr *) &sock, socklen, buf, +		                 NI_MAXHOST, NULL, -1, 0 ) == 0 ) +		{ +			irc->myhost = g_strdup( ipv6_unwrap( buf ) ); +		} +		else +		{  			/* Rare, but possible. */ -			strncpy( irc->myhost, "localhost.", NI_MAXHOST ); +			strncpy( irc->myhost, "localhost.localdomain", NI_MAXHOST );  		}  	}  	if( getpeername( irc->fd, (struct sockaddr*) &sock, &socklen ) == 0 )  	{ -		irc->host = g_new0( char, NI_MAXHOST ); +		char buf[NI_MAXHOST+1]; -		if ( getnameinfo( (struct sockaddr *)&sock, socklen, irc->host,  -						NI_MAXHOST, NULL, -1, 0 ) ) { +		if( getnameinfo( (struct sockaddr *)&sock, socklen, buf, +		                 NI_MAXHOST, NULL, -1, 0 ) == 0 ) +		{ +			irc->host = g_strdup( ipv6_unwrap( buf ) ); +		} +		else +		{  			/* Rare, but possible. */ -			strncpy( irc->myhost, "localhost.", NI_MAXHOST ); +			strncpy( irc->host, "localhost.localdomain", NI_MAXHOST );  		}  	} @@ -713,7 +725,7 @@ void irc_login( irc_t *irc )  	u->online = 1;  	irc_spawn( irc, u ); -	irc_usermsg( irc, "Welcome to the BitlBee gateway!\n\nIf you've never used BitlBee before, please do read the help information using the \x02help\x02 command. Lots of FAQ's are answered there." ); +	irc_usermsg( irc, "Welcome to the BitlBee gateway!\n\nIf you've never used BitlBee before, please do read the help information using the \x02help\x02 command. Lots of FAQs are answered there." );  	if( global.conf->runmode == RUNMODE_FORKDAEMON || global.conf->runmode == RUNMODE_DAEMON )  		ipc_to_master_str( "CLIENT %s %s :%s\r\n", irc->host, irc->nick, irc->realname ); @@ -321,6 +321,44 @@ char *strip_newlines( char *source )  	return source;  } +/* Wrap an IPv4 address into IPv6 space. Not thread-safe... */ +char *ipv6_wrap( char *src ) +{ +	static char dst[64]; +	int i; +	 +	for( i = 0; src[i]; i ++ ) +		if( ( src[i] < '0' || src[i] > '9' ) && src[i] != '.' ) +			break; +	 +	/* Hmm, it's not even an IP... */ +	if( src[i] ) +		return src; +	 +	g_snprintf( dst, sizeof( dst ), "::ffff:%s", src ); +	 +	return dst; +} + +/* Unwrap an IPv4 address into IPv6 space. Thread-safe, because it's very simple. :-) */ +char *ipv6_unwrap( char *src ) +{ +	int i; +	 +	if( g_strncasecmp( src, "::ffff:", 7 ) != 0 ) +		return src; +	 +	for( i = 7; src[i]; i ++ ) +		if( ( src[i] < '0' || src[i] > '9' ) && src[i] != '.' ) +			break; +	 +	/* Hmm, it's not even an IP... */ +	if( src[i] ) +		return src; +	 +	return ( src + 7 ); +} +  /* Convert from one charset to another.     from_cs, to_cs: Source and destination charsets @@ -51,6 +51,9 @@ G_MODULE_EXPORT char *escape_html( const char *html );  G_MODULE_EXPORT void http_decode( char *s );  G_MODULE_EXPORT void http_encode( char *s ); +G_MODULE_EXPORT char *ipv6_wrap( char *src ); +G_MODULE_EXPORT char *ipv6_unwrap( char *src ); +  G_MODULE_EXPORT signed int do_iconv( char *from_cs, char *to_cs, char *src, char *dst, size_t size, size_t maxbuf );  G_MODULE_EXPORT void random_bytes( unsigned char *buf, int count ); | 
