From: Christian Grothoff Date: Mon, 4 Jun 2018 17:00:10 +0000 (+0200) Subject: add function for getopt uint16_t arguments X-Git-Tag: v0.11.0pre66~31^2 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=41cbe10b783a0741c75566232886f262cd779fbb;p=oweals%2Fgnunet.git add function for getopt uint16_t arguments --- diff --git a/src/gns/gnunet-bcd.c b/src/gns/gnunet-bcd.c index 0746d5c57..d7fd1a812 100644 --- a/src/gns/gnunet-bcd.c +++ b/src/gns/gnunet-bcd.c @@ -76,7 +76,7 @@ static char *resfile; /** * Port number. */ -static unsigned int port = 8888; +static uint16_t port = 8888; struct Entry @@ -351,7 +351,7 @@ prepare_daemon (struct MHD_Daemon *daemon_handle) static int server_start () { - if ((0 == port) || (port > UINT16_MAX)) + if (0 == port) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, _("Invalid port number %u. Exiting.\n"), @@ -362,7 +362,7 @@ server_start () _("Businesscard HTTP server starts on %u\n"), port); daemon_handle = MHD_start_daemon (MHD_USE_DUAL_STACK | MHD_USE_DEBUG, - (uint16_t) port, + port, NULL /* accept_policy_callback */, NULL, &access_handler_callback, NULL, MHD_OPTION_CONNECTION_LIMIT, (unsigned int) 512, @@ -374,7 +374,7 @@ server_start () { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, _("Could not start businesscard HTTP server on port %u\n"), - (unsigned short) port); + (unsigned int) port); return GNUNET_SYSERR; } http_task = prepare_daemon (daemon_handle); @@ -516,17 +516,17 @@ main (int argc, char *const *argv) { struct GNUNET_GETOPT_CommandLineOption options[] = { - GNUNET_GETOPT_option_uint ('p', - "port", - "PORT", - gettext_noop ("Run HTTP serve on port PORT (default is 8888)"), - &port), - + GNUNET_GETOPT_option_uint16 ('p', + "port", + "PORT", + gettext_noop ("Run HTTP serve on port PORT (default is 8888)"), + &port), GNUNET_GETOPT_OPTION_END }; int ret; - if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv)) + if (GNUNET_OK != + GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv)) return 2; GNUNET_log_setup ("gnunet-bcd", "WARNING", NULL); ret = diff --git a/src/gns/gnunet-gns-proxy.c b/src/gns/gnunet-gns-proxy.c index 02ebcf0f1..0d7d83b4b 100644 --- a/src/gns/gnunet-gns-proxy.c +++ b/src/gns/gnunet-gns-proxy.c @@ -636,7 +636,7 @@ struct Socks5Request /** * The port the proxy is running on (default 7777) */ -static unsigned long long port = GNUNET_GNS_PROXY_PORT; +static uint16_t port = GNUNET_GNS_PROXY_PORT; /** * The CA file (pem) to use for the proxy CA @@ -3399,8 +3399,8 @@ run (void *cls, return; } GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Proxy listens on port %llu\n", - port); + "Proxy listens on port %u\n", + (unsigned int) port); /* start MHD daemon for HTTP */ hd = GNUNET_new (struct MhdHttpList); @@ -3437,11 +3437,11 @@ int main (int argc, char *const *argv) { struct GNUNET_GETOPT_CommandLineOption options[] = { - GNUNET_GETOPT_option_ulong ('p', - "port", - NULL, - gettext_noop ("listen on specified port (default: 7777)"), - &port), + GNUNET_GETOPT_option_uint16 ('p', + "port", + NULL, + gettext_noop ("listen on specified port (default: 7777)"), + &port), GNUNET_GETOPT_option_string ('a', "authority", NULL, diff --git a/src/include/gnunet_getopt_lib.h b/src/include/gnunet_getopt_lib.h index e38925f14..88c7825d0 100644 --- a/src/include/gnunet_getopt_lib.h +++ b/src/include/gnunet_getopt_lib.h @@ -286,6 +286,23 @@ GNUNET_GETOPT_option_uint (char shortName, unsigned int *val); +/** + * Allow user to specify an uint16_t. + * + * @param shortName short name of the option + * @param name long name of the option + * @param argumentHelp help text for the option argument + * @param description long help text for the option + * @param[out] val set to the value specified at the command line + */ +struct GNUNET_GETOPT_CommandLineOption +GNUNET_GETOPT_option_uint16 (char shortName, + const char *name, + const char *argumentHelp, + const char *description, + uint16_t *val); + + /** * Allow user to specify an `unsigned long long`. * diff --git a/src/transport/Makefile.am b/src/transport/Makefile.am index 286f03c4d..8697d0941 100644 --- a/src/transport/Makefile.am +++ b/src/transport/Makefile.am @@ -280,7 +280,6 @@ gnunet_service_transport_CFLAGS = \ plugin_LTLIBRARIES = \ libgnunet_plugin_transport_tcp.la \ - libgnunet_plugin_transport_xt.la \ libgnunet_plugin_transport_udp.la \ $(UNIX_PLUGIN_LA) \ $(HTTP_CLIENT_PLUGIN_LA) \ @@ -290,6 +289,12 @@ plugin_LTLIBRARIES = \ $(WLAN_PLUGIN_LA) \ $(BT_PLUGIN_LA) +if HAVE_EXPERIMENTAL +plugin_LTLIBRARIES += \ + libgnunet_plugin_transport_xt.la \ + libgnunet_plugin_transport_xu.la +endif + # Note: real plugins of course need to be added # to the plugin_LTLIBRARIES above noinst_LTLIBRARIES = \ diff --git a/src/transport/plugin_transport_xu.h b/src/transport/plugin_transport_xu.h new file mode 100644 index 000000000..1884f92e8 --- /dev/null +++ b/src/transport/plugin_transport_xu.h @@ -0,0 +1,273 @@ +/* + This file is part of GNUnet + Copyright (C) 2010-2014 GNUnet e.V. + + 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., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +/** + * @file transport/plugin_transport_xu.h + * @brief Implementation of the XU transport protocol + * @author Christian Grothoff + * @author Nathan Evans + * @author Matthias Wachs + */ +#ifndef PLUGIN_TRANSPORT_XU_H +#define PLUGIN_TRANSPORT_XU_H + +#include "platform.h" +#include "gnunet_hello_lib.h" +#include "gnunet_util_lib.h" +#include "gnunet_fragmentation_lib.h" +#include "gnunet_protocols.h" +#include "gnunet_resolver_service.h" +#include "gnunet_signatures.h" +#include "gnunet_constants.h" +#include "gnunet_statistics_service.h" +#include "gnunet_transport_service.h" +#include "gnunet_transport_plugin.h" +#include "transport.h" + +#define LOG(kind,...) GNUNET_log_from (kind, "transport-xu", __VA_ARGS__) + +#define PLUGIN_NAME "xu" + +#define DEBUG_XU GNUNET_NO + +#define DEBUG_XU_BROADCASTING GNUNET_NO + +/** + * MTU for fragmentation subsystem. Should be conservative since + * all communicating peers MUST work with this MTU. + */ +#define XU_MTU 1400 + + +GNUNET_NETWORK_STRUCT_BEGIN +/** + * Network format for IPv4 addresses. + */ +struct IPv4XuAddress +{ + /** + * Optional options and flags for this address + */ + uint32_t options GNUNET_PACKED; + + /** + * IPv4 address, in network byte order. + */ + uint32_t ipv4_addr GNUNET_PACKED; + + /** + * Port number, in network byte order. + */ + uint16_t u4_port GNUNET_PACKED; +}; + + +/** + * Network format for IPv6 addresses. + */ +struct IPv6XuAddress +{ + /** + * Optional options and flags for this address + */ + uint32_t options GNUNET_PACKED; + + /** + * IPv6 address. + */ + struct in6_addr ipv6_addr GNUNET_PACKED; + + /** + * Port number, in network byte order. + */ + uint16_t u6_port GNUNET_PACKED; +}; +GNUNET_NETWORK_STRUCT_END + +/** + * Either an IPv4 or IPv6 XU address. Note that without a "length", + * one cannot tell which one of the two types this address represents. + */ +union XuAddress +{ + /** + * IPv4 case. + */ + struct IPv4XuAddress v4; + + /** + * IPv6 case. + */ + struct IPv6XuAddress v6; +}; + + +/** + * Information we track for each message in the queue. + */ +struct XU_MessageWrapper; + + +/** + * Closure for #append_port(). + */ +struct PrettyPrinterContext; + + +/** + * Encapsulation of all of the state of the plugin. + */ +struct Plugin +{ + + /** + * Our environment. + */ + struct GNUNET_TRANSPORT_PluginEnvironment *env; + + /** + * Session of peers with whom we are currently connected, + * map of peer identity to `struct GNUNET_ATS_Session *`. + */ + struct GNUNET_CONTAINER_MultiPeerMap *sessions; + + /** + * ID of select task for IPv4 + */ + struct GNUNET_SCHEDULER_Task *select_task_v4; + + /** + * ID of select task for IPv6 + */ + struct GNUNET_SCHEDULER_Task *select_task_v6; + + /** + * Address we were told to bind to exclusively (IPv4). + */ + char *bind4_address; + + /** + * Address we were told to bind to exclusively (IPv6). + */ + char *bind6_address; + + /** + * Handle to NAT traversal support. + */ + struct GNUNET_NAT_Handle *nat; + + /** + * Handle to NAT traversal support. + */ + struct GNUNET_NAT_STUN_Handle *stun; + + /** + * The read socket for IPv4 + */ + struct GNUNET_NETWORK_Handle *sockv4; + + /** + * The read socket for IPv6 + */ + struct GNUNET_NETWORK_Handle *sockv6; + + /** + * Running pretty printers: head + */ + struct PrettyPrinterContext *ppc_dll_head; + + /** + * Running pretty printers: tail + */ + struct PrettyPrinterContext *ppc_dll_tail; + + /** + * Function to call about session status changes. + */ + GNUNET_TRANSPORT_SessionInfoCallback sic; + + /** + * Closure for @e sic. + */ + void *sic_cls; + + /** + * IPv6 multicast address + */ + struct sockaddr_in6 ipv6_multicast_address; + + /** + * Broadcast interval + */ + struct GNUNET_TIME_Relative broadcast_interval; + + /** + * Bytes currently in buffer + */ + int64_t bytes_in_buffer; + + /** + * Address options + */ + uint32_t myoptions; + + /** + * Is IPv6 enabled: #GNUNET_YES or #GNUNET_NO + */ + int enable_ipv6; + + /** + * Is IPv4 enabled: #GNUNET_YES or #GNUNET_NO + */ + int enable_ipv4; + + /** + * Port we listen on. + */ + uint16_t port; + + /** + * Port we advertise on. + */ + uint16_t aport; + +}; + + +/** + * Function called for a quick conversion of the binary address to + * a numeric address. Note that the caller must not free the + * address and that the next call to this function is allowed + * to override the address again. + * + * @param cls closure + * @param addr binary address (a `union XuAddress`) + * @param addrlen length of the @a addr + * @return string representing the same address + */ +const char * +xu_address_to_string (void *cls, + const void *addr, + size_t addrlen); + + +/*#ifndef PLUGIN_TRANSPORT_XU_H*/ +#endif +/* end of plugin_transport_xu.h */ diff --git a/src/util/getopt_helpers.c b/src/util/getopt_helpers.c index c836c9055..f9341f528 100644 --- a/src/util/getopt_helpers.c +++ b/src/util/getopt_helpers.c @@ -793,6 +793,82 @@ GNUNET_GETOPT_option_uint (char shortName, } + +/** + * Set an option of type 'uint16_t' from the command line. + * A pointer to this function should be passed as part of the + * 'struct GNUNET_GETOPT_CommandLineOption' array to initialize options + * of this type. It should be followed by a pointer to a value of + * type 'uint16_t'. + * + * @param ctx command line processing context + * @param scls additional closure (will point to the 'unsigned int') + * @param option name of the option + * @param value actual value of the option as a string. + * @return #GNUNET_OK if parsing the value worked + */ +static int +set_uint16 (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx, + void *scls, + const char *option, + const char *value) +{ + uint16_t *val = scls; + unsigned int v; + + (void) ctx; + if (1 != SSCANF (value, + "%u", + v)) + { + FPRINTF (stderr, + _("You must pass a number to the `%s' option.\n"), + option); + return GNUNET_SYSERR; + } + if (v > UINT16_MAX) + { + FPRINTF (stderr, + _("You must pass a number below %u to the `%s' option.\n"), + (unsigned int) UINT16_MAX, + option); + return GNUNET_SYSERR; + } + *val = (uint16_t) v; + return GNUNET_OK; +} + + +/** + * Allow user to specify an uint16_t. + * + * @param shortName short name of the option + * @param name long name of the option + * @param argumentHelp help text for the option argument + * @param description long help text for the option + * @param[out] val set to the value specified at the command line + */ +struct GNUNET_GETOPT_CommandLineOption +GNUNET_GETOPT_option_uint16 (char shortName, + const char *name, + const char *argumentHelp, + const char *description, + uint16_t *val) +{ + struct GNUNET_GETOPT_CommandLineOption clo = { + .shortName = shortName, + .name = name, + .argumentHelp = argumentHelp, + .description = description, + .require_argument = 1, + .processor = &set_uint16, + .scls = (void *) val + }; + + return clo; +} + + /** * Closure for #set_base32(). */