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 |