mirror of
https://github.com/yarrick/iodine.git
synced 2025-04-07 11:07:03 +00:00
---
This commit is contained in:
parent
e4b9dd9376
commit
598a63fed1
5 changed files with 46 additions and 12 deletions
13
src/client.c
13
src/client.c
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Add table
Reference in a new issue