From 3efdb35480dd6fa656d0728cab5c8dc76eaba24c Mon Sep 17 00:00:00 2001 From: Jonas Gunz Date: Sat, 30 Nov 2019 12:29:12 +0100 Subject: added qname_to_fqdn(), working --- src/dns.c | 27 ++++++++++++++++++++++++--- src/dns.h | 4 +++- 2 files changed, 27 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/dns.c b/src/dns.c index 54ad504..7c94c8a 100644 --- a/src/dns.c +++ b/src/dns.c @@ -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; } diff --git a/src/dns.h b/src/dns.h index 9f66367..5d8096e 100644 --- a/src/dns.h +++ b/src/dns.h @@ -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 ); -- cgit v1.2.3