diff options
| author | Wilmer van der Gaast <wilmer@gaast.net> | 2006-01-04 12:16:58 +0100 | 
|---|---|---|
| committer | Wilmer van der Gaast <wilmer@gaast.net> | 2006-01-04 12:16:58 +0100 | 
| commit | 2a6ca4f4d8c8ec86b8bb38442189c85a001a5f6c (patch) | |
| tree | e729b90180c52018171acc5947b9ea18cb9bb479 /util.c | |
| parent | 13c4cd343f661fae01660fa8b889c9dfac4a36ef (diff) | |
Better handling of IPv4 connections in IPv6 mode. (Wrapping/Unwrapping of ::ffff:style addresses.)
Diffstat (limited to 'util.c')
| -rw-r--r-- | util.c | 40 | 
1 files changed, 40 insertions, 0 deletions
| @@ -402,3 +402,43 @@ char *strip_newlines( char *source )  	return source;  } + +#ifdef IPV6 +/* 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 ); +} +#endif | 
