From 863dceb4cdb4be100548d31c8e79d1ec4bee669c Mon Sep 17 00:00:00 2001 From: Bjorn Andersson Date: Sun, 11 Jun 2006 19:54:23 +0000 Subject: [PATCH] Merged open_dns(d), close_dns(d) --- dns.c | 72 ++++++++++++------------------------------------------- dns.h | 6 ++--- iodine.c | 6 ++++- iodined.c | 6 +++-- 4 files changed, 26 insertions(+), 64 deletions(-) diff --git a/dns.c b/dns.c index b171e6a..59f6eea 100644 --- a/dns.c +++ b/dns.c @@ -49,16 +49,15 @@ uint16_t pingid; int -open_dns(const char *host, const char *domain) +open_dns(const char *domain, int localport) { int fd; int flag; struct sockaddr_in addr; - struct hostent *h; bzero(&addr, sizeof(addr)); addr.sin_family = AF_INET; - addr.sin_port = htons(0); + addr.sin_port = htons(localport); addr.sin_addr.s_addr = htonl(INADDR_ANY); fd = socket(AF_INET, SOCK_DGRAM, 0); @@ -78,8 +77,18 @@ open_dns(const char *host, const char *domain) return -1; } + // Save top domain used + strncpy(topdomain, domain, sizeof(topdomain) - 2); + topdomain[sizeof(topdomain) - 1] = 0; + printf("Opened UDP socket\n"); - printf("Sending queries for %s to %s\n", domain, host); + return fd; +} + +int +dns_settarget(const char *host) +{ + struct hostent *h; // Init dns target struct h = gethostbyname(host); @@ -87,64 +96,19 @@ open_dns(const char *host, const char *domain) printf("Could not resolve name %s, exiting\n", host); return -1; } + bzero(&peer, sizeof(peer)); peer.sin_family = AF_INET; peer.sin_port = htons(53); peer.sin_addr = *((struct in_addr *) h->h_addr); - // Save top domain used - strncpy(topdomain, domain, sizeof(topdomain) - 2); - topdomain[sizeof(topdomain) - 1] = 0; - // Init chunk id chunkid = 0; pingid = 0; - return fd; + return 0; } -int -open_dnsd(const char *domain) -{ - int fd; - int flag; - struct sockaddr_in addr; - - bzero(&addr, sizeof(addr)); - addr.sin_family = AF_INET; - addr.sin_port = htons(53); - addr.sin_addr.s_addr = htonl(INADDR_ANY); - - fd = socket(AF_INET, SOCK_DGRAM, 0); - if(fd < 0) { - warn("socket"); - return -1; - } - - flag = 1; -#ifdef SO_REUSEPORT - setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &flag, sizeof(flag)); -#endif - setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(flag)); - - if(bind(fd, (struct sockaddr*)&addr, sizeof(addr)) < 0) { - warn("bind"); - return -1; - } - - printf("Opened UDP socket\n"); - printf("Listening to dns for domain %s\n", domain); - - // Save top domain used - strncpy(topdomain, domain, sizeof(topdomain) - 2); - topdomain[sizeof(topdomain) - 1] = 0; - - packetlen = 0; - - return fd; -} - - void close_dns(int fd) { @@ -497,12 +461,6 @@ decodepacket(const char *name, char *buf, int buflen) return len; } -void -close_dnsd(int fd) -{ - close(fd); -} - int dnsd_read(int fd, struct query *q, char *buf, int buflen) { diff --git a/dns.h b/dns.h index 4941beb..ad27b6b 100644 --- a/dns.h +++ b/dns.h @@ -17,7 +17,8 @@ #ifndef _DNS_H_ #define _DNS_H_ -int open_dns(const char *, const char *); +int open_dns(const char *, int); +int dns_settarget(const char*); void close_dns(int); int dns_sending(); @@ -29,9 +30,6 @@ int dns_read(int, char *, int); extern struct sockaddr_in peer; -int open_dnsd(const char *); -void close_dnsd(int); - int dnsd_read(int, struct query*, char *, int); void dnsd_send(int, struct query*, char *, int); diff --git a/iodine.c b/iodine.c index 5d77532..5a54912 100644 --- a/iodine.c +++ b/iodine.c @@ -247,8 +247,12 @@ main(int argc, char **argv) if ((tun_fd = open_tun()) == -1) goto cleanup1; - if ((dns_fd = open_dns(argv[0], argv[1])) == -1) + if ((dns_fd = open_dns(argv[0], 0)) == -1) goto cleanup2; + if (dns_settarget(argv[1]) == -1) + goto cleanup2; + + printf("Sending queries for %s to %s\n", argv[1], argv[0]); signal(SIGINT, sighandler); signal(SIGTERM, sighandler); diff --git a/iodined.c b/iodined.c index 5960057..e49fcc3 100644 --- a/iodined.c +++ b/iodined.c @@ -249,8 +249,10 @@ main(int argc, char **argv) goto cleanup0; if (tun_setip(argv[0]) != 0 || tun_setmtu(mtu) != 0) goto cleanup1; - if ((dnsd_fd = open_dnsd(argv[1])) == -1) + if ((dnsd_fd = open_dns(argv[1], 53)) == -1) goto cleanup2; + + printf("Listening to dns for domain %s\n", argv[1]); if (newroot) { if (chroot(newroot) != 0 || chdir("/") != 0) @@ -277,7 +279,7 @@ main(int argc, char **argv) tunnel(tun_fd, dnsd_fd); cleanup2: - close_dnsd(dnsd_fd); + close_dns(dnsd_fd); cleanup1: close_tun(tun_fd); cleanup0: