Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
@@ -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

1 change: 1 addition & 0 deletions common.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#include <arpa/inet.h> // for inet_aton
#include <unistd.h> // for usleep, fork
#include <stdlib.h> // for exit
#include <stdio.h>

#include "config.h"
#include "parse.h"
Expand Down
11 changes: 7 additions & 4 deletions config.c
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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:
Expand Down Expand Up @@ -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);
Expand All @@ -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);
}
2 changes: 2 additions & 0 deletions config.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
9 changes: 5 additions & 4 deletions main.c
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand Down Expand Up @@ -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");
Expand All @@ -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;
Expand Down
6 changes: 5 additions & 1 deletion tinydns.conf
Original file line number Diff line number Diff line change
@@ -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",
],

}