diff options
author | Jonas Gunz <himself@jonasgunz.de> | 2019-11-02 16:38:44 +0100 |
---|---|---|
committer | Jonas Gunz <himself@jonasgunz.de> | 2019-11-02 16:38:44 +0100 |
commit | 73ede020c76126e81325fcd8d3e186132db21198 (patch) | |
tree | 24850bdbecced0aff461000f9fc545c8576d1e72 | |
parent | 0ef067ee3c394a296a8e091e8b365e29036df085 (diff) | |
download | dns-73ede020c76126e81325fcd8d3e186132db21198.tar.gz |
Added fqdn to qname
-rw-r--r-- | src/dns.c | 40 | ||||
-rw-r--r-- | src/dns.h | 17 | ||||
-rw-r--r-- | src/main.c | 29 |
3 files changed, 85 insertions, 1 deletions
diff --git a/src/dns.c b/src/dns.c new file mode 100644 index 0000000..5045e2a --- /dev/null +++ b/src/dns.c @@ -0,0 +1,40 @@ +#include "dns.h" + +int fqdn_to_qname( char* _source, int _sourcelen, char* _sink ,int _sinklen ) +{ + // TODO Opttimize + int i = 0; + int lastdot = 0; + + if (_sourcelen < 1 || _sinklen < 1) + return -1; + + _sink[0] = ' '; //Set to known value + + while ( (i < _sourcelen) && (i < (_sinklen - 1))) { //Copy offset 1 + if(! _source[i]) + break; + _sink[i+1] = _source[i]; + i++; + } + + if( _source[i] ) // _source not terminated + return -1; + + for (int o = 0; o < i; o++) { + if( _sink[o] == '.') { + _sink[lastdot] = o - lastdot - 1; + lastdot = o; + } + } + + _sink[lastdot] = i - lastdot; + _sink[i + 1] = 0; + + return i+2; +} + +int qname_to_fqdn( char* _source, int _sourcelen, char* _sink, int _sinklen ) +{ + return -1; +} diff --git a/src/dns.h b/src/dns.h new file mode 100644 index 0000000..9f66367 --- /dev/null +++ b/src/dns.h @@ -0,0 +1,17 @@ +#pragma once + +#include <stdint.h> + +/** + * Convert a null terminated string containing a + * fqdn (eg server.example.com) to the binary format used by DNS records + * ( [6]server[7]example[3]com[0] ) + * returns: length of string in _sink, < 0 on failure + * _sink might not be terminated on error. + * */ +int fqdn_to_qname( char* _source, int _sourcelen, char* _sink, int _sinklen ); + +/** + * Opposite of fqdn_to_qname() + * */ +int qname_to_fqdn( char* _source, int _sourcelen, char* _sink, int _sinklen ); @@ -28,8 +28,35 @@ void signal_term ( ); void signal_term_child ( ); +int test_main( int argc, + char* argv[] ) +{ + printf("TEST MODE. NOT FUNCTIONAL\n"); + + char in[128]; + char out[128]; + + strncpy ( in, "www.example.com\0", 127); + + printf("%s\n", in); + + int written = fqdn_to_qname (in,128,out,128); + + if (written < 0) { + printf("invallid fqdn\n"); + return 1; + } + + for(int i = 0; i < written; i++) + printf(" %x ", out[i]); + + printf("\n\n"); + return 0; +} + int main( int argc, - char* argv[] ) { + char* argv[] ) +{ int ret; struct sockaddr_in sock_server_addr; |