From 9accb73ff8df685cae8adb1d4dc5c84c4c7ea1dd Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Sat, 7 Jan 2012 19:36:34 +0000 Subject: [PATCH] -skeleton code for gnunet-vpn command --- src/vpn/Makefile.am | 9 ++- src/vpn/gnunet-service-vpn.c | 2 +- src/vpn/gnunet-vpn.c | 149 +++++++++++++++++++++++++++++++++++ 3 files changed, 158 insertions(+), 2 deletions(-) create mode 100644 src/vpn/gnunet-vpn.c diff --git a/src/vpn/Makefile.am b/src/vpn/Makefile.am index dd617c2d5..6dcc85f67 100644 --- a/src/vpn/Makefile.am +++ b/src/vpn/Makefile.am @@ -30,7 +30,7 @@ lib_LTLIBRARIES = \ bin_PROGRAMS = \ - gnunet-daemon-exit gnunet-daemon-vpn $(VPNBIN) gnunet-service-vpn + gnunet-daemon-exit gnunet-daemon-vpn $(VPNBIN) gnunet-service-vpn gnunet-vpn gnunet_helper_vpn_SOURCES = \ @@ -64,6 +64,13 @@ gnunet_daemon_exit_LDADD = \ $(top_builddir)/src/mesh/libgnunetmesh.la \ $(GN_LIBINTL) +gnunet_vpn_SOURCES = \ + gnunet-vpn.c +gnunet_vpn_LDADD = \ + $(top_builddir)/src/vpn/libgnunetvpn.la \ + $(top_builddir)/src/util/libgnunetutil.la \ + $(GN_LIBINTL) + libgnunetvpn_la_SOURCES = \ vpn_api.c vpn.h libgnunetvpn_la_LIBADD = \ diff --git a/src/vpn/gnunet-service-vpn.c b/src/vpn/gnunet-service-vpn.c index e736b7746..f45c22370 100644 --- a/src/vpn/gnunet-service-vpn.c +++ b/src/vpn/gnunet-service-vpn.c @@ -34,7 +34,7 @@ * - build IP messages from mesh replies * - fully implement shutdown code * - [implement VPN library] - * - add back ICMP support (especially needed for IPv6)o + * - add back ICMP support (especially needed for IPv6) */ #include "platform.h" #include "gnunet_util_lib.h" diff --git a/src/vpn/gnunet-vpn.c b/src/vpn/gnunet-vpn.c new file mode 100644 index 000000000..3be830a6a --- /dev/null +++ b/src/vpn/gnunet-vpn.c @@ -0,0 +1,149 @@ +/* + This file is part of GNUnet. + (C) 2012 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 src/vpn/gnunet-vpn.c + * @brief Tool to manually request VPN tunnels to be created + * @author Christian Grothoff + */ + +#include "platform.h" +#include "gnunet_util_lib.h" +#include "gnunet_vpn_service.h" + + +/** + * Handle to vpn service. + */ +static struct GNUNET_VPN_Handle *handle; + +/** + * Opaque redirection request handle. + */ +static struct GNUNET_VPN_RedirectionRequest *request; + +/** + * Option -p: destination peer identity for service + */ +static char *peer_id; + +/** + * Option -s: service name (hash to get service descriptor) + */ +static char *service_name; + +/** + * Option -i: target IP + */ +static char *target_ip; + +/** + * Option -4: IPv4 requested. + */ +static int ipv4; + +/** + * Option -6: IPv6 requested. + */ +static int ipv6; + +/** + * Selected level of verbosity. + */ +static int verbosity; + +/** + * Global return value. + */ +static int ret; + + +/** + * Shutdown. + */ +static void +do_disconnect (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) +{ + if (NULL != request) + { + GNUNET_VPN_cancel_request (request); + request = NULL; + } + if (NULL != handle) + { + GNUNET_VPN_disconnect (handle); + handle = NULL; + } + GNUNET_free_non_null (peer_id); + GNUNET_free_non_null (service_name); + GNUNET_free_non_null (target_ip); +} + + +/** + * Main function that will be run by the scheduler. + * + * @param cls closure + * @param args remaining command-line arguments + * @param cfgfile name of the configuration file used (for saving, can be NULL!) + * @param cfg configuration + */ +static void +run (void *cls, char *const *args, const char *cfgfile, + const struct GNUNET_CONFIGURATION_Handle *cfg) +{ + handle = GNUNET_VPN_connect (cfg); + + GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, + &do_disconnect, NULL); +} + + +int +main (int argc, char *const *argv) +{ + static const struct GNUNET_GETOPT_CommandLineOption options[] = { + {'4', "ipv4", NULL, + gettext_noop ("request that result should be an IPv4 address"), + 0, &GNUNET_GETOPT_set_one, &ipv4}, + {'6', "ipv6", NULL, + gettext_noop ("request that result should be an IPv6 address"), + 0, &GNUNET_GETOPT_set_one, &ipv6}, + {'i', "ip", "IP", + gettext_noop ("destination IP for the tunnel"), + 1, &GNUNET_GETOPT_set_string, &target_ip}, + {'p', "peer", "PEERID", + gettext_noop ("peer offering the service we would like to access"), + 1, &GNUNET_GETOPT_set_string, &peer_id}, + {'s', "service", "NAME", + gettext_noop ("name of the service we would like to access"), + 1, &GNUNET_GETOPT_set_string, &peer_id}, + GNUNET_GETOPT_OPTION_VERBOSE (&verbosity), + GNUNET_GETOPT_OPTION_END + }; + return (GNUNET_OK == + GNUNET_PROGRAM_run (argc, argv, "gnunet-vpn", + gettext_noop + ("Setup tunnels via VPN."), options, + &run, NULL)) ? ret : 1; +} + + +/* end of gnunet-vpn.c */ -- 2.25.1