mirror of
https://code.semirocket.science/wrapsix
synced 2024-11-10 00:01:01 +02:00
Purely forwarding DNS proxy
Specified many CFLAGS Corrected configure.in
This commit is contained in:
parent
53e0e90ad5
commit
074476e7b6
8
.gitignore
vendored
8
.gitignore
vendored
@ -5,6 +5,7 @@ configure
|
|||||||
depcomp
|
depcomp
|
||||||
install-sh
|
install-sh
|
||||||
missing
|
missing
|
||||||
|
config.cache
|
||||||
config.log
|
config.log
|
||||||
config.status
|
config.status
|
||||||
src/.deps/
|
src/.deps/
|
||||||
@ -13,3 +14,10 @@ src/Makefile.in
|
|||||||
Makefile
|
Makefile
|
||||||
src/Makefile
|
src/Makefile
|
||||||
INSTALL
|
INSTALL
|
||||||
|
|
||||||
|
# build
|
||||||
|
*.o
|
||||||
|
wrapsix-dnsproxy
|
||||||
|
|
||||||
|
# debug
|
||||||
|
core
|
||||||
|
@ -1,7 +1,11 @@
|
|||||||
AC_INIT([WrapSix], [0.1.99.0], [xhire@mujmalysvet.cz])
|
AC_INIT([WrapSix], [0.1.99.0], [xhire@mujmalysvet.cz])
|
||||||
AM_INIT_AUTOMAKE([-Wall -Werror])
|
AM_INIT_AUTOMAKE([-Wall -Werror])
|
||||||
AC_PROG_CC
|
AC_PROG_CC
|
||||||
AC_OUTPUT([
|
AC_CONFIG_FILES([
|
||||||
Makefile
|
Makefile
|
||||||
src/Makefile
|
src/Makefile
|
||||||
])
|
])
|
||||||
|
|
||||||
|
CFLAGS="-g -ggdb -O0 -pipe -Wall -Wshadow -Wall -Wextra -Wno-missing-field-initializers -Wno-unused-parameter -Wold-style-definition -Wdeclaration-after-statement -Wmissing-declarations -Wmissing-prototypes -Wredundant-decls -Wmissing-noreturn -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Winline -Wformat-nonliteral -Wformat-security -Wswitch-enum -Wswitch-default -Winit-self -Wmissing-include-dirs -Wundef -Waggregate-return -Wmissing-format-attribute -Wnested-externs -Wunsafe-loop-optimizations"
|
||||||
|
|
||||||
|
AC_OUTPUT
|
||||||
|
@ -1,2 +1,2 @@
|
|||||||
bin_PROGRAMS = wrapsix-dnsproxy
|
sbin_PROGRAMS = wrapsix-dnsproxy
|
||||||
wrapsix_dnsproxy_SOURCES = dnsproxy.c
|
wrapsix_dnsproxy_SOURCES = dnsproxy.c
|
||||||
|
143
src/dnsproxy.c
143
src/dnsproxy.c
@ -0,0 +1,143 @@
|
|||||||
|
/*
|
||||||
|
* WrapSix
|
||||||
|
* Copyright (C) 2008-2009 Michal Zima <xhire@mujmalysvet.cz>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <arpa/inet.h> /* inet_pton */
|
||||||
|
#include <unistd.h> /* close */
|
||||||
|
#include <string.h> /* memcpy */
|
||||||
|
|
||||||
|
#define BUFFER_SIZE 512 /* maximum of a DNS packet */
|
||||||
|
#define IP "::2"
|
||||||
|
#define RESOLVER "::1"
|
||||||
|
#define PORT 53
|
||||||
|
|
||||||
|
int resolver_connect(int *sock, struct sockaddr_in6 *sock_addr);
|
||||||
|
int udp_receive(int *sock, struct sockaddr_in6 *sock_addr, char *buffer, int *length);
|
||||||
|
int udp_send(int *sock, struct sockaddr_in6 *sock_addr, char *data, int length);
|
||||||
|
|
||||||
|
int resolver_connect(int *sock, struct sockaddr_in6 *sock_addr)
|
||||||
|
{
|
||||||
|
int tmp_sock;
|
||||||
|
struct sockaddr_in6 tmp_sock_addr;
|
||||||
|
char resolver[] = RESOLVER;
|
||||||
|
|
||||||
|
/* create a socket */
|
||||||
|
if ((tmp_sock = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP)) == -1) {
|
||||||
|
fprintf(stderr, "[Error] Unable to create UDP socket for outgoing connections\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* setup the socket */
|
||||||
|
tmp_sock_addr.sin6_family = AF_INET6;
|
||||||
|
tmp_sock_addr.sin6_port = htons(PORT);
|
||||||
|
inet_pton(AF_INET6, (char *) &resolver, &(tmp_sock_addr.sin6_addr));
|
||||||
|
|
||||||
|
/* return correct data */
|
||||||
|
memcpy(sock, &tmp_sock, sizeof(int));
|
||||||
|
memcpy(sock_addr, &tmp_sock_addr, sizeof(struct sockaddr_in6));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int udp_receive(int *sock, struct sockaddr_in6 *sock_addr, char *buffer, int *length)
|
||||||
|
{
|
||||||
|
int tmp_length;
|
||||||
|
int addrlen;
|
||||||
|
|
||||||
|
addrlen = sizeof(struct sockaddr_in6);
|
||||||
|
if ((tmp_length = recvfrom(*sock, buffer, BUFFER_SIZE, 0, (struct sockaddr *) sock_addr, (socklen_t *) &addrlen)) == -1) {
|
||||||
|
char str_ip[128];
|
||||||
|
inet_ntop(AF_INET6, &(sock_addr->sin6_addr), (char *) &str_ip, 128);
|
||||||
|
|
||||||
|
fprintf(stderr, "[Error] Unable to read from UDP socket [%s]:%d\n", str_ip, PORT);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(length, &tmp_length, sizeof(int));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int udp_send(int *sock, struct sockaddr_in6 *sock_addr, char *data, int length)
|
||||||
|
{
|
||||||
|
int addrlen;
|
||||||
|
|
||||||
|
addrlen = sizeof(struct sockaddr_in6);
|
||||||
|
if (sendto(*sock, data, length, 0, (struct sockaddr *) sock_addr, addrlen) != length) {
|
||||||
|
char str_ip[128];
|
||||||
|
inet_ntop(AF_INET6, &(sock_addr->sin6_addr), (char *) &str_ip, 128);
|
||||||
|
|
||||||
|
fprintf(stderr, "[Error] Unable to write to UDP socket [%s]:%d\n", str_ip, PORT);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
int length;
|
||||||
|
|
||||||
|
char ip[] = IP;
|
||||||
|
char buffer[BUFFER_SIZE];
|
||||||
|
|
||||||
|
int sock;
|
||||||
|
struct sockaddr_in6 sock_addr,
|
||||||
|
client_sock_addr;
|
||||||
|
|
||||||
|
int resolver_sock;
|
||||||
|
struct sockaddr_in6 resolver_sock_addr;
|
||||||
|
|
||||||
|
/* create the socket */
|
||||||
|
if ((sock = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP)) == -1) {
|
||||||
|
fprintf(stderr, "[Error] Unable to create UDP socket\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* setup the socket */
|
||||||
|
sock_addr.sin6_family = AF_INET6;
|
||||||
|
sock_addr.sin6_port = htons(PORT);
|
||||||
|
inet_pton(AF_INET6, (char *) &ip, &(sock_addr.sin6_addr));
|
||||||
|
|
||||||
|
/* bind the socket to address and port */
|
||||||
|
if (bind(sock, (struct sockaddr *) &(sock_addr), sizeof(sock_addr)) == -1) {
|
||||||
|
fprintf(stderr, "[Error] Unable to bind UDP socket to %s:%d\n", IP, PORT);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* fetch a request */
|
||||||
|
udp_receive(&sock, &client_sock_addr, (char *) &buffer, &length);
|
||||||
|
|
||||||
|
/* forward it to resolver */
|
||||||
|
resolver_connect(&resolver_sock, &resolver_sock_addr);
|
||||||
|
udp_send(&resolver_sock, &resolver_sock_addr, (char *) &buffer, length);
|
||||||
|
|
||||||
|
/* fetch the answer and forward it to the client */
|
||||||
|
udp_receive(&resolver_sock, &resolver_sock_addr, (char *) &buffer, (int *) &length);
|
||||||
|
udp_send(&sock, &client_sock_addr, (char *) &buffer, length);
|
||||||
|
|
||||||
|
/* clean-up */
|
||||||
|
close(resolver_sock);
|
||||||
|
|
||||||
|
/* final clean-up */
|
||||||
|
close(sock);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user