Browse Source

Merge branch 'master' of gnunet.org:gnunet

ng0 5 years ago
parent
commit
d58a715b3d
47 changed files with 2462 additions and 8813 deletions
  1. 6 0
      ChangeLog
  2. 3 0
      Makefile.am
  3. 5 1
      configure.ac
  4. 5 0
      contrib/scripts/gnunet-logread/Makefile.am
  5. 3 0
      lint/Makefile.am
  6. 2 3
      po/POTFILES.in
  7. 180 229
      po/de.po
  8. 203 236
      po/es.po
  9. 163 223
      po/fr.po
  10. 147 220
      po/it.po
  11. 169 229
      po/sv.po
  12. 170 229
      po/vi.po
  13. 165 225
      po/zh_CN.po
  14. 8 8
      src/ats/gnunet-service-ats-new.c
  15. 1 0
      src/include/Makefile.am
  16. 3 3
      src/include/gnunet_ats_application_service.h
  17. 2 2
      src/include/gnunet_peerstore_service.h
  18. 12 0
      src/include/gnunet_protocols.h
  19. 100 0
      src/include/gnunet_transport_application_service.h
  20. 1 1
      src/include/gnunet_util_lib.h
  21. 3 3
      src/namestore/test_namestore_delete.sh
  22. 10 18
      src/namestore/test_namestore_lookup.sh
  23. 1 1
      src/namestore/test_namestore_put.sh
  24. 22 0
      src/peerinfo-tool/Makefile.am
  25. 0 0
      src/peerinfo-tool/plugin_rest_peerinfo.c
  26. 0 20
      src/peerinfo/Makefile.am
  27. 5 1
      src/rps/Makefile.am
  28. 3 22
      src/rps/gnunet-rps-profiler.c
  29. 1 1
      src/rps/gnunet-service-rps_sampler.h
  30. 3 0
      src/rps/profiler_rps.conf
  31. 54 0
      src/rps/rps-sampler_client.c
  32. 54 0
      src/rps/rps-sampler_common.c
  33. 61 0
      src/rps/rps-sampler_common.h
  34. 38 0
      src/rps/rps-test_util.c
  35. 21 0
      src/rps/rps-test_util.h
  36. 10 0
      src/rps/rps.conf.in
  37. 142 7
      src/rps/rps_api.c
  38. 0 20
      src/rps/test_rps.c
  39. 4 0
      src/rps/test_rps.conf
  40. 9 32
      src/transport/Makefile.am
  41. 272 203
      src/transport/gnunet-service-tng.c
  42. 0 4107
      src/transport/plugin_transport_xt.c
  43. 0 2492
      src/transport/plugin_transport_xu.c
  44. 0 273
      src/transport/plugin_transport_xu.h
  45. 32 0
      src/transport/transport.h
  46. 366 0
      src/transport/transport_api2_application.c
  47. 3 4
      src/util/Makefile.am

+ 6 - 0
ChangeLog

@@ -1,3 +1,9 @@
+Thu 04 Apr 2019 12:39:44 PM CEST
+  Hotfix for build issue. Releasing GNUnet 0.11.2. -CG/MS
+
+Wed 03 Apr 2019 03:18:43 PM CEST
+  Releasing GNUnet 0.11.1. -CG
+
 Wed 03 Apr 2019 01:54:44 PM CEST
   Merged gnunet-qr-c-2 branch, replacing Python-based implementation
   of gnunet-qr with C-based implementation that also integrates

+ 3 - 0
Makefile.am

@@ -12,6 +12,9 @@ endif
 if DOCUMENTATION
   SUBDIRS += doc
 endif
+if HAVE_EXPERIMENTAL
+  SUBDIRS += lint
+endif
 
 # only manpages, needs "doc" subdir
 if INCLUDE_MANPAGES

+ 5 - 1
configure.ac

@@ -21,7 +21,7 @@
 #
 AC_PREREQ(2.61)
 # Checks for programs.
-AC_INIT([gnunet], [0.11.0], [bug-gnunet@gnu.org])
+AC_INIT([gnunet], [0.11.2], [bug-gnunet@gnu.org])
 AC_CONFIG_AUX_DIR([build-aux])
 
 AC_CANONICAL_TARGET
@@ -64,12 +64,16 @@ funcstocheck="getnameinfo gethostname gethostbyname gethostbyaddr getaddrinfo ge
 # Srcdir in a form that native compiler understands (i.e. DOS path on W32)
 native_srcdir=$srcdir
 
+OLD_LDFLAGS="$LDFLAGS"
+LDFLAGS="$LDFLAGS -Wl,--unresolved-symbols=report-all"
+
 # Check system type
 case "$host_os" in
 *darwin* | *rhapsody* | *macosx*)
      AC_DEFINE_UNQUOTED(DARWIN,1,[This is an Apple Darwin system])
      CPPFLAGS="-D_APPLE_C_SOURCE $CPPFLAGS"
      CFLAGS="-fno-common $CFLAGS"
+     LDFLAGS="$OLD_LDFLAGS"
      AC_MSG_WARN([WARNING: The VPN application cannot be compiled on your OS])
      AC_CHECK_LIB(intl, gettext)
      build_target="darwin"

+ 5 - 0
contrib/scripts/gnunet-logread/Makefile.am

@@ -20,3 +20,8 @@ CLEANFILES=	\
 noinst_SCRIPTS =		\
 		$(CLEANFILES) \
 		gnunet-logread-ipc
+
+EXTRA_DIST = \
+  gnunet-logread.in \
+  gnunet-logread-ipc-sdedit.in \
+  gnunet-logread-ipc

+ 3 - 0
lint/Makefile.am

@@ -57,3 +57,6 @@ check-texinfo:
 	@cd $(top_srcdir)/doc/tutorial ; find . -type f ! -path '*/.*' -name '*.texi' -print0 | xargs -0 awk '/XXX/ {print FILENAME":"NR":"$$0}' >> $(srcdir)/texinfo_tutorial.log || true
 
 check-linters: check-bashism check-python check-man check-texinfo
+
+EXTRA_DIST = \
+  checkbashisms.pl.in

+ 2 - 3
po/POTFILES.in

@@ -262,9 +262,9 @@ src/nt/nt.c
 src/peerinfo/gnunet-service-peerinfo.c
 src/peerinfo/peerinfo_api.c
 src/peerinfo/peerinfo_api_notify.c
-src/peerinfo/plugin_rest_peerinfo.c
 src/peerinfo-tool/gnunet-peerinfo.c
 src/peerinfo-tool/gnunet-peerinfo_plugins.c
+src/peerinfo-tool/plugin_rest_peerinfo.c
 src/peerstore/gnunet-peerstore.c
 src/peerstore/gnunet-service-peerstore.c
 src/peerstore/peerstore_api.c
@@ -418,13 +418,12 @@ src/transport/plugin_transport_udp_broadcasting.c
 src/transport/plugin_transport_udp.c
 src/transport/plugin_transport_unix.c
 src/transport/plugin_transport_wlan.c
-src/transport/plugin_transport_xt.c
-src/transport/plugin_transport_xu.c
 src/transport/tcp_connection_legacy.c
 src/transport/tcp_server_legacy.c
 src/transport/tcp_server_mst_legacy.c
 src/transport/tcp_service_legacy.c
 src/transport/transport_api2_address.c
+src/transport/transport_api2_application.c
 src/transport/transport_api2_communication.c
 src/transport/transport_api2_core.c
 src/transport/transport_api2_monitor.c

+ 180 - 229
po/de.po

@@ -10,7 +10,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: gnunet 0.10.1\n"
 "Report-Msgid-Bugs-To: gnunet-developers@mail.gnu.org\n"
-"POT-Creation-Date: 2019-02-28 11:41+0100\n"
+"POT-Creation-Date: 2019-04-04 12:39+0200\n"
 "PO-Revision-Date: 2015-03-08 16:16+0100\n"
 "Last-Translator: Mario Blättermann <mario.blaettermann@gmail.com>\n"
 "Language-Team: German <translation-team-de@lists.sourceforge.net>\n"
@@ -226,8 +226,7 @@ msgid "Control services and the Automated Restart Manager (ARM)"
 msgstr ""
 
 #: src/arm/gnunet-service-arm.c:388 src/transport/plugin_transport_tcp.c:1120
-#: src/transport/plugin_transport_xt.c:1120
-#: src/transport/tcp_service_legacy.c:557 src/util/service.c:1167
+#: src/transport/tcp_service_legacy.c:557
 #, c-format
 msgid ""
 "Disabling IPv6 support for service `%s', failed to create IPv6 socket: %s\n"
@@ -237,35 +236,29 @@ msgstr ""
 #: src/transport/plugin_transport_tcp.c:1139
 #: src/transport/plugin_transport_tcp.c:1145
 #: src/transport/plugin_transport_tcp.c:3835
-#: src/transport/plugin_transport_xt.c:1139
-#: src/transport/plugin_transport_xt.c:1145
-#: src/transport/plugin_transport_xt.c:3833
 #: src/transport/tcp_service_legacy.c:576
-#: src/transport/tcp_service_legacy.c:582 src/util/service.c:1192
-#: src/util/service.c:1198
+#: src/transport/tcp_service_legacy.c:582 src/util/service.c:1156
+#: src/util/service.c:1162
 #, c-format
 msgid "Require valid port number for service `%s' in configuration!\n"
 msgstr ""
 
 #: src/arm/gnunet-service-arm.c:457 src/transport/plugin_transport_tcp.c:1176
-#: src/transport/plugin_transport_xt.c:1176
-#: src/transport/tcp_service_legacy.c:613 src/util/client.c:506
-#: src/util/service.c:1237
+#: src/transport/tcp_service_legacy.c:613 src/util/client.c:521
+#: src/util/service.c:1201
 #, c-format
 msgid "UNIXPATH `%s' too long, maximum length is %llu\n"
 msgstr ""
 
 #: src/arm/gnunet-service-arm.c:462 src/transport/plugin_transport_tcp.c:1180
-#: src/transport/plugin_transport_xt.c:1180
-#: src/transport/tcp_service_legacy.c:617 src/util/client.c:511
-#: src/util/service.c:1242
+#: src/transport/tcp_service_legacy.c:617 src/util/client.c:526
+#: src/util/service.c:1206
 #, c-format
 msgid "Using `%s' instead\n"
 msgstr ""
 
 #: src/arm/gnunet-service-arm.c:495 src/transport/plugin_transport_tcp.c:1211
-#: src/transport/plugin_transport_xt.c:1211
-#: src/transport/tcp_service_legacy.c:648 src/util/service.c:1278
+#: src/transport/tcp_service_legacy.c:648 src/util/service.c:1242
 #, c-format
 msgid ""
 "Disabling UNIX domain socket support for service `%s', failed to create UNIX "
@@ -273,8 +266,7 @@ msgid ""
 msgstr ""
 
 #: src/arm/gnunet-service-arm.c:517 src/transport/plugin_transport_tcp.c:1228
-#: src/transport/plugin_transport_xt.c:1228
-#: src/transport/tcp_service_legacy.c:665 src/util/service.c:1296
+#: src/transport/tcp_service_legacy.c:665 src/util/service.c:1260
 #, c-format
 msgid "Have neither PORT nor UNIXPATH for service `%s', but one is required\n"
 msgstr ""
@@ -282,8 +274,7 @@ msgstr ""
 #: src/arm/gnunet-service-arm.c:556
 #: src/transport/plugin_transport_http_server.c:2688
 #: src/transport/plugin_transport_tcp.c:1259
-#: src/transport/plugin_transport_xt.c:1259
-#: src/transport/tcp_service_legacy.c:696 src/util/service.c:1337
+#: src/transport/tcp_service_legacy.c:696 src/util/service.c:1301
 #, c-format
 msgid "Failed to resolve `%s': %s\n"
 msgstr "»%s« konnte nicht aufgelöst werden: %s\n"
@@ -291,8 +282,7 @@ msgstr "»%s« konnte nicht aufgelöst werden: %s\n"
 #: src/arm/gnunet-service-arm.c:575
 #: src/transport/plugin_transport_http_server.c:2706
 #: src/transport/plugin_transport_tcp.c:1278
-#: src/transport/plugin_transport_xt.c:1278
-#: src/transport/tcp_service_legacy.c:715 src/util/service.c:1357
+#: src/transport/tcp_service_legacy.c:715 src/util/service.c:1321
 #, fuzzy, c-format
 msgid "Failed to find %saddress for `%s'.\n"
 msgstr "Fehler beim Lesen der Freunde-Liste von `%s'\n"
@@ -1603,6 +1593,11 @@ msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n"
 msgid "Unable to parse ATTR record string `%s'\n"
 msgstr "Fehler beim Speichern der Konfigurationsdatei `%s':"
 
+#: src/credential/plugin_rest_credential.c:1128
+#, fuzzy
+msgid "GNS REST API initialized\n"
+msgstr " Verbindung fehlgeschlagen\n"
+
 #: src/datacache/datacache.c:119 src/datacache/datacache.c:311
 #: src/datastore/gnunet-service-datastore.c:757
 msgid "# bytes stored"
@@ -2107,7 +2102,7 @@ msgstr ""
 msgid "Exiting as the number of peers is %u\n"
 msgstr ""
 
-#: src/dht/gnunet_dht_profiler.c:949 src/rps/gnunet-rps-profiler.c:2959
+#: src/dht/gnunet_dht_profiler.c:949 src/rps/gnunet-rps-profiler.c:2981
 #, fuzzy
 msgid "number of peers to start"
 msgstr "Anzahl an Durchläufen"
@@ -3212,11 +3207,11 @@ msgstr "Sie dürfen nur eine Datei zum Deindizieren angeben.\n"
 msgid "set the desired LEVEL of sender-anonymity"
 msgstr "Gewünschten Grad LEVEL an Sender-Anonymität festlegen"
 
-#: src/fs/gnunet-auto-share.c:772 src/fs/gnunet-publish.c:907
+#: src/fs/gnunet-auto-share.c:772
 msgid "disable adding the creation time to the metadata of the uploaded file"
 msgstr ""
 
-#: src/fs/gnunet-auto-share.c:777 src/fs/gnunet-publish.c:912
+#: src/fs/gnunet-auto-share.c:777 src/fs/gnunet-publish.c:907
 msgid "do not use libextractor to add keywords or metadata"
 msgstr ""
 
@@ -3523,6 +3518,10 @@ msgstr "Option `%s' macht keinen Sinn ohne die Option `%s'.\n"
 msgid "Option `%s' makes no sense without option `%s'.\n"
 msgstr "Die Option »%s« ergibt keinen Sinn ohne die Option »%s«.\n"
 
+#: src/fs/gnunet-publish.c:911
+msgid "enable adding the creation time to the metadata of the uploaded file"
+msgstr ""
+
 #: src/fs/gnunet-publish.c:916
 msgid ""
 "print list of extracted keywords that would be used, but do not perform "
@@ -4033,39 +4032,39 @@ msgstr ""
 msgid "GNUnet HTTP server to create business cards"
 msgstr ""
 
-#: src/gns/gnunet-dns2gns.c:203
+#: src/gns/gnunet-dns2gns.c:214
 msgid "Failed to pack DNS response into UDP packet!\n"
 msgstr ""
 
-#: src/gns/gnunet-dns2gns.c:405
+#: src/gns/gnunet-dns2gns.c:416
 #, c-format
 msgid "Cannot parse DNS request from %s\n"
 msgstr ""
 
-#: src/gns/gnunet-dns2gns.c:421
+#: src/gns/gnunet-dns2gns.c:432
 #, fuzzy, c-format
 msgid "Received malformed DNS request from %s\n"
 msgstr "Beschädigte Antwort auf `%s' von Knoten `%s' empfangen.\n"
 
-#: src/gns/gnunet-dns2gns.c:429
+#: src/gns/gnunet-dns2gns.c:440
 #, fuzzy, c-format
 msgid "Received unsupported DNS request from %s\n"
 msgstr "Unbekannte Anfrageart %d empfangen bei %s:%d\n"
 
-#: src/gns/gnunet-dns2gns.c:588
+#: src/gns/gnunet-dns2gns.c:600
 #, fuzzy
 msgid "No DNS server specified!\n"
 msgstr "Keine Schlüsselwörter angegeben!\n"
 
-#: src/gns/gnunet-dns2gns.c:688
+#: src/gns/gnunet-dns2gns.c:748
 msgid "IP of recursive DNS resolver to use (required)"
 msgstr ""
 
-#: src/gns/gnunet-dns2gns.c:693
+#: src/gns/gnunet-dns2gns.c:753
 msgid "UDP port to listen on for inbound DNS requests; default: 2853"
 msgstr ""
 
-#: src/gns/gnunet-dns2gns.c:710
+#: src/gns/gnunet-dns2gns.c:770
 msgid "GNUnet DNS-to-GNS proxy (a DNS server)"
 msgstr ""
 
@@ -4138,104 +4137,104 @@ msgstr ""
 msgid "%s failed at %s:%d: `%s'\n"
 msgstr "»%s« schlug fehl bei %s:%d mit dem Fehler: »%s«.\n"
 
-#: src/gns/gnunet-gns-proxy.c:980
+#: src/gns/gnunet-gns-proxy.c:989
 #, fuzzy, c-format
 msgid "Unsupported CURL TLS backend %d\n"
 msgstr "Kommando `%s' wird nicht unterstützt. Vorgang wird abgebrochen.\n"
 
-#: src/gns/gnunet-gns-proxy.c:1005
+#: src/gns/gnunet-gns-proxy.c:1014
 #, fuzzy, c-format
 msgid "Failed to fetch CN from cert: %s\n"
 msgstr "Fehler beim Lesen der Freunde-Liste von `%s'\n"
 
-#: src/gns/gnunet-gns-proxy.c:1026
+#: src/gns/gnunet-gns-proxy.c:1035
 #, fuzzy, c-format
 msgid "Failed to initialize DANE: %s\n"
 msgstr "SQLite Datenbank konnte nicht initialisiert werden.\n"
 
-#: src/gns/gnunet-gns-proxy.c:1041
+#: src/gns/gnunet-gns-proxy.c:1050
 #, fuzzy, c-format
 msgid "Failed to parse DANE record: %s\n"
 msgstr "Dateiformat fehlerhaft (kein GNUnet Verzeichnis?)\n"
 
-#: src/gns/gnunet-gns-proxy.c:1056
+#: src/gns/gnunet-gns-proxy.c:1065
 #, fuzzy, c-format
 msgid "Failed to verify TLS connection using DANE: %s\n"
 msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n"
 
-#: src/gns/gnunet-gns-proxy.c:1066
+#: src/gns/gnunet-gns-proxy.c:1075
 #, c-format
 msgid "Failed DANE verification failed with GnuTLS verify status code: %u\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:1090
+#: src/gns/gnunet-gns-proxy.c:1099
 #, c-format
 msgid "TLS certificate subject name (%s) does not match `%s': %d\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:1221
+#: src/gns/gnunet-gns-proxy.c:1230
 #, c-format
 msgid "Cookie domain `%s' supplied by server is invalid\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:2122
+#: src/gns/gnunet-gns-proxy.c:2131
 #, fuzzy, c-format
 msgid "Unsupported HTTP method `%s'\n"
 msgstr "Kommando `%s' wird nicht unterstützt. Vorgang wird abgebrochen.\n"
 
-#: src/gns/gnunet-gns-proxy.c:2643
+#: src/gns/gnunet-gns-proxy.c:2652
 #, fuzzy, c-format
 msgid "Unable to import private key from file `%s'\n"
 msgstr "Fehler beim Speichern der Konfigurationsdatei `%s':"
 
-#: src/gns/gnunet-gns-proxy.c:2675
+#: src/gns/gnunet-gns-proxy.c:2684
 #, fuzzy, c-format
 msgid "Unable to import certificate from `%s'\n"
 msgstr "SQLite Datenbank konnte nicht initialisiert werden: %s.\n"
 
-#: src/gns/gnunet-gns-proxy.c:2876
+#: src/gns/gnunet-gns-proxy.c:2885
 #, fuzzy, c-format
 msgid "Failed to start HTTPS server for `%s'\n"
 msgstr "Der Transportdienst auf Port %d konnte nicht gestartet werden.\n"
 
-#: src/gns/gnunet-gns-proxy.c:2898 src/rest/gnunet-rest-server.c:658
+#: src/gns/gnunet-gns-proxy.c:2907 src/rest/gnunet-rest-server.c:668
 #, fuzzy
 msgid "Failed to pass client to MHD\n"
 msgstr "Fehler beim Starten der Collection.\n"
 
-#: src/gns/gnunet-gns-proxy.c:3234
+#: src/gns/gnunet-gns-proxy.c:3243
 #, c-format
 msgid "Unsupported socks version %d\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:3263
+#: src/gns/gnunet-gns-proxy.c:3272
 #, fuzzy, c-format
 msgid "Unsupported socks command %d\n"
 msgstr "Kommando `%s' wird nicht unterstützt. Vorgang wird abgebrochen.\n"
 
-#: src/gns/gnunet-gns-proxy.c:3346
+#: src/gns/gnunet-gns-proxy.c:3355
 #, c-format
 msgid "Unsupported socks address type %d\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:3636
+#: src/gns/gnunet-gns-proxy.c:3693
 #, fuzzy, c-format
 msgid "Failed to load X.509 key and certificate from `%s'\n"
 msgstr "Fehler beim Lesen der Freunde-Liste von `%s'\n"
 
-#: src/gns/gnunet-gns-proxy.c:3764
+#: src/gns/gnunet-gns-proxy.c:3821
 msgid "listen on specified port (default: 7777)"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:3769
+#: src/gns/gnunet-gns-proxy.c:3826
 msgid "pem file to use as CA"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:3773
+#: src/gns/gnunet-gns-proxy.c:3830
 msgid "disable use of IPv6"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:3799
+#: src/gns/gnunet-gns-proxy.c:3856
 msgid "GNUnet GNS proxy"
 msgstr ""
 
@@ -4345,6 +4344,11 @@ msgstr "Fehler beim Speichern der Konfigurationsdatei `%s':"
 msgid "Unable to parse BOX record string `%s'\n"
 msgstr "Fehler beim Speichern der Konfigurationsdatei `%s':"
 
+#: src/gns/plugin_rest_gns.c:452
+#, fuzzy
+msgid "Gns REST API initialized\n"
+msgstr " Verbindung fehlgeschlagen\n"
+
 #: src/gnsrecord/plugin_gnsrecord_dns.c:359
 #, c-format
 msgid "Unable to parse IPv4 address `%s'\n"
@@ -4863,6 +4867,10 @@ msgstr "Fehler beim Speichern der Konfigurationsdatei `%s':"
 msgid "Failed to create directory `%s' for storing egos\n"
 msgstr "Dateiformat fehlerhaft (kein GNUnet Verzeichnis?)\n"
 
+#: src/identity/plugin_rest_identity.c:1297
+msgid "Identity REST API initialized\n"
+msgstr ""
+
 #: src/json/json.c:123
 #, fuzzy, c-format
 msgid "Failed to parse JSON in option `%s': %s (%s)\n"
@@ -5258,6 +5266,11 @@ msgstr ""
 msgid "heap file database running\n"
 msgstr "Sqlite-Datenbank läuft\n"
 
+#: src/namestore/plugin_rest_namestore.c:1079
+#, fuzzy
+msgid "Namestore REST API initialized\n"
+msgstr " Verbindung fehlgeschlagen\n"
+
 #: src/nat-auto/gnunet-nat-auto.c:193
 #, fuzzy
 msgid "Suggested configuration changes:\n"
@@ -5644,7 +5657,7 @@ msgid "\tExpires: %s \t %s\n"
 msgstr ""
 
 #: src/peerinfo-tool/gnunet-peerinfo.c:299
-#: src/rest-plugins/plugin_rest_peerinfo.c:501
+#: src/peerinfo-tool/plugin_rest_peerinfo.c:501
 #, fuzzy, c-format
 msgid "Failure: Cannot convert address to string for peer `%s'\n"
 msgstr "Adresse des Knotens `%s' konnte nicht ermittelt werden.\n"
@@ -5724,6 +5737,11 @@ msgstr "Teste Transport(e) %s\n"
 msgid "Failed to load transport plugin for `%s'\n"
 msgstr "Anwendung `%s' konnte nicht initialisiert werden.\n"
 
+#: src/peerinfo-tool/plugin_rest_peerinfo.c:796
+#, fuzzy
+msgid "Peerinfo REST API initialized\n"
+msgstr " Verbindung fehlgeschlagen\n"
+
 #: src/peerstore/gnunet-peerstore.c:91
 msgid "peerstore"
 msgstr ""
@@ -5888,6 +5906,12 @@ msgstr ""
 msgid "Expiration interval of the attribute"
 msgstr ""
 
+#: src/reclaim/plugin_rest_openid_connect.c:2279
+#: src/reclaim/plugin_rest_reclaim.c:1079
+#, fuzzy
+msgid "Identity Provider REST API initialized\n"
+msgstr " Verbindung fehlgeschlagen\n"
+
 #: src/reclaim/reclaim_api.c:436
 #, fuzzy
 msgid "failed to store record\n"
@@ -5977,50 +6001,20 @@ msgstr ""
 msgid "Search string `%s' is too long!\n"
 msgstr "Dienst »%s« läuft nicht\n"
 
-#: src/rest/gnunet-rest-server.c:927
+#: src/rest/gnunet-rest-server.c:986
 msgid "listen on specified port (default: 7776)"
 msgstr ""
 
-#: src/rest/gnunet-rest-server.c:944
+#: src/rest/gnunet-rest-server.c:1003
 #, fuzzy
 msgid "GNUnet REST server"
 msgstr "GNUnet Netzwerk Topologie tracen."
 
-#: src/rest-plugins/plugin_rest_copying.c:209
+#: src/rest/plugin_rest_copying.c:209
 #, fuzzy
 msgid "COPYING REST API initialized\n"
 msgstr " Verbindung fehlgeschlagen\n"
 
-#: src/rest-plugins/plugin_rest_credential.c:1128
-#, fuzzy
-msgid "GNS REST API initialized\n"
-msgstr " Verbindung fehlgeschlagen\n"
-
-#: src/rest-plugins/plugin_rest_gns.c:452
-#, fuzzy
-msgid "Gns REST API initialized\n"
-msgstr " Verbindung fehlgeschlagen\n"
-
-#: src/rest-plugins/plugin_rest_identity.c:1297
-msgid "Identity REST API initialized\n"
-msgstr ""
-
-#: src/rest-plugins/plugin_rest_namestore.c:1079
-#, fuzzy
-msgid "Namestore REST API initialized\n"
-msgstr " Verbindung fehlgeschlagen\n"
-
-#: src/rest-plugins/plugin_rest_openid_connect.c:2279
-#: src/rest-plugins/plugin_rest_reclaim.c:1079
-#, fuzzy
-msgid "Identity Provider REST API initialized\n"
-msgstr " Verbindung fehlgeschlagen\n"
-
-#: src/rest-plugins/plugin_rest_peerinfo.c:796
-#, fuzzy
-msgid "Peerinfo REST API initialized\n"
-msgstr " Verbindung fehlgeschlagen\n"
-
 #: src/revocation/gnunet-revocation.c:129
 #, c-format
 msgid "Key `%s' is valid\n"
@@ -6167,20 +6161,20 @@ msgstr ""
 msgid "Get peers from biased stream"
 msgstr ""
 
-#: src/rps/gnunet-rps-profiler.c:2964
+#: src/rps/gnunet-rps-profiler.c:2986
 msgid "duration of the profiling"
 msgstr ""
 
-#: src/rps/gnunet-rps-profiler.c:2969
+#: src/rps/gnunet-rps-profiler.c:2991
 msgid "timeout for the profiling"
 msgstr ""
 
-#: src/rps/gnunet-rps-profiler.c:2974
+#: src/rps/gnunet-rps-profiler.c:2996
 #, fuzzy
 msgid "number of PeerIDs to request"
 msgstr "Anzahl an Durchläufen"
 
-#: src/rps/gnunet-rps-profiler.c:2990
+#: src/rps/gnunet-rps-profiler.c:3012
 msgid "Measure quality and performance of the RPS service."
 msgstr ""
 
@@ -6901,18 +6895,18 @@ msgstr "# HELLO-Meldungen empfangen"
 msgid "GNUnet topology control"
 msgstr ""
 
-#: src/transport/gnunet-communicator-tcp.c:2329
-#: src/transport/gnunet-communicator-udp.c:2883
-#: src/transport/gnunet-service-tng.c:4747
+#: src/transport/gnunet-communicator-tcp.c:2328
+#: src/transport/gnunet-communicator-udp.c:2882
+#: src/transport/gnunet-service-tng.c:4888
 #: src/transport/gnunet-service-transport.c:2795
 msgid "Transport service is lacking key configuration settings. Exiting.\n"
 msgstr ""
 
-#: src/transport/gnunet-communicator-tcp.c:2393
+#: src/transport/gnunet-communicator-tcp.c:2392
 msgid "GNUnet TCP communicator"
 msgstr ""
 
-#: src/transport/gnunet-communicator-udp.c:2954
+#: src/transport/gnunet-communicator-udp.c:2953
 msgid "GNUnet UDP communicator"
 msgstr ""
 
@@ -7483,8 +7477,6 @@ msgstr ""
 #: src/transport/plugin_transport_http_server.c:3530
 #: src/transport/plugin_transport_tcp.c:3901
 #: src/transport/plugin_transport_tcp.c:3908
-#: src/transport/plugin_transport_xt.c:3899
-#: src/transport/plugin_transport_xt.c:3906
 msgid "TCP_STEALTH not supported on this platform.\n"
 msgstr ""
 
@@ -7554,7 +7546,6 @@ msgstr ""
 
 #: src/transport/plugin_transport_http_server.c:2905
 #: src/transport/plugin_transport_udp.c:3627
-#: src/transport/plugin_transport_xu.c:2049
 msgid "Disabling IPv6 since it is not supported on this system!\n"
 msgstr ""
 
@@ -7659,8 +7650,6 @@ msgstr "# Bytes verworfen von SMTP (ausgehend)"
 
 #: src/transport/plugin_transport_tcp.c:1557
 #: src/transport/plugin_transport_tcp.c:2883
-#: src/transport/plugin_transport_xt.c:1553
-#: src/transport/plugin_transport_xt.c:2879
 #, c-format
 msgid "Unexpected address length: %u bytes\n"
 msgstr ""
@@ -7669,9 +7658,6 @@ msgstr ""
 #: src/transport/plugin_transport_tcp.c:1964
 #: src/transport/plugin_transport_tcp.c:3147
 #: src/transport/plugin_transport_tcp.c:4024
-#: src/transport/plugin_transport_xt.c:1736
-#: src/transport/plugin_transport_xt.c:1960
-#: src/transport/plugin_transport_xt.c:3143
 msgid "# TCP sessions active"
 msgstr "# aktive TCP-Sitzungen"
 
@@ -7681,87 +7667,66 @@ msgstr "# aktive TCP-Sitzungen"
 #: src/transport/plugin_transport_tcp.c:2143
 #: src/transport/plugin_transport_tcp.c:2243
 #: src/transport/plugin_transport_tcp.c:2268
-#: src/transport/plugin_transport_xt.c:1778
-#: src/transport/plugin_transport_xt.c:1942
-#: src/transport/plugin_transport_xt.c:2066
-#: src/transport/plugin_transport_xt.c:2139
-#: src/transport/plugin_transport_xt.c:2239
-#: src/transport/plugin_transport_xt.c:2264
 msgid "# bytes currently in TCP buffers"
 msgstr "# Bytes derzeit in TCP-Puffern"
 
 #: src/transport/plugin_transport_tcp.c:1785
-#: src/transport/plugin_transport_xt.c:1781
 msgid "# bytes discarded by TCP (disconnect)"
 msgstr "# Bytes verworfen von TCP (unterbrochen)"
 
 #: src/transport/plugin_transport_tcp.c:2073
-#: src/transport/plugin_transport_xt.c:2069
 msgid "# bytes discarded by TCP (timeout)"
 msgstr "# Bytes verworfen von TCP (Zeitüberschreitung)"
 
 #: src/transport/plugin_transport_tcp.c:2147
-#: src/transport/plugin_transport_xt.c:2143
 msgid "# bytes transmitted via TCP"
 msgstr "# Bytes über TCP übertragen"
 
 #: src/transport/plugin_transport_tcp.c:2545
-#: src/transport/plugin_transport_xt.c:2541
 msgid "# requests to create session with invalid address"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:2721
-#: src/transport/plugin_transport_xt.c:2717
 msgid "# transport-service disconnect requests for TCP"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:3213
-#: src/transport/plugin_transport_xt.c:3209
 #, fuzzy
 msgid "# TCP WELCOME messages received"
 msgstr "# verschlüsselter PONG Nachrichten empfangen"
 
 #: src/transport/plugin_transport_tcp.c:3419
-#: src/transport/plugin_transport_xt.c:3415
 msgid "# bytes received via TCP"
 msgstr "# Bytes empfangen über TCP"
 
 #: src/transport/plugin_transport_tcp.c:3470
 #: src/transport/plugin_transport_tcp.c:3528
-#: src/transport/plugin_transport_xt.c:3466
-#: src/transport/plugin_transport_xt.c:3524
 #, fuzzy
 msgid "# TCP server connections active"
 msgstr " Verbindung fehlgeschlagen\n"
 
 #: src/transport/plugin_transport_tcp.c:3474
-#: src/transport/plugin_transport_xt.c:3470
 #, fuzzy
 msgid "# TCP server connect events"
 msgstr "# verbundener Knoten"
 
 #: src/transport/plugin_transport_tcp.c:3480
-#: src/transport/plugin_transport_xt.c:3476
 msgid "TCP connection limit reached, suspending server\n"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:3482
-#: src/transport/plugin_transport_xt.c:3478
 msgid "# TCP service suspended"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:3522
-#: src/transport/plugin_transport_xt.c:3518
 msgid "# TCP service resumed"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:3532
-#: src/transport/plugin_transport_xt.c:3528
 msgid "# network-level TCP disconnect events"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:3851
-#: src/transport/plugin_transport_xt.c:3849
 msgid "Failed to start service.\n"
 msgstr "Fehler beim Starten des Dienstes.\n"
 
@@ -7814,7 +7779,6 @@ msgid "Failed to bind UDP socket to %s: %s\n"
 msgstr "UDP-Sockets können nicht geöffnet werden\n"
 
 #: src/transport/plugin_transport_udp.c:3721
-#: src/transport/plugin_transport_xu.c:2143
 msgid "Disabling IPv4 since it is not supported on this system!\n"
 msgstr ""
 
@@ -7824,19 +7788,15 @@ msgstr "UDP-Sockets können nicht geöffnet werden\n"
 
 #: src/transport/plugin_transport_udp.c:3883
 #: src/transport/plugin_transport_udp.c:3897
-#: src/transport/plugin_transport_xu.c:2301
-#: src/transport/plugin_transport_xu.c:2315
 msgid "must be in [0,65535]"
 msgstr ""
 
 #: src/transport/plugin_transport_udp.c:3929
-#: src/transport/plugin_transport_xu.c:2347
 #, fuzzy
 msgid "must be valid IPv4 address"
 msgstr "»%s« ist keine gültige IP-Adresse.\n"
 
 #: src/transport/plugin_transport_udp.c:3956
-#: src/transport/plugin_transport_xu.c:2374
 #, fuzzy
 msgid "must be valid IPv6 address"
 msgstr "»%s« ist keine gültige IP-Adresse.\n"
@@ -7922,55 +7882,6 @@ msgstr ""
 msgid "# sessions allocated"
 msgstr "# Sitzungsschlüssel akzeptiert"
 
-#: src/transport/plugin_transport_xt.c:4010
-#, fuzzy, c-format
-msgid "XT transport listening on port %llu\n"
-msgstr "TCP-Transportdienst wartet auf Port %llu\n"
-
-#: src/transport/plugin_transport_xt.c:4014
-#, fuzzy
-msgid "XT transport not listening on any port (client only)\n"
-msgstr "TCP-Transportdienst wartet auf Port %llu\n"
-
-#: src/transport/plugin_transport_xt.c:4018
-#, fuzzy, c-format
-msgid "XT transport advertises itself as being on port %llu\n"
-msgstr "TCP-Transportdienst wartet auf Port %llu\n"
-
-#: src/transport/plugin_transport_xt.c:4022
-#, fuzzy
-msgid "# XT sessions active"
-msgstr "# aktive TCP-Sitzungen"
-
-#: src/transport/plugin_transport_xu.c:1237
-#, c-format
-msgid ""
-"XU could not transmit message to `%s': Network seems down, please check your "
-"network configuration\n"
-msgstr ""
-
-#: src/transport/plugin_transport_xu.c:1251
-msgid ""
-"XU could not transmit IPv6 message! Please check your network configuration "
-"and disable IPv6 if your connection does not have a global IPv6 address\n"
-msgstr ""
-
-#: src/transport/plugin_transport_xu.c:2125
-#: src/transport/plugin_transport_xu.c:2224
-#, fuzzy, c-format
-msgid "Failed to bind XU socket to %s: %s\n"
-msgstr "UDP-Sockets können nicht geöffnet werden\n"
-
-#: src/transport/plugin_transport_xu.c:2234
-#, fuzzy
-msgid "Failed to open XU sockets\n"
-msgstr "UDP-Sockets können nicht geöffnet werden\n"
-
-#: src/transport/plugin_transport_xu.c:2398
-#, fuzzy
-msgid "Failed to create XU network sockets\n"
-msgstr "UDP-Sockets können nicht geöffnet werden\n"
-
 #: src/transport/tcp_connection_legacy.c:452
 #, c-format
 msgid "Access denied to `%s'\n"
@@ -7981,17 +7892,17 @@ msgstr "Zugriff verweigert auf »%s«\n"
 msgid "Accepting connection from `%s': %p\n"
 msgstr ""
 
-#: src/transport/tcp_server_legacy.c:474 src/util/service.c:1666
+#: src/transport/tcp_server_legacy.c:474 src/util/service.c:1630
 #, fuzzy, c-format
 msgid "`%s' failed for port %d (%s).\n"
 msgstr "`%s' fehlgeschlagen für Laufwerk %s: %u\n"
 
-#: src/transport/tcp_server_legacy.c:484 src/util/service.c:1676
+#: src/transport/tcp_server_legacy.c:484 src/util/service.c:1640
 #, fuzzy, c-format
 msgid "`%s' failed for port %d (%s): address already in use\n"
 msgstr "`%s' schlug fehl für Port %d: %s. Läuft gnunetd bereits?\n"
 
-#: src/transport/tcp_server_legacy.c:490 src/util/service.c:1682
+#: src/transport/tcp_server_legacy.c:490 src/util/service.c:1646
 #, fuzzy, c-format
 msgid "`%s' failed for `%s': address already in use\n"
 msgstr "%s schlug fehl, Nachrichten Typ %d ist bereits in Verwendung.\n"
@@ -8023,17 +7934,17 @@ msgstr ""
 msgid "Could not parse IPv6 network specification `%s' for `%s:%s'\n"
 msgstr ""
 
-#: src/transport/tcp_service_legacy.c:904 src/util/service.c:1597
+#: src/transport/tcp_service_legacy.c:904 src/util/service.c:1561
 msgid "Could not access a pre-bound socket, will try to bind myself\n"
 msgstr ""
 
 #: src/transport/tcp_service_legacy.c:953
-#: src/transport/tcp_service_legacy.c:971 src/util/service.c:1750
+#: src/transport/tcp_service_legacy.c:971 src/util/service.c:1714
 #, c-format
 msgid "Specified value for `%s' of service `%s' is invalid\n"
 msgstr ""
 
-#: src/transport/tcp_service_legacy.c:996 src/util/service.c:1783
+#: src/transport/tcp_service_legacy.c:996 src/util/service.c:1747
 #, c-format
 msgid "Could not access pre-bound socket %u, will try to bind myself\n"
 msgstr ""
@@ -8048,44 +7959,44 @@ msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n"
 msgid "Service `%s' runs at %s\n"
 msgstr "Dienst »%s« läuft auf %s\n"
 
-#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:2057
+#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:2021
 msgid "Service process failed to initialize\n"
 msgstr ""
 
-#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:2061
+#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:2025
 msgid "Service process could not initialize server function\n"
 msgstr ""
 
-#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:2065
+#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:2029
 msgid "Service process failed to report status\n"
 msgstr ""
 
 #: src/transport/tcp_service_legacy.c:1313 src/util/disk.c:1535
-#: src/util/service.c:1935
+#: src/util/service.c:1899
 #, fuzzy, c-format
 msgid "Cannot obtain information about user `%s': %s\n"
 msgstr "Fehler beim Speichern der Konfigurationsdatei: `%s': %s.\n"
 
-#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1937
+#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1901
 msgid "No such user"
 msgstr ""
 
-#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1956
+#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1920
 #, c-format
 msgid "Cannot change user/group to `%s': %s\n"
 msgstr "Benutzer/Gruppe kann nicht zu »%s« geändert werden: %s\n"
 
-#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:2318
+#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:2282
 msgid "do daemonize (detach from terminal)"
 msgstr ""
 
-#: src/transport/tcp_service_legacy.c:1448 src/util/service.c:2382
-#: src/util/service.c:2397
+#: src/transport/tcp_service_legacy.c:1448 src/util/service.c:2346
+#: src/util/service.c:2361
 #, fuzzy, c-format
 msgid "Malformed configuration file `%s', exit ...\n"
 msgstr "Konfigurationsdatei `%s' wurde erzeugt.\n"
 
-#: src/transport/tcp_service_legacy.c:1458 src/util/service.c:2409
+#: src/transport/tcp_service_legacy.c:1458 src/util/service.c:2373
 #, fuzzy
 msgid "Malformed configuration, exit ...\n"
 msgstr "GNUnet Konfiguration"
@@ -8128,11 +8039,11 @@ msgstr ""
 msgid "Metadata `%s' failed to deserialize"
 msgstr ""
 
-#: src/util/client.c:734
+#: src/util/client.c:749
 msgid "not a valid filename"
 msgstr ""
 
-#: src/util/client.c:925
+#: src/util/client.c:941
 #, c-format
 msgid "Need a non-empty hostname for service `%s'.\n"
 msgstr ""
@@ -8425,7 +8336,7 @@ msgstr ""
 msgid "print this help"
 msgstr ""
 
-#: src/util/getopt_helpers.c:282
+#: src/util/getopt_helpers.c:282 src/util/gnunet-qr.c:300
 msgid "be verbose"
 msgstr ""
 
@@ -8474,52 +8385,52 @@ msgstr "Sie müssen für die Option »%s« zusätzlich eine Zahl angeben.\n"
 msgid "Argument `%s' malformed. Expected base32 (Crockford) encoded value.\n"
 msgstr ""
 
-#: src/util/gnunet-config.c:160
+#: src/util/gnunet-config.c:161
 #, fuzzy, c-format
 msgid "failed to load configuration defaults"
 msgstr "Konfiguration konnte nicht aus %s geladen werden\n"
 
-#: src/util/gnunet-config.c:173
+#: src/util/gnunet-config.c:174
 #, fuzzy, c-format
 msgid "%s or %s argument is required\n"
 msgstr "Option `%s' macht keinen Sinn ohne die Option `%s'.\n"
 
-#: src/util/gnunet-config.c:181
+#: src/util/gnunet-config.c:182
 #, c-format
 msgid "The following sections are available:\n"
 msgstr ""
 
-#: src/util/gnunet-config.c:232
+#: src/util/gnunet-config.c:234
 #, c-format
 msgid "--option argument required to set value\n"
 msgstr ""
 
-#: src/util/gnunet-config.c:286
-msgid "obtain option of value as a filename (with $-expansion)"
+#: src/util/gnunet-config.c:288
+msgid "interpret option value as a filename (with $-expansion)"
 msgstr ""
 
-#: src/util/gnunet-config.c:291
+#: src/util/gnunet-config.c:293
 msgid "name of the section to access"
 msgstr ""
 
-#: src/util/gnunet-config.c:296
+#: src/util/gnunet-config.c:298
 msgid "name of the option to access"
 msgstr ""
 
-#: src/util/gnunet-config.c:301
+#: src/util/gnunet-config.c:303
 msgid "value to set"
 msgstr ""
 
-#: src/util/gnunet-config.c:305
+#: src/util/gnunet-config.c:307
 #, fuzzy
 msgid "print available configuration sections"
 msgstr "GNUnet Konfiguration"
 
-#: src/util/gnunet-config.c:309
+#: src/util/gnunet-config.c:311
 msgid "write configuration file that only contains delta to defaults"
 msgstr ""
 
-#: src/util/gnunet-config.c:322
+#: src/util/gnunet-config.c:324
 msgid "Manipulate GNUnet configuration files"
 msgstr "GNUnet-Konfigurationsdateien bearbeiten"
 
@@ -8614,6 +8525,33 @@ msgstr ""
 msgid "Manipulate GNUnet private ECC key files"
 msgstr ""
 
+#: src/util/gnunet-qr.c:108 src/util/gnunet-uri.c:91
+#, c-format
+msgid "Invalid URI: does not start with `%s'\n"
+msgstr "URL beginnt nicht mit »%s«\n"
+
+#: src/util/gnunet-qr.c:116 src/util/gnunet-uri.c:98
+#, c-format
+msgid "Invalid URI: fails to specify subsystem\n"
+msgstr ""
+
+#: src/util/gnunet-qr.c:127 src/util/gnunet-uri.c:108
+#, c-format
+msgid "No handler known for subsystem `%s'\n"
+msgstr ""
+
+#: src/util/gnunet-qr.c:297
+msgid "use video-device DEVICE (default: /dev/video0"
+msgstr ""
+
+#: src/util/gnunet-qr.c:303
+msgid "do not show preview windows"
+msgstr ""
+
+#: src/util/gnunet-qr.c:311
+msgid "Scan a QR code using a video device and import the uri read"
+msgstr ""
+
 #: src/util/gnunet-resolver.c:168
 msgid "perform a reverse lookup"
 msgstr ""
@@ -8656,21 +8594,6 @@ msgstr ""
 msgid "No URI specified on command line\n"
 msgstr ""
 
-#: src/util/gnunet-uri.c:91
-#, c-format
-msgid "Invalid URI: does not start with `%s'\n"
-msgstr "URL beginnt nicht mit »%s«\n"
-
-#: src/util/gnunet-uri.c:98
-#, c-format
-msgid "Invalid URI: fails to specify subsystem\n"
-msgstr ""
-
-#: src/util/gnunet-uri.c:108
-#, c-format
-msgid "No handler known for subsystem `%s'\n"
-msgstr ""
-
 #: src/util/gnunet-uri.c:170
 msgid "Perform default-actions for GNUnet URIs"
 msgstr ""
@@ -8690,12 +8613,12 @@ msgstr "Fehler beim Parsen der Gerätedaten von `%s' bei %s:%d.\n"
 msgid "Error writing to `%s': %s\n"
 msgstr "Verbindung zu %u.%u.%u.%u:%u fehlgeschlagen: %s\n"
 
-#: src/util/network.c:136
+#: src/util/network.c:176
 #, c-format
 msgid "Unable to shorten unix path `%s' while keeping name unique\n"
 msgstr ""
 
-#: src/util/network.c:1794 src/util/network.c:1978
+#: src/util/network.c:1835 src/util/network.c:2019
 #, c-format
 msgid ""
 "Fatal internal logic error, process hangs in `%s' (abort with CTRL-C)!\n"
@@ -8812,7 +8735,7 @@ msgid ""
 "`GNUNET_SERVICE_client_continue' after %s\n"
 msgstr ""
 
-#: src/util/service.c:1862
+#: src/util/service.c:1826
 msgid ""
 "Could not bind to any of the ports I was supposed to, refusing to run!\n"
 msgstr ""
@@ -9158,6 +9081,34 @@ msgstr "Protokollverletzung auf Socket. Kommando erwartet.\n"
 msgid "`%s' failed on file `%s' at %s:%d with error: %s\n"
 msgstr "`%s' schlug bei Datei `%s' fehl. Ort: %s:%d. Fehler: %s\n"
 
+#, fuzzy
+#~ msgid "XT transport listening on port %llu\n"
+#~ msgstr "TCP-Transportdienst wartet auf Port %llu\n"
+
+#, fuzzy
+#~ msgid "XT transport not listening on any port (client only)\n"
+#~ msgstr "TCP-Transportdienst wartet auf Port %llu\n"
+
+#, fuzzy
+#~ msgid "XT transport advertises itself as being on port %llu\n"
+#~ msgstr "TCP-Transportdienst wartet auf Port %llu\n"
+
+#, fuzzy
+#~ msgid "# XT sessions active"
+#~ msgstr "# aktive TCP-Sitzungen"
+
+#, fuzzy
+#~ msgid "Failed to bind XU socket to %s: %s\n"
+#~ msgstr "UDP-Sockets können nicht geöffnet werden\n"
+
+#, fuzzy
+#~ msgid "Failed to open XU sockets\n"
+#~ msgstr "UDP-Sockets können nicht geöffnet werden\n"
+
+#, fuzzy
+#~ msgid "Failed to create XU network sockets\n"
+#~ msgstr "UDP-Sockets können nicht geöffnet werden\n"
+
 #, fuzzy
 #~ msgid "Print information about DV state"
 #~ msgstr "Informationen über andere GNUnet Knoten ausgeben."

+ 203 - 236
po/es.po

@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: gnunet 0.9.5a\n"
 "Report-Msgid-Bugs-To: gnunet-developers@mail.gnu.org\n"
-"POT-Creation-Date: 2019-02-28 11:41+0100\n"
+"POT-Creation-Date: 2019-04-04 12:39+0200\n"
 "PO-Revision-Date: 2013-02-23 17:50+0100\n"
 "Last-Translator: Miguel Ángel Arruga Vivas <rosen644835@gmail.com>\n"
 "Language-Team: Spanish <es@li.org>\n"
@@ -234,8 +234,7 @@ msgstr ""
 "Servicios de control y el Gestor de Reinicio Automático (ARM en inglés)"
 
 #: src/arm/gnunet-service-arm.c:388 src/transport/plugin_transport_tcp.c:1120
-#: src/transport/plugin_transport_xt.c:1120
-#: src/transport/tcp_service_legacy.c:557 src/util/service.c:1167
+#: src/transport/tcp_service_legacy.c:557
 #, c-format
 msgid ""
 "Disabling IPv6 support for service `%s', failed to create IPv6 socket: %s\n"
@@ -247,12 +246,9 @@ msgstr ""
 #: src/transport/plugin_transport_tcp.c:1139
 #: src/transport/plugin_transport_tcp.c:1145
 #: src/transport/plugin_transport_tcp.c:3835
-#: src/transport/plugin_transport_xt.c:1139
-#: src/transport/plugin_transport_xt.c:1145
-#: src/transport/plugin_transport_xt.c:3833
 #: src/transport/tcp_service_legacy.c:576
-#: src/transport/tcp_service_legacy.c:582 src/util/service.c:1192
-#: src/util/service.c:1198
+#: src/transport/tcp_service_legacy.c:582 src/util/service.c:1156
+#: src/util/service.c:1162
 #, c-format
 msgid "Require valid port number for service `%s' in configuration!\n"
 msgstr ""
@@ -260,25 +256,22 @@ msgstr ""
 "configuración!\n"
 
 #: src/arm/gnunet-service-arm.c:457 src/transport/plugin_transport_tcp.c:1176
-#: src/transport/plugin_transport_xt.c:1176
-#: src/transport/tcp_service_legacy.c:613 src/util/client.c:506
-#: src/util/service.c:1237
+#: src/transport/tcp_service_legacy.c:613 src/util/client.c:521
+#: src/util/service.c:1201
 #, c-format
 msgid "UNIXPATH `%s' too long, maximum length is %llu\n"
 msgstr ""
 "La ruta tipo UNIX «%s» es demasiado larga, la longitud máxima es %llu\n"
 
 #: src/arm/gnunet-service-arm.c:462 src/transport/plugin_transport_tcp.c:1180
-#: src/transport/plugin_transport_xt.c:1180
-#: src/transport/tcp_service_legacy.c:617 src/util/client.c:511
-#: src/util/service.c:1242
+#: src/transport/tcp_service_legacy.c:617 src/util/client.c:526
+#: src/util/service.c:1206
 #, c-format
 msgid "Using `%s' instead\n"
 msgstr "Usando «%s» en su defecto\n"
 
 #: src/arm/gnunet-service-arm.c:495 src/transport/plugin_transport_tcp.c:1211
-#: src/transport/plugin_transport_xt.c:1211
-#: src/transport/tcp_service_legacy.c:648 src/util/service.c:1278
+#: src/transport/tcp_service_legacy.c:648 src/util/service.c:1242
 #, c-format
 msgid ""
 "Disabling UNIX domain socket support for service `%s', failed to create UNIX "
@@ -288,8 +281,7 @@ msgstr ""
 "«%s», no se pudo crear un «socket» UNIX: %s\n"
 
 #: src/arm/gnunet-service-arm.c:517 src/transport/plugin_transport_tcp.c:1228
-#: src/transport/plugin_transport_xt.c:1228
-#: src/transport/tcp_service_legacy.c:665 src/util/service.c:1296
+#: src/transport/tcp_service_legacy.c:665 src/util/service.c:1260
 #, c-format
 msgid "Have neither PORT nor UNIXPATH for service `%s', but one is required\n"
 msgstr ""
@@ -299,8 +291,7 @@ msgstr ""
 #: src/arm/gnunet-service-arm.c:556
 #: src/transport/plugin_transport_http_server.c:2688
 #: src/transport/plugin_transport_tcp.c:1259
-#: src/transport/plugin_transport_xt.c:1259
-#: src/transport/tcp_service_legacy.c:696 src/util/service.c:1337
+#: src/transport/tcp_service_legacy.c:696 src/util/service.c:1301
 #, c-format
 msgid "Failed to resolve `%s': %s\n"
 msgstr "Se produjo un fallo al resolver «%s»: %s\n"
@@ -308,8 +299,7 @@ msgstr "Se produjo un fallo al resolver «%s»: %s\n"
 #: src/arm/gnunet-service-arm.c:575
 #: src/transport/plugin_transport_http_server.c:2706
 #: src/transport/plugin_transport_tcp.c:1278
-#: src/transport/plugin_transport_xt.c:1278
-#: src/transport/tcp_service_legacy.c:715 src/util/service.c:1357
+#: src/transport/tcp_service_legacy.c:715 src/util/service.c:1321
 #, c-format
 msgid "Failed to find %saddress for `%s'.\n"
 msgstr "No se encontró la dirección %s para «%s».\n"
@@ -1679,6 +1669,11 @@ msgstr "Se produjo un fallo al conectar con el almacén de nombres\n"
 msgid "Unable to parse ATTR record string `%s'\n"
 msgstr "No se pudo procesar la cadena de registro TLSA «%s»\n"
 
+#: src/credential/plugin_rest_credential.c:1128
+#, fuzzy
+msgid "GNS REST API initialized\n"
+msgstr "Conexión fallida\n"
+
 #: src/datacache/datacache.c:119 src/datacache/datacache.c:311
 #: src/datastore/gnunet-service-datastore.c:757
 msgid "# bytes stored"
@@ -2202,7 +2197,7 @@ msgstr "Imprime todos los paquetes que pasan por la DHT."
 msgid "Exiting as the number of peers is %u\n"
 msgstr "El número máximo de conexiones es %u\n"
 
-#: src/dht/gnunet_dht_profiler.c:949 src/rps/gnunet-rps-profiler.c:2959
+#: src/dht/gnunet_dht_profiler.c:949 src/rps/gnunet-rps-profiler.c:2981
 msgid "number of peers to start"
 msgstr "número de pares para empezar"
 
@@ -3342,12 +3337,12 @@ msgstr ""
 msgid "set the desired LEVEL of sender-anonymity"
 msgstr "establece el nivel LEVEL deseado de anonimato del emisor"
 
-#: src/fs/gnunet-auto-share.c:772 src/fs/gnunet-publish.c:907
+#: src/fs/gnunet-auto-share.c:772
 msgid "disable adding the creation time to the metadata of the uploaded file"
 msgstr ""
 "deshabilitar añadir tiempo de creación a los metadatos del fichero subido"
 
-#: src/fs/gnunet-auto-share.c:777 src/fs/gnunet-publish.c:912
+#: src/fs/gnunet-auto-share.c:777 src/fs/gnunet-publish.c:907
 msgid "do not use libextractor to add keywords or metadata"
 msgstr "no usar libextractor para añadir palabras clave o metadatos"
 
@@ -3656,6 +3651,12 @@ msgstr "La opción «%s» es obligatoria cuando se usa la opción «%s».\n"
 msgid "Option `%s' makes no sense without option `%s'.\n"
 msgstr "La opción «%s» no tiene sentido sin la opción «%s».\n"
 
+#: src/fs/gnunet-publish.c:911
+#, fuzzy
+msgid "enable adding the creation time to the metadata of the uploaded file"
+msgstr ""
+"deshabilitar añadir tiempo de creación a los metadatos del fichero subido"
+
 #: src/fs/gnunet-publish.c:916
 msgid ""
 "print list of extracted keywords that would be used, but do not perform "
@@ -4160,43 +4161,43 @@ msgstr ""
 msgid "GNUnet HTTP server to create business cards"
 msgstr ""
 
-#: src/gns/gnunet-dns2gns.c:203
+#: src/gns/gnunet-dns2gns.c:214
 msgid "Failed to pack DNS response into UDP packet!\n"
 msgstr ""
 "¡Se produjo un fallo al empaquetar una respuesta DNS en un paquete UDP!\n"
 
-#: src/gns/gnunet-dns2gns.c:405
+#: src/gns/gnunet-dns2gns.c:416
 #, c-format
 msgid "Cannot parse DNS request from %s\n"
 msgstr "No se puede procesar la petición DNS de %s\n"
 
-#: src/gns/gnunet-dns2gns.c:421
+#: src/gns/gnunet-dns2gns.c:432
 #, c-format
 msgid "Received malformed DNS request from %s\n"
 msgstr "Recibida petición DNS mal formada de %s\n"
 
-#: src/gns/gnunet-dns2gns.c:429
+#: src/gns/gnunet-dns2gns.c:440
 #, c-format
 msgid "Received unsupported DNS request from %s\n"
 msgstr "Recibida petición DNS no soportada de %s\n"
 
-#: src/gns/gnunet-dns2gns.c:588
+#: src/gns/gnunet-dns2gns.c:600
 #, fuzzy
 msgid "No DNS server specified!\n"
 msgstr "¡Ninguna palabra clave especificada!\n"
 
-#: src/gns/gnunet-dns2gns.c:688
+#: src/gns/gnunet-dns2gns.c:748
 msgid "IP of recursive DNS resolver to use (required)"
 msgstr "IP del resolvedor recursivo DNS a usar (requerido)"
 
-#: src/gns/gnunet-dns2gns.c:693
+#: src/gns/gnunet-dns2gns.c:753
 #, fuzzy
 msgid "UDP port to listen on for inbound DNS requests; default: 2853"
 msgstr ""
 "Puerto UDP en el que escuchar para peticiones DNS entrantes; predeterminado: "
 "53"
 
-#: src/gns/gnunet-dns2gns.c:710
+#: src/gns/gnunet-dns2gns.c:770
 msgid "GNUnet DNS-to-GNS proxy (a DNS server)"
 msgstr "Pasarela GNUnet DNS-a-GNS (un servidor DNS)"
 
@@ -4269,104 +4270,104 @@ msgstr ""
 msgid "%s failed at %s:%d: `%s'\n"
 msgstr "%s falló en %s:%d: «%s».\n"
 
-#: src/gns/gnunet-gns-proxy.c:980
+#: src/gns/gnunet-gns-proxy.c:989
 #, fuzzy, c-format
 msgid "Unsupported CURL TLS backend %d\n"
 msgstr "Tipo de bloque %u no soportado\n"
 
-#: src/gns/gnunet-gns-proxy.c:1005
+#: src/gns/gnunet-gns-proxy.c:1014
 #, fuzzy, c-format
 msgid "Failed to fetch CN from cert: %s\n"
 msgstr "Se produjo un fallo al mandar la petición DNS a %s\n"
 
-#: src/gns/gnunet-gns-proxy.c:1026
+#: src/gns/gnunet-gns-proxy.c:1035
 #, fuzzy, c-format
 msgid "Failed to initialize DANE: %s\n"
 msgstr "¡No se puede inicializar el resolvedor!\n"
 
-#: src/gns/gnunet-gns-proxy.c:1041
+#: src/gns/gnunet-gns-proxy.c:1050
 #, fuzzy, c-format
 msgid "Failed to parse DANE record: %s\n"
 msgstr "Se produjo un fallo al procesar la petición DNS.  Omitiendo.\n"
 
-#: src/gns/gnunet-gns-proxy.c:1056
+#: src/gns/gnunet-gns-proxy.c:1065
 #, fuzzy, c-format
 msgid "Failed to verify TLS connection using DANE: %s\n"
 msgstr "Se produjo un fallo al borrar el fichero de configuración %s\n"
 
-#: src/gns/gnunet-gns-proxy.c:1066
+#: src/gns/gnunet-gns-proxy.c:1075
 #, c-format
 msgid "Failed DANE verification failed with GnuTLS verify status code: %u\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:1090
+#: src/gns/gnunet-gns-proxy.c:1099
 #, c-format
 msgid "TLS certificate subject name (%s) does not match `%s': %d\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:1221
+#: src/gns/gnunet-gns-proxy.c:1230
 #, c-format
 msgid "Cookie domain `%s' supplied by server is invalid\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:2122
+#: src/gns/gnunet-gns-proxy.c:2131
 #, fuzzy, c-format
 msgid "Unsupported HTTP method `%s'\n"
 msgstr "Tipo no soportado «%s»\n"
 
-#: src/gns/gnunet-gns-proxy.c:2643
+#: src/gns/gnunet-gns-proxy.c:2652
 #, c-format
 msgid "Unable to import private key from file `%s'\n"
 msgstr "No se pudo importar la clave privada del fichero «%s»\n"
 
-#: src/gns/gnunet-gns-proxy.c:2675
+#: src/gns/gnunet-gns-proxy.c:2684
 #, fuzzy, c-format
 msgid "Unable to import certificate from `%s'\n"
 msgstr "No se pudo importar el certificado %s\n"
 
-#: src/gns/gnunet-gns-proxy.c:2876
+#: src/gns/gnunet-gns-proxy.c:2885
 #, fuzzy, c-format
 msgid "Failed to start HTTPS server for `%s'\n"
 msgstr "Se produjo un fallo al iniciar el servidor HTTP\n"
 
-#: src/gns/gnunet-gns-proxy.c:2898 src/rest/gnunet-rest-server.c:658
+#: src/gns/gnunet-gns-proxy.c:2907 src/rest/gnunet-rest-server.c:668
 #, fuzzy
 msgid "Failed to pass client to MHD\n"
 msgstr "Se produjo un fallo al conectar con GNS\n"
 
-#: src/gns/gnunet-gns-proxy.c:3234
+#: src/gns/gnunet-gns-proxy.c:3243
 #, fuzzy, c-format
 msgid "Unsupported socks version %d\n"
 msgstr "Tipo de bloque %u no soportado\n"
 
-#: src/gns/gnunet-gns-proxy.c:3263
+#: src/gns/gnunet-gns-proxy.c:3272
 #, fuzzy, c-format
 msgid "Unsupported socks command %d\n"
 msgstr "Tipo de bloque %u no soportado\n"
 
-#: src/gns/gnunet-gns-proxy.c:3346
+#: src/gns/gnunet-gns-proxy.c:3355
 #, fuzzy, c-format
 msgid "Unsupported socks address type %d\n"
 msgstr "Tipo de bloque %u no soportado\n"
 
-#: src/gns/gnunet-gns-proxy.c:3636
+#: src/gns/gnunet-gns-proxy.c:3693
 #, fuzzy, c-format
 msgid "Failed to load X.509 key and certificate from `%s'\n"
 msgstr "Se produjo un fallo al leer la lista de amigos de «%s»\n"
 
-#: src/gns/gnunet-gns-proxy.c:3764
+#: src/gns/gnunet-gns-proxy.c:3821
 msgid "listen on specified port (default: 7777)"
 msgstr "escuchar en el puerto especificado (predeterminado: 7777)"
 
-#: src/gns/gnunet-gns-proxy.c:3769
+#: src/gns/gnunet-gns-proxy.c:3826
 msgid "pem file to use as CA"
 msgstr "fichero pem para usar como autoridad de certificación (CA)"
 
-#: src/gns/gnunet-gns-proxy.c:3773
+#: src/gns/gnunet-gns-proxy.c:3830
 msgid "disable use of IPv6"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:3799
+#: src/gns/gnunet-gns-proxy.c:3856
 msgid "GNUnet GNS proxy"
 msgstr "Proxy GNUnet GNS"
 
@@ -4477,6 +4478,11 @@ msgstr "No se pudo procesar la cadena de registro VPN «%s»\n"
 msgid "Unable to parse BOX record string `%s'\n"
 msgstr "No se pudo procesar la cadena de registro VPN «%s»\n"
 
+#: src/gns/plugin_rest_gns.c:452
+#, fuzzy
+msgid "Gns REST API initialized\n"
+msgstr "Conexión fallida\n"
+
 #: src/gnsrecord/plugin_gnsrecord_dns.c:359
 #, c-format
 msgid "Unable to parse IPv4 address `%s'\n"
@@ -5033,6 +5039,11 @@ msgstr "Se produjo un fallo al borrar el fichero de configuración %s\n"
 msgid "Failed to create directory `%s' for storing egos\n"
 msgstr "Se produjo un fallo al leer el directorio «%s»\n"
 
+#: src/identity/plugin_rest_identity.c:1297
+#, fuzzy
+msgid "Identity REST API initialized\n"
+msgstr "Conexión fallida\n"
+
 #: src/json/json.c:123
 #, fuzzy, c-format
 msgid "Failed to parse JSON in option `%s': %s (%s)\n"
@@ -5437,6 +5448,11 @@ msgstr "El almacén de nombres no pudo añadir el registro\n"
 msgid "heap file database running\n"
 msgstr "Base de datos de plantilla ejecutándose\n"
 
+#: src/namestore/plugin_rest_namestore.c:1079
+#, fuzzy
+msgid "Namestore REST API initialized\n"
+msgstr "Conexión fallida\n"
+
 #: src/nat-auto/gnunet-nat-auto.c:193
 #, fuzzy
 msgid "Suggested configuration changes:\n"
@@ -5837,7 +5853,7 @@ msgid "\tExpires: %s \t %s\n"
 msgstr ""
 
 #: src/peerinfo-tool/gnunet-peerinfo.c:299
-#: src/rest-plugins/plugin_rest_peerinfo.c:501
+#: src/peerinfo-tool/plugin_rest_peerinfo.c:501
 #, fuzzy, c-format
 msgid "Failure: Cannot convert address to string for peer `%s'\n"
 msgstr "Se produjo un fallo al resolver la dirección para el par «%s»\n"
@@ -5916,6 +5932,11 @@ msgstr "Cargando el módulo de transporte «%s»\n"
 msgid "Failed to load transport plugin for `%s'\n"
 msgstr "Se produjo un fallo al cargar el módulo del transporte para «%s»\n"
 
+#: src/peerinfo-tool/plugin_rest_peerinfo.c:796
+#, fuzzy
+msgid "Peerinfo REST API initialized\n"
+msgstr "Conexión fallida\n"
+
 #: src/peerstore/gnunet-peerstore.c:91
 msgid "peerstore"
 msgstr ""
@@ -6075,6 +6096,12 @@ msgstr ""
 msgid "Expiration interval of the attribute"
 msgstr ""
 
+#: src/reclaim/plugin_rest_openid_connect.c:2279
+#: src/reclaim/plugin_rest_reclaim.c:1079
+#, fuzzy
+msgid "Identity Provider REST API initialized\n"
+msgstr "Conexión fallida\n"
+
 #: src/reclaim/reclaim_api.c:436
 #, fuzzy
 msgid "failed to store record\n"
@@ -6175,52 +6202,21 @@ msgstr "El servicio «%s» no está ejecutandose\n"
 msgid "Search string `%s' is too long!\n"
 msgstr "El servicio «%s» no está ejecutandose\n"
 
-#: src/rest/gnunet-rest-server.c:927
+#: src/rest/gnunet-rest-server.c:986
 #, fuzzy
 msgid "listen on specified port (default: 7776)"
 msgstr "escuchar en el puerto especificado (predeterminado: 7777)"
 
-#: src/rest/gnunet-rest-server.c:944
+#: src/rest/gnunet-rest-server.c:1003
 #, fuzzy
 msgid "GNUnet REST server"
 msgstr "Herramienta de acceso GNUnet GNS"
 
-#: src/rest-plugins/plugin_rest_copying.c:209
+#: src/rest/plugin_rest_copying.c:209
 #, fuzzy
 msgid "COPYING REST API initialized\n"
 msgstr "Conexión fallida\n"
 
-#: src/rest-plugins/plugin_rest_credential.c:1128
-#, fuzzy
-msgid "GNS REST API initialized\n"
-msgstr "Conexión fallida\n"
-
-#: src/rest-plugins/plugin_rest_gns.c:452
-#, fuzzy
-msgid "Gns REST API initialized\n"
-msgstr "Conexión fallida\n"
-
-#: src/rest-plugins/plugin_rest_identity.c:1297
-#, fuzzy
-msgid "Identity REST API initialized\n"
-msgstr "Conexión fallida\n"
-
-#: src/rest-plugins/plugin_rest_namestore.c:1079
-#, fuzzy
-msgid "Namestore REST API initialized\n"
-msgstr "Conexión fallida\n"
-
-#: src/rest-plugins/plugin_rest_openid_connect.c:2279
-#: src/rest-plugins/plugin_rest_reclaim.c:1079
-#, fuzzy
-msgid "Identity Provider REST API initialized\n"
-msgstr "Conexión fallida\n"
-
-#: src/rest-plugins/plugin_rest_peerinfo.c:796
-#, fuzzy
-msgid "Peerinfo REST API initialized\n"
-msgstr "Conexión fallida\n"
-
 #: src/revocation/gnunet-revocation.c:129
 #, fuzzy, c-format
 msgid "Key `%s' is valid\n"
@@ -6373,23 +6369,23 @@ msgstr ""
 msgid "Get peers from biased stream"
 msgstr ""
 
-#: src/rps/gnunet-rps-profiler.c:2964
+#: src/rps/gnunet-rps-profiler.c:2986
 #, fuzzy
 msgid "duration of the profiling"
 msgstr ""
 "La configuración o la versión de GNUnet cambiaron.  ¡Debes ejecutar '%s'!\n"
 
-#: src/rps/gnunet-rps-profiler.c:2969
+#: src/rps/gnunet-rps-profiler.c:2991
 #, fuzzy
 msgid "timeout for the profiling"
 msgstr "Especificar el tipo del registro a buscar"
 
-#: src/rps/gnunet-rps-profiler.c:2974
+#: src/rps/gnunet-rps-profiler.c:2996
 #, fuzzy
 msgid "number of PeerIDs to request"
 msgstr "número de pares para empezar"
 
-#: src/rps/gnunet-rps-profiler.c:2990
+#: src/rps/gnunet-rps-profiler.c:3012
 #, fuzzy
 msgid "Measure quality and performance of the RPS service."
 msgstr "Medir la calidad y rendimiento del servicio NSE."
@@ -7142,9 +7138,9 @@ msgstr "# mensajes «HELLO» recibidos"
 msgid "GNUnet topology control"
 msgstr ""
 
-#: src/transport/gnunet-communicator-tcp.c:2329
-#: src/transport/gnunet-communicator-udp.c:2883
-#: src/transport/gnunet-service-tng.c:4747
+#: src/transport/gnunet-communicator-tcp.c:2328
+#: src/transport/gnunet-communicator-udp.c:2882
+#: src/transport/gnunet-service-tng.c:4888
 #: src/transport/gnunet-service-transport.c:2795
 #, fuzzy
 msgid "Transport service is lacking key configuration settings. Exiting.\n"
@@ -7152,12 +7148,12 @@ msgstr ""
 "El servicio de transporte carece de opciones de configuración de clave.  "
 "Saliendo.\n"
 
-#: src/transport/gnunet-communicator-tcp.c:2393
+#: src/transport/gnunet-communicator-tcp.c:2392
 #, fuzzy
 msgid "GNUnet TCP communicator"
 msgstr "Configurador Gtk de GNUnet"
 
-#: src/transport/gnunet-communicator-udp.c:2954
+#: src/transport/gnunet-communicator-udp.c:2953
 #, fuzzy
 msgid "GNUnet UDP communicator"
 msgstr "Configurador Gtk de GNUnet"
@@ -7761,8 +7757,6 @@ msgstr "tamaño del mensaje"
 #: src/transport/plugin_transport_http_server.c:3530
 #: src/transport/plugin_transport_tcp.c:3901
 #: src/transport/plugin_transport_tcp.c:3908
-#: src/transport/plugin_transport_xt.c:3899
-#: src/transport/plugin_transport_xt.c:3906
 msgid "TCP_STEALTH not supported on this platform.\n"
 msgstr ""
 
@@ -7842,7 +7836,6 @@ msgstr "Encontradas %u direcciones para comunicar al servicio NAT\n"
 
 #: src/transport/plugin_transport_http_server.c:2905
 #: src/transport/plugin_transport_udp.c:3627
-#: src/transport/plugin_transport_xu.c:2049
 msgid "Disabling IPv6 since it is not supported on this system!\n"
 msgstr "¡Deshabilitando IPv6 ya que no está soportado en este sistema!\n"
 
@@ -7950,8 +7943,6 @@ msgstr "# bytes omitidos por SMTP (salientes)"
 
 #: src/transport/plugin_transport_tcp.c:1557
 #: src/transport/plugin_transport_tcp.c:2883
-#: src/transport/plugin_transport_xt.c:1553
-#: src/transport/plugin_transport_xt.c:2879
 #, c-format
 msgid "Unexpected address length: %u bytes\n"
 msgstr "Longitud de dirección inesperada: %u bytes\n"
@@ -7960,9 +7951,6 @@ msgstr "Longitud de dirección inesperada: %u bytes\n"
 #: src/transport/plugin_transport_tcp.c:1964
 #: src/transport/plugin_transport_tcp.c:3147
 #: src/transport/plugin_transport_tcp.c:4024
-#: src/transport/plugin_transport_xt.c:1736
-#: src/transport/plugin_transport_xt.c:1960
-#: src/transport/plugin_transport_xt.c:3143
 msgid "# TCP sessions active"
 msgstr "# Sesiones TCP activas"
 
@@ -7972,86 +7960,65 @@ msgstr "# Sesiones TCP activas"
 #: src/transport/plugin_transport_tcp.c:2143
 #: src/transport/plugin_transport_tcp.c:2243
 #: src/transport/plugin_transport_tcp.c:2268
-#: src/transport/plugin_transport_xt.c:1778
-#: src/transport/plugin_transport_xt.c:1942
-#: src/transport/plugin_transport_xt.c:2066
-#: src/transport/plugin_transport_xt.c:2139
-#: src/transport/plugin_transport_xt.c:2239
-#: src/transport/plugin_transport_xt.c:2264
 msgid "# bytes currently in TCP buffers"
 msgstr "# bytes actualmente en los buffer TCP"
 
 #: src/transport/plugin_transport_tcp.c:1785
-#: src/transport/plugin_transport_xt.c:1781
 msgid "# bytes discarded by TCP (disconnect)"
 msgstr "# bytes descartados por TCP (desconectado)"
 
 #: src/transport/plugin_transport_tcp.c:2073
-#: src/transport/plugin_transport_xt.c:2069
 msgid "# bytes discarded by TCP (timeout)"
 msgstr "# bytes omitidos por TCP (expirados)"
 
 #: src/transport/plugin_transport_tcp.c:2147
-#: src/transport/plugin_transport_xt.c:2143
 msgid "# bytes transmitted via TCP"
 msgstr "# bytes recibidos vía TCP"
 
 #: src/transport/plugin_transport_tcp.c:2545
-#: src/transport/plugin_transport_xt.c:2541
 msgid "# requests to create session with invalid address"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:2721
-#: src/transport/plugin_transport_xt.c:2717
 msgid "# transport-service disconnect requests for TCP"
 msgstr "# peticiones de desconexión del servicio de transporte por TCP"
 
 #: src/transport/plugin_transport_tcp.c:3213
-#: src/transport/plugin_transport_xt.c:3209
 msgid "# TCP WELCOME messages received"
 msgstr "# Mensajes «WELCOME» TCP recibidos"
 
 #: src/transport/plugin_transport_tcp.c:3419
-#: src/transport/plugin_transport_xt.c:3415
 msgid "# bytes received via TCP"
 msgstr "# bytes recibidos vía TCP"
 
 #: src/transport/plugin_transport_tcp.c:3470
 #: src/transport/plugin_transport_tcp.c:3528
-#: src/transport/plugin_transport_xt.c:3466
-#: src/transport/plugin_transport_xt.c:3524
 #, fuzzy
 msgid "# TCP server connections active"
 msgstr "# conexiones «stream» activas"
 
 #: src/transport/plugin_transport_tcp.c:3474
-#: src/transport/plugin_transport_xt.c:3470
 #, fuzzy
 msgid "# TCP server connect events"
 msgstr "# Pares conectados"
 
 #: src/transport/plugin_transport_tcp.c:3480
-#: src/transport/plugin_transport_xt.c:3476
 msgid "TCP connection limit reached, suspending server\n"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:3482
-#: src/transport/plugin_transport_xt.c:3478
 msgid "# TCP service suspended"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:3522
-#: src/transport/plugin_transport_xt.c:3518
 msgid "# TCP service resumed"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:3532
-#: src/transport/plugin_transport_xt.c:3528
 msgid "# network-level TCP disconnect events"
 msgstr "# eventos de desconexión TCP a nivel de red"
 
 #: src/transport/plugin_transport_tcp.c:3851
-#: src/transport/plugin_transport_xt.c:3849
 msgid "Failed to start service.\n"
 msgstr "Se produjo un fallo al iniciar el servicio.\n"
 
@@ -8112,7 +8079,6 @@ msgid "Failed to bind UDP socket to %s: %s\n"
 msgstr "Se produjo un fallo al abrir los «sockets» UDP\n"
 
 #: src/transport/plugin_transport_udp.c:3721
-#: src/transport/plugin_transport_xu.c:2143
 #, fuzzy
 msgid "Disabling IPv4 since it is not supported on this system!\n"
 msgstr "¡Deshabilitando IPv6 ya que no está soportado en este sistema!\n"
@@ -8123,19 +8089,15 @@ msgstr "Se produjo un fallo al abrir los «sockets» UDP\n"
 
 #: src/transport/plugin_transport_udp.c:3883
 #: src/transport/plugin_transport_udp.c:3897
-#: src/transport/plugin_transport_xu.c:2301
-#: src/transport/plugin_transport_xu.c:2315
 msgid "must be in [0,65535]"
 msgstr ""
 
 #: src/transport/plugin_transport_udp.c:3929
-#: src/transport/plugin_transport_xu.c:2347
 #, fuzzy
 msgid "must be valid IPv4 address"
 msgstr "«%s» no es una dirección IP válida.\n"
 
 #: src/transport/plugin_transport_udp.c:3956
-#: src/transport/plugin_transport_xu.c:2374
 #, fuzzy
 msgid "must be valid IPv6 address"
 msgstr "«%s» no es una dirección IP válida.\n"
@@ -8225,61 +8187,6 @@ msgstr ""
 msgid "# sessions allocated"
 msgstr "# sesiones WLAN alojadas"
 
-#: src/transport/plugin_transport_xt.c:4010
-#, fuzzy, c-format
-msgid "XT transport listening on port %llu\n"
-msgstr "Transporte TCP escuchando en el puerto %llu\n"
-
-#: src/transport/plugin_transport_xt.c:4014
-#, fuzzy
-msgid "XT transport not listening on any port (client only)\n"
-msgstr "Transporte TCP no escuchando en ningún puerto (únicamente cliente)\n"
-
-#: src/transport/plugin_transport_xt.c:4018
-#, fuzzy, c-format
-msgid "XT transport advertises itself as being on port %llu\n"
-msgstr "El transporte TCP anuncia que está en el puerto %llu\n"
-
-#: src/transport/plugin_transport_xt.c:4022
-#, fuzzy
-msgid "# XT sessions active"
-msgstr "# Sesiones TCP activas"
-
-#: src/transport/plugin_transport_xu.c:1237
-#, fuzzy, c-format
-msgid ""
-"XU could not transmit message to `%s': Network seems down, please check your "
-"network configuration\n"
-msgstr ""
-"UDP no pudo transmitir el mensaje a «%s»: La red parece caída, por favor, "
-"compruebe su configuración de red\n"
-
-#: src/transport/plugin_transport_xu.c:1251
-#, fuzzy
-msgid ""
-"XU could not transmit IPv6 message! Please check your network configuration "
-"and disable IPv6 if your connection does not have a global IPv6 address\n"
-msgstr ""
-"UDP no pudo transmitir el mensaje a «%s». Por favor, compruebe su "
-"configuración de red y deshabilite IPv6 si su conexión carece de una "
-"dirección IPv6 global\n"
-
-#: src/transport/plugin_transport_xu.c:2125
-#: src/transport/plugin_transport_xu.c:2224
-#, fuzzy, c-format
-msgid "Failed to bind XU socket to %s: %s\n"
-msgstr "Se produjo un fallo al abrir los «sockets» UDP\n"
-
-#: src/transport/plugin_transport_xu.c:2234
-#, fuzzy
-msgid "Failed to open XU sockets\n"
-msgstr "Se produjo un fallo al abrir los «sockets» UDP\n"
-
-#: src/transport/plugin_transport_xu.c:2398
-#, fuzzy
-msgid "Failed to create XU network sockets\n"
-msgstr "Se produjo un fallo al crear una nueva firma"
-
 #: src/transport/tcp_connection_legacy.c:452
 #, c-format
 msgid "Access denied to `%s'\n"
@@ -8290,17 +8197,17 @@ msgstr "Acceso denegado a «%s»\n"
 msgid "Accepting connection from `%s': %p\n"
 msgstr "Aceptando conexión desde «%s»: %p\n"
 
-#: src/transport/tcp_server_legacy.c:474 src/util/service.c:1666
+#: src/transport/tcp_server_legacy.c:474 src/util/service.c:1630
 #, c-format
 msgid "`%s' failed for port %d (%s).\n"
 msgstr "«%s» falló para el puerto %d (%s).\n"
 
-#: src/transport/tcp_server_legacy.c:484 src/util/service.c:1676
+#: src/transport/tcp_server_legacy.c:484 src/util/service.c:1640
 #, c-format
 msgid "`%s' failed for port %d (%s): address already in use\n"
 msgstr "«%s» falló para el puerto %d (%s): dirección en uso actualmente\n"
 
-#: src/transport/tcp_server_legacy.c:490 src/util/service.c:1682
+#: src/transport/tcp_server_legacy.c:490 src/util/service.c:1646
 #, fuzzy, c-format
 msgid "`%s' failed for `%s': address already in use\n"
 msgstr "«%s» falló para «%.*s»: dirección en uso actualmente\n"
@@ -8334,19 +8241,19 @@ msgstr "No se pudo procesar la especificación de red IPv4 «%s» para «%s:%s»
 msgid "Could not parse IPv6 network specification `%s' for `%s:%s'\n"
 msgstr "No se pudo procesar la especificación de red IPv6 «%s» para «%s:%s»\n"
 
-#: src/transport/tcp_service_legacy.c:904 src/util/service.c:1597
+#: src/transport/tcp_service_legacy.c:904 src/util/service.c:1561
 msgid "Could not access a pre-bound socket, will try to bind myself\n"
 msgstr ""
 "No se pudo acceder a un «socket» pre-ascociado, lo intentaré asociar yo "
 "mismo\n"
 
 #: src/transport/tcp_service_legacy.c:953
-#: src/transport/tcp_service_legacy.c:971 src/util/service.c:1750
+#: src/transport/tcp_service_legacy.c:971 src/util/service.c:1714
 #, c-format
 msgid "Specified value for `%s' of service `%s' is invalid\n"
 msgstr "El valor especificado «%s» para el servicio «%s» no es válido\n"
 
-#: src/transport/tcp_service_legacy.c:996 src/util/service.c:1783
+#: src/transport/tcp_service_legacy.c:996 src/util/service.c:1747
 #, c-format
 msgid "Could not access pre-bound socket %u, will try to bind myself\n"
 msgstr ""
@@ -8363,45 +8270,45 @@ msgstr "Se produjo un fallo al inciar «%s» en «%s»\n"
 msgid "Service `%s' runs at %s\n"
 msgstr "El servicio «%s» se ejecuta en %s\n"
 
-#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:2057
+#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:2021
 msgid "Service process failed to initialize\n"
 msgstr "No se pudo inicializar el proceso del servicio\n"
 
-#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:2061
+#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:2025
 msgid "Service process could not initialize server function\n"
 msgstr ""
 "No se pudo inicializar la función del servidor en el proceso del servicio\n"
 
-#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:2065
+#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:2029
 msgid "Service process failed to report status\n"
 msgstr "El proceso del servicio no devolvió un estado\n"
 
 #: src/transport/tcp_service_legacy.c:1313 src/util/disk.c:1535
-#: src/util/service.c:1935
+#: src/util/service.c:1899
 #, c-format
 msgid "Cannot obtain information about user `%s': %s\n"
 msgstr "No se pudo obtener información acerca del usuario «%s»: %s\n"
 
-#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1937
+#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1901
 msgid "No such user"
 msgstr "No existe tal usuario"
 
-#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1956
+#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1920
 #, c-format
 msgid "Cannot change user/group to `%s': %s\n"
 msgstr "Imposible cambiar el usuario/grupo a «%s»: %s\n"
 
-#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:2318
+#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:2282
 msgid "do daemonize (detach from terminal)"
 msgstr "demonizar (desasociar del terminal)"
 
-#: src/transport/tcp_service_legacy.c:1448 src/util/service.c:2382
-#: src/util/service.c:2397
+#: src/transport/tcp_service_legacy.c:1448 src/util/service.c:2346
+#: src/util/service.c:2361
 #, fuzzy, c-format
 msgid "Malformed configuration file `%s', exit ...\n"
 msgstr "Se produjo un fallo al borrar el fichero de configuración %s\n"
 
-#: src/transport/tcp_service_legacy.c:1458 src/util/service.c:2409
+#: src/transport/tcp_service_legacy.c:1458 src/util/service.c:2373
 #, fuzzy
 msgid "Malformed configuration, exit ...\n"
 msgstr "Se produjo un fallo al borrar el fichero de configuración %s\n"
@@ -8444,11 +8351,11 @@ msgstr "Los metadatos serializados «%s» son mayores de lo permitido (%u>%u)"
 msgid "Metadata `%s' failed to deserialize"
 msgstr "Se produjo un fallo al deserializar los metadatos «%s»"
 
-#: src/util/client.c:734
+#: src/util/client.c:749
 msgid "not a valid filename"
 msgstr ""
 
-#: src/util/client.c:925
+#: src/util/client.c:941
 #, c-format
 msgid "Need a non-empty hostname for service `%s'.\n"
 msgstr "Se necesita un nombre de máquina no vacío para el servicio «%s».\n"
@@ -8752,7 +8659,7 @@ msgstr ""
 msgid "print this help"
 msgstr "imprime esta ayuda"
 
-#: src/util/getopt_helpers.c:282
+#: src/util/getopt_helpers.c:282 src/util/gnunet-qr.c:300
 msgid "be verbose"
 msgstr ""
 
@@ -8800,53 +8707,54 @@ msgstr "Tienes que introducir un número en la opción «%s».\n"
 msgid "Argument `%s' malformed. Expected base32 (Crockford) encoded value.\n"
 msgstr ""
 
-#: src/util/gnunet-config.c:160
+#: src/util/gnunet-config.c:161
 #, fuzzy, c-format
 msgid "failed to load configuration defaults"
 msgstr "Se produjo un fallo al cargar la configuración de %s\n"
 
-#: src/util/gnunet-config.c:173
+#: src/util/gnunet-config.c:174
 #, fuzzy, c-format
 msgid "%s or %s argument is required\n"
 msgstr "el parámetro --section es necesario\n"
 
-#: src/util/gnunet-config.c:181
+#: src/util/gnunet-config.c:182
 #, c-format
 msgid "The following sections are available:\n"
 msgstr ""
 
-#: src/util/gnunet-config.c:232
+#: src/util/gnunet-config.c:234
 #, c-format
 msgid "--option argument required to set value\n"
 msgstr "el parámetro --option es necesario para establecer un valor\n"
 
-#: src/util/gnunet-config.c:286
-msgid "obtain option of value as a filename (with $-expansion)"
+#: src/util/gnunet-config.c:288
+#, fuzzy
+msgid "interpret option value as a filename (with $-expansion)"
 msgstr ""
 "obtener la opción del valor como un nombre de fichero (con expansión del $)"
 
-#: src/util/gnunet-config.c:291
+#: src/util/gnunet-config.c:293
 msgid "name of the section to access"
 msgstr "nombre de la sección a la que acceder"
 
-#: src/util/gnunet-config.c:296
+#: src/util/gnunet-config.c:298
 msgid "name of the option to access"
 msgstr "nombre de la opción a la que acceder"
 
-#: src/util/gnunet-config.c:301
+#: src/util/gnunet-config.c:303
 msgid "value to set"
 msgstr "valor a establecer"
 
-#: src/util/gnunet-config.c:305
+#: src/util/gnunet-config.c:307
 #, fuzzy
 msgid "print available configuration sections"
 msgstr "Falta configuración sobre las opciones de claves.\n"
 
-#: src/util/gnunet-config.c:309
+#: src/util/gnunet-config.c:311
 msgid "write configuration file that only contains delta to defaults"
 msgstr ""
 
-#: src/util/gnunet-config.c:322
+#: src/util/gnunet-config.c:324
 msgid "Manipulate GNUnet configuration files"
 msgstr "Manipular ficheros de configuración de GNUnet"
 
@@ -8941,6 +8849,33 @@ msgstr ""
 msgid "Manipulate GNUnet private ECC key files"
 msgstr "Manipular los ficheros de clave privada ECC de GNUnet"
 
+#: src/util/gnunet-qr.c:108 src/util/gnunet-uri.c:91
+#, c-format
+msgid "Invalid URI: does not start with `%s'\n"
+msgstr "URI no válida: no comienza con «%s»\n"
+
+#: src/util/gnunet-qr.c:116 src/util/gnunet-uri.c:98
+#, c-format
+msgid "Invalid URI: fails to specify subsystem\n"
+msgstr "URI no válida: falla al especificar el subsistema\n"
+
+#: src/util/gnunet-qr.c:127 src/util/gnunet-uri.c:108
+#, c-format
+msgid "No handler known for subsystem `%s'\n"
+msgstr "No hay un manejador conocido para el subsistema «%s»\n"
+
+#: src/util/gnunet-qr.c:297
+msgid "use video-device DEVICE (default: /dev/video0"
+msgstr ""
+
+#: src/util/gnunet-qr.c:303
+msgid "do not show preview windows"
+msgstr ""
+
+#: src/util/gnunet-qr.c:311
+msgid "Scan a QR code using a video device and import the uri read"
+msgstr ""
+
 #: src/util/gnunet-resolver.c:168
 msgid "perform a reverse lookup"
 msgstr "realizar una búsqueda inversa"
@@ -8984,21 +8919,6 @@ msgstr ""
 msgid "No URI specified on command line\n"
 msgstr "No se ha especificado una URI en la línea de comandos. Saliendo.\n"
 
-#: src/util/gnunet-uri.c:91
-#, c-format
-msgid "Invalid URI: does not start with `%s'\n"
-msgstr "URI no válida: no comienza con «%s»\n"
-
-#: src/util/gnunet-uri.c:98
-#, c-format
-msgid "Invalid URI: fails to specify subsystem\n"
-msgstr "URI no válida: falla al especificar el subsistema\n"
-
-#: src/util/gnunet-uri.c:108
-#, c-format
-msgid "No handler known for subsystem `%s'\n"
-msgstr "No hay un manejador conocido para el subsistema «%s»\n"
-
 #: src/util/gnunet-uri.c:170
 msgid "Perform default-actions for GNUnet URIs"
 msgstr "Realizar las acciones predeterminadas para URI de GNUnet"
@@ -9020,12 +8940,12 @@ msgstr ""
 msgid "Error writing to `%s': %s\n"
 msgstr "Error escribiendo a «%s»: %s\n"
 
-#: src/util/network.c:136
+#: src/util/network.c:176
 #, c-format
 msgid "Unable to shorten unix path `%s' while keeping name unique\n"
 msgstr "Imposible acortar la ruta unix «%s» manteniendo el nombre único\n"
 
-#: src/util/network.c:1794 src/util/network.c:1978
+#: src/util/network.c:1835 src/util/network.c:2019
 #, c-format
 msgid ""
 "Fatal internal logic error, process hangs in `%s' (abort with CTRL-C)!\n"
@@ -9150,7 +9070,7 @@ msgstr ""
 "El código de procesado para el mensaje del tipo %u no llamó a "
 "«GNUNET_SERVER_receive_done» después de %s\n"
 
-#: src/util/service.c:1862
+#: src/util/service.c:1826
 msgid ""
 "Could not bind to any of the ports I was supposed to, refusing to run!\n"
 msgstr ""
@@ -9505,6 +9425,53 @@ msgstr "Violación externa del protocolo detectada en %s:%d.\n"
 msgid "`%s' failed on file `%s' at %s:%d with error: %s\n"
 msgstr "«%s» falló en el fichero «%s» en %s:%d con el error: %s\n"
 
+#, fuzzy
+#~ msgid "XT transport listening on port %llu\n"
+#~ msgstr "Transporte TCP escuchando en el puerto %llu\n"
+
+#, fuzzy
+#~ msgid "XT transport not listening on any port (client only)\n"
+#~ msgstr ""
+#~ "Transporte TCP no escuchando en ningún puerto (únicamente cliente)\n"
+
+#, fuzzy
+#~ msgid "XT transport advertises itself as being on port %llu\n"
+#~ msgstr "El transporte TCP anuncia que está en el puerto %llu\n"
+
+#, fuzzy
+#~ msgid "# XT sessions active"
+#~ msgstr "# Sesiones TCP activas"
+
+#, fuzzy
+#~ msgid ""
+#~ "XU could not transmit message to `%s': Network seems down, please check "
+#~ "your network configuration\n"
+#~ msgstr ""
+#~ "UDP no pudo transmitir el mensaje a «%s»: La red parece caída, por favor, "
+#~ "compruebe su configuración de red\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "XU could not transmit IPv6 message! Please check your network "
+#~ "configuration and disable IPv6 if your connection does not have a global "
+#~ "IPv6 address\n"
+#~ msgstr ""
+#~ "UDP no pudo transmitir el mensaje a «%s». Por favor, compruebe su "
+#~ "configuración de red y deshabilite IPv6 si su conexión carece de una "
+#~ "dirección IPv6 global\n"
+
+#, fuzzy
+#~ msgid "Failed to bind XU socket to %s: %s\n"
+#~ msgstr "Se produjo un fallo al abrir los «sockets» UDP\n"
+
+#, fuzzy
+#~ msgid "Failed to open XU sockets\n"
+#~ msgstr "Se produjo un fallo al abrir los «sockets» UDP\n"
+
+#, fuzzy
+#~ msgid "Failed to create XU network sockets\n"
+#~ msgstr "Se produjo un fallo al crear una nueva firma"
+
 #, fuzzy
 #~ msgid "Print information about DV state"
 #~ msgstr "Imprime información acerca del estado del ATS"

+ 163 - 223
po/fr.po

@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: gnunet 0.10.1\n"
 "Report-Msgid-Bugs-To: gnunet-developers@mail.gnu.org\n"
-"POT-Creation-Date: 2019-02-28 11:41+0100\n"
+"POT-Creation-Date: 2019-04-04 12:39+0200\n"
 "PO-Revision-Date: 2015-12-24 01:20+0100\n"
 "Last-Translator: Stéphane  Aulery <lkppo@free.fr>\n"
 "Language-Team: French <traduc@traduc.org>\n"
@@ -221,8 +221,7 @@ msgid "Control services and the Automated Restart Manager (ARM)"
 msgstr ""
 
 #: src/arm/gnunet-service-arm.c:388 src/transport/plugin_transport_tcp.c:1120
-#: src/transport/plugin_transport_xt.c:1120
-#: src/transport/tcp_service_legacy.c:557 src/util/service.c:1167
+#: src/transport/tcp_service_legacy.c:557
 #, c-format
 msgid ""
 "Disabling IPv6 support for service `%s', failed to create IPv6 socket: %s\n"
@@ -232,35 +231,29 @@ msgstr ""
 #: src/transport/plugin_transport_tcp.c:1139
 #: src/transport/plugin_transport_tcp.c:1145
 #: src/transport/plugin_transport_tcp.c:3835
-#: src/transport/plugin_transport_xt.c:1139
-#: src/transport/plugin_transport_xt.c:1145
-#: src/transport/plugin_transport_xt.c:3833
 #: src/transport/tcp_service_legacy.c:576
-#: src/transport/tcp_service_legacy.c:582 src/util/service.c:1192
-#: src/util/service.c:1198
+#: src/transport/tcp_service_legacy.c:582 src/util/service.c:1156
+#: src/util/service.c:1162
 #, c-format
 msgid "Require valid port number for service `%s' in configuration!\n"
 msgstr ""
 
 #: src/arm/gnunet-service-arm.c:457 src/transport/plugin_transport_tcp.c:1176
-#: src/transport/plugin_transport_xt.c:1176
-#: src/transport/tcp_service_legacy.c:613 src/util/client.c:506
-#: src/util/service.c:1237
+#: src/transport/tcp_service_legacy.c:613 src/util/client.c:521
+#: src/util/service.c:1201
 #, c-format
 msgid "UNIXPATH `%s' too long, maximum length is %llu\n"
 msgstr ""
 
 #: src/arm/gnunet-service-arm.c:462 src/transport/plugin_transport_tcp.c:1180
-#: src/transport/plugin_transport_xt.c:1180
-#: src/transport/tcp_service_legacy.c:617 src/util/client.c:511
-#: src/util/service.c:1242
+#: src/transport/tcp_service_legacy.c:617 src/util/client.c:526
+#: src/util/service.c:1206
 #, c-format
 msgid "Using `%s' instead\n"
 msgstr ""
 
 #: src/arm/gnunet-service-arm.c:495 src/transport/plugin_transport_tcp.c:1211
-#: src/transport/plugin_transport_xt.c:1211
-#: src/transport/tcp_service_legacy.c:648 src/util/service.c:1278
+#: src/transport/tcp_service_legacy.c:648 src/util/service.c:1242
 #, c-format
 msgid ""
 "Disabling UNIX domain socket support for service `%s', failed to create UNIX "
@@ -268,8 +261,7 @@ msgid ""
 msgstr ""
 
 #: src/arm/gnunet-service-arm.c:517 src/transport/plugin_transport_tcp.c:1228
-#: src/transport/plugin_transport_xt.c:1228
-#: src/transport/tcp_service_legacy.c:665 src/util/service.c:1296
+#: src/transport/tcp_service_legacy.c:665 src/util/service.c:1260
 #, c-format
 msgid "Have neither PORT nor UNIXPATH for service `%s', but one is required\n"
 msgstr ""
@@ -277,8 +269,7 @@ msgstr ""
 #: src/arm/gnunet-service-arm.c:556
 #: src/transport/plugin_transport_http_server.c:2688
 #: src/transport/plugin_transport_tcp.c:1259
-#: src/transport/plugin_transport_xt.c:1259
-#: src/transport/tcp_service_legacy.c:696 src/util/service.c:1337
+#: src/transport/tcp_service_legacy.c:696 src/util/service.c:1301
 #, c-format
 msgid "Failed to resolve `%s': %s\n"
 msgstr "Résolution de « %s » échouée : %s\n"
@@ -286,8 +277,7 @@ msgstr "Résolution de « %s » échouée : %s\n"
 #: src/arm/gnunet-service-arm.c:575
 #: src/transport/plugin_transport_http_server.c:2706
 #: src/transport/plugin_transport_tcp.c:1278
-#: src/transport/plugin_transport_xt.c:1278
-#: src/transport/tcp_service_legacy.c:715 src/util/service.c:1357
+#: src/transport/tcp_service_legacy.c:715 src/util/service.c:1321
 #, c-format
 msgid "Failed to find %saddress for `%s'.\n"
 msgstr ""
@@ -1555,6 +1545,10 @@ msgstr ""
 msgid "Unable to parse ATTR record string `%s'\n"
 msgstr "Résolution de « %s » échouée\n"
 
+#: src/credential/plugin_rest_credential.c:1128
+msgid "GNS REST API initialized\n"
+msgstr ""
+
 #: src/datacache/datacache.c:119 src/datacache/datacache.c:311
 #: src/datastore/gnunet-service-datastore.c:757
 msgid "# bytes stored"
@@ -2045,7 +2039,7 @@ msgstr ""
 msgid "Exiting as the number of peers is %u\n"
 msgstr ""
 
-#: src/dht/gnunet_dht_profiler.c:949 src/rps/gnunet-rps-profiler.c:2959
+#: src/dht/gnunet_dht_profiler.c:949 src/rps/gnunet-rps-profiler.c:2981
 #, fuzzy
 msgid "number of peers to start"
 msgstr "nombre de valeurs"
@@ -3085,11 +3079,11 @@ msgstr ""
 msgid "set the desired LEVEL of sender-anonymity"
 msgstr ""
 
-#: src/fs/gnunet-auto-share.c:772 src/fs/gnunet-publish.c:907
+#: src/fs/gnunet-auto-share.c:772
 msgid "disable adding the creation time to the metadata of the uploaded file"
 msgstr ""
 
-#: src/fs/gnunet-auto-share.c:777 src/fs/gnunet-publish.c:912
+#: src/fs/gnunet-auto-share.c:777 src/fs/gnunet-publish.c:907
 msgid "do not use libextractor to add keywords or metadata"
 msgstr ""
 
@@ -3384,6 +3378,10 @@ msgstr ""
 msgid "Option `%s' makes no sense without option `%s'.\n"
 msgstr ""
 
+#: src/fs/gnunet-publish.c:911
+msgid "enable adding the creation time to the metadata of the uploaded file"
+msgstr ""
+
 #: src/fs/gnunet-publish.c:916
 msgid ""
 "print list of extracted keywords that would be used, but do not perform "
@@ -3849,38 +3847,38 @@ msgstr ""
 msgid "GNUnet HTTP server to create business cards"
 msgstr ""
 
-#: src/gns/gnunet-dns2gns.c:203
+#: src/gns/gnunet-dns2gns.c:214
 msgid "Failed to pack DNS response into UDP packet!\n"
 msgstr ""
 
-#: src/gns/gnunet-dns2gns.c:405
+#: src/gns/gnunet-dns2gns.c:416
 #, c-format
 msgid "Cannot parse DNS request from %s\n"
 msgstr ""
 
-#: src/gns/gnunet-dns2gns.c:421
+#: src/gns/gnunet-dns2gns.c:432
 #, c-format
 msgid "Received malformed DNS request from %s\n"
 msgstr ""
 
-#: src/gns/gnunet-dns2gns.c:429
+#: src/gns/gnunet-dns2gns.c:440
 #, c-format
 msgid "Received unsupported DNS request from %s\n"
 msgstr ""
 
-#: src/gns/gnunet-dns2gns.c:588
+#: src/gns/gnunet-dns2gns.c:600
 msgid "No DNS server specified!\n"
 msgstr ""
 
-#: src/gns/gnunet-dns2gns.c:688
+#: src/gns/gnunet-dns2gns.c:748
 msgid "IP of recursive DNS resolver to use (required)"
 msgstr ""
 
-#: src/gns/gnunet-dns2gns.c:693
+#: src/gns/gnunet-dns2gns.c:753
 msgid "UDP port to listen on for inbound DNS requests; default: 2853"
 msgstr ""
 
-#: src/gns/gnunet-dns2gns.c:710
+#: src/gns/gnunet-dns2gns.c:770
 msgid "GNUnet DNS-to-GNS proxy (a DNS server)"
 msgstr ""
 
@@ -3951,103 +3949,103 @@ msgstr ""
 msgid "%s failed at %s:%d: `%s'\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:980
+#: src/gns/gnunet-gns-proxy.c:989
 #, c-format
 msgid "Unsupported CURL TLS backend %d\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:1005
+#: src/gns/gnunet-gns-proxy.c:1014
 #, c-format
 msgid "Failed to fetch CN from cert: %s\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:1026
+#: src/gns/gnunet-gns-proxy.c:1035
 #, c-format
 msgid "Failed to initialize DANE: %s\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:1041
+#: src/gns/gnunet-gns-proxy.c:1050
 #, c-format
 msgid "Failed to parse DANE record: %s\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:1056
+#: src/gns/gnunet-gns-proxy.c:1065
 #, c-format
 msgid "Failed to verify TLS connection using DANE: %s\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:1066
+#: src/gns/gnunet-gns-proxy.c:1075
 #, c-format
 msgid "Failed DANE verification failed with GnuTLS verify status code: %u\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:1090
+#: src/gns/gnunet-gns-proxy.c:1099
 #, c-format
 msgid "TLS certificate subject name (%s) does not match `%s': %d\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:1221
+#: src/gns/gnunet-gns-proxy.c:1230
 #, c-format
 msgid "Cookie domain `%s' supplied by server is invalid\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:2122
+#: src/gns/gnunet-gns-proxy.c:2131
 #, c-format
 msgid "Unsupported HTTP method `%s'\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:2643
+#: src/gns/gnunet-gns-proxy.c:2652
 #, c-format
 msgid "Unable to import private key from file `%s'\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:2675
+#: src/gns/gnunet-gns-proxy.c:2684
 #, c-format
 msgid "Unable to import certificate from `%s'\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:2876
+#: src/gns/gnunet-gns-proxy.c:2885
 #, c-format
 msgid "Failed to start HTTPS server for `%s'\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:2898 src/rest/gnunet-rest-server.c:658
+#: src/gns/gnunet-gns-proxy.c:2907 src/rest/gnunet-rest-server.c:668
 msgid "Failed to pass client to MHD\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:3234
+#: src/gns/gnunet-gns-proxy.c:3243
 #, c-format
 msgid "Unsupported socks version %d\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:3263
+#: src/gns/gnunet-gns-proxy.c:3272
 #, c-format
 msgid "Unsupported socks command %d\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:3346
+#: src/gns/gnunet-gns-proxy.c:3355
 #, c-format
 msgid "Unsupported socks address type %d\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:3636
+#: src/gns/gnunet-gns-proxy.c:3693
 #, c-format
 msgid "Failed to load X.509 key and certificate from `%s'\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:3764
+#: src/gns/gnunet-gns-proxy.c:3821
 msgid "listen on specified port (default: 7777)"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:3769
+#: src/gns/gnunet-gns-proxy.c:3826
 msgid "pem file to use as CA"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:3773
+#: src/gns/gnunet-gns-proxy.c:3830
 msgid "disable use of IPv6"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:3799
+#: src/gns/gnunet-gns-proxy.c:3856
 msgid "GNUnet GNS proxy"
 msgstr ""
 
@@ -4151,6 +4149,10 @@ msgstr ""
 msgid "Unable to parse BOX record string `%s'\n"
 msgstr ""
 
+#: src/gns/plugin_rest_gns.c:452
+msgid "Gns REST API initialized\n"
+msgstr ""
+
 #: src/gnsrecord/plugin_gnsrecord_dns.c:359
 #, c-format
 msgid "Unable to parse IPv4 address `%s'\n"
@@ -4657,6 +4659,10 @@ msgstr ""
 msgid "Failed to create directory `%s' for storing egos\n"
 msgstr ""
 
+#: src/identity/plugin_rest_identity.c:1297
+msgid "Identity REST API initialized\n"
+msgstr ""
+
 #: src/json/json.c:123
 #, fuzzy, c-format
 msgid "Failed to parse JSON in option `%s': %s (%s)\n"
@@ -5045,6 +5051,10 @@ msgstr ""
 msgid "heap file database running\n"
 msgstr ""
 
+#: src/namestore/plugin_rest_namestore.c:1079
+msgid "Namestore REST API initialized\n"
+msgstr ""
+
 #: src/nat-auto/gnunet-nat-auto.c:193
 msgid "Suggested configuration changes:\n"
 msgstr ""
@@ -5414,7 +5424,7 @@ msgid "\tExpires: %s \t %s\n"
 msgstr ""
 
 #: src/peerinfo-tool/gnunet-peerinfo.c:299
-#: src/rest-plugins/plugin_rest_peerinfo.c:501
+#: src/peerinfo-tool/plugin_rest_peerinfo.c:501
 #, c-format
 msgid "Failure: Cannot convert address to string for peer `%s'\n"
 msgstr ""
@@ -5493,6 +5503,10 @@ msgstr ""
 msgid "Failed to load transport plugin for `%s'\n"
 msgstr ""
 
+#: src/peerinfo-tool/plugin_rest_peerinfo.c:796
+msgid "Peerinfo REST API initialized\n"
+msgstr ""
+
 #: src/peerstore/gnunet-peerstore.c:91
 msgid "peerstore"
 msgstr ""
@@ -5648,6 +5662,11 @@ msgstr ""
 msgid "Expiration interval of the attribute"
 msgstr ""
 
+#: src/reclaim/plugin_rest_openid_connect.c:2279
+#: src/reclaim/plugin_rest_reclaim.c:1079
+msgid "Identity Provider REST API initialized\n"
+msgstr ""
+
 #: src/reclaim/reclaim_api.c:436
 #, fuzzy
 msgid "failed to store record\n"
@@ -5737,43 +5756,18 @@ msgstr ""
 msgid "Search string `%s' is too long!\n"
 msgstr ""
 
-#: src/rest/gnunet-rest-server.c:927
+#: src/rest/gnunet-rest-server.c:986
 msgid "listen on specified port (default: 7776)"
 msgstr ""
 
-#: src/rest/gnunet-rest-server.c:944
+#: src/rest/gnunet-rest-server.c:1003
 msgid "GNUnet REST server"
 msgstr ""
 
-#: src/rest-plugins/plugin_rest_copying.c:209
+#: src/rest/plugin_rest_copying.c:209
 msgid "COPYING REST API initialized\n"
 msgstr ""
 
-#: src/rest-plugins/plugin_rest_credential.c:1128
-msgid "GNS REST API initialized\n"
-msgstr ""
-
-#: src/rest-plugins/plugin_rest_gns.c:452
-msgid "Gns REST API initialized\n"
-msgstr ""
-
-#: src/rest-plugins/plugin_rest_identity.c:1297
-msgid "Identity REST API initialized\n"
-msgstr ""
-
-#: src/rest-plugins/plugin_rest_namestore.c:1079
-msgid "Namestore REST API initialized\n"
-msgstr ""
-
-#: src/rest-plugins/plugin_rest_openid_connect.c:2279
-#: src/rest-plugins/plugin_rest_reclaim.c:1079
-msgid "Identity Provider REST API initialized\n"
-msgstr ""
-
-#: src/rest-plugins/plugin_rest_peerinfo.c:796
-msgid "Peerinfo REST API initialized\n"
-msgstr ""
-
 #: src/revocation/gnunet-revocation.c:129
 #, c-format
 msgid "Key `%s' is valid\n"
@@ -5915,20 +5909,20 @@ msgstr ""
 msgid "Get peers from biased stream"
 msgstr ""
 
-#: src/rps/gnunet-rps-profiler.c:2964
+#: src/rps/gnunet-rps-profiler.c:2986
 msgid "duration of the profiling"
 msgstr ""
 
-#: src/rps/gnunet-rps-profiler.c:2969
+#: src/rps/gnunet-rps-profiler.c:2991
 msgid "timeout for the profiling"
 msgstr ""
 
-#: src/rps/gnunet-rps-profiler.c:2974
+#: src/rps/gnunet-rps-profiler.c:2996
 #, fuzzy
 msgid "number of PeerIDs to request"
 msgstr "nombre de valeurs"
 
-#: src/rps/gnunet-rps-profiler.c:2990
+#: src/rps/gnunet-rps-profiler.c:3012
 msgid "Measure quality and performance of the RPS service."
 msgstr ""
 
@@ -6634,18 +6628,18 @@ msgstr ""
 msgid "GNUnet topology control"
 msgstr ""
 
-#: src/transport/gnunet-communicator-tcp.c:2329
-#: src/transport/gnunet-communicator-udp.c:2883
-#: src/transport/gnunet-service-tng.c:4747
+#: src/transport/gnunet-communicator-tcp.c:2328
+#: src/transport/gnunet-communicator-udp.c:2882
+#: src/transport/gnunet-service-tng.c:4888
 #: src/transport/gnunet-service-transport.c:2795
 msgid "Transport service is lacking key configuration settings. Exiting.\n"
 msgstr ""
 
-#: src/transport/gnunet-communicator-tcp.c:2393
+#: src/transport/gnunet-communicator-tcp.c:2392
 msgid "GNUnet TCP communicator"
 msgstr ""
 
-#: src/transport/gnunet-communicator-udp.c:2954
+#: src/transport/gnunet-communicator-udp.c:2953
 msgid "GNUnet UDP communicator"
 msgstr ""
 
@@ -7191,8 +7185,6 @@ msgstr ""
 #: src/transport/plugin_transport_http_server.c:3530
 #: src/transport/plugin_transport_tcp.c:3901
 #: src/transport/plugin_transport_tcp.c:3908
-#: src/transport/plugin_transport_xt.c:3899
-#: src/transport/plugin_transport_xt.c:3906
 msgid "TCP_STEALTH not supported on this platform.\n"
 msgstr ""
 
@@ -7262,7 +7254,6 @@ msgstr ""
 
 #: src/transport/plugin_transport_http_server.c:2905
 #: src/transport/plugin_transport_udp.c:3627
-#: src/transport/plugin_transport_xu.c:2049
 msgid "Disabling IPv6 since it is not supported on this system!\n"
 msgstr ""
 
@@ -7362,8 +7353,6 @@ msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:1557
 #: src/transport/plugin_transport_tcp.c:2883
-#: src/transport/plugin_transport_xt.c:1553
-#: src/transport/plugin_transport_xt.c:2879
 #, c-format
 msgid "Unexpected address length: %u bytes\n"
 msgstr ""
@@ -7372,9 +7361,6 @@ msgstr ""
 #: src/transport/plugin_transport_tcp.c:1964
 #: src/transport/plugin_transport_tcp.c:3147
 #: src/transport/plugin_transport_tcp.c:4024
-#: src/transport/plugin_transport_xt.c:1736
-#: src/transport/plugin_transport_xt.c:1960
-#: src/transport/plugin_transport_xt.c:3143
 msgid "# TCP sessions active"
 msgstr "# Session TCP active"
 
@@ -7384,85 +7370,64 @@ msgstr "# Session TCP active"
 #: src/transport/plugin_transport_tcp.c:2143
 #: src/transport/plugin_transport_tcp.c:2243
 #: src/transport/plugin_transport_tcp.c:2268
-#: src/transport/plugin_transport_xt.c:1778
-#: src/transport/plugin_transport_xt.c:1942
-#: src/transport/plugin_transport_xt.c:2066
-#: src/transport/plugin_transport_xt.c:2139
-#: src/transport/plugin_transport_xt.c:2239
-#: src/transport/plugin_transport_xt.c:2264
 msgid "# bytes currently in TCP buffers"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:1785
-#: src/transport/plugin_transport_xt.c:1781
 msgid "# bytes discarded by TCP (disconnect)"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:2073
-#: src/transport/plugin_transport_xt.c:2069
 msgid "# bytes discarded by TCP (timeout)"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:2147
-#: src/transport/plugin_transport_xt.c:2143
 msgid "# bytes transmitted via TCP"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:2545
-#: src/transport/plugin_transport_xt.c:2541
 msgid "# requests to create session with invalid address"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:2721
-#: src/transport/plugin_transport_xt.c:2717
 msgid "# transport-service disconnect requests for TCP"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:3213
-#: src/transport/plugin_transport_xt.c:3209
 msgid "# TCP WELCOME messages received"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:3419
-#: src/transport/plugin_transport_xt.c:3415
 msgid "# bytes received via TCP"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:3470
 #: src/transport/plugin_transport_tcp.c:3528
-#: src/transport/plugin_transport_xt.c:3466
-#: src/transport/plugin_transport_xt.c:3524
 #, fuzzy
 msgid "# TCP server connections active"
 msgstr "# Session TCP active"
 
 #: src/transport/plugin_transport_tcp.c:3474
-#: src/transport/plugin_transport_xt.c:3470
 msgid "# TCP server connect events"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:3480
-#: src/transport/plugin_transport_xt.c:3476
 msgid "TCP connection limit reached, suspending server\n"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:3482
-#: src/transport/plugin_transport_xt.c:3478
 msgid "# TCP service suspended"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:3522
-#: src/transport/plugin_transport_xt.c:3518
 msgid "# TCP service resumed"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:3532
-#: src/transport/plugin_transport_xt.c:3528
 msgid "# network-level TCP disconnect events"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:3851
-#: src/transport/plugin_transport_xt.c:3849
 msgid "Failed to start service.\n"
 msgstr ""
 
@@ -7514,7 +7479,6 @@ msgid "Failed to bind UDP socket to %s: %s\n"
 msgstr "Résolution de « %s » échouée : %s\n"
 
 #: src/transport/plugin_transport_udp.c:3721
-#: src/transport/plugin_transport_xu.c:2143
 msgid "Disabling IPv4 since it is not supported on this system!\n"
 msgstr ""
 
@@ -7524,19 +7488,15 @@ msgstr ""
 
 #: src/transport/plugin_transport_udp.c:3883
 #: src/transport/plugin_transport_udp.c:3897
-#: src/transport/plugin_transport_xu.c:2301
-#: src/transport/plugin_transport_xu.c:2315
 msgid "must be in [0,65535]"
 msgstr ""
 
 #: src/transport/plugin_transport_udp.c:3929
-#: src/transport/plugin_transport_xu.c:2347
 #, fuzzy
 msgid "must be valid IPv4 address"
 msgstr "adresse invalide"
 
 #: src/transport/plugin_transport_udp.c:3956
-#: src/transport/plugin_transport_xu.c:2374
 #, fuzzy
 msgid "must be valid IPv6 address"
 msgstr "adresse invalide"
@@ -7612,54 +7572,6 @@ msgstr ""
 msgid "# sessions allocated"
 msgstr "# Session TCP active"
 
-#: src/transport/plugin_transport_xt.c:4010
-#, c-format
-msgid "XT transport listening on port %llu\n"
-msgstr ""
-
-#: src/transport/plugin_transport_xt.c:4014
-msgid "XT transport not listening on any port (client only)\n"
-msgstr ""
-
-#: src/transport/plugin_transport_xt.c:4018
-#, c-format
-msgid "XT transport advertises itself as being on port %llu\n"
-msgstr ""
-
-#: src/transport/plugin_transport_xt.c:4022
-#, fuzzy
-msgid "# XT sessions active"
-msgstr "# Session TCP active"
-
-#: src/transport/plugin_transport_xu.c:1237
-#, c-format
-msgid ""
-"XU could not transmit message to `%s': Network seems down, please check your "
-"network configuration\n"
-msgstr ""
-
-#: src/transport/plugin_transport_xu.c:1251
-msgid ""
-"XU could not transmit IPv6 message! Please check your network configuration "
-"and disable IPv6 if your connection does not have a global IPv6 address\n"
-msgstr ""
-
-#: src/transport/plugin_transport_xu.c:2125
-#: src/transport/plugin_transport_xu.c:2224
-#, fuzzy, c-format
-msgid "Failed to bind XU socket to %s: %s\n"
-msgstr "Résolution de « %s » échouée : %s\n"
-
-#: src/transport/plugin_transport_xu.c:2234
-#, fuzzy
-msgid "Failed to open XU sockets\n"
-msgstr "Résolution de « %s » échouée : %s\n"
-
-#: src/transport/plugin_transport_xu.c:2398
-#, fuzzy
-msgid "Failed to create XU network sockets\n"
-msgstr "Résolution de « %s » échouée : %s\n"
-
 #: src/transport/tcp_connection_legacy.c:452
 #, c-format
 msgid "Access denied to `%s'\n"
@@ -7670,17 +7582,17 @@ msgstr ""
 msgid "Accepting connection from `%s': %p\n"
 msgstr ""
 
-#: src/transport/tcp_server_legacy.c:474 src/util/service.c:1666
+#: src/transport/tcp_server_legacy.c:474 src/util/service.c:1630
 #, c-format
 msgid "`%s' failed for port %d (%s).\n"
 msgstr ""
 
-#: src/transport/tcp_server_legacy.c:484 src/util/service.c:1676
+#: src/transport/tcp_server_legacy.c:484 src/util/service.c:1640
 #, c-format
 msgid "`%s' failed for port %d (%s): address already in use\n"
 msgstr ""
 
-#: src/transport/tcp_server_legacy.c:490 src/util/service.c:1682
+#: src/transport/tcp_server_legacy.c:490 src/util/service.c:1646
 #, c-format
 msgid "`%s' failed for `%s': address already in use\n"
 msgstr ""
@@ -7712,17 +7624,17 @@ msgstr ""
 msgid "Could not parse IPv6 network specification `%s' for `%s:%s'\n"
 msgstr ""
 
-#: src/transport/tcp_service_legacy.c:904 src/util/service.c:1597
+#: src/transport/tcp_service_legacy.c:904 src/util/service.c:1561
 msgid "Could not access a pre-bound socket, will try to bind myself\n"
 msgstr ""
 
 #: src/transport/tcp_service_legacy.c:953
-#: src/transport/tcp_service_legacy.c:971 src/util/service.c:1750
+#: src/transport/tcp_service_legacy.c:971 src/util/service.c:1714
 #, c-format
 msgid "Specified value for `%s' of service `%s' is invalid\n"
 msgstr ""
 
-#: src/transport/tcp_service_legacy.c:996 src/util/service.c:1783
+#: src/transport/tcp_service_legacy.c:996 src/util/service.c:1747
 #, c-format
 msgid "Could not access pre-bound socket %u, will try to bind myself\n"
 msgstr ""
@@ -7737,44 +7649,44 @@ msgstr ""
 msgid "Service `%s' runs at %s\n"
 msgstr ""
 
-#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:2057
+#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:2021
 msgid "Service process failed to initialize\n"
 msgstr ""
 
-#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:2061
+#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:2025
 msgid "Service process could not initialize server function\n"
 msgstr ""
 
-#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:2065
+#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:2029
 msgid "Service process failed to report status\n"
 msgstr ""
 
 #: src/transport/tcp_service_legacy.c:1313 src/util/disk.c:1535
-#: src/util/service.c:1935
+#: src/util/service.c:1899
 #, c-format
 msgid "Cannot obtain information about user `%s': %s\n"
 msgstr ""
 
-#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1937
+#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1901
 msgid "No such user"
 msgstr "Aucun utilisateur trouvé"
 
-#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1956
+#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1920
 #, c-format
 msgid "Cannot change user/group to `%s': %s\n"
 msgstr ""
 
-#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:2318
+#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:2282
 msgid "do daemonize (detach from terminal)"
 msgstr ""
 
-#: src/transport/tcp_service_legacy.c:1448 src/util/service.c:2382
-#: src/util/service.c:2397
+#: src/transport/tcp_service_legacy.c:1448 src/util/service.c:2346
+#: src/util/service.c:2361
 #, c-format
 msgid "Malformed configuration file `%s', exit ...\n"
 msgstr ""
 
-#: src/transport/tcp_service_legacy.c:1458 src/util/service.c:2409
+#: src/transport/tcp_service_legacy.c:1458 src/util/service.c:2373
 msgid "Malformed configuration, exit ...\n"
 msgstr ""
 
@@ -7816,11 +7728,11 @@ msgstr ""
 msgid "Metadata `%s' failed to deserialize"
 msgstr ""
 
-#: src/util/client.c:734
+#: src/util/client.c:749
 msgid "not a valid filename"
 msgstr ""
 
-#: src/util/client.c:925
+#: src/util/client.c:941
 #, c-format
 msgid "Need a non-empty hostname for service `%s'.\n"
 msgstr ""
@@ -8104,7 +8016,7 @@ msgstr ""
 msgid "print this help"
 msgstr ""
 
-#: src/util/getopt_helpers.c:282
+#: src/util/getopt_helpers.c:282 src/util/gnunet-qr.c:300
 msgid "be verbose"
 msgstr ""
 
@@ -8152,51 +8064,51 @@ msgstr ""
 msgid "Argument `%s' malformed. Expected base32 (Crockford) encoded value.\n"
 msgstr ""
 
-#: src/util/gnunet-config.c:160
+#: src/util/gnunet-config.c:161
 #, fuzzy, c-format
 msgid "failed to load configuration defaults"
 msgstr "fornat invalide : « %s »\n"
 
-#: src/util/gnunet-config.c:173
+#: src/util/gnunet-config.c:174
 #, c-format
 msgid "%s or %s argument is required\n"
 msgstr ""
 
-#: src/util/gnunet-config.c:181
+#: src/util/gnunet-config.c:182
 #, c-format
 msgid "The following sections are available:\n"
 msgstr ""
 
-#: src/util/gnunet-config.c:232
+#: src/util/gnunet-config.c:234
 #, c-format
 msgid "--option argument required to set value\n"
 msgstr ""
 
-#: src/util/gnunet-config.c:286
-msgid "obtain option of value as a filename (with $-expansion)"
+#: src/util/gnunet-config.c:288
+msgid "interpret option value as a filename (with $-expansion)"
 msgstr ""
 
-#: src/util/gnunet-config.c:291
+#: src/util/gnunet-config.c:293
 msgid "name of the section to access"
 msgstr ""
 
-#: src/util/gnunet-config.c:296
+#: src/util/gnunet-config.c:298
 msgid "name of the option to access"
 msgstr ""
 
-#: src/util/gnunet-config.c:301
+#: src/util/gnunet-config.c:303
 msgid "value to set"
 msgstr ""
 
-#: src/util/gnunet-config.c:305
+#: src/util/gnunet-config.c:307
 msgid "print available configuration sections"
 msgstr ""
 
-#: src/util/gnunet-config.c:309
+#: src/util/gnunet-config.c:311
 msgid "write configuration file that only contains delta to defaults"
 msgstr ""
 
-#: src/util/gnunet-config.c:322
+#: src/util/gnunet-config.c:324
 msgid "Manipulate GNUnet configuration files"
 msgstr ""
 
@@ -8289,6 +8201,33 @@ msgstr ""
 msgid "Manipulate GNUnet private ECC key files"
 msgstr ""
 
+#: src/util/gnunet-qr.c:108 src/util/gnunet-uri.c:91
+#, c-format
+msgid "Invalid URI: does not start with `%s'\n"
+msgstr ""
+
+#: src/util/gnunet-qr.c:116 src/util/gnunet-uri.c:98
+#, c-format
+msgid "Invalid URI: fails to specify subsystem\n"
+msgstr ""
+
+#: src/util/gnunet-qr.c:127 src/util/gnunet-uri.c:108
+#, c-format
+msgid "No handler known for subsystem `%s'\n"
+msgstr ""
+
+#: src/util/gnunet-qr.c:297
+msgid "use video-device DEVICE (default: /dev/video0"
+msgstr ""
+
+#: src/util/gnunet-qr.c:303
+msgid "do not show preview windows"
+msgstr ""
+
+#: src/util/gnunet-qr.c:311
+msgid "Scan a QR code using a video device and import the uri read"
+msgstr ""
+
 #: src/util/gnunet-resolver.c:168
 msgid "perform a reverse lookup"
 msgstr ""
@@ -8331,21 +8270,6 @@ msgstr ""
 msgid "No URI specified on command line\n"
 msgstr ""
 
-#: src/util/gnunet-uri.c:91
-#, c-format
-msgid "Invalid URI: does not start with `%s'\n"
-msgstr ""
-
-#: src/util/gnunet-uri.c:98
-#, c-format
-msgid "Invalid URI: fails to specify subsystem\n"
-msgstr ""
-
-#: src/util/gnunet-uri.c:108
-#, c-format
-msgid "No handler known for subsystem `%s'\n"
-msgstr ""
-
 #: src/util/gnunet-uri.c:170
 msgid "Perform default-actions for GNUnet URIs"
 msgstr ""
@@ -8365,12 +8289,12 @@ msgstr ""
 msgid "Error writing to `%s': %s\n"
 msgstr ""
 
-#: src/util/network.c:136
+#: src/util/network.c:176
 #, c-format
 msgid "Unable to shorten unix path `%s' while keeping name unique\n"
 msgstr ""
 
-#: src/util/network.c:1794 src/util/network.c:1978
+#: src/util/network.c:1835 src/util/network.c:2019
 #, c-format
 msgid ""
 "Fatal internal logic error, process hangs in `%s' (abort with CTRL-C)!\n"
@@ -8482,7 +8406,7 @@ msgid ""
 "`GNUNET_SERVICE_client_continue' after %s\n"
 msgstr ""
 
-#: src/util/service.c:1862
+#: src/util/service.c:1826
 msgid ""
 "Could not bind to any of the ports I was supposed to, refusing to run!\n"
 msgstr ""
@@ -8817,6 +8741,22 @@ msgstr ""
 msgid "`%s' failed on file `%s' at %s:%d with error: %s\n"
 msgstr ""
 
+#, fuzzy
+#~ msgid "# XT sessions active"
+#~ msgstr "# Session TCP active"
+
+#, fuzzy
+#~ msgid "Failed to bind XU socket to %s: %s\n"
+#~ msgstr "Résolution de « %s » échouée : %s\n"
+
+#, fuzzy
+#~ msgid "Failed to open XU sockets\n"
+#~ msgstr "Résolution de « %s » échouée : %s\n"
+
+#, fuzzy
+#~ msgid "Failed to create XU network sockets\n"
+#~ msgstr "Résolution de « %s » échouée : %s\n"
+
 #, fuzzy
 #~ msgid "Dropping invalid fragment\n"
 #~ msgstr "Argument invalide « %s »\n"

+ 147 - 220
po/it.po

@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: gnunet 0.10.1\n"
 "Report-Msgid-Bugs-To: gnunet-developers@mail.gnu.org\n"
-"POT-Creation-Date: 2019-02-28 11:41+0100\n"
+"POT-Creation-Date: 2019-04-04 12:39+0200\n"
 "PO-Revision-Date: 2018-08-29 13:48+0200\n"
 "Last-Translator: Sebastiano Pistore <SebastianoPistore.info@protonmail.ch>\n"
 "Language-Team: Italian <tp@lists.linux.it>\n"
@@ -217,8 +217,7 @@ msgid "Control services and the Automated Restart Manager (ARM)"
 msgstr ""
 
 #: src/arm/gnunet-service-arm.c:388 src/transport/plugin_transport_tcp.c:1120
-#: src/transport/plugin_transport_xt.c:1120
-#: src/transport/tcp_service_legacy.c:557 src/util/service.c:1167
+#: src/transport/tcp_service_legacy.c:557
 #, c-format
 msgid ""
 "Disabling IPv6 support for service `%s', failed to create IPv6 socket: %s\n"
@@ -228,35 +227,29 @@ msgstr ""
 #: src/transport/plugin_transport_tcp.c:1139
 #: src/transport/plugin_transport_tcp.c:1145
 #: src/transport/plugin_transport_tcp.c:3835
-#: src/transport/plugin_transport_xt.c:1139
-#: src/transport/plugin_transport_xt.c:1145
-#: src/transport/plugin_transport_xt.c:3833
 #: src/transport/tcp_service_legacy.c:576
-#: src/transport/tcp_service_legacy.c:582 src/util/service.c:1192
-#: src/util/service.c:1198
+#: src/transport/tcp_service_legacy.c:582 src/util/service.c:1156
+#: src/util/service.c:1162
 #, c-format
 msgid "Require valid port number for service `%s' in configuration!\n"
 msgstr ""
 
 #: src/arm/gnunet-service-arm.c:457 src/transport/plugin_transport_tcp.c:1176
-#: src/transport/plugin_transport_xt.c:1176
-#: src/transport/tcp_service_legacy.c:613 src/util/client.c:506
-#: src/util/service.c:1237
+#: src/transport/tcp_service_legacy.c:613 src/util/client.c:521
+#: src/util/service.c:1201
 #, c-format
 msgid "UNIXPATH `%s' too long, maximum length is %llu\n"
 msgstr ""
 
 #: src/arm/gnunet-service-arm.c:462 src/transport/plugin_transport_tcp.c:1180
-#: src/transport/plugin_transport_xt.c:1180
-#: src/transport/tcp_service_legacy.c:617 src/util/client.c:511
-#: src/util/service.c:1242
+#: src/transport/tcp_service_legacy.c:617 src/util/client.c:526
+#: src/util/service.c:1206
 #, c-format
 msgid "Using `%s' instead\n"
 msgstr ""
 
 #: src/arm/gnunet-service-arm.c:495 src/transport/plugin_transport_tcp.c:1211
-#: src/transport/plugin_transport_xt.c:1211
-#: src/transport/tcp_service_legacy.c:648 src/util/service.c:1278
+#: src/transport/tcp_service_legacy.c:648 src/util/service.c:1242
 #, c-format
 msgid ""
 "Disabling UNIX domain socket support for service `%s', failed to create UNIX "
@@ -264,8 +257,7 @@ msgid ""
 msgstr ""
 
 #: src/arm/gnunet-service-arm.c:517 src/transport/plugin_transport_tcp.c:1228
-#: src/transport/plugin_transport_xt.c:1228
-#: src/transport/tcp_service_legacy.c:665 src/util/service.c:1296
+#: src/transport/tcp_service_legacy.c:665 src/util/service.c:1260
 #, c-format
 msgid "Have neither PORT nor UNIXPATH for service `%s', but one is required\n"
 msgstr ""
@@ -273,8 +265,7 @@ msgstr ""
 #: src/arm/gnunet-service-arm.c:556
 #: src/transport/plugin_transport_http_server.c:2688
 #: src/transport/plugin_transport_tcp.c:1259
-#: src/transport/plugin_transport_xt.c:1259
-#: src/transport/tcp_service_legacy.c:696 src/util/service.c:1337
+#: src/transport/tcp_service_legacy.c:696 src/util/service.c:1301
 #, c-format
 msgid "Failed to resolve `%s': %s\n"
 msgstr ""
@@ -282,8 +273,7 @@ msgstr ""
 #: src/arm/gnunet-service-arm.c:575
 #: src/transport/plugin_transport_http_server.c:2706
 #: src/transport/plugin_transport_tcp.c:1278
-#: src/transport/plugin_transport_xt.c:1278
-#: src/transport/tcp_service_legacy.c:715 src/util/service.c:1357
+#: src/transport/tcp_service_legacy.c:715 src/util/service.c:1321
 #, c-format
 msgid "Failed to find %saddress for `%s'.\n"
 msgstr ""
@@ -1553,6 +1543,10 @@ msgstr ""
 msgid "Unable to parse ATTR record string `%s'\n"
 msgstr ""
 
+#: src/credential/plugin_rest_credential.c:1128
+msgid "GNS REST API initialized\n"
+msgstr ""
+
 #: src/datacache/datacache.c:119 src/datacache/datacache.c:311
 #: src/datastore/gnunet-service-datastore.c:757
 msgid "# bytes stored"
@@ -2038,7 +2032,7 @@ msgstr ""
 msgid "Exiting as the number of peers is %u\n"
 msgstr ""
 
-#: src/dht/gnunet_dht_profiler.c:949 src/rps/gnunet-rps-profiler.c:2959
+#: src/dht/gnunet_dht_profiler.c:949 src/rps/gnunet-rps-profiler.c:2981
 msgid "number of peers to start"
 msgstr ""
 
@@ -3075,11 +3069,11 @@ msgstr ""
 msgid "set the desired LEVEL of sender-anonymity"
 msgstr ""
 
-#: src/fs/gnunet-auto-share.c:772 src/fs/gnunet-publish.c:907
+#: src/fs/gnunet-auto-share.c:772
 msgid "disable adding the creation time to the metadata of the uploaded file"
 msgstr ""
 
-#: src/fs/gnunet-auto-share.c:777 src/fs/gnunet-publish.c:912
+#: src/fs/gnunet-auto-share.c:777 src/fs/gnunet-publish.c:907
 msgid "do not use libextractor to add keywords or metadata"
 msgstr ""
 
@@ -3378,6 +3372,10 @@ msgstr ""
 msgid "Option `%s' makes no sense without option `%s'.\n"
 msgstr ""
 
+#: src/fs/gnunet-publish.c:911
+msgid "enable adding the creation time to the metadata of the uploaded file"
+msgstr ""
+
 #: src/fs/gnunet-publish.c:916
 msgid ""
 "print list of extracted keywords that would be used, but do not perform "
@@ -3844,38 +3842,38 @@ msgstr ""
 msgid "GNUnet HTTP server to create business cards"
 msgstr ""
 
-#: src/gns/gnunet-dns2gns.c:203
+#: src/gns/gnunet-dns2gns.c:214
 msgid "Failed to pack DNS response into UDP packet!\n"
 msgstr ""
 
-#: src/gns/gnunet-dns2gns.c:405
+#: src/gns/gnunet-dns2gns.c:416
 #, c-format
 msgid "Cannot parse DNS request from %s\n"
 msgstr ""
 
-#: src/gns/gnunet-dns2gns.c:421
+#: src/gns/gnunet-dns2gns.c:432
 #, c-format
 msgid "Received malformed DNS request from %s\n"
 msgstr ""
 
-#: src/gns/gnunet-dns2gns.c:429
+#: src/gns/gnunet-dns2gns.c:440
 #, c-format
 msgid "Received unsupported DNS request from %s\n"
 msgstr ""
 
-#: src/gns/gnunet-dns2gns.c:588
+#: src/gns/gnunet-dns2gns.c:600
 msgid "No DNS server specified!\n"
 msgstr ""
 
-#: src/gns/gnunet-dns2gns.c:688
+#: src/gns/gnunet-dns2gns.c:748
 msgid "IP of recursive DNS resolver to use (required)"
 msgstr ""
 
-#: src/gns/gnunet-dns2gns.c:693
+#: src/gns/gnunet-dns2gns.c:753
 msgid "UDP port to listen on for inbound DNS requests; default: 2853"
 msgstr ""
 
-#: src/gns/gnunet-dns2gns.c:710
+#: src/gns/gnunet-dns2gns.c:770
 msgid "GNUnet DNS-to-GNS proxy (a DNS server)"
 msgstr ""
 
@@ -3946,103 +3944,103 @@ msgstr ""
 msgid "%s failed at %s:%d: `%s'\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:980
+#: src/gns/gnunet-gns-proxy.c:989
 #, c-format
 msgid "Unsupported CURL TLS backend %d\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:1005
+#: src/gns/gnunet-gns-proxy.c:1014
 #, c-format
 msgid "Failed to fetch CN from cert: %s\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:1026
+#: src/gns/gnunet-gns-proxy.c:1035
 #, c-format
 msgid "Failed to initialize DANE: %s\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:1041
+#: src/gns/gnunet-gns-proxy.c:1050
 #, c-format
 msgid "Failed to parse DANE record: %s\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:1056
+#: src/gns/gnunet-gns-proxy.c:1065
 #, c-format
 msgid "Failed to verify TLS connection using DANE: %s\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:1066
+#: src/gns/gnunet-gns-proxy.c:1075
 #, c-format
 msgid "Failed DANE verification failed with GnuTLS verify status code: %u\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:1090
+#: src/gns/gnunet-gns-proxy.c:1099
 #, c-format
 msgid "TLS certificate subject name (%s) does not match `%s': %d\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:1221
+#: src/gns/gnunet-gns-proxy.c:1230
 #, c-format
 msgid "Cookie domain `%s' supplied by server is invalid\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:2122
+#: src/gns/gnunet-gns-proxy.c:2131
 #, c-format
 msgid "Unsupported HTTP method `%s'\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:2643
+#: src/gns/gnunet-gns-proxy.c:2652
 #, c-format
 msgid "Unable to import private key from file `%s'\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:2675
+#: src/gns/gnunet-gns-proxy.c:2684
 #, c-format
 msgid "Unable to import certificate from `%s'\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:2876
+#: src/gns/gnunet-gns-proxy.c:2885
 #, c-format
 msgid "Failed to start HTTPS server for `%s'\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:2898 src/rest/gnunet-rest-server.c:658
+#: src/gns/gnunet-gns-proxy.c:2907 src/rest/gnunet-rest-server.c:668
 msgid "Failed to pass client to MHD\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:3234
+#: src/gns/gnunet-gns-proxy.c:3243
 #, c-format
 msgid "Unsupported socks version %d\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:3263
+#: src/gns/gnunet-gns-proxy.c:3272
 #, c-format
 msgid "Unsupported socks command %d\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:3346
+#: src/gns/gnunet-gns-proxy.c:3355
 #, c-format
 msgid "Unsupported socks address type %d\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:3636
+#: src/gns/gnunet-gns-proxy.c:3693
 #, c-format
 msgid "Failed to load X.509 key and certificate from `%s'\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:3764
+#: src/gns/gnunet-gns-proxy.c:3821
 msgid "listen on specified port (default: 7777)"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:3769
+#: src/gns/gnunet-gns-proxy.c:3826
 msgid "pem file to use as CA"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:3773
+#: src/gns/gnunet-gns-proxy.c:3830
 msgid "disable use of IPv6"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:3799
+#: src/gns/gnunet-gns-proxy.c:3856
 msgid "GNUnet GNS proxy"
 msgstr ""
 
@@ -4146,6 +4144,10 @@ msgstr ""
 msgid "Unable to parse BOX record string `%s'\n"
 msgstr ""
 
+#: src/gns/plugin_rest_gns.c:452
+msgid "Gns REST API initialized\n"
+msgstr ""
+
 #: src/gnsrecord/plugin_gnsrecord_dns.c:359
 #, c-format
 msgid "Unable to parse IPv4 address `%s'\n"
@@ -4652,6 +4654,10 @@ msgstr ""
 msgid "Failed to create directory `%s' for storing egos\n"
 msgstr ""
 
+#: src/identity/plugin_rest_identity.c:1297
+msgid "Identity REST API initialized\n"
+msgstr ""
+
 #: src/json/json.c:123
 #, c-format
 msgid "Failed to parse JSON in option `%s': %s (%s)\n"
@@ -5040,6 +5046,10 @@ msgstr ""
 msgid "heap file database running\n"
 msgstr ""
 
+#: src/namestore/plugin_rest_namestore.c:1079
+msgid "Namestore REST API initialized\n"
+msgstr ""
+
 #: src/nat-auto/gnunet-nat-auto.c:193
 msgid "Suggested configuration changes:\n"
 msgstr ""
@@ -5408,7 +5418,7 @@ msgid "\tExpires: %s \t %s\n"
 msgstr ""
 
 #: src/peerinfo-tool/gnunet-peerinfo.c:299
-#: src/rest-plugins/plugin_rest_peerinfo.c:501
+#: src/peerinfo-tool/plugin_rest_peerinfo.c:501
 #, c-format
 msgid "Failure: Cannot convert address to string for peer `%s'\n"
 msgstr ""
@@ -5487,6 +5497,10 @@ msgstr ""
 msgid "Failed to load transport plugin for `%s'\n"
 msgstr ""
 
+#: src/peerinfo-tool/plugin_rest_peerinfo.c:796
+msgid "Peerinfo REST API initialized\n"
+msgstr ""
+
 #: src/peerstore/gnunet-peerstore.c:91
 msgid "peerstore"
 msgstr ""
@@ -5642,6 +5656,11 @@ msgstr ""
 msgid "Expiration interval of the attribute"
 msgstr ""
 
+#: src/reclaim/plugin_rest_openid_connect.c:2279
+#: src/reclaim/plugin_rest_reclaim.c:1079
+msgid "Identity Provider REST API initialized\n"
+msgstr ""
+
 #: src/reclaim/reclaim_api.c:436
 msgid "failed to store record\n"
 msgstr ""
@@ -5730,43 +5749,18 @@ msgstr ""
 msgid "Search string `%s' is too long!\n"
 msgstr ""
 
-#: src/rest/gnunet-rest-server.c:927
+#: src/rest/gnunet-rest-server.c:986
 msgid "listen on specified port (default: 7776)"
 msgstr ""
 
-#: src/rest/gnunet-rest-server.c:944
+#: src/rest/gnunet-rest-server.c:1003
 msgid "GNUnet REST server"
 msgstr ""
 
-#: src/rest-plugins/plugin_rest_copying.c:209
+#: src/rest/plugin_rest_copying.c:209
 msgid "COPYING REST API initialized\n"
 msgstr ""
 
-#: src/rest-plugins/plugin_rest_credential.c:1128
-msgid "GNS REST API initialized\n"
-msgstr ""
-
-#: src/rest-plugins/plugin_rest_gns.c:452
-msgid "Gns REST API initialized\n"
-msgstr ""
-
-#: src/rest-plugins/plugin_rest_identity.c:1297
-msgid "Identity REST API initialized\n"
-msgstr ""
-
-#: src/rest-plugins/plugin_rest_namestore.c:1079
-msgid "Namestore REST API initialized\n"
-msgstr ""
-
-#: src/rest-plugins/plugin_rest_openid_connect.c:2279
-#: src/rest-plugins/plugin_rest_reclaim.c:1079
-msgid "Identity Provider REST API initialized\n"
-msgstr ""
-
-#: src/rest-plugins/plugin_rest_peerinfo.c:796
-msgid "Peerinfo REST API initialized\n"
-msgstr ""
-
 #: src/revocation/gnunet-revocation.c:129
 #, c-format
 msgid "Key `%s' is valid\n"
@@ -5908,19 +5902,19 @@ msgstr ""
 msgid "Get peers from biased stream"
 msgstr ""
 
-#: src/rps/gnunet-rps-profiler.c:2964
+#: src/rps/gnunet-rps-profiler.c:2986
 msgid "duration of the profiling"
 msgstr ""
 
-#: src/rps/gnunet-rps-profiler.c:2969
+#: src/rps/gnunet-rps-profiler.c:2991
 msgid "timeout for the profiling"
 msgstr ""
 
-#: src/rps/gnunet-rps-profiler.c:2974
+#: src/rps/gnunet-rps-profiler.c:2996
 msgid "number of PeerIDs to request"
 msgstr ""
 
-#: src/rps/gnunet-rps-profiler.c:2990
+#: src/rps/gnunet-rps-profiler.c:3012
 msgid "Measure quality and performance of the RPS service."
 msgstr ""
 
@@ -6625,18 +6619,18 @@ msgstr ""
 msgid "GNUnet topology control"
 msgstr ""
 
-#: src/transport/gnunet-communicator-tcp.c:2329
-#: src/transport/gnunet-communicator-udp.c:2883
-#: src/transport/gnunet-service-tng.c:4747
+#: src/transport/gnunet-communicator-tcp.c:2328
+#: src/transport/gnunet-communicator-udp.c:2882
+#: src/transport/gnunet-service-tng.c:4888
 #: src/transport/gnunet-service-transport.c:2795
 msgid "Transport service is lacking key configuration settings. Exiting.\n"
 msgstr ""
 
-#: src/transport/gnunet-communicator-tcp.c:2393
+#: src/transport/gnunet-communicator-tcp.c:2392
 msgid "GNUnet TCP communicator"
 msgstr ""
 
-#: src/transport/gnunet-communicator-udp.c:2954
+#: src/transport/gnunet-communicator-udp.c:2953
 msgid "GNUnet UDP communicator"
 msgstr ""
 
@@ -7186,8 +7180,6 @@ msgstr ""
 #: src/transport/plugin_transport_http_server.c:3530
 #: src/transport/plugin_transport_tcp.c:3901
 #: src/transport/plugin_transport_tcp.c:3908
-#: src/transport/plugin_transport_xt.c:3899
-#: src/transport/plugin_transport_xt.c:3906
 msgid "TCP_STEALTH not supported on this platform.\n"
 msgstr ""
 
@@ -7257,7 +7249,6 @@ msgstr ""
 
 #: src/transport/plugin_transport_http_server.c:2905
 #: src/transport/plugin_transport_udp.c:3627
-#: src/transport/plugin_transport_xu.c:2049
 msgid "Disabling IPv6 since it is not supported on this system!\n"
 msgstr ""
 
@@ -7357,8 +7348,6 @@ msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:1557
 #: src/transport/plugin_transport_tcp.c:2883
-#: src/transport/plugin_transport_xt.c:1553
-#: src/transport/plugin_transport_xt.c:2879
 #, c-format
 msgid "Unexpected address length: %u bytes\n"
 msgstr ""
@@ -7367,9 +7356,6 @@ msgstr ""
 #: src/transport/plugin_transport_tcp.c:1964
 #: src/transport/plugin_transport_tcp.c:3147
 #: src/transport/plugin_transport_tcp.c:4024
-#: src/transport/plugin_transport_xt.c:1736
-#: src/transport/plugin_transport_xt.c:1960
-#: src/transport/plugin_transport_xt.c:3143
 msgid "# TCP sessions active"
 msgstr ""
 
@@ -7379,85 +7365,64 @@ msgstr ""
 #: src/transport/plugin_transport_tcp.c:2143
 #: src/transport/plugin_transport_tcp.c:2243
 #: src/transport/plugin_transport_tcp.c:2268
-#: src/transport/plugin_transport_xt.c:1778
-#: src/transport/plugin_transport_xt.c:1942
-#: src/transport/plugin_transport_xt.c:2066
-#: src/transport/plugin_transport_xt.c:2139
-#: src/transport/plugin_transport_xt.c:2239
-#: src/transport/plugin_transport_xt.c:2264
 msgid "# bytes currently in TCP buffers"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:1785
-#: src/transport/plugin_transport_xt.c:1781
 msgid "# bytes discarded by TCP (disconnect)"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:2073
-#: src/transport/plugin_transport_xt.c:2069
 msgid "# bytes discarded by TCP (timeout)"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:2147
-#: src/transport/plugin_transport_xt.c:2143
 msgid "# bytes transmitted via TCP"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:2545
-#: src/transport/plugin_transport_xt.c:2541
 msgid "# requests to create session with invalid address"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:2721
-#: src/transport/plugin_transport_xt.c:2717
 msgid "# transport-service disconnect requests for TCP"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:3213
-#: src/transport/plugin_transport_xt.c:3209
 msgid "# TCP WELCOME messages received"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:3419
-#: src/transport/plugin_transport_xt.c:3415
 msgid "# bytes received via TCP"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:3470
 #: src/transport/plugin_transport_tcp.c:3528
-#: src/transport/plugin_transport_xt.c:3466
-#: src/transport/plugin_transport_xt.c:3524
 #, fuzzy
 msgid "# TCP server connections active"
 msgstr "# connessioni attive"
 
 #: src/transport/plugin_transport_tcp.c:3474
-#: src/transport/plugin_transport_xt.c:3470
 msgid "# TCP server connect events"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:3480
-#: src/transport/plugin_transport_xt.c:3476
 msgid "TCP connection limit reached, suspending server\n"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:3482
-#: src/transport/plugin_transport_xt.c:3478
 msgid "# TCP service suspended"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:3522
-#: src/transport/plugin_transport_xt.c:3518
 msgid "# TCP service resumed"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:3532
-#: src/transport/plugin_transport_xt.c:3528
 msgid "# network-level TCP disconnect events"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:3851
-#: src/transport/plugin_transport_xt.c:3849
 msgid "Failed to start service.\n"
 msgstr ""
 
@@ -7509,7 +7474,6 @@ msgid "Failed to bind UDP socket to %s: %s\n"
 msgstr ""
 
 #: src/transport/plugin_transport_udp.c:3721
-#: src/transport/plugin_transport_xu.c:2143
 msgid "Disabling IPv4 since it is not supported on this system!\n"
 msgstr ""
 
@@ -7519,19 +7483,15 @@ msgstr ""
 
 #: src/transport/plugin_transport_udp.c:3883
 #: src/transport/plugin_transport_udp.c:3897
-#: src/transport/plugin_transport_xu.c:2301
-#: src/transport/plugin_transport_xu.c:2315
 msgid "must be in [0,65535]"
 msgstr ""
 
 #: src/transport/plugin_transport_udp.c:3929
-#: src/transport/plugin_transport_xu.c:2347
 #, fuzzy
 msgid "must be valid IPv4 address"
 msgstr "`%s' non è un indirizzo IP valido.\n"
 
 #: src/transport/plugin_transport_udp.c:3956
-#: src/transport/plugin_transport_xu.c:2374
 #, fuzzy
 msgid "must be valid IPv6 address"
 msgstr "`%s' non è un indirizzo IP valido.\n"
@@ -7609,51 +7569,6 @@ msgstr ""
 msgid "# sessions allocated"
 msgstr ""
 
-#: src/transport/plugin_transport_xt.c:4010
-#, c-format
-msgid "XT transport listening on port %llu\n"
-msgstr ""
-
-#: src/transport/plugin_transport_xt.c:4014
-msgid "XT transport not listening on any port (client only)\n"
-msgstr ""
-
-#: src/transport/plugin_transport_xt.c:4018
-#, c-format
-msgid "XT transport advertises itself as being on port %llu\n"
-msgstr ""
-
-#: src/transport/plugin_transport_xt.c:4022
-msgid "# XT sessions active"
-msgstr ""
-
-#: src/transport/plugin_transport_xu.c:1237
-#, c-format
-msgid ""
-"XU could not transmit message to `%s': Network seems down, please check your "
-"network configuration\n"
-msgstr ""
-
-#: src/transport/plugin_transport_xu.c:1251
-msgid ""
-"XU could not transmit IPv6 message! Please check your network configuration "
-"and disable IPv6 if your connection does not have a global IPv6 address\n"
-msgstr ""
-
-#: src/transport/plugin_transport_xu.c:2125
-#: src/transport/plugin_transport_xu.c:2224
-#, c-format
-msgid "Failed to bind XU socket to %s: %s\n"
-msgstr ""
-
-#: src/transport/plugin_transport_xu.c:2234
-msgid "Failed to open XU sockets\n"
-msgstr ""
-
-#: src/transport/plugin_transport_xu.c:2398
-msgid "Failed to create XU network sockets\n"
-msgstr ""
-
 #: src/transport/tcp_connection_legacy.c:452
 #, c-format
 msgid "Access denied to `%s'\n"
@@ -7664,17 +7579,17 @@ msgstr ""
 msgid "Accepting connection from `%s': %p\n"
 msgstr ""
 
-#: src/transport/tcp_server_legacy.c:474 src/util/service.c:1666
+#: src/transport/tcp_server_legacy.c:474 src/util/service.c:1630
 #, c-format
 msgid "`%s' failed for port %d (%s).\n"
 msgstr ""
 
-#: src/transport/tcp_server_legacy.c:484 src/util/service.c:1676
+#: src/transport/tcp_server_legacy.c:484 src/util/service.c:1640
 #, c-format
 msgid "`%s' failed for port %d (%s): address already in use\n"
 msgstr ""
 
-#: src/transport/tcp_server_legacy.c:490 src/util/service.c:1682
+#: src/transport/tcp_server_legacy.c:490 src/util/service.c:1646
 #, c-format
 msgid "`%s' failed for `%s': address already in use\n"
 msgstr ""
@@ -7706,17 +7621,17 @@ msgstr ""
 msgid "Could not parse IPv6 network specification `%s' for `%s:%s'\n"
 msgstr ""
 
-#: src/transport/tcp_service_legacy.c:904 src/util/service.c:1597
+#: src/transport/tcp_service_legacy.c:904 src/util/service.c:1561
 msgid "Could not access a pre-bound socket, will try to bind myself\n"
 msgstr ""
 
 #: src/transport/tcp_service_legacy.c:953
-#: src/transport/tcp_service_legacy.c:971 src/util/service.c:1750
+#: src/transport/tcp_service_legacy.c:971 src/util/service.c:1714
 #, c-format
 msgid "Specified value for `%s' of service `%s' is invalid\n"
 msgstr ""
 
-#: src/transport/tcp_service_legacy.c:996 src/util/service.c:1783
+#: src/transport/tcp_service_legacy.c:996 src/util/service.c:1747
 #, c-format
 msgid "Could not access pre-bound socket %u, will try to bind myself\n"
 msgstr ""
@@ -7731,44 +7646,44 @@ msgstr ""
 msgid "Service `%s' runs at %s\n"
 msgstr ""
 
-#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:2057
+#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:2021
 msgid "Service process failed to initialize\n"
 msgstr ""
 
-#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:2061
+#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:2025
 msgid "Service process could not initialize server function\n"
 msgstr ""
 
-#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:2065
+#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:2029
 msgid "Service process failed to report status\n"
 msgstr ""
 
 #: src/transport/tcp_service_legacy.c:1313 src/util/disk.c:1535
-#: src/util/service.c:1935
+#: src/util/service.c:1899
 #, c-format
 msgid "Cannot obtain information about user `%s': %s\n"
 msgstr ""
 
-#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1937
+#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1901
 msgid "No such user"
 msgstr ""
 
-#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1956
+#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1920
 #, c-format
 msgid "Cannot change user/group to `%s': %s\n"
 msgstr ""
 
-#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:2318
+#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:2282
 msgid "do daemonize (detach from terminal)"
 msgstr ""
 
-#: src/transport/tcp_service_legacy.c:1448 src/util/service.c:2382
-#: src/util/service.c:2397
+#: src/transport/tcp_service_legacy.c:1448 src/util/service.c:2346
+#: src/util/service.c:2361
 #, c-format
 msgid "Malformed configuration file `%s', exit ...\n"
 msgstr ""
 
-#: src/transport/tcp_service_legacy.c:1458 src/util/service.c:2409
+#: src/transport/tcp_service_legacy.c:1458 src/util/service.c:2373
 msgid "Malformed configuration, exit ...\n"
 msgstr ""
 
@@ -7810,11 +7725,11 @@ msgstr ""
 msgid "Metadata `%s' failed to deserialize"
 msgstr ""
 
-#: src/util/client.c:734
+#: src/util/client.c:749
 msgid "not a valid filename"
 msgstr ""
 
-#: src/util/client.c:925
+#: src/util/client.c:941
 #, c-format
 msgid "Need a non-empty hostname for service `%s'.\n"
 msgstr ""
@@ -8098,7 +8013,7 @@ msgstr ""
 msgid "print this help"
 msgstr ""
 
-#: src/util/getopt_helpers.c:282
+#: src/util/getopt_helpers.c:282 src/util/gnunet-qr.c:300
 msgid "be verbose"
 msgstr ""
 
@@ -8145,51 +8060,51 @@ msgstr ""
 msgid "Argument `%s' malformed. Expected base32 (Crockford) encoded value.\n"
 msgstr ""
 
-#: src/util/gnunet-config.c:160
+#: src/util/gnunet-config.c:161
 #, c-format
 msgid "failed to load configuration defaults"
 msgstr ""
 
-#: src/util/gnunet-config.c:173
+#: src/util/gnunet-config.c:174
 #, c-format
 msgid "%s or %s argument is required\n"
 msgstr ""
 
-#: src/util/gnunet-config.c:181
+#: src/util/gnunet-config.c:182
 #, c-format
 msgid "The following sections are available:\n"
 msgstr ""
 
-#: src/util/gnunet-config.c:232
+#: src/util/gnunet-config.c:234
 #, c-format
 msgid "--option argument required to set value\n"
 msgstr ""
 
-#: src/util/gnunet-config.c:286
-msgid "obtain option of value as a filename (with $-expansion)"
+#: src/util/gnunet-config.c:288
+msgid "interpret option value as a filename (with $-expansion)"
 msgstr ""
 
-#: src/util/gnunet-config.c:291
+#: src/util/gnunet-config.c:293
 msgid "name of the section to access"
 msgstr ""
 
-#: src/util/gnunet-config.c:296
+#: src/util/gnunet-config.c:298
 msgid "name of the option to access"
 msgstr ""
 
-#: src/util/gnunet-config.c:301
+#: src/util/gnunet-config.c:303
 msgid "value to set"
 msgstr ""
 
-#: src/util/gnunet-config.c:305
+#: src/util/gnunet-config.c:307
 msgid "print available configuration sections"
 msgstr ""
 
-#: src/util/gnunet-config.c:309
+#: src/util/gnunet-config.c:311
 msgid "write configuration file that only contains delta to defaults"
 msgstr ""
 
-#: src/util/gnunet-config.c:322
+#: src/util/gnunet-config.c:324
 msgid "Manipulate GNUnet configuration files"
 msgstr ""
 
@@ -8282,6 +8197,33 @@ msgstr ""
 msgid "Manipulate GNUnet private ECC key files"
 msgstr ""
 
+#: src/util/gnunet-qr.c:108 src/util/gnunet-uri.c:91
+#, c-format
+msgid "Invalid URI: does not start with `%s'\n"
+msgstr ""
+
+#: src/util/gnunet-qr.c:116 src/util/gnunet-uri.c:98
+#, c-format
+msgid "Invalid URI: fails to specify subsystem\n"
+msgstr ""
+
+#: src/util/gnunet-qr.c:127 src/util/gnunet-uri.c:108
+#, c-format
+msgid "No handler known for subsystem `%s'\n"
+msgstr ""
+
+#: src/util/gnunet-qr.c:297
+msgid "use video-device DEVICE (default: /dev/video0"
+msgstr ""
+
+#: src/util/gnunet-qr.c:303
+msgid "do not show preview windows"
+msgstr ""
+
+#: src/util/gnunet-qr.c:311
+msgid "Scan a QR code using a video device and import the uri read"
+msgstr ""
+
 #: src/util/gnunet-resolver.c:168
 msgid "perform a reverse lookup"
 msgstr ""
@@ -8324,21 +8266,6 @@ msgstr ""
 msgid "No URI specified on command line\n"
 msgstr ""
 
-#: src/util/gnunet-uri.c:91
-#, c-format
-msgid "Invalid URI: does not start with `%s'\n"
-msgstr ""
-
-#: src/util/gnunet-uri.c:98
-#, c-format
-msgid "Invalid URI: fails to specify subsystem\n"
-msgstr ""
-
-#: src/util/gnunet-uri.c:108
-#, c-format
-msgid "No handler known for subsystem `%s'\n"
-msgstr ""
-
 #: src/util/gnunet-uri.c:170
 msgid "Perform default-actions for GNUnet URIs"
 msgstr ""
@@ -8358,12 +8285,12 @@ msgstr ""
 msgid "Error writing to `%s': %s\n"
 msgstr ""
 
-#: src/util/network.c:136
+#: src/util/network.c:176
 #, c-format
 msgid "Unable to shorten unix path `%s' while keeping name unique\n"
 msgstr ""
 
-#: src/util/network.c:1794 src/util/network.c:1978
+#: src/util/network.c:1835 src/util/network.c:2019
 #, c-format
 msgid ""
 "Fatal internal logic error, process hangs in `%s' (abort with CTRL-C)!\n"
@@ -8474,7 +8401,7 @@ msgid ""
 "`GNUNET_SERVICE_client_continue' after %s\n"
 msgstr ""
 
-#: src/util/service.c:1862
+#: src/util/service.c:1826
 msgid ""
 "Could not bind to any of the ports I was supposed to, refusing to run!\n"
 msgstr ""

+ 169 - 229
po/sv.po

@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: GNUnet 0.7.0b\n"
 "Report-Msgid-Bugs-To: gnunet-developers@mail.gnu.org\n"
-"POT-Creation-Date: 2019-02-28 11:41+0100\n"
+"POT-Creation-Date: 2019-04-04 12:39+0200\n"
 "PO-Revision-Date: 2006-01-21 17:16+0100\n"
 "Last-Translator: Daniel Nylander <po@danielnylander.se>\n"
 "Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
@@ -227,8 +227,7 @@ msgid "Control services and the Automated Restart Manager (ARM)"
 msgstr ""
 
 #: src/arm/gnunet-service-arm.c:388 src/transport/plugin_transport_tcp.c:1120
-#: src/transport/plugin_transport_xt.c:1120
-#: src/transport/tcp_service_legacy.c:557 src/util/service.c:1167
+#: src/transport/tcp_service_legacy.c:557
 #, c-format
 msgid ""
 "Disabling IPv6 support for service `%s', failed to create IPv6 socket: %s\n"
@@ -238,35 +237,29 @@ msgstr ""
 #: src/transport/plugin_transport_tcp.c:1139
 #: src/transport/plugin_transport_tcp.c:1145
 #: src/transport/plugin_transport_tcp.c:3835
-#: src/transport/plugin_transport_xt.c:1139
-#: src/transport/plugin_transport_xt.c:1145
-#: src/transport/plugin_transport_xt.c:3833
 #: src/transport/tcp_service_legacy.c:576
-#: src/transport/tcp_service_legacy.c:582 src/util/service.c:1192
-#: src/util/service.c:1198
+#: src/transport/tcp_service_legacy.c:582 src/util/service.c:1156
+#: src/util/service.c:1162
 #, c-format
 msgid "Require valid port number for service `%s' in configuration!\n"
 msgstr ""
 
 #: src/arm/gnunet-service-arm.c:457 src/transport/plugin_transport_tcp.c:1176
-#: src/transport/plugin_transport_xt.c:1176
-#: src/transport/tcp_service_legacy.c:613 src/util/client.c:506
-#: src/util/service.c:1237
+#: src/transport/tcp_service_legacy.c:613 src/util/client.c:521
+#: src/util/service.c:1201
 #, c-format
 msgid "UNIXPATH `%s' too long, maximum length is %llu\n"
 msgstr ""
 
 #: src/arm/gnunet-service-arm.c:462 src/transport/plugin_transport_tcp.c:1180
-#: src/transport/plugin_transport_xt.c:1180
-#: src/transport/tcp_service_legacy.c:617 src/util/client.c:511
-#: src/util/service.c:1242
+#: src/transport/tcp_service_legacy.c:617 src/util/client.c:526
+#: src/util/service.c:1206
 #, fuzzy, c-format
 msgid "Using `%s' instead\n"
 msgstr "%s: flagga \"%s\" är tvetydig\n"
 
 #: src/arm/gnunet-service-arm.c:495 src/transport/plugin_transport_tcp.c:1211
-#: src/transport/plugin_transport_xt.c:1211
-#: src/transport/tcp_service_legacy.c:648 src/util/service.c:1278
+#: src/transport/tcp_service_legacy.c:648 src/util/service.c:1242
 #, c-format
 msgid ""
 "Disabling UNIX domain socket support for service `%s', failed to create UNIX "
@@ -274,8 +267,7 @@ msgid ""
 msgstr ""
 
 #: src/arm/gnunet-service-arm.c:517 src/transport/plugin_transport_tcp.c:1228
-#: src/transport/plugin_transport_xt.c:1228
-#: src/transport/tcp_service_legacy.c:665 src/util/service.c:1296
+#: src/transport/tcp_service_legacy.c:665 src/util/service.c:1260
 #, c-format
 msgid "Have neither PORT nor UNIXPATH for service `%s', but one is required\n"
 msgstr ""
@@ -283,8 +275,7 @@ msgstr ""
 #: src/arm/gnunet-service-arm.c:556
 #: src/transport/plugin_transport_http_server.c:2688
 #: src/transport/plugin_transport_tcp.c:1259
-#: src/transport/plugin_transport_xt.c:1259
-#: src/transport/tcp_service_legacy.c:696 src/util/service.c:1337
+#: src/transport/tcp_service_legacy.c:696 src/util/service.c:1301
 #, fuzzy, c-format
 msgid "Failed to resolve `%s': %s\n"
 msgstr "Misslyckades att leverera \"%s\" meddelande.\n"
@@ -292,8 +283,7 @@ msgstr "Misslyckades att leverera \"%s\" meddelande.\n"
 #: src/arm/gnunet-service-arm.c:575
 #: src/transport/plugin_transport_http_server.c:2706
 #: src/transport/plugin_transport_tcp.c:1278
-#: src/transport/plugin_transport_xt.c:1278
-#: src/transport/tcp_service_legacy.c:715 src/util/service.c:1357
+#: src/transport/tcp_service_legacy.c:715 src/util/service.c:1321
 #, fuzzy, c-format
 msgid "Failed to find %saddress for `%s'.\n"
 msgstr "Misslyckades att binda till UDP-port %d.\n"
@@ -1632,6 +1622,11 @@ msgstr "Misslyckades att ansluta till gnunetd.\n"
 msgid "Unable to parse ATTR record string `%s'\n"
 msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
 
+#: src/credential/plugin_rest_credential.c:1128
+#, fuzzy
+msgid "GNS REST API initialized\n"
+msgstr " Anslutning misslyckades\n"
+
 #: src/datacache/datacache.c:119 src/datacache/datacache.c:311
 #: src/datastore/gnunet-service-datastore.c:757
 #, fuzzy
@@ -2142,7 +2137,7 @@ msgstr ""
 msgid "Exiting as the number of peers is %u\n"
 msgstr "Maximalt antal chattklienter uppnått.\n"
 
-#: src/dht/gnunet_dht_profiler.c:949 src/rps/gnunet-rps-profiler.c:2959
+#: src/dht/gnunet_dht_profiler.c:949 src/rps/gnunet-rps-profiler.c:2981
 #, fuzzy
 msgid "number of peers to start"
 msgstr "antal iterationer"
@@ -3256,11 +3251,11 @@ msgstr "Du måste ange en och endast en fil att avindexera.\n"
 msgid "set the desired LEVEL of sender-anonymity"
 msgstr ""
 
-#: src/fs/gnunet-auto-share.c:772 src/fs/gnunet-publish.c:907
+#: src/fs/gnunet-auto-share.c:772
 msgid "disable adding the creation time to the metadata of the uploaded file"
 msgstr ""
 
-#: src/fs/gnunet-auto-share.c:777 src/fs/gnunet-publish.c:912
+#: src/fs/gnunet-auto-share.c:777 src/fs/gnunet-publish.c:907
 msgid "do not use libextractor to add keywords or metadata"
 msgstr ""
 
@@ -3567,6 +3562,10 @@ msgstr "Kommando \"%s\" kräver ett argument (\"%s\").\n"
 msgid "Option `%s' makes no sense without option `%s'.\n"
 msgstr ""
 
+#: src/fs/gnunet-publish.c:911
+msgid "enable adding the creation time to the metadata of the uploaded file"
+msgstr ""
+
 #: src/fs/gnunet-publish.c:916
 msgid ""
 "print list of extracted keywords that would be used, but do not perform "
@@ -4064,40 +4063,40 @@ msgstr ""
 msgid "GNUnet HTTP server to create business cards"
 msgstr ""
 
-#: src/gns/gnunet-dns2gns.c:203
+#: src/gns/gnunet-dns2gns.c:214
 #, fuzzy
 msgid "Failed to pack DNS response into UDP packet!\n"
 msgstr "Misslyckades att skicka HTTP-begäran till värd \"%s\": %s\n"
 
-#: src/gns/gnunet-dns2gns.c:405
+#: src/gns/gnunet-dns2gns.c:416
 #, fuzzy, c-format
 msgid "Cannot parse DNS request from %s\n"
 msgstr "Misslyckades att skicka HTTP-begäran till värd \"%s\": %s\n"
 
-#: src/gns/gnunet-dns2gns.c:421
+#: src/gns/gnunet-dns2gns.c:432
 #, fuzzy, c-format
 msgid "Received malformed DNS request from %s\n"
 msgstr "Mottog ogiltig \"%s\" begäran (storlek %d)\n"
 
-#: src/gns/gnunet-dns2gns.c:429
+#: src/gns/gnunet-dns2gns.c:440
 #, fuzzy, c-format
 msgid "Received unsupported DNS request from %s\n"
 msgstr "Mottog okänd typ av begäran %d vid %s:%d\n"
 
-#: src/gns/gnunet-dns2gns.c:588
+#: src/gns/gnunet-dns2gns.c:600
 #, fuzzy
 msgid "No DNS server specified!\n"
 msgstr "Inga nyckelord angivna!\n"
 
-#: src/gns/gnunet-dns2gns.c:688
+#: src/gns/gnunet-dns2gns.c:748
 msgid "IP of recursive DNS resolver to use (required)"
 msgstr ""
 
-#: src/gns/gnunet-dns2gns.c:693
+#: src/gns/gnunet-dns2gns.c:753
 msgid "UDP port to listen on for inbound DNS requests; default: 2853"
 msgstr ""
 
-#: src/gns/gnunet-dns2gns.c:710
+#: src/gns/gnunet-dns2gns.c:770
 msgid "GNUnet DNS-to-GNS proxy (a DNS server)"
 msgstr ""
 
@@ -4170,104 +4169,104 @@ msgstr ""
 msgid "%s failed at %s:%d: `%s'\n"
 msgstr "\"%s\" misslyckades vid %s:%d med fel: \"%s\".\n"
 
-#: src/gns/gnunet-gns-proxy.c:980
+#: src/gns/gnunet-gns-proxy.c:989
 #, fuzzy, c-format
 msgid "Unsupported CURL TLS backend %d\n"
 msgstr "Kommando \"%s\" stöds ej.  Avbryter.\n"
 
-#: src/gns/gnunet-gns-proxy.c:1005
+#: src/gns/gnunet-gns-proxy.c:1014
 #, fuzzy, c-format
 msgid "Failed to fetch CN from cert: %s\n"
 msgstr "Misslyckades att skicka HTTP-begäran till värd \"%s\": %s\n"
 
-#: src/gns/gnunet-gns-proxy.c:1026
+#: src/gns/gnunet-gns-proxy.c:1035
 #, fuzzy, c-format
 msgid "Failed to initialize DANE: %s\n"
 msgstr "Kunde inte initiera SQLite.\n"
 
-#: src/gns/gnunet-gns-proxy.c:1041
+#: src/gns/gnunet-gns-proxy.c:1050
 #, fuzzy, c-format
 msgid "Failed to parse DANE record: %s\n"
 msgstr "Misslyckades att skicka HTTP-begäran till värd \"%s\": %s\n"
 
-#: src/gns/gnunet-gns-proxy.c:1056
+#: src/gns/gnunet-gns-proxy.c:1065
 #, fuzzy, c-format
 msgid "Failed to verify TLS connection using DANE: %s\n"
 msgstr "Kunde inte spara konfigurationsfil \"%s\":"
 
-#: src/gns/gnunet-gns-proxy.c:1066
+#: src/gns/gnunet-gns-proxy.c:1075
 #, c-format
 msgid "Failed DANE verification failed with GnuTLS verify status code: %u\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:1090
+#: src/gns/gnunet-gns-proxy.c:1099
 #, c-format
 msgid "TLS certificate subject name (%s) does not match `%s': %d\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:1221
+#: src/gns/gnunet-gns-proxy.c:1230
 #, c-format
 msgid "Cookie domain `%s' supplied by server is invalid\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:2122
+#: src/gns/gnunet-gns-proxy.c:2131
 #, fuzzy, c-format
 msgid "Unsupported HTTP method `%s'\n"
 msgstr "Kommando \"%s\" stöds ej.  Avbryter.\n"
 
-#: src/gns/gnunet-gns-proxy.c:2643
+#: src/gns/gnunet-gns-proxy.c:2652
 #, fuzzy, c-format
 msgid "Unable to import private key from file `%s'\n"
 msgstr "Kunde inte skapa användarkonto:"
 
-#: src/gns/gnunet-gns-proxy.c:2675
+#: src/gns/gnunet-gns-proxy.c:2684
 #, fuzzy, c-format
 msgid "Unable to import certificate from `%s'\n"
 msgstr "Kunde inte spara konfigurationsfil \"%s\":"
 
-#: src/gns/gnunet-gns-proxy.c:2876
+#: src/gns/gnunet-gns-proxy.c:2885
 #, fuzzy, c-format
 msgid "Failed to start HTTPS server for `%s'\n"
 msgstr "Misslyckades att starta samling.\n"
 
-#: src/gns/gnunet-gns-proxy.c:2898 src/rest/gnunet-rest-server.c:658
+#: src/gns/gnunet-gns-proxy.c:2907 src/rest/gnunet-rest-server.c:668
 #, fuzzy
 msgid "Failed to pass client to MHD\n"
 msgstr "Misslyckades att ansluta till gnunetd.\n"
 
-#: src/gns/gnunet-gns-proxy.c:3234
+#: src/gns/gnunet-gns-proxy.c:3243
 #, fuzzy, c-format
 msgid "Unsupported socks version %d\n"
 msgstr "Kommando \"%s\" stöds ej.  Avbryter.\n"
 
-#: src/gns/gnunet-gns-proxy.c:3263
+#: src/gns/gnunet-gns-proxy.c:3272
 #, fuzzy, c-format
 msgid "Unsupported socks command %d\n"
 msgstr "Kommando \"%s\" stöds ej.  Avbryter.\n"
 
-#: src/gns/gnunet-gns-proxy.c:3346
+#: src/gns/gnunet-gns-proxy.c:3355
 #, fuzzy, c-format
 msgid "Unsupported socks address type %d\n"
 msgstr "Kommando \"%s\" stöds ej.  Avbryter.\n"
 
-#: src/gns/gnunet-gns-proxy.c:3636
+#: src/gns/gnunet-gns-proxy.c:3693
 #, fuzzy, c-format
 msgid "Failed to load X.509 key and certificate from `%s'\n"
 msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
 
-#: src/gns/gnunet-gns-proxy.c:3764
+#: src/gns/gnunet-gns-proxy.c:3821
 msgid "listen on specified port (default: 7777)"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:3769
+#: src/gns/gnunet-gns-proxy.c:3826
 msgid "pem file to use as CA"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:3773
+#: src/gns/gnunet-gns-proxy.c:3830
 msgid "disable use of IPv6"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:3799
+#: src/gns/gnunet-gns-proxy.c:3856
 msgid "GNUnet GNS proxy"
 msgstr ""
 
@@ -4376,6 +4375,11 @@ msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
 msgid "Unable to parse BOX record string `%s'\n"
 msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
 
+#: src/gns/plugin_rest_gns.c:452
+#, fuzzy
+msgid "Gns REST API initialized\n"
+msgstr " Anslutning misslyckades\n"
+
 #: src/gnsrecord/plugin_gnsrecord_dns.c:359
 #, fuzzy, c-format
 msgid "Unable to parse IPv4 address `%s'\n"
@@ -4893,6 +4897,11 @@ msgstr "Kunde inte spara konfigurationsfil \"%s\":"
 msgid "Failed to create directory `%s' for storing egos\n"
 msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
 
+#: src/identity/plugin_rest_identity.c:1297
+#, fuzzy
+msgid "Identity REST API initialized\n"
+msgstr " Anslutning misslyckades\n"
+
 #: src/json/json.c:123
 #, fuzzy, c-format
 msgid "Failed to parse JSON in option `%s': %s (%s)\n"
@@ -5296,6 +5305,11 @@ msgstr ""
 msgid "heap file database running\n"
 msgstr ""
 
+#: src/namestore/plugin_rest_namestore.c:1079
+#, fuzzy
+msgid "Namestore REST API initialized\n"
+msgstr " Anslutning misslyckades\n"
+
 #: src/nat-auto/gnunet-nat-auto.c:193
 #, fuzzy
 msgid "Suggested configuration changes:\n"
@@ -5684,7 +5698,7 @@ msgid "\tExpires: %s \t %s\n"
 msgstr ""
 
 #: src/peerinfo-tool/gnunet-peerinfo.c:299
-#: src/rest-plugins/plugin_rest_peerinfo.c:501
+#: src/peerinfo-tool/plugin_rest_peerinfo.c:501
 #, fuzzy, c-format
 msgid "Failure: Cannot convert address to string for peer `%s'\n"
 msgstr "Misslyckades att binda till UDP-port %d.\n"
@@ -5764,6 +5778,11 @@ msgstr "Testar transport(er) %s\n"
 msgid "Failed to load transport plugin for `%s'\n"
 msgstr "Kunde inte slå upp \"%s\": %s\n"
 
+#: src/peerinfo-tool/plugin_rest_peerinfo.c:796
+#, fuzzy
+msgid "Peerinfo REST API initialized\n"
+msgstr " Anslutning misslyckades\n"
+
 #: src/peerstore/gnunet-peerstore.c:91
 msgid "peerstore"
 msgstr ""
@@ -5930,6 +5949,12 @@ msgstr ""
 msgid "Expiration interval of the attribute"
 msgstr ""
 
+#: src/reclaim/plugin_rest_openid_connect.c:2279
+#: src/reclaim/plugin_rest_reclaim.c:1079
+#, fuzzy
+msgid "Identity Provider REST API initialized\n"
+msgstr " Anslutning misslyckades\n"
+
 #: src/reclaim/reclaim_api.c:436
 #, fuzzy
 msgid "failed to store record\n"
@@ -6025,51 +6050,20 @@ msgstr "\"%s\" är inte en fil.\n"
 msgid "Search string `%s' is too long!\n"
 msgstr "\"%s\" är inte en fil.\n"
 
-#: src/rest/gnunet-rest-server.c:927
+#: src/rest/gnunet-rest-server.c:986
 msgid "listen on specified port (default: 7776)"
 msgstr ""
 
-#: src/rest/gnunet-rest-server.c:944
+#: src/rest/gnunet-rest-server.c:1003
 #, fuzzy
 msgid "GNUnet REST server"
 msgstr "Spåra GNUnets nätverkstopologi."
 
-#: src/rest-plugins/plugin_rest_copying.c:209
+#: src/rest/plugin_rest_copying.c:209
 #, fuzzy
 msgid "COPYING REST API initialized\n"
 msgstr " Anslutning misslyckades\n"
 
-#: src/rest-plugins/plugin_rest_credential.c:1128
-#, fuzzy
-msgid "GNS REST API initialized\n"
-msgstr " Anslutning misslyckades\n"
-
-#: src/rest-plugins/plugin_rest_gns.c:452
-#, fuzzy
-msgid "Gns REST API initialized\n"
-msgstr " Anslutning misslyckades\n"
-
-#: src/rest-plugins/plugin_rest_identity.c:1297
-#, fuzzy
-msgid "Identity REST API initialized\n"
-msgstr " Anslutning misslyckades\n"
-
-#: src/rest-plugins/plugin_rest_namestore.c:1079
-#, fuzzy
-msgid "Namestore REST API initialized\n"
-msgstr " Anslutning misslyckades\n"
-
-#: src/rest-plugins/plugin_rest_openid_connect.c:2279
-#: src/rest-plugins/plugin_rest_reclaim.c:1079
-#, fuzzy
-msgid "Identity Provider REST API initialized\n"
-msgstr " Anslutning misslyckades\n"
-
-#: src/rest-plugins/plugin_rest_peerinfo.c:796
-#, fuzzy
-msgid "Peerinfo REST API initialized\n"
-msgstr " Anslutning misslyckades\n"
-
 #: src/revocation/gnunet-revocation.c:129
 #, fuzzy, c-format
 msgid "Key `%s' is valid\n"
@@ -6220,21 +6214,21 @@ msgstr ""
 msgid "Get peers from biased stream"
 msgstr ""
 
-#: src/rps/gnunet-rps-profiler.c:2964
+#: src/rps/gnunet-rps-profiler.c:2986
 msgid "duration of the profiling"
 msgstr ""
 
-#: src/rps/gnunet-rps-profiler.c:2969
+#: src/rps/gnunet-rps-profiler.c:2991
 #, fuzzy
 msgid "timeout for the profiling"
 msgstr "ange prioritet för innehållet"
 
-#: src/rps/gnunet-rps-profiler.c:2974
+#: src/rps/gnunet-rps-profiler.c:2996
 #, fuzzy
 msgid "number of PeerIDs to request"
 msgstr "antal iterationer"
 
-#: src/rps/gnunet-rps-profiler.c:2990
+#: src/rps/gnunet-rps-profiler.c:3012
 #, fuzzy
 msgid "Measure quality and performance of the RPS service."
 msgstr "Kan inte tillgå tjänsten"
@@ -6958,19 +6952,19 @@ msgstr "# krypterade PONG-meddelanden mottagna"
 msgid "GNUnet topology control"
 msgstr ""
 
-#: src/transport/gnunet-communicator-tcp.c:2329
-#: src/transport/gnunet-communicator-udp.c:2883
-#: src/transport/gnunet-service-tng.c:4747
+#: src/transport/gnunet-communicator-tcp.c:2328
+#: src/transport/gnunet-communicator-udp.c:2882
+#: src/transport/gnunet-service-tng.c:4888
 #: src/transport/gnunet-service-transport.c:2795
 #, fuzzy
 msgid "Transport service is lacking key configuration settings. Exiting.\n"
 msgstr "GNUnet-konfiguration"
 
-#: src/transport/gnunet-communicator-tcp.c:2393
+#: src/transport/gnunet-communicator-tcp.c:2392
 msgid "GNUnet TCP communicator"
 msgstr ""
 
-#: src/transport/gnunet-communicator-udp.c:2954
+#: src/transport/gnunet-communicator-udp.c:2953
 msgid "GNUnet UDP communicator"
 msgstr ""
 
@@ -7565,8 +7559,6 @@ msgstr "meddelandestorlek"
 #: src/transport/plugin_transport_http_server.c:3530
 #: src/transport/plugin_transport_tcp.c:3901
 #: src/transport/plugin_transport_tcp.c:3908
-#: src/transport/plugin_transport_xt.c:3899
-#: src/transport/plugin_transport_xt.c:3906
 msgid "TCP_STEALTH not supported on this platform.\n"
 msgstr ""
 
@@ -7638,7 +7630,6 @@ msgstr ""
 
 #: src/transport/plugin_transport_http_server.c:2905
 #: src/transport/plugin_transport_udp.c:3627
-#: src/transport/plugin_transport_xu.c:2049
 msgid "Disabling IPv6 since it is not supported on this system!\n"
 msgstr ""
 
@@ -7750,8 +7741,6 @@ msgstr "# byte kastade via TCP (utgående)"
 
 #: src/transport/plugin_transport_tcp.c:1557
 #: src/transport/plugin_transport_tcp.c:2883
-#: src/transport/plugin_transport_xt.c:1553
-#: src/transport/plugin_transport_xt.c:2879
 #, c-format
 msgid "Unexpected address length: %u bytes\n"
 msgstr ""
@@ -7760,9 +7749,6 @@ msgstr ""
 #: src/transport/plugin_transport_tcp.c:1964
 #: src/transport/plugin_transport_tcp.c:3147
 #: src/transport/plugin_transport_tcp.c:4024
-#: src/transport/plugin_transport_xt.c:1736
-#: src/transport/plugin_transport_xt.c:1960
-#: src/transport/plugin_transport_xt.c:3143
 #, fuzzy
 msgid "# TCP sessions active"
 msgstr "# sessionsnycklar accepterade"
@@ -7773,91 +7759,70 @@ msgstr "# sessionsnycklar accepterade"
 #: src/transport/plugin_transport_tcp.c:2143
 #: src/transport/plugin_transport_tcp.c:2243
 #: src/transport/plugin_transport_tcp.c:2268
-#: src/transport/plugin_transport_xt.c:1778
-#: src/transport/plugin_transport_xt.c:1942
-#: src/transport/plugin_transport_xt.c:2066
-#: src/transport/plugin_transport_xt.c:2139
-#: src/transport/plugin_transport_xt.c:2239
-#: src/transport/plugin_transport_xt.c:2264
 #, fuzzy
 msgid "# bytes currently in TCP buffers"
 msgstr "# byte skickades via TCP"
 
 #: src/transport/plugin_transport_tcp.c:1785
-#: src/transport/plugin_transport_xt.c:1781
 #, fuzzy
 msgid "# bytes discarded by TCP (disconnect)"
 msgstr "# byte kastade via TCP (utgående)"
 
 #: src/transport/plugin_transport_tcp.c:2073
-#: src/transport/plugin_transport_xt.c:2069
 #, fuzzy
 msgid "# bytes discarded by TCP (timeout)"
 msgstr "# byte kastade via TCP (utgående)"
 
 #: src/transport/plugin_transport_tcp.c:2147
-#: src/transport/plugin_transport_xt.c:2143
 #, fuzzy
 msgid "# bytes transmitted via TCP"
 msgstr "# byte skickade av typen %d"
 
 #: src/transport/plugin_transport_tcp.c:2545
-#: src/transport/plugin_transport_xt.c:2541
 msgid "# requests to create session with invalid address"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:2721
-#: src/transport/plugin_transport_xt.c:2717
 msgid "# transport-service disconnect requests for TCP"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:3213
-#: src/transport/plugin_transport_xt.c:3209
 #, fuzzy
 msgid "# TCP WELCOME messages received"
 msgstr "# krypterade PONG-meddelanden mottagna"
 
 #: src/transport/plugin_transport_tcp.c:3419
-#: src/transport/plugin_transport_xt.c:3415
 msgid "# bytes received via TCP"
 msgstr "# byte mottogs via TCP"
 
 #: src/transport/plugin_transport_tcp.c:3470
 #: src/transport/plugin_transport_tcp.c:3528
-#: src/transport/plugin_transport_xt.c:3466
-#: src/transport/plugin_transport_xt.c:3524
 #, fuzzy
 msgid "# TCP server connections active"
 msgstr "Nätverksanslutning"
 
 #: src/transport/plugin_transport_tcp.c:3474
-#: src/transport/plugin_transport_xt.c:3470
 #, fuzzy
 msgid "# TCP server connect events"
 msgstr "# av anslutna parter"
 
 #: src/transport/plugin_transport_tcp.c:3480
-#: src/transport/plugin_transport_xt.c:3476
 msgid "TCP connection limit reached, suspending server\n"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:3482
-#: src/transport/plugin_transport_xt.c:3478
 msgid "# TCP service suspended"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:3522
-#: src/transport/plugin_transport_xt.c:3518
 msgid "# TCP service resumed"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:3532
-#: src/transport/plugin_transport_xt.c:3528
 msgid "# network-level TCP disconnect events"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:3851
-#: src/transport/plugin_transport_xt.c:3849
 #, fuzzy
 msgid "Failed to start service.\n"
 msgstr "Misslyckades att starta samling.\n"
@@ -7911,7 +7876,6 @@ msgid "Failed to bind UDP socket to %s: %s\n"
 msgstr "Misslyckades att binda till UDP6-port %d.\n"
 
 #: src/transport/plugin_transport_udp.c:3721
-#: src/transport/plugin_transport_xu.c:2143
 msgid "Disabling IPv4 since it is not supported on this system!\n"
 msgstr ""
 
@@ -7922,19 +7886,15 @@ msgstr "Misslyckades att binda till UDP6-port %d.\n"
 
 #: src/transport/plugin_transport_udp.c:3883
 #: src/transport/plugin_transport_udp.c:3897
-#: src/transport/plugin_transport_xu.c:2301
-#: src/transport/plugin_transport_xu.c:2315
 msgid "must be in [0,65535]"
 msgstr ""
 
 #: src/transport/plugin_transport_udp.c:3929
-#: src/transport/plugin_transport_xu.c:2347
 #, fuzzy
 msgid "must be valid IPv4 address"
 msgstr "\"%s\" är inte tillgänglig."
 
 #: src/transport/plugin_transport_udp.c:3956
-#: src/transport/plugin_transport_xu.c:2374
 #, fuzzy
 msgid "must be valid IPv6 address"
 msgstr "\"%s\" är inte tillgänglig."
@@ -8021,54 +7981,6 @@ msgstr ""
 msgid "# sessions allocated"
 msgstr "# sessionsnycklar accepterade"
 
-#: src/transport/plugin_transport_xt.c:4010
-#, c-format
-msgid "XT transport listening on port %llu\n"
-msgstr ""
-
-#: src/transport/plugin_transport_xt.c:4014
-msgid "XT transport not listening on any port (client only)\n"
-msgstr ""
-
-#: src/transport/plugin_transport_xt.c:4018
-#, c-format
-msgid "XT transport advertises itself as being on port %llu\n"
-msgstr ""
-
-#: src/transport/plugin_transport_xt.c:4022
-#, fuzzy
-msgid "# XT sessions active"
-msgstr "# sessionsnycklar accepterade"
-
-#: src/transport/plugin_transport_xu.c:1237
-#, c-format
-msgid ""
-"XU could not transmit message to `%s': Network seems down, please check your "
-"network configuration\n"
-msgstr ""
-
-#: src/transport/plugin_transport_xu.c:1251
-msgid ""
-"XU could not transmit IPv6 message! Please check your network configuration "
-"and disable IPv6 if your connection does not have a global IPv6 address\n"
-msgstr ""
-
-#: src/transport/plugin_transport_xu.c:2125
-#: src/transport/plugin_transport_xu.c:2224
-#, fuzzy, c-format
-msgid "Failed to bind XU socket to %s: %s\n"
-msgstr "Misslyckades att binda till UDP6-port %d.\n"
-
-#: src/transport/plugin_transport_xu.c:2234
-#, fuzzy
-msgid "Failed to open XU sockets\n"
-msgstr "Misslyckades att binda till UDP6-port %d.\n"
-
-#: src/transport/plugin_transport_xu.c:2398
-#, fuzzy
-msgid "Failed to create XU network sockets\n"
-msgstr "Kunde inte skapa namnrymd \"%s\" (existerar?).\n"
-
 #: src/transport/tcp_connection_legacy.c:452
 #, fuzzy, c-format
 msgid "Access denied to `%s'\n"
@@ -8080,17 +7992,17 @@ msgid "Accepting connection from `%s': %p\n"
 msgstr ""
 
 # drive = hard drive ?
-#: src/transport/tcp_server_legacy.c:474 src/util/service.c:1666
+#: src/transport/tcp_server_legacy.c:474 src/util/service.c:1630
 #, fuzzy, c-format
 msgid "`%s' failed for port %d (%s).\n"
 msgstr "\"%s\" misslyckades för enhet %s: %u\n"
 
-#: src/transport/tcp_server_legacy.c:484 src/util/service.c:1676
+#: src/transport/tcp_server_legacy.c:484 src/util/service.c:1640
 #, fuzzy, c-format
 msgid "`%s' failed for port %d (%s): address already in use\n"
 msgstr "\"%s\" misslyckades för port %d: %s. Körs verkligen gnunetd?\n"
 
-#: src/transport/tcp_server_legacy.c:490 src/util/service.c:1682
+#: src/transport/tcp_server_legacy.c:490 src/util/service.c:1646
 #, fuzzy, c-format
 msgid "`%s' failed for `%s': address already in use\n"
 msgstr "\"%s\" misslyckades för port %d: %s. Körs verkligen gnunetd?\n"
@@ -8122,17 +8034,17 @@ msgstr ""
 msgid "Could not parse IPv6 network specification `%s' for `%s:%s'\n"
 msgstr ""
 
-#: src/transport/tcp_service_legacy.c:904 src/util/service.c:1597
+#: src/transport/tcp_service_legacy.c:904 src/util/service.c:1561
 msgid "Could not access a pre-bound socket, will try to bind myself\n"
 msgstr ""
 
 #: src/transport/tcp_service_legacy.c:953
-#: src/transport/tcp_service_legacy.c:971 src/util/service.c:1750
+#: src/transport/tcp_service_legacy.c:971 src/util/service.c:1714
 #, c-format
 msgid "Specified value for `%s' of service `%s' is invalid\n"
 msgstr ""
 
-#: src/transport/tcp_service_legacy.c:996 src/util/service.c:1783
+#: src/transport/tcp_service_legacy.c:996 src/util/service.c:1747
 #, c-format
 msgid "Could not access pre-bound socket %u, will try to bind myself\n"
 msgstr ""
@@ -8147,44 +8059,44 @@ msgstr "Fel vid %s:%d.\n"
 msgid "Service `%s' runs at %s\n"
 msgstr "Motpart \"%s\" med pålitlighet %8u och adress \"%s\"\n"
 
-#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:2057
+#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:2021
 msgid "Service process failed to initialize\n"
 msgstr ""
 
-#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:2061
+#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:2025
 msgid "Service process could not initialize server function\n"
 msgstr ""
 
-#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:2065
+#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:2029
 msgid "Service process failed to report status\n"
 msgstr ""
 
 #: src/transport/tcp_service_legacy.c:1313 src/util/disk.c:1535
-#: src/util/service.c:1935
+#: src/util/service.c:1899
 #, fuzzy, c-format
 msgid "Cannot obtain information about user `%s': %s\n"
 msgstr "Kan inte öppna konfigurationsfil \"%s\".\n"
 
-#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1937
+#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1901
 msgid "No such user"
 msgstr ""
 
-#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1956
+#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1920
 #, c-format
 msgid "Cannot change user/group to `%s': %s\n"
 msgstr "Kan inte ändra användare/grupp till \"%s\": %s\n"
 
-#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:2318
+#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:2282
 msgid "do daemonize (detach from terminal)"
 msgstr ""
 
-#: src/transport/tcp_service_legacy.c:1448 src/util/service.c:2382
-#: src/util/service.c:2397
+#: src/transport/tcp_service_legacy.c:1448 src/util/service.c:2346
+#: src/util/service.c:2361
 #, fuzzy, c-format
 msgid "Malformed configuration file `%s', exit ...\n"
 msgstr "Kunde inte spara konfigurationsfil \"%s\":"
 
-#: src/transport/tcp_service_legacy.c:1458 src/util/service.c:2409
+#: src/transport/tcp_service_legacy.c:1458 src/util/service.c:2373
 #, fuzzy
 msgid "Malformed configuration, exit ...\n"
 msgstr "Kunde inte spara konfigurationsfil \"%s\":"
@@ -8228,11 +8140,11 @@ msgstr ""
 msgid "Metadata `%s' failed to deserialize"
 msgstr ""
 
-#: src/util/client.c:734
+#: src/util/client.c:749
 msgid "not a valid filename"
 msgstr ""
 
-#: src/util/client.c:925
+#: src/util/client.c:941
 #, c-format
 msgid "Need a non-empty hostname for service `%s'.\n"
 msgstr ""
@@ -8521,7 +8433,7 @@ msgstr ""
 msgid "print this help"
 msgstr "skriv ut denna hjälp"
 
-#: src/util/getopt_helpers.c:282
+#: src/util/getopt_helpers.c:282 src/util/gnunet-qr.c:300
 msgid "be verbose"
 msgstr "var informativ"
 
@@ -8569,53 +8481,53 @@ msgstr "Du måste skicka med ett nummer till flaggan \"%s\".\n"
 msgid "Argument `%s' malformed. Expected base32 (Crockford) encoded value.\n"
 msgstr ""
 
-#: src/util/gnunet-config.c:160
+#: src/util/gnunet-config.c:161
 #, fuzzy, c-format
 msgid "failed to load configuration defaults"
 msgstr "Kunde inte spara konfigurationsfil \"%s\":"
 
-#: src/util/gnunet-config.c:173
+#: src/util/gnunet-config.c:174
 #, fuzzy, c-format
 msgid "%s or %s argument is required\n"
 msgstr "%s: flagga \"%s\" är tvetydig\n"
 
-#: src/util/gnunet-config.c:181
+#: src/util/gnunet-config.c:182
 #, c-format
 msgid "The following sections are available:\n"
 msgstr ""
 
-#: src/util/gnunet-config.c:232
+#: src/util/gnunet-config.c:234
 #, c-format
 msgid "--option argument required to set value\n"
 msgstr ""
 
-#: src/util/gnunet-config.c:286
-msgid "obtain option of value as a filename (with $-expansion)"
+#: src/util/gnunet-config.c:288
+msgid "interpret option value as a filename (with $-expansion)"
 msgstr ""
 
-#: src/util/gnunet-config.c:291
+#: src/util/gnunet-config.c:293
 msgid "name of the section to access"
 msgstr ""
 
-#: src/util/gnunet-config.c:296
+#: src/util/gnunet-config.c:298
 #, fuzzy
 msgid "name of the option to access"
 msgstr "Visa värde av alternativet"
 
-#: src/util/gnunet-config.c:301
+#: src/util/gnunet-config.c:303
 msgid "value to set"
 msgstr ""
 
-#: src/util/gnunet-config.c:305
+#: src/util/gnunet-config.c:307
 #, fuzzy
 msgid "print available configuration sections"
 msgstr "GNUnet-konfiguration"
 
-#: src/util/gnunet-config.c:309
+#: src/util/gnunet-config.c:311
 msgid "write configuration file that only contains delta to defaults"
 msgstr ""
 
-#: src/util/gnunet-config.c:322
+#: src/util/gnunet-config.c:324
 #, fuzzy
 msgid "Manipulate GNUnet configuration files"
 msgstr "skriv ut ett värde från konfigurationsfilen till standard ut"
@@ -8708,6 +8620,33 @@ msgstr ""
 msgid "Manipulate GNUnet private ECC key files"
 msgstr "skriv ut ett värde från konfigurationsfilen till standard ut"
 
+#: src/util/gnunet-qr.c:108 src/util/gnunet-uri.c:91
+#, fuzzy, c-format
+msgid "Invalid URI: does not start with `%s'\n"
+msgstr "Ogiltig nätverksnotation (slutar inte med \";\": \"%s\")\n"
+
+#: src/util/gnunet-qr.c:116 src/util/gnunet-uri.c:98
+#, c-format
+msgid "Invalid URI: fails to specify subsystem\n"
+msgstr ""
+
+#: src/util/gnunet-qr.c:127 src/util/gnunet-uri.c:108
+#, c-format
+msgid "No handler known for subsystem `%s'\n"
+msgstr ""
+
+#: src/util/gnunet-qr.c:297
+msgid "use video-device DEVICE (default: /dev/video0"
+msgstr ""
+
+#: src/util/gnunet-qr.c:303
+msgid "do not show preview windows"
+msgstr ""
+
+#: src/util/gnunet-qr.c:311
+msgid "Scan a QR code using a video device and import the uri read"
+msgstr ""
+
 #: src/util/gnunet-resolver.c:168
 msgid "perform a reverse lookup"
 msgstr ""
@@ -8751,21 +8690,6 @@ msgstr ""
 msgid "No URI specified on command line\n"
 msgstr ""
 
-#: src/util/gnunet-uri.c:91
-#, fuzzy, c-format
-msgid "Invalid URI: does not start with `%s'\n"
-msgstr "Ogiltig nätverksnotation (slutar inte med \";\": \"%s\")\n"
-
-#: src/util/gnunet-uri.c:98
-#, c-format
-msgid "Invalid URI: fails to specify subsystem\n"
-msgstr ""
-
-#: src/util/gnunet-uri.c:108
-#, c-format
-msgid "No handler known for subsystem `%s'\n"
-msgstr ""
-
 #: src/util/gnunet-uri.c:170
 msgid "Perform default-actions for GNUnet URIs"
 msgstr ""
@@ -8785,12 +8709,12 @@ msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
 msgid "Error writing to `%s': %s\n"
 msgstr "Fel vid skapandet av användare"
 
-#: src/util/network.c:136
+#: src/util/network.c:176
 #, c-format
 msgid "Unable to shorten unix path `%s' while keeping name unique\n"
 msgstr ""
 
-#: src/util/network.c:1794 src/util/network.c:1978
+#: src/util/network.c:1835 src/util/network.c:2019
 #, c-format
 msgid ""
 "Fatal internal logic error, process hangs in `%s' (abort with CTRL-C)!\n"
@@ -8906,7 +8830,7 @@ msgid ""
 "`GNUNET_SERVICE_client_continue' after %s\n"
 msgstr ""
 
-#: src/util/service.c:1862
+#: src/util/service.c:1826
 msgid ""
 "Could not bind to any of the ports I was supposed to, refusing to run!\n"
 msgstr ""
@@ -9258,6 +9182,22 @@ msgstr ""
 msgid "`%s' failed on file `%s' at %s:%d with error: %s\n"
 msgstr "\"%s\" misslyckades för fil \"%s\" vid %s:%d med fel: %s\n"
 
+#, fuzzy
+#~ msgid "# XT sessions active"
+#~ msgstr "# sessionsnycklar accepterade"
+
+#, fuzzy
+#~ msgid "Failed to bind XU socket to %s: %s\n"
+#~ msgstr "Misslyckades att binda till UDP6-port %d.\n"
+
+#, fuzzy
+#~ msgid "Failed to open XU sockets\n"
+#~ msgstr "Misslyckades att binda till UDP6-port %d.\n"
+
+#, fuzzy
+#~ msgid "Failed to create XU network sockets\n"
+#~ msgstr "Kunde inte skapa namnrymd \"%s\" (existerar?).\n"
+
 #, fuzzy
 #~ msgid "Print information about DV state"
 #~ msgstr "Skriv ut information om GNUnets motparter."

+ 170 - 229
po/vi.po

@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: gnunet 0.8.0a\n"
 "Report-Msgid-Bugs-To: gnunet-developers@mail.gnu.org\n"
-"POT-Creation-Date: 2019-02-28 11:41+0100\n"
+"POT-Creation-Date: 2019-04-04 12:39+0200\n"
 "PO-Revision-Date: 2008-09-10 22:05+0930\n"
 "Last-Translator: Clytie Siddall <clytie@riverland.net.au>\n"
 "Language-Team: Vietnamese <vi-VN@googlegroups.com>\n"
@@ -234,8 +234,7 @@ msgid "Control services and the Automated Restart Manager (ARM)"
 msgstr ""
 
 #: src/arm/gnunet-service-arm.c:388 src/transport/plugin_transport_tcp.c:1120
-#: src/transport/plugin_transport_xt.c:1120
-#: src/transport/tcp_service_legacy.c:557 src/util/service.c:1167
+#: src/transport/tcp_service_legacy.c:557
 #, c-format
 msgid ""
 "Disabling IPv6 support for service `%s', failed to create IPv6 socket: %s\n"
@@ -245,35 +244,29 @@ msgstr ""
 #: src/transport/plugin_transport_tcp.c:1139
 #: src/transport/plugin_transport_tcp.c:1145
 #: src/transport/plugin_transport_tcp.c:3835
-#: src/transport/plugin_transport_xt.c:1139
-#: src/transport/plugin_transport_xt.c:1145
-#: src/transport/plugin_transport_xt.c:3833
 #: src/transport/tcp_service_legacy.c:576
-#: src/transport/tcp_service_legacy.c:582 src/util/service.c:1192
-#: src/util/service.c:1198
+#: src/transport/tcp_service_legacy.c:582 src/util/service.c:1156
+#: src/util/service.c:1162
 #, c-format
 msgid "Require valid port number for service `%s' in configuration!\n"
 msgstr ""
 
 #: src/arm/gnunet-service-arm.c:457 src/transport/plugin_transport_tcp.c:1176
-#: src/transport/plugin_transport_xt.c:1176
-#: src/transport/tcp_service_legacy.c:613 src/util/client.c:506
-#: src/util/service.c:1237
+#: src/transport/tcp_service_legacy.c:613 src/util/client.c:521
+#: src/util/service.c:1201
 #, c-format
 msgid "UNIXPATH `%s' too long, maximum length is %llu\n"
 msgstr ""
 
 #: src/arm/gnunet-service-arm.c:462 src/transport/plugin_transport_tcp.c:1180
-#: src/transport/plugin_transport_xt.c:1180
-#: src/transport/tcp_service_legacy.c:617 src/util/client.c:511
-#: src/util/service.c:1242
+#: src/transport/tcp_service_legacy.c:617 src/util/client.c:526
+#: src/util/service.c:1206
 #, fuzzy, c-format
 msgid "Using `%s' instead\n"
 msgstr "%s: tùy chọn « %s » là mơ hồ\n"
 
 #: src/arm/gnunet-service-arm.c:495 src/transport/plugin_transport_tcp.c:1211
-#: src/transport/plugin_transport_xt.c:1211
-#: src/transport/tcp_service_legacy.c:648 src/util/service.c:1278
+#: src/transport/tcp_service_legacy.c:648 src/util/service.c:1242
 #, c-format
 msgid ""
 "Disabling UNIX domain socket support for service `%s', failed to create UNIX "
@@ -281,8 +274,7 @@ msgid ""
 msgstr ""
 
 #: src/arm/gnunet-service-arm.c:517 src/transport/plugin_transport_tcp.c:1228
-#: src/transport/plugin_transport_xt.c:1228
-#: src/transport/tcp_service_legacy.c:665 src/util/service.c:1296
+#: src/transport/tcp_service_legacy.c:665 src/util/service.c:1260
 #, c-format
 msgid "Have neither PORT nor UNIXPATH for service `%s', but one is required\n"
 msgstr ""
@@ -290,8 +282,7 @@ msgstr ""
 #: src/arm/gnunet-service-arm.c:556
 #: src/transport/plugin_transport_http_server.c:2688
 #: src/transport/plugin_transport_tcp.c:1259
-#: src/transport/plugin_transport_xt.c:1259
-#: src/transport/tcp_service_legacy.c:696 src/util/service.c:1337
+#: src/transport/tcp_service_legacy.c:696 src/util/service.c:1301
 #, fuzzy, c-format
 msgid "Failed to resolve `%s': %s\n"
 msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n"
@@ -299,8 +290,7 @@ msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n"
 #: src/arm/gnunet-service-arm.c:575
 #: src/transport/plugin_transport_http_server.c:2706
 #: src/transport/plugin_transport_tcp.c:1278
-#: src/transport/plugin_transport_xt.c:1278
-#: src/transport/tcp_service_legacy.c:715 src/util/service.c:1357
+#: src/transport/tcp_service_legacy.c:715 src/util/service.c:1321
 #, fuzzy, c-format
 msgid "Failed to find %saddress for `%s'.\n"
 msgstr "Lỗi đóng kết đến cổng %s %d.\n"
@@ -1641,6 +1631,11 @@ msgstr "Không kết nối được đến trình nền gnunetd."
 msgid "Unable to parse ATTR record string `%s'\n"
 msgstr "Lỗi đọc danh sách bạn bè từ « %s »\n"
 
+#: src/credential/plugin_rest_credential.c:1128
+#, fuzzy
+msgid "GNS REST API initialized\n"
+msgstr "Lỗi sơ khởi lõi.\n"
+
 #: src/datacache/datacache.c:119 src/datacache/datacache.c:311
 #: src/datastore/gnunet-service-datastore.c:757
 #, fuzzy
@@ -2164,7 +2159,7 @@ msgstr ""
 msgid "Exiting as the number of peers is %u\n"
 msgstr "tăng sổ tối đa các kết nối TCP/IP"
 
-#: src/dht/gnunet_dht_profiler.c:949 src/rps/gnunet-rps-profiler.c:2959
+#: src/dht/gnunet_dht_profiler.c:949 src/rps/gnunet-rps-profiler.c:2981
 #, fuzzy
 msgid "number of peers to start"
 msgstr "số lần lặp lại"
@@ -3275,11 +3270,11 @@ msgstr "Phải ghi rõ chỉ một tên tập tin để chèn.\n"
 msgid "set the desired LEVEL of sender-anonymity"
 msgstr "đặt CẤP mong muốn của tình trạng nặc danh của người gửi"
 
-#: src/fs/gnunet-auto-share.c:772 src/fs/gnunet-publish.c:907
+#: src/fs/gnunet-auto-share.c:772
 msgid "disable adding the creation time to the metadata of the uploaded file"
 msgstr "tắt thêm giờ tạo vào siêu dữ liệu của tập tin đã tải lên"
 
-#: src/fs/gnunet-auto-share.c:777 src/fs/gnunet-publish.c:912
+#: src/fs/gnunet-auto-share.c:777 src/fs/gnunet-publish.c:907
 msgid "do not use libextractor to add keywords or metadata"
 msgstr ""
 
@@ -3589,6 +3584,11 @@ msgstr "Tùy chọn « %s » cần thiết khi dùng tùy chọn « %s ».\n"
 msgid "Option `%s' makes no sense without option `%s'.\n"
 msgstr "Tùy chọn « %s » không có nghĩa khi không có tùy chọn « %s ».\n"
 
+#: src/fs/gnunet-publish.c:911
+#, fuzzy
+msgid "enable adding the creation time to the metadata of the uploaded file"
+msgstr "tắt thêm giờ tạo vào siêu dữ liệu của tập tin đã tải lên"
+
 #: src/fs/gnunet-publish.c:916
 msgid ""
 "print list of extracted keywords that would be used, but do not perform "
@@ -4110,40 +4110,40 @@ msgstr ""
 msgid "GNUnet HTTP server to create business cards"
 msgstr ""
 
-#: src/gns/gnunet-dns2gns.c:203
+#: src/gns/gnunet-dns2gns.c:214
 #, fuzzy
 msgid "Failed to pack DNS response into UDP packet!\n"
 msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n"
 
-#: src/gns/gnunet-dns2gns.c:405
+#: src/gns/gnunet-dns2gns.c:416
 #, c-format
 msgid "Cannot parse DNS request from %s\n"
 msgstr ""
 
-#: src/gns/gnunet-dns2gns.c:421
+#: src/gns/gnunet-dns2gns.c:432
 #, fuzzy, c-format
 msgid "Received malformed DNS request from %s\n"
 msgstr "Nhận yêu cầu định tuyến\n"
 
-#: src/gns/gnunet-dns2gns.c:429
+#: src/gns/gnunet-dns2gns.c:440
 #, fuzzy, c-format
 msgid "Received unsupported DNS request from %s\n"
 msgstr "Nhận yêu cầu định tuyến\n"
 
-#: src/gns/gnunet-dns2gns.c:588
+#: src/gns/gnunet-dns2gns.c:600
 #, fuzzy
 msgid "No DNS server specified!\n"
 msgstr "Chưa ghi rõ từ khoá.\n"
 
-#: src/gns/gnunet-dns2gns.c:688
+#: src/gns/gnunet-dns2gns.c:748
 msgid "IP of recursive DNS resolver to use (required)"
 msgstr ""
 
-#: src/gns/gnunet-dns2gns.c:693
+#: src/gns/gnunet-dns2gns.c:753
 msgid "UDP port to listen on for inbound DNS requests; default: 2853"
 msgstr ""
 
-#: src/gns/gnunet-dns2gns.c:710
+#: src/gns/gnunet-dns2gns.c:770
 msgid "GNUnet DNS-to-GNS proxy (a DNS server)"
 msgstr ""
 
@@ -4216,104 +4216,104 @@ msgstr ""
 msgid "%s failed at %s:%d: `%s'\n"
 msgstr "%s bị lỗi tại %s:%d: « %s »\n"
 
-#: src/gns/gnunet-gns-proxy.c:980
+#: src/gns/gnunet-gns-proxy.c:989
 #, fuzzy, c-format
 msgid "Unsupported CURL TLS backend %d\n"
 msgstr "Lệnh không được hỗ trợ « %s ». Đang hủy bỏ.\n"
 
-#: src/gns/gnunet-gns-proxy.c:1005
+#: src/gns/gnunet-gns-proxy.c:1014
 #, fuzzy, c-format
 msgid "Failed to fetch CN from cert: %s\n"
 msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n"
 
-#: src/gns/gnunet-gns-proxy.c:1026
+#: src/gns/gnunet-gns-proxy.c:1035
 #, fuzzy, c-format
 msgid "Failed to initialize DANE: %s\n"
 msgstr "Không thể sơ khởi SQLite: %s.\n"
 
-#: src/gns/gnunet-gns-proxy.c:1041
+#: src/gns/gnunet-gns-proxy.c:1050
 #, fuzzy, c-format
 msgid "Failed to parse DANE record: %s\n"
 msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n"
 
-#: src/gns/gnunet-gns-proxy.c:1056
+#: src/gns/gnunet-gns-proxy.c:1065
 #, fuzzy, c-format
 msgid "Failed to verify TLS connection using DANE: %s\n"
 msgstr "Không thể lưu tập tin cấu hình « %s »:"
 
-#: src/gns/gnunet-gns-proxy.c:1066
+#: src/gns/gnunet-gns-proxy.c:1075
 #, c-format
 msgid "Failed DANE verification failed with GnuTLS verify status code: %u\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:1090
+#: src/gns/gnunet-gns-proxy.c:1099
 #, c-format
 msgid "TLS certificate subject name (%s) does not match `%s': %d\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:1221
+#: src/gns/gnunet-gns-proxy.c:1230
 #, c-format
 msgid "Cookie domain `%s' supplied by server is invalid\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:2122
+#: src/gns/gnunet-gns-proxy.c:2131
 #, fuzzy, c-format
 msgid "Unsupported HTTP method `%s'\n"
 msgstr "Lệnh không được hỗ trợ « %s ». Đang hủy bỏ.\n"
 
-#: src/gns/gnunet-gns-proxy.c:2643
+#: src/gns/gnunet-gns-proxy.c:2652
 #, fuzzy, c-format
 msgid "Unable to import private key from file `%s'\n"
 msgstr "Không thể tạo tài khoản người dùng:"
 
-#: src/gns/gnunet-gns-proxy.c:2675
+#: src/gns/gnunet-gns-proxy.c:2684
 #, fuzzy, c-format
 msgid "Unable to import certificate from `%s'\n"
 msgstr "Không thể lưu tập tin cấu hình « %s »:"
 
-#: src/gns/gnunet-gns-proxy.c:2876
+#: src/gns/gnunet-gns-proxy.c:2885
 #, fuzzy, c-format
 msgid "Failed to start HTTPS server for `%s'\n"
 msgstr "Lỗi bắt đầu thu thập.\n"
 
-#: src/gns/gnunet-gns-proxy.c:2898 src/rest/gnunet-rest-server.c:658
+#: src/gns/gnunet-gns-proxy.c:2907 src/rest/gnunet-rest-server.c:668
 #, fuzzy
 msgid "Failed to pass client to MHD\n"
 msgstr "Lỗi kết nối đến gnunetd.\n"
 
-#: src/gns/gnunet-gns-proxy.c:3234
+#: src/gns/gnunet-gns-proxy.c:3243
 #, fuzzy, c-format
 msgid "Unsupported socks version %d\n"
 msgstr "Lệnh không được hỗ trợ « %s ». Đang hủy bỏ.\n"
 
-#: src/gns/gnunet-gns-proxy.c:3263
+#: src/gns/gnunet-gns-proxy.c:3272
 #, fuzzy, c-format
 msgid "Unsupported socks command %d\n"
 msgstr "Lệnh không được hỗ trợ « %s ». Đang hủy bỏ.\n"
 
-#: src/gns/gnunet-gns-proxy.c:3346
+#: src/gns/gnunet-gns-proxy.c:3355
 #, fuzzy, c-format
 msgid "Unsupported socks address type %d\n"
 msgstr "Lệnh không được hỗ trợ « %s ». Đang hủy bỏ.\n"
 
-#: src/gns/gnunet-gns-proxy.c:3636
+#: src/gns/gnunet-gns-proxy.c:3693
 #, fuzzy, c-format
 msgid "Failed to load X.509 key and certificate from `%s'\n"
 msgstr "Lỗi đọc danh sách bạn bè từ « %s »\n"
 
-#: src/gns/gnunet-gns-proxy.c:3764
+#: src/gns/gnunet-gns-proxy.c:3821
 msgid "listen on specified port (default: 7777)"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:3769
+#: src/gns/gnunet-gns-proxy.c:3826
 msgid "pem file to use as CA"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:3773
+#: src/gns/gnunet-gns-proxy.c:3830
 msgid "disable use of IPv6"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:3799
+#: src/gns/gnunet-gns-proxy.c:3856
 msgid "GNUnet GNS proxy"
 msgstr ""
 
@@ -4423,6 +4423,11 @@ msgstr "Lỗi đọc danh sách bạn bè từ « %s »\n"
 msgid "Unable to parse BOX record string `%s'\n"
 msgstr "Lỗi đọc danh sách bạn bè từ « %s »\n"
 
+#: src/gns/plugin_rest_gns.c:452
+#, fuzzy
+msgid "Gns REST API initialized\n"
+msgstr "Lỗi sơ khởi lõi.\n"
+
 #: src/gnsrecord/plugin_gnsrecord_dns.c:359
 #, fuzzy, c-format
 msgid "Unable to parse IPv4 address `%s'\n"
@@ -4952,6 +4957,11 @@ msgstr "Không thể lưu tập tin cấu hình « %s »:"
 msgid "Failed to create directory `%s' for storing egos\n"
 msgstr "Lỗi đọc danh sách bạn bè từ « %s »\n"
 
+#: src/identity/plugin_rest_identity.c:1297
+#, fuzzy
+msgid "Identity REST API initialized\n"
+msgstr "Lỗi sơ khởi lõi.\n"
+
 #: src/json/json.c:123
 #, fuzzy, c-format
 msgid "Failed to parse JSON in option `%s': %s (%s)\n"
@@ -5350,6 +5360,11 @@ msgstr ""
 msgid "heap file database running\n"
 msgstr "kho dữ liệu sqlite"
 
+#: src/namestore/plugin_rest_namestore.c:1079
+#, fuzzy
+msgid "Namestore REST API initialized\n"
+msgstr "Lỗi sơ khởi lõi.\n"
+
 #: src/nat-auto/gnunet-nat-auto.c:193
 #, fuzzy
 msgid "Suggested configuration changes:\n"
@@ -5739,7 +5754,7 @@ msgid "\tExpires: %s \t %s\n"
 msgstr ""
 
 #: src/peerinfo-tool/gnunet-peerinfo.c:299
-#: src/rest-plugins/plugin_rest_peerinfo.c:501
+#: src/peerinfo-tool/plugin_rest_peerinfo.c:501
 #, fuzzy, c-format
 msgid "Failure: Cannot convert address to string for peer `%s'\n"
 msgstr "Lỗi đóng kết đến cổng %s %d.\n"
@@ -5820,6 +5835,11 @@ msgstr "Đang nạp các truyền tải « %s »\n"
 msgid "Failed to load transport plugin for `%s'\n"
 msgstr "Không thể nạp phần bổ sung truyền tải « %s »\n"
 
+#: src/peerinfo-tool/plugin_rest_peerinfo.c:796
+#, fuzzy
+msgid "Peerinfo REST API initialized\n"
+msgstr "Lỗi sơ khởi lõi.\n"
+
 #: src/peerstore/gnunet-peerstore.c:91
 msgid "peerstore"
 msgstr ""
@@ -5985,6 +6005,12 @@ msgstr ""
 msgid "Expiration interval of the attribute"
 msgstr ""
 
+#: src/reclaim/plugin_rest_openid_connect.c:2279
+#: src/reclaim/plugin_rest_reclaim.c:1079
+#, fuzzy
+msgid "Identity Provider REST API initialized\n"
+msgstr "Lỗi sơ khởi lõi.\n"
+
 #: src/reclaim/reclaim_api.c:436
 #, fuzzy
 msgid "failed to store record\n"
@@ -6079,51 +6105,20 @@ msgstr "« %s » không phải là một tập tin.\n"
 msgid "Search string `%s' is too long!\n"
 msgstr "« %s » không phải là một tập tin.\n"
 
-#: src/rest/gnunet-rest-server.c:927
+#: src/rest/gnunet-rest-server.c:986
 msgid "listen on specified port (default: 7776)"
 msgstr ""
 
-#: src/rest/gnunet-rest-server.c:944
+#: src/rest/gnunet-rest-server.c:1003
 #, fuzzy
 msgid "GNUnet REST server"
 msgstr "Bản ghi lỗi GNUnet"
 
-#: src/rest-plugins/plugin_rest_copying.c:209
+#: src/rest/plugin_rest_copying.c:209
 #, fuzzy
 msgid "COPYING REST API initialized\n"
 msgstr "Lỗi sơ khởi lõi.\n"
 
-#: src/rest-plugins/plugin_rest_credential.c:1128
-#, fuzzy
-msgid "GNS REST API initialized\n"
-msgstr "Lỗi sơ khởi lõi.\n"
-
-#: src/rest-plugins/plugin_rest_gns.c:452
-#, fuzzy
-msgid "Gns REST API initialized\n"
-msgstr "Lỗi sơ khởi lõi.\n"
-
-#: src/rest-plugins/plugin_rest_identity.c:1297
-#, fuzzy
-msgid "Identity REST API initialized\n"
-msgstr "Lỗi sơ khởi lõi.\n"
-
-#: src/rest-plugins/plugin_rest_namestore.c:1079
-#, fuzzy
-msgid "Namestore REST API initialized\n"
-msgstr "Lỗi sơ khởi lõi.\n"
-
-#: src/rest-plugins/plugin_rest_openid_connect.c:2279
-#: src/rest-plugins/plugin_rest_reclaim.c:1079
-#, fuzzy
-msgid "Identity Provider REST API initialized\n"
-msgstr "Lỗi sơ khởi lõi.\n"
-
-#: src/rest-plugins/plugin_rest_peerinfo.c:796
-#, fuzzy
-msgid "Peerinfo REST API initialized\n"
-msgstr "Lỗi sơ khởi lõi.\n"
-
 #: src/revocation/gnunet-revocation.c:129
 #, fuzzy, c-format
 msgid "Key `%s' is valid\n"
@@ -6274,21 +6269,21 @@ msgstr ""
 msgid "Get peers from biased stream"
 msgstr ""
 
-#: src/rps/gnunet-rps-profiler.c:2964
+#: src/rps/gnunet-rps-profiler.c:2986
 msgid "duration of the profiling"
 msgstr ""
 
-#: src/rps/gnunet-rps-profiler.c:2969
+#: src/rps/gnunet-rps-profiler.c:2991
 #, fuzzy
 msgid "timeout for the profiling"
 msgstr "xác định mức ưu tiên của nội dung"
 
-#: src/rps/gnunet-rps-profiler.c:2974
+#: src/rps/gnunet-rps-profiler.c:2996
 #, fuzzy
 msgid "number of PeerIDs to request"
 msgstr "số lần lặp lại"
 
-#: src/rps/gnunet-rps-profiler.c:2990
+#: src/rps/gnunet-rps-profiler.c:3012
 #, fuzzy
 msgid "Measure quality and performance of the RPS service."
 msgstr "Không thể truy cập đến dịch vụ"
@@ -7018,19 +7013,19 @@ msgstr "# các thông báo PONG đã mật mã được nhận"
 msgid "GNUnet topology control"
 msgstr ""
 
-#: src/transport/gnunet-communicator-tcp.c:2329
-#: src/transport/gnunet-communicator-udp.c:2883
-#: src/transport/gnunet-service-tng.c:4747
+#: src/transport/gnunet-communicator-tcp.c:2328
+#: src/transport/gnunet-communicator-udp.c:2882
+#: src/transport/gnunet-service-tng.c:4888
 #: src/transport/gnunet-service-transport.c:2795
 #, fuzzy
 msgid "Transport service is lacking key configuration settings. Exiting.\n"
 msgstr "Lưu cấu hình ngay bây giờ không?"
 
-#: src/transport/gnunet-communicator-tcp.c:2393
+#: src/transport/gnunet-communicator-tcp.c:2392
 msgid "GNUnet TCP communicator"
 msgstr ""
 
-#: src/transport/gnunet-communicator-udp.c:2954
+#: src/transport/gnunet-communicator-udp.c:2953
 msgid "GNUnet UDP communicator"
 msgstr ""
 
@@ -7629,8 +7624,6 @@ msgstr "kích cỡ tin nhắn"
 #: src/transport/plugin_transport_http_server.c:3530
 #: src/transport/plugin_transport_tcp.c:3901
 #: src/transport/plugin_transport_tcp.c:3908
-#: src/transport/plugin_transport_xt.c:3899
-#: src/transport/plugin_transport_xt.c:3906
 msgid "TCP_STEALTH not supported on this platform.\n"
 msgstr ""
 
@@ -7701,7 +7694,6 @@ msgstr ""
 
 #: src/transport/plugin_transport_http_server.c:2905
 #: src/transport/plugin_transport_udp.c:3627
-#: src/transport/plugin_transport_xu.c:2049
 msgid "Disabling IPv6 since it is not supported on this system!\n"
 msgstr ""
 
@@ -7805,8 +7797,6 @@ msgstr "# các byte loại đi bởi SMTP (đi ra)"
 
 #: src/transport/plugin_transport_tcp.c:1557
 #: src/transport/plugin_transport_tcp.c:2883
-#: src/transport/plugin_transport_xt.c:1553
-#: src/transport/plugin_transport_xt.c:2879
 #, fuzzy, c-format
 msgid "Unexpected address length: %u bytes\n"
 msgstr "Gặp sự kiện bất thường: %d\n"
@@ -7815,9 +7805,6 @@ msgstr "Gặp sự kiện bất thường: %d\n"
 #: src/transport/plugin_transport_tcp.c:1964
 #: src/transport/plugin_transport_tcp.c:3147
 #: src/transport/plugin_transport_tcp.c:4024
-#: src/transport/plugin_transport_xt.c:1736
-#: src/transport/plugin_transport_xt.c:1960
-#: src/transport/plugin_transport_xt.c:3143
 #, fuzzy
 msgid "# TCP sessions active"
 msgstr "# các khoá phiên chạy được chấp nhận"
@@ -7828,91 +7815,70 @@ msgstr "# các khoá phiên chạy được chấp nhận"
 #: src/transport/plugin_transport_tcp.c:2143
 #: src/transport/plugin_transport_tcp.c:2243
 #: src/transport/plugin_transport_tcp.c:2268
-#: src/transport/plugin_transport_xt.c:1778
-#: src/transport/plugin_transport_xt.c:1942
-#: src/transport/plugin_transport_xt.c:2066
-#: src/transport/plugin_transport_xt.c:2139
-#: src/transport/plugin_transport_xt.c:2239
-#: src/transport/plugin_transport_xt.c:2264
 #, fuzzy
 msgid "# bytes currently in TCP buffers"
 msgstr "# các byte đã gừi qua TCP"
 
 #: src/transport/plugin_transport_tcp.c:1785
-#: src/transport/plugin_transport_xt.c:1781
 #, fuzzy
 msgid "# bytes discarded by TCP (disconnect)"
 msgstr "# các byte loại đi bởi TCP (đi ra)"
 
 #: src/transport/plugin_transport_tcp.c:2073
-#: src/transport/plugin_transport_xt.c:2069
 #, fuzzy
 msgid "# bytes discarded by TCP (timeout)"
 msgstr "# các byte loại đi bởi TCP (đi ra)"
 
 #: src/transport/plugin_transport_tcp.c:2147
-#: src/transport/plugin_transport_xt.c:2143
 #, fuzzy
 msgid "# bytes transmitted via TCP"
 msgstr "# các byte được gửi"
 
 #: src/transport/plugin_transport_tcp.c:2545
-#: src/transport/plugin_transport_xt.c:2541
 msgid "# requests to create session with invalid address"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:2721
-#: src/transport/plugin_transport_xt.c:2717
 msgid "# transport-service disconnect requests for TCP"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:3213
-#: src/transport/plugin_transport_xt.c:3209
 #, fuzzy
 msgid "# TCP WELCOME messages received"
 msgstr "# các thông báo PONG đã mật mã được nhận"
 
 #: src/transport/plugin_transport_tcp.c:3419
-#: src/transport/plugin_transport_xt.c:3415
 msgid "# bytes received via TCP"
 msgstr "# các byte đã nhận qua TCP"
 
 #: src/transport/plugin_transport_tcp.c:3470
 #: src/transport/plugin_transport_tcp.c:3528
-#: src/transport/plugin_transport_xt.c:3466
-#: src/transport/plugin_transport_xt.c:3524
 #, fuzzy
 msgid "# TCP server connections active"
 msgstr "# các kết nối dht"
 
 #: src/transport/plugin_transport_tcp.c:3474
-#: src/transport/plugin_transport_xt.c:3470
 #, fuzzy
 msgid "# TCP server connect events"
 msgstr "# của các đồng đẳng đã kết nối"
 
 #: src/transport/plugin_transport_tcp.c:3480
-#: src/transport/plugin_transport_xt.c:3476
 msgid "TCP connection limit reached, suspending server\n"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:3482
-#: src/transport/plugin_transport_xt.c:3478
 msgid "# TCP service suspended"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:3522
-#: src/transport/plugin_transport_xt.c:3518
 msgid "# TCP service resumed"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:3532
-#: src/transport/plugin_transport_xt.c:3528
 msgid "# network-level TCP disconnect events"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:3851
-#: src/transport/plugin_transport_xt.c:3849
 #, fuzzy
 msgid "Failed to start service.\n"
 msgstr "Lỗi bắt đầu thu thập.\n"
@@ -7966,7 +7932,6 @@ msgid "Failed to bind UDP socket to %s: %s\n"
 msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n"
 
 #: src/transport/plugin_transport_udp.c:3721
-#: src/transport/plugin_transport_xu.c:2143
 msgid "Disabling IPv4 since it is not supported on this system!\n"
 msgstr ""
 
@@ -7977,19 +7942,15 @@ msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n"
 
 #: src/transport/plugin_transport_udp.c:3883
 #: src/transport/plugin_transport_udp.c:3897
-#: src/transport/plugin_transport_xu.c:2301
-#: src/transport/plugin_transport_xu.c:2315
 msgid "must be in [0,65535]"
 msgstr ""
 
 #: src/transport/plugin_transport_udp.c:3929
-#: src/transport/plugin_transport_xu.c:2347
 #, fuzzy
 msgid "must be valid IPv4 address"
 msgstr "« %s » không sẵn sàng.\n"
 
 #: src/transport/plugin_transport_udp.c:3956
-#: src/transport/plugin_transport_xu.c:2374
 #, fuzzy
 msgid "must be valid IPv6 address"
 msgstr "« %s » không sẵn sàng.\n"
@@ -8076,54 +8037,6 @@ msgstr ""
 msgid "# sessions allocated"
 msgstr "# các khoá phiên chạy được chấp nhận"
 
-#: src/transport/plugin_transport_xt.c:4010
-#, c-format
-msgid "XT transport listening on port %llu\n"
-msgstr ""
-
-#: src/transport/plugin_transport_xt.c:4014
-msgid "XT transport not listening on any port (client only)\n"
-msgstr ""
-
-#: src/transport/plugin_transport_xt.c:4018
-#, c-format
-msgid "XT transport advertises itself as being on port %llu\n"
-msgstr ""
-
-#: src/transport/plugin_transport_xt.c:4022
-#, fuzzy
-msgid "# XT sessions active"
-msgstr "# các khoá phiên chạy được chấp nhận"
-
-#: src/transport/plugin_transport_xu.c:1237
-#, c-format
-msgid ""
-"XU could not transmit message to `%s': Network seems down, please check your "
-"network configuration\n"
-msgstr ""
-
-#: src/transport/plugin_transport_xu.c:1251
-msgid ""
-"XU could not transmit IPv6 message! Please check your network configuration "
-"and disable IPv6 if your connection does not have a global IPv6 address\n"
-msgstr ""
-
-#: src/transport/plugin_transport_xu.c:2125
-#: src/transport/plugin_transport_xu.c:2224
-#, fuzzy, c-format
-msgid "Failed to bind XU socket to %s: %s\n"
-msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n"
-
-#: src/transport/plugin_transport_xu.c:2234
-#, fuzzy
-msgid "Failed to open XU sockets\n"
-msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n"
-
-#: src/transport/plugin_transport_xu.c:2398
-#, fuzzy
-msgid "Failed to create XU network sockets\n"
-msgstr "Không thể tạo miền tên.\n"
-
 #: src/transport/tcp_connection_legacy.c:452
 #, fuzzy, c-format
 msgid "Access denied to `%s'\n"
@@ -8134,17 +8047,17 @@ msgstr "Không đủ quyền cho « %s ».\n"
 msgid "Accepting connection from `%s': %p\n"
 msgstr ""
 
-#: src/transport/tcp_server_legacy.c:474 src/util/service.c:1666
+#: src/transport/tcp_server_legacy.c:474 src/util/service.c:1630
 #, fuzzy, c-format
 msgid "`%s' failed for port %d (%s).\n"
 msgstr "« %s » thất bại cho ổ đĩa « %s »: %u\n"
 
-#: src/transport/tcp_server_legacy.c:484 src/util/service.c:1676
+#: src/transport/tcp_server_legacy.c:484 src/util/service.c:1640
 #, fuzzy, c-format
 msgid "`%s' failed for port %d (%s): address already in use\n"
 msgstr "« %s » bị lỗi cho cổng %d. Trình gnunetd có chạy chưa?\n"
 
-#: src/transport/tcp_server_legacy.c:490 src/util/service.c:1682
+#: src/transport/tcp_server_legacy.c:490 src/util/service.c:1646
 #, fuzzy, c-format
 msgid "`%s' failed for `%s': address already in use\n"
 msgstr "« %s » bị lỗi cho cổng %d. Trình gnunetd có chạy chưa?\n"
@@ -8176,17 +8089,17 @@ msgstr ""
 msgid "Could not parse IPv6 network specification `%s' for `%s:%s'\n"
 msgstr ""
 
-#: src/transport/tcp_service_legacy.c:904 src/util/service.c:1597
+#: src/transport/tcp_service_legacy.c:904 src/util/service.c:1561
 msgid "Could not access a pre-bound socket, will try to bind myself\n"
 msgstr ""
 
 #: src/transport/tcp_service_legacy.c:953
-#: src/transport/tcp_service_legacy.c:971 src/util/service.c:1750
+#: src/transport/tcp_service_legacy.c:971 src/util/service.c:1714
 #, c-format
 msgid "Specified value for `%s' of service `%s' is invalid\n"
 msgstr ""
 
-#: src/transport/tcp_service_legacy.c:996 src/util/service.c:1783
+#: src/transport/tcp_service_legacy.c:996 src/util/service.c:1747
 #, c-format
 msgid "Could not access pre-bound socket %u, will try to bind myself\n"
 msgstr ""
@@ -8201,44 +8114,44 @@ msgstr "Lỗi chạy %s: %s %d\n"
 msgid "Service `%s' runs at %s\n"
 msgstr "Đồng đẳng « %s » có mức tin cậy %8u\n"
 
-#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:2057
+#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:2021
 msgid "Service process failed to initialize\n"
 msgstr ""
 
-#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:2061
+#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:2025
 msgid "Service process could not initialize server function\n"
 msgstr ""
 
-#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:2065
+#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:2029
 msgid "Service process failed to report status\n"
 msgstr ""
 
 #: src/transport/tcp_service_legacy.c:1313 src/util/disk.c:1535
-#: src/util/service.c:1935
+#: src/util/service.c:1899
 #, c-format
 msgid "Cannot obtain information about user `%s': %s\n"
 msgstr "Không thể lấy thông tin về người dùng « %s »: %s\n"
 
-#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1937
+#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1901
 msgid "No such user"
 msgstr "Không có người dùng như vậy"
 
-#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1956
+#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1920
 #, c-format
 msgid "Cannot change user/group to `%s': %s\n"
 msgstr "Không thể thay đổi người dùng/nhóm thành « %s »: %s\n"
 
-#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:2318
+#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:2282
 msgid "do daemonize (detach from terminal)"
 msgstr ""
 
-#: src/transport/tcp_service_legacy.c:1448 src/util/service.c:2382
-#: src/util/service.c:2397
+#: src/transport/tcp_service_legacy.c:1448 src/util/service.c:2346
+#: src/util/service.c:2361
 #, fuzzy, c-format
 msgid "Malformed configuration file `%s', exit ...\n"
 msgstr "Không thể lưu tập tin cấu hình « %s »:"
 
-#: src/transport/tcp_service_legacy.c:1458 src/util/service.c:2409
+#: src/transport/tcp_service_legacy.c:1458 src/util/service.c:2373
 #, fuzzy
 msgid "Malformed configuration, exit ...\n"
 msgstr "Không thể lưu tập tin cấu hình « %s »:"
@@ -8281,11 +8194,11 @@ msgstr ""
 msgid "Metadata `%s' failed to deserialize"
 msgstr ""
 
-#: src/util/client.c:734
+#: src/util/client.c:749
 msgid "not a valid filename"
 msgstr ""
 
-#: src/util/client.c:925
+#: src/util/client.c:941
 #, c-format
 msgid "Need a non-empty hostname for service `%s'.\n"
 msgstr ""
@@ -8579,7 +8492,7 @@ msgstr ""
 msgid "print this help"
 msgstr "hiển thị trợ giúp này"
 
-#: src/util/getopt_helpers.c:282
+#: src/util/getopt_helpers.c:282 src/util/gnunet-qr.c:300
 msgid "be verbose"
 msgstr "xuất chi tiết"
 
@@ -8628,52 +8541,52 @@ msgstr "Phải gửi một con số cho tùy chọn « %s ».\n"
 msgid "Argument `%s' malformed. Expected base32 (Crockford) encoded value.\n"
 msgstr ""
 
-#: src/util/gnunet-config.c:160
+#: src/util/gnunet-config.c:161
 #, fuzzy, c-format
 msgid "failed to load configuration defaults"
 msgstr "Không thể lưu tập tin cấu hình « %s »:"
 
-#: src/util/gnunet-config.c:173
+#: src/util/gnunet-config.c:174
 #, fuzzy, c-format
 msgid "%s or %s argument is required\n"
 msgstr "đặt tên hiệu cần dùng (cần thiết)"
 
-#: src/util/gnunet-config.c:181
+#: src/util/gnunet-config.c:182
 #, c-format
 msgid "The following sections are available:\n"
 msgstr ""
 
-#: src/util/gnunet-config.c:232
+#: src/util/gnunet-config.c:234
 #, c-format
 msgid "--option argument required to set value\n"
 msgstr ""
 
-#: src/util/gnunet-config.c:286
-msgid "obtain option of value as a filename (with $-expansion)"
+#: src/util/gnunet-config.c:288
+msgid "interpret option value as a filename (with $-expansion)"
 msgstr ""
 
-#: src/util/gnunet-config.c:291
+#: src/util/gnunet-config.c:293
 msgid "name of the section to access"
 msgstr ""
 
-#: src/util/gnunet-config.c:296
+#: src/util/gnunet-config.c:298
 msgid "name of the option to access"
 msgstr ""
 
-#: src/util/gnunet-config.c:301
+#: src/util/gnunet-config.c:303
 msgid "value to set"
 msgstr ""
 
-#: src/util/gnunet-config.c:305
+#: src/util/gnunet-config.c:307
 #, fuzzy
 msgid "print available configuration sections"
 msgstr "Lưu cấu hình ngay bây giờ không?"
 
-#: src/util/gnunet-config.c:309
+#: src/util/gnunet-config.c:311
 msgid "write configuration file that only contains delta to defaults"
 msgstr ""
 
-#: src/util/gnunet-config.c:322
+#: src/util/gnunet-config.c:324
 #, fuzzy
 msgid "Manipulate GNUnet configuration files"
 msgstr "cập nhật một giá trị trong tập tin cấu hình"
@@ -8766,6 +8679,33 @@ msgstr ""
 msgid "Manipulate GNUnet private ECC key files"
 msgstr "cập nhật một giá trị trong tập tin cấu hình"
 
+#: src/util/gnunet-qr.c:108 src/util/gnunet-uri.c:91
+#, fuzzy, c-format
+msgid "Invalid URI: does not start with `%s'\n"
+msgstr "Ký hiệu mạng sai (không kết thúc với « ; »: « %s »)\n"
+
+#: src/util/gnunet-qr.c:116 src/util/gnunet-uri.c:98
+#, c-format
+msgid "Invalid URI: fails to specify subsystem\n"
+msgstr ""
+
+#: src/util/gnunet-qr.c:127 src/util/gnunet-uri.c:108
+#, c-format
+msgid "No handler known for subsystem `%s'\n"
+msgstr ""
+
+#: src/util/gnunet-qr.c:297
+msgid "use video-device DEVICE (default: /dev/video0"
+msgstr ""
+
+#: src/util/gnunet-qr.c:303
+msgid "do not show preview windows"
+msgstr ""
+
+#: src/util/gnunet-qr.c:311
+msgid "Scan a QR code using a video device and import the uri read"
+msgstr ""
+
 #: src/util/gnunet-resolver.c:168
 msgid "perform a reverse lookup"
 msgstr ""
@@ -8809,21 +8749,6 @@ msgstr ""
 msgid "No URI specified on command line\n"
 msgstr ""
 
-#: src/util/gnunet-uri.c:91
-#, fuzzy, c-format
-msgid "Invalid URI: does not start with `%s'\n"
-msgstr "Ký hiệu mạng sai (không kết thúc với « ; »: « %s »)\n"
-
-#: src/util/gnunet-uri.c:98
-#, c-format
-msgid "Invalid URI: fails to specify subsystem\n"
-msgstr ""
-
-#: src/util/gnunet-uri.c:108
-#, c-format
-msgid "No handler known for subsystem `%s'\n"
-msgstr ""
-
 #: src/util/gnunet-uri.c:170
 msgid "Perform default-actions for GNUnet URIs"
 msgstr ""
@@ -8843,12 +8768,12 @@ msgstr "Lỗi đọc danh sách bạn bè từ « %s »\n"
 msgid "Error writing to `%s': %s\n"
 msgstr "Gặp lỗi khi tạo người dùng"
 
-#: src/util/network.c:136
+#: src/util/network.c:176
 #, c-format
 msgid "Unable to shorten unix path `%s' while keeping name unique\n"
 msgstr ""
 
-#: src/util/network.c:1794 src/util/network.c:1978
+#: src/util/network.c:1835 src/util/network.c:2019
 #, c-format
 msgid ""
 "Fatal internal logic error, process hangs in `%s' (abort with CTRL-C)!\n"
@@ -8961,7 +8886,7 @@ msgid ""
 "`GNUNET_SERVICE_client_continue' after %s\n"
 msgstr ""
 
-#: src/util/service.c:1862
+#: src/util/service.c:1826
 msgid ""
 "Could not bind to any of the ports I was supposed to, refusing to run!\n"
 msgstr ""
@@ -9314,6 +9239,22 @@ msgstr "Lỗi nội bộ : khẳng định không thành công tại %s:%d.\n"
 msgid "`%s' failed on file `%s' at %s:%d with error: %s\n"
 msgstr "« %s » thất bại ở tập tin « %s » tại %s:%d với lỗi: %s\n"
 
+#, fuzzy
+#~ msgid "# XT sessions active"
+#~ msgstr "# các khoá phiên chạy được chấp nhận"
+
+#, fuzzy
+#~ msgid "Failed to bind XU socket to %s: %s\n"
+#~ msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n"
+
+#, fuzzy
+#~ msgid "Failed to open XU sockets\n"
+#~ msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n"
+
+#, fuzzy
+#~ msgid "Failed to create XU network sockets\n"
+#~ msgstr "Không thể tạo miền tên.\n"
+
 #, fuzzy
 #~ msgid "Print information about DV state"
 #~ msgstr "In ra thông tin về các đồng đẳng GNUnet."

+ 165 - 225
po/zh_CN.po

@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: gnunet-0.8.1\n"
 "Report-Msgid-Bugs-To: gnunet-developers@mail.gnu.org\n"
-"POT-Creation-Date: 2019-02-28 11:41+0100\n"
+"POT-Creation-Date: 2019-04-04 12:39+0200\n"
 "PO-Revision-Date: 2011-07-09 12:12+0800\n"
 "Last-Translator: Wylmer Wang <wantinghard@gmail.com>\n"
 "Language-Team: Chinese (simplified) <i18n-zh@googlegroups.com>\n"
@@ -221,8 +221,7 @@ msgid "Control services and the Automated Restart Manager (ARM)"
 msgstr ""
 
 #: src/arm/gnunet-service-arm.c:388 src/transport/plugin_transport_tcp.c:1120
-#: src/transport/plugin_transport_xt.c:1120
-#: src/transport/tcp_service_legacy.c:557 src/util/service.c:1167
+#: src/transport/tcp_service_legacy.c:557
 #, c-format
 msgid ""
 "Disabling IPv6 support for service `%s', failed to create IPv6 socket: %s\n"
@@ -232,35 +231,29 @@ msgstr ""
 #: src/transport/plugin_transport_tcp.c:1139
 #: src/transport/plugin_transport_tcp.c:1145
 #: src/transport/plugin_transport_tcp.c:3835
-#: src/transport/plugin_transport_xt.c:1139
-#: src/transport/plugin_transport_xt.c:1145
-#: src/transport/plugin_transport_xt.c:3833
 #: src/transport/tcp_service_legacy.c:576
-#: src/transport/tcp_service_legacy.c:582 src/util/service.c:1192
-#: src/util/service.c:1198
+#: src/transport/tcp_service_legacy.c:582 src/util/service.c:1156
+#: src/util/service.c:1162
 #, c-format
 msgid "Require valid port number for service `%s' in configuration!\n"
 msgstr ""
 
 #: src/arm/gnunet-service-arm.c:457 src/transport/plugin_transport_tcp.c:1176
-#: src/transport/plugin_transport_xt.c:1176
-#: src/transport/tcp_service_legacy.c:613 src/util/client.c:506
-#: src/util/service.c:1237
+#: src/transport/tcp_service_legacy.c:613 src/util/client.c:521
+#: src/util/service.c:1201
 #, c-format
 msgid "UNIXPATH `%s' too long, maximum length is %llu\n"
 msgstr ""
 
 #: src/arm/gnunet-service-arm.c:462 src/transport/plugin_transport_tcp.c:1180
-#: src/transport/plugin_transport_xt.c:1180
-#: src/transport/tcp_service_legacy.c:617 src/util/client.c:511
-#: src/util/service.c:1242
+#: src/transport/tcp_service_legacy.c:617 src/util/client.c:526
+#: src/util/service.c:1206
 #, fuzzy, c-format
 msgid "Using `%s' instead\n"
 msgstr "%s:选项“%s”有歧义\n"
 
 #: src/arm/gnunet-service-arm.c:495 src/transport/plugin_transport_tcp.c:1211
-#: src/transport/plugin_transport_xt.c:1211
-#: src/transport/tcp_service_legacy.c:648 src/util/service.c:1278
+#: src/transport/tcp_service_legacy.c:648 src/util/service.c:1242
 #, c-format
 msgid ""
 "Disabling UNIX domain socket support for service `%s', failed to create UNIX "
@@ -268,8 +261,7 @@ msgid ""
 msgstr ""
 
 #: src/arm/gnunet-service-arm.c:517 src/transport/plugin_transport_tcp.c:1228
-#: src/transport/plugin_transport_xt.c:1228
-#: src/transport/tcp_service_legacy.c:665 src/util/service.c:1296
+#: src/transport/tcp_service_legacy.c:665 src/util/service.c:1260
 #, c-format
 msgid "Have neither PORT nor UNIXPATH for service `%s', but one is required\n"
 msgstr ""
@@ -277,8 +269,7 @@ msgstr ""
 #: src/arm/gnunet-service-arm.c:556
 #: src/transport/plugin_transport_http_server.c:2688
 #: src/transport/plugin_transport_tcp.c:1259
-#: src/transport/plugin_transport_xt.c:1259
-#: src/transport/tcp_service_legacy.c:696 src/util/service.c:1337
+#: src/transport/tcp_service_legacy.c:696 src/util/service.c:1301
 #, fuzzy, c-format
 msgid "Failed to resolve `%s': %s\n"
 msgstr "打开日志文件“%s”失败:%s\n"
@@ -286,8 +277,7 @@ msgstr "打开日志文件“%s”失败:%s\n"
 #: src/arm/gnunet-service-arm.c:575
 #: src/transport/plugin_transport_http_server.c:2706
 #: src/transport/plugin_transport_tcp.c:1278
-#: src/transport/plugin_transport_xt.c:1278
-#: src/transport/tcp_service_legacy.c:715 src/util/service.c:1357
+#: src/transport/tcp_service_legacy.c:715 src/util/service.c:1321
 #, fuzzy, c-format
 msgid "Failed to find %saddress for `%s'.\n"
 msgstr "找不到接口“%s”的一个 IP 地址。\n"
@@ -1587,6 +1577,10 @@ msgstr "初始化“%s”服务失败。\n"
 msgid "Unable to parse ATTR record string `%s'\n"
 msgstr "解析配置文件“%s”失败\n"
 
+#: src/credential/plugin_rest_credential.c:1128
+msgid "GNS REST API initialized\n"
+msgstr ""
+
 #: src/datacache/datacache.c:119 src/datacache/datacache.c:311
 #: src/datastore/gnunet-service-datastore.c:757
 msgid "# bytes stored"
@@ -2085,7 +2079,7 @@ msgstr ""
 msgid "Exiting as the number of peers is %u\n"
 msgstr "增加 TCP/IP 的最大连接数"
 
-#: src/dht/gnunet_dht_profiler.c:949 src/rps/gnunet-rps-profiler.c:2959
+#: src/dht/gnunet_dht_profiler.c:949 src/rps/gnunet-rps-profiler.c:2981
 #, fuzzy
 msgid "number of peers to start"
 msgstr "迭代次数"
@@ -3142,11 +3136,11 @@ msgstr ""
 msgid "set the desired LEVEL of sender-anonymity"
 msgstr ""
 
-#: src/fs/gnunet-auto-share.c:772 src/fs/gnunet-publish.c:907
+#: src/fs/gnunet-auto-share.c:772
 msgid "disable adding the creation time to the metadata of the uploaded file"
 msgstr ""
 
-#: src/fs/gnunet-auto-share.c:777 src/fs/gnunet-publish.c:912
+#: src/fs/gnunet-auto-share.c:777 src/fs/gnunet-publish.c:907
 msgid "do not use libextractor to add keywords or metadata"
 msgstr ""
 
@@ -3447,6 +3441,10 @@ msgstr ""
 msgid "Option `%s' makes no sense without option `%s'.\n"
 msgstr ""
 
+#: src/fs/gnunet-publish.c:911
+msgid "enable adding the creation time to the metadata of the uploaded file"
+msgstr ""
+
 #: src/fs/gnunet-publish.c:916
 msgid ""
 "print list of extracted keywords that would be used, but do not perform "
@@ -3918,39 +3916,39 @@ msgstr ""
 msgid "GNUnet HTTP server to create business cards"
 msgstr ""
 
-#: src/gns/gnunet-dns2gns.c:203
+#: src/gns/gnunet-dns2gns.c:214
 #, fuzzy
 msgid "Failed to pack DNS response into UDP packet!\n"
 msgstr "打开日志文件“%s”失败:%s\n"
 
-#: src/gns/gnunet-dns2gns.c:405
+#: src/gns/gnunet-dns2gns.c:416
 #, c-format
 msgid "Cannot parse DNS request from %s\n"
 msgstr ""
 
-#: src/gns/gnunet-dns2gns.c:421
+#: src/gns/gnunet-dns2gns.c:432
 #, c-format
 msgid "Received malformed DNS request from %s\n"
 msgstr ""
 
-#: src/gns/gnunet-dns2gns.c:429
+#: src/gns/gnunet-dns2gns.c:440
 #, c-format
 msgid "Received unsupported DNS request from %s\n"
 msgstr ""
 
-#: src/gns/gnunet-dns2gns.c:588
+#: src/gns/gnunet-dns2gns.c:600
 msgid "No DNS server specified!\n"
 msgstr ""
 
-#: src/gns/gnunet-dns2gns.c:688
+#: src/gns/gnunet-dns2gns.c:748
 msgid "IP of recursive DNS resolver to use (required)"
 msgstr ""
 
-#: src/gns/gnunet-dns2gns.c:693
+#: src/gns/gnunet-dns2gns.c:753
 msgid "UDP port to listen on for inbound DNS requests; default: 2853"
 msgstr ""
 
-#: src/gns/gnunet-dns2gns.c:710
+#: src/gns/gnunet-dns2gns.c:770
 msgid "GNUnet DNS-to-GNS proxy (a DNS server)"
 msgstr ""
 
@@ -4022,104 +4020,104 @@ msgstr ""
 msgid "%s failed at %s:%d: `%s'\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:980
+#: src/gns/gnunet-gns-proxy.c:989
 #, fuzzy, c-format
 msgid "Unsupported CURL TLS backend %d\n"
 msgstr "未知的命令“%s”。\n"
 
-#: src/gns/gnunet-gns-proxy.c:1005
+#: src/gns/gnunet-gns-proxy.c:1014
 #, fuzzy, c-format
 msgid "Failed to fetch CN from cert: %s\n"
 msgstr "打开日志文件“%s”失败:%s\n"
 
-#: src/gns/gnunet-gns-proxy.c:1026
+#: src/gns/gnunet-gns-proxy.c:1035
 #, fuzzy, c-format
 msgid "Failed to initialize DANE: %s\n"
 msgstr "无法初始化 SQLite:%s。\n"
 
-#: src/gns/gnunet-gns-proxy.c:1041
+#: src/gns/gnunet-gns-proxy.c:1050
 #, fuzzy, c-format
 msgid "Failed to parse DANE record: %s\n"
 msgstr "打开日志文件“%s”失败:%s\n"
 
-#: src/gns/gnunet-gns-proxy.c:1056
+#: src/gns/gnunet-gns-proxy.c:1065
 #, fuzzy, c-format
 msgid "Failed to verify TLS connection using DANE: %s\n"
 msgstr "解析配置文件“%s”失败\n"
 
-#: src/gns/gnunet-gns-proxy.c:1066
+#: src/gns/gnunet-gns-proxy.c:1075
 #, c-format
 msgid "Failed DANE verification failed with GnuTLS verify status code: %u\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:1090
+#: src/gns/gnunet-gns-proxy.c:1099
 #, c-format
 msgid "TLS certificate subject name (%s) does not match `%s': %d\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:1221
+#: src/gns/gnunet-gns-proxy.c:1230
 #, c-format
 msgid "Cookie domain `%s' supplied by server is invalid\n"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:2122
+#: src/gns/gnunet-gns-proxy.c:2131
 #, fuzzy, c-format
 msgid "Unsupported HTTP method `%s'\n"
 msgstr "未知的命令“%s”。\n"
 
-#: src/gns/gnunet-gns-proxy.c:2643
+#: src/gns/gnunet-gns-proxy.c:2652
 #, fuzzy, c-format
 msgid "Unable to import private key from file `%s'\n"
 msgstr "无法创建用户账户:"
 
-#: src/gns/gnunet-gns-proxy.c:2675
+#: src/gns/gnunet-gns-proxy.c:2684
 #, fuzzy, c-format
 msgid "Unable to import certificate from `%s'\n"
 msgstr "无法保存配置文件“%s”:"
 
-#: src/gns/gnunet-gns-proxy.c:2876
+#: src/gns/gnunet-gns-proxy.c:2885
 #, fuzzy, c-format
 msgid "Failed to start HTTPS server for `%s'\n"
 msgstr "初始化“%s”服务失败。\n"
 
-#: src/gns/gnunet-gns-proxy.c:2898 src/rest/gnunet-rest-server.c:658
+#: src/gns/gnunet-gns-proxy.c:2907 src/rest/gnunet-rest-server.c:668
 #, fuzzy
 msgid "Failed to pass client to MHD\n"
 msgstr "初始化“%s”服务失败。\n"
 
-#: src/gns/gnunet-gns-proxy.c:3234
+#: src/gns/gnunet-gns-proxy.c:3243
 #, fuzzy, c-format
 msgid "Unsupported socks version %d\n"
 msgstr "未知的命令“%s”。\n"
 
-#: src/gns/gnunet-gns-proxy.c:3263
+#: src/gns/gnunet-gns-proxy.c:3272
 #, fuzzy, c-format
 msgid "Unsupported socks command %d\n"
 msgstr "未知的命令“%s”。\n"
 
-#: src/gns/gnunet-gns-proxy.c:3346
+#: src/gns/gnunet-gns-proxy.c:3355
 #, fuzzy, c-format
 msgid "Unsupported socks address type %d\n"
 msgstr "未知的命令“%s”。\n"
 
-#: src/gns/gnunet-gns-proxy.c:3636
+#: src/gns/gnunet-gns-proxy.c:3693
 #, fuzzy, c-format
 msgid "Failed to load X.509 key and certificate from `%s'\n"
 msgstr "解析配置文件“%s”失败\n"
 
-#: src/gns/gnunet-gns-proxy.c:3764
+#: src/gns/gnunet-gns-proxy.c:3821
 msgid "listen on specified port (default: 7777)"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:3769
+#: src/gns/gnunet-gns-proxy.c:3826
 msgid "pem file to use as CA"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:3773
+#: src/gns/gnunet-gns-proxy.c:3830
 msgid "disable use of IPv6"
 msgstr ""
 
-#: src/gns/gnunet-gns-proxy.c:3799
+#: src/gns/gnunet-gns-proxy.c:3856
 msgid "GNUnet GNS proxy"
 msgstr ""
 
@@ -4228,6 +4226,10 @@ msgstr "解析配置文件“%s”失败\n"
 msgid "Unable to parse BOX record string `%s'\n"
 msgstr "解析配置文件“%s”失败\n"
 
+#: src/gns/plugin_rest_gns.c:452
+msgid "Gns REST API initialized\n"
+msgstr ""
+
 #: src/gnsrecord/plugin_gnsrecord_dns.c:359
 #, fuzzy, c-format
 msgid "Unable to parse IPv4 address `%s'\n"
@@ -4739,6 +4741,10 @@ msgstr "解析配置文件“%s”失败\n"
 msgid "Failed to create directory `%s' for storing egos\n"
 msgstr "解析配置文件“%s”失败\n"
 
+#: src/identity/plugin_rest_identity.c:1297
+msgid "Identity REST API initialized\n"
+msgstr ""
+
 #: src/json/json.c:123
 #, fuzzy, c-format
 msgid "Failed to parse JSON in option `%s': %s (%s)\n"
@@ -5136,6 +5142,10 @@ msgstr ""
 msgid "heap file database running\n"
 msgstr "sqlite 数据仓库"
 
+#: src/namestore/plugin_rest_namestore.c:1079
+msgid "Namestore REST API initialized\n"
+msgstr ""
+
 #: src/nat-auto/gnunet-nat-auto.c:193
 #, fuzzy
 msgid "Suggested configuration changes:\n"
@@ -5515,7 +5525,7 @@ msgid "\tExpires: %s \t %s\n"
 msgstr ""
 
 #: src/peerinfo-tool/gnunet-peerinfo.c:299
-#: src/rest-plugins/plugin_rest_peerinfo.c:501
+#: src/peerinfo-tool/plugin_rest_peerinfo.c:501
 #, fuzzy, c-format
 msgid "Failure: Cannot convert address to string for peer `%s'\n"
 msgstr "找不到接口“%s”的一个 IP 地址。\n"
@@ -5596,6 +5606,10 @@ msgstr ""
 msgid "Failed to load transport plugin for `%s'\n"
 msgstr "解析配置文件“%s”失败\n"
 
+#: src/peerinfo-tool/plugin_rest_peerinfo.c:796
+msgid "Peerinfo REST API initialized\n"
+msgstr ""
+
 #: src/peerstore/gnunet-peerstore.c:91
 msgid "peerstore"
 msgstr ""
@@ -5753,6 +5767,11 @@ msgstr ""
 msgid "Expiration interval of the attribute"
 msgstr ""
 
+#: src/reclaim/plugin_rest_openid_connect.c:2279
+#: src/reclaim/plugin_rest_reclaim.c:1079
+msgid "Identity Provider REST API initialized\n"
+msgstr ""
+
 #: src/reclaim/reclaim_api.c:436
 #, fuzzy
 msgid "failed to store record\n"
@@ -5846,44 +5865,19 @@ msgstr "服务已删除。\n"
 msgid "Search string `%s' is too long!\n"
 msgstr "服务已删除。\n"
 
-#: src/rest/gnunet-rest-server.c:927
+#: src/rest/gnunet-rest-server.c:986
 msgid "listen on specified port (default: 7776)"
 msgstr ""
 
-#: src/rest/gnunet-rest-server.c:944
+#: src/rest/gnunet-rest-server.c:1003
 #, fuzzy
 msgid "GNUnet REST server"
 msgstr "GNUnet 错误日志"
 
-#: src/rest-plugins/plugin_rest_copying.c:209
+#: src/rest/plugin_rest_copying.c:209
 msgid "COPYING REST API initialized\n"
 msgstr ""
 
-#: src/rest-plugins/plugin_rest_credential.c:1128
-msgid "GNS REST API initialized\n"
-msgstr ""
-
-#: src/rest-plugins/plugin_rest_gns.c:452
-msgid "Gns REST API initialized\n"
-msgstr ""
-
-#: src/rest-plugins/plugin_rest_identity.c:1297
-msgid "Identity REST API initialized\n"
-msgstr ""
-
-#: src/rest-plugins/plugin_rest_namestore.c:1079
-msgid "Namestore REST API initialized\n"
-msgstr ""
-
-#: src/rest-plugins/plugin_rest_openid_connect.c:2279
-#: src/rest-plugins/plugin_rest_reclaim.c:1079
-msgid "Identity Provider REST API initialized\n"
-msgstr ""
-
-#: src/rest-plugins/plugin_rest_peerinfo.c:796
-msgid "Peerinfo REST API initialized\n"
-msgstr ""
-
 #: src/revocation/gnunet-revocation.c:129
 #, c-format
 msgid "Key `%s' is valid\n"
@@ -6032,20 +6026,20 @@ msgstr ""
 msgid "Get peers from biased stream"
 msgstr ""
 
-#: src/rps/gnunet-rps-profiler.c:2964
+#: src/rps/gnunet-rps-profiler.c:2986
 msgid "duration of the profiling"
 msgstr ""
 
-#: src/rps/gnunet-rps-profiler.c:2969
+#: src/rps/gnunet-rps-profiler.c:2991
 msgid "timeout for the profiling"
 msgstr ""
 
-#: src/rps/gnunet-rps-profiler.c:2974
+#: src/rps/gnunet-rps-profiler.c:2996
 #, fuzzy
 msgid "number of PeerIDs to request"
 msgstr "迭代次数"
 
-#: src/rps/gnunet-rps-profiler.c:2990
+#: src/rps/gnunet-rps-profiler.c:3012
 #, fuzzy
 msgid "Measure quality and performance of the RPS service."
 msgstr "无法访问该服务"
@@ -6768,19 +6762,19 @@ msgstr ""
 msgid "GNUnet topology control"
 msgstr ""
 
-#: src/transport/gnunet-communicator-tcp.c:2329
-#: src/transport/gnunet-communicator-udp.c:2883
-#: src/transport/gnunet-service-tng.c:4747
+#: src/transport/gnunet-communicator-tcp.c:2328
+#: src/transport/gnunet-communicator-udp.c:2882
+#: src/transport/gnunet-service-tng.c:4888
 #: src/transport/gnunet-service-transport.c:2795
 #, fuzzy
 msgid "Transport service is lacking key configuration settings. Exiting.\n"
 msgstr "立即保存配置?"
 
-#: src/transport/gnunet-communicator-tcp.c:2393
+#: src/transport/gnunet-communicator-tcp.c:2392
 msgid "GNUnet TCP communicator"
 msgstr ""
 
-#: src/transport/gnunet-communicator-udp.c:2954
+#: src/transport/gnunet-communicator-udp.c:2953
 msgid "GNUnet UDP communicator"
 msgstr ""
 
@@ -7339,8 +7333,6 @@ msgstr "消息尺寸"
 #: src/transport/plugin_transport_http_server.c:3530
 #: src/transport/plugin_transport_tcp.c:3901
 #: src/transport/plugin_transport_tcp.c:3908
-#: src/transport/plugin_transport_xt.c:3899
-#: src/transport/plugin_transport_xt.c:3906
 msgid "TCP_STEALTH not supported on this platform.\n"
 msgstr ""
 
@@ -7411,7 +7403,6 @@ msgstr ""
 
 #: src/transport/plugin_transport_http_server.c:2905
 #: src/transport/plugin_transport_udp.c:3627
-#: src/transport/plugin_transport_xu.c:2049
 msgid "Disabling IPv6 since it is not supported on this system!\n"
 msgstr ""
 
@@ -7515,8 +7506,6 @@ msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:1557
 #: src/transport/plugin_transport_tcp.c:2883
-#: src/transport/plugin_transport_xt.c:1553
-#: src/transport/plugin_transport_xt.c:2879
 #, c-format
 msgid "Unexpected address length: %u bytes\n"
 msgstr ""
@@ -7525,9 +7514,6 @@ msgstr ""
 #: src/transport/plugin_transport_tcp.c:1964
 #: src/transport/plugin_transport_tcp.c:3147
 #: src/transport/plugin_transport_tcp.c:4024
-#: src/transport/plugin_transport_xt.c:1736
-#: src/transport/plugin_transport_xt.c:1960
-#: src/transport/plugin_transport_xt.c:3143
 msgid "# TCP sessions active"
 msgstr ""
 
@@ -7537,54 +7523,39 @@ msgstr ""
 #: src/transport/plugin_transport_tcp.c:2143
 #: src/transport/plugin_transport_tcp.c:2243
 #: src/transport/plugin_transport_tcp.c:2268
-#: src/transport/plugin_transport_xt.c:1778
-#: src/transport/plugin_transport_xt.c:1942
-#: src/transport/plugin_transport_xt.c:2066
-#: src/transport/plugin_transport_xt.c:2139
-#: src/transport/plugin_transport_xt.c:2239
-#: src/transport/plugin_transport_xt.c:2264
 msgid "# bytes currently in TCP buffers"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:1785
-#: src/transport/plugin_transport_xt.c:1781
 msgid "# bytes discarded by TCP (disconnect)"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:2073
-#: src/transport/plugin_transport_xt.c:2069
 msgid "# bytes discarded by TCP (timeout)"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:2147
-#: src/transport/plugin_transport_xt.c:2143
 msgid "# bytes transmitted via TCP"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:2545
-#: src/transport/plugin_transport_xt.c:2541
 msgid "# requests to create session with invalid address"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:2721
-#: src/transport/plugin_transport_xt.c:2717
 msgid "# transport-service disconnect requests for TCP"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:3213
-#: src/transport/plugin_transport_xt.c:3209
 msgid "# TCP WELCOME messages received"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:3419
-#: src/transport/plugin_transport_xt.c:3415
 msgid "# bytes received via TCP"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:3470
 #: src/transport/plugin_transport_tcp.c:3528
-#: src/transport/plugin_transport_xt.c:3466
-#: src/transport/plugin_transport_xt.c:3524
 #, fuzzy
 msgid "# TCP server connections active"
 msgstr ""
@@ -7592,7 +7563,6 @@ msgstr ""
 "按任意键继续\n"
 
 #: src/transport/plugin_transport_tcp.c:3474
-#: src/transport/plugin_transport_xt.c:3470
 #, fuzzy
 msgid "# TCP server connect events"
 msgstr ""
@@ -7600,27 +7570,22 @@ msgstr ""
 "按任意键继续\n"
 
 #: src/transport/plugin_transport_tcp.c:3480
-#: src/transport/plugin_transport_xt.c:3476
 msgid "TCP connection limit reached, suspending server\n"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:3482
-#: src/transport/plugin_transport_xt.c:3478
 msgid "# TCP service suspended"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:3522
-#: src/transport/plugin_transport_xt.c:3518
 msgid "# TCP service resumed"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:3532
-#: src/transport/plugin_transport_xt.c:3528
 msgid "# network-level TCP disconnect events"
 msgstr ""
 
 #: src/transport/plugin_transport_tcp.c:3851
-#: src/transport/plugin_transport_xt.c:3849
 #, fuzzy
 msgid "Failed to start service.\n"
 msgstr "初始化“%s”服务失败。\n"
@@ -7673,7 +7638,6 @@ msgid "Failed to bind UDP socket to %s: %s\n"
 msgstr "打开日志文件“%s”失败:%s\n"
 
 #: src/transport/plugin_transport_udp.c:3721
-#: src/transport/plugin_transport_xu.c:2143
 msgid "Disabling IPv4 since it is not supported on this system!\n"
 msgstr ""
 
@@ -7684,19 +7648,15 @@ msgstr "打开日志文件“%s”失败:%s\n"
 
 #: src/transport/plugin_transport_udp.c:3883
 #: src/transport/plugin_transport_udp.c:3897
-#: src/transport/plugin_transport_xu.c:2301
-#: src/transport/plugin_transport_xu.c:2315
 msgid "must be in [0,65535]"
 msgstr ""
 
 #: src/transport/plugin_transport_udp.c:3929
-#: src/transport/plugin_transport_xu.c:2347
 #, fuzzy
 msgid "must be valid IPv4 address"
 msgstr "“%s”不可用。\n"
 
 #: src/transport/plugin_transport_udp.c:3956
-#: src/transport/plugin_transport_xu.c:2374
 #, fuzzy
 msgid "must be valid IPv6 address"
 msgstr "“%s”不可用。\n"
@@ -7773,56 +7733,6 @@ msgstr ""
 msgid "# sessions allocated"
 msgstr ""
 
-#: src/transport/plugin_transport_xt.c:4010
-#, c-format
-msgid "XT transport listening on port %llu\n"
-msgstr ""
-
-#: src/transport/plugin_transport_xt.c:4014
-msgid "XT transport not listening on any port (client only)\n"
-msgstr ""
-
-#: src/transport/plugin_transport_xt.c:4018
-#, c-format
-msgid "XT transport advertises itself as being on port %llu\n"
-msgstr ""
-
-#: src/transport/plugin_transport_xt.c:4022
-#, fuzzy
-msgid "# XT sessions active"
-msgstr ""
-"\n"
-"按任意键继续\n"
-
-#: src/transport/plugin_transport_xu.c:1237
-#, c-format
-msgid ""
-"XU could not transmit message to `%s': Network seems down, please check your "
-"network configuration\n"
-msgstr ""
-
-#: src/transport/plugin_transport_xu.c:1251
-msgid ""
-"XU could not transmit IPv6 message! Please check your network configuration "
-"and disable IPv6 if your connection does not have a global IPv6 address\n"
-msgstr ""
-
-#: src/transport/plugin_transport_xu.c:2125
-#: src/transport/plugin_transport_xu.c:2224
-#, fuzzy, c-format
-msgid "Failed to bind XU socket to %s: %s\n"
-msgstr "打开日志文件“%s”失败:%s\n"
-
-#: src/transport/plugin_transport_xu.c:2234
-#, fuzzy
-msgid "Failed to open XU sockets\n"
-msgstr "打开日志文件“%s”失败:%s\n"
-
-#: src/transport/plugin_transport_xu.c:2398
-#, fuzzy
-msgid "Failed to create XU network sockets\n"
-msgstr "发送消息失败。\n"
-
 #: src/transport/tcp_connection_legacy.c:452
 #, fuzzy, c-format
 msgid "Access denied to `%s'\n"
@@ -7833,17 +7743,17 @@ msgstr "“%s”已连接到“%s”。\n"
 msgid "Accepting connection from `%s': %p\n"
 msgstr ""
 
-#: src/transport/tcp_server_legacy.c:474 src/util/service.c:1666
+#: src/transport/tcp_server_legacy.c:474 src/util/service.c:1630
 #, fuzzy, c-format
 msgid "`%s' failed for port %d (%s).\n"
 msgstr "对驱动器“%2$s”的“%1$s”操作失败:%3$u\n"
 
-#: src/transport/tcp_server_legacy.c:484 src/util/service.c:1676
+#: src/transport/tcp_server_legacy.c:484 src/util/service.c:1640
 #, c-format
 msgid "`%s' failed for port %d (%s): address already in use\n"
 msgstr ""
 
-#: src/transport/tcp_server_legacy.c:490 src/util/service.c:1682
+#: src/transport/tcp_server_legacy.c:490 src/util/service.c:1646
 #, fuzzy, c-format
 msgid "`%s' failed for `%s': address already in use\n"
 msgstr "对驱动器“%2$s”的“%1$s”操作失败:%3$u\n"
@@ -7875,17 +7785,17 @@ msgstr ""
 msgid "Could not parse IPv6 network specification `%s' for `%s:%s'\n"
 msgstr ""
 
-#: src/transport/tcp_service_legacy.c:904 src/util/service.c:1597
+#: src/transport/tcp_service_legacy.c:904 src/util/service.c:1561
 msgid "Could not access a pre-bound socket, will try to bind myself\n"
 msgstr ""
 
 #: src/transport/tcp_service_legacy.c:953
-#: src/transport/tcp_service_legacy.c:971 src/util/service.c:1750
+#: src/transport/tcp_service_legacy.c:971 src/util/service.c:1714
 #, c-format
 msgid "Specified value for `%s' of service `%s' is invalid\n"
 msgstr ""
 
-#: src/transport/tcp_service_legacy.c:996 src/util/service.c:1783
+#: src/transport/tcp_service_legacy.c:996 src/util/service.c:1747
 #, c-format
 msgid "Could not access pre-bound socket %u, will try to bind myself\n"
 msgstr ""
@@ -7900,44 +7810,44 @@ msgstr "运行 %s失败:%s %d\n"
 msgid "Service `%s' runs at %s\n"
 msgstr ""
 
-#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:2057
+#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:2021
 msgid "Service process failed to initialize\n"
 msgstr ""
 
-#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:2061
+#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:2025
 msgid "Service process could not initialize server function\n"
 msgstr ""
 
-#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:2065
+#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:2029
 msgid "Service process failed to report status\n"
 msgstr ""
 
 #: src/transport/tcp_service_legacy.c:1313 src/util/disk.c:1535
-#: src/util/service.c:1935
+#: src/util/service.c:1899
 #, c-format
 msgid "Cannot obtain information about user `%s': %s\n"
 msgstr "无法获取有关用户“%s”的信息:%s\n"
 
-#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1937
+#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1901
 msgid "No such user"
 msgstr "无此用户"
 
-#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1956
+#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1920
 #, c-format
 msgid "Cannot change user/group to `%s': %s\n"
 msgstr "无法更改用户/组为“%s”:%s\n"
 
-#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:2318
+#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:2282
 msgid "do daemonize (detach from terminal)"
 msgstr ""
 
-#: src/transport/tcp_service_legacy.c:1448 src/util/service.c:2382
-#: src/util/service.c:2397
+#: src/transport/tcp_service_legacy.c:1448 src/util/service.c:2346
+#: src/util/service.c:2361
 #, fuzzy, c-format
 msgid "Malformed configuration file `%s', exit ...\n"
 msgstr "解析配置文件“%s”失败\n"
 
-#: src/transport/tcp_service_legacy.c:1458 src/util/service.c:2409
+#: src/transport/tcp_service_legacy.c:1458 src/util/service.c:2373
 #, fuzzy
 msgid "Malformed configuration, exit ...\n"
 msgstr "解析配置文件“%s”失败\n"
@@ -7980,11 +7890,11 @@ msgstr ""
 msgid "Metadata `%s' failed to deserialize"
 msgstr ""
 
-#: src/util/client.c:734
+#: src/util/client.c:749
 msgid "not a valid filename"
 msgstr ""
 
-#: src/util/client.c:925
+#: src/util/client.c:941
 #, c-format
 msgid "Need a non-empty hostname for service `%s'.\n"
 msgstr ""
@@ -8271,7 +8181,7 @@ msgstr "长选项的必选参数对短选项也是必选的。\n"
 msgid "print this help"
 msgstr ""
 
-#: src/util/getopt_helpers.c:282
+#: src/util/getopt_helpers.c:282 src/util/gnunet-qr.c:300
 msgid "be verbose"
 msgstr ""
 
@@ -8319,52 +8229,52 @@ msgstr "您必须向“%s”选项传递一个数字。\n"
 msgid "Argument `%s' malformed. Expected base32 (Crockford) encoded value.\n"
 msgstr ""
 
-#: src/util/gnunet-config.c:160
+#: src/util/gnunet-config.c:161
 #, fuzzy, c-format
 msgid "failed to load configuration defaults"
 msgstr "解析配置文件“%s”失败\n"
 
-#: src/util/gnunet-config.c:173
+#: src/util/gnunet-config.c:174
 #, fuzzy, c-format
 msgid "%s or %s argument is required\n"
 msgstr "设置要使用的昵称(必须)"
 
-#: src/util/gnunet-config.c:181
+#: src/util/gnunet-config.c:182
 #, c-format
 msgid "The following sections are available:\n"
 msgstr ""
 
-#: src/util/gnunet-config.c:232
+#: src/util/gnunet-config.c:234
 #, c-format
 msgid "--option argument required to set value\n"
 msgstr ""
 
-#: src/util/gnunet-config.c:286
-msgid "obtain option of value as a filename (with $-expansion)"
+#: src/util/gnunet-config.c:288
+msgid "interpret option value as a filename (with $-expansion)"
 msgstr ""
 
-#: src/util/gnunet-config.c:291
+#: src/util/gnunet-config.c:293
 msgid "name of the section to access"
 msgstr ""
 
-#: src/util/gnunet-config.c:296
+#: src/util/gnunet-config.c:298
 msgid "name of the option to access"
 msgstr ""
 
-#: src/util/gnunet-config.c:301
+#: src/util/gnunet-config.c:303
 msgid "value to set"
 msgstr ""
 
-#: src/util/gnunet-config.c:305
+#: src/util/gnunet-config.c:307
 #, fuzzy
 msgid "print available configuration sections"
 msgstr "立即保存配置?"
 
-#: src/util/gnunet-config.c:309
+#: src/util/gnunet-config.c:311
 msgid "write configuration file that only contains delta to defaults"
 msgstr ""
 
-#: src/util/gnunet-config.c:322
+#: src/util/gnunet-config.c:324
 #, fuzzy
 msgid "Manipulate GNUnet configuration files"
 msgstr "更改配置文件中的一个值"
@@ -8457,6 +8367,33 @@ msgstr ""
 msgid "Manipulate GNUnet private ECC key files"
 msgstr "更改配置文件中的一个值"
 
+#: src/util/gnunet-qr.c:108 src/util/gnunet-uri.c:91
+#, fuzzy, c-format
+msgid "Invalid URI: does not start with `%s'\n"
+msgstr "无效的网络表示法(没有以“;”结尾:“%s”)\n"
+
+#: src/util/gnunet-qr.c:116 src/util/gnunet-uri.c:98
+#, c-format
+msgid "Invalid URI: fails to specify subsystem\n"
+msgstr ""
+
+#: src/util/gnunet-qr.c:127 src/util/gnunet-uri.c:108
+#, c-format
+msgid "No handler known for subsystem `%s'\n"
+msgstr ""
+
+#: src/util/gnunet-qr.c:297
+msgid "use video-device DEVICE (default: /dev/video0"
+msgstr ""
+
+#: src/util/gnunet-qr.c:303
+msgid "do not show preview windows"
+msgstr ""
+
+#: src/util/gnunet-qr.c:311
+msgid "Scan a QR code using a video device and import the uri read"
+msgstr ""
+
 #: src/util/gnunet-resolver.c:168
 msgid "perform a reverse lookup"
 msgstr ""
@@ -8500,21 +8437,6 @@ msgstr ""
 msgid "No URI specified on command line\n"
 msgstr ""
 
-#: src/util/gnunet-uri.c:91
-#, fuzzy, c-format
-msgid "Invalid URI: does not start with `%s'\n"
-msgstr "无效的网络表示法(没有以“;”结尾:“%s”)\n"
-
-#: src/util/gnunet-uri.c:98
-#, c-format
-msgid "Invalid URI: fails to specify subsystem\n"
-msgstr ""
-
-#: src/util/gnunet-uri.c:108
-#, c-format
-msgid "No handler known for subsystem `%s'\n"
-msgstr ""
-
 #: src/util/gnunet-uri.c:170
 msgid "Perform default-actions for GNUnet URIs"
 msgstr ""
@@ -8534,12 +8456,12 @@ msgstr "打开日志文件“%s”失败:%s\n"
 msgid "Error writing to `%s': %s\n"
 msgstr "创建用户出错"
 
-#: src/util/network.c:136
+#: src/util/network.c:176
 #, c-format
 msgid "Unable to shorten unix path `%s' while keeping name unique\n"
 msgstr ""
 
-#: src/util/network.c:1794 src/util/network.c:1978
+#: src/util/network.c:1835 src/util/network.c:2019
 #, c-format
 msgid ""
 "Fatal internal logic error, process hangs in `%s' (abort with CTRL-C)!\n"
@@ -8652,7 +8574,7 @@ msgid ""
 "`GNUNET_SERVICE_client_continue' after %s\n"
 msgstr ""
 
-#: src/util/service.c:1862
+#: src/util/service.c:1826
 msgid ""
 "Could not bind to any of the ports I was supposed to, refusing to run!\n"
 msgstr ""
@@ -8996,6 +8918,24 @@ msgstr ""
 msgid "`%s' failed on file `%s' at %s:%d with error: %s\n"
 msgstr ""
 
+#, fuzzy
+#~ msgid "# XT sessions active"
+#~ msgstr ""
+#~ "\n"
+#~ "按任意键继续\n"
+
+#, fuzzy
+#~ msgid "Failed to bind XU socket to %s: %s\n"
+#~ msgstr "打开日志文件“%s”失败:%s\n"
+
+#, fuzzy
+#~ msgid "Failed to open XU sockets\n"
+#~ msgstr "打开日志文件“%s”失败:%s\n"
+
+#, fuzzy
+#~ msgid "Failed to create XU network sockets\n"
+#~ msgstr "发送消息失败。\n"
+
 #, fuzzy
 #~ msgid "Print information about DV state"
 #~ msgstr "无法获取有关用户“%s”的信息:%s\n"

+ 8 - 8
src/ats/gnunet-service-ats-new.c

@@ -304,7 +304,7 @@ prop_ntoh (const struct PropertiesNBO *properties,
  */
 static void
 handle_suggest (void *cls,
-		const struct ExpressPreferenceMessage *msg)
+                const struct ExpressPreferenceMessage *msg)
 {
   struct Client *c = cls;
   struct ClientPreference *cp;
@@ -344,7 +344,7 @@ handle_suggest (void *cls,
  */
 static void
 handle_suggest_cancel (void *cls,
-		       const struct ExpressPreferenceMessage *msg)
+                       const struct ExpressPreferenceMessage *msg)
 {
   struct Client *c = cls;
   struct ClientPreference *cp;
@@ -772,13 +772,13 @@ GNUNET_SERVICE_MAIN
  &client_disconnect_cb,
  NULL,
  GNUNET_MQ_hd_fixed_size (suggest,
-			  GNUNET_MESSAGE_TYPE_ATS_SUGGEST,
-			  struct ExpressPreferenceMessage,
-			  NULL),
+                          GNUNET_MESSAGE_TYPE_ATS_SUGGEST,
+                          struct ExpressPreferenceMessage,
+                          NULL),
  GNUNET_MQ_hd_fixed_size (suggest_cancel,
-			  GNUNET_MESSAGE_TYPE_ATS_SUGGEST_CANCEL,
-			  struct ExpressPreferenceMessage,
-			  NULL),
+                          GNUNET_MESSAGE_TYPE_ATS_SUGGEST_CANCEL,
+                          struct ExpressPreferenceMessage,
+                          NULL),
  GNUNET_MQ_hd_fixed_size (start,
 			  GNUNET_MESSAGE_TYPE_ATS_START,
 			  struct GNUNET_MessageHeader,

+ 1 - 0
src/include/Makefile.am

@@ -127,6 +127,7 @@ gnunetinclude_HEADERS = \
   gnunet_time_lib.h \
   gnunet_transport_service.h \
   gnunet_transport_address_service.h \
+	gnunet_transport_application_service.h \
   gnunet_transport_communication_service.h \
   gnunet_transport_core_service.h \
   gnunet_transport_hello_service.h \

+ 3 - 3
src/include/gnunet_ats_application_service.h

@@ -83,9 +83,9 @@ struct GNUNET_ATS_ApplicationSuggestHandle;
  */
 struct GNUNET_ATS_ApplicationSuggestHandle *
 GNUNET_ATS_application_suggest (struct GNUNET_ATS_ApplicationHandle *ch,
-                                 const struct GNUNET_PeerIdentity *peer,
-                                 enum GNUNET_MQ_PreferenceKind pk,
-                                 struct GNUNET_BANDWIDTH_Value32NBO bw);
+                                const struct GNUNET_PeerIdentity *peer,
+                                enum GNUNET_MQ_PreferenceKind pk,
+                                struct GNUNET_BANDWIDTH_Value32NBO bw);
 
 
 /**

+ 2 - 2
src/include/gnunet_peerstore_service.h

@@ -1,6 +1,6 @@
 /*
       This file is part of GNUnet
-      Copyright (C)
+      Copyright (C) GNUnet e.V. 2004--2019
 
       GNUnet is free software: you can redistribute it and/or modify it
       under the terms of the GNU Affero General Public License as published
@@ -11,7 +11,7 @@
       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/>.
 

+ 12 - 0
src/include/gnunet_protocols.h

@@ -3177,6 +3177,18 @@ extern "C"
  */
 #define GNUNET_MESSAGE_TYPE_TRANSPORT_COMMUNICATOR_FC_LIMITS 1276
 
+/**
+ * Type of the 'struct ExpressPreferenceMessage' send by clients to TRANSPORT
+ * to establish bandwidth preference.
+ */
+#define GNUNET_MESSAGE_TYPE_TRANSPORT_SUGGEST 1300
+
+/**
+ * Type of the 'struct ExpressPreferenceMessage' send by clients to TRANSPORT
+ * to abandon bandwidth preference.
+ */
+#define GNUNET_MESSAGE_TYPE_TRANSPORT_SUGGEST_CANCEL 1301
+
 
 /* ************** NEW (NG) ATS Messages ************* */
 

+ 100 - 0
src/include/gnunet_transport_application_service.h

@@ -0,0 +1,100 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2010-2015, 2018, 2019 GNUnet e.V.
+
+ GNUnet 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.
+
+ 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
+ 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/>.
+
+     SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @file
+ * Bandwidth allocation API for applications to interact with
+ *
+ * @author Christian Grothoff
+ * @author Matthias Wachs
+ *
+ * @defgroup TRANSPORT service
+ * Bandwidth allocation
+ *
+ * @{
+ */
+#ifndef GNUNET_TRANSPORT_APPLICATION_SERVICE_H
+#define GNUNET_TRANSPORT_APPLICATION_SERVICE_H
+
+#include "gnunet_constants.h"
+#include "gnunet_util_lib.h"
+
+/**
+ * Handle to the TRANSPORT subsystem for making suggestions about
+ * connections the peer would like to have.
+ */
+struct GNUNET_TRANSPORT_ApplicationHandle;
+
+
+/**
+ * Initialize the TRANSPORT application client handle.
+ *
+ * @param cfg configuration to use
+ * @return ats application handle, NULL on error
+ */
+struct GNUNET_TRANSPORT_ApplicationHandle *
+GNUNET_TRANSPORT_application_init (const struct GNUNET_CONFIGURATION_Handle *cfg);
+
+
+/**
+ * Shutdown TRANSPORT application client.
+ *
+ * @param ch handle to destroy
+ */
+void
+GNUNET_TRANSPORT_application_done (struct GNUNET_TRANSPORT_ApplicationHandle *ch);
+
+
+/**
+ * Handle for suggestion requests.
+ */
+struct GNUNET_TRANSPORT_ApplicationSuggestHandle;
+
+
+/**
+ * An application would like to communicate with a peer.  TRANSPORT should
+ * allocate bandwith using a suitable address for requiremetns @a pk
+ * to transport.
+ *
+ * @param ch handle
+ * @param peer identity of the peer we need an address for
+ * @param pk what kind of application will the application require (can be
+ *         #GNUNET_MQ_PREFERENCE_NONE, we will still try to connect)
+ * @param bw desired bandwith, can be zero (we will still try to connect)
+ * @return suggestion handle, NULL if request is already pending
+ */
+struct GNUNET_TRANSPORT_ApplicationSuggestHandle *
+GNUNET_TRANSPORT_application_suggest (struct GNUNET_TRANSPORT_ApplicationHandle *ch,
+                                      const struct GNUNET_PeerIdentity *peer,
+                                      enum GNUNET_MQ_PreferenceKind pk,
+                                      struct GNUNET_BANDWIDTH_Value32NBO bw);
+
+
+/**
+ * We no longer care about communicating with a peer.
+ *
+ * @param sh handle
+ */
+void
+GNUNET_TRANSPORT_application_suggest_cancel (struct GNUNET_TRANSPORT_ApplicationSuggestHandle *sh);
+
+/** @} */  /* end of group */
+
+#endif
+/* end of file gnunet_ats_application_service.h */

+ 1 - 1
src/include/gnunet_util_lib.h

@@ -11,7 +11,7 @@
       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/>.
 

+ 3 - 3
src/namestore/test_namestore_delete.sh

@@ -61,15 +61,15 @@ for LINE in $OUTPUT ;
 stop_peer
 
 
-if [ $FOUND_NAME == false -a $FOUND_IP != false ]
+if [ $FOUND_NAME = false -a $FOUND_IP != false ]
 then
   echo "PASS: Delete name in namestore"
   exit 0
-elif [ $FOUND_NAME == true ]
+elif [ $FOUND_NAME = true ]
 then
   echo "FAIL: Delete name in namestore: name returned"
   exit 1
-elif [ $FOUND_IP == true ]
+elif [ $FOUND_IP = true ]
 then
   echo "FAIL: Delete name in namestore: IP returned"
   exit 1

+ 10 - 18
src/namestore/test_namestore_lookup.sh

@@ -19,20 +19,10 @@ TEST_IP_PLUS="127.0.0.1"
 TEST_RECORD_NAME_DNS="www3"
 which timeout &> /dev/null && DO_TIMEOUT="timeout 5"
 
-function start_peer
-{
-	gnunet-arm -s -c $CONFIGURATION
-	gnunet-identity -C testego -c $CONFIGURATION
-}
+# start peer
+gnunet-arm -s -c $CONFIGURATION
+gnunet-identity -C testego -c $CONFIGURATION
 
-function stop_peer
-{
-	gnunet-identity -D testego -c $CONFIGURATION
-	gnunet-arm -e -c $CONFIGURATION
-}
-
-
-start_peer
 # Create a public record
 gnunet-namestore -p -z testego -a -n $TEST_RECORD_NAME_DNS -t A -V $TEST_IP_PLUS -e never -c $CONFIGURATION
 NAMESTORE_RES=$?
@@ -52,19 +42,21 @@ for LINE in $OUTPUT ;
 		FOUND_IP=true;
 		#echo $FOUND_IP
 	fi
- done
-stop_peer
+done
+# stop peer
+gnunet-identity -D testego -c $CONFIGURATION
+gnunet-arm -e -c $CONFIGURATION
 
 
-if [ $FOUND_NAME == true -a $FOUND_IP == true ]
+if [ $FOUND_NAME = true -a $FOUND_IP = true ]
 then
   echo "PASS: Lookup name in namestore"
   exit 0
-elif [ $FOUND_NAME == false ]
+elif [ $FOUND_NAME = false ]
 then
   echo "FAIL: Lookup name in namestore: name not returned"
   exit 1
-elif [ $FOUND_IP == false ]
+elif [ $FOUND_IP = false ]
 then
   echo "FAIL: Lookup name in namestore: IP not returned"
   exit 1

+ 1 - 1
src/namestore/test_namestore_put.sh

@@ -46,7 +46,7 @@ gnunet-namestore -p -z testego -a -n $TEST_RECORD_NAME_DNS -t A -V $TEST_IP_PLUS
 NAMESTORE_RES=$?
 stop_peer
 
-if [ $NAMESTORE_RES == 0 ]
+if [ $NAMESTORE_RES = 0 ]
 then
   echo "PASS: Creating name in namestore"
 else

+ 22 - 0
src/peerinfo-tool/Makefile.am

@@ -10,11 +10,33 @@ if USE_COVERAGE
   XLIB = -lgcov
 endif
 
+if HAVE_MHD
+if HAVE_JSON
+REST_PLUGIN = libgnunet_plugin_rest_peerinfo.la
+endif
+endif
+
 plugindir = $(libdir)/gnunet
 
+plugin_LTLIBRARIES = $(REST_PLUGIN)
+
 bin_PROGRAMS = \
  gnunet-peerinfo
 
+libgnunet_plugin_rest_peerinfo_la_SOURCES = \
+  plugin_rest_peerinfo.c
+libgnunet_plugin_rest_peerinfo_la_LIBADD = \
+  $(top_builddir)/src/hello/libgnunethello.la \
+  $(top_builddir)/src/peerinfo/libgnunetpeerinfo.la \
+  $(top_builddir)/src/transport/libgnunettransport.la \
+  $(top_builddir)/src/rest/libgnunetrest.la \
+  $(top_builddir)/src/json/libgnunetjson.la \
+  $(top_builddir)/src/util/libgnunetutil.la $(XLIBS) \
+  $(LTLIBINTL) -ljansson -lmicrohttpd
+libgnunet_plugin_rest_peerinfo_la_LDFLAGS = \
+ $(GN_PLUGIN_LDFLAGS)
+
+
 gnunet_peerinfo_SOURCES = \
  gnunet-peerinfo.c \
  gnunet-peerinfo_plugins.c gnunet-peerinfo_plugins.h

+ 0 - 0
src/peerinfo/plugin_rest_peerinfo.c → src/peerinfo-tool/plugin_rest_peerinfo.c


+ 0 - 20
src/peerinfo/Makefile.am

@@ -19,28 +19,8 @@ if USE_COVERAGE
   XLIB = -lgcov
 endif
 
-if HAVE_MHD
-if HAVE_JSON
-REST_PLUGIN = libgnunet_plugin_rest_peerinfo.la
-endif
-endif
-
 lib_LTLIBRARIES = libgnunetpeerinfo.la
 
-plugin_LTLIBRARIES = $(REST_PLUGIN)
-
-libgnunet_plugin_rest_peerinfo_la_SOURCES = \
-  plugin_rest_peerinfo.c
-libgnunet_plugin_rest_peerinfo_la_LIBADD = \
-  $(top_builddir)/src/hello/libgnunethello.la \
-  libgnunetpeerinfo.la \
-  $(top_builddir)/src/rest/libgnunetrest.la \
-  $(top_builddir)/src/json/libgnunetjson.la \
-  $(top_builddir)/src/util/libgnunetutil.la $(XLIBS) \
-  $(LTLIBINTL) -ljansson -lmicrohttpd
-libgnunet_plugin_rest_peerinfo_la_LDFLAGS = \
- $(GN_PLUGIN_LDFLAGS)
-
 
 libgnunetpeerinfo_la_SOURCES = \
   peerinfo_api.c peerinfo.h \

+ 5 - 1
src/rps/Makefile.am

@@ -36,6 +36,7 @@ libgnunetrps_la_SOURCES = \
   rps-sampler_client.h rps-sampler_client.c \
   rps_api.c rps.h
 libgnunetrps_la_LIBADD = \
+  $(top_builddir)/src/nse/libgnunetnse.la \
   $(top_builddir)/src/util/libgnunetutil.la \
   $(GN_LIBINTL) $(XLIB)
 libgnunetrps_la_LDFLAGS = \
@@ -87,11 +88,14 @@ check_PROGRAMS = \
  test_rps_sub \
  test_rps_seed_request \
  test_rps_seed_big \
- test_rps_churn \
+ test_rps_churn
+if ENABLE_MALICIOUS
+check_PROGRAMS += \
  test_rps_malicious_1 \
  test_rps_malicious_2 \
  test_rps_malicious_3
 endif
+endif
 
 rps_test_src = \
 	test_rps.c \

+ 3 - 22
src/rps/gnunet-rps-profiler.c

@@ -1041,7 +1041,9 @@ cancel_request (struct PendingReply *pending_rep)
               "Cancelling rps get reply\n");
   GNUNET_assert (NULL != pending_rep->req_handle);
   GNUNET_RPS_request_cancel (pending_rep->req_handle);
+  pending_rep->req_handle = NULL;
   GNUNET_free (pending_rep);
+  pending_rep = NULL;
 }
 
 void
@@ -2061,29 +2063,8 @@ profiler_eval (void)
   return evaluate ();
 }
 
-static uint32_t fac (uint32_t x)
-{
-  if (1 >= x)
-  {
-    return x;
-  }
-  return x * fac (x - 1);
-}
 
-static uint32_t binom (uint32_t n, uint32_t k)
-{
-  //GNUNET_assert (n >= k);
-  if (k > n) return 0;
-  /* if (0 > n) return 0;  - always false */
-  /* if (0 > k) return 0;  - always false */
-  if (0 == k) return 1;
-  return fac (n)
-    /
-    fac(k) * fac(n - k);
-}
-
-/**
- * @brief is b in view of a?
+/** @brief is b in view of a?
  *
  * @param a
  * @param b

+ 1 - 1
src/rps/gnunet-service-rps_sampler.h

@@ -70,7 +70,7 @@ RPS_sampler_resize (struct RPS_Sampler *sampler, unsigned int new_size);
  */
 struct RPS_Sampler *
 RPS_sampler_init (size_t init_size,
-    struct GNUNET_TIME_Relative max_round_interval);
+                  struct GNUNET_TIME_Relative max_round_interval);
 
 
 /**

+ 3 - 0
src/rps/profiler_rps.conf

@@ -22,6 +22,9 @@ FILENAME_VALID_PEERS = $GNUNET_DATA_HOME/rps/valid_peers.txt
 # So, 50 is enough for a network of size 50^3 = 125000
 MINSIZE = 4
 
+DESIRED_PROBABILITY = 0.75
+
+DEFICIENCY_FACTOR = 0.4
 
 
 [testbed]

+ 54 - 0
src/rps/rps-sampler_client.c

@@ -218,6 +218,41 @@ RPS_sampler_mod_init (size_t init_size,
 }
 
 
+/**
+ * @brief Compute the probability that we already observed all peers from a
+ * biased stream of peer ids.
+ *
+ * Deficiency factor:
+ * As introduced by Brahms: Factor between the number of unique ids in a
+ * truly random stream and number of unique ids in the gossip stream.
+ *
+ * @param num_peers_estim The estimated number of peers in the network
+ * @param num_peers_observed The number of peers the given element has observed
+ * @param deficiency_factor A factor that catches the 'bias' of a random stream
+ * of peer ids
+ *
+ * @return The estimated probability
+ */
+static double
+prob_observed_n_peers (uint32_t num_peers_estim,
+                       uint32_t num_peers_observed,
+                       double deficiency_factor)
+{
+  uint32_t num_peers = num_peers_estim * (1/deficiency_factor);
+  uint64_t sum = 0;
+
+  for (uint32_t i = 0; i < num_peers; i++)
+  {
+    uint64_t a = pow (-1, num_peers-i);
+    uint64_t b = binom (num_peers, i);
+    uint64_t c = pow (i, num_peers_observed);
+    sum += a * b * c;
+  }
+
+  return sum / (double) pow (num_peers, num_peers_observed);
+}
+
+
 /**
  * Get one random peer out of the sampled peers.
  *
@@ -230,6 +265,7 @@ sampler_mod_get_rand_peer (void *cls)
   struct RPS_SamplerElement *s_elem;
   struct GNUNET_TIME_Relative last_request_diff;
   struct RPS_Sampler *sampler;
+  double prob_observed_n;
 
   gpc->get_peer_task = NULL;
   gpc->notify_ctx = NULL;
@@ -294,6 +330,24 @@ sampler_mod_get_rand_peer (void *cls)
                                 gpc);
     return;
   }
+  /* compute probability */
+  prob_observed_n = prob_observed_n_peers (sampler->num_peers_estim,
+                                           s_elem->num_peers,
+                                           sampler->deficiency_factor);
+  /* check if probability is above desired */
+  if (prob_observed_n >= sampler->desired_probability)
+  {
+    LOG (GNUNET_ERROR_TYPE_DEBUG,
+        "Probability of having observed all peers (%d) too small ( < %d).\n",
+        prob_observed_n,
+        sampler->desired_probability);
+    GNUNET_assert (NULL == gpc->notify_ctx);
+    gpc->notify_ctx =
+      sampler_notify_on_update (sampler,
+                                &sampler_mod_get_rand_peer,
+                                gpc);
+    return;
+  }
   /* More reasons to wait could be added here */
 
 //  GNUNET_STATISTICS_set (stats,

+ 54 - 0
src/rps/rps-sampler_common.c

@@ -115,6 +115,60 @@ struct RPS_SamplerRequestHandle
 };
 
 
+/**
+ * @brief Update the current estimate of the network size stored at the sampler
+ *
+ * Used for computing the condition when to return elements to the client
+ *
+ * Only used/useful with the client sampler
+ * (Maybe move to rps-sampler_client.{h|c} ?)
+ *
+ * @param sampler The sampler to update
+ * @param num_peers The estimated value
+ */
+void
+RPS_sampler_update_with_nw_size (struct RPS_Sampler *sampler,
+                                 uint32_t num_peers)
+{
+  sampler->num_peers_estim = num_peers;
+}
+
+
+/**
+ * @brief Set the probability that is needed at least with what a sampler
+ * element has to have observed all elements from the network.
+ *
+ * Only used/useful with the client sampler
+ * (Maybe move to rps-sampler_client.{h|c} ?)
+ *
+ * @param sampler
+ * @param desired_probability
+ */
+void
+RPS_sampler_set_desired_probability (struct RPS_Sampler *sampler,
+                                     double desired_probability)
+{
+  sampler->desired_probability = desired_probability;
+}
+
+
+/**
+ * @brief Set the deficiency factor.
+ *
+ * Only used/useful with the client sampler
+ * (Maybe move to rps-sampler_client.{h|c} ?)
+ *
+ * @param sampler
+ * @param desired_probability
+ */
+void
+RPS_sampler_set_deficiency_factor (struct RPS_Sampler *sampler,
+                                   double deficiency_factor)
+{
+  sampler->deficiency_factor = deficiency_factor;
+}
+
+
 /**
  * @brief Add a callback that will be called when the next peer is inserted
  * into the sampler

+ 61 - 0
src/rps/rps-sampler_common.h

@@ -146,6 +146,25 @@ struct RPS_Sampler
    */
   struct GNUNET_TIME_Relative max_round_interval;
 
+  /**
+   * @brief The estimated total number of peers in the network
+   */
+  uint32_t num_peers_estim;
+
+  /**
+   * @brief The desired probability with which we want to have observed all
+   * peers.
+   */
+  double desired_probability;
+
+  /**
+   * @brief A factor that catches the 'bias' of a random stream of peer ids.
+   *
+   * As introduced by Brahms: Factor between the number of unique ids in a
+   * truly random stream and number of unique ids in the gossip stream.
+   */
+  double deficiency_factor;
+
   /**
    * Stores the function to return peers. Which one it is depends on whether
    * the Sampler is the modified one or not.
@@ -163,6 +182,48 @@ struct RPS_Sampler
 };
 
 
+/**
+ * @brief Update the current estimate of the network size stored at the sampler
+ *
+ * Used for computing the condition when to return elements to the client
+ *
+ * @param sampler The sampler to update
+ * @param num_peers The estimated value
+ */
+void
+RPS_sampler_update_with_nw_size (struct RPS_Sampler *sampler,
+                                 uint32_t num_peers);
+
+
+/**
+ * @brief Set the probability that is needed at least with what a sampler
+ * element has to have observed all elements from the network.
+ *
+ * Only used/useful with the client sampler
+ * (Maybe move to rps-sampler_client.{h|c} ?)
+ *
+ * @param sampler
+ * @param desired_probability
+ */
+void
+RPS_sampler_set_desired_probability (struct RPS_Sampler *sampler,
+                                     double desired_probability);
+
+
+/**
+ * @brief Set the deficiency factor.
+ *
+ * Only used/useful with the client sampler
+ * (Maybe move to rps-sampler_client.{h|c} ?)
+ *
+ * @param sampler
+ * @param desired_probability
+ */
+void
+RPS_sampler_set_deficiency_factor (struct RPS_Sampler *sampler,
+                                   double deficiency_factor);
+
+
 /**
  * @brief Add a callback that will be called when the next peer is inserted
  * into the sampler

+ 38 - 0
src/rps/rps-test_util.c

@@ -487,4 +487,42 @@ store_prefix_file_name (const struct GNUNET_PeerIdentity *peer,
   return file_name;
 }
 
+
+/**
+ * @brief Factorial
+ *
+ * @param x Number of which to compute the factorial
+ *
+ * @return Factorial of @a x
+ */
+uint32_t fac (uint32_t x)
+{
+  if (1 >= x)
+  {
+    return x;
+  }
+  return x * fac (x - 1);
+}
+
+/**
+ * @brief Binomial coefficient (n choose k)
+ *
+ * @param n
+ * @param k
+ *
+ * @return Binomial coefficient of @a n and @a k
+ */
+uint32_t binom (uint32_t n, uint32_t k)
+{
+  //GNUNET_assert (n >= k);
+  if (k > n) return 0;
+  /* if (0 > n) return 0;  - always false */
+  /* if (0 > k) return 0;  - always false */
+  if (0 == k) return 1;
+  return fac (n)
+    /
+    fac(k) * fac(n - k);
+}
+
+
 /* end of gnunet-service-rps.c */

+ 21 - 0
src/rps/rps-test_util.h

@@ -107,5 +107,26 @@ to_file_raw_unaligned (const char *file_name,
                        size_t size_buf,
                        unsigned bits_needed);
 
+
+/**
+ * @brief Factorial
+ *
+ * @param x Number of which to compute the factorial
+ *
+ * @return Factorial of @a x
+ */
+uint32_t fac (uint32_t x);
+
+
+/**
+ * @brief Binomial coefficient (n choose k)
+ *
+ * @param n
+ * @param k
+ *
+ * @return Binomial coefficient of @a n and @a k
+ */
+uint32_t binom (uint32_t n, uint32_t k);
+
 #endif /* RPS_TEST_UTIL_H */
 /* end of gnunet-service-rps.c */

+ 10 - 0
src/rps/rps.conf.in

@@ -26,3 +26,13 @@ FILENAME_VALID_PEERS = $GNUNET_DATA_HOME/rps/valid_peers.txt
 # Keep in mind, that (networksize)^(1/3) should be enough.
 # So, 50 is enough for a network of size 50^3 = 125000
 MINSIZE = 10
+
+# The probability whith which we want a sampler element to have observed all
+# peer ids in the network at least
+DESIRED_PROBABILITY = 0.9
+
+# A factor that catches the 'bias' of a random stream of peer ids.
+#
+# As introduced by Brahms: Factor between the number of unique ids in a
+# truly random stream and number of unique ids in the gossip stream.
+DEFICIENCY_FACTOR = 0.4

+ 142 - 7
src/rps/rps_api.c

@@ -29,6 +29,8 @@
 #include "gnunet_rps_service.h"
 #include "rps-sampler_client.h"
 
+#include "gnunet_nse_service.h"
+
 #include <inttypes.h>
 
 #define LOG(kind,...) GNUNET_log_from (kind, "rps-api",__VA_ARGS__)
@@ -109,6 +111,35 @@ struct GNUNET_RPS_Handle
    * @brief Tail of the DLL of stream requests
    */
   struct GNUNET_RPS_StreamRequestHandle *stream_requests_tail;
+
+  /**
+   * @brief Handle to nse service
+   */
+  struct GNUNET_NSE_Handle *nse;
+
+  /**
+   * @brief Pointer to the head element in DLL of request handles
+   */
+  struct GNUNET_RPS_Request_Handle *rh_head;
+
+  /**
+   * @brief Pointer to the tail element in DLL of request handles
+   */
+  struct GNUNET_RPS_Request_Handle *rh_tail;
+
+  /**
+   * @brief The desired probability with which we want to have observed all
+   * peers.
+   */
+  float desired_probability;
+
+  /**
+   * @brief A factor that catches the 'bias' of a random stream of peer ids.
+   *
+   * As introduced by Brahms: Factor between the number of unique ids in a
+   * truly random stream and number of unique ids in the gossip stream.
+   */
+  float deficiency_factor;
 };
 
 
@@ -152,6 +183,16 @@ struct GNUNET_RPS_Request_Handle
    * The closure for the callback.
    */
   void *ready_cb_cls;
+
+  /**
+   * @brief Pointer to next element in DLL
+   */
+  struct GNUNET_RPS_Request_Handle *next;
+
+  /**
+   * @brief Pointer to previous element in DLL
+   */
+  struct GNUNET_RPS_Request_Handle *prev;
 };
 
 
@@ -263,10 +304,7 @@ peers_ready_cb (const struct GNUNET_PeerIdentity *peers,
   rh->ready_cb (rh->ready_cb_cls,
                 num_peers,
                 peers);
-  GNUNET_RPS_stream_cancel (rh->srh);
-  rh->srh = NULL;
-  RPS_sampler_destroy (rh->sampler);
-  rh->sampler = NULL;
+  GNUNET_RPS_request_cancel (rh);
 }
 
 
@@ -606,6 +644,37 @@ hash_from_share_val (const char *share_val,
 }
 
 
+/**
+ * @brief Callback for network size estimate - called with new estimates about
+ * the network size, updates all samplers with the new estimate
+ *
+ * Implements #GNUNET_NSE_Callback
+ *
+ * @param cls the rps handle
+ * @param timestamp unused
+ * @param logestimate the estimate
+ * @param std_dev the standard distribution
+ */
+static void
+nse_cb (void *cls,
+        struct GNUNET_TIME_Absolute timestamp,
+        double logestimate,
+        double std_dev)
+{
+  struct GNUNET_RPS_Handle *h = cls;
+  (void) timestamp;
+  (void) std_dev;
+
+  for (struct GNUNET_RPS_Request_Handle *rh_iter = h->rh_head;
+       NULL != rh_iter && NULL != rh_iter->next;
+       rh_iter = rh_iter->next)
+  {
+    RPS_sampler_update_with_nw_size (rh_iter->sampler,
+                                     GNUNET_NSE_log_estimate_to_n (logestimate));
+  }
+}
+
+
 /**
  * Reconnect to the service
  */
@@ -631,6 +700,9 @@ reconnect (struct GNUNET_RPS_Handle *h)
                                  mq_handlers,
                                  &mq_error_handler,
                                  h);
+  if (NULL != h->nse)
+    GNUNET_NSE_disconnect (h->nse);
+  h->nse = GNUNET_NSE_connect (h->cfg, &nse_cb, h);
 }
 
 
@@ -638,7 +710,7 @@ reconnect (struct GNUNET_RPS_Handle *h)
  * Connect to the rps service
  *
  * @param cfg configuration to use
- * @return a handle to the service
+ * @return a handle to the service, NULL on error
  */
 struct GNUNET_RPS_Handle *
 GNUNET_RPS_connect (const struct GNUNET_CONFIGURATION_Handle *cfg)
@@ -647,6 +719,44 @@ GNUNET_RPS_connect (const struct GNUNET_CONFIGURATION_Handle *cfg)
 
   h = GNUNET_new (struct GNUNET_RPS_Handle);
   h->cfg = cfg;
+  if (GNUNET_OK !=
+      GNUNET_CONFIGURATION_get_value_float (cfg,
+                                           "RPS",
+                                           "DESIRED_PROBABILITY",
+                                           &h->desired_probability))
+  {
+    GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
+                               "RPS", "DESIRED_PROBABILITY");
+    GNUNET_free (h);
+    return NULL;
+  }
+  if (0 > h->desired_probability ||
+      1 < h->desired_probability)
+  {
+    LOG (GNUNET_ERROR_TYPE_ERROR,
+        "The desired probability must be in the interval [0;1]\n");
+    GNUNET_free (h);
+    return NULL;
+  }
+  if (GNUNET_OK !=
+      GNUNET_CONFIGURATION_get_value_float (cfg,
+                                           "RPS",
+                                           "DEFICIENCY_FACTOR",
+                                           &h->deficiency_factor))
+  {
+    GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
+                               "RPS", "DEFICIENCY_FACTOR");
+    GNUNET_free (h);
+    return NULL;
+  }
+  if (0 > h->desired_probability ||
+      1 < h->desired_probability)
+  {
+    LOG (GNUNET_ERROR_TYPE_ERROR,
+        "The deficiency factor must be in the interval [0;1]\n");
+    GNUNET_free (h);
+    return NULL;
+  }
   reconnect (h);
   if (NULL == h->mq)
   {
@@ -725,6 +835,10 @@ GNUNET_RPS_request_peers (struct GNUNET_RPS_Handle *rps_handle,
   rh->num_requests = num_req_peers;
   rh->sampler = RPS_sampler_mod_init (num_req_peers,
                                       GNUNET_TIME_UNIT_SECONDS); // TODO remove this time-stuff
+  RPS_sampler_set_desired_probability (rh->sampler,
+                                       rps_handle->desired_probability);
+  RPS_sampler_set_deficiency_factor (rh->sampler,
+                                     rps_handle->deficiency_factor);
   rh->sampler_rh = RPS_sampler_get_n_rand_peers (rh->sampler,
                                                  num_req_peers,
                                                  peers_ready_cb,
@@ -734,6 +848,9 @@ GNUNET_RPS_request_peers (struct GNUNET_RPS_Handle *rps_handle,
                                        rh); /* cls */
   rh->ready_cb = ready_cb;
   rh->ready_cb_cls = cls;
+  GNUNET_CONTAINER_DLL_insert (rps_handle->rh_head,
+                               rps_handle->rh_tail,
+                               rh);
 
   return rh;
 }
@@ -911,6 +1028,7 @@ GNUNET_RPS_request_cancel (struct GNUNET_RPS_Request_Handle *rh)
 
   h = rh->rps_handle;
   GNUNET_assert (NULL != rh);
+  GNUNET_assert (NULL != rh->srh);
   GNUNET_assert (h == rh->srh->rps_handle);
   GNUNET_RPS_stream_cancel (rh->srh);
   rh->srh = NULL;
@@ -920,6 +1038,10 @@ GNUNET_RPS_request_cancel (struct GNUNET_RPS_Request_Handle *rh)
     RPS_sampler_request_cancel (rh->sampler_rh);
   }
   RPS_sampler_destroy (rh->sampler);
+  rh->sampler = NULL;
+  GNUNET_CONTAINER_DLL_remove (h->rh_head,
+                               h->rh_tail,
+                               rh);
   GNUNET_free (rh);
 }
 
@@ -939,13 +1061,24 @@ GNUNET_RPS_disconnect (struct GNUNET_RPS_Handle *h)
     LOG (GNUNET_ERROR_TYPE_WARNING,
         "Still waiting for replies\n");
     for (struct GNUNET_RPS_StreamRequestHandle *srh_iter = h->stream_requests_head;
-	 NULL != srh_iter;
-	 srh_iter = srh_next)
+         NULL != srh_iter;
+         srh_iter = srh_next)
     {
       srh_next = srh_iter->next;
       GNUNET_RPS_stream_cancel (srh_iter);
     }
   }
+  if (NULL != h->rh_head)
+  {
+    LOG (GNUNET_ERROR_TYPE_WARNING,
+         "Not all requests were cancelled!\n");
+    for (struct GNUNET_RPS_Request_Handle *rh_iter = h->rh_head;
+         h->rh_head != NULL;
+         rh_iter = h->rh_head)
+    {
+      GNUNET_RPS_request_cancel (rh_iter);
+    }
+  }
   if (NULL != srh_callback_peers)
   {
     GNUNET_free (srh_callback_peers);
@@ -957,6 +1090,8 @@ GNUNET_RPS_disconnect (struct GNUNET_RPS_Handle *h)
         "Still waiting for view updates\n");
     GNUNET_RPS_view_request_cancel (h);
   }
+  if (NULL != h->nse)
+    GNUNET_NSE_disconnect (h->nse);
   GNUNET_MQ_destroy (h->mq);
   GNUNET_free (h);
 }

+ 0 - 20
src/rps/test_rps.c

@@ -1964,26 +1964,6 @@ profiler_eval (void)
   return evaluate ();
 }
 
-static uint32_t fac (uint32_t x)
-{
-  if (1 >= x)
-  {
-    return x;
-  }
-  return x * fac (x - 1);
-}
-
-static uint32_t binom (uint32_t n, uint32_t k)
-{
-  //GNUNET_assert (n >= k);
-  if (k > n) return 0;
-  if (0 > n) return 0;
-  if (0 > k) return 0;
-  if (0 == k) return 1;
-  return fac (n)
-    /
-    fac(k) * fac(n - k);
-}
 
 /**
  * @brief is b in view of a?

+ 4 - 0
src/rps/test_rps.conf

@@ -22,6 +22,10 @@ FILENAME_VALID_PEERS = $GNUNET_DATA_HOME/rps/valid_peers.txt
 # So, 50 is enough for a network of size 50^3 = 125000
 MINSIZE = 4
 
+DESIRED_PROBABILITY = 0.75
+
+DEFICIENCY_FACTOR = 0.4
+
 
 
 [testbed]

+ 9 - 32
src/transport/Makefile.am

@@ -155,6 +155,7 @@ endif
 lib_LTLIBRARIES = \
   libgnunettransport.la \
   libgnunettransportaddress.la \
+  libgnunettransportapplication.la \
   libgnunettransportcore.la \
   libgnunettransportcommunicator.la \
   libgnunettransportmonitor.la \
@@ -196,6 +197,14 @@ libgnunettransport_la_LDFLAGS = \
   $(GN_LIB_LDFLAGS) $(WINFLAGS) \
   -version-info 4:0:2
 
+libgnunettransportapplication_la_SOURCES = \
+  transport_api2_application.c
+libgnunettransportapplication_la_LIBADD = \
+ $(top_builddir)/src/util/libgnunetutil.la \
+ $(LTLIBINTL)
+libgnunettransportapplication_la_LDFLAGS = \
+  $(GN_LIB_LDFLAGS) $(WINFLAGS) \
+  -version-info 0:0:0
 
 
 libgnunettransportaddress_la_SOURCES = \
@@ -360,7 +369,6 @@ gnunet_service_transport_CFLAGS = \
 gnunet_service_tng_SOURCES = \
  gnunet-service-tng.c
 gnunet_service_tng_LDADD = \
-  $(top_builddir)/src/ats/libgnunetatstransport.la \
   $(top_builddir)/src/peerstore/libgnunetpeerstore.la \
   $(top_builddir)/src/hello/libgnunethello.la \
   $(top_builddir)/src/statistics/libgnunetstatistics.la \
@@ -378,12 +386,6 @@ 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 = \
@@ -401,18 +403,6 @@ libgnunet_plugin_transport_tcp_la_LIBADD = \
 libgnunet_plugin_transport_tcp_la_LDFLAGS = \
  $(GN_PLUGIN_LDFLAGS)
 
-libgnunet_plugin_transport_xt_la_SOURCES = \
-  plugin_transport_xt.c
-libgnunet_plugin_transport_xt_la_LIBADD = \
-  $(top_builddir)/src/hello/libgnunethello.la \
-  $(top_builddir)/src/statistics/libgnunetstatistics.la \
-  $(top_builddir)/src/peerinfo/libgnunetpeerinfo.la \
-  $(top_builddir)/src/nat/libgnunetnatnew.la \
-  $(top_builddir)/src/util/libgnunetutil.la \
-  $(LTLIBINTL)
-libgnunet_plugin_transport_xt_la_LDFLAGS = \
- $(GN_PLUGIN_LDFLAGS)
-
 libgnunet_plugin_transport_template_la_SOURCES = \
   plugin_transport_template.c
 libgnunet_plugin_transport_template_la_LIBADD = \
@@ -461,19 +451,6 @@ libgnunet_plugin_transport_udp_la_LIBADD = \
 libgnunet_plugin_transport_udp_la_LDFLAGS = \
  $(GN_PLUGIN_LDFLAGS)
 
-libgnunet_plugin_transport_xu_la_SOURCES = \
-  plugin_transport_xu.c plugin_transport_xu.h
-libgnunet_plugin_transport_xu_la_LIBADD = \
-  $(top_builddir)/src/hello/libgnunethello.la \
-  $(top_builddir)/src/fragmentation/libgnunetfragmentation.la \
-  $(top_builddir)/src/statistics/libgnunetstatistics.la \
-  $(top_builddir)/src/peerinfo/libgnunetpeerinfo.la \
-  $(top_builddir)/src/nat/libgnunetnatnew.la \
-  $(top_builddir)/src/util/libgnunetutil.la \
-  $(LTLIBINTL)
-libgnunet_plugin_transport_xu_la_LDFLAGS = \
- $(GN_PLUGIN_LDFLAGS)
-
 libgnunet_plugin_transport_unix_la_SOURCES = \
   plugin_transport_unix.c
 libgnunet_plugin_transport_unix_la_LIBADD = \

File diff suppressed because it is too large
+ 272 - 203
src/transport/gnunet-service-tng.c


+ 0 - 4107
src/transport/plugin_transport_xt.c

@@ -1,4107 +0,0 @@
-/*
-  This file is part of GNUnet
-  Copyright (C) 2002--2015 GNUnet e.V.
-
-  GNUnet 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.
-
-  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
-  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/>.
-
-     SPDX-License-Identifier: AGPL3.0-or-later
- */
-/**
- * @file transport/plugin_transport_xt.c
- * @brief Implementation of the TCP transport service
- * @author Christian Grothoff
- */
-#include "platform.h"
-#include "gnunet_hello_lib.h"
-#include "gnunet_constants.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_nat_service.h"
-#include "gnunet_protocols.h"
-#include "gnunet_resolver_service.h"
-#include "gnunet_signatures.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-xt",__VA_ARGS__)
-
-#define PLUGIN_NAME "xt"
-
-/**
- * How long until we give up on establishing an NAT connection?
- * Must be > 4 RTT
- */
-#define NAT_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 10)
-
-/**
- * Opaque handle that can be used to cancel
- * a transmit-ready notification.
- */
-struct GNUNET_CONNECTION_TransmitHandle;
-
-/**
- * @brief handle for a server
- */
-struct GNUNET_SERVER_Handle;
-
-/**
- * @brief opaque handle for a client of the server
- */
-struct GNUNET_SERVER_Client;
-
-/**
- * @brief opaque handle server returns for aborting transmission to a client.
- */
-struct GNUNET_SERVER_TransmitHandle;
-
-/**
- * @brief handle for a network connection
- */
-struct GNUNET_CONNECTION_Handle;
-
-/**
- * @brief handle for a network service
- */
-struct LEGACY_SERVICE_Context;
-
-
-/**
- * Stops a service that was started with #GNUNET_SERVICE_start().
- *
- * @param srv service to stop
- */
-void
-LEGACY_SERVICE_stop (struct LEGACY_SERVICE_Context *srv);
-
-
-
-/**
- * Function called to notify a client about the connection begin ready
- * to queue more data.  @a buf will be NULL and @a size zero if the
- * connection was closed for writing in the meantime.
- *
- * @param cls closure
- * @param size number of bytes available in @a buf
- * @param buf where the callee should write the message
- * @return number of bytes written to @a buf
- */
-typedef size_t
-(*GNUNET_CONNECTION_TransmitReadyNotify) (void *cls,
-                                          size_t size,
-                                          void *buf);
-
-/**
- * Credentials for UNIX domain sockets.
- */
-struct GNUNET_CONNECTION_Credentials
-{
-  /**
-   * UID of the other end of the connection.
-   */
-  uid_t uid;
-
-  /**
-   * GID of the other end of the connection.
-   */
-  gid_t gid;
-};
-
-
-/**
- * Functions with this signature are called whenever a client
- * is disconnected on the network level.
- *
- * @param cls closure
- * @param client identification of the client; NULL
- *        for the last call when the server is destroyed
- */
-typedef void
-(*GNUNET_SERVER_DisconnectCallback) (void *cls,
-                                     struct GNUNET_SERVER_Client *client);
-
-
-/**
- * Functions with this signature are called whenever a client
- * is connected on the network level.
- *
- * @param cls closure
- * @param client identification of the client
- */
-typedef void
-(*GNUNET_SERVER_ConnectCallback) (void *cls,
-                                  struct GNUNET_SERVER_Client *client);
-
-
-
-
-/**
- * Function to call for access control checks.
- *
- * @param cls closure
- * @param ucred credentials, if available, otherwise NULL
- * @param addr address
- * @param addrlen length of address
- * @return GNUNET_YES to allow, GNUNET_NO to deny, GNUNET_SYSERR
- *   for unknown address family (will be denied).
- */
-typedef int
-(*GNUNET_CONNECTION_AccessCheck) (void *cls,
-                                  const struct
-                                  GNUNET_CONNECTION_Credentials *
-                                  ucred,
-                                  const struct sockaddr * addr,
-                                  socklen_t addrlen);
-
-/**
- * Callback function for data received from the network.  Note that
- * both "available" and "err" would be 0 if the read simply timed out.
- *
- * @param cls closure
- * @param buf pointer to received data
- * @param available number of bytes availabe in "buf",
- *        possibly 0 (on errors)
- * @param addr address of the sender
- * @param addrlen size of addr
- * @param errCode value of errno (on errors receiving)
- */
-typedef void
-(*GNUNET_CONNECTION_Receiver) (void *cls, const void *buf,
-                               size_t available,
-                               const struct sockaddr * addr,
-                               socklen_t addrlen, int errCode);
-
-
-
-/**
- * Close the connection and free associated resources.  There must
- * not be any pending requests for reading or writing to the
- * connection at this time.
- *
- * @param connection connection to destroy
- */
-void
-GNUNET_CONNECTION_destroy (struct GNUNET_CONNECTION_Handle *connection);
-
-
-/**
- * Signature of a function to create a custom tokenizer.
- *
- * @param cls closure from #GNUNET_SERVER_set_callbacks
- * @param client handle to client the tokenzier will be used for
- * @return handle to custom tokenizer ('mst')
- */
-typedef void*
-(*GNUNET_SERVER_MstCreateCallback) (void *cls,
-                                    struct GNUNET_SERVER_Client *client);
-
-
-/**
- * Signature of a function to destroy a custom tokenizer.
- *
- * @param cls closure from #GNUNET_SERVER_set_callbacks
- * @param mst custom tokenizer handle
- */
-typedef void
-(*GNUNET_SERVER_MstDestroyCallback) (void *cls,
-                                     void *mst);
-
-/**
- * Signature of a function to receive data for a custom tokenizer.
- *
- * @param cls closure from #GNUNET_SERVER_set_callbacks
- * @param mst custom tokenizer handle
- * @param client_identity ID of client for which this is a buffer,
- *        can be NULL (will be passed back to 'cb')
- * @param buf input data to add
- * @param size number of bytes in @a buf
- * @param purge should any excess bytes in the buffer be discarded
- *       (i.e. for packet-based services like UDP)
- * @param one_shot only call callback once, keep rest of message in buffer
- * @return #GNUNET_OK if we are done processing (need more data)
- *         #GNUNET_NO if one_shot was set and we have another message ready
- *         #GNUNET_SYSERR if the data stream is corrupt
- */
-typedef int
-(*GNUNET_SERVER_MstReceiveCallback) (void *cls, void *mst,
-                                     struct GNUNET_SERVER_Client *client,
-                                     const char *buf,
-                                     size_t size,
-                                     int purge,
-                                     int one_shot);
-/**
- * Functions with this signature are called whenever a message is
- * received.
- *
- * @param cls closure
- * @param client identification of the client
- * @param message the actual message
- */
-typedef void
-(*GNUNET_SERVER_MessageCallback) (void *cls,
-                                  struct GNUNET_SERVER_Client *client,
-                                  const struct GNUNET_MessageHeader *message);
-
-/**
- * Message handler.  Each struct specifies how to handle on particular
- * type of message received.
- */
-struct GNUNET_SERVER_MessageHandler
-{
-  /**
-   * Function to call for messages of "type".
-   */
-  GNUNET_SERVER_MessageCallback callback;
-
-  /**
-   * Closure argument for @e callback.
-   */
-  void *callback_cls;
-
-  /**
-   * Type of the message this handler covers.
-   */
-  uint16_t type;
-
-  /**
-   * Expected size of messages of this type.  Use 0 for
-   * variable-size.  If non-zero, messages of the given
-   * type will be discarded (and the connection closed)
-   * if they do not have the right size.
-   */
-  uint16_t expected_size;
-
-};
-
-
-/**
- * Options for the service (bitmask).
- */
-enum LEGACY_SERVICE_Options
-{
-  /**
-   * Use defaults.  Terminates all client connections and the listen
-   * sockets immediately upon receiving the shutdown signal.
-   */
-  LEGACY_SERVICE_OPTION_NONE = 0,
-
-  /**
-   * Do not trigger server shutdown on signal at all; instead, allow
-   * for the user to terminate the server explicitly when needed
-   * by calling #LEGACY_SERVICE_shutdown().
-   */
-  LEGACY_SERVICE_OPTION_MANUAL_SHUTDOWN = 1,
-
-  /**
-   * Trigger a SOFT server shutdown on signals, allowing active
-   * non-monitor clients to complete their transactions.
-   */
-  LEGACY_SERVICE_OPTION_SOFT_SHUTDOWN = 2
-};
-
-
-
-/**
- * Ask the server to disconnect from the given client.  This is the
- * same as passing #GNUNET_SYSERR to #GNUNET_SERVER_receive_done,
- * except that it allows dropping of a client even when not handling a
- * message from that client.
- *
- * @param client the client to disconnect from
- */
-void
-GNUNET_SERVER_client_disconnect (struct GNUNET_SERVER_Client *client);
-
-/**
- * Return user context associated with the given client.
- * Note: you should probably use the macro (call without the underscore).
- *
- * @param client client to query
- * @param size number of bytes in user context struct (for verification only)
- * @return pointer to user context
- */
-void *
-GNUNET_SERVER_client_get_user_context_ (struct GNUNET_SERVER_Client *client,
-                                        size_t size);
-
-
-/**
- * Functions with this signature are called whenever a
- * complete message is received by the tokenizer.
- *
- * Do not call #GNUNET_SERVER_mst_destroy from within
- * the scope of this callback.
- *
- * @param cls closure
- * @param client identification of the client
- * @param message the actual message
- * @return #GNUNET_OK on success, #GNUNET_SYSERR to stop further processing
- */
-typedef int
-(*GNUNET_SERVER_MessageTokenizerCallback) (void *cls,
-                                           void *client,
-                                           const struct GNUNET_MessageHeader *message);
-
-
-/**
- * Create a message stream tokenizer.
- *
- * @param cb function to call on completed messages
- * @param cb_cls closure for @a cb
- * @return handle to tokenizer
- */
-struct GNUNET_SERVER_MessageStreamTokenizer *
-GNUNET_SERVER_mst_create (GNUNET_SERVER_MessageTokenizerCallback cb,
-                          void *cb_cls);
-
-/**
- * Add incoming data to the receive buffer and call the
- * callback for all complete messages.
- *
- * @param mst tokenizer to use
- * @param client_identity ID of client for which this is a buffer,
- *        can be NULL (will be passed back to 'cb')
- * @param buf input data to add
- * @param size number of bytes in @a buf
- * @param purge should any excess bytes in the buffer be discarded
- *       (i.e. for packet-based services like UDP)
- * @param one_shot only call callback once, keep rest of message in buffer
- * @return #GNUNET_OK if we are done processing (need more data)
- *         #GNUNET_NO if one_shot was set and we have another message ready
- *         #GNUNET_SYSERR if the data stream is corrupt
- */
-int
-GNUNET_SERVER_mst_receive (struct GNUNET_SERVER_MessageStreamTokenizer *mst,
-                           void *client_identity,
-                           const char *buf, size_t size,
-                           int purge, int one_shot);
-
-
-
-/**
- * Destroys a tokenizer.
- *
- * @param mst tokenizer to destroy
- */
-void
-GNUNET_SERVER_mst_destroy (struct GNUNET_SERVER_MessageStreamTokenizer *mst);
-
-
-/**
- * Set user context to be associated with the given client.
- * Note: you should probably use the macro (call without the underscore).
- *
- * @param client client to query
- * @param ptr pointer to user context
- * @param size number of bytes in user context struct (for verification only)
- */
-void
-GNUNET_SERVER_client_set_user_context_ (struct GNUNET_SERVER_Client *client,
-                                        void *ptr,
-                                        size_t size);
-/**
- * Return user context associated with the given client.
- *
- * @param client client to query
- * @param type expected return type (i.e. 'struct Foo')
- * @return pointer to user context of type 'type *'.
- */
-#define GNUNET_SERVER_client_get_user_context(client,type)              \
-  (type *) GNUNET_SERVER_client_get_user_context_ (client, sizeof (type))
-
-/**
- * Set user context to be associated with the given client.
- *
- * @param client client to query
- * @param value pointer to user context
- */
-#define GNUNET_SERVER_client_set_user_context(client,value)             \
-  GNUNET_SERVER_client_set_user_context_ (client, value, sizeof (*value))
-
-
-
-/**
- * Notify us when the server has enough space to transmit
- * a message of the given size to the given client.
- *
- * @param client client to transmit message to
- * @param size requested amount of buffer space
- * @param timeout after how long should we give up (and call
- *        notify with buf NULL and size 0)?
- * @param callback function to call when space is available
- * @param callback_cls closure for @a callback
- * @return non-NULL if the notify callback was queued; can be used
- *           to cancel the request using
- *           #GNUNET_SERVER_notify_transmit_ready_cancel.
- *         NULL if we are already going to notify someone else (busy)
- */
-struct GNUNET_SERVER_TransmitHandle *
-GNUNET_SERVER_notify_transmit_ready (struct GNUNET_SERVER_Client *client,
-                                     size_t size,
-                                     struct GNUNET_TIME_Relative timeout,
-                                     GNUNET_CONNECTION_TransmitReadyNotify callback,
-                                     void *callback_cls);
-
-/**
- * Abort transmission request.
- *
- * @param th request to abort
- */
-void
-GNUNET_SERVER_notify_transmit_ready_cancel (struct GNUNET_SERVER_TransmitHandle *th);
-
-
-
-
-/**
- * Notify the server that the given client handle should
- * be kept (keeps the connection up if possible, increments
- * the internal reference counter).
- *
- * @param client the client to keep
- */
-void
-GNUNET_SERVER_client_keep (struct GNUNET_SERVER_Client *client);
-
-
-/**
- * Notify the server that the given client handle is no
- * longer required.  Decrements the reference counter.  If
- * that counter reaches zero an inactive connection maybe
- * closed.
- *
- * @param client the client to drop
- */
-void
-GNUNET_SERVER_client_drop (struct GNUNET_SERVER_Client *client);
-
-
-/**
- * Function called by the service's run
- * method to run service-specific setup code.
- *
- * @param cls closure
- * @param server the initialized server
- * @param cfg configuration to use
- */
-typedef void
-(*LEGACY_SERVICE_Main) (void *cls,
-                        struct GNUNET_SERVER_Handle *server,
-                        const struct GNUNET_CONFIGURATION_Handle *cfg);
-
-
-
-/**
- * Suspend accepting connections from the listen socket temporarily.
- * Resume activity using #GNUNET_SERVER_resume.
- *
- * @param server server to stop accepting connections.
- */
-void
-GNUNET_SERVER_suspend (struct GNUNET_SERVER_Handle *server);
-
-/**
- * Notify us when the server has enough space to transmit
- * a message of the given size to the given client.
- *
- * @param client client to transmit message to
- * @param size requested amount of buffer space
- * @param timeout after how long should we give up (and call
- *        notify with buf NULL and size 0)?
- * @param callback function to call when space is available
- * @param callback_cls closure for @a callback
- * @return non-NULL if the notify callback was queued; can be used
- *           to cancel the request using
- *           #GNUNET_SERVER_notify_transmit_ready_cancel.
- *         NULL if we are already going to notify someone else (busy)
- */
-struct GNUNET_SERVER_TransmitHandle *
-GNUNET_SERVER_notify_transmit_ready (struct GNUNET_SERVER_Client *client,
-                                     size_t size,
-                                     struct GNUNET_TIME_Relative timeout,
-                                     GNUNET_CONNECTION_TransmitReadyNotify callback,
-                                     void *callback_cls);
-
-
-/**
- * Add a TCP socket-based connection to the set of handles managed by
- * this server.  Use this function for outgoing (P2P) connections that
- * we initiated (and where this server should process incoming
- * messages).
- *
- * @param server the server to use
- * @param connection the connection to manage (client must
- *        stop using this connection from now on)
- * @return the client handle
- */
-struct GNUNET_SERVER_Client *
-GNUNET_SERVER_connect_socket (struct GNUNET_SERVER_Handle *server,
-                              struct GNUNET_CONNECTION_Handle *connection);
-
-
-/**
- * Resume accepting connections from the listen socket.
- *
- * @param server server to resume accepting connections.
- */
-void
-GNUNET_SERVER_resume (struct GNUNET_SERVER_Handle *server);
-
-/**
- * Free resources held by this server.
- *
- * @param server server to destroy
- */
-void
-GNUNET_SERVER_destroy (struct GNUNET_SERVER_Handle *server);
-
-
-
-
-#include "tcp_connection_legacy.c"
-#include "tcp_server_mst_legacy.c"
-#include "tcp_server_legacy.c"
-#include "tcp_service_legacy.c"
-
-GNUNET_NETWORK_STRUCT_BEGIN
-
-/**
- * Initial handshake message for a session.
- */
-struct WelcomeMessage
-{
-  /**
-   * Type is #GNUNET_MESSAGE_TYPE_TRANSPORT_TCP_WELCOME.
-   */
-  struct GNUNET_MessageHeader header;
-
-  /**
-   * Identity of the node connecting (TCP client)
-   */
-  struct GNUNET_PeerIdentity clientIdentity;
-
-};
-
-/**
- * Basically a WELCOME message, but with the purpose
- * of giving the waiting peer a client handle to use
- */
-struct TCP_NAT_ProbeMessage
-{
-  /**
-   * Type is #GNUNET_MESSAGE_TYPE_TRANSPORT_TCP_NAT_PROBE.
-   */
-  struct GNUNET_MessageHeader header;
-
-  /**
-   * Identity of the sender of the message.
-   */
-  struct GNUNET_PeerIdentity clientIdentity;
-
-};
-GNUNET_NETWORK_STRUCT_END
-
-/**
- * Context for sending a NAT probe via TCP.
- */
-struct TCPProbeContext
-{
-
-  /**
-   * Active probes are kept in a DLL.
-   */
-  struct TCPProbeContext *next;
-
-  /**
-   * Active probes are kept in a DLL.
-   */
-  struct TCPProbeContext *prev;
-
-  /**
-   * Probe connection.
-   */
-  struct GNUNET_CONNECTION_Handle *sock;
-
-  /**
-   * Message to be sent.
-   */
-  struct TCP_NAT_ProbeMessage message;
-
-  /**
-   * Handle to the transmission.
-   */
-  struct GNUNET_CONNECTION_TransmitHandle *transmit_handle;
-
-  /**
-   * Transport plugin handle.
-   */
-  struct Plugin *plugin;
-};
-
-/**
- * Bits in the `options` field of TCP addresses.
- */
-enum TcpAddressOptions
-{
-
-  /**
-   * No bits set.
-   */
-  TCP_OPTIONS_NONE = 0,
-
-  /**
-   * See #HTTP_OPTIONS_VERIFY_CERTIFICATE.
-   */
-  TCP_OPTIONS_RESERVED = 1,
-
-  /**
-   * Enable TCP Stealth-style port knocking.
-   */
-  TCP_OPTIONS_TCP_STEALTH = 2
-};
-
-GNUNET_NETWORK_STRUCT_BEGIN
-
-/**
- * Network format for IPv4 addresses.
- */
-struct IPv4TcpAddress
-{
-  /**
-   * Optional options and flags for this address,
-   * see `enum TcpAddressOptions`
-   */
-  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 t4_port GNUNET_PACKED;
-
-};
-
-/**
- * Network format for IPv6 addresses.
- */
-struct IPv6TcpAddress
-{
-  /**
-   * Optional flags for this address
-   * see `enum TcpAddressOptions`
-   */
-  uint32_t options GNUNET_PACKED;
-
-  /**
-   * IPv6 address.
-   */
-  struct in6_addr ipv6_addr GNUNET_PACKED;
-
-  /**
-   * Port number, in network byte order.
-   */
-  uint16_t t6_port GNUNET_PACKED;
-
-};
-GNUNET_NETWORK_STRUCT_END
-
-/**
- * Encapsulation of all of the state of the plugin.
- */
-struct Plugin;
-
-/**
- * Information kept for each message that is yet to
- * be transmitted.
- */
-struct PendingMessage
-{
-
-  /**
-   * This is a doubly-linked list.
-   */
-  struct PendingMessage *next;
-
-  /**
-   * This is a doubly-linked list.
-   */
-  struct PendingMessage *prev;
-
-  /**
-   * The pending message
-   */
-  const char *msg;
-
-  /**
-   * Continuation function to call once the message
-   * has been sent.  Can be NULL if there is no
-   * continuation to call.
-   */
-  GNUNET_TRANSPORT_TransmitContinuation transmit_cont;
-
-  /**
-   * Closure for @e transmit_cont.
-   */
-  void *transmit_cont_cls;
-
-  /**
-   * Timeout value for the pending message.
-   */
-  struct GNUNET_TIME_Absolute timeout;
-
-  /**
-   * So that the gnunet-service-transport can group messages together,
-   * these pending messages need to accept a message buffer and size
-   * instead of just a `struct GNUNET_MessageHeader`.
-   */
-  size_t message_size;
-
-};
-
-/**
- * Session handle for TCP connections.
- */
-struct GNUNET_ATS_Session
-{
-  /**
-   * To whom are we talking to (set to our identity
-   * if we are still waiting for the welcome message)
-   */
-  struct GNUNET_PeerIdentity target;
-
-  /**
-   * Pointer to the global plugin struct.
-   */
-  struct Plugin *plugin;
-
-  /**
-   * The client (used to identify this connection)
-   */
-  struct GNUNET_SERVER_Client *client;
-
-  /**
-   * Task cleaning up a NAT client connection establishment attempt;
-   */
-  struct GNUNET_SCHEDULER_Task *nat_connection_timeout;
-
-  /**
-   * Messages currently pending for transmission
-   * to this peer, if any.
-   */
-  struct PendingMessage *pending_messages_head;
-
-  /**
-   * Messages currently pending for transmission
-   * to this peer, if any.
-   */
-  struct PendingMessage *pending_messages_tail;
-
-  /**
-   * Handle for pending transmission request.
-   */
-  struct GNUNET_SERVER_TransmitHandle *transmit_handle;
-
-  /**
-   * Address of the other peer.
-   */
-  struct GNUNET_HELLO_Address *address;
-
-  /**
-   * ID of task used to delay receiving more to throttle sender.
-   */
-  struct GNUNET_SCHEDULER_Task *receive_delay_task;
-
-  /**
-   * Session timeout task
-   */
-  struct GNUNET_SCHEDULER_Task *timeout_task;
-
-  /**
-   * When will this session time out?
-   */
-  struct GNUNET_TIME_Absolute timeout;
-
-  /**
-   * When will we continue to read from the socket?
-   * (used to enforce inbound quota).
-   */
-  struct GNUNET_TIME_Absolute receive_delay;
-
-  /**
-   * Last activity on this connection.  Used to select preferred
-   * connection.
-   */
-  struct GNUNET_TIME_Absolute last_activity;
-
-  /**
-   * Number of bytes waiting for transmission to this peer.
-   */
-  unsigned long long bytes_in_queue;
-
-  /**
-   * Number of messages waiting for transmission to this peer.
-   */
-  unsigned int msgs_in_queue;
-
-  /**
-   * Network type of the address.
-   */
-  enum GNUNET_NetworkType scope;
-
-  /**
-   * Are we still expecting the welcome message? (#GNUNET_YES/#GNUNET_NO)
-   */
-  int expecting_welcome;
-
-  /**
-   * Was this session created using NAT traversal?
-   */
-  int is_nat;
-
-};
-
-
-/**
- * Context for address to string conversion, closure
- * for #append_port().
- */
-struct PrettyPrinterContext
-{
-  /**
-   * DLL
-   */
-  struct PrettyPrinterContext *next;
-
-  /**
-   * DLL
-   */
-  struct PrettyPrinterContext *prev;
-
-  /**
-   * Our plugin.
-   */
-  struct Plugin *plugin;
-
-  /**
-   * Timeout task
-   */
-  struct GNUNET_SCHEDULER_Task *timeout_task;
-
-  /**
-   * Resolver handle
-   */
-  struct GNUNET_RESOLVER_RequestHandle *resolver_handle;
-
-  /**
-   * Function to call with the result.
-   */
-  GNUNET_TRANSPORT_AddressStringCallback asc;
-
-  /**
-   * Clsoure for @e asc.
-   */
-  void *asc_cls;
-
-  /**
-   * IPv6 address
-   */
-  int ipv6;
-
-  /**
-   * Options
-   */
-  uint32_t options;
-
-  /**
-   * Port to add after the IP address.
-   */
-  uint16_t port;
-};
-
-
-/**
- * Encapsulation of all of the state of the plugin.
- */
-struct Plugin
-{
-  /**
-   * Our environment.
-   */
-  struct GNUNET_TRANSPORT_PluginEnvironment *env;
-
-  /**
-   * The listen socket.
-   */
-  struct GNUNET_CONNECTION_Handle *lsock;
-
-  /**
-   * Our handle to the NAT module.
-   */
-  struct GNUNET_NAT_Handle *nat;
-
-  /**
-   * Map from peer identities to sessions for the given peer.
-   */
-  struct GNUNET_CONTAINER_MultiPeerMap *sessionmap;
-
-  /**
-   * Handle to the network service.
-   */
-  struct LEGACY_SERVICE_Context *service;
-
-  /**
-   * Handle to the server for this service.
-   */
-  struct GNUNET_SERVER_Handle *server;
-
-  /**
-   * Copy of the handler array where the closures are
-   * set to this struct's instance.
-   */
-  struct GNUNET_SERVER_MessageHandler *handlers;
-
-  /**
-   * Map of peers we have tried to contact behind a NAT
-   */
-  struct GNUNET_CONTAINER_MultiPeerMap *nat_wait_conns;
-
-  /**
-   * List of active TCP probes.
-   */
-  struct TCPProbeContext *probe_head;
-
-  /**
-   * List of active TCP probes.
-   */
-  struct TCPProbeContext *probe_tail;
-
-  /**
-   * Function to call about session status changes.
-   */
-  GNUNET_TRANSPORT_SessionInfoCallback sic;
-
-  /**
-   * Closure for @e sic.
-   */
-  void *sic_cls;
-
-  /**
-   * ID of task used to update our addresses when one expires.
-   */
-  struct GNUNET_SCHEDULER_Task *address_update_task;
-
-  /**
-   * Running pretty printers: head
-   */
-  struct PrettyPrinterContext *ppc_dll_head;
-
-  /**
-   * Running pretty printers: tail
-   */
-  struct PrettyPrinterContext *ppc_dll_tail;
-
-  /**
-   * Welcome message used by this peer.
-   */
-  struct WelcomeMessage my_welcome;
-
-  /**
-   * How many more TCP sessions are we allowed to open right now?
-   */
-  unsigned long long max_connections;
-
-  /**
-   * How many more TCP sessions do we have right now?
-   */
-  unsigned long long cur_connections;
-
-  /**
-   * Address options
-   */
-  uint32_t myoptions;
-
-  /**
-   * Port that we are actually listening on.
-   */
-  uint16_t open_port;
-
-  /**
-   * Port that the user said we would have visible to the
-   * rest of the world.
-   */
-  uint16_t adv_port;
-
-};
-
-
-/**
- * Get the list of addresses that a server for the given service
- * should bind to.
- *
- * @param service_name name of the service
- * @param cfg configuration (which specifies the addresses)
- * @param addrs set (call by reference) to an array of pointers to the
- *              addresses the server should bind to and listen on; the
- *              array will be NULL-terminated (on success)
- * @param addr_lens set (call by reference) to an array of the lengths
- *              of the respective `struct sockaddr` struct in the @a addrs
- *              array (on success)
- * @return number of addresses found on success,
- *              #GNUNET_SYSERR if the configuration
- *              did not specify reasonable finding information or
- *              if it specified a hostname that could not be resolved;
- *              #GNUNET_NO if the number of addresses configured is
- *              zero (in this case, `*addrs` and `*addr_lens` will be
- *              set to NULL).
- */
-static int
-get_server_addresses (const char *service_name,
-		      const struct GNUNET_CONFIGURATION_Handle *cfg,
-		      struct sockaddr ***addrs,
-		      socklen_t ** addr_lens)
-{
-  int disablev6;
-  struct GNUNET_NETWORK_Handle *desc;
-  unsigned long long port;
-  char *unixpath;
-  struct addrinfo hints;
-  struct addrinfo *res;
-  struct addrinfo *pos;
-  struct addrinfo *next;
-  unsigned int i;
-  int resi;
-  int ret;
-  int abstract;
-  struct sockaddr **saddrs;
-  socklen_t *saddrlens;
-  char *hostname;
-
-  *addrs = NULL;
-  *addr_lens = NULL;
-  desc = NULL;
-  if (GNUNET_CONFIGURATION_have_value (cfg, service_name, "DISABLEV6"))
-  {
-    if (GNUNET_SYSERR ==
-        (disablev6 =
-         GNUNET_CONFIGURATION_get_value_yesno (cfg, service_name, "DISABLEV6")))
-      return GNUNET_SYSERR;
-  }
-  else
-    disablev6 = GNUNET_NO;
-
-  if (! disablev6)
-  {
-    /* probe IPv6 support */
-    desc = GNUNET_NETWORK_socket_create (PF_INET6, SOCK_STREAM, 0);
-    if (NULL == desc)
-    {
-      if ((ENOBUFS == errno) || (ENOMEM == errno) || (ENFILE == errno) ||
-          (EACCES == errno))
-      {
-        GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "socket");
-        return GNUNET_SYSERR;
-      }
-      LOG (GNUNET_ERROR_TYPE_INFO,
-           _("Disabling IPv6 support for service `%s', failed to create IPv6 socket: %s\n"),
-           service_name, STRERROR (errno));
-      disablev6 = GNUNET_YES;
-    }
-    else
-    {
-      GNUNET_break (GNUNET_OK == GNUNET_NETWORK_socket_close (desc));
-      desc = NULL;
-    }
-  }
-
-  port = 0;
-  if (GNUNET_CONFIGURATION_have_value (cfg, service_name, "PORT"))
-  {
-    if (GNUNET_OK !=
-	GNUNET_CONFIGURATION_get_value_number (cfg, service_name,
-					       "PORT", &port))
-    {
-      LOG (GNUNET_ERROR_TYPE_ERROR,
-           _("Require valid port number for service `%s' in configuration!\n"),
-           service_name);
-    }
-    if (port > 65535)
-    {
-      LOG (GNUNET_ERROR_TYPE_ERROR,
-           _("Require valid port number for service `%s' in configuration!\n"),
-           service_name);
-      return GNUNET_SYSERR;
-    }
-  }
-
-  if (GNUNET_CONFIGURATION_have_value (cfg, service_name, "BINDTO"))
-  {
-    GNUNET_break (GNUNET_OK ==
-                  GNUNET_CONFIGURATION_get_value_string (cfg, service_name,
-                                                         "BINDTO", &hostname));
-  }
-  else
-    hostname = NULL;
-
-  unixpath = NULL;
-  abstract = GNUNET_NO;
-#ifdef AF_UNIX
-  if ((GNUNET_YES ==
-       GNUNET_CONFIGURATION_have_value (cfg, service_name, "UNIXPATH")) &&
-      (GNUNET_OK ==
-       GNUNET_CONFIGURATION_get_value_filename (cfg, service_name, "UNIXPATH",
-                                              &unixpath)) &&
-      (0 < strlen (unixpath)))
-  {
-    /* probe UNIX support */
-    struct sockaddr_un s_un;
-
-    if (strlen (unixpath) >= sizeof (s_un.sun_path))
-    {
-      LOG (GNUNET_ERROR_TYPE_WARNING,
-           _("UNIXPATH `%s' too long, maximum length is %llu\n"), unixpath,
-           (unsigned long long) sizeof (s_un.sun_path));
-      unixpath = GNUNET_NETWORK_shorten_unixpath (unixpath);
-      LOG (GNUNET_ERROR_TYPE_INFO,
-	   _("Using `%s' instead\n"),
-           unixpath);
-    }
-#ifdef LINUX
-    abstract = GNUNET_CONFIGURATION_get_value_yesno (cfg,
-                                                     "TESTING",
-                                                     "USE_ABSTRACT_SOCKETS");
-    if (GNUNET_SYSERR == abstract)
-      abstract = GNUNET_NO;
-#endif
-    if ((GNUNET_YES != abstract)
-        && (GNUNET_OK !=
-            GNUNET_DISK_directory_create_for_file (unixpath)))
-      GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR,
-				"mkdir",
-				unixpath);
-  }
-  if (NULL != unixpath)
-  {
-    desc = GNUNET_NETWORK_socket_create (AF_UNIX, SOCK_STREAM, 0);
-    if (NULL == desc)
-    {
-      if ((ENOBUFS == errno) || (ENOMEM == errno) || (ENFILE == errno) ||
-          (EACCES == errno))
-      {
-        GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "socket");
-        GNUNET_free_non_null (hostname);
-        GNUNET_free (unixpath);
-        return GNUNET_SYSERR;
-      }
-      LOG (GNUNET_ERROR_TYPE_INFO,
-           _("Disabling UNIX domain socket support for service `%s', failed to create UNIX domain socket: %s\n"),
-           service_name,
-           STRERROR (errno));
-      GNUNET_free (unixpath);
-      unixpath = NULL;
-    }
-    else
-    {
-      GNUNET_break (GNUNET_OK == GNUNET_NETWORK_socket_close (desc));
-      desc = NULL;
-    }
-  }
-#endif
-
-  if ((0 == port) && (NULL == unixpath))
-  {
-    LOG (GNUNET_ERROR_TYPE_ERROR,
-         _("Have neither PORT nor UNIXPATH for service `%s', but one is required\n"),
-         service_name);
-    GNUNET_free_non_null (hostname);
-    return GNUNET_SYSERR;
-  }
-  if (0 == port)
-  {
-    saddrs = GNUNET_malloc (2 * sizeof (struct sockaddr *));
-    saddrlens = GNUNET_malloc (2 * sizeof (socklen_t));
-    add_unixpath (saddrs, saddrlens, unixpath, abstract);
-    GNUNET_free_non_null (unixpath);
-    GNUNET_free_non_null (hostname);
-    *addrs = saddrs;
-    *addr_lens = saddrlens;
-    return 1;
-  }
-
-  if (NULL != hostname)
-  {
-    LOG (GNUNET_ERROR_TYPE_DEBUG,
-         "Resolving `%s' since that is where `%s' will bind to.\n",
-         hostname,
-         service_name);
-    memset (&hints, 0, sizeof (struct addrinfo));
-    if (disablev6)
-      hints.ai_family = AF_INET;
-    hints.ai_protocol = IPPROTO_TCP;
-    if ((0 != (ret = getaddrinfo (hostname, NULL, &hints, &res))) ||
-        (NULL == res))
-    {
-      LOG (GNUNET_ERROR_TYPE_ERROR,
-           _("Failed to resolve `%s': %s\n"),
-           hostname,
-           gai_strerror (ret));
-      GNUNET_free (hostname);
-      GNUNET_free_non_null (unixpath);
-      return GNUNET_SYSERR;
-    }
-    next = res;
-    i = 0;
-    while (NULL != (pos = next))
-    {
-      next = pos->ai_next;
-      if ((disablev6) && (pos->ai_family == AF_INET6))
-        continue;
-      i++;
-    }
-    if (0 == i)
-    {
-      LOG (GNUNET_ERROR_TYPE_ERROR,
-           _("Failed to find %saddress for `%s'.\n"),
-           disablev6 ? "IPv4 " : "",
-           hostname);
-      freeaddrinfo (res);
-      GNUNET_free (hostname);
-      GNUNET_free_non_null (unixpath);
-      return GNUNET_SYSERR;
-    }
-    resi = i;
-    if (NULL != unixpath)
-      resi++;
-    saddrs = GNUNET_malloc ((resi + 1) * sizeof (struct sockaddr *));
-    saddrlens = GNUNET_malloc ((resi + 1) * sizeof (socklen_t));
-    i = 0;
-    if (NULL != unixpath)
-    {
-      add_unixpath (saddrs, saddrlens, unixpath, abstract);
-      i++;
-    }
-    next = res;
-    while (NULL != (pos = next))
-    {
-      next = pos->ai_next;
-      if ((disablev6) && (AF_INET6 == pos->ai_family))
-        continue;
-      if ((IPPROTO_TCP != pos->ai_protocol) && (0 != pos->ai_protocol))
-        continue;               /* not TCP */
-      if ((SOCK_STREAM != pos->ai_socktype) && (0 != pos->ai_socktype))
-        continue;               /* huh? */
-      LOG (GNUNET_ERROR_TYPE_DEBUG, "Service `%s' will bind to `%s'\n",
-           service_name, GNUNET_a2s (pos->ai_addr, pos->ai_addrlen));
-      if (AF_INET == pos->ai_family)
-      {
-        GNUNET_assert (sizeof (struct sockaddr_in) == pos->ai_addrlen);
-        saddrlens[i] = pos->ai_addrlen;
-        saddrs[i] = GNUNET_malloc (saddrlens[i]);
-        GNUNET_memcpy (saddrs[i], pos->ai_addr, saddrlens[i]);
-        ((struct sockaddr_in *) saddrs[i])->sin_port = htons (port);
-      }
-      else
-      {
-        GNUNET_assert (AF_INET6 == pos->ai_family);
-        GNUNET_assert (sizeof (struct sockaddr_in6) == pos->ai_addrlen);
-        saddrlens[i] = pos->ai_addrlen;
-        saddrs[i] = GNUNET_malloc (saddrlens[i]);
-        GNUNET_memcpy (saddrs[i], pos->ai_addr, saddrlens[i]);
-        ((struct sockaddr_in6 *) saddrs[i])->sin6_port = htons (port);
-      }
-      i++;
-    }
-    GNUNET_free (hostname);
-    freeaddrinfo (res);
-    resi = i;
-  }
-  else
-  {
-    /* will bind against everything, just set port */
-    if (disablev6)
-    {
-      /* V4-only */
-      resi = 1;
-      if (NULL != unixpath)
-        resi++;
-      i = 0;
-      saddrs = GNUNET_malloc ((resi + 1) * sizeof (struct sockaddr *));
-      saddrlens = GNUNET_malloc ((resi + 1) * sizeof (socklen_t));
-      if (NULL != unixpath)
-      {
-        add_unixpath (saddrs, saddrlens, unixpath, abstract);
-        i++;
-      }
-      saddrlens[i] = sizeof (struct sockaddr_in);
-      saddrs[i] = GNUNET_malloc (saddrlens[i]);
-#if HAVE_SOCKADDR_IN_SIN_LEN
-      ((struct sockaddr_in *) saddrs[i])->sin_len = saddrlens[i];
-#endif
-      ((struct sockaddr_in *) saddrs[i])->sin_family = AF_INET;
-      ((struct sockaddr_in *) saddrs[i])->sin_port = htons (port);
-    }
-    else
-    {
-      /* dual stack */
-      resi = 2;
-      if (NULL != unixpath)
-        resi++;
-      saddrs = GNUNET_malloc ((resi + 1) * sizeof (struct sockaddr *));
-      saddrlens = GNUNET_malloc ((resi + 1) * sizeof (socklen_t));
-      i = 0;
-      if (NULL != unixpath)
-      {
-        add_unixpath (saddrs, saddrlens, unixpath, abstract);
-        i++;
-      }
-      saddrlens[i] = sizeof (struct sockaddr_in6);
-      saddrs[i] = GNUNET_malloc (saddrlens[i]);
-#if HAVE_SOCKADDR_IN_SIN_LEN
-      ((struct sockaddr_in6 *) saddrs[i])->sin6_len = saddrlens[0];
-#endif
-      ((struct sockaddr_in6 *) saddrs[i])->sin6_family = AF_INET6;
-      ((struct sockaddr_in6 *) saddrs[i])->sin6_port = htons (port);
-      i++;
-      saddrlens[i] = sizeof (struct sockaddr_in);
-      saddrs[i] = GNUNET_malloc (saddrlens[i]);
-#if HAVE_SOCKADDR_IN_SIN_LEN
-      ((struct sockaddr_in *) saddrs[i])->sin_len = saddrlens[1];
-#endif
-      ((struct sockaddr_in *) saddrs[i])->sin_family = AF_INET;
-      ((struct sockaddr_in *) saddrs[i])->sin_port = htons (port);
-    }
-  }
-  GNUNET_free_non_null (unixpath);
-  *addrs = saddrs;
-  *addr_lens = saddrlens;
-  return resi;
-}
-/* end ancient copy-and-paste */
-
-
-/**
- * If a session monitor is attached, notify it about the new
- * session state.
- *
- * @param plugin our plugin
- * @param session session that changed state
- * @param state new state of the session
- */
-static void
-notify_session_monitor (struct Plugin *plugin,
-                        struct GNUNET_ATS_Session *session,
-                        enum GNUNET_TRANSPORT_SessionState state)
-{
-  struct GNUNET_TRANSPORT_SessionInfo info;
-
-  if (NULL == plugin->sic)
-    return;
-  memset (&info, 0, sizeof (info));
-  info.state = state;
-  info.is_inbound = GNUNET_HELLO_address_check_option (session->address,
-                                         GNUNET_HELLO_ADDRESS_INFO_INBOUND);
-  info.num_msg_pending = session->msgs_in_queue;
-  info.num_bytes_pending = session->bytes_in_queue;
-  if (NULL != session->receive_delay_task)
-    info.receive_delay = session->receive_delay;
-  info.session_timeout = session->timeout;
-  info.address = session->address;
-  plugin->sic (plugin->sic_cls,
-               session,
-               &info);
-}
-
-
-/**
- * Our external IP address/port mapping has changed.
- *
- * @param cls closure, the `struct Plugin`
- * @param add_remove #GNUNET_YES to mean the new public IP address, #GNUNET_NO to mean
- *     the previous (now invalid) one
- * @param ac address class the address belongs to
- * @param addr either the previous or the new public IP address
- * @param addrlen actual length of @a addr
- */
-static void
-tcp_nat_port_map_callback (void *cls,
-                           int add_remove,
-			   enum GNUNET_NAT_AddressClass ac,
-			   const struct sockaddr *addr,
-                           socklen_t addrlen)
-{
-  struct Plugin *plugin = cls;
-  struct GNUNET_HELLO_Address *address;
-  struct IPv4TcpAddress t4;
-  struct IPv6TcpAddress t6;
-  void *arg;
-  size_t args;
-
-  if (GNUNET_NAT_AC_LOOPBACK == ac)
-    return;
-  if (GNUNET_NAT_AC_LAN == ac)
-    return;
-  if (GNUNET_NAT_AC_LAN_PRIVATE == ac)
-    return;
-  LOG (GNUNET_ERROR_TYPE_INFO,
-       "NAT notification to %s address `%s'\n",
-       (GNUNET_YES == add_remove) ? "add" : "remove",
-       GNUNET_a2s (addr, addrlen));
-  /* convert 'addr' to our internal format */
-  switch (addr->sa_family)
-  {
-  case AF_INET:
-    GNUNET_assert(addrlen == sizeof(struct sockaddr_in));
-    memset (&t4, 0, sizeof(t4));
-    t4.options = htonl (plugin->myoptions);
-    t4.ipv4_addr = ((struct sockaddr_in *) addr)->sin_addr.s_addr;
-    t4.t4_port = ((struct sockaddr_in *) addr)->sin_port;
-    arg = &t4;
-    args = sizeof (t4);
-    break;
-  case AF_INET6:
-    GNUNET_assert(addrlen == sizeof(struct sockaddr_in6));
-    memset (&t6, 0, sizeof(t6));
-    GNUNET_memcpy (&t6.ipv6_addr,
-		   &((struct sockaddr_in6 *) addr)->sin6_addr,
-		   sizeof(struct in6_addr));
-    t6.options = htonl (plugin->myoptions);
-    t6.t6_port = ((struct sockaddr_in6 *) addr)->sin6_port;
-    arg = &t6;
-    args = sizeof (t6);
-    break;
-  default:
-    GNUNET_break(0);
-    return;
-  }
-  /* modify our published address list */
-  GNUNET_assert ((args == sizeof (struct IPv4TcpAddress)) ||
-		 (args == sizeof (struct IPv6TcpAddress)));
-  /* TODO: use 'ac' here in the future... */
-  address = GNUNET_HELLO_address_allocate (plugin->env->my_identity,
-					   PLUGIN_NAME,
-					   arg,
-					   args,
-					   GNUNET_HELLO_ADDRESS_INFO_NONE);
-  plugin->env->notify_address (plugin->env->cls,
-			       add_remove,
-			       address);
-  GNUNET_HELLO_address_free (address);
-}
-
-
-/**
- * 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 (`struct Plugin*`)
- * @param addr binary address
- * @param addrlen length of @a addr
- * @return string representing the same address
- */
-static const char *
-tcp_plugin_address_to_string (void *cls,
-                              const void *addr,
-                              size_t addrlen)
-{
-  static char rbuf[INET6_ADDRSTRLEN + 12];
-  char buf[INET6_ADDRSTRLEN];
-  const void *sb;
-  struct in_addr a4;
-  struct in6_addr a6;
-  const struct IPv4TcpAddress *t4;
-  const struct IPv6TcpAddress *t6;
-  int af;
-  uint16_t port;
-  uint32_t options;
-
-  switch (addrlen)
-  {
-  case sizeof(struct IPv6TcpAddress):
-    t6 = addr;
-    af = AF_INET6;
-    port = ntohs (t6->t6_port);
-    options = ntohl (t6->options);
-    GNUNET_memcpy (&a6, &t6->ipv6_addr, sizeof(a6));
-    sb = &a6;
-    break;
-  case sizeof(struct IPv4TcpAddress):
-    t4 = addr;
-    af = AF_INET;
-    port = ntohs (t4->t4_port);
-    options = ntohl (t4->options);
-    GNUNET_memcpy (&a4, &t4->ipv4_addr, sizeof(a4));
-    sb = &a4;
-    break;
-  default:
-    LOG (GNUNET_ERROR_TYPE_WARNING,
-         _("Unexpected address length: %u bytes\n"),
-         (unsigned int) addrlen);
-    return NULL ;
-  }
-  if (NULL == inet_ntop (af, sb, buf, INET6_ADDRSTRLEN))
-  {
-    GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING,
-                         "inet_ntop");
-    return NULL ;
-  }
-  GNUNET_snprintf (rbuf, sizeof(rbuf),
-                   (af == AF_INET6) ? "%s.%u.[%s]:%u" : "%s.%u.%s:%u",
-                   PLUGIN_NAME,
-                   options,
-                   buf,
-                   port);
-  return rbuf;
-}
-
-
-/**
- * Function called to convert a string address to
- * a binary address.
- *
- * @param cls closure (`struct Plugin*`)
- * @param addr string address
- * @param addrlen length of the address
- * @param buf location to store the buffer
- * @param added location to store the number of bytes in the buffer.
- *        If the function returns #GNUNET_SYSERR, its contents are undefined.
- * @return #GNUNET_OK on success, #GNUNET_SYSERR on failure
- */
-static int
-tcp_plugin_string_to_address (void *cls,
-                              const char *addr,
-                              uint16_t addrlen,
-                              void **buf,
-                              size_t *added)
-{
-  struct sockaddr_storage socket_address;
-  char *address;
-  char *plugin;
-  char *optionstr;
-  uint32_t options;
-
-  /* Format tcp.options.address:port */
-  address = NULL;
-  plugin = NULL;
-  optionstr = NULL;
-  if ((NULL == addr) || (0 == addrlen))
-  {
-    GNUNET_break(0);
-    return GNUNET_SYSERR;
-  }
-  if ('\0' != addr[addrlen - 1])
-  {
-    GNUNET_break(0);
-    return GNUNET_SYSERR;
-  }
-  if (strlen (addr) != addrlen - 1)
-  {
-    GNUNET_break(0);
-    return GNUNET_SYSERR;
-  }
-  plugin = GNUNET_strdup (addr);
-  optionstr = strchr (plugin, '.');
-  if (NULL == optionstr)
-  {
-    GNUNET_break(0);
-    GNUNET_free(plugin);
-    return GNUNET_SYSERR;
-  }
-  optionstr[0] = '\0';
-  optionstr++;
-  options = atol (optionstr);
-  address = strchr (optionstr, '.');
-  if (NULL == address)
-  {
-    GNUNET_break(0);
-    GNUNET_free(plugin);
-    return GNUNET_SYSERR;
-  }
-  address[0] = '\0';
-  address++;
-
-  if (GNUNET_OK !=
-      GNUNET_STRINGS_to_address_ip (address,
-				    strlen (address),
-				    &socket_address))
-  {
-    GNUNET_break(0);
-    GNUNET_free(plugin);
-    return GNUNET_SYSERR;
-  }
-
-  GNUNET_free(plugin);
-  switch (socket_address.ss_family)
-  {
-  case AF_INET:
-  {
-    struct IPv4TcpAddress *t4;
-    struct sockaddr_in *in4 = (struct sockaddr_in *) &socket_address;
-    t4 = GNUNET_new (struct IPv4TcpAddress);
-    t4->options = htonl (options);
-    t4->ipv4_addr = in4->sin_addr.s_addr;
-    t4->t4_port = in4->sin_port;
-    *buf = t4;
-    *added = sizeof(struct IPv4TcpAddress);
-    return GNUNET_OK;
-  }
-  case AF_INET6:
-  {
-    struct IPv6TcpAddress *t6;
-    struct sockaddr_in6 *in6 = (struct sockaddr_in6 *) &socket_address;
-    t6 = GNUNET_new (struct IPv6TcpAddress);
-    t6->options = htonl (options);
-    t6->ipv6_addr = in6->sin6_addr;
-    t6->t6_port = in6->sin6_port;
-    *buf = t6;
-    *added = sizeof(struct IPv6TcpAddress);
-    return GNUNET_OK;
-  }
-  default:
-    return GNUNET_SYSERR;
-  }
-}
-
-
-/**
- * Find the session handle for the given client.
- * Currently uses both the hashmap and the client
- * context, as the client context is new and the
- * logic still needs to be tested.
- *
- * @param plugin the plugin
- * @param client which client to find the session handle for
- * @return NULL if no matching session exists
- */
-static struct GNUNET_ATS_Session *
-lookup_session_by_client (struct Plugin *plugin,
-                          struct GNUNET_SERVER_Client *client)
-{
-  return GNUNET_SERVER_client_get_user_context (client,
-                                                struct GNUNET_ATS_Session);
-}
-
-
-/**
- * Functions with this signature are called whenever we need
- * to close a session due to a disconnect or failure to
- * establish a connection.
- *
- * @param cls the `struct Plugin`
- * @param session session to close down
- * @return #GNUNET_OK on success
- */
-static int
-tcp_plugin_disconnect_session (void *cls,
-                               struct GNUNET_ATS_Session *session)
-{
-  struct Plugin *plugin = cls;
-  struct PendingMessage *pm;
-
-  LOG (GNUNET_ERROR_TYPE_DEBUG,
-       "Disconnecting session of peer `%s' address `%s'\n",
-       GNUNET_i2s (&session->target),
-       tcp_plugin_address_to_string (session->plugin,
-                                     session->address->address,
-                                     session->address->address_length));
-
-  if (NULL != session->timeout_task)
-  {
-    GNUNET_SCHEDULER_cancel (session->timeout_task);
-    session->timeout_task = NULL;
-    session->timeout = GNUNET_TIME_UNIT_ZERO_ABS;
-  }
-
-  if (GNUNET_YES ==
-      GNUNET_CONTAINER_multipeermap_remove (plugin->sessionmap,
-                                            &session->target,
-                                            session))
-  {
-    GNUNET_STATISTICS_update (session->plugin->env->stats,
-			      gettext_noop ("# TCP sessions active"),
-			      -1,
-			      GNUNET_NO);
-  }
-  else
-  {
-    GNUNET_assert (GNUNET_YES ==
-		   GNUNET_CONTAINER_multipeermap_remove (plugin->nat_wait_conns,
-							 &session->target,
-							 session));
-  }
-  if (NULL != session->client)
-    GNUNET_SERVER_client_set_user_context (session->client,
-                                           NULL);
-
-  /* clean up state */
-  if (NULL != session->transmit_handle)
-  {
-    GNUNET_SERVER_notify_transmit_ready_cancel (session->transmit_handle);
-    session->transmit_handle = NULL;
-  }
-  session->plugin->env->session_end (session->plugin->env->cls,
-                                     session->address,
-                                     session);
-
-  if (NULL != session->nat_connection_timeout)
-  {
-    GNUNET_SCHEDULER_cancel (session->nat_connection_timeout);
-    session->nat_connection_timeout = NULL;
-  }
-
-  while (NULL != (pm = session->pending_messages_head))
-  {
-    LOG (GNUNET_ERROR_TYPE_DEBUG,
-         (NULL != pm->transmit_cont)
-         ? "Could not deliver message to `%s' at %s.\n"
-         : "Could not deliver message to `%s' at %s, notifying.\n",
-         GNUNET_i2s (&session->target),
-         tcp_plugin_address_to_string (session->plugin,
-                                       session->address->address,
-                                       session->address->address_length));
-    GNUNET_STATISTICS_update (session->plugin->env->stats,
-                              gettext_noop ("# bytes currently in TCP buffers"),
-                              -(int64_t) pm->message_size, GNUNET_NO);
-    GNUNET_STATISTICS_update (session->plugin->env->stats,
-                              gettext_noop ("# bytes discarded by TCP (disconnect)"),
-                              pm->message_size,
-                              GNUNET_NO);
-    GNUNET_CONTAINER_DLL_remove (session->pending_messages_head,
-                                 session->pending_messages_tail,
-                                 pm);
-    GNUNET_assert (0 < session->msgs_in_queue);
-    session->msgs_in_queue--;
-    GNUNET_assert (pm->message_size <= session->bytes_in_queue);
-    session->bytes_in_queue -= pm->message_size;
-    if (NULL != pm->transmit_cont)
-      pm->transmit_cont (pm->transmit_cont_cls,
-                         &session->target,
-                         GNUNET_SYSERR,
-                         pm->message_size,
-                         0);
-    GNUNET_free (pm);
-  }
-  GNUNET_assert (0 == session->msgs_in_queue);
-  GNUNET_assert (0 == session->bytes_in_queue);
-  notify_session_monitor (session->plugin,
-                          session,
-                          GNUNET_TRANSPORT_SS_DONE);
-
-  if (NULL != session->receive_delay_task)
-  {
-    GNUNET_SCHEDULER_cancel (session->receive_delay_task);
-    session->receive_delay_task = NULL;
-  }
-  if (NULL != session->client)
-  {
-    GNUNET_SERVER_client_disconnect (session->client);
-    session->client = NULL;
-  }
-  GNUNET_HELLO_address_free (session->address);
-  GNUNET_assert (NULL == session->transmit_handle);
-  GNUNET_free (session);
-  return GNUNET_OK;
-}
-
-
-/**
- * Function that is called to get the keepalive factor.
- * #GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT is divided by this number to
- * calculate the interval between keepalive packets.
- *
- * @param cls closure with the `struct Plugin`
- * @return keepalive factor
- */
-static unsigned int
-tcp_plugin_query_keepalive_factor (void *cls)
-{
-  return 3;
-}
-
-
-/**
- * Session was idle for too long, so disconnect it
- *
- * @param cls the `struct GNUNET_ATS_Session` of the idle session
- */
-static void
-session_timeout (void *cls)
-{
-  struct GNUNET_ATS_Session *s = cls;
-  struct GNUNET_TIME_Relative left;
-
-  s->timeout_task = NULL;
-  left = GNUNET_TIME_absolute_get_remaining (s->timeout);
-  if (0 != left.rel_value_us)
-  {
-    /* not actually our turn yet, but let's at least update
-       the monitor, it may think we're about to die ... */
-    notify_session_monitor (s->plugin,
-                            s,
-                            GNUNET_TRANSPORT_SS_UPDATE);
-    s->timeout_task = GNUNET_SCHEDULER_add_delayed (left,
-                                                    &session_timeout,
-                                                    s);
-    return;
-  }
-  LOG (GNUNET_ERROR_TYPE_DEBUG,
-       "Session %p was idle for %s, disconnecting\n",
-       s,
-       GNUNET_STRINGS_relative_time_to_string (GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT,
-                                               GNUNET_YES));
-  /* call session destroy function */
-  tcp_plugin_disconnect_session (s->plugin,
-				 s);
-}
-
-
-/**
- * Increment session timeout due to activity.
- *
- * @param s session to increment timeout for
- */
-static void
-reschedule_session_timeout (struct GNUNET_ATS_Session *s)
-{
-  GNUNET_assert (NULL != s->timeout_task);
-  s->timeout = GNUNET_TIME_relative_to_absolute (GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT);
-}
-
-
-/**
- * Create a new session.  Also queues a welcome message.
- *
- * @param plugin the plugin
- * @param address the address to create the session for
- * @param scope network scope the address is from
- * @param client client to use, reference counter must have already been increased
- * @param is_nat this a NAT session, we should wait for a client to
- *               connect to us from an address, then assign that to
- *               the session
- * @return new session object
- */
-static struct GNUNET_ATS_Session *
-create_session (struct Plugin *plugin,
-                const struct GNUNET_HELLO_Address *address,
-                enum GNUNET_NetworkType scope,
-                struct GNUNET_SERVER_Client *client,
-                int is_nat)
-{
-  struct GNUNET_ATS_Session *session;
-  struct PendingMessage *pm;
-
-  if (GNUNET_YES != is_nat)
-    GNUNET_assert (NULL != client);
-  else
-    GNUNET_assert (NULL == client);
-
-  LOG (GNUNET_ERROR_TYPE_DEBUG,
-       "Creating new session for peer `%s' at address %s\n",
-       GNUNET_i2s (&address->peer),
-       tcp_plugin_address_to_string (plugin,
-                                     address->address,
-                                     address->address_length));
-  session = GNUNET_new (struct GNUNET_ATS_Session);
-  session->last_activity = GNUNET_TIME_absolute_get ();
-  session->plugin = plugin;
-  session->is_nat = is_nat;
-  if (NULL != client)
-  {
-    session->client = client;
-    GNUNET_SERVER_client_set_user_context (client,
-                                           session);
-  }
-  session->address = GNUNET_HELLO_address_copy (address);
-  session->target = address->peer;
-  session->expecting_welcome = GNUNET_YES;
-  session->scope = scope;
-  pm = GNUNET_malloc (sizeof (struct PendingMessage) +
-		      sizeof (struct WelcomeMessage));
-  pm->msg = (const char *) &pm[1];
-  pm->message_size = sizeof(struct WelcomeMessage);
-  GNUNET_memcpy (&pm[1],
-          &plugin->my_welcome,
-          sizeof(struct WelcomeMessage));
-  pm->timeout = GNUNET_TIME_UNIT_FOREVER_ABS;
-  GNUNET_STATISTICS_update (plugin->env->stats,
-                            gettext_noop ("# bytes currently in TCP buffers"),
-			    pm->message_size,
-                            GNUNET_NO);
-  GNUNET_CONTAINER_DLL_insert (session->pending_messages_head,
-                               session->pending_messages_tail,
-                               pm);
-  session->msgs_in_queue++;
-  session->bytes_in_queue += pm->message_size;
-  session->timeout = GNUNET_TIME_relative_to_absolute (GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT);
-  session->timeout_task = GNUNET_SCHEDULER_add_delayed (GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT,
-                                                        &session_timeout,
-                                                        session);
-  notify_session_monitor (session->plugin,
-                          session,
-                          GNUNET_TRANSPORT_SS_INIT);
-  if (GNUNET_YES != is_nat)
-  {
-    GNUNET_STATISTICS_update (plugin->env->stats,
-                              gettext_noop ("# TCP sessions active"),
-                              1,
-                              GNUNET_NO);
-    notify_session_monitor (session->plugin,
-                            session,
-                            GNUNET_TRANSPORT_SS_UP);
-  }
-  else
-  {
-    notify_session_monitor (session->plugin,
-                            session,
-                            GNUNET_TRANSPORT_SS_HANDSHAKE);
-  }
-  return session;
-}
-
-
-/**
- * If we have pending messages, ask the server to
- * transmit them (schedule the respective tasks, etc.)
- *
- * @param session for which session should we do this
- */
-static void
-process_pending_messages (struct GNUNET_ATS_Session *session);
-
-
-/**
- * Function called to notify a client about the socket
- * being ready to queue more data.  "buf" will be
- * NULL and "size" zero if the socket was closed for
- * writing in the meantime.
- *
- * @param cls closure
- * @param size number of bytes available in @a buf
- * @param buf where the callee should write the message
- * @return number of bytes written to @a buf
- */
-static size_t
-do_transmit (void *cls,
-	     size_t size,
-	     void *buf)
-{
-  struct GNUNET_ATS_Session *session = cls;
-  struct GNUNET_PeerIdentity pid;
-  struct Plugin *plugin;
-  struct PendingMessage *pos;
-  struct PendingMessage *hd;
-  struct PendingMessage *tl;
-  struct GNUNET_TIME_Absolute now;
-  char *cbuf;
-  size_t ret;
-
-  session->transmit_handle = NULL;
-  plugin = session->plugin;
-  if (NULL == buf)
-  {
-    LOG (GNUNET_ERROR_TYPE_DEBUG,
-         "Timeout trying to transmit to peer `%s', discarding message queue.\n",
-         GNUNET_i2s (&session->target));
-    /* timeout; cancel all messages that have already expired */
-    hd = NULL;
-    tl = NULL;
-    ret = 0;
-    now = GNUNET_TIME_absolute_get ();
-    while ( (NULL != (pos = session->pending_messages_head)) &&
-            (pos->timeout.abs_value_us <= now.abs_value_us) )
-    {
-      GNUNET_CONTAINER_DLL_remove (session->pending_messages_head,
-                                   session->pending_messages_tail,
-                                   pos);
-      GNUNET_assert (0 < session->msgs_in_queue);
-      session->msgs_in_queue--;
-      GNUNET_assert (pos->message_size <= session->bytes_in_queue);
-      session->bytes_in_queue -= pos->message_size;
-      LOG (GNUNET_ERROR_TYPE_DEBUG,
-           "Failed to transmit %u byte message to `%s'.\n",
-           pos->message_size,
-           GNUNET_i2s (&session->target));
-      ret += pos->message_size;
-      GNUNET_CONTAINER_DLL_insert_after (hd,
-                                         tl,
-                                         tl,
-                                         pos);
-    }
-    /* do this call before callbacks (so that if callbacks destroy
-     * session, they have a chance to cancel actions done by this
-     * call) */
-    process_pending_messages (session);
-    pid = session->target;
-    /* no do callbacks and do not use session again since
-     * the callbacks may abort the session */
-    while (NULL != (pos = hd))
-    {
-      GNUNET_CONTAINER_DLL_remove (hd,
-                                   tl,
-                                   pos);
-      if (NULL != pos->transmit_cont)
-        pos->transmit_cont (pos->transmit_cont_cls,
-                            &pid,
-                            GNUNET_SYSERR,
-                            pos->message_size,
-                            0);
-      GNUNET_free (pos);
-    }
-    GNUNET_STATISTICS_update (plugin->env->stats,
-                              gettext_noop ("# bytes currently in TCP buffers"), -(int64_t) ret,
-                              GNUNET_NO);
-    GNUNET_STATISTICS_update (plugin->env->stats,
-                              gettext_noop ("# bytes discarded by TCP (timeout)"),
-                              ret,
-                              GNUNET_NO);
-    if (0 < ret)
-      notify_session_monitor (session->plugin,
-                              session,
-                              GNUNET_TRANSPORT_SS_UPDATE);
-    return 0;
-  }
-  /* copy all pending messages that would fit */
-  ret = 0;
-  cbuf = buf;
-  hd = NULL;
-  tl = NULL;
-  while (NULL != (pos = session->pending_messages_head))
-  {
-    if (ret + pos->message_size > size)
-      break;
-    GNUNET_CONTAINER_DLL_remove (session->pending_messages_head,
-                                 session->pending_messages_tail,
-                                 pos);
-    GNUNET_assert (0 < session->msgs_in_queue);
-    session->msgs_in_queue--;
-    GNUNET_assert (pos->message_size <= session->bytes_in_queue);
-    session->bytes_in_queue -= pos->message_size;
-    GNUNET_assert(size >= pos->message_size);
-    LOG (GNUNET_ERROR_TYPE_DEBUG,
-         "Transmitting message of type %u size %u to peer %s at %s\n",
-         ntohs (((struct GNUNET_MessageHeader *) pos->msg)->type),
-         pos->message_size,
-         GNUNET_i2s (&session->target),
-         tcp_plugin_address_to_string (session->plugin,
-                                       session->address->address,
-                                       session->address->address_length));
-    /* FIXME: this GNUNET_memcpy can be up to 7% of our total runtime */
-    GNUNET_memcpy (cbuf,
-            pos->msg,
-            pos->message_size);
-    cbuf += pos->message_size;
-    ret += pos->message_size;
-    size -= pos->message_size;
-    GNUNET_CONTAINER_DLL_insert_tail (hd,
-                                      tl,
-                                      pos);
-  }
-  notify_session_monitor (session->plugin,
-                          session,
-                          GNUNET_TRANSPORT_SS_UPDATE);
-  /* schedule 'continuation' before callbacks so that callbacks that
-   * cancel everything don't cause us to use a session that no longer
-   * exists... */
-  process_pending_messages (session);
-  session->last_activity = GNUNET_TIME_absolute_get ();
-  pid = session->target;
-  /* we'll now call callbacks that may cancel the session; hence
-   * we should not use 'session' after this point */
-  while (NULL != (pos = hd))
-  {
-    GNUNET_CONTAINER_DLL_remove (hd, tl, pos);
-    if (NULL != pos->transmit_cont)
-      pos->transmit_cont (pos->transmit_cont_cls,
-                          &pid,
-                          GNUNET_OK,
-                          pos->message_size,
-                          pos->message_size); /* FIXME: include TCP overhead */
-    GNUNET_free (pos);
-  }
-  GNUNET_assert (NULL == hd);
-  GNUNET_assert (NULL == tl);
-  GNUNET_STATISTICS_update (plugin->env->stats,
-                            gettext_noop ("# bytes currently in TCP buffers"),
-                            - (int64_t) ret,
-                            GNUNET_NO);
-  GNUNET_STATISTICS_update (plugin->env->stats,
-                            gettext_noop ("# bytes transmitted via TCP"),
-                            ret,
-                            GNUNET_NO);
-  return ret;
-}
-
-
-/**
- * If we have pending messages, ask the server to
- * transmit them (schedule the respective tasks, etc.)
- *
- * @param session for which session should we do this
- */
-static void
-process_pending_messages (struct GNUNET_ATS_Session *session)
-{
-  struct PendingMessage *pm;
-
-  GNUNET_assert (NULL != session->client);
-  if (NULL != session->transmit_handle)
-    return;
-  if (NULL == (pm = session->pending_messages_head))
-    return;
-
-  session->transmit_handle
-    = GNUNET_SERVER_notify_transmit_ready (session->client,
-                                           pm->message_size,
-                                           GNUNET_TIME_absolute_get_remaining (pm->timeout),
-                                           &do_transmit,
-                                           session);
-}
-
-
-/**
- * Function that can be used by the transport service to transmit
- * a message using the plugin.   Note that in the case of a
- * peer disconnecting, the continuation MUST be called
- * prior to the disconnect notification itself.  This function
- * will be called with this peer's HELLO message to initiate
- * a fresh connection to another peer.
- *
- * @param cls closure
- * @param session which session must be used
- * @param msgbuf the message to transmit
- * @param msgbuf_size number of bytes in @a msgbuf
- * @param priority how important is the message (most plugins will
- *                 ignore message priority and just FIFO)
- * @param to how long to wait at most for the transmission (does not
- *                require plugins to discard the message after the timeout,
- *                just advisory for the desired delay; most plugins will ignore
- *                this as well)
- * @param cont continuation to call once the message has
- *        been transmitted (or if the transport is ready
- *        for the next transmission call; or if the
- *        peer disconnected...); can be NULL
- * @param cont_cls closure for @a cont
- * @return number of bytes used (on the physical network, with overheads);
- *         -1 on hard errors (i.e. address invalid); 0 is a legal value
- *         and does NOT mean that the message was not transmitted (DV)
- */
-static ssize_t
-tcp_plugin_send (void *cls,
-                 struct GNUNET_ATS_Session *session,
-                 const char *msgbuf,
-                 size_t msgbuf_size,
-                 unsigned int priority,
-                 struct GNUNET_TIME_Relative to,
-                 GNUNET_TRANSPORT_TransmitContinuation cont,
-                 void *cont_cls)
-{
-  struct Plugin * plugin = cls;
-  struct PendingMessage *pm;
-
-  /* create new message entry */
-  pm = GNUNET_malloc (sizeof (struct PendingMessage) + msgbuf_size);
-  pm->msg = (const char *) &pm[1];
-  GNUNET_memcpy (&pm[1], msgbuf, msgbuf_size);
-  pm->message_size = msgbuf_size;
-  pm->timeout = GNUNET_TIME_relative_to_absolute (to);
-  pm->transmit_cont = cont;
-  pm->transmit_cont_cls = cont_cls;
-
-  LOG (GNUNET_ERROR_TYPE_DEBUG,
-       "Asked to transmit %u bytes to `%s', added message to list.\n",
-       msgbuf_size,
-       GNUNET_i2s (&session->target));
-
-  if (GNUNET_YES ==
-      GNUNET_CONTAINER_multipeermap_contains_value (plugin->sessionmap,
-                                                    &session->target,
-                                                    session))
-  {
-    GNUNET_assert (NULL != session->client);
-    GNUNET_SERVER_client_set_timeout (session->client,
-                                      GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT);
-    GNUNET_STATISTICS_update (plugin->env->stats,
-                              gettext_noop ("# bytes currently in TCP buffers"),
-                              msgbuf_size,
-                              GNUNET_NO);
-
-    /* append pm to pending_messages list */
-    GNUNET_CONTAINER_DLL_insert_tail (session->pending_messages_head,
-                                      session->pending_messages_tail,
-                                      pm);
-    notify_session_monitor (session->plugin,
-                            session,
-                            GNUNET_TRANSPORT_SS_UPDATE);
-    session->msgs_in_queue++;
-    session->bytes_in_queue += pm->message_size;
-    process_pending_messages (session);
-    return msgbuf_size;
-  }
-  if (GNUNET_YES ==
-      GNUNET_CONTAINER_multipeermap_contains_value (plugin->nat_wait_conns,
-                                                    &session->target,
-                                                    session))
-  {
-    LOG (GNUNET_ERROR_TYPE_DEBUG,
-         "This NAT WAIT session for peer `%s' is not yet ready!\n",
-         GNUNET_i2s (&session->target));
-    GNUNET_STATISTICS_update (plugin->env->stats,
-                              gettext_noop ("# bytes currently in TCP buffers"), msgbuf_size,
-                              GNUNET_NO);
-    /* append pm to pending_messages list */
-    GNUNET_CONTAINER_DLL_insert_tail (session->pending_messages_head,
-                                      session->pending_messages_tail,
-                                      pm);
-    session->msgs_in_queue++;
-    session->bytes_in_queue += pm->message_size;
-    notify_session_monitor (session->plugin,
-                            session,
-                            GNUNET_TRANSPORT_SS_HANDSHAKE);
-    return msgbuf_size;
-  }
-  LOG (GNUNET_ERROR_TYPE_ERROR,
-       "Invalid session %p\n",
-       session);
-  if (NULL != cont)
-    cont (cont_cls,
-          &session->target,
-          GNUNET_SYSERR,
-          pm->message_size,
-          0);
-  GNUNET_break (0);
-  GNUNET_free (pm);
-  return GNUNET_SYSERR; /* session does not exist here */
-}
-
-
-/**
- * Closure for #session_lookup_it().
- */
-struct GNUNET_ATS_SessionItCtx
-{
-  /**
-   * Address we are looking for.
-   */
-  const struct GNUNET_HELLO_Address *address;
-
-  /**
-   * Where to store the session (if we found it).
-   */
-  struct GNUNET_ATS_Session *result;
-
-};
-
-
-/**
- * Look for a session by address.
- *
- * @param cls the `struct GNUNET_ATS_SessionItCtx`
- * @param key unused
- * @param value a `struct GNUNET_ATS_Session`
- * @return #GNUNET_YES to continue looking, #GNUNET_NO if we found the session
- */
-static int
-session_lookup_it (void *cls,
-                   const struct GNUNET_PeerIdentity *key,
-                   void *value)
-{
-  struct GNUNET_ATS_SessionItCtx *si_ctx = cls;
-  struct GNUNET_ATS_Session *session = value;
-
-  if (0 !=
-      GNUNET_HELLO_address_cmp (si_ctx->address,
-                                session->address))
-    return GNUNET_YES;
-  si_ctx->result = session;
-  return GNUNET_NO;
-}
-
-
-/**
- * Task cleaning up a NAT connection attempt after timeout
- *
- * @param cls the `struct GNUNET_ATS_Session`
- */
-static void
-nat_connect_timeout (void *cls)
-{
-  struct GNUNET_ATS_Session *session = cls;
-
-  session->nat_connection_timeout = NULL;
-  LOG (GNUNET_ERROR_TYPE_DEBUG,
-       "NAT WAIT connection to `%4s' at `%s' could not be established, removing session\n",
-       GNUNET_i2s (&session->target),
-       tcp_plugin_address_to_string (session->plugin,
-                                     session->address->address,
-                                     session->address->address_length));
-  tcp_plugin_disconnect_session (session->plugin,
-                                 session);
-}
-
-
-/**
- * Function that will be called whenever the transport service wants to
- * notify the plugin that a session is still active and in use and
- * therefore the session timeout for this session has to be updated
- *
- * @param cls closure
- * @param peer which peer was the session for
- * @param session which session is being updated
- */
-static void
-tcp_plugin_update_session_timeout (void *cls,
-                                   const struct GNUNET_PeerIdentity *peer,
-                                   struct GNUNET_ATS_Session *session)
-{
-  reschedule_session_timeout (session);
-}
-
-
-/**
- * Task to signal the server that we can continue
- * receiving from the TCP client now.
- *
- * @param cls the `struct GNUNET_ATS_Session *`
- */
-static void
-delayed_done (void *cls)
-{
-  struct GNUNET_ATS_Session *session = cls;
-
-  session->receive_delay_task = NULL;
-  reschedule_session_timeout (session);
-  GNUNET_SERVER_receive_done (session->client,
-			      GNUNET_OK);
-}
-
-
-/**
- * Function that will be called whenever the transport service wants to
- * notify the plugin that the inbound quota changed and that the plugin
- * should update it's delay for the next receive value
- *
- * @param cls closure
- * @param peer which peer was the session for
- * @param session which session is being updated
- * @param delay new delay to use for receiving
- */
-static void
-tcp_plugin_update_inbound_delay (void *cls,
-                                 const struct GNUNET_PeerIdentity *peer,
-                                 struct GNUNET_ATS_Session *session,
-                                 struct GNUNET_TIME_Relative delay)
-{
-  if (NULL == session->receive_delay_task)
-    return;
-  LOG (GNUNET_ERROR_TYPE_DEBUG,
-       "New inbound delay %s\n",
-       GNUNET_STRINGS_relative_time_to_string (delay,
-                                               GNUNET_NO));
-  session->receive_delay = GNUNET_TIME_relative_to_absolute (delay);
-  GNUNET_SCHEDULER_cancel (session->receive_delay_task);
-  session->receive_delay_task = GNUNET_SCHEDULER_add_delayed (delay,
-                                                              &delayed_done,
-                                                              session);
-}
-
-
-/**
- * Create a new session to transmit data to the target
- * This session will used to send data to this peer and the plugin will
- * notify us by calling the env->session_end function
- *
- * @param cls closure
- * @param address the address to use
- * @return the session if the address is valid, NULL otherwise
- */
-static struct GNUNET_ATS_Session *
-tcp_plugin_get_session (void *cls,
-                        const struct GNUNET_HELLO_Address *address)
-{
-  struct Plugin *plugin = cls;
-  struct GNUNET_ATS_Session *session = NULL;
-  int af;
-  const void *sb;
-  size_t sbs;
-  struct GNUNET_CONNECTION_Handle *sa;
-  struct sockaddr_in a4;
-  struct sockaddr_in6 a6;
-  const struct IPv4TcpAddress *t4;
-  const struct IPv6TcpAddress *t6;
-  unsigned int options;
-  enum GNUNET_NetworkType net_type;
-  unsigned int is_natd = GNUNET_NO;
-  size_t addrlen;
-#ifdef TCP_STEALTH
-  struct GNUNET_NETWORK_Handle *s;
-#endif
-
-  addrlen = address->address_length;
-  LOG (GNUNET_ERROR_TYPE_DEBUG,
-       "Trying to get session for `%s' address of peer `%s'\n",
-       tcp_plugin_address_to_string (plugin,
-                                     address->address,
-                                     address->address_length),
-       GNUNET_i2s (&address->peer));
-
-  if (GNUNET_HELLO_address_check_option (address,
-                                         GNUNET_HELLO_ADDRESS_INFO_INBOUND))
-  {
-    GNUNET_break (0);
-    return NULL;
-  }
-
-  /* look for existing session */
-  if (GNUNET_YES ==
-      GNUNET_CONTAINER_multipeermap_contains (plugin->sessionmap,
-                                              &address->peer))
-  {
-    struct GNUNET_ATS_SessionItCtx si_ctx;
-
-    si_ctx.address = address;
-    si_ctx.result = NULL;
-    GNUNET_CONTAINER_multipeermap_get_multiple (plugin->sessionmap,
-                                                &address->peer,
-                                                &session_lookup_it,
-						&si_ctx);
-    if (NULL != si_ctx.result)
-    {
-      session = si_ctx.result;
-      LOG (GNUNET_ERROR_TYPE_DEBUG,
-           "Found existing session for `%s' address `%s'\n",
-           GNUNET_i2s (&address->peer),
-           tcp_plugin_address_to_string (plugin,
-                                         address->address,
-                                         address->address_length));
-      return session;
-    }
-    /* This is a bit of a hack, limiting TCP to never allow more than
-       one TCP connection to any given peer at the same time.
-       Without this, peers sometimes disagree about which of the TCP
-       connections they should use, causing one side to believe that
-       they transmit successfully, while the other receives nothing. */
-    return NULL; /* Refuse to have more than one TCP connection per
-                    peer pair at the same time. */
-  }
-
-  if (addrlen == sizeof(struct IPv6TcpAddress))
-  {
-    GNUNET_assert (NULL != address->address); /* make static analysis happy */
-    t6 = address->address;
-    options = t6->options;
-    af = AF_INET6;
-    memset (&a6, 0, sizeof(a6));
-#if HAVE_SOCKADDR_IN_SIN_LEN
-    a6.sin6_len = sizeof (a6);
-#endif
-    a6.sin6_family = AF_INET6;
-    a6.sin6_port = t6->t6_port;
-    if (t6->t6_port == 0)
-      is_natd = GNUNET_YES;
-    GNUNET_memcpy (&a6.sin6_addr, &t6->ipv6_addr, sizeof(struct in6_addr));
-    sb = &a6;
-    sbs = sizeof(a6);
-  }
-  else if (addrlen == sizeof(struct IPv4TcpAddress))
-  {
-    GNUNET_assert(NULL != address->address); /* make static analysis happy */
-    t4 = address->address;
-    options = t4->options;
-    af = AF_INET;
-    memset (&a4, 0, sizeof(a4));
-#if HAVE_SOCKADDR_IN_SIN_LEN
-    a4.sin_len = sizeof (a4);
-#endif
-    a4.sin_family = AF_INET;
-    a4.sin_port = t4->t4_port;
-    if (t4->t4_port == 0)
-      is_natd = GNUNET_YES;
-    a4.sin_addr.s_addr = t4->ipv4_addr;
-    sb = &a4;
-    sbs = sizeof(a4);
-  }
-  else
-  {
-    GNUNET_STATISTICS_update (plugin->env->stats,
-                              gettext_noop ("# requests to create session with invalid address"),
-                              1,
-                              GNUNET_NO);
-    return NULL;
-  }
-
-  net_type = plugin->env->get_address_type (plugin->env->cls,
-                                            sb,
-                                            sbs);
-  GNUNET_break (net_type != GNUNET_NT_UNSPECIFIED);
-
-  if ( (is_natd == GNUNET_YES) &&
-       (addrlen == sizeof(struct IPv6TcpAddress)) )
-  {
-    /* NAT client only works with IPv4 addresses */
-    return NULL;
-  }
-
-  if (plugin->cur_connections >= plugin->max_connections)
-  {
-    /* saturated */
-    return NULL;
-  }
-
-  if ( (is_natd == GNUNET_YES) &&
-       (GNUNET_YES ==
-	GNUNET_CONTAINER_multipeermap_contains (plugin->nat_wait_conns,
-						&address->peer)))
-  {
-    /* Only do one NAT punch attempt per peer identity */
-    return NULL;
-  }
-
-  if ( (is_natd == GNUNET_YES) &&
-       (NULL != plugin->nat) &&
-       (GNUNET_NO ==
-        GNUNET_CONTAINER_multipeermap_contains (plugin->nat_wait_conns,
-                                                &address->peer)))
-  {
-    struct sockaddr_in local_sa;
-
-    LOG (GNUNET_ERROR_TYPE_DEBUG,
-         "Found valid IPv4 NAT address (creating session)!\n");
-    session = create_session (plugin,
-                              address,
-                              net_type,
-                              NULL,
-                              GNUNET_YES);
-    session->nat_connection_timeout = GNUNET_SCHEDULER_add_delayed (NAT_TIMEOUT,
-                                                                    &nat_connect_timeout,
-                                                                    session);
-    GNUNET_assert (GNUNET_OK ==
-                   GNUNET_CONTAINER_multipeermap_put (plugin->nat_wait_conns,
-                                                      &session->target,
-                                                      session,
-                                                      GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY));
-
-    LOG (GNUNET_ERROR_TYPE_DEBUG,
-         "Created NAT WAIT connection to `%s' at `%s'\n",
-         GNUNET_i2s (&session->target),
-         GNUNET_a2s (sb, sbs));
-    memset (&local_sa,
-	    0,
-	    sizeof (local_sa));
-    local_sa.sin_family = AF_INET;
-    local_sa.sin_port = htons (plugin->open_port);
-    /* We leave sin_address at 0, let the kernel figure it out,
-       even if our bind() is more specific.  (May want to reconsider
-       later.) */
-    if (GNUNET_OK ==
-	GNUNET_NAT_request_reversal (plugin->nat,
-				     &local_sa,
-				     &a4))
-      return session;
-    LOG (GNUNET_ERROR_TYPE_DEBUG,
-	 "Running NAT client for `%s' at `%s' failed\n",
-	 GNUNET_i2s (&session->target),
-	 GNUNET_a2s (sb, sbs));
-    tcp_plugin_disconnect_session (plugin,
-				   session);
-    return NULL;
-  }
-
-  /* create new outbound session */
-  if (0 != (options & TCP_OPTIONS_TCP_STEALTH))
-  {
-#ifdef TCP_STEALTH
-    s = GNUNET_NETWORK_socket_create (af, SOCK_STREAM, 0);
-    if (NULL == s)
-    {
-      GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING | GNUNET_ERROR_TYPE_BULK,
-                           "socket");
-      sa = NULL;
-    }
-    else
-    {
-      if ( (GNUNET_OK !=
-            GNUNET_NETWORK_socket_setsockopt (s,
-                                              IPPROTO_TCP,
-                                              TCP_STEALTH,
-                                              &session->target,
-                                              sizeof (struct GNUNET_PeerIdentity))) ||
-           (GNUNET_OK !=
-            GNUNET_NETWORK_socket_setsockopt (s,
-                                              IPPROTO_TCP,
-                                              TCP_STEALTH_INTEGRITY,
-                                              &plugin->my_welcome,
-                                              sizeof (struct WelcomeMessage))) )
-      {
-        /* TCP STEALTH not supported by kernel */
-        GNUNET_break (GNUNET_OK ==
-                      GNUNET_NETWORK_socket_close (s));
-        sa = NULL;
-      }
-      else
-      {
-        sa = GNUNET_CONNECTION_connect_socket (s, sb, sbs);
-      }
-    }
-#else
-    sa = NULL;
-#endif
-  }
-  else
-  {
-    sa = GNUNET_CONNECTION_create_from_sockaddr (af, sb, sbs);
-  }
-  if (NULL == sa)
-  {
-    LOG (GNUNET_ERROR_TYPE_DEBUG,
-         "Failed to create connection to `%s' at `%s'\n",
-         GNUNET_i2s (&address->peer),
-         GNUNET_a2s (sb, sbs));
-    return NULL;
-  }
-  LOG (GNUNET_ERROR_TYPE_DEBUG,
-       "Asked to transmit to `%s', creating fresh session using address `%s'.\n",
-       GNUNET_i2s (&address->peer),
-       GNUNET_a2s (sb, sbs));
-
-  session = create_session (plugin,
-                            address,
-                            net_type,
-                            GNUNET_SERVER_connect_socket (plugin->server,
-                                                          sa),
-                            GNUNET_NO);
-  (void) GNUNET_CONTAINER_multipeermap_put (plugin->sessionmap,
-                                            &session->target,
-                                            session,
-                                            GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
-  /* Send TCP Welcome */
-  process_pending_messages (session);
-
-  return session;
-}
-
-
-/**
- * We have been asked to destroy all connections to a particular peer.
- * This function is called on each applicable session and must tear it
- * down.
- *
- * @param cls the `struct Plugin *`
- * @param key the peer which the session belongs to (unused)
- * @param value the `struct GNUNET_ATS_Session`
- * @return #GNUNET_YES (continue to iterate)
- */
-static int
-session_disconnect_it (void *cls,
-                       const struct GNUNET_PeerIdentity *key,
-                       void *value)
-{
-  struct Plugin *plugin = cls;
-  struct GNUNET_ATS_Session *session = value;
-
-  GNUNET_STATISTICS_update (session->plugin->env->stats,
-                            gettext_noop ("# transport-service disconnect requests for TCP"),
-                            1,
-                            GNUNET_NO);
-  tcp_plugin_disconnect_session (plugin,
-                                 session);
-  return GNUNET_YES;
-}
-
-
-/**
- * Function that can be called to force a disconnect from the
- * specified neighbour.  This should also cancel all previously
- * scheduled transmissions.  Obviously the transmission may have been
- * partially completed already, which is OK.  The plugin is supposed
- * to close the connection (if applicable) and no longer call the
- * transmit continuation(s).
- *
- * Finally, plugin MUST NOT call the services's receive function to
- * notify the service that the connection to the specified target was
- * closed after a getting this call.
- *
- * @param cls closure
- * @param target peer for which the last transmission is
- *        to be cancelled
- */
-static void
-tcp_plugin_disconnect (void *cls,
-                       const struct GNUNET_PeerIdentity *target)
-{
-  struct Plugin *plugin = cls;
-
-  LOG (GNUNET_ERROR_TYPE_DEBUG,
-       "Disconnecting peer `%s'\n",
-       GNUNET_i2s (target));
-  GNUNET_CONTAINER_multipeermap_get_multiple (plugin->sessionmap,
-                                              target,
-                                              &session_disconnect_it,
-                                              plugin);
-  GNUNET_CONTAINER_multipeermap_get_multiple (plugin->nat_wait_conns,
-                                              target,
-                                              &session_disconnect_it,
-                                              plugin);
-}
-
-
-/**
- * We are processing an address pretty printing request and finished
- * the IP resolution (if applicable).  Append our port and forward the
- * result.  If called with @a hostname NULL, we are done and should
- * clean up the pretty printer (otherwise, there might be multiple
- * hostnames for the IP address and we might receive more).
- *
- * @param cls the `struct PrettyPrinterContext *`
- * @param hostname hostname part of the address
- */
-static void
-append_port (void *cls,
-             const char *hostname)
-{
-  struct PrettyPrinterContext *ppc = cls;
-  struct Plugin *plugin = ppc->plugin;
-  char *ret;
-
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "append_port called with hostname `%s'\n",
-              hostname);
-  if (NULL == hostname)
-  {
-    /* Final call, done */
-    ppc->resolver_handle = NULL;
-    GNUNET_CONTAINER_DLL_remove (plugin->ppc_dll_head,
-                                 plugin->ppc_dll_tail,
-                                 ppc);
-    ppc->asc (ppc->asc_cls,
-              NULL,
-              GNUNET_OK);
-    GNUNET_free (ppc);
-    return;
-  }
-  if (GNUNET_YES == ppc->ipv6)
-    GNUNET_asprintf (&ret,
-                     "%s.%u.[%s]:%d",
-                     PLUGIN_NAME,
-                     ppc->options,
-                     hostname,
-                     ppc->port);
-  else
-    GNUNET_asprintf (&ret,
-                     "%s.%u.%s:%d",
-                     PLUGIN_NAME,
-                     ppc->options,
-                     hostname,
-                     ppc->port);
-  ppc->asc (ppc->asc_cls,
-            ret,
-            GNUNET_OK);
-  GNUNET_free (ret);
-}
-
-
-/**
- * Convert the transports address to a nice, human-readable format.
- *
- * @param cls closure with the `struct Plugin`
- * @param type name of the transport that generated the address
- * @param addr one of the addresses of the host, NULL for the last address
- *        the specific address format depends on the transport
- * @param addrlen length of the @a addr
- * @param numeric should (IP) addresses be displayed in numeric form?
- * @param timeout after how long should we give up?
- * @param asc function to call on each string
- * @param asc_cls closure for @a asc
- */
-static void
-tcp_plugin_address_pretty_printer (void *cls,
-                                   const char *type,
-                                   const void *addr,
-                                   size_t addrlen,
-                                   int numeric,
-                                   struct GNUNET_TIME_Relative timeout,
-                                   GNUNET_TRANSPORT_AddressStringCallback asc,
-                                   void *asc_cls)
-{
-  struct Plugin *plugin = cls;
-  struct PrettyPrinterContext *ppc;
-  const void *sb;
-  size_t sbs;
-  struct sockaddr_in a4;
-  struct sockaddr_in6 a6;
-  const struct IPv4TcpAddress *t4;
-  const struct IPv6TcpAddress *t6;
-  uint16_t port;
-  uint32_t options;
-
-  if (sizeof(struct IPv6TcpAddress) == addrlen)
-  {
-    t6 = addr;
-    memset (&a6, 0, sizeof(a6));
-    a6.sin6_family = AF_INET6;
-    a6.sin6_port = t6->t6_port;
-    GNUNET_memcpy (&a6.sin6_addr, &t6->ipv6_addr, sizeof(struct in6_addr));
-    port = ntohs (t6->t6_port);
-    options = ntohl (t6->options);
-    sb = &a6;
-    sbs = sizeof(a6);
-  }
-  else if (sizeof(struct IPv4TcpAddress) == addrlen)
-  {
-    t4 = addr;
-    memset (&a4, 0, sizeof(a4));
-    a4.sin_family = AF_INET;
-    a4.sin_port = t4->t4_port;
-    a4.sin_addr.s_addr = t4->ipv4_addr;
-    port = ntohs (t4->t4_port);
-    options = ntohl (t4->options);
-    sb = &a4;
-    sbs = sizeof(a4);
-  }
-  else
-  {
-    /* invalid address */
-    LOG (GNUNET_ERROR_TYPE_WARNING,
-         _("Unexpected address length: %u bytes\n"),
-         (unsigned int) addrlen);
-    asc (asc_cls, NULL, GNUNET_SYSERR);
-    asc (asc_cls, NULL, GNUNET_OK);
-    return;
-  }
-  ppc = GNUNET_new (struct PrettyPrinterContext);
-  ppc->plugin = plugin;
-  if (addrlen == sizeof(struct IPv6TcpAddress))
-    ppc->ipv6 = GNUNET_YES;
-  else
-    ppc->ipv6 = GNUNET_NO;
-  ppc->asc = asc;
-  ppc->asc_cls = asc_cls;
-  ppc->port = port;
-  ppc->options = options;
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "Starting DNS reverse lookup\n");
-  ppc->resolver_handle = GNUNET_RESOLVER_hostname_get (sb,
-                                                       sbs,
-                                                       ! numeric,
-                                                       timeout,
-                                                       &append_port,
-						       ppc);
-  if (NULL == ppc->resolver_handle)
-  {
-    GNUNET_break (0);
-    GNUNET_free (ppc);
-    return;
-  }
-  GNUNET_CONTAINER_DLL_insert (plugin->ppc_dll_head,
-                               plugin->ppc_dll_tail,
-                               ppc);
-}
-
-
-/**
- * Function that will be called to check if a binary address for this
- * plugin is well-formed and corresponds to an address for THIS peer
- * (as per our configuration).  Naturally, if absolutely necessary,
- * plugins can be a bit conservative in their answer, but in general
- * plugins should make sure that the address does not redirect
- * traffic to a 3rd party that might try to man-in-the-middle our
- * traffic.
- *
- * @param cls closure, our `struct Plugin *`
- * @param addr pointer to the address
- * @param addrlen length of @a addr
- * @return #GNUNET_OK if this is a plausible address for this peer
- *         and transport, #GNUNET_SYSERR if not
- */
-static int
-tcp_plugin_check_address (void *cls,
-			  const void *addr,
-			  size_t addrlen)
-{
-  struct Plugin *plugin = cls;
-  const struct IPv4TcpAddress *v4;
-  const struct IPv6TcpAddress *v6;
-
-  if ( (addrlen != sizeof(struct IPv4TcpAddress)) &&
-       (addrlen != sizeof(struct IPv6TcpAddress)) )
-  {
-    GNUNET_break_op (0);
-    return GNUNET_SYSERR;
-  }
-
-  if (addrlen == sizeof(struct IPv4TcpAddress))
-  {
-    struct sockaddr_in s4;
-
-    v4 = (const struct IPv4TcpAddress *) addr;
-    if (0 != memcmp (&v4->options,
-                     &plugin->myoptions,
-                     sizeof(uint32_t)))
-    {
-      GNUNET_break (0);
-      return GNUNET_SYSERR;
-    }
-    memset (&s4, 0, sizeof (s4));
-    s4.sin_family = AF_INET;
-#if HAVE_SOCKADDR_IN_SIN_LEN
-    s4.sin_len = sizeof (s4);
-#endif
-    s4.sin_port = v4->t4_port;
-    s4.sin_addr.s_addr = v4->ipv4_addr;
-
-    if (GNUNET_OK !=
-	GNUNET_NAT_test_address (plugin->nat,
-				 &s4,
-				 sizeof (struct sockaddr_in)))
-      return GNUNET_SYSERR;
-  }
-  else
-  {
-    struct sockaddr_in6 s6;
-
-    v6 = (const struct IPv6TcpAddress *) addr;
-    if (IN6_IS_ADDR_LINKLOCAL (&v6->ipv6_addr))
-    {
-      GNUNET_break_op (0);
-      return GNUNET_SYSERR;
-    }
-    if (0 != memcmp (&v6->options,
-                     &plugin->myoptions,
-                     sizeof (uint32_t)))
-    {
-      GNUNET_break (0);
-      return GNUNET_SYSERR;
-    }
-    memset (&s6, 0, sizeof (s6));
-    s6.sin6_family = AF_INET6;
-#if HAVE_SOCKADDR_IN_SIN_LEN
-    s6.sin6_len = sizeof (s6);
-#endif
-    s6.sin6_port = v6->t6_port;
-    s6.sin6_addr = v6->ipv6_addr;
-
-    if (GNUNET_OK !=
-	GNUNET_NAT_test_address (plugin->nat,
-				 &s6,
-				 sizeof(struct sockaddr_in6)))
-      return GNUNET_SYSERR;
-  }
-  return GNUNET_OK;
-}
-
-
-/**
- * We've received a nat probe from this peer via TCP.  Finish
- * creating the client session and resume sending of queued
- * messages.
- *
- * @param cls closure
- * @param client identification of the client
- * @param message the actual message
- */
-static void
-handle_tcp_nat_probe (void *cls,
-                      struct GNUNET_SERVER_Client *client,
-                      const struct GNUNET_MessageHeader *message)
-{
-  struct Plugin *plugin = cls;
-  struct GNUNET_ATS_Session *session;
-  const struct TCP_NAT_ProbeMessage *tcp_nat_probe;
-  size_t alen;
-  void *vaddr;
-  struct IPv4TcpAddress *t4;
-  struct IPv6TcpAddress *t6;
-  const struct sockaddr_in *s4;
-  const struct sockaddr_in6 *s6;
-
-  LOG (GNUNET_ERROR_TYPE_DEBUG,
-       "Received NAT probe\n");
-  /* We have received a TCP NAT probe, meaning we (hopefully) initiated
-   * a connection to this peer by running gnunet-nat-client.  This peer
-   * received the punch message and now wants us to use the new connection
-   * as the default for that peer.  Do so and then send a WELCOME message
-   * so we can really be connected!
-   */
-  if (ntohs (message->size) != sizeof(struct TCP_NAT_ProbeMessage))
-  {
-    GNUNET_break_op(0);
-    GNUNET_SERVER_receive_done (client,
-                                GNUNET_SYSERR);
-    return;
-  }
-
-  tcp_nat_probe = (const struct TCP_NAT_ProbeMessage *) message;
-  if (0 == memcmp (&tcp_nat_probe->clientIdentity, plugin->env->my_identity,
-          sizeof(struct GNUNET_PeerIdentity)))
-  {
-    /* refuse connections from ourselves */
-    GNUNET_SERVER_receive_done (client,
-                                GNUNET_SYSERR);
-    return;
-  }
-
-  session = GNUNET_CONTAINER_multipeermap_get (plugin->nat_wait_conns,
-                                               &tcp_nat_probe->clientIdentity);
-  if (NULL == session)
-  {
-    LOG (GNUNET_ERROR_TYPE_DEBUG,
-         "Did NOT find session for NAT probe!\n");
-    GNUNET_SERVER_receive_done (client,
-                                GNUNET_OK);
-    return;
-  }
-  LOG (GNUNET_ERROR_TYPE_DEBUG,
-       "Found session for NAT probe!\n");
-
-  if (NULL != session->nat_connection_timeout)
-  {
-    GNUNET_SCHEDULER_cancel (session->nat_connection_timeout);
-    session->nat_connection_timeout = NULL;
-  }
-
-  if (GNUNET_OK !=
-      GNUNET_SERVER_client_get_address (client,
-					&vaddr,
-					&alen))
-  {
-    GNUNET_break(0);
-    GNUNET_SERVER_receive_done (client,
-				GNUNET_SYSERR);
-    tcp_plugin_disconnect_session (plugin,
-                                   session);
-    return;
-  }
-  GNUNET_assert (GNUNET_YES ==
-		 GNUNET_CONTAINER_multipeermap_remove (plugin->nat_wait_conns,
-						       &tcp_nat_probe->clientIdentity,
-						       session));
-  GNUNET_SERVER_client_set_user_context (client,
-					 session);
-  (void) GNUNET_CONTAINER_multipeermap_put (plugin->sessionmap,
-					    &session->target,
-					    session,
-					    GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
-  session->last_activity = GNUNET_TIME_absolute_get ();
-  LOG (GNUNET_ERROR_TYPE_DEBUG,
-       "Found address `%s' for incoming connection\n",
-       GNUNET_a2s (vaddr, alen));
-  switch (((const struct sockaddr *) vaddr)->sa_family)
-  {
-  case AF_INET:
-    s4 = vaddr;
-    t4 = GNUNET_new (struct IPv4TcpAddress);
-    t4->options = htonl (TCP_OPTIONS_NONE);
-    t4->t4_port = s4->sin_port;
-    t4->ipv4_addr = s4->sin_addr.s_addr;
-    session->address = GNUNET_HELLO_address_allocate (&tcp_nat_probe->clientIdentity,
-                                                      PLUGIN_NAME,
-                                                      &t4,
-                                                      sizeof(struct IPv4TcpAddress),
-                                                      GNUNET_HELLO_ADDRESS_INFO_NONE);
-    break;
-  case AF_INET6:
-    s6 = vaddr;
-    t6 = GNUNET_new (struct IPv6TcpAddress);
-    t6->options = htonl (TCP_OPTIONS_NONE);
-    t6->t6_port = s6->sin6_port;
-    GNUNET_memcpy (&t6->ipv6_addr, &s6->sin6_addr, sizeof(struct in6_addr));
-    session->address = GNUNET_HELLO_address_allocate (&tcp_nat_probe->clientIdentity,
-                                                      PLUGIN_NAME,
-                                                      &t6,
-                                                      sizeof(struct IPv6TcpAddress),
-                                                      GNUNET_HELLO_ADDRESS_INFO_NONE);
-    break;
-  default:
-    GNUNET_break_op(0);
-    LOG(GNUNET_ERROR_TYPE_DEBUG,
-        "Bad address for incoming connection!\n");
-    GNUNET_free(vaddr);
-    GNUNET_SERVER_receive_done (client,
-                                GNUNET_SYSERR);
-    tcp_plugin_disconnect_session (plugin,
-                                   session);
-    return;
-  }
-  GNUNET_free (vaddr);
-  GNUNET_break (NULL == session->client);
-  session->client = client;
-  GNUNET_STATISTICS_update (plugin->env->stats,
-			    gettext_noop ("# TCP sessions active"),
-			    1,
-			    GNUNET_NO);
-  process_pending_messages (session);
-  GNUNET_SERVER_receive_done (client,
-			      GNUNET_OK);
-}
-
-
-/**
- * We've received a welcome from this peer via TCP.  Possibly create a
- * fresh client record and send back our welcome.
- *
- * @param cls closure
- * @param client identification of the client
- * @param message the actual message
- */
-static void
-handle_tcp_welcome (void *cls,
-                    struct GNUNET_SERVER_Client *client,
-                    const struct GNUNET_MessageHeader *message)
-{
-  struct Plugin *plugin = cls;
-  const struct WelcomeMessage *wm = (const struct WelcomeMessage *) message;
-  struct GNUNET_HELLO_Address *address;
-  struct GNUNET_ATS_Session *session;
-  size_t alen;
-  void *vaddr;
-  struct IPv4TcpAddress t4;
-  struct IPv6TcpAddress t6;
-  const struct sockaddr_in *s4;
-  const struct sockaddr_in6 *s6;
-
-  if (0 == memcmp (&wm->clientIdentity,
-                   plugin->env->my_identity,
-                   sizeof(struct GNUNET_PeerIdentity)))
-  {
-    /* refuse connections from ourselves */
-    if (GNUNET_OK ==
-        GNUNET_SERVER_client_get_address (client,
-                                          &vaddr,
-                                          &alen))
-    {
-      LOG (GNUNET_ERROR_TYPE_INFO,
-           "Received WELCOME message from my own identity `%s' on address `%s'\n",
-           GNUNET_i2s (&wm->clientIdentity),
-           GNUNET_a2s (vaddr, alen));
-      GNUNET_free (vaddr);
-    }
-    GNUNET_SERVER_receive_done (client,
-                                GNUNET_SYSERR);
-    return;
-  }
-
-  if (GNUNET_OK ==
-      GNUNET_SERVER_client_get_address (client,
-                                        &vaddr,
-                                        &alen))
-  {
-    LOG(GNUNET_ERROR_TYPE_DEBUG,
-        "Received WELCOME message from `%s' on address `%s'\n",
-        GNUNET_i2s (&wm->clientIdentity),
-        GNUNET_a2s (vaddr, alen));
-    GNUNET_free (vaddr);
-  }
-  GNUNET_STATISTICS_update (plugin->env->stats,
-                            gettext_noop ("# TCP WELCOME messages received"),
-                            1,
-                            GNUNET_NO);
-  session = lookup_session_by_client (plugin,
-                                      client);
-  if (NULL != session)
-  {
-    if (GNUNET_OK ==
-        GNUNET_SERVER_client_get_address (client,
-                                          &vaddr,
-                                          &alen))
-    {
-      LOG (GNUNET_ERROR_TYPE_DEBUG,
-           "Found existing session %p for peer `%s'\n",
-           session,
-           GNUNET_a2s (vaddr, alen));
-      GNUNET_free (vaddr);
-    }
-  }
-  else
-  {
-    if (GNUNET_OK ==
-        GNUNET_SERVER_client_get_address (client, &vaddr, &alen))
-    {
-      if (alen == sizeof(struct sockaddr_in))
-      {
-        s4 = vaddr;
-        memset (&t4, '\0', sizeof (t4));
-        t4.options = htonl (TCP_OPTIONS_NONE);
-        t4.t4_port = s4->sin_port;
-        t4.ipv4_addr = s4->sin_addr.s_addr;
-        address = GNUNET_HELLO_address_allocate (&wm->clientIdentity,
-                                                 PLUGIN_NAME,
-                                                 &t4,
-                                                 sizeof(t4),
-                                                 GNUNET_HELLO_ADDRESS_INFO_INBOUND);
-      }
-      else if (alen == sizeof(struct sockaddr_in6))
-      {
-        s6 = vaddr;
-        memset (&t6, '\0', sizeof (t6));
-        t6.options = htonl (TCP_OPTIONS_NONE);
-        t6.t6_port = s6->sin6_port;
-        GNUNET_memcpy (&t6.ipv6_addr, &s6->sin6_addr, sizeof(struct in6_addr));
-        address = GNUNET_HELLO_address_allocate (&wm->clientIdentity,
-                                                 PLUGIN_NAME,
-                                                 &t6,
-                                                 sizeof (t6),
-                                                 GNUNET_HELLO_ADDRESS_INFO_INBOUND);
-      }
-      else
-      {
-        GNUNET_break (0);
-        GNUNET_free_non_null (vaddr);
-        GNUNET_SERVER_receive_done (client,
-                                    GNUNET_SYSERR);
-        return;
-      }
-      session = create_session (plugin,
-                                address,
-                                plugin->env->get_address_type (plugin->env->cls,
-                                                               vaddr,
-                                                               alen),
-                                client,
-                                GNUNET_NO);
-      GNUNET_break (GNUNET_NT_UNSPECIFIED != session->scope);
-      GNUNET_HELLO_address_free (address);
-      LOG (GNUNET_ERROR_TYPE_DEBUG,
-           "Creating new%s session %p for peer `%s' client %p\n",
-           GNUNET_HELLO_address_check_option (session->address,
-                                              GNUNET_HELLO_ADDRESS_INFO_INBOUND)
-           ? " inbound" : "",
-           session,
-           tcp_plugin_address_to_string (plugin,
-                                         session->address->address,
-                                         session->address->address_length),
-           client);
-      GNUNET_free (vaddr);
-      (void) GNUNET_CONTAINER_multipeermap_put (plugin->sessionmap,
-                                                &session->target,
-                                                session,
-                                                GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
-      /* Notify transport and ATS about new session */
-      plugin->env->session_start (plugin->env->cls,
-                                  session->address,
-                                  session,
-                                  session->scope);
-    }
-    else
-    {
-      LOG(GNUNET_ERROR_TYPE_DEBUG,
-          "Did not obtain TCP socket address for incoming connection\n");
-      GNUNET_break(0);
-      GNUNET_SERVER_receive_done (client,
-                                  GNUNET_SYSERR);
-      return;
-    }
-  }
-
-  if (GNUNET_YES != session->expecting_welcome)
-  {
-    GNUNET_break_op (0);
-    GNUNET_SERVER_receive_done (client,
-                                GNUNET_SYSERR);
-    return;
-  }
-  session->last_activity = GNUNET_TIME_absolute_get ();
-  session->expecting_welcome = GNUNET_NO;
-
-  process_pending_messages (session);
-  GNUNET_SERVER_client_set_timeout (client,
-                                    GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT);
-  GNUNET_SERVER_receive_done (client,
-                              GNUNET_OK);
-}
-
-
-/**
- * We've received data for this peer via TCP.  Unbox,
- * compute latency and forward.
- *
- * @param cls closure
- * @param client identification of the client
- * @param message the actual message
- */
-static void
-handle_tcp_data (void *cls,
-                 struct GNUNET_SERVER_Client *client,
-                 const struct GNUNET_MessageHeader *message)
-{
-  struct Plugin *plugin = cls;
-  struct GNUNET_ATS_Session *session;
-  struct GNUNET_TIME_Relative delay;
-  uint16_t type;
-
-  type = ntohs (message->type);
-  if ( (GNUNET_MESSAGE_TYPE_TRANSPORT_TCP_WELCOME == type) ||
-       (GNUNET_MESSAGE_TYPE_TRANSPORT_TCP_NAT_PROBE == type) )
-  {
-    /* We don't want to propagate WELCOME and NAT Probe messages up! */
-    GNUNET_SERVER_receive_done (client,
-                                GNUNET_OK);
-    return;
-  }
-  session = lookup_session_by_client (plugin, client);
-  if (NULL == session)
-  {
-    /* No inbound session found */
-    void *vaddr = NULL;
-    size_t alen;
-
-    GNUNET_assert (GNUNET_OK ==
-		   GNUNET_SERVER_client_get_address (client,
-						     &vaddr,
-						     &alen));
-    LOG (GNUNET_ERROR_TYPE_ERROR,
-         "Received unexpected %u bytes of type %u from `%s'\n",
-         (unsigned int) ntohs (message->size),
-         (unsigned int) ntohs (message->type),
-         GNUNET_a2s (vaddr,
-                     alen));
-    GNUNET_break_op(0);
-    GNUNET_SERVER_receive_done (client,
-                                GNUNET_SYSERR);
-    GNUNET_free_non_null (vaddr);
-    return;
-  }
-  if (GNUNET_YES == session->expecting_welcome)
-  {
-    /* Session is expecting WELCOME message */
-    void *vaddr = NULL;
-    size_t alen;
-
-    GNUNET_SERVER_client_get_address (client,
-                                      &vaddr,
-                                      &alen);
-    LOG (GNUNET_ERROR_TYPE_ERROR,
-         "Received unexpected %u bytes of type %u from `%s'\n",
-         (unsigned int) ntohs (message->size),
-         (unsigned int) ntohs (message->type),
-         GNUNET_a2s (vaddr, alen));
-    GNUNET_break_op(0);
-    GNUNET_SERVER_receive_done (client,
-                                GNUNET_SYSERR);
-    GNUNET_free_non_null (vaddr);
-    return;
-  }
-
-  session->last_activity = GNUNET_TIME_absolute_get ();
-  {
-    void *vaddr = NULL;
-    size_t alen;
-
-    GNUNET_SERVER_client_get_address (client,
-                                      &vaddr,
-                                      &alen);
-    LOG (GNUNET_ERROR_TYPE_DEBUG,
-         "Passing %u bytes of type %u from `%s' at %s to transport service.\n",
-         (unsigned int) ntohs (message->size),
-         (unsigned int) ntohs (message->type),
-         GNUNET_i2s (&session->target),
-         GNUNET_a2s (vaddr, alen));
-    GNUNET_free_non_null (vaddr);
-  }
-
-  GNUNET_STATISTICS_update (plugin->env->stats,
-                            gettext_noop ("# bytes received via TCP"),
-                            ntohs (message->size),
-                            GNUNET_NO);
-
-  GNUNET_assert (GNUNET_CONTAINER_multipeermap_contains_value (plugin->sessionmap,
-                                                               &session->target,
-                                                               session));
-  delay = plugin->env->receive (plugin->env->cls,
-                                session->address,
-                                session,
-                                message);
-  reschedule_session_timeout (session);
-  if (0 == delay.rel_value_us)
-  {
-    GNUNET_SERVER_receive_done (client,
-                                GNUNET_OK);
-  }
-  else
-  {
-    LOG (GNUNET_ERROR_TYPE_DEBUG,
-         "Throttling receiving from `%s' for %s\n",
-         GNUNET_i2s (&session->target),
-         GNUNET_STRINGS_relative_time_to_string (delay,
-                                                 GNUNET_YES));
-    GNUNET_SERVER_disable_receive_done_warning (client);
-    GNUNET_assert (NULL == session->receive_delay_task);
-    session->receive_delay_task = GNUNET_SCHEDULER_add_delayed (delay,
-                                                                &delayed_done,
-                                                                session);
-  }
-}
-
-
-/**
- * Function called whenever a peer is connected on the "SERVER" level.
- * Increments number of active connections and suspends server if we
- * have reached the limit.
- *
- * @param cls closure
- * @param client identification of the client
- */
-static void
-connect_notify (void *cls,
-		struct GNUNET_SERVER_Client *client)
-{
-  struct Plugin *plugin = cls;
-
-  if (NULL == client)
-    return;
-  plugin->cur_connections++;
-  GNUNET_STATISTICS_set (plugin->env->stats,
-                         gettext_noop ("# TCP server connections active"),
-                         plugin->cur_connections,
-                         GNUNET_NO);
-  GNUNET_STATISTICS_update (plugin->env->stats,
-			    gettext_noop ("# TCP server connect events"),
-			    1,
-			    GNUNET_NO);
-  if (plugin->cur_connections != plugin->max_connections)
-    return;
-  GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
-	      _("TCP connection limit reached, suspending server\n"));
-  GNUNET_STATISTICS_update (plugin->env->stats,
-			    gettext_noop ("# TCP service suspended"),
-			    1,
-			    GNUNET_NO);
-  GNUNET_SERVER_suspend (plugin->server); /* Maximum number of connections rechead */
-}
-
-
-/**
- * Function called whenever a peer is disconnected on the "SERVER"
- * level.  Cleans up the connection, decrements number of active
- * connections and if applicable resumes listening.
- *
- * @param cls closure
- * @param client identification of the client
- */
-static void
-disconnect_notify (void *cls,
-                   struct GNUNET_SERVER_Client *client)
-{
-  struct Plugin *plugin = cls;
-  struct GNUNET_ATS_Session *session;
-
-  if (NULL == client)
-    return;
-  GNUNET_assert (plugin->cur_connections >= 1);
-  plugin->cur_connections--;
-  session = lookup_session_by_client (plugin,
-                                      client);
-  if (NULL == session)
-    return; /* unknown, nothing to do */
-  LOG (GNUNET_ERROR_TYPE_DEBUG,
-       "Destroying session of `%s' with %s due to network-level disconnect.\n",
-       GNUNET_i2s (&session->target),
-       tcp_plugin_address_to_string (session->plugin,
-                                     session->address->address,
-                                     session->address->address_length));
-
-  if (plugin->cur_connections == plugin->max_connections)
-  {
-    GNUNET_STATISTICS_update (session->plugin->env->stats,
-                              gettext_noop ("# TCP service resumed"),
-                              1,
-                              GNUNET_NO);
-    GNUNET_SERVER_resume (plugin->server); /* Resume server  */
-  }
-  GNUNET_STATISTICS_set (plugin->env->stats,
-                         gettext_noop ("# TCP server connections active"),
-                         plugin->cur_connections,
-                         GNUNET_NO);
-  GNUNET_STATISTICS_update (session->plugin->env->stats,
-                            gettext_noop ("# network-level TCP disconnect events"),
-                            1,
-                            GNUNET_NO);
-  tcp_plugin_disconnect_session (plugin,
-				 session);
-}
-
-
-/**
- * We can now send a probe message, copy into buffer to really send.
- *
- * @param cls closure, a `struct TCPProbeContext`
- * @param size max size to copy
- * @param buf buffer to copy message to
- * @return number of bytes copied into @a buf
- */
-static size_t
-notify_send_probe (void *cls,
-                   size_t size,
-                   void *buf)
-{
-  struct TCPProbeContext *tcp_probe_ctx = cls;
-  struct Plugin *plugin = tcp_probe_ctx->plugin;
-  size_t ret;
-
-  tcp_probe_ctx->transmit_handle = NULL;
-  GNUNET_CONTAINER_DLL_remove (plugin->probe_head,
-                               plugin->probe_tail,
-                               tcp_probe_ctx);
-  if (NULL == buf)
-  {
-    GNUNET_CONNECTION_destroy (tcp_probe_ctx->sock);
-    GNUNET_free(tcp_probe_ctx);
-    return 0;
-  }
-  GNUNET_assert(size >= sizeof(tcp_probe_ctx->message));
-  GNUNET_memcpy (buf,
-	  &tcp_probe_ctx->message,
-	  sizeof(tcp_probe_ctx->message));
-  GNUNET_SERVER_connect_socket (tcp_probe_ctx->plugin->server,
-                                tcp_probe_ctx->sock);
-  ret = sizeof(tcp_probe_ctx->message);
-  GNUNET_free (tcp_probe_ctx);
-  return ret;
-}
-
-
-/**
- * Function called by the NAT subsystem suggesting another peer wants
- * to connect to us via connection reversal.  Try to connect back to the
- * given IP.
- *
- * @param cls closure
- * @param addr address to try
- * @param addrlen number of bytes in @a addr
- */
-static void
-try_connection_reversal (void *cls,
-                         const struct sockaddr *addr,
-                         socklen_t addrlen)
-{
-  struct Plugin *plugin = cls;
-  struct GNUNET_CONNECTION_Handle *sock;
-  struct TCPProbeContext *tcp_probe_ctx;
-
-  /**
-   * We have received an ICMP response, ostensibly from a peer
-   * that wants to connect to us! Send a message to establish a connection.
-   */
-  sock = GNUNET_CONNECTION_create_from_sockaddr (AF_INET,
-						 addr,
-						 addrlen);
-  if (NULL == sock)
-  {
-    /* failed for some odd reason (out of sockets?); ignore attempt */
-    return;
-  }
-
-  tcp_probe_ctx = GNUNET_new (struct TCPProbeContext);
-  tcp_probe_ctx->message.header.size
-    = htons (sizeof (struct TCP_NAT_ProbeMessage));
-  tcp_probe_ctx->message.header.type
-    = htons (GNUNET_MESSAGE_TYPE_TRANSPORT_TCP_NAT_PROBE);
-  tcp_probe_ctx->message.clientIdentity
-    = *plugin->env->my_identity;
-  tcp_probe_ctx->plugin = plugin;
-  tcp_probe_ctx->sock = sock;
-  GNUNET_CONTAINER_DLL_insert (plugin->probe_head,
-                               plugin->probe_tail,
-                               tcp_probe_ctx);
-  tcp_probe_ctx->transmit_handle
-    = GNUNET_CONNECTION_notify_transmit_ready (sock,
-                                               ntohs (tcp_probe_ctx->message.header.size),
-                                               GNUNET_TIME_UNIT_FOREVER_REL,
-                                               &notify_send_probe,
-                                               tcp_probe_ctx);
-}
-
-
-/**
- * Function obtain the network type for a session
- *
- * @param cls closure (`struct Plugin *`)
- * @param session the session
- * @return the network type in HBO or #GNUNET_SYSERR
- */
-static enum GNUNET_NetworkType
-tcp_plugin_get_network (void *cls,
-                        struct GNUNET_ATS_Session *session)
-{
-  return session->scope;
-}
-
-
-/**
- * Function obtain the network type for an address.
- *
- * @param cls closure (`struct Plugin *`)
- * @param address the address
- * @return the network type
- */
-static enum GNUNET_NetworkType
-tcp_plugin_get_network_for_address (void *cls,
-                                    const struct GNUNET_HELLO_Address *address)
-{
-  struct Plugin *plugin = cls;
-  size_t addrlen;
-  struct sockaddr_in a4;
-  struct sockaddr_in6 a6;
-  const struct IPv4TcpAddress *t4;
-  const struct IPv6TcpAddress *t6;
-  const void *sb;
-  size_t sbs;
-
-  addrlen = address->address_length;
-  if (addrlen == sizeof(struct IPv6TcpAddress))
-  {
-    GNUNET_assert (NULL != address->address); /* make static analysis happy */
-    t6 = address->address;
-    memset (&a6, 0, sizeof(a6));
-#if HAVE_SOCKADDR_IN_SIN_LEN
-    a6.sin6_len = sizeof (a6);
-#endif
-    a6.sin6_family = AF_INET6;
-    a6.sin6_port = t6->t6_port;
-    GNUNET_memcpy (&a6.sin6_addr, &t6->ipv6_addr, sizeof(struct in6_addr));
-    sb = &a6;
-    sbs = sizeof(a6);
-  }
-  else if (addrlen == sizeof(struct IPv4TcpAddress))
-  {
-    GNUNET_assert (NULL != address->address); /* make static analysis happy */
-    t4 = address->address;
-    memset (&a4, 0, sizeof(a4));
-#if HAVE_SOCKADDR_IN_SIN_LEN
-    a4.sin_len = sizeof (a4);
-#endif
-    a4.sin_family = AF_INET;
-    a4.sin_port = t4->t4_port;
-    a4.sin_addr.s_addr = t4->ipv4_addr;
-    sb = &a4;
-    sbs = sizeof(a4);
-  }
-  else
-  {
-    GNUNET_break (0);
-    return GNUNET_NT_UNSPECIFIED;
-  }
-  return plugin->env->get_address_type (plugin->env->cls,
-                                        sb,
-                                        sbs);
-}
-
-
-/**
- * Return information about the given session to the
- * monitor callback.
- *
- * @param cls the `struct Plugin` with the monitor callback (`sic`)
- * @param peer peer we send information about
- * @param value our `struct GNUNET_ATS_Session` to send information about
- * @return #GNUNET_OK (continue to iterate)
- */
-static int
-send_session_info_iter (void *cls,
-                        const struct GNUNET_PeerIdentity *peer,
-                        void *value)
-{
-  struct Plugin *plugin = cls;
-  struct GNUNET_ATS_Session *session = value;
-
-  notify_session_monitor (plugin,
-                          session,
-                          GNUNET_TRANSPORT_SS_INIT);
-  /* FIXME: cannot tell if this is up or not from current
-     session state... */
-  notify_session_monitor (plugin,
-                          session,
-                          GNUNET_TRANSPORT_SS_UP);
-  return GNUNET_OK;
-}
-
-
-/**
- * Begin monitoring sessions of a plugin.  There can only
- * be one active monitor per plugin (i.e. if there are
- * multiple monitors, the transport service needs to
- * multiplex the generated events over all of them).
- *
- * @param cls closure of the plugin
- * @param sic callback to invoke, NULL to disable monitor;
- *            plugin will being by iterating over all active
- *            sessions immediately and then enter monitor mode
- * @param sic_cls closure for @a sic
- */
-static void
-tcp_plugin_setup_monitor (void *cls,
-                          GNUNET_TRANSPORT_SessionInfoCallback sic,
-                          void *sic_cls)
-{
-  struct Plugin *plugin = cls;
-
-  plugin->sic = sic;
-  plugin->sic_cls = sic_cls;
-  if (NULL != sic)
-  {
-    GNUNET_CONTAINER_multipeermap_iterate (plugin->sessionmap,
-                                           &send_session_info_iter,
-                                           plugin);
-    /* signal end of first iteration */
-    sic (sic_cls, NULL, NULL);
-  }
-}
-
-
-/**
- * Entry point for the plugin.
- *
- * @param cls closure, the `struct GNUNET_TRANSPORT_PluginEnvironment *`
- * @return the `struct GNUNET_TRANSPORT_PluginFunctions *` or NULL on error
- */
-void *
-libgnunet_plugin_transport_xt_init (void *cls)
-{
-  static const struct GNUNET_SERVER_MessageHandler my_handlers[] = {
-    { &handle_tcp_welcome, NULL,
-      GNUNET_MESSAGE_TYPE_TRANSPORT_TCP_WELCOME,
-      sizeof(struct WelcomeMessage) },
-    { &handle_tcp_nat_probe, NULL,
-      GNUNET_MESSAGE_TYPE_TRANSPORT_TCP_NAT_PROBE,
-      sizeof(struct TCP_NAT_ProbeMessage) },
-    { &handle_tcp_data, NULL,
-      GNUNET_MESSAGE_TYPE_ALL, 0 },
-    { NULL, NULL, 0, 0 }
-  };
-  struct GNUNET_TRANSPORT_PluginEnvironment *env = cls;
-  struct GNUNET_TRANSPORT_PluginFunctions *api;
-  struct Plugin *plugin;
-  struct LEGACY_SERVICE_Context *service;
-  unsigned long long aport;
-  unsigned long long bport;
-  unsigned long long max_connections;
-  unsigned int i;
-  struct GNUNET_TIME_Relative idle_timeout;
-#ifdef TCP_STEALTH
-  struct GNUNET_NETWORK_Handle *const*lsocks;
-#endif
-  int ret;
-  int ret_s;
-  struct sockaddr **addrs;
-  socklen_t *addrlens;
-
-  if (NULL == env->receive)
-  {
-    /* run in 'stub' mode (i.e. as part of gnunet-peerinfo), don't fully
-     initialze the plugin or the API */
-    api = GNUNET_new (struct GNUNET_TRANSPORT_PluginFunctions);
-    api->cls = NULL;
-    api->address_pretty_printer = &tcp_plugin_address_pretty_printer;
-    api->address_to_string = &tcp_plugin_address_to_string;
-    api->string_to_address = &tcp_plugin_string_to_address;
-    return api;
-  }
-
-  GNUNET_assert (NULL != env->cfg);
-  if (GNUNET_OK !=
-      GNUNET_CONFIGURATION_get_value_number (env->cfg,
-                                             "transport-xt",
-                                             "MAX_CONNECTIONS",
-                                             &max_connections))
-    max_connections = 128;
-
-  aport = 0;
-  if ((GNUNET_OK !=
-       GNUNET_CONFIGURATION_get_value_number (env->cfg,
-					      "transport-xt",
-                                              "PORT", &bport)) ||
-      (bport > 65535) ||
-      ((GNUNET_OK ==
-        GNUNET_CONFIGURATION_get_value_number (env->cfg,
-					       "transport-xt",
-                                               "ADVERTISED-PORT", &aport)) &&
-       (aport > 65535) ))
-  {
-    LOG(GNUNET_ERROR_TYPE_ERROR,
-        _("Require valid port number for service `%s' in configuration!\n"),
-        "transport-xt");
-    return NULL ;
-  }
-  if (0 == aport)
-    aport = bport;
-  if (0 == bport)
-    aport = 0;
-  if (0 != bport)
-  {
-    service = LEGACY_SERVICE_start ("transport-xt",
-                                    env->cfg,
-                                    LEGACY_SERVICE_OPTION_NONE);
-    if (NULL == service)
-    {
-      LOG (GNUNET_ERROR_TYPE_WARNING,
-           _("Failed to start service.\n"));
-      return NULL;
-    }
-  }
-  else
-    service = NULL;
-
-  api = NULL;
-  plugin = GNUNET_new (struct Plugin);
-  plugin->sessionmap = GNUNET_CONTAINER_multipeermap_create (max_connections,
-                                                             GNUNET_YES);
-  plugin->max_connections = max_connections;
-  plugin->open_port = bport;
-  plugin->adv_port = aport;
-  plugin->env = env;
-  plugin->my_welcome.header.size = htons (sizeof(struct WelcomeMessage));
-  plugin->my_welcome.header.type = htons (GNUNET_MESSAGE_TYPE_TRANSPORT_TCP_WELCOME);
-  plugin->my_welcome.clientIdentity = *plugin->env->my_identity;
-
-  if ( (NULL != service) &&
-       (GNUNET_YES ==
-        GNUNET_CONFIGURATION_get_value_yesno (env->cfg,
-                                              "transport-xt",
-                                              "TCP_STEALTH")) )
-  {
-#ifdef TCP_STEALTH
-    plugin->myoptions |= TCP_OPTIONS_TCP_STEALTH;
-    lsocks = LEGACY_SERVICE_get_listen_sockets (service);
-    if (NULL != lsocks)
-    {
-      uint32_t len = sizeof (struct WelcomeMessage);
-
-      for (i=0;NULL!=lsocks[i];i++)
-      {
-        if ( (GNUNET_OK !=
-              GNUNET_NETWORK_socket_setsockopt (lsocks[i],
-                                                IPPROTO_TCP,
-                                                TCP_STEALTH,
-                                                env->my_identity,
-                                                sizeof (struct GNUNET_PeerIdentity))) ||
-             (GNUNET_OK !=
-              GNUNET_NETWORK_socket_setsockopt (lsocks[i],
-                                                IPPROTO_TCP,
-                                                TCP_STEALTH_INTEGRITY_LEN,
-                                                &len,
-                                                sizeof (len))) )
-        {
-          /* TCP STEALTH not supported by kernel */
-          GNUNET_assert (0 == i);
-          GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                      _("TCP_STEALTH not supported on this platform.\n"));
-          goto die;
-        }
-      }
-    }
-#else
-    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                _("TCP_STEALTH not supported on this platform.\n"));
-    goto die;
-#endif
-  }
-
-  if ( (NULL != service) &&
-       (GNUNET_SYSERR !=
-        (ret_s =
-         get_server_addresses ("transport-xt",
-			       env->cfg,
-			       &addrs,
-			       &addrlens))))
-  {
-    for (ret = ret_s-1; ret >= 0; ret--)
-      LOG (GNUNET_ERROR_TYPE_INFO,
-           "Binding to address `%s'\n",
-           GNUNET_a2s (addrs[ret], addrlens[ret]));
-    plugin->nat
-      = GNUNET_NAT_register (env->cfg,
-			     "transport-xt",
-			     IPPROTO_TCP,
-                             (unsigned int) ret_s,
-                             (const struct sockaddr **) addrs,
-			     addrlens,
-                             &tcp_nat_port_map_callback,
-                             &try_connection_reversal,
-                             plugin);
-    for (ret = ret_s -1; ret >= 0; ret--)
-      GNUNET_free (addrs[ret]);
-    GNUNET_free_non_null (addrs);
-    GNUNET_free_non_null (addrlens);
-  }
-  else
-  {
-    plugin->nat = GNUNET_NAT_register (plugin->env->cfg,
-                                       "transport-xt",
-				       IPPROTO_TCP,
-                                       0,
-                                       NULL,
-                                       NULL,
-                                       NULL,
-                                       &try_connection_reversal,
-                                       plugin);
-  }
-  api = GNUNET_new (struct GNUNET_TRANSPORT_PluginFunctions);
-  api->cls = plugin;
-  api->send = &tcp_plugin_send;
-  api->get_session = &tcp_plugin_get_session;
-  api->disconnect_session = &tcp_plugin_disconnect_session;
-  api->query_keepalive_factor = &tcp_plugin_query_keepalive_factor;
-  api->disconnect_peer = &tcp_plugin_disconnect;
-  api->address_pretty_printer = &tcp_plugin_address_pretty_printer;
-  api->check_address = &tcp_plugin_check_address;
-  api->address_to_string = &tcp_plugin_address_to_string;
-  api->string_to_address = &tcp_plugin_string_to_address;
-  api->get_network = &tcp_plugin_get_network;
-  api->get_network_for_address = &tcp_plugin_get_network_for_address;
-  api->update_session_timeout = &tcp_plugin_update_session_timeout;
-  api->update_inbound_delay = &tcp_plugin_update_inbound_delay;
-  api->setup_monitor = &tcp_plugin_setup_monitor;
-  plugin->service = service;
-  if (NULL != service)
-  {
-    plugin->server = LEGACY_SERVICE_get_server (service);
-  }
-  else
-  {
-    if (GNUNET_OK !=
-        GNUNET_CONFIGURATION_get_value_time (env->cfg,
-                                             "transport-xt",
-                                             "TIMEOUT",
-                                             &idle_timeout))
-    {
-      GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
-                                 "transport-xt",
-                                 "TIMEOUT");
-      goto die;
-    }
-    plugin->server
-      = GNUNET_SERVER_create_with_sockets (NULL,
-                                           plugin,
-					   NULL,
-                                           idle_timeout,
-					   GNUNET_YES);
-  }
-  plugin->handlers = GNUNET_malloc (sizeof (my_handlers));
-  GNUNET_memcpy (plugin->handlers,
-		 my_handlers,
-		 sizeof(my_handlers));
-  for (i = 0;i < sizeof(my_handlers) / sizeof(struct GNUNET_SERVER_MessageHandler);i++)
-    plugin->handlers[i].callback_cls = plugin;
-
-  GNUNET_SERVER_add_handlers (plugin->server,
-                              plugin->handlers);
-  GNUNET_SERVER_connect_notify (plugin->server,
-				&connect_notify,
-				plugin);
-  GNUNET_SERVER_disconnect_notify (plugin->server,
-                                   &disconnect_notify,
-                                   plugin);
-  plugin->nat_wait_conns = GNUNET_CONTAINER_multipeermap_create (16,
-                                                                 GNUNET_YES);
-  if (0 != bport)
-    LOG (GNUNET_ERROR_TYPE_INFO,
-         _("XT transport listening on port %llu\n"),
-         bport);
-  else
-    LOG (GNUNET_ERROR_TYPE_INFO,
-         _("XT transport not listening on any port (client only)\n"));
-  if ( (aport != bport) &&
-       (0 != bport) )
-    LOG (GNUNET_ERROR_TYPE_INFO,
-         _("XT transport advertises itself as being on port %llu\n"),
-         aport);
-  /* Initially set connections to 0 */
-  GNUNET_STATISTICS_set (plugin->env->stats,
-                         gettext_noop ("# XT sessions active"),
-                         0,
-                         GNUNET_NO);
-  return api;
-
- die:
-  if (NULL != plugin->nat)
-    GNUNET_NAT_unregister (plugin->nat);
-  GNUNET_CONTAINER_multipeermap_destroy (plugin->sessionmap);
-  if (NULL != service)
-    LEGACY_SERVICE_stop (service);
-  GNUNET_free (plugin);
-  GNUNET_free_non_null (api);
-  return NULL;
-}
-
-
-/**
- * Exit point from the plugin.
- *
- * @param cls the `struct GNUNET_TRANSPORT_PluginFunctions`
- * @return NULL
- */
-void *
-libgnunet_plugin_transport_xt_done (void *cls)
-{
-  struct GNUNET_TRANSPORT_PluginFunctions *api = cls;
-  struct Plugin *plugin = api->cls;
-  struct TCPProbeContext *tcp_probe;
-  struct PrettyPrinterContext *cur;
-  struct PrettyPrinterContext *next;
-
-  if (NULL == plugin)
-  {
-    GNUNET_free(api);
-    return NULL ;
-  }
-  LOG (GNUNET_ERROR_TYPE_DEBUG,
-       "Shutting down XT plugin\n");
-
-  /* Removing leftover sessions */
-  GNUNET_CONTAINER_multipeermap_iterate (plugin->sessionmap,
-                                         &session_disconnect_it,
-                                         plugin);
-  /* Removing leftover NAT sessions */
-  GNUNET_CONTAINER_multipeermap_iterate (plugin->nat_wait_conns,
-                                         &session_disconnect_it,
-                                         plugin);
-
-  for (cur = plugin->ppc_dll_head; NULL != cur; cur = next)
-  {
-    next = cur->next;
-    GNUNET_CONTAINER_DLL_remove (plugin->ppc_dll_head,
-                                 plugin->ppc_dll_tail,
-                                 cur);
-    GNUNET_RESOLVER_request_cancel (cur->resolver_handle);
-    cur->asc (cur->asc_cls,
-	      NULL,
-	      GNUNET_OK);
-    GNUNET_free (cur);
-  }
-
-  if (NULL != plugin->service)
-    LEGACY_SERVICE_stop (plugin->service);
-  else
-    GNUNET_SERVER_destroy (plugin->server);
-  GNUNET_free (plugin->handlers);
-  if (NULL != plugin->nat)
-    GNUNET_NAT_unregister (plugin->nat);
-  while (NULL != (tcp_probe = plugin->probe_head))
-  {
-    GNUNET_CONTAINER_DLL_remove (plugin->probe_head,
-                                 plugin->probe_tail,
-                                 tcp_probe);
-    GNUNET_CONNECTION_destroy (tcp_probe->sock);
-    GNUNET_free (tcp_probe);
-  }
-  GNUNET_CONTAINER_multipeermap_destroy (plugin->nat_wait_conns);
-  GNUNET_CONTAINER_multipeermap_destroy (plugin->sessionmap);
-  GNUNET_break (0 == plugin->cur_connections);
-  GNUNET_free (plugin);
-  GNUNET_free (api);
-  return NULL;
-}
-
-/* end of plugin_transport_xt.c */

+ 0 - 2492
src/transport/plugin_transport_xu.c

@@ -1,2492 +0,0 @@
-/*
- This file is part of GNUnet
- Copyright (C) 2010-2017 GNUnet e.V.
-
- GNUnet 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.
-
- 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
- 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/>.
-
-     SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file transport/plugin_transport_xu.c
- * @brief Implementation of the XU transport protocol
- * @author Christian Grothoff
- * @author Nathan Evans
- * @author Matthias Wachs
- */
-#include "platform.h"
-#include "plugin_transport_xu.h"
-#include "gnunet_hello_lib.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_fragmentation_lib.h"
-#include "gnunet_nat_service.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__)
-
-/**
- * After how much inactivity should a XU session time out?
- */
-#define XU_SESSION_TIME_OUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 60)
-
-
-/**
- * XU Message-Packet header (after defragmentation).
- */
-struct XUMessage
-{
-  /**
-   * Message header.
-   */
-  struct GNUNET_MessageHeader header;
-
-  /**
-   * Always zero for now.
-   */
-  uint32_t reserved;
-
-  /**
-   * What is the identity of the sender
-   */
-  struct GNUNET_PeerIdentity sender;
-
-};
-
-
-/**
- * Closure for #append_port().
- */
-struct PrettyPrinterContext
-{
-  /**
-   * DLL
-   */
-  struct PrettyPrinterContext *next;
-
-  /**
-   * DLL
-   */
-  struct PrettyPrinterContext *prev;
-
-  /**
-   * Our plugin.
-   */
-  struct Plugin *plugin;
-
-  /**
-   * Resolver handle
-   */
-  struct GNUNET_RESOLVER_RequestHandle *resolver_handle;
-
-  /**
-   * Function to call with the result.
-   */
-  GNUNET_TRANSPORT_AddressStringCallback asc;
-
-  /**
-   * Clsoure for @e asc.
-   */
-  void *asc_cls;
-
-  /**
-   * Timeout task
-   */
-  struct GNUNET_SCHEDULER_Task *timeout_task;
-
-  /**
-   * Is this an IPv6 address?
-   */
-  int ipv6;
-
-  /**
-   * Options
-   */
-  uint32_t options;
-
-  /**
-   * Port to add after the IP address.
-   */
-  uint16_t port;
-
-};
-
-
-/**
- * Session with another peer.
- */
-struct GNUNET_ATS_Session
-{
-  /**
-   * Which peer is this session for?
-   */
-  struct GNUNET_PeerIdentity target;
-
-  /**
-   * Tokenizer for inbound messages.
-   */
-  struct GNUNET_MessageStreamTokenizer *mst;
-
-  /**
-   * Plugin this session belongs to.
-   */
-  struct Plugin *plugin;
-
-  /**
-   * Session timeout task
-   */
-  struct GNUNET_SCHEDULER_Task *timeout_task;
-
-  /**
-   * When does this session time out?
-   */
-  struct GNUNET_TIME_Absolute timeout;
-
-  /**
-   * What time did we last transmit?
-   */
-  struct GNUNET_TIME_Absolute last_transmit_time;
-
-  /**
-   * expected delay for ACKs
-   */
-  struct GNUNET_TIME_Relative last_expected_ack_delay;
-
-  /**
-   * desired delay between XU messages
-   */
-  struct GNUNET_TIME_Relative last_expected_msg_delay;
-  
-  /**
-   */
-  struct GNUNET_TIME_Relative flow_delay_for_other_peer;
-  struct GNUNET_TIME_Relative flow_delay_from_other_peer;
-
-  /**
-   * Our own address.
-   */
-  struct GNUNET_HELLO_Address *address;
-
-  /**
-   * Number of bytes waiting for transmission to this peer.
-   */
-  unsigned long long bytes_in_queue;
-
-  /**
-   * Number of messages waiting for transmission to this peer.
-   */
-  unsigned int msgs_in_queue;
-
-  /**
-   * Reference counter to indicate that this session is
-   * currently being used and must not be destroyed;
-   * setting @e in_destroy will destroy it as soon as
-   * possible.
-   */
-  unsigned int rc;
-
-  /**
-   * Network type of the address.
-   */
-  enum GNUNET_NetworkType scope;
-
-  /**
-   * Is this session about to be destroyed (sometimes we cannot
-   * destroy a session immediately as below us on the stack
-   * there might be code that still uses it; in this case,
-   * @e rc is non-zero).
-   */
-  int in_destroy;
-};
-
-
-
-/**
- * If a session monitor is attached, notify it about the new
- * session state.
- *
- * @param plugin our plugin
- * @param session session that changed state
- * @param state new state of the session
- */
-static void
-notify_session_monitor (struct Plugin *plugin,
-                        struct GNUNET_ATS_Session *session,
-                        enum GNUNET_TRANSPORT_SessionState state)
-{
-  struct GNUNET_TRANSPORT_SessionInfo info;
-
-  if (NULL == plugin->sic)
-    return;
-  if (GNUNET_YES == session->in_destroy)
-    return; /* already destroyed, just RC>0 left-over actions */
-  memset (&info,
-          0,
-          sizeof (info));
-  info.state = state;
-  info.is_inbound = GNUNET_SYSERR; /* hard to say */
-  info.num_msg_pending = session->msgs_in_queue;
-  info.num_bytes_pending = session->bytes_in_queue;
-  /* info.receive_delay remains zero as this is not supported by XU
-     (cannot selectively not receive from 'some' peer while continuing
-     to receive from others) */
-  info.session_timeout = session->timeout;
-  info.address = session->address;
-  plugin->sic (plugin->sic_cls,
-               session,
-               &info);
-}
-
-
-/**
- * Return information about the given session to the monitor callback.
- *
- * @param cls the `struct Plugin` with the monitor callback (`sic`)
- * @param peer peer we send information about
- * @param value our `struct GNUNET_ATS_Session` to send information about
- * @return #GNUNET_OK (continue to iterate)
- */
-static int
-send_session_info_iter (void *cls,
-                        const struct GNUNET_PeerIdentity *peer,
-                        void *value)
-{
-  struct Plugin *plugin = cls;
-  struct GNUNET_ATS_Session *session = value;
-
-  (void) peer;
-  notify_session_monitor (plugin,
-                          session,
-                          GNUNET_TRANSPORT_SS_INIT);
-  notify_session_monitor (plugin,
-                          session,
-                          GNUNET_TRANSPORT_SS_UP);
-  return GNUNET_OK;
-}
-
-
-/**
- * Begin monitoring sessions of a plugin.  There can only
- * be one active monitor per plugin (i.e. if there are
- * multiple monitors, the transport service needs to
- * multiplex the generated events over all of them).
- *
- * @param cls closure of the plugin
- * @param sic callback to invoke, NULL to disable monitor;
- *            plugin will being by iterating over all active
- *            sessions immediately and then enter monitor mode
- * @param sic_cls closure for @a sic
- */
-static void
-xu_plugin_setup_monitor (void *cls,
-                          GNUNET_TRANSPORT_SessionInfoCallback sic,
-                          void *sic_cls)
-{
-  struct Plugin *plugin = cls;
-
-  plugin->sic = sic;
-  plugin->sic_cls = sic_cls;
-  if (NULL != sic)
-  {
-    GNUNET_CONTAINER_multipeermap_iterate (plugin->sessions,
-                                           &send_session_info_iter,
-                                           plugin);
-    /* signal end of first iteration */
-    sic (sic_cls,
-         NULL,
-         NULL);
-  }
-}
-
-
-/* ****************** Little Helpers ****************** */
-
-
-/**
- * Function to free last resources associated with a session.
- *
- * @param s session to free
- */
-static void
-free_session (struct GNUNET_ATS_Session *s)
-{
-  if (NULL != s->address)
-  {
-    GNUNET_HELLO_address_free (s->address);
-    s->address = NULL;
-  }
-  if (NULL != s->mst)
-  {
-    GNUNET_MST_destroy (s->mst);
-    s->mst = NULL;
-  }
-  GNUNET_free (s);
-}
-
-
-/**
- * Function that is called to get the keepalive factor.
- * #GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT is divided by this number to
- * calculate the interval between keepalive packets.
- *
- * @param cls closure with the `struct Plugin`
- * @return keepalive factor
- */
-static unsigned int
-xu_query_keepalive_factor (void *cls)
-{
-  (void) cls;
-  return 15;
-}
-
-
-/**
- * Function obtain the network type for a session
- *
- * @param cls closure (`struct Plugin *`)
- * @param session the session
- * @return the network type
- */
-static enum GNUNET_NetworkType
-xu_plugin_get_network (void *cls,
-		       struct GNUNET_ATS_Session *session)
-{
-  (void) cls;
-  return session->scope;
-}
-
-
-/**
- * Function obtain the network type for an address.
- *
- * @param cls closure (`struct Plugin *`)
- * @param address the address
- * @return the network type
- */
-static enum GNUNET_NetworkType
-xu_plugin_get_network_for_address (void *cls,
-				   const struct GNUNET_HELLO_Address *address)
-{
-  struct Plugin *plugin = cls;
-  size_t addrlen;
-  struct sockaddr_in a4;
-  struct sockaddr_in6 a6;
-  const struct IPv4XuAddress *u4;
-  const struct IPv6XuAddress *u6;
-  const void *sb;
-  size_t sbs;
-
-  addrlen = address->address_length;
-  if (addrlen == sizeof(struct IPv6XuAddress))
-  {
-    GNUNET_assert (NULL != address->address); /* make static analysis happy */
-    u6 = address->address;
-    memset (&a6, 0, sizeof(a6));
-#if HAVE_SOCKADDR_IN_SIN_LEN
-    a6.sin6_len = sizeof (a6);
-#endif
-    a6.sin6_family = AF_INET6;
-    a6.sin6_port = u6->u6_port;
-    GNUNET_memcpy (&a6.sin6_addr, &u6->ipv6_addr, sizeof(struct in6_addr));
-    sb = &a6;
-    sbs = sizeof(a6);
-  }
-  else if (addrlen == sizeof(struct IPv4XuAddress))
-  {
-    GNUNET_assert (NULL != address->address); /* make static analysis happy */
-    u4 = address->address;
-    memset (&a4, 0, sizeof(a4));
-#if HAVE_SOCKADDR_IN_SIN_LEN
-    a4.sin_len = sizeof (a4);
-#endif
-    a4.sin_family = AF_INET;
-    a4.sin_port = u4->u4_port;
-    a4.sin_addr.s_addr = u4->ipv4_addr;
-    sb = &a4;
-    sbs = sizeof(a4);
-  }
-  else
-  {
-    GNUNET_break (0);
-    return GNUNET_NT_UNSPECIFIED;
-  }
-  return plugin->env->get_address_type (plugin->env->cls,
-                                        sb,
-                                        sbs);
-}
-
-
-/* ******************* Event loop ******************** */
-
-/**
- * We have been notified that our readset has something to read.  We don't
- * know which socket needs to be read, so we have to check each one
- * Then reschedule this function to be called again once more is available.
- *
- * @param cls the plugin handle
- */
-static void
-xu_plugin_select_v4 (void *cls);
-
-
-/**
- * We have been notified that our readset has something to read.  We don't
- * know which socket needs to be read, so we have to check each one
- * Then reschedule this function to be called again once more is available.
- *
- * @param cls the plugin handle
- */
-static void
-xu_plugin_select_v6 (void *cls);
-
-
-/**
- * (re)schedule IPv4-select tasks for this plugin.
- *
- * @param plugin plugin to reschedule
- */
-static void
-schedule_select_v4 (struct Plugin *plugin)
-{
-  if ( (GNUNET_YES != plugin->enable_ipv4) ||
-       (NULL == plugin->sockv4) )
-    return;
-  if (NULL != plugin->select_task_v4)
-    GNUNET_SCHEDULER_cancel (plugin->select_task_v4);
-  plugin->select_task_v4
-    = GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL,
-				     plugin->sockv4,
-				     &xu_plugin_select_v4,
-				     plugin);
-}
-
-
-/**
- * (re)schedule IPv6-select tasks for this plugin.
- *
- * @param plugin plugin to reschedule
- */
-static void
-schedule_select_v6 (struct Plugin *plugin)
-{
-  if ( (GNUNET_YES != plugin->enable_ipv6) ||
-       (NULL == plugin->sockv6) )
-    return;
-  if (NULL != plugin->select_task_v6)
-    GNUNET_SCHEDULER_cancel (plugin->select_task_v6);
-  plugin->select_task_v6
-    = GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL,
-				     plugin->sockv6,
-				     &xu_plugin_select_v6,
-				     plugin);
-}
-
-
-/* ******************* Address to string and back ***************** */
-
-
-/**
- * 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)
-{
-  static char rbuf[INET6_ADDRSTRLEN + 10];
-  char buf[INET6_ADDRSTRLEN];
-  const void *sb;
-  struct in_addr a4;
-  struct in6_addr a6;
-  const struct IPv4XuAddress *t4;
-  const struct IPv6XuAddress *t6;
-  int af;
-  uint16_t port;
-  uint32_t options;
-
-  (void) cls;
-  if (NULL == addr)
-  {
-    GNUNET_break_op (0);
-    return NULL;
-  }
-
-  if (addrlen == sizeof(struct IPv6XuAddress))
-  {
-    t6 = addr;
-    af = AF_INET6;
-    options = ntohl (t6->options);
-    port = ntohs (t6->u6_port);
-    a6 = t6->ipv6_addr;
-    sb = &a6;
-  }
-  else if (addrlen == sizeof(struct IPv4XuAddress))
-  {
-    t4 = addr;
-    af = AF_INET;
-    options = ntohl (t4->options);
-    port = ntohs (t4->u4_port);
-    a4.s_addr = t4->ipv4_addr;
-    sb = &a4;
-  }
-  else
-  {
-    GNUNET_break_op (0);
-    return NULL;
-  }
-  inet_ntop (af,
-             sb,
-             buf,
-             INET6_ADDRSTRLEN);
-  GNUNET_snprintf (rbuf,
-                   sizeof(rbuf),
-                   (af == AF_INET6)
-                   ? "%s.%u.[%s]:%u"
-                   : "%s.%u.%s:%u",
-                   PLUGIN_NAME,
-                   options,
-                   buf,
-                   port);
-  return rbuf;
-}
-
-
-/**
- * Function called to convert a string address to a binary address.
- *
- * @param cls closure (`struct Plugin *`)
- * @param addr string address
- * @param addrlen length of the address
- * @param buf location to store the buffer
- * @param added location to store the number of bytes in the buffer.
- *        If the function returns #GNUNET_SYSERR, its contents are undefined.
- * @return #GNUNET_OK on success, #GNUNET_SYSERR on failure
- */
-static int
-xu_string_to_address (void *cls,
-		      const char *addr,
-		      uint16_t addrlen,
-		      void **buf,
-		      size_t *added)
-{
-  struct sockaddr_storage socket_address;
-  char *address;
-  char *plugin;
-  char *optionstr;
-  uint32_t options;
-
-  (void) cls;
-  /* Format tcp.options.address:port */
-  address = NULL;
-  plugin = NULL;
-  optionstr = NULL;
-
-  if ((NULL == addr) || (0 == addrlen))
-  {
-    GNUNET_break (0);
-    return GNUNET_SYSERR;
-  }
-  if ('\0' != addr[addrlen - 1])
-  {
-    GNUNET_break (0);
-    return GNUNET_SYSERR;
-  }
-  if (strlen (addr) + 1 != (size_t) addrlen)
-  {
-    GNUNET_break (0);
-    return GNUNET_SYSERR;
-  }
-  plugin = GNUNET_strdup (addr);
-  optionstr = strchr (plugin, '.');
-  if (NULL == optionstr)
-  {
-    GNUNET_break (0);
-    GNUNET_free (plugin);
-    return GNUNET_SYSERR;
-  }
-  optionstr[0] = '\0';
-  optionstr++;
-  options = atol (optionstr);
-  address = strchr (optionstr, '.');
-  if (NULL == address)
-  {
-    GNUNET_break (0);
-    GNUNET_free (plugin);
-    return GNUNET_SYSERR;
-  }
-  address[0] = '\0';
-  address++;
-
-  if (GNUNET_OK !=
-      GNUNET_STRINGS_to_address_ip (address,
-                                    strlen (address),
-                                    &socket_address))
-  {
-    GNUNET_break (0);
-    GNUNET_free (plugin);
-    return GNUNET_SYSERR;
-  }
-  GNUNET_free(plugin);
-
-  switch (socket_address.ss_family)
-  {
-  case AF_INET:
-    {
-      struct IPv4XuAddress *u4;
-      const struct sockaddr_in *in4 = (const struct sockaddr_in *) &socket_address;
-
-      u4 = GNUNET_new (struct IPv4XuAddress);
-      u4->options = htonl (options);
-      u4->ipv4_addr = in4->sin_addr.s_addr;
-      u4->u4_port = in4->sin_port;
-      *buf = u4;
-      *added = sizeof (struct IPv4XuAddress);
-      return GNUNET_OK;
-    }
-  case AF_INET6:
-    {
-      struct IPv6XuAddress *u6;
-      const struct sockaddr_in6 *in6 = (const struct sockaddr_in6 *) &socket_address;
-
-      u6 = GNUNET_new (struct IPv6XuAddress);
-      u6->options = htonl (options);
-      u6->ipv6_addr = in6->sin6_addr;
-      u6->u6_port = in6->sin6_port;
-      *buf = u6;
-      *added = sizeof (struct IPv6XuAddress);
-      return GNUNET_OK;
-    }
-  default:
-    GNUNET_break (0);
-    return GNUNET_SYSERR;
-  }
-}
-
-
-/**
- * Append our port and forward the result.
- *
- * @param cls a `struct PrettyPrinterContext *`
- * @param hostname result from DNS resolver
- */
-static void
-append_port (void *cls,
-             const char *hostname)
-{
-  struct PrettyPrinterContext *ppc = cls;
-  struct Plugin *plugin = ppc->plugin;
-  char *ret;
-
-  if (NULL == hostname)
-  {
-    /* Final call, done */
-    GNUNET_CONTAINER_DLL_remove (plugin->ppc_dll_head,
-                                 plugin->ppc_dll_tail,
-                                 ppc);
-    ppc->resolver_handle = NULL;
-    ppc->asc (ppc->asc_cls,
-              NULL,
-              GNUNET_OK);
-    GNUNET_free (ppc);
-    return;
-  }
-  if (GNUNET_YES == ppc->ipv6)
-    GNUNET_asprintf (&ret,
-                     "%s.%u.[%s]:%d",
-                     PLUGIN_NAME,
-                     ppc->options,
-                     hostname,
-                     ppc->port);
-  else
-    GNUNET_asprintf (&ret,
-                     "%s.%u.%s:%d",
-                     PLUGIN_NAME,
-                     ppc->options,
-                     hostname,
-                     ppc->port);
-  ppc->asc (ppc->asc_cls,
-            ret,
-            GNUNET_OK);
-  GNUNET_free (ret);
-}
-
-
-/**
- * Convert the transports address to a nice, human-readable format.
- *
- * @param cls closure with the `struct Plugin *`
- * @param type name of the transport that generated the address
- * @param addr one of the addresses of the host, NULL for the last address
- *        the specific address format depends on the transport;
- *        a `union XuAddress`
- * @param addrlen length of the address
- * @param numeric should (IP) addresses be displayed in numeric form?
- * @param timeout after how long should we give up?
- * @param asc function to call on each string
- * @param asc_cls closure for @a asc
- */
-static void
-xu_plugin_address_pretty_printer (void *cls,
-                                   const char *type,
-                                   const void *addr,
-                                   size_t addrlen,
-                                   int numeric,
-                                   struct GNUNET_TIME_Relative timeout,
-                                   GNUNET_TRANSPORT_AddressStringCallback asc,
-                                   void *asc_cls)
-{
-  struct Plugin *plugin = cls;
-  struct PrettyPrinterContext *ppc;
-  const struct sockaddr *sb;
-  size_t sbs;
-  struct sockaddr_in a4;
-  struct sockaddr_in6 a6;
-  const struct IPv4XuAddress *u4;
-  const struct IPv6XuAddress *u6;
-  uint16_t port;
-  uint32_t options;
-
-  (void) type;
-  if (addrlen == sizeof(struct IPv6XuAddress))
-  {
-    u6 = addr;
-    memset (&a6,
-            0,
-            sizeof (a6));
-    a6.sin6_family = AF_INET6;
-#if HAVE_SOCKADDR_IN_SIN_LEN
-    a6.sin6_len = sizeof (a6);
-#endif
-    a6.sin6_port = u6->u6_port;
-    a6.sin6_addr = u6->ipv6_addr;
-    port = ntohs (u6->u6_port);
-    options = ntohl (u6->options);
-    sb = (const struct sockaddr *) &a6;
-    sbs = sizeof (a6);
-  }
-  else if (addrlen == sizeof (struct IPv4XuAddress))
-  {
-    u4 = addr;
-    memset (&a4,
-            0,
-            sizeof(a4));
-    a4.sin_family = AF_INET;
-#if HAVE_SOCKADDR_IN_SIN_LEN
-    a4.sin_len = sizeof (a4);
-#endif
-    a4.sin_port = u4->u4_port;
-    a4.sin_addr.s_addr = u4->ipv4_addr;
-    port = ntohs (u4->u4_port);
-    options = ntohl (u4->options);
-    sb = (const struct sockaddr *) &a4;
-    sbs = sizeof(a4);
-  }
-  else
-  {
-    /* invalid address */
-    GNUNET_break_op (0);
-    asc (asc_cls,
-         NULL,
-         GNUNET_SYSERR);
-    asc (asc_cls,
-         NULL,
-         GNUNET_OK);
-    return;
-  }
-  ppc = GNUNET_new (struct PrettyPrinterContext);
-  ppc->plugin = plugin;
-  ppc->asc = asc;
-  ppc->asc_cls = asc_cls;
-  ppc->port = port;
-  ppc->options = options;
-  if (addrlen == sizeof (struct IPv6XuAddress))
-    ppc->ipv6 = GNUNET_YES;
-  else
-    ppc->ipv6 = GNUNET_NO;
-  GNUNET_CONTAINER_DLL_insert (plugin->ppc_dll_head,
-                               plugin->ppc_dll_tail,
-                               ppc);
-  ppc->resolver_handle
-    = GNUNET_RESOLVER_hostname_get (sb,
-                                    sbs,
-                                    ! numeric,
-                                    timeout,
-                                    &append_port,
-                                    ppc);
-}
-
-
-/**
- * Check if the given port is plausible (must be either our listen
- * port or our advertised port).  If it is neither, we return
- * #GNUNET_SYSERR.
- *
- * @param plugin global variables
- * @param in_port port number to check
- * @return #GNUNET_OK if port is either our open or advertised port
- */
-static int
-check_port (const struct Plugin *plugin,
-            uint16_t in_port)
-{
-  if ( (plugin->port == in_port) ||
-       (plugin->aport == in_port) )
-    return GNUNET_OK;
-  return GNUNET_SYSERR;
-}
-
-
-/**
- * Function that will be called to check if a binary address for this
- * plugin is well-formed and corresponds to an address for THIS peer
- * (as per our configuration).  Naturally, if absolutely necessary,
- * plugins can be a bit conservative in their answer, but in general
- * plugins should make sure that the address does not redirect
- * traffic to a 3rd party that might try to man-in-the-middle our
- * traffic.
- *
- * @param cls closure, should be our handle to the Plugin
- * @param addr pointer to a `union XuAddress`
- * @param addrlen length of @a addr
- * @return #GNUNET_OK if this is a plausible address for this peer
- *         and transport, #GNUNET_SYSERR if not
- */
-static int
-xu_plugin_check_address (void *cls,
-			 const void *addr,
-			 size_t addrlen)
-{
-  struct Plugin *plugin = cls;
-  const struct IPv4XuAddress *v4;
-  const struct IPv6XuAddress *v6;
-
-  if (sizeof(struct IPv4XuAddress) == addrlen)
-  {
-    struct sockaddr_in s4;
-
-    v4 = (const struct IPv4XuAddress *) addr;
-    if (GNUNET_OK != check_port (plugin,
-                                 ntohs (v4->u4_port)))
-      return GNUNET_SYSERR;
-    memset (&s4, 0, sizeof (s4));
-    s4.sin_family = AF_INET;
-#if HAVE_SOCKADDR_IN_SIN_LEN
-    s4.sin_len = sizeof (s4);
-#endif
-    s4.sin_port = v4->u4_port;
-    s4.sin_addr.s_addr = v4->ipv4_addr;
-
-    if (GNUNET_OK !=
-	GNUNET_NAT_test_address (plugin->nat,
-				 &s4,
-				 sizeof (struct sockaddr_in)))
-      return GNUNET_SYSERR;
-  }
-  else if (sizeof(struct IPv6XuAddress) == addrlen)
-  {
-    struct sockaddr_in6 s6;
-
-    v6 = (const struct IPv6XuAddress *) addr;
-    if (IN6_IS_ADDR_LINKLOCAL (&v6->ipv6_addr))
-      return GNUNET_OK; /* plausible, if unlikely... */
-    memset (&s6, 0, sizeof (s6));
-    s6.sin6_family = AF_INET6;
-#if HAVE_SOCKADDR_IN_SIN_LEN
-    s6.sin6_len = sizeof (s6);
-#endif
-    s6.sin6_port = v6->u6_port;
-    s6.sin6_addr = v6->ipv6_addr;
-
-    if (GNUNET_OK !=
-	GNUNET_NAT_test_address (plugin->nat,
-				 &s6,
-				 sizeof(struct sockaddr_in6)))
-      return GNUNET_SYSERR;
-  }
-  else
-  {
-    GNUNET_break_op (0);
-    return GNUNET_SYSERR;
-  }
-  return GNUNET_OK;
-}
-
-
-/**
- * Our external IP address/port mapping has changed.
- *
- * @param cls closure, the `struct Plugin`
- * @param add_remove #GNUNET_YES to mean the new public IP address,
- *                   #GNUNET_NO to mean the previous (now invalid) one
- * @param ac address class the address belongs to
- * @param addr either the previous or the new public IP address
- * @param addrlen actual length of the @a addr
- */
-static void
-xu_nat_port_map_callback (void *cls,
-                           int add_remove,
-			   enum GNUNET_NAT_AddressClass ac,
-                           const struct sockaddr *addr,
-                           socklen_t addrlen)
-{
-  struct Plugin *plugin = cls;
-  struct GNUNET_HELLO_Address *address;
-  struct IPv4XuAddress u4;
-  struct IPv6XuAddress u6;
-  void *arg;
-  size_t args;
-
-  if (GNUNET_NAT_AC_LOOPBACK == ac)
-    return;
-  if (GNUNET_NAT_AC_LAN == ac)
-    return;
-  if (GNUNET_NAT_AC_LAN_PRIVATE == ac)
-    return;
-  LOG (GNUNET_ERROR_TYPE_DEBUG,
-       (GNUNET_YES == add_remove)
-       ? "NAT notification to add address `%s'\n"
-       : "NAT notification to remove address `%s'\n",
-       GNUNET_a2s (addr,
-                   addrlen));
-  /* convert 'address' to our internal format */
-  switch (addr->sa_family)
-  {
-  case AF_INET:
-    {
-      const struct sockaddr_in *i4;
-
-      GNUNET_assert (sizeof(struct sockaddr_in) == addrlen);
-      i4 = (const struct sockaddr_in *) addr;
-      if (0 == ntohs (i4->sin_port))
-        return; /* Port = 0 means unmapped, ignore these for XU. */
-      memset (&u4,
-              0,
-              sizeof(u4));
-      u4.options = htonl (plugin->myoptions);
-      u4.ipv4_addr = i4->sin_addr.s_addr;
-      u4.u4_port = i4->sin_port;
-      arg = &u4;
-      args = sizeof (struct IPv4XuAddress);
-      break;
-    }
-  case AF_INET6:
-    {
-      const struct sockaddr_in6 *i6;
-
-      GNUNET_assert (sizeof(struct sockaddr_in6) == addrlen);
-      i6 = (const struct sockaddr_in6 *) addr;
-      if (0 == ntohs (i6->sin6_port))
-        return; /* Port = 0 means unmapped, ignore these for XU. */
-      memset (&u6,
-              0,
-              sizeof(u6));
-      u6.options = htonl (plugin->myoptions);
-      u6.ipv6_addr = i6->sin6_addr;
-      u6.u6_port = i6->sin6_port;
-      arg = &u6;
-      args = sizeof (struct IPv6XuAddress);
-      break;
-    }
-  default:
-    GNUNET_break (0);
-    return;
-  }
-  /* modify our published address list */
-  /* TODO: use 'ac' here in the future... */
-  address = GNUNET_HELLO_address_allocate (plugin->env->my_identity,
-                                           PLUGIN_NAME,
-                                           arg,
-                                           args,
-                                           GNUNET_HELLO_ADDRESS_INFO_NONE);
-  plugin->env->notify_address (plugin->env->cls,
-                               add_remove,
-                               address);
-  GNUNET_HELLO_address_free (address);
-}
-
-
-/* ********************* Finding sessions ******************* */
-
-
-/**
- * Closure for #session_cmp_it().
- */
-struct GNUNET_ATS_SessionCompareContext
-{
-  /**
-   * Set to session matching the address.
-   */
-  struct GNUNET_ATS_Session *res;
-
-  /**
-   * Address we are looking for.
-   */
-  const struct GNUNET_HELLO_Address *address;
-};
-
-
-/**
- * Find a session with a matching address.
- *
- * @param cls the `struct GNUNET_ATS_SessionCompareContext *`
- * @param key peer identity (unused)
- * @param value the `struct GNUNET_ATS_Session *`
- * @return #GNUNET_NO if we found the session, #GNUNET_OK if not
- */
-static int
-session_cmp_it (void *cls,
-                const struct GNUNET_PeerIdentity *key,
-                void *value)
-{
-  struct GNUNET_ATS_SessionCompareContext *cctx = cls;
-  struct GNUNET_ATS_Session *s = value;
-
-  (void) key;
-  if (0 == GNUNET_HELLO_address_cmp (s->address,
-                                     cctx->address))
-  {
-    GNUNET_assert (GNUNET_NO == s->in_destroy);
-    cctx->res = s;
-    return GNUNET_NO;
-  }
-  return GNUNET_OK;
-}
-
-
-/**
- * Locate an existing session the transport service is using to
- * send data to another peer.  Performs some basic sanity checks
- * on the address and then tries to locate a matching session.
- *
- * @param cls the plugin
- * @param address the address we should locate the session by
- * @return the session if it exists, or NULL if it is not found
- */
-static struct GNUNET_ATS_Session *
-xu_plugin_lookup_session (void *cls,
-                           const struct GNUNET_HELLO_Address *address)
-{
-  struct Plugin *plugin = cls;
-  const struct IPv6XuAddress *xu_a6;
-  const struct IPv4XuAddress *xu_a4;
-  struct GNUNET_ATS_SessionCompareContext cctx;
-
-  if (NULL == address->address)
-  {
-    GNUNET_break (0);
-    return NULL;
-  }
-  if (sizeof(struct IPv4XuAddress) == address->address_length)
-  {
-    if (NULL == plugin->sockv4)
-      return NULL;
-    xu_a4 = (const struct IPv4XuAddress *) address->address;
-    if (0 == xu_a4->u4_port)
-    {
-      GNUNET_break (0);
-      return NULL;
-    }
-  }
-  else if (sizeof(struct IPv6XuAddress) == address->address_length)
-  {
-    if (NULL == plugin->sockv6)
-      return NULL;
-    xu_a6 = (const struct IPv6XuAddress *) address->address;
-    if (0 == xu_a6->u6_port)
-    {
-      GNUNET_break (0);
-      return NULL;
-    }
-  }
-  else
-  {
-    GNUNET_break (0);
-    return NULL;
-  }
-
-  /* check if session already exists */
-  cctx.address = address;
-  cctx.res = NULL;
-  LOG (GNUNET_ERROR_TYPE_DEBUG,
-       "Looking for existing session for peer `%s' with address `%s'\n",
-       GNUNET_i2s (&address->peer),
-       xu_address_to_string (plugin,
-                              address->address,
-                              address->address_length));
-  GNUNET_CONTAINER_multipeermap_get_multiple (plugin->sessions,
-                                              &address->peer,
-                                              &session_cmp_it,
-                                              &cctx);
-  if (NULL == cctx.res)
-    return NULL;
-  LOG (GNUNET_ERROR_TYPE_DEBUG,
-       "Found existing session %p\n",
-       cctx.res);
-  return cctx.res;
-}
-
-
-/* ********************** Timeout ****************** */
-
-
-/**
- * Increment session timeout due to activity.
- *
- * @param s session to reschedule timeout activity for
- */
-static void
-reschedule_session_timeout (struct GNUNET_ATS_Session *s)
-{
-  if (GNUNET_YES == s->in_destroy)
-    return;
-  GNUNET_assert (NULL != s->timeout_task);
-  s->timeout = GNUNET_TIME_relative_to_absolute (XU_SESSION_TIME_OUT);
-}
-
-
-
-/**
- * Function that will be called whenever the transport service wants to
- * notify the plugin that a session is still active and in use and
- * therefore the session timeout for this session has to be updated
- *
- * @param cls closure with the `struct Plugin`
- * @param peer which peer was the session for
- * @param session which session is being updated
- */
-static void
-xu_plugin_update_session_timeout (void *cls,
-                                   const struct GNUNET_PeerIdentity *peer,
-                                   struct GNUNET_ATS_Session *session)
-{
-  struct Plugin *plugin = cls;
-
-  if (GNUNET_YES !=
-      GNUNET_CONTAINER_multipeermap_contains_value (plugin->sessions,
-                                                    peer,
-                                                    session))
-  {
-    GNUNET_break (0);
-    return;
-  }
-  /* Reschedule session timeout */
-  reschedule_session_timeout (session);
-}
-
-
-/* ************************* Sending ************************ */
-
-
-/**
- * We failed to transmit a message via XU. Generate
- * a descriptive error message.
- *
- * @param plugin our plugin
- * @param sa target address we were trying to reach
- * @param slen number of bytes in @a sa
- * @param error the errno value returned from the sendto() call
- */
-static void
-analyze_send_error (struct Plugin *plugin,
-                    const struct sockaddr *sa,
-                    socklen_t slen,
-                    int error)
-{
-  enum GNUNET_NetworkType type;
-
-  type = plugin->env->get_address_type (plugin->env->cls,
-                                        sa,
-                                        slen);
-  if ( ( (GNUNET_NT_LAN == type) ||
-         (GNUNET_NT_WAN == type) ) &&
-       ( (ENETUNREACH == errno) ||
-         (ENETDOWN == errno) ) )
-  {
-    if (slen == sizeof (struct sockaddr_in))
-    {
-      /* IPv4: "Network unreachable" or "Network down"
-       *
-       * This indicates we do not have connectivity
-       */
-      LOG (GNUNET_ERROR_TYPE_WARNING | GNUNET_ERROR_TYPE_BULK,
-           _("XU could not transmit message to `%s': "
-             "Network seems down, please check your network configuration\n"),
-           GNUNET_a2s (sa,
-                       slen));
-    }
-    if (slen == sizeof (struct sockaddr_in6))
-    {
-      /* IPv6: "Network unreachable" or "Network down"
-       *
-       * This indicates that this system is IPv6 enabled, but does not
-       * have a valid global IPv6 address assigned or we do not have
-       * connectivity
-       */
-      LOG (GNUNET_ERROR_TYPE_WARNING | GNUNET_ERROR_TYPE_BULK,
-           _("XU could not transmit IPv6 message! "
-             "Please check your network configuration and disable IPv6 if your "
-             "connection does not have a global IPv6 address\n"));
-    }
-  }
-  else
-  {
-    LOG (GNUNET_ERROR_TYPE_WARNING,
-         "XU could not transmit message to `%s': `%s'\n",
-         GNUNET_a2s (sa,
-                     slen),
-         STRERROR (error));
-  }
-}
-
-
-
-
-/**
- * Function that can be used by the transport service to transmit a
- * message using the plugin.  Note that in the case of a peer
- * disconnecting, the continuation MUST be called prior to the
- * disconnect notification itself.  This function will be called with
- * this peer's HELLO message to initiate a fresh connection to another
- * peer.
- *
- * @param cls closure
- * @param s which session must be used
- * @param msgbuf the message to transmit
- * @param msgbuf_size number of bytes in @a msgbuf
- * @param priority how important is the message (most plugins will
- *                 ignore message priority and just FIFO)
- * @param to how long to wait at most for the transmission (does not
- *                require plugins to discard the message after the timeout,
- *                just advisory for the desired delay; most plugins will ignore
- *                this as well)
- * @param cont continuation to call once the message has
- *        been transmitted (or if the transport is ready
- *        for the next transmission call; or if the
- *        peer disconnected...); can be NULL
- * @param cont_cls closure for @a cont
- * @return number of bytes used (on the physical network, with overheads);
- *         -1 on hard errors (i.e. address invalid); 0 is a legal value
- *         and does NOT mean that the message was not transmitted (DV)
- */
-static ssize_t
-xu_plugin_send (void *cls,
-		struct GNUNET_ATS_Session *s,
-		const char *msgbuf,
-		size_t msgbuf_size,
-		unsigned int priority,
-		struct GNUNET_TIME_Relative to,
-		GNUNET_TRANSPORT_TransmitContinuation cont,
-		void *cont_cls)
-{
-  struct Plugin *plugin = cls;
-  size_t xumlen = msgbuf_size + sizeof(struct XUMessage);
-  struct XUMessage *xu;
-  char mbuf[xumlen] GNUNET_ALIGN;
-  ssize_t sent;
-  socklen_t slen;
-  const struct sockaddr *a;
-  const struct IPv4XuAddress *u4;
-  struct sockaddr_in a4;
-  const struct IPv6XuAddress *u6;
-  struct sockaddr_in6 a6;
-  struct GNUNET_NETWORK_Handle *sock;
-
-  (void) priority;
-  (void) to;
-  if ( (sizeof(struct IPv6XuAddress) == s->address->address_length) &&
-       (NULL == plugin->sockv6) )
-    return GNUNET_SYSERR;
-  if ( (sizeof(struct IPv4XuAddress) == s->address->address_length) &&
-       (NULL == plugin->sockv4) )
-    return GNUNET_SYSERR;
-  if (xumlen >= GNUNET_MAX_MESSAGE_SIZE)
-  {
-    GNUNET_break (0);
-    return GNUNET_SYSERR;
-  }
-  if (GNUNET_YES !=
-      GNUNET_CONTAINER_multipeermap_contains_value (plugin->sessions,
-                                                    &s->target,
-                                                    s))
-  {
-    GNUNET_break (0);
-    return GNUNET_SYSERR;
-  }
-  LOG (GNUNET_ERROR_TYPE_DEBUG,
-       "XU transmits %u-byte message to `%s' using address `%s'\n",
-       xumlen,
-       GNUNET_i2s (&s->target),
-       xu_address_to_string (plugin,
-                              s->address->address,
-                              s->address->address_length));
-  xu = (struct XUMessage *) mbuf;
-  xu->header.size = htons (xumlen);
-  xu->header.type = htons (GNUNET_MESSAGE_TYPE_TRANSPORT_XU_MESSAGE);
-  xu->reserved = htonl (0);
-  xu->sender = *plugin->env->my_identity;
-  GNUNET_memcpy (&xu[1],
-		 msgbuf,
-		 msgbuf_size);
-  
-  if (sizeof (struct IPv4XuAddress) == s->address->address_length)
-  {
-    u4 = s->address->address;
-    memset (&a4,
-	    0,
-	    sizeof(a4));
-    a4.sin_family = AF_INET;
-#if HAVE_SOCKADDR_IN_SIN_LEN
-    a4.sin_len = sizeof (a4);
-#endif
-    a4.sin_port = u4->u4_port;
-    a4.sin_addr.s_addr = u4->ipv4_addr;
-    a = (const struct sockaddr *) &a4;
-    slen = sizeof (a4);
-    sock = plugin->sockv4;
-  }
-  else if (sizeof (struct IPv6XuAddress) == s->address->address_length)
-  {
-    u6 = s->address->address;
-    memset (&a6,
-	    0,
-	    sizeof(a6));
-    a6.sin6_family = AF_INET6;
-#if HAVE_SOCKADDR_IN_SIN_LEN
-    a6.sin6_len = sizeof (a6);
-#endif
-    a6.sin6_port = u6->u6_port;
-    a6.sin6_addr = u6->ipv6_addr;
-    a = (const struct sockaddr *) &a6;
-    slen = sizeof (a6);
-    sock = plugin->sockv6;
-  }
-  else
-  {
-    GNUNET_break (0);
-    return GNUNET_SYSERR;
-  }
-    
-  sent = GNUNET_NETWORK_socket_sendto (sock,
-				       mbuf,
-				       xumlen,
-				       a,
-				       slen);
-  s->last_transmit_time
-    = GNUNET_TIME_absolute_max (GNUNET_TIME_absolute_get (),
-				s->last_transmit_time);
-  
-  if (GNUNET_SYSERR == sent)
-  {
-    /* Failure */
-    analyze_send_error (plugin,
-			a,
-			slen,
-			errno);
-    GNUNET_STATISTICS_update (plugin->env->stats,
-			      "# XU, total, bytes, sent, failure",
-			      sent,
-			      GNUNET_NO);
-    GNUNET_STATISTICS_update (plugin->env->stats,
-			      "# XU, total, messages, sent, failure",
-			      1,
-			      GNUNET_NO);
-    return GNUNET_SYSERR;
-  }
-  /* Success */
-  LOG (GNUNET_ERROR_TYPE_DEBUG,
-       "XU transmitted %u-byte message to  `%s' `%s' (%d: %s)\n",
-       (unsigned int) (msgbuf_size),
-       GNUNET_i2s (&s->target),
-       GNUNET_a2s (a,
-		   slen),
-       (int ) sent,
-       (sent < 0) ? STRERROR (errno) : "ok");
-  GNUNET_STATISTICS_update (plugin->env->stats,
-			    "# XU, total, bytes, sent, success",
-			    sent,
-			    GNUNET_NO);
-  GNUNET_STATISTICS_update (plugin->env->stats,
-			    "# XU, total, messages, sent, success",
-			    1,
-			    GNUNET_NO);
-  cont (cont_cls,
-	&s->target,
-	GNUNET_OK,
-	msgbuf_size,
-	xumlen);
-  notify_session_monitor (s->plugin,
-                          s,
-                          GNUNET_TRANSPORT_SS_UPDATE);
-  return xumlen;
-}
-
-
-/* ********************** Receiving ********************** */
-
-
-/**
- * Functions with this signature are called whenever we need to close
- * a session due to a disconnect or failure to establish a connection.
- *
- * @param cls closure with the `struct Plugin`
- * @param s session to close down
- * @return #GNUNET_OK on success
- */
-static int
-xu_disconnect_session (void *cls,
-                        struct GNUNET_ATS_Session *s)
-{
-  struct Plugin *plugin = cls;
-
-  GNUNET_assert (GNUNET_YES != s->in_destroy);
-  LOG (GNUNET_ERROR_TYPE_DEBUG,
-       "Session %p to peer `%s' at address %s ended\n",
-       s,
-       GNUNET_i2s (&s->target),
-       xu_address_to_string (plugin,
-                              s->address->address,
-                              s->address->address_length));
-  if (NULL != s->timeout_task)
-  {
-    GNUNET_SCHEDULER_cancel (s->timeout_task);
-    s->timeout_task = NULL;
-  }
-  GNUNET_assert (GNUNET_YES ==
-                 GNUNET_CONTAINER_multipeermap_remove (plugin->sessions,
-                                                       &s->target,
-                                                       s));
-  s->in_destroy = GNUNET_YES;
-  notify_session_monitor (s->plugin,
-                          s,
-                          GNUNET_TRANSPORT_SS_DONE);
-  plugin->env->session_end (plugin->env->cls,
-                            s->address,
-                            s);
-  GNUNET_STATISTICS_set (plugin->env->stats,
-                         "# XU sessions active",
-                         GNUNET_CONTAINER_multipeermap_size (plugin->sessions),
-                         GNUNET_NO);
-  if (0 == s->rc)
-    free_session (s);
-  return GNUNET_OK;
-}
-
-
-/**
- * Message tokenizer has broken up an incomming message. Pass it on
- * to the service.
- *
- * @param cls the `struct GNUNET_ATS_Session *`
- * @param hdr the actual message
- * @return #GNUNET_OK (always)
- */
-static int
-process_inbound_tokenized_messages (void *cls,
-                                    const struct GNUNET_MessageHeader *hdr)
-{
-  struct GNUNET_ATS_Session *session = cls;
-  struct Plugin *plugin = session->plugin;
-
-  if (GNUNET_YES == session->in_destroy)
-    return GNUNET_OK;
-  reschedule_session_timeout (session);
-  session->flow_delay_for_other_peer
-    = plugin->env->receive (plugin->env->cls,
-                            session->address,
-                            session,
-                            hdr);
-  return GNUNET_OK;
-}
-
-
-/**
- * Destroy a session, plugin is being unloaded.
- *
- * @param cls the `struct Plugin`
- * @param key hash of public key of target peer
- * @param value a `struct PeerSession *` to clean up
- * @return #GNUNET_OK (continue to iterate)
- */
-static int
-disconnect_and_free_it (void *cls,
-                        const struct GNUNET_PeerIdentity *key,
-                        void *value)
-{
-  struct Plugin *plugin = cls;
-
-  (void) key;
-  xu_disconnect_session (plugin,
-			 value);
-  return GNUNET_OK;
-}
-
-
-/**
- * Disconnect from a remote node.  Clean up session if we have one for
- * this peer.
- *
- * @param cls closure for this call (should be handle to Plugin)
- * @param target the peeridentity of the peer to disconnect
- * @return #GNUNET_OK on success, #GNUNET_SYSERR if the operation failed
- */
-static void
-xu_disconnect (void *cls,
-                const struct GNUNET_PeerIdentity *target)
-{
-  struct Plugin *plugin = cls;
-
-  LOG (GNUNET_ERROR_TYPE_DEBUG,
-       "Disconnecting from peer `%s'\n",
-       GNUNET_i2s (target));
-  GNUNET_CONTAINER_multipeermap_get_multiple (plugin->sessions,
-                                              target,
-                                              &disconnect_and_free_it,
-                                              plugin);
-}
-
-
-/**
- * Session was idle, so disconnect it.
- *
- * @param cls the `struct GNUNET_ATS_Session` to time out
- */
-static void
-session_timeout (void *cls)
-{
-  struct GNUNET_ATS_Session *s = cls;
-  struct Plugin *plugin = s->plugin;
-  struct GNUNET_TIME_Relative left;
-
-  s->timeout_task = NULL;
-  left = GNUNET_TIME_absolute_get_remaining (s->timeout);
-  if (left.rel_value_us > 0)
-  {
-    /* not actually our turn yet, but let's at least update
-       the monitor, it may think we're about to die ... */
-    notify_session_monitor (s->plugin,
-                            s,
-                            GNUNET_TRANSPORT_SS_UPDATE);
-    s->timeout_task = GNUNET_SCHEDULER_add_delayed (left,
-                                                    &session_timeout,
-                                                    s);
-    return;
-  }
-  LOG (GNUNET_ERROR_TYPE_DEBUG,
-       "Session %p was idle for %s, disconnecting\n",
-       s,
-       GNUNET_STRINGS_relative_time_to_string (XU_SESSION_TIME_OUT,
-                                               GNUNET_YES));
-  /* call session destroy function */
-  xu_disconnect_session (plugin,
-                          s);
-}
-
-
-/**
- * Allocate a new session for the given endpoint address.
- * Note that this function does not inform the service
- * of the new session, this is the responsibility of the
- * caller (if needed).
- *
- * @param cls the `struct Plugin`
- * @param address address of the other peer to use
- * @param network_type network type the address belongs to
- * @return NULL on error, otherwise session handle
- */
-static struct GNUNET_ATS_Session *
-xu_plugin_create_session (void *cls,
-                           const struct GNUNET_HELLO_Address *address,
-                           enum GNUNET_NetworkType network_type)
-{
-  struct Plugin *plugin = cls;
-  struct GNUNET_ATS_Session *s;
-
-  s = GNUNET_new (struct GNUNET_ATS_Session);
-  s->mst = GNUNET_MST_create (&process_inbound_tokenized_messages,
-                              s);
-  s->plugin = plugin;
-  s->address = GNUNET_HELLO_address_copy (address);
-  s->target = address->peer;
-  s->last_transmit_time = GNUNET_TIME_absolute_get ();
-  s->last_expected_ack_delay = GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MILLISECONDS,
-                                                              250);
-  s->last_expected_msg_delay = GNUNET_TIME_UNIT_MILLISECONDS;
-  s->flow_delay_from_other_peer = GNUNET_TIME_UNIT_ZERO;
-  s->flow_delay_for_other_peer = GNUNET_TIME_UNIT_ZERO;
-  s->timeout = GNUNET_TIME_relative_to_absolute (XU_SESSION_TIME_OUT);
-  s->timeout_task = GNUNET_SCHEDULER_add_delayed (XU_SESSION_TIME_OUT,
-                                                  &session_timeout,
-                                                  s);
-  s->scope = network_type;
-
-  LOG (GNUNET_ERROR_TYPE_DEBUG,
-       "Creating new session %p for peer `%s' address `%s'\n",
-       s,
-       GNUNET_i2s (&address->peer),
-       xu_address_to_string (plugin,
-                              address->address,
-                              address->address_length));
-  GNUNET_assert (GNUNET_OK ==
-                 GNUNET_CONTAINER_multipeermap_put (plugin->sessions,
-                                                    &s->target,
-                                                    s,
-                                                    GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE));
-  GNUNET_STATISTICS_set (plugin->env->stats,
-                         "# XU sessions active",
-                         GNUNET_CONTAINER_multipeermap_size (plugin->sessions),
-                         GNUNET_NO);
-  notify_session_monitor (plugin,
-                          s,
-                          GNUNET_TRANSPORT_SS_INIT);
-  return s;
-}
-
-
-/**
- * Creates a new outbound session the transport service will use to
- * send data to the peer.
- *
- * @param cls the `struct Plugin *`
- * @param address the address
- * @return the session or NULL of max connections exceeded
- */
-static struct GNUNET_ATS_Session *
-xu_plugin_get_session (void *cls,
-                        const struct GNUNET_HELLO_Address *address)
-{
-  struct Plugin *plugin = cls;
-  struct GNUNET_ATS_Session *s;
-  enum GNUNET_NetworkType network_type = GNUNET_NT_UNSPECIFIED;
-  const struct IPv4XuAddress *xu_v4;
-  const struct IPv6XuAddress *xu_v6;
-
-  if (NULL == address)
-  {
-    GNUNET_break (0);
-    return NULL;
-  }
-  if ( (address->address_length != sizeof(struct IPv4XuAddress)) &&
-       (address->address_length != sizeof(struct IPv6XuAddress)) )
-  {
-    GNUNET_break_op (0);
-    return NULL;
-  }
-  if (NULL != (s = xu_plugin_lookup_session (cls,
-                                              address)))
-    return s;
-
-  /* need to create new session */
-  if (sizeof (struct IPv4XuAddress) == address->address_length)
-  {
-    struct sockaddr_in v4;
-
-    xu_v4 = (const struct IPv4XuAddress *) address->address;
-    memset (&v4, '\0', sizeof (v4));
-    v4.sin_family = AF_INET;
-#if HAVE_SOCKADDR_IN_SIN_LEN
-    v4.sin_len = sizeof (struct sockaddr_in);
-#endif
-    v4.sin_port = xu_v4->u4_port;
-    v4.sin_addr.s_addr = xu_v4->ipv4_addr;
-    network_type = plugin->env->get_address_type (plugin->env->cls,
-                                                  (const struct sockaddr *) &v4,
-                                                  sizeof (v4));
-  }
-  if (sizeof (struct IPv6XuAddress) == address->address_length)
-  {
-    struct sockaddr_in6 v6;
-
-    xu_v6 = (const struct IPv6XuAddress *) address->address;
-    memset (&v6, '\0', sizeof (v6));
-    v6.sin6_family = AF_INET6;
-#if HAVE_SOCKADDR_IN_SIN_LEN
-    v6.sin6_len = sizeof (struct sockaddr_in6);
-#endif
-    v6.sin6_port = xu_v6->u6_port;
-    v6.sin6_addr = xu_v6->ipv6_addr;
-    network_type = plugin->env->get_address_type (plugin->env->cls,
-                                                  (const struct sockaddr *) &v6,
-                                                  sizeof (v6));
-  }
-  GNUNET_break (GNUNET_NT_UNSPECIFIED != network_type);
-  return xu_plugin_create_session (cls,
-				    address,
-				    network_type);
-}
-
-
-/**
- * We've received a XU Message.  Process it (pass contents to main service).
- *
- * @param plugin plugin context
- * @param msg the message
- * @param xu_addr sender address
- * @param xu_addr_len number of bytes in @a xu_addr
- * @param network_type network type the address belongs to
- */
-static void
-process_xu_message (struct Plugin *plugin,
-                     const struct XUMessage *msg,
-                     const union XuAddress *xu_addr,
-                     size_t xu_addr_len,
-                     enum GNUNET_NetworkType network_type)
-{
-  struct GNUNET_ATS_Session *s;
-  struct GNUNET_HELLO_Address *address;
-
-  GNUNET_break (GNUNET_NT_UNSPECIFIED != network_type);
-  if (0 != ntohl (msg->reserved))
-  {
-    GNUNET_break_op(0);
-    return;
-  }
-  if (ntohs (msg->header.size)
-      < sizeof(struct GNUNET_MessageHeader) + sizeof(struct XUMessage))
-  {
-    GNUNET_break_op(0);
-    return;
-  }
-
-  address = GNUNET_HELLO_address_allocate (&msg->sender,
-                                           PLUGIN_NAME,
-                                           xu_addr,
-                                           xu_addr_len,
-                                           GNUNET_HELLO_ADDRESS_INFO_NONE);
-  if (NULL ==
-      (s = xu_plugin_lookup_session (plugin,
-                                      address)))
-  {
-    s = xu_plugin_create_session (plugin,
-                                   address,
-                                   network_type);
-    plugin->env->session_start (plugin->env->cls,
-                                address,
-                                s,
-                                s->scope);
-    notify_session_monitor (plugin,
-                            s,
-                            GNUNET_TRANSPORT_SS_UP);
-  }
-  GNUNET_free (address);
-
-  s->rc++;
-  GNUNET_MST_from_buffer (s->mst,
-                          (const char *) &msg[1],
-                          ntohs (msg->header.size) - sizeof(struct XUMessage),
-                          GNUNET_YES,
-                          GNUNET_NO);
-  s->rc--;
-  if ( (0 == s->rc) &&
-       (GNUNET_YES == s->in_destroy) )
-    free_session (s);
-}
-
-
-/**
- * Read and process a message from the given socket.
- *
- * @param plugin the overall plugin
- * @param rsock socket to read from
- */
-static void
-xu_select_read (struct Plugin *plugin,
-                 struct GNUNET_NETWORK_Handle *rsock)
-{
-  socklen_t fromlen;
-  struct sockaddr_storage addr;
-  char buf[65536] GNUNET_ALIGN;
-  ssize_t size;
-  const struct GNUNET_MessageHeader *msg;
-  struct IPv4XuAddress v4;
-  struct IPv6XuAddress v6;
-  const struct sockaddr *sa;
-  const struct sockaddr_in *sa4;
-  const struct sockaddr_in6 *sa6;
-  const union XuAddress *int_addr;
-  size_t int_addr_len;
-  enum GNUNET_NetworkType network_type;
-
-  fromlen = sizeof (addr);
-  memset (&addr,
-          0,
-          sizeof(addr));
-  size = GNUNET_NETWORK_socket_recvfrom (rsock,
-                                         buf,
-                                         sizeof (buf),
-                                         (struct sockaddr *) &addr,
-                                         &fromlen);
-  sa = (const struct sockaddr *) &addr;
-#if MINGW
-  /* On SOCK_DGRAM XU sockets recvfrom might fail with a
-   * WSAECONNRESET error to indicate that previous sendto() (yes, sendto!)
-   * on this socket has failed.
-   * Quote from MSDN:
-   *   WSAECONNRESET - The virtual circuit was reset by the remote side
-   *   executing a hard or abortive close. The application should close
-   *   the socket; it is no longer usable. On a XU-datagram socket this
-   *   error indicates a previous send operation resulted in an ICMP Port
-   *   Unreachable message.
-   */
-  if ( (-1 == size) &&
-       (ECONNRESET == errno) )
-    return;
-#endif
-  if (-1 == size)
-  {
-    LOG (GNUNET_ERROR_TYPE_DEBUG,
-         "XU failed to receive data: %s\n",
-         STRERROR (errno));
-    /* Connection failure or something. Not a protocol violation. */
-    return;
-  }
-
-  /* Check if this is a STUN packet */
-  if (GNUNET_NO !=
-      GNUNET_NAT_stun_handle_packet (plugin->nat,
-				     (const struct sockaddr *) &addr,
-				     fromlen,
-				     buf,
-				     size))
-    return; /* was STUN, do not process further */
-
-  if (((size_t) size) < sizeof(struct GNUNET_MessageHeader))
-  {
-    LOG (GNUNET_ERROR_TYPE_WARNING,
-         "XU got %u bytes from %s, which is not enough for a GNUnet message header\n",
-         (unsigned int ) size,
-         GNUNET_a2s (sa,
-                     fromlen));
-    /* _MAY_ be a connection failure (got partial message) */
-    /* But it _MAY_ also be that the other side uses non-GNUnet protocol. */
-    GNUNET_break_op (0);
-    return;
-  }
-
-  msg = (const struct GNUNET_MessageHeader *) buf;
-  LOG (GNUNET_ERROR_TYPE_DEBUG,
-       "XU received %u-byte message from `%s' type %u\n",
-       (unsigned int) size,
-       GNUNET_a2s (sa,
-                   fromlen),
-       ntohs (msg->type));
-  if (size != ntohs (msg->size))
-  {
-    LOG (GNUNET_ERROR_TYPE_WARNING,
-         "XU malformed message (size %u) header from %s\n",
-         (unsigned int) size,
-         GNUNET_a2s (sa,
-                     fromlen));
-    GNUNET_break_op (0);
-    return;
-  }
-  GNUNET_STATISTICS_update (plugin->env->stats,
-                            "# XU, total bytes received",
-                            size,
-                            GNUNET_NO);
-  network_type = plugin->env->get_address_type (plugin->env->cls,
-                                                sa,
-                                                fromlen);
-  switch (sa->sa_family)
-  {
-  case AF_INET:
-    sa4 = (const struct sockaddr_in *) &addr;
-    v4.options = 0;
-    v4.ipv4_addr = sa4->sin_addr.s_addr;
-    v4.u4_port = sa4->sin_port;
-    int_addr = (union XuAddress *) &v4;
-    int_addr_len = sizeof (v4);
-    break;
-  case AF_INET6:
-    sa6 = (const struct sockaddr_in6 *) &addr;
-    v6.options = 0;
-    v6.ipv6_addr = sa6->sin6_addr;
-    v6.u6_port = sa6->sin6_port;
-    int_addr = (union XuAddress *) &v6;
-    int_addr_len = sizeof (v6);
-    break;
-  default:
-    GNUNET_break (0);
-    return;
-  }
-
-  switch (ntohs (msg->type))
-  {
-  case GNUNET_MESSAGE_TYPE_TRANSPORT_XU_MESSAGE:
-    if (ntohs (msg->size) < sizeof(struct XUMessage))
-    {
-      GNUNET_break_op(0);
-      return;
-    }
-    process_xu_message (plugin,
-                         (const struct XUMessage *) msg,
-                         int_addr,
-                         int_addr_len,
-                         network_type);
-    return;
-  default:
-    GNUNET_break_op(0);
-    return;
-  }
-}
-
-
-/* ***************** Event loop (part 2) *************** */
-
-
-/**
- * We have been notified that our readset has something to read.  We don't
- * know which socket needs to be read, so we have to check each one
- * Then reschedule this function to be called again once more is available.
- *
- * @param cls the plugin handle
- */
-static void
-xu_plugin_select_v4 (void *cls)
-{
-  struct Plugin *plugin = cls;
-  const struct GNUNET_SCHEDULER_TaskContext *tc;
-
-  plugin->select_task_v4 = NULL;
-  if (NULL == plugin->sockv4)
-    return;
-  tc = GNUNET_SCHEDULER_get_task_context ();
-  if ( (0 != (tc->reason & GNUNET_SCHEDULER_REASON_READ_READY)) &&
-       (GNUNET_NETWORK_fdset_isset (tc->read_ready,
-				    plugin->sockv4)) )
-    xu_select_read (plugin,
-                     plugin->sockv4);
-  schedule_select_v4 (plugin);
-}
-
-
-/**
- * We have been notified that our readset has something to read.  We don't
- * know which socket needs to be read, so we have to check each one
- * Then reschedule this function to be called again once more is available.
- *
- * @param cls the plugin handle
- */
-static void
-xu_plugin_select_v6 (void *cls)
-{
-  struct Plugin *plugin = cls;
-  const struct GNUNET_SCHEDULER_TaskContext *tc;
-
-  plugin->select_task_v6 = NULL;
-  if (NULL == plugin->sockv6)
-    return;
-  tc = GNUNET_SCHEDULER_get_task_context ();
-  if ( (0 != (tc->reason & GNUNET_SCHEDULER_REASON_READ_READY)) &&
-       (GNUNET_NETWORK_fdset_isset (tc->read_ready,
-                                    plugin->sockv6)) )
-    xu_select_read (plugin,
-                     plugin->sockv6);
-  schedule_select_v6 (plugin);
-}
-
-
-/* ******************* Initialization *************** */
-
-
-/**
- * Setup the XU sockets (for IPv4 and IPv6) for the plugin.
- *
- * @param plugin the plugin to initialize
- * @param bind_v6 IPv6 address to bind to (can be NULL, for 'any')
- * @param bind_v4 IPv4 address to bind to (can be NULL, for 'any')
- * @return number of sockets that were successfully bound
- */
-static unsigned int
-setup_sockets (struct Plugin *plugin,
-               const struct sockaddr_in6 *bind_v6,
-               const struct sockaddr_in *bind_v4)
-{
-  int tries;
-  unsigned int sockets_created = 0;
-  struct sockaddr_in6 server_addrv6;
-  struct sockaddr_in server_addrv4;
-  const struct sockaddr *server_addr;
-  const struct sockaddr *addrs[2];
-  socklen_t addrlens[2];
-  socklen_t addrlen;
-  int eno;
-
-  /* Create IPv6 socket */
-  eno = EINVAL;
-  if (GNUNET_YES == plugin->enable_ipv6)
-  {
-    plugin->sockv6 = GNUNET_NETWORK_socket_create (PF_INET6,
-                                                   SOCK_DGRAM,
-                                                   0);
-    if (NULL == plugin->sockv6)
-    {
-      LOG (GNUNET_ERROR_TYPE_INFO,
-           _("Disabling IPv6 since it is not supported on this system!\n"));
-      plugin->enable_ipv6 = GNUNET_NO;
-    }
-    else
-    {
-      memset (&server_addrv6,
-              0,
-              sizeof(struct sockaddr_in6));
-#if HAVE_SOCKADDR_IN_SIN_LEN
-      server_addrv6.sin6_len = sizeof (struct sockaddr_in6);
-#endif
-      server_addrv6.sin6_family = AF_INET6;
-      if (NULL != bind_v6)
-        server_addrv6.sin6_addr = bind_v6->sin6_addr;
-      else
-        server_addrv6.sin6_addr = in6addr_any;
-
-      if (0 == plugin->port) /* autodetect */
-        server_addrv6.sin6_port
-          = htons (GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_STRONG,
-                                             33537)
-                   + 32000);
-      else
-        server_addrv6.sin6_port = htons (plugin->port);
-      addrlen = sizeof (struct sockaddr_in6);
-      server_addr = (const struct sockaddr *) &server_addrv6;
-
-      tries = 0;
-      while (tries < 10)
-      {
-        LOG(GNUNET_ERROR_TYPE_DEBUG,
-            "Binding to IPv6 `%s'\n",
-            GNUNET_a2s (server_addr,
-                        addrlen));
-        /* binding */
-        if (GNUNET_OK ==
-            GNUNET_NETWORK_socket_bind (plugin->sockv6,
-                                        server_addr,
-                                        addrlen))
-          break;
-        eno = errno;
-        if (0 != plugin->port)
-        {
-          tries = 10; /* fail immediately */
-          break; /* bind failed on specific port */
-        }
-        /* autodetect */
-        server_addrv6.sin6_port
-          = htons (GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_STRONG,
-                                             33537)
-                   + 32000);
-        tries++;
-      }
-      if (tries >= 10)
-      {
-        GNUNET_NETWORK_socket_close (plugin->sockv6);
-        plugin->enable_ipv6 = GNUNET_NO;
-        plugin->sockv6 = NULL;
-      }
-      else
-      {
-        plugin->port = ntohs (server_addrv6.sin6_port);
-      }
-      if (NULL != plugin->sockv6)
-      {
-        LOG (GNUNET_ERROR_TYPE_DEBUG,
-             "IPv6 XU socket created listinging at %s\n",
-             GNUNET_a2s (server_addr,
-                         addrlen));
-        addrs[sockets_created] = server_addr;
-        addrlens[sockets_created] = addrlen;
-        sockets_created++;
-      }
-      else
-      {
-        LOG (GNUNET_ERROR_TYPE_WARNING,
-             _("Failed to bind XU socket to %s: %s\n"),
-             GNUNET_a2s (server_addr,
-                         addrlen),
-             STRERROR (eno));
-      }
-    }
-  }
-
-  /* Create IPv4 socket */
-  eno = EINVAL;
-  plugin->sockv4 = GNUNET_NETWORK_socket_create (PF_INET,
-                                                 SOCK_DGRAM,
-                                                 0);
-  if (NULL == plugin->sockv4)
-  {
-    GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING,
-                         "socket");
-    LOG (GNUNET_ERROR_TYPE_INFO,
-         _("Disabling IPv4 since it is not supported on this system!\n"));
-    plugin->enable_ipv4 = GNUNET_NO;
-  }
-  else
-  {
-    memset (&server_addrv4,
-            0,
-            sizeof(struct sockaddr_in));
-#if HAVE_SOCKADDR_IN_SIN_LEN
-    server_addrv4.sin_len = sizeof (struct sockaddr_in);
-#endif
-    server_addrv4.sin_family = AF_INET;
-    if (NULL != bind_v4)
-      server_addrv4.sin_addr = bind_v4->sin_addr;
-    else
-      server_addrv4.sin_addr.s_addr = INADDR_ANY;
-
-    if (0 == plugin->port)
-      /* autodetect */
-      server_addrv4.sin_port
-        = htons (GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_STRONG,
-                                           33537)
-                 + 32000);
-    else
-      server_addrv4.sin_port = htons (plugin->port);
-
-    addrlen = sizeof (struct sockaddr_in);
-    server_addr = (const struct sockaddr *) &server_addrv4;
-
-    tries = 0;
-    while (tries < 10)
-    {
-      LOG (GNUNET_ERROR_TYPE_DEBUG,
-           "Binding to IPv4 `%s'\n",
-           GNUNET_a2s (server_addr,
-                       addrlen));
-
-      /* binding */
-      if (GNUNET_OK ==
-          GNUNET_NETWORK_socket_bind (plugin->sockv4,
-                                      server_addr,
-                                      addrlen))
-        break;
-      eno = errno;
-      if (0 != plugin->port)
-      {
-        tries = 10; /* fail */
-        break; /* bind failed on specific port */
-      }
-
-      /* autodetect */
-      server_addrv4.sin_port
-        = htons (GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_STRONG,
-                                           33537)
-                 + 32000);
-      tries++;
-    }
-    if (tries >= 10)
-    {
-      GNUNET_NETWORK_socket_close (plugin->sockv4);
-      plugin->enable_ipv4 = GNUNET_NO;
-      plugin->sockv4 = NULL;
-    }
-    else
-    {
-      plugin->port = ntohs (server_addrv4.sin_port);
-    }
-
-    if (NULL != plugin->sockv4)
-    {
-      LOG (GNUNET_ERROR_TYPE_DEBUG,
-           "IPv4 socket created on port %s\n",
-           GNUNET_a2s (server_addr,
-                       addrlen));
-      addrs[sockets_created] = server_addr;
-      addrlens[sockets_created] = addrlen;
-      sockets_created++;
-    }
-    else
-    {
-      LOG (GNUNET_ERROR_TYPE_ERROR,
-           _("Failed to bind XU socket to %s: %s\n"),
-           GNUNET_a2s (server_addr,
-                       addrlen),
-           STRERROR (eno));
-    }
-  }
-
-  if (0 == sockets_created)
-  {
-    LOG (GNUNET_ERROR_TYPE_WARNING,
-         _("Failed to open XU sockets\n"));
-    return 0; /* No sockets created, return */
-  }
-  schedule_select_v4 (plugin);
-  schedule_select_v6 (plugin);
-  plugin->nat = GNUNET_NAT_register (plugin->env->cfg,
-				     "transport-xu",
-				     IPPROTO_UDP,
-                                     sockets_created,
-                                     addrs,
-                                     addrlens,
-                                     &xu_nat_port_map_callback,
-                                     NULL,
-                                     plugin);
-  return sockets_created;
-}
-
-
-/**
- * The exported method. Makes the core api available via a global and
- * returns the xu transport API.
- *
- * @param cls our `struct GNUNET_TRANSPORT_PluginEnvironment`
- * @return our `struct GNUNET_TRANSPORT_PluginFunctions`
- */
-void *
-libgnunet_plugin_transport_xu_init (void *cls)
-{
-  struct GNUNET_TRANSPORT_PluginEnvironment *env = cls;
-  struct GNUNET_TRANSPORT_PluginFunctions *api;
-  struct Plugin *p;
-  unsigned long long port;
-  unsigned long long aport;
-  int enable_v6;
-  char *bind4_address;
-  char *bind6_address;
-  struct sockaddr_in server_addrv4;
-  struct sockaddr_in6 server_addrv6;
-  unsigned int res;
-  int have_bind4;
-  int have_bind6;
-
-  if (NULL == env->receive)
-  {
-    /* run in 'stub' mode (i.e. as part of gnunet-peerinfo), don't fully
-     initialze the plugin or the API */
-    api = GNUNET_new (struct GNUNET_TRANSPORT_PluginFunctions);
-    api->cls = NULL;
-    api->address_pretty_printer = &xu_plugin_address_pretty_printer;
-    api->address_to_string = &xu_address_to_string;
-    api->string_to_address = &xu_string_to_address;
-    return api;
-  }
-
-  /* Get port number: port == 0 : autodetect a port,
-   * > 0 : use this port, not given : 2086 default */
-  if (GNUNET_OK !=
-      GNUNET_CONFIGURATION_get_value_number (env->cfg,
-                                             "transport-xu",
-                                             "PORT",
-                                             &port))
-    port = 2086;
-  if (port > 65535)
-  {
-    GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_ERROR,
-                               "transport-xu",
-                               "PORT",
-                               _("must be in [0,65535]"));
-    return NULL;
-  }
-  if (GNUNET_OK !=
-      GNUNET_CONFIGURATION_get_value_number (env->cfg,
-                                             "transport-xu",
-                                             "ADVERTISED_PORT",
-                                             &aport))
-    aport = port;
-  if (aport > 65535)
-  {
-    GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_ERROR,
-                               "transport-xu",
-                               "ADVERTISED_PORT",
-                               _("must be in [0,65535]"));
-    return NULL;
-  }
-
-  if (GNUNET_YES ==
-      GNUNET_CONFIGURATION_get_value_yesno (env->cfg,
-                                            "nat",
-                                            "DISABLEV6"))
-    enable_v6 = GNUNET_NO;
-  else
-    enable_v6 = GNUNET_YES;
-
-  have_bind4 = GNUNET_NO;
-  memset (&server_addrv4,
-          0,
-          sizeof (server_addrv4));
-  if (GNUNET_YES ==
-      GNUNET_CONFIGURATION_get_value_string (env->cfg,
-                                             "transport-xu",
-                                             "BINDTO",
-                                             &bind4_address))
-  {
-    LOG (GNUNET_ERROR_TYPE_DEBUG,
-         "Binding XU plugin to specific address: `%s'\n",
-         bind4_address);
-    if (1 != inet_pton (AF_INET,
-                        bind4_address,
-                        &server_addrv4.sin_addr))
-    {
-      GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_ERROR,
-                                 "transport-xu",
-                                 "BINDTO",
-                                 _("must be valid IPv4 address"));
-      GNUNET_free (bind4_address);
-      return NULL;
-    }
-    have_bind4 = GNUNET_YES;
-  }
-  GNUNET_free_non_null (bind4_address);
-  have_bind6 = GNUNET_NO;
-  memset (&server_addrv6,
-          0,
-          sizeof (server_addrv6));
-  if (GNUNET_YES ==
-      GNUNET_CONFIGURATION_get_value_string (env->cfg,
-                                             "transport-xu",
-                                             "BINDTO6",
-                                             &bind6_address))
-  {
-    LOG (GNUNET_ERROR_TYPE_DEBUG,
-         "Binding xu plugin to specific address: `%s'\n",
-         bind6_address);
-    if (1 != inet_pton (AF_INET6,
-                        bind6_address,
-                        &server_addrv6.sin6_addr))
-    {
-      GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_ERROR,
-                                 "transport-xu",
-                                 "BINDTO6",
-                                 _("must be valid IPv6 address"));
-      GNUNET_free (bind6_address);
-      return NULL;
-    }
-    have_bind6 = GNUNET_YES;
-  }
-  GNUNET_free_non_null (bind6_address);
-
-  p = GNUNET_new (struct Plugin);
-  p->port = port;
-  p->aport = aport;
-  p->enable_ipv6 = enable_v6;
-  p->enable_ipv4 = GNUNET_YES; /* default */
-  p->env = env;
-  p->sessions = GNUNET_CONTAINER_multipeermap_create (16,
-                                                      GNUNET_NO);
-  res = setup_sockets (p,
-                       (GNUNET_YES == have_bind6) ? &server_addrv6 : NULL,
-                       (GNUNET_YES == have_bind4) ? &server_addrv4 : NULL);
-  if ( (0 == res) ||
-       ( (NULL == p->sockv4) &&
-         (NULL == p->sockv6) ) )
-  {
-    LOG (GNUNET_ERROR_TYPE_ERROR,
-        _("Failed to create XU network sockets\n"));
-    GNUNET_CONTAINER_multipeermap_destroy (p->sessions);
-    if (NULL != p->nat)
-      GNUNET_NAT_unregister (p->nat);
-    GNUNET_free (p);
-    return NULL;
-  }
-
-  api = GNUNET_new (struct GNUNET_TRANSPORT_PluginFunctions);
-  api->cls = p;
-  api->disconnect_session = &xu_disconnect_session;
-  api->query_keepalive_factor = &xu_query_keepalive_factor;
-  api->disconnect_peer = &xu_disconnect;
-  api->address_pretty_printer = &xu_plugin_address_pretty_printer;
-  api->address_to_string = &xu_address_to_string;
-  api->string_to_address = &xu_string_to_address;
-  api->check_address = &xu_plugin_check_address;
-  api->get_session = &xu_plugin_get_session;
-  api->send = &xu_plugin_send;
-  api->get_network = &xu_plugin_get_network;
-  api->get_network_for_address = &xu_plugin_get_network_for_address;
-  api->update_session_timeout = &xu_plugin_update_session_timeout;
-  api->setup_monitor = &xu_plugin_setup_monitor;
-  return api;
-}
-
-
-/**
- * The exported method. Makes the core api available via a global and
- * returns the xu transport API.
- *
- * @param cls our `struct GNUNET_TRANSPORT_PluginEnvironment`
- * @return NULL
- */
-void *
-libgnunet_plugin_transport_xu_done (void *cls)
-{
-  struct GNUNET_TRANSPORT_PluginFunctions *api = cls;
-  struct Plugin *plugin = api->cls;
-  struct PrettyPrinterContext *cur;
-
-  if (NULL == plugin)
-  {
-    GNUNET_free (api);
-    return NULL;
-  }
-  if (NULL != plugin->select_task_v4)
-  {
-    GNUNET_SCHEDULER_cancel (plugin->select_task_v4);
-    plugin->select_task_v4 = NULL;
-  }
-  if (NULL != plugin->select_task_v6)
-  {
-    GNUNET_SCHEDULER_cancel (plugin->select_task_v6);
-    plugin->select_task_v6 = NULL;
-  }
-  if (NULL != plugin->sockv4)
-  {
-    GNUNET_break (GNUNET_OK ==
-                  GNUNET_NETWORK_socket_close (plugin->sockv4));
-    plugin->sockv4 = NULL;
-  }
-  if (NULL != plugin->sockv6)
-  {
-    GNUNET_break (GNUNET_OK ==
-                  GNUNET_NETWORK_socket_close (plugin->sockv6));
-    plugin->sockv6 = NULL;
-  }
-  if (NULL != plugin->nat)
-  {
-    GNUNET_NAT_unregister (plugin->nat);
-    plugin->nat = NULL;
-  }
-  GNUNET_CONTAINER_multipeermap_destroy (plugin->sessions);
-
-  while (NULL != (cur = plugin->ppc_dll_head))
-  {
-    GNUNET_break (0);
-    GNUNET_CONTAINER_DLL_remove (plugin->ppc_dll_head,
-                                 plugin->ppc_dll_tail,
-                                 cur);
-    GNUNET_RESOLVER_request_cancel (cur->resolver_handle);
-    if (NULL != cur->timeout_task)
-    {
-      GNUNET_SCHEDULER_cancel (cur->timeout_task);
-      cur->timeout_task = NULL;
-    }
-    GNUNET_free (cur);
-  }
-  GNUNET_free (plugin);
-  GNUNET_free (api);
-  return NULL;
-}
-
-/* end of plugin_transport_xu.c */

+ 0 - 273
src/transport/plugin_transport_xu.h

@@ -1,273 +0,0 @@
-/*
-     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 Affero General Public License as published
-     by the Free Software Foundation, either version 3 of the License,
-     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
-     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/>.
-
-     SPDX-License-Identifier: AGPL3.0-or-later
-*/
-
-/**
- * @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 */

+ 32 - 0
src/transport/transport.h

@@ -1107,6 +1107,38 @@ struct GNUNET_TRANSPORT_AddressToVerify
 };
 
 
+/**
+ * Application client to TRANSPORT service: we would like to have
+ * address suggestions for this peer.
+ */
+struct ExpressPreferenceMessage
+{
+  /**
+   * Type is #GNUNET_MESSAGE_TYPE_TRANSPORT_SUGGEST or
+   * #GNUNET_MESSAGE_TYPE_TRANSPORT_SUGGEST_CANCEL to stop
+   * suggestions.
+   */
+  struct GNUNET_MessageHeader header;
+
+  /**
+   * What type of performance preference does the client have?
+   * A `enum GNUNET_MQ_PreferenceKind` in NBO.
+   */
+  uint32_t pk GNUNET_PACKED;
+
+  /**
+   * Peer to get address suggestions for.
+   */
+  struct GNUNET_PeerIdentity peer;
+
+  /**
+   * How much bandwidth in bytes/second does the application expect?
+   */
+  struct GNUNET_BANDWIDTH_Value32NBO bw;
+
+};
+
+
 #endif
 
 GNUNET_NETWORK_STRUCT_END

+ 366 - 0
src/transport/transport_api2_application.c

@@ -0,0 +1,366 @@
+/*
+     This file is part of GNUnet.
+     Copyright (C) 2010--2019 GNUnet e.V.
+
+     GNUnet 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.
+
+     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
+     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/>.
+
+     SPDX-License-Identifier: AGPL3.0-or-later
+*/
+/**
+ * @file transport/transport_api2_application.c
+ * @brief enable clients to ask TRANSPORT about establishing connections to peers
+ * @author Christian Grothoff
+ * @author Matthias Wachs
+ */
+#include "platform.h"
+#include "gnunet_transport_application_service.h"
+#include "gnunet_transport_core_service.h"
+#include "transport.h"
+
+
+#define LOG(kind,...) GNUNET_log_from(kind, "transport-application-api", __VA_ARGS__)
+
+
+/**
+ * Handle for TRANSPORT address suggestion requests.
+ */
+struct GNUNET_TRANSPORT_ApplicationSuggestHandle
+{
+  /**
+   * ID of the peer for which address suggestion was requested.
+   */
+  struct GNUNET_PeerIdentity id;
+
+  /**
+   * Connecitivity handle this suggestion handle belongs to.
+   */
+  struct GNUNET_TRANSPORT_ApplicationHandle *ch;
+
+  /**
+   * What preference is being expressed?
+   */
+  enum GNUNET_MQ_PreferenceKind pk;
+
+  /**
+   * How much bandwidth does the client expect?
+   */
+  struct GNUNET_BANDWIDTH_Value32NBO bw;
+};
+
+
+/**
+ * Handle to the TRANSPORT subsystem for application management.
+ */
+struct GNUNET_TRANSPORT_ApplicationHandle
+{
+
+  /**
+   * Our configuration.
+   */
+  const struct GNUNET_CONFIGURATION_Handle *cfg;
+
+  /**
+   * Map with the identities of all the peers for which we would
+   * like to have address suggestions.  The key is the PID, the
+   * value is currently the `struct GNUNET_TRANSPORT_ApplicationSuggestHandle`
+   */
+  struct GNUNET_CONTAINER_MultiPeerMap *sug_requests;
+
+  /**
+   * Message queue for sending requests to the TRANSPORT service.
+   */
+  struct GNUNET_MQ_Handle *mq;
+
+  /**
+   * Task to trigger reconnect.
+   */
+  struct GNUNET_SCHEDULER_Task *task;
+
+  /**
+   * Reconnect backoff delay.
+   */
+  struct GNUNET_TIME_Relative backoff;
+};
+
+
+/**
+ * Re-establish the connection to the TRANSPORT service.
+ *
+ * @param ch handle to use to re-connect.
+ */
+static void
+reconnect (struct GNUNET_TRANSPORT_ApplicationHandle *ch);
+
+
+/**
+ * Re-establish the connection to the TRANSPORT service.
+ *
+ * @param cls handle to use to re-connect.
+ */
+static void
+reconnect_task (void *cls)
+{
+  struct GNUNET_TRANSPORT_ApplicationHandle *ch = cls;
+
+  ch->task = NULL;
+  reconnect (ch);
+}
+
+
+/**
+ * Disconnect from TRANSPORT and then reconnect.
+ *
+ * @param ch our handle
+ */
+static void
+force_reconnect (struct GNUNET_TRANSPORT_ApplicationHandle *ch)
+{
+  if (NULL != ch->mq)
+  {
+    GNUNET_MQ_destroy (ch->mq);
+    ch->mq = NULL;
+  }
+  ch->backoff = GNUNET_TIME_STD_BACKOFF (ch->backoff);
+  ch->task = GNUNET_SCHEDULER_add_delayed (ch->backoff,
+                                           &reconnect_task,
+                                           ch);
+}
+
+
+/**
+ * We encountered an error handling the MQ to the
+ * TRANSPORT service.  Reconnect.
+ *
+ * @param cls the `struct GNUNET_TRANSPORT_ApplicationHandle`
+ * @param error details about the error
+ */
+static void
+error_handler (void *cls,
+               enum GNUNET_MQ_Error error)
+{
+  struct GNUNET_TRANSPORT_ApplicationHandle *ch = cls;
+
+  LOG (GNUNET_ERROR_TYPE_DEBUG,
+       "TRANSPORT connection died (code %d), reconnecting\n",
+       (int) error);
+  force_reconnect (ch);
+}
+
+
+/**
+ * Transmit request for an address suggestion.
+ *
+ * @param cls the `struct GNUNET_TRANSPORT_ApplicationHandle`
+ * @param peer peer to ask for an address suggestion for
+ * @param value the `struct GNUNET_TRANSPORT_SuggestHandle`
+ * @return #GNUNET_OK (continue to iterate), #GNUNET_SYSERR on
+ *         failure (message queue no longer exists)
+ */
+static int
+transmit_suggestion (void *cls,
+                     const struct GNUNET_PeerIdentity *peer,
+                     void *value)
+{
+  struct GNUNET_TRANSPORT_ApplicationHandle *ch = cls;
+  struct GNUNET_TRANSPORT_ApplicationSuggestHandle *sh = value;
+  struct GNUNET_MQ_Envelope *ev;
+  struct ExpressPreferenceMessage *m;
+
+  if (NULL == ch->mq)
+    return GNUNET_SYSERR;
+  ev = GNUNET_MQ_msg (m,
+                      GNUNET_MESSAGE_TYPE_TRANSPORT_SUGGEST);
+  m->pk = htonl ((uint32_t) sh->pk);
+  m->bw = sh->bw;
+  m->peer = *peer;
+  GNUNET_MQ_send (ch->mq, ev);
+  return GNUNET_OK;
+}
+
+
+/**
+ * Re-establish the connection to the TRANSPORT service.
+ *
+ * @param ch handle to use to re-connect.
+ */
+static void
+reconnect (struct GNUNET_TRANSPORT_ApplicationHandle *ch)
+{
+  static const struct GNUNET_MQ_MessageHandler handlers[] = {
+    { NULL, 0, 0 }
+  };
+
+  GNUNET_assert (NULL == ch->mq);
+  ch->mq = GNUNET_CLIENT_connect (ch->cfg,
+                                  "transport",
+                                  handlers,
+                                  &error_handler,
+                                  ch);
+  if (NULL == ch->mq)
+  {
+    force_reconnect (ch);
+    return;
+  }
+  GNUNET_CONTAINER_multipeermap_iterate (ch->sug_requests,
+                                         &transmit_suggestion,
+                                         ch);
+}
+
+
+/**
+ * Initialize the TRANSPORT application suggestion client handle.
+ *
+ * @param cfg configuration to use
+ * @return transport application handle, NULL on error
+ */
+struct GNUNET_TRANSPORT_ApplicationHandle *
+GNUNET_TRANSPORT_application_init (const struct GNUNET_CONFIGURATION_Handle *cfg)
+{
+  struct GNUNET_TRANSPORT_ApplicationHandle *ch;
+
+  ch = GNUNET_new (struct GNUNET_TRANSPORT_ApplicationHandle);
+  ch->cfg = cfg;
+  ch->sug_requests = GNUNET_CONTAINER_multipeermap_create (32,
+                                                           GNUNET_YES);
+  reconnect (ch);
+  return ch;
+}
+
+
+/**
+ * Function called to free all `struct GNUNET_TRANSPORT_ApplicationSuggestHandle`s
+ * in the map.
+ *
+ * @param cls NULL
+ * @param key the key
+ * @param value the value to free
+ * @return #GNUNET_OK (continue to iterate)
+ */
+static int
+free_sug_handle (void *cls,
+                 const struct GNUNET_PeerIdentity *key,
+                 void *value)
+{
+  struct GNUNET_TRANSPORT_ApplicationSuggestHandle *cur = value;
+
+  GNUNET_free (cur);
+  return GNUNET_OK;
+}
+
+
+/**
+ * Client is done with TRANSPORT application management, release resources.
+ *
+ * @param ch handle to release
+ */
+void
+GNUNET_TRANSPORT_application_done (struct GNUNET_TRANSPORT_ApplicationHandle *ch)
+{
+  if (NULL != ch->mq)
+  {
+    GNUNET_MQ_destroy (ch->mq);
+    ch->mq = NULL;
+  }
+  if (NULL != ch->task)
+  {
+    GNUNET_SCHEDULER_cancel (ch->task);
+    ch->task = NULL;
+  }
+  GNUNET_CONTAINER_multipeermap_iterate (ch->sug_requests,
+                                         &free_sug_handle,
+                                         NULL);
+  GNUNET_CONTAINER_multipeermap_destroy (ch->sug_requests);
+  GNUNET_free (ch);
+}
+
+
+/**
+ * We would like to receive address suggestions for a peer. TRANSPORT will
+ * respond with a call to the continuation immediately containing an address or
+ * no address if none is available. TRANSPORT can suggest more addresses until we call
+ * #GNUNET_TRANSPORT_application_suggest_cancel().
+ *
+ * @param ch handle
+ * @param peer identity of the peer we need an address for
+ * @param pk what kind of application will the application require (can be
+ *         #GNUNET_MQ_PREFERENCE_NONE, we will still try to connect)
+ * @param bw desired bandwith, can be zero (we will still try to connect)
+ * @return suggest handle, NULL if a request is already pending
+ */
+struct GNUNET_TRANSPORT_ApplicationSuggestHandle *
+GNUNET_TRANSPORT_application_suggest (struct GNUNET_TRANSPORT_ApplicationHandle *ch,
+                                      const struct GNUNET_PeerIdentity *peer,
+                                      enum GNUNET_MQ_PreferenceKind pk,
+                                      struct GNUNET_BANDWIDTH_Value32NBO bw)
+{
+  struct GNUNET_TRANSPORT_ApplicationSuggestHandle *s;
+
+  s = GNUNET_new (struct GNUNET_TRANSPORT_ApplicationSuggestHandle);
+  s->ch = ch;
+  s->id = *peer;
+  s->pk = pk;
+  s->bw = bw;
+  (void) GNUNET_CONTAINER_multipeermap_put (ch->sug_requests,
+                                            &s->id,
+                                            s,
+                                            GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
+  LOG (GNUNET_ERROR_TYPE_DEBUG,
+       "Requesting TRANSPORT to suggest address for `%s'\n",
+       GNUNET_i2s (peer));
+  if (NULL == ch->mq)
+    return s;
+  GNUNET_assert (GNUNET_OK ==
+                 transmit_suggestion (ch,
+                                      &s->id,
+                                      s));
+  return s;
+}
+
+
+/**
+ * We no longer care about being connected to a peer.
+ *
+ * @param sh handle to stop
+ */
+void
+GNUNET_TRANSPORT_application_suggest_cancel (struct GNUNET_TRANSPORT_ApplicationSuggestHandle *sh)
+{
+  struct GNUNET_TRANSPORT_ApplicationHandle *ch = sh->ch;
+  struct GNUNET_MQ_Envelope *ev;
+  struct ExpressPreferenceMessage *m;
+
+  LOG (GNUNET_ERROR_TYPE_DEBUG,
+       "Telling TRANSPORT we no longer care for an address for `%s'\n",
+       GNUNET_i2s (&sh->id));
+  GNUNET_assert (GNUNET_OK ==
+                 GNUNET_CONTAINER_multipeermap_remove (ch->sug_requests,
+                                                       &sh->id,
+                                                       sh));
+  if (NULL == ch->mq)
+  {
+    GNUNET_free (sh);
+    return;
+  }
+  ev = GNUNET_MQ_msg (m,
+                      GNUNET_MESSAGE_TYPE_TRANSPORT_SUGGEST_CANCEL);
+  m->pk = htonl ((uint32_t) sh->pk);
+  m->bw = sh->bw;
+  m->peer = sh->id;
+  GNUNET_MQ_send (ch->mq,
+                  ev);
+  GNUNET_free (sh);
+}
+
+
+/* end of transport_api2_application.c */

+ 3 - 4
src/util/Makefile.am

@@ -280,13 +280,12 @@ gnunet_uri_LDADD = \
 
 
 gnunet_qr_SOURCES = \
-  gnunet-qr.c \
-  gnunet-qr-utils.h
+  gnunet-qr.c
 gnunet_qr_LDADD = \
   libgnunetutil.la \
   $(GN_LIBINTL)
-gnunet_qr_LDFLAGS= $(libzbar_LIBS)
-gnunet_qr_CFLAGS = $(libzbar_CFLAGS) -DBINDIR=\"@bindir@/\"
+gnunet_qr_LDFLAGS= \
+  -lzbar
 
 plugin_LTLIBRARIES = \
   libgnunet_plugin_test.la

Some files were not shown because too many files changed in this diff