1
0
Fork 0
mirror of https://github.com/yarrick/iodine.git synced 2025-04-07 11:07:03 +00:00
This commit is contained in:
Julian Kranz 2012-01-22 02:33:28 +01:00 committed by Barak A. Pearlmutter
parent e4b9dd9376
commit 598a63fed1
5 changed files with 46 additions and 12 deletions

View file

@ -64,6 +64,7 @@ static int running;
static const char *password;
static struct sockaddr_in nameserv;
static struct sockaddr_in6 nameserv6;
static struct sockaddr_in raw_serv;
static struct sockaddr_in6 raw_serv6;
static const char *topdomain;
@ -226,6 +227,11 @@ setaddr:
nameserv.sin_family = AF_INET;
nameserv.sin_port = htons(port);
nameserv.sin_addr = addr;
memset(&nameserv6, 0, sizeof(nameserv6));
nameserv6.sin6_family = AF_INET6;
nameserv6.sin6_port = htons(port);
inet_pton(AF_INET6, "::1", &(nameserv6.sin6_addr));
}
void
@ -347,7 +353,10 @@ send_query(int fd, char *hostname)
fprintf(stderr, " Sendquery: id %5d name[0] '%c'\n", q.id, hostname[0]);
#endif
sendto(fd, packet, len, 0, (struct sockaddr*)&nameserv, sizeof(nameserv));
if(_v6_connect)
sendto(fd, packet, len, 0, (struct sockaddr*)&nameserv6, sizeof(nameserv6));
else
sendto(fd, packet, len, 0, (struct sockaddr*)&nameserv, sizeof(nameserv));
/* There are DNS relays that time out quickly but don't send anything
back on timeout.
@ -1680,7 +1689,7 @@ handshake_raw_udp(int dns_fd, int seed)
raw_serv6.sin6_family = AF_INET6;
raw_serv6.sin6_port = htons(53);
inet_pton(AF_INET6, "2001:4ca0:2001:0018:0216:3eff:fe99:4d2b", &(raw_serv6.sin6_addr));
inet_pton(AF_INET6, "::1", &(raw_serv6.sin6_addr));
/* do login against port 53 on remote server
* based on the old seed. If reply received,

View file

@ -174,7 +174,7 @@ open_dns_ipv6(int localport, struct in6_addr listen_ip6)
err(1, "socket");
}
setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&false, sizeof(false));
setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&flag, sizeof(flag));
flag = 1;
#ifdef SO_REUSEPORT

View file

@ -94,8 +94,15 @@ struct query {
unsigned short type;
unsigned short rcode;
unsigned short id;
// union {
// struct in_addr v4;
// struct in6_addr v6;
// } destination;
struct in_addr destination;
struct sockaddr from;
union {
struct sockaddr v4;
struct sockaddr_in6 v6;
} from;
int fromlen;
unsigned short id2;
struct sockaddr from2;

View file

@ -361,7 +361,14 @@ main(int argc, char **argv)
goto cleanup1;
}
if ((dns_fd = open_dns(0, INADDR_ANY)) == -1) {
/**
* Todo: Fix
*/
// if ((dns_fd = open_dns(0, INADDR_ANY)) == -1) {
// retval = 1;
// goto cleanup2;
// }
if ((dns_fd = open_dns_ipv6(0, in6addr_any)) == -1) {
retval = 1;
goto cleanup2;
}

View file

@ -95,6 +95,7 @@ static int debug;
#ifdef LINUX
static char v6;
static char v6_listen;
#endif
#if !defined(BSD) && !defined(__GLIBC__)
@ -1975,6 +1976,7 @@ static int
read_dns(int fd, int tun_fd, struct query *q) /* FIXME: tun_fd is because of raw_decode() below */
{
struct sockaddr_in from;
struct sockaddr_in6 from6;
socklen_t addrlen;
char packet[64*1024];
int r;
@ -1988,8 +1990,13 @@ read_dns(int fd, int tun_fd, struct query *q) /* FIXME: tun_fd is because of raw
iov.iov_base = packet;
iov.iov_len = sizeof(packet);
msg.msg_name = (caddr_t) &from;
msg.msg_namelen = (unsigned) addrlen;
if (v6_listen) {
msg.msg_name = (caddr_t) &from6;
msg.msg_namelen = sizeof(from6);
} else {
msg.msg_name = (caddr_t) &from;
msg.msg_namelen = (unsigned) addrlen;
}
msg.msg_iov = &iov;
msg.msg_iovlen = 1;
msg.msg_control = address;
@ -2006,8 +2013,15 @@ read_dns(int fd, int tun_fd, struct query *q) /* FIXME: tun_fd is because of raw
#endif /* !WINDOWS32 */
if (r > 0) {
memcpy((struct sockaddr*)&q->from, (struct sockaddr*)&from, addrlen);
q->fromlen = addrlen;
if (v6_listen) {
memcpy((struct sockaddr*) &q->from, (struct sockaddr*) &from6,
sizeof(struct sockaddr_in6));
q->fromlen = sizeof(struct sockaddr_in6);
} else {
memcpy((struct sockaddr*) &q->from, (struct sockaddr*) &from,
addrlen);
q->fromlen = addrlen;
}
/* TODO do not handle raw packets here! */
if (raw_decode(packet, r, q, fd, tun_fd)) {
@ -2029,7 +2043,6 @@ read_dns(int fd, int tun_fd, struct query *q) /* FIXME: tun_fd is because of raw
}
}
#endif
return strlen(q->name);
} else if (r < 0) {
/* Error */
@ -2292,8 +2305,6 @@ main(int argc, char **argv)
int dnsd_fd;
int tun_fd;
int v6_listen;
/* settings for forwarding normal DNS to
* local real DNS server */