From 30308a96fff9ed1509d2dbd6fbd830ba42c475ef Mon Sep 17 00:00:00 2001 From: Philipp Tölke Date: Mon, 23 Aug 2010 11:03:10 +0000 Subject: The beginning of the DNS-Service. Does not work for the moment, because GNUNET_SERVICE_run does not give me my cls... --- src/vpn/Makefile.am | 9 ++- src/vpn/gnunet-service-dns.c | 129 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 137 insertions(+), 1 deletion(-) create mode 100644 src/vpn/gnunet-service-dns.c (limited to 'src') diff --git a/src/vpn/Makefile.am b/src/vpn/Makefile.am index 77e49e098..370528772 100644 --- a/src/vpn/Makefile.am +++ b/src/vpn/Makefile.am @@ -22,7 +22,7 @@ endif bin_PROGRAMS = \ - gnunet-daemon-vpn $(VPNBIN) $(HIJACKBIN) + gnunet-daemon-vpn gnunet-service-dns $(VPNBIN) $(HIJACKBIN) gnunet_helper_vpn_SOURCES = \ @@ -41,6 +41,13 @@ gnunet_daemon_vpn_LDADD = \ $(top_builddir)/src/util/libgnunetutil.la \ $(GN_LIBINTL) +gnunet_service_dns_SOURCES = \ + gnunet-service-dns.c +gnunet_service_dns_LDADD = \ + $(top_builddir)/src/core/libgnunetcore.la \ + $(top_builddir)/src/statistics/libgnunetstatistics.la \ + $(top_builddir)/src/util/libgnunetutil.la \ + $(GN_LIBINTL) #check_PROGRAMS = \ # test_XXX diff --git a/src/vpn/gnunet-service-dns.c b/src/vpn/gnunet-service-dns.c new file mode 100644 index 000000000..c96aaca8d --- /dev/null +++ b/src/vpn/gnunet-service-dns.c @@ -0,0 +1,129 @@ +/* + This file is part of GNUnet. + (C) 2009 Christian Grothoff (and other contributing authors) + + GNUnet is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published + by the Free Software Foundation; either version 3, or (at your + option) any later version. + + GNUnet 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 + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNUnet; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +/** + * @file vpn/gnunet-service-dns.c + * @author Philipp Tölke + */ +#include "platform.h" +#include "gnunet_getopt_lib.h" +#include "gnunet_service_lib.h" +#include "gnunet_network_lib.h" +#include "gnunet_os_lib.h" + +struct dns_cls { + struct GNUNET_SCHEDULER_Handle *sched; + + struct GNUNET_NETWORK_Handle *dnsout; + + unsigned short dnsoutport; +}; + +void hijack(unsigned short port) { + char* port_s = "12345"; + + snprintf(port_s, 6, "%d", port); + GNUNET_OS_start_process(NULL, NULL, "gnunet-helper-hijack-dns", "gnunet-hijack-dns", port_s, NULL); +} + +void unhijack(unsigned short port) { + char* port_s = "12345"; + + snprintf(port_s, 6, "%d", port); + GNUNET_OS_start_process(NULL, NULL, "gnunet-helper-hijack-dns", "gnunet-hijack-dns", "-d", port_s, NULL); +} + +/** + * Task run during shutdown. + * + * @param cls unused + * @param tc unused + */ +static void +cleanup_task (void *cls, + const struct GNUNET_SCHEDULER_TaskContext *tc) +{ + unhijack(((struct dns_cls*)cls)->dnsoutport); +} + +/** + * @param cls closure + * @param sched scheduler to use + * @param server the initialized server + * @param cfg configuration to use + */ +static void +run (void *cls, + struct GNUNET_SCHEDULER_Handle *sched, + struct GNUNET_SERVER_Handle *server, + const struct GNUNET_CONFIGURATION_Handle *cfg) +{ + static const struct GNUNET_SERVER_MessageHandler handlers[] = { + {NULL, NULL, 0, 0} + }; + + fprintf(stderr, "%x\n", cls); + + struct dns_cls* mycls = (struct dns_cls*)cls; + + mycls->sched = sched; + + mycls->dnsout = GNUNET_NETWORK_socket_create (AF_INET, SOCK_DGRAM, 0); + + struct sockaddr_in * addr = alloca(sizeof(struct sockaddr_in)); + memset(addr, 0, sizeof(struct sockaddr_in)); + + int err = GNUNET_NETWORK_socket_bind (mycls->dnsout, addr, sizeof(struct sockaddr_in)); + err = getsockname(GNUNET_NETWORK_get_fd(mycls->dnsout), addr, (unsigned int[]){sizeof(struct sockaddr_in)}); + + mycls->dnsoutport = htons(addr->sin_port); + + hijack(htons(addr->sin_port)); + + GNUNET_SERVER_add_handlers (server, handlers); + GNUNET_SCHEDULER_add_delayed (sched, + GNUNET_TIME_UNIT_FOREVER_REL, + &cleanup_task, + NULL); +} + +/** + * The main function for the dns service. + * + * @param argc number of arguments from the command line + * @param argv command line arguments + * @return 0 ok, 1 on error + */ +int +main (int argc, char *const *argv) +{ + struct dns_cls* cls = GNUNET_malloc(sizeof(struct dns_cls)); + + fprintf(stderr, "%x\n", cls); + + return (GNUNET_OK == + GNUNET_SERVICE_run (argc, + argv, + "gnunet-service-dns", + GNUNET_SERVICE_OPTION_NONE, + &run, cls)) ? 0 : 1; + + GNUNET_free(cls); // Make clang happy +} -- cgit v1.2.3