diff --git a/Makefile b/Makefile index 8e4ebdd..f3e3c97 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,9 @@ main: main.o cache.o config.o parse.o log.o help.o - cc -o tinydns *.o + gcc -o tinydns *.o -O2 + +%.o: %.c + gcc -O2 -c -o $@ $< + clean: rm -f *.o tinydns + diff --git a/common.h b/common.h index 1b59116..79c3dce 100644 --- a/common.h +++ b/common.h @@ -3,6 +3,7 @@ #include // for inet_aton #include // for usleep, fork #include // for exit +#include #include "config.h" #include "parse.h" diff --git a/config.c b/config.c index 55a7dbc..c55fb92 100644 --- a/config.c +++ b/config.c @@ -1,10 +1,10 @@ #include "common.h" -TConfig config = {"127.0.0.1", "8.8.8.8", 6*3600}; +TConfig config = {"127.0.0.1", 53, "8.8.8.8", 53, 6*3600}; char rr_buf[0xFFF] = {0}; -char* config_param(char* s, void* res, uint type) +char* config_param(char* s, void* res, unsigned int type) { THeader *rr = (THeader*)rr_buf; rr->QRCOUNT = htons(1); char *rr_ptr, *rr_dot; @@ -18,7 +18,7 @@ char* config_param(char* s, void* res, uint type) case 2: if (*s == '"') { state = 3; *(char**)res = s+1; } break; case 3: if (*s == '"') { state = 4; *s = 0; } break; case 4: return s; - case 5: if (*s >= '0' && *s <= '9') { state = 4; sscanf(s, "%d", &x); *(uint16_t*)res = x; } break; + case 5: if (*s >= '0' && *s <= '9') { state = 4; sscanf(s, "%d", &x); *(int*)res = x; return(s); } break; // add query/answer from config case 6: if (*s == ']') state = 4; if (*s == '"') { state = 7; rr_ptr = rr_dot = s; x = 0; } break; case 7: @@ -74,7 +74,9 @@ void config_parse(char* s) while (*ptr) { if (memcmp(ptr, "server_ip", 9) == 0) ptr = config_param(ptr, &config.server_ip, CONFIG_TYPE_STRING); - if (memcmp(ptr, "dns", 3) == 0) ptr = config_param(ptr, &config.dns, CONFIG_TYPE_STRING); + if (memcmp(ptr, "server_port", 11) == 0) ptr = config_param(ptr, &config.server_port, CONFIG_TYPE_INT); + if (memcmp(ptr, "dns:", 4) == 0) ptr = config_param(ptr, &config.dns, CONFIG_TYPE_STRING); + if (memcmp(ptr, "dns_port", 8) == 0) ptr = config_param(ptr, &config.dns_port, CONFIG_TYPE_INT); if (memcmp(ptr, "cache_time", 10) == 0) ptr = config_param(ptr, &config.cache_time, CONFIG_TYPE_INT); if (memcmp(ptr, "debug_level",11) == 0) ptr = config_param(ptr, &config.debug_level,CONFIG_TYPE_INT); if (memcmp(ptr, "rr", 2) == 0) ptr = config_param(ptr, NULL, CONFIG_TYPE_RR); @@ -101,4 +103,5 @@ void config_load() fclose(f); config_parse(config.data); + printf("bind on %s:%d; parent: %s:%d\n", config.server_ip, config.server_port,config.dns,config.dns_port); } diff --git a/config.h b/config.h index cdef360..2d5e817 100644 --- a/config.h +++ b/config.h @@ -7,7 +7,9 @@ typedef struct TConfig { char *server_ip; + uint16_t server_port; char *dns; + int dns_port; uint32_t cache_time; uint8_t debug_level; char *data; diff --git a/main.c b/main.c index d4d2a18..4c67be9 100644 --- a/main.c +++ b/main.c @@ -25,7 +25,7 @@ void loop(int sockfd) memset((char *) &out_addr, 0, sizeof(out_addr)); out_addr.sin_family = AF_INET; - out_addr.sin_port = htons(DNS_PORT); + out_addr.sin_port = htons(config.dns_port); inet_aton(config.dns, (struct in_addr *)&out_addr.sin_addr.s_addr); out_socket = socket(AF_INET, SOCK_DGRAM, 0); if (out_socket < 0) error("ERROR opening socket out"); @@ -162,7 +162,7 @@ int server_init() struct sockaddr_in6 serveraddr; /* server's addr */ memset((char *) &serveraddr, 0, sizeof(serveraddr)); serveraddr.sin6_family = AF_INET6; - serveraddr.sin6_port = htons(DNS_PORT); + serveraddr.sin6_port = htons(config.server_port); inet_pton(AF_INET6, config.server_ip, (struct in_addr *)&serveraddr.sin6_addr.s6_addr); if (bind(sock, (struct sockaddr *) &serveraddr, sizeof(serveraddr)) < 0) error("ERROR on binding ipv6"); @@ -172,14 +172,15 @@ int server_init() struct sockaddr_in serveraddr; /* server's addr */ memset((char *) &serveraddr, 0, sizeof(serveraddr)); serveraddr.sin_family = AF_INET; - serveraddr.sin_port = htons(DNS_PORT); + serveraddr.sin_port = htons(config.server_port); inet_aton(config.server_ip, (struct in_addr *)&serveraddr.sin_addr.s_addr); + printf("bind on %s:%d; parent: %s:%d\n", config.server_ip, config.server_port,config.dns,config.dns_port); if (bind(sock, (struct sockaddr *) &serveraddr, sizeof(serveraddr)) < 0) error("ERROR on binding ipv4"); } char s[0xFF]; - sprintf(s, "bind on %s:%d", config.server_ip, DNS_PORT); + sprintf(s, "bind on %s:%d", config.server_ip, config.server_port); log_s(s); return sock; diff --git a/tinydns.conf b/tinydns.conf index 88d06a1..8d5ef28 100644 --- a/tinydns.conf +++ b/tinydns.conf @@ -1,11 +1,15 @@ { server_ip: "127.0.0.1", // address or domain of tinydns server + server_port: 3053, // port of tinydns server dns: "8.8.8.8", // address of parent DNS server + dns_port: 53, // port of parent DNS server cache_time: 43200, // cache time in seconds - debug_level: 0, // 0 = no messages, 1 = show messages + debug_level: 1, // 0 = no messages, 1 = show messages + rr: [ "domain.example.com": "127.0.0.1", "_.*.example.com": "127.0.0.2", "*.example.com": "127.0.0.3", ], + }