Merged open_dns(d), close_dns(d)
This commit is contained in:
parent
1eda2d0472
commit
863dceb4cd
72
dns.c
72
dns.c
|
@ -49,16 +49,15 @@ uint16_t pingid;
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
open_dns(const char *host, const char *domain)
|
open_dns(const char *domain, int localport)
|
||||||
{
|
{
|
||||||
int fd;
|
int fd;
|
||||||
int flag;
|
int flag;
|
||||||
struct sockaddr_in addr;
|
struct sockaddr_in addr;
|
||||||
struct hostent *h;
|
|
||||||
|
|
||||||
bzero(&addr, sizeof(addr));
|
bzero(&addr, sizeof(addr));
|
||||||
addr.sin_family = AF_INET;
|
addr.sin_family = AF_INET;
|
||||||
addr.sin_port = htons(0);
|
addr.sin_port = htons(localport);
|
||||||
addr.sin_addr.s_addr = htonl(INADDR_ANY);
|
addr.sin_addr.s_addr = htonl(INADDR_ANY);
|
||||||
|
|
||||||
fd = socket(AF_INET, SOCK_DGRAM, 0);
|
fd = socket(AF_INET, SOCK_DGRAM, 0);
|
||||||
|
@ -78,8 +77,18 @@ open_dns(const char *host, const char *domain)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Save top domain used
|
||||||
|
strncpy(topdomain, domain, sizeof(topdomain) - 2);
|
||||||
|
topdomain[sizeof(topdomain) - 1] = 0;
|
||||||
|
|
||||||
printf("Opened UDP socket\n");
|
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
|
// Init dns target struct
|
||||||
h = gethostbyname(host);
|
h = gethostbyname(host);
|
||||||
|
@ -87,64 +96,19 @@ open_dns(const char *host, const char *domain)
|
||||||
printf("Could not resolve name %s, exiting\n", host);
|
printf("Could not resolve name %s, exiting\n", host);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
bzero(&peer, sizeof(peer));
|
bzero(&peer, sizeof(peer));
|
||||||
peer.sin_family = AF_INET;
|
peer.sin_family = AF_INET;
|
||||||
peer.sin_port = htons(53);
|
peer.sin_port = htons(53);
|
||||||
peer.sin_addr = *((struct in_addr *) h->h_addr);
|
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
|
// Init chunk id
|
||||||
chunkid = 0;
|
chunkid = 0;
|
||||||
pingid = 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
|
void
|
||||||
close_dns(int fd)
|
close_dns(int fd)
|
||||||
{
|
{
|
||||||
|
@ -497,12 +461,6 @@ decodepacket(const char *name, char *buf, int buflen)
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
close_dnsd(int fd)
|
|
||||||
{
|
|
||||||
close(fd);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
int
|
||||||
dnsd_read(int fd, struct query *q, char *buf, int buflen)
|
dnsd_read(int fd, struct query *q, char *buf, int buflen)
|
||||||
{
|
{
|
||||||
|
|
6
dns.h
6
dns.h
|
@ -17,7 +17,8 @@
|
||||||
#ifndef _DNS_H_
|
#ifndef _DNS_H_
|
||||||
#define _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);
|
void close_dns(int);
|
||||||
|
|
||||||
int dns_sending();
|
int dns_sending();
|
||||||
|
@ -29,9 +30,6 @@ int dns_read(int, char *, int);
|
||||||
|
|
||||||
extern struct sockaddr_in peer;
|
extern struct sockaddr_in peer;
|
||||||
|
|
||||||
int open_dnsd(const char *);
|
|
||||||
void close_dnsd(int);
|
|
||||||
|
|
||||||
int dnsd_read(int, struct query*, char *, int);
|
int dnsd_read(int, struct query*, char *, int);
|
||||||
void dnsd_send(int, struct query*, char *, int);
|
void dnsd_send(int, struct query*, char *, int);
|
||||||
|
|
||||||
|
|
6
iodine.c
6
iodine.c
|
@ -247,8 +247,12 @@ main(int argc, char **argv)
|
||||||
|
|
||||||
if ((tun_fd = open_tun()) == -1)
|
if ((tun_fd = open_tun()) == -1)
|
||||||
goto cleanup1;
|
goto cleanup1;
|
||||||
if ((dns_fd = open_dns(argv[0], argv[1])) == -1)
|
if ((dns_fd = open_dns(argv[0], 0)) == -1)
|
||||||
goto cleanup2;
|
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(SIGINT, sighandler);
|
||||||
signal(SIGTERM, sighandler);
|
signal(SIGTERM, sighandler);
|
||||||
|
|
|
@ -249,8 +249,10 @@ main(int argc, char **argv)
|
||||||
goto cleanup0;
|
goto cleanup0;
|
||||||
if (tun_setip(argv[0]) != 0 || tun_setmtu(mtu) != 0)
|
if (tun_setip(argv[0]) != 0 || tun_setmtu(mtu) != 0)
|
||||||
goto cleanup1;
|
goto cleanup1;
|
||||||
if ((dnsd_fd = open_dnsd(argv[1])) == -1)
|
if ((dnsd_fd = open_dns(argv[1], 53)) == -1)
|
||||||
goto cleanup2;
|
goto cleanup2;
|
||||||
|
|
||||||
|
printf("Listening to dns for domain %s\n", argv[1]);
|
||||||
|
|
||||||
if (newroot) {
|
if (newroot) {
|
||||||
if (chroot(newroot) != 0 || chdir("/") != 0)
|
if (chroot(newroot) != 0 || chdir("/") != 0)
|
||||||
|
@ -277,7 +279,7 @@ main(int argc, char **argv)
|
||||||
tunnel(tun_fd, dnsd_fd);
|
tunnel(tun_fd, dnsd_fd);
|
||||||
|
|
||||||
cleanup2:
|
cleanup2:
|
||||||
close_dnsd(dnsd_fd);
|
close_dns(dnsd_fd);
|
||||||
cleanup1:
|
cleanup1:
|
||||||
close_tun(tun_fd);
|
close_tun(tun_fd);
|
||||||
cleanup0:
|
cleanup0:
|
||||||
|
|
Loading…
Reference in New Issue