diff --git a/dns.c b/dns.c index 4e24744..0fc53a0 100644 --- a/dns.c +++ b/dns.c @@ -326,14 +326,15 @@ dns_read(int fd, char *buf, int buflen) char name[255]; char rdata[4*1024]; HEADER *header; + socklen_t addrlen; char packet[64*1024]; + struct sockaddr_in from; - r = recv(fd, packet, sizeof(packet), 0); - - //printf("Read %d bytes DNS reply\n", r); + addrlen = sizeof(struct sockaddr); + r = recvfrom(fd, packet, sizeof(packet), 0, (struct sockaddr*)&from, &addrlen); if(r == -1) { - perror("recv"); + perror("recvfrom"); } else { header = (HEADER*)packet; @@ -571,8 +572,6 @@ dnsd_read(int fd, char *buf, int buflen) addrlen = sizeof(struct sockaddr); r = recvfrom(fd, packet, sizeof(packet), 0, (struct sockaddr*)&from, &addrlen); - //printf("Read %d bytes DNS query from %s\n", r, inet_ntoa(from.sin_addr)); - if(r == -1) { perror("recvfrom"); } else { diff --git a/iodine.c b/iodine.c index 97891f2..edabf97 100644 --- a/iodine.c +++ b/iodine.c @@ -35,8 +35,6 @@ #define MAX(a,b) ((a)>(b)?(a):(b)) #endif -#define FRAMESIZE (64*1024) - int running = 1; static void @@ -51,11 +49,9 @@ tunnel(int tun_fd, int dns_fd) int read; fd_set fds; struct timeval tv; - struct tun_frame *frame; - long buflen; - char buf[64*1024]; - - frame = malloc(FRAMESIZE); + char in[64*1024]; + long outlen; + char out[64*1024]; while (running) { tv.tv_sec = 1; @@ -79,37 +75,29 @@ tunnel(int tun_fd, int dns_fd) dns_ping(dns_fd); } else { if(FD_ISSET(tun_fd, &fds)) { - read = read_tun(tun_fd, frame, FRAMESIZE); - if (read > 0) { - buflen = sizeof(buf); - compress2(buf, &buflen, frame->data, read - 4, 9); - dns_handle_tun(dns_fd, buf, buflen); - } + read = read_tun(tun_fd, in, sizeof(in)); + if(read <= 0) + continue; + + outlen = sizeof(out); + compress2(out, &outlen, in, read, 9); + dns_handle_tun(dns_fd, out, outlen); } if(FD_ISSET(dns_fd, &fds)) { - read = dns_read(dns_fd, buf, FRAMESIZE-4); - if (read > 0) { - buflen = 64*1024-4; - uncompress(frame->data, &buflen, buf, read); + read = dns_read(dns_fd, in, sizeof(in)); + if (read <= 0) + continue; - frame->flags = htons(0x0000); -#ifdef LINUX - frame->proto = htons(0x0800); // Linux wants ETH_P_IP -#else - frame->proto = htons(0x0002); // BSD wants AF_INET as long word -#endif - - write_tun(tun_fd, frame, buflen + 4); - if (!dns_sending()) { - dns_ping(dns_fd); - } - } + outlen = sizeof(out); + uncompress(out, &outlen, in, read); + + write_tun(tun_fd, out, outlen); + if (!dns_sending()) + dns_ping(dns_fd); } } } - free(frame); - return 0; } @@ -151,11 +139,6 @@ main(int argc, char **argv) username = NULL; foreground = 0; - if (geteuid() != 0) { - printf("Run as root and you'll be happy.\n"); - usage(); - } - while ((choice = getopt(argc, argv, "vfhu:")) != -1) { switch(choice) { case 'v': @@ -175,6 +158,11 @@ main(int argc, char **argv) break; } } + + if (geteuid() != 0) { + printf("Run as root and you'll be happy.\n"); + usage(); + } argc -= optind; argv += optind; diff --git a/iodined.c b/iodined.c index 00000f3..0bac8d7 100644 --- a/iodined.c +++ b/iodined.c @@ -49,11 +49,9 @@ tunnel(int tun_fd, int dns_fd) int read; fd_set fds; struct timeval tv; - struct tun_frame *frame; - long buflen; - char buf[64*1024]; - - frame = malloc(64*1024); + char in[64*1024]; + long outlen; + char out[64*1024]; while (running) { if (dnsd_hasack()) { @@ -82,33 +80,27 @@ tunnel(int tun_fd, int dns_fd) dnsd_forceack(dns_fd); } else { if(FD_ISSET(tun_fd, &fds)) { - read = read_tun(tun_fd, frame, 64*1024); - if(read > 0) { - buflen = sizeof(buf); - compress2(buf, &buflen, frame->data, read - 4, 9); - dnsd_queuepacket(buf, buflen); - } + read = read_tun(tun_fd, in, sizeof(in)); + if (read <= 0) + continue; + + outlen = sizeof(out); + compress2(out, &outlen, in, read, 9); + dnsd_queuepacket(out, outlen); } if(FD_ISSET(dns_fd, &fds)) { - read = dnsd_read(dns_fd, buf, 64*1024-4); - if(read > 0) { - buflen = 64*1024-4; - uncompress(frame->data, &buflen, buf, read); - - frame->flags = htons(0x0000); -#ifdef LINUX - frame->proto = htons(0x0800); // Linux wants ETH_P_IP -#else - frame->proto = htons(0x0002); // BSD wants AF_INET as long word -#endif - write_tun(tun_fd, frame, buflen + 4); - } + read = dnsd_read(dns_fd, in, sizeof(in)); + if (read <= 0) + continue; + + outlen = sizeof(out); + uncompress(out, &outlen, in, read); + + write_tun(tun_fd, out, outlen); } } } - free(frame); - return 0; } diff --git a/tun.c b/tun.c index 12e5d3b..84d608c 100644 --- a/tun.c +++ b/tun.c @@ -120,9 +120,21 @@ close_tun(int tun_fd) } int -write_tun(int tun_fd, struct tun_frame *frame, int len) +write_tun(int tun_fd, char *data, int len) { - if (write(tun_fd, frame, len) != len) { +#ifdef LINUX + data[0] = 0x00; + data[1] = 0x00; + data[2] = 0x08; + data[3] = 0x00; +#else /* LINUX */ + data[0] = 0x00; + data[1] = 0x00; + data[2] = 0x00; + data[3] = 0x02; +#endif /* !LINUX */ + + if (write(tun_fd, data, len) != len) { warn("write_tun"); return 1; } @@ -131,8 +143,8 @@ write_tun(int tun_fd, struct tun_frame *frame, int len) } int -read_tun(int tun_fd, struct tun_frame *frame, int len) +read_tun(int tun_fd, char *buf, int len) { - return read(tun_fd, frame, len); + return read(tun_fd, buf, len); } diff --git a/tun.h b/tun.h index 669a442..cf3f42f 100644 --- a/tun.h +++ b/tun.h @@ -19,16 +19,9 @@ #ifndef _TUN_H_ #define _TUN_H_ -struct tun_frame -{ - short flags; - short proto; - char data[]; -}; - int open_tun(); void close_tun(int); -int write_tun(int, struct tun_frame *, int); -int read_tun(int, struct tun_frame *, int); +int write_tun(int, char *, int); +int read_tun(int, char *, int); #endif /* _TUN_H_ */