diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/dns.c | 27 | ||||
-rw-r--r-- | src/dns.h | 4 |
2 files changed, 27 insertions, 4 deletions
@@ -2,7 +2,6 @@ int fqdn_to_qname( char* _source, int _sourcelen, char* _sink ,int _sinklen ) { - // TODO Opttimize int i; int lastdot = 0; @@ -17,7 +16,7 @@ int fqdn_to_qname( char* _source, int _sourcelen, char* _sink ,int _sinklen ) _sink[i+1] = _source[i]; } - if( _source[i] ) // _source not terminated + if( _source[i] ) // _source not terminated, thus no valid string return -1; for (int o = 0; o < i; o++) { @@ -36,5 +35,27 @@ int fqdn_to_qname( char* _source, int _sourcelen, char* _sink ,int _sinklen ) int qname_to_fqdn( char* _source, int _sourcelen, char* _sink, int _sinklen ) { - return -1; + if ( !_sourcelen || !_sinklen ) { + return -1; + } + + unsigned int next_dot = _source[0] + 1; + int i = 1; + for(i = 1; i < _sourcelen; i++) { + if( i > _sinklen){ //Output too small. Not >= bc sink[i-1] is used + return -1; + } + if ( !_source[i] ) { + _sink[i-1] = '\0'; + break; + } else if (i == next_dot) { + _sink[i-1]='.'; + next_dot = _source[i] + i + 1; + } else { + _sink[i-1] = _source[i]; + } + + } + + return i-1; } @@ -12,6 +12,8 @@ int fqdn_to_qname( char* _source, int _sourcelen, char* _sink, int _sinklen ); /** - * Opposite of fqdn_to_qname() + * Convert a QNAME back to a FQDN, reversing fqdn_to_qname( ) + * returns: length of string in _sink, < 0 on failure + * _sink may still be altered in failed attempts, but not terminated. * */ int qname_to_fqdn( char* _source, int _sourcelen, char* _sink, int _sinklen ); |