mirror of
https://github.com/yarrick/iodine.git
synced 2025-04-11 21:10:56 +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 const char *password;
|
||||||
|
|
||||||
static struct sockaddr_in nameserv;
|
static struct sockaddr_in nameserv;
|
||||||
|
static struct sockaddr_in6 nameserv6;
|
||||||
static struct sockaddr_in raw_serv;
|
static struct sockaddr_in raw_serv;
|
||||||
static struct sockaddr_in6 raw_serv6;
|
static struct sockaddr_in6 raw_serv6;
|
||||||
static const char *topdomain;
|
static const char *topdomain;
|
||||||
|
@ -226,6 +227,11 @@ setaddr:
|
||||||
nameserv.sin_family = AF_INET;
|
nameserv.sin_family = AF_INET;
|
||||||
nameserv.sin_port = htons(port);
|
nameserv.sin_port = htons(port);
|
||||||
nameserv.sin_addr = addr;
|
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
|
void
|
||||||
|
@ -347,7 +353,10 @@ send_query(int fd, char *hostname)
|
||||||
fprintf(stderr, " Sendquery: id %5d name[0] '%c'\n", q.id, hostname[0]);
|
fprintf(stderr, " Sendquery: id %5d name[0] '%c'\n", q.id, hostname[0]);
|
||||||
#endif
|
#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
|
/* There are DNS relays that time out quickly but don't send anything
|
||||||
back on timeout.
|
back on timeout.
|
||||||
|
@ -1680,7 +1689,7 @@ handshake_raw_udp(int dns_fd, int seed)
|
||||||
|
|
||||||
raw_serv6.sin6_family = AF_INET6;
|
raw_serv6.sin6_family = AF_INET6;
|
||||||
raw_serv6.sin6_port = htons(53);
|
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
|
/* do login against port 53 on remote server
|
||||||
* based on the old seed. If reply received,
|
* 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");
|
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;
|
flag = 1;
|
||||||
#ifdef SO_REUSEPORT
|
#ifdef SO_REUSEPORT
|
||||||
|
|
|
@ -94,8 +94,15 @@ struct query {
|
||||||
unsigned short type;
|
unsigned short type;
|
||||||
unsigned short rcode;
|
unsigned short rcode;
|
||||||
unsigned short id;
|
unsigned short id;
|
||||||
|
// union {
|
||||||
|
// struct in_addr v4;
|
||||||
|
// struct in6_addr v6;
|
||||||
|
// } destination;
|
||||||
struct in_addr destination;
|
struct in_addr destination;
|
||||||
struct sockaddr from;
|
union {
|
||||||
|
struct sockaddr v4;
|
||||||
|
struct sockaddr_in6 v6;
|
||||||
|
} from;
|
||||||
int fromlen;
|
int fromlen;
|
||||||
unsigned short id2;
|
unsigned short id2;
|
||||||
struct sockaddr from2;
|
struct sockaddr from2;
|
||||||
|
|
|
@ -361,7 +361,14 @@ main(int argc, char **argv)
|
||||||
goto cleanup1;
|
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;
|
retval = 1;
|
||||||
goto cleanup2;
|
goto cleanup2;
|
||||||
}
|
}
|
||||||
|
|
|
@ -95,6 +95,7 @@ static int debug;
|
||||||
|
|
||||||
#ifdef LINUX
|
#ifdef LINUX
|
||||||
static char v6;
|
static char v6;
|
||||||
|
static char v6_listen;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(BSD) && !defined(__GLIBC__)
|
#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 */
|
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_in from;
|
||||||
|
struct sockaddr_in6 from6;
|
||||||
socklen_t addrlen;
|
socklen_t addrlen;
|
||||||
char packet[64*1024];
|
char packet[64*1024];
|
||||||
int r;
|
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_base = packet;
|
||||||
iov.iov_len = sizeof(packet);
|
iov.iov_len = sizeof(packet);
|
||||||
|
|
||||||
msg.msg_name = (caddr_t) &from;
|
if (v6_listen) {
|
||||||
msg.msg_namelen = (unsigned) addrlen;
|
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_iov = &iov;
|
||||||
msg.msg_iovlen = 1;
|
msg.msg_iovlen = 1;
|
||||||
msg.msg_control = address;
|
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 */
|
#endif /* !WINDOWS32 */
|
||||||
|
|
||||||
if (r > 0) {
|
if (r > 0) {
|
||||||
memcpy((struct sockaddr*)&q->from, (struct sockaddr*)&from, addrlen);
|
if (v6_listen) {
|
||||||
q->fromlen = addrlen;
|
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! */
|
/* TODO do not handle raw packets here! */
|
||||||
if (raw_decode(packet, r, q, fd, tun_fd)) {
|
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
|
#endif
|
||||||
|
|
||||||
return strlen(q->name);
|
return strlen(q->name);
|
||||||
} else if (r < 0) {
|
} else if (r < 0) {
|
||||||
/* Error */
|
/* Error */
|
||||||
|
@ -2292,8 +2305,6 @@ main(int argc, char **argv)
|
||||||
int dnsd_fd;
|
int dnsd_fd;
|
||||||
int tun_fd;
|
int tun_fd;
|
||||||
|
|
||||||
int v6_listen;
|
|
||||||
|
|
||||||
|
|
||||||
/* settings for forwarding normal DNS to
|
/* settings for forwarding normal DNS to
|
||||||
* local real DNS server */
|
* local real DNS server */
|
||||||
|
|
Loading…
Add table
Reference in a new issue