[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r35559 - in gnunet: po src/dht
From: |
gnunet |
Subject: |
[GNUnet-SVN] r35559 - in gnunet: po src/dht |
Date: |
Mon, 27 Apr 2015 13:12:22 +0200 |
Author: arthur
Date: 2015-04-27 13:12:21 +0200 (Mon, 27 Apr 2015)
New Revision: 35559
Added:
gnunet/src/dht/gnunet-service-wdht.c
gnunet/src/dht/gnunet-service-wdht.h
gnunet/src/dht/gnunet-service-wdht_clients.c
gnunet/src/dht/gnunet-service-wdht_clients.h
gnunet/src/dht/gnunet-service-wdht_datacache.c
gnunet/src/dht/gnunet-service-wdht_datacache.h
gnunet/src/dht/gnunet-service-wdht_hello.c
gnunet/src/dht/gnunet-service-wdht_hello.h
gnunet/src/dht/gnunet-service-wdht_neighbours.c
gnunet/src/dht/gnunet-service-wdht_neighbours.h
gnunet/src/dht/gnunet-service-wdht_nse.c
gnunet/src/dht/gnunet-service-wdht_nse.h
gnunet/src/dht/gnunet-service-wdht_routing.c
gnunet/src/dht/gnunet-service-wdht_routing.h
Modified:
gnunet/po/POTFILES.in
gnunet/po/de.po
gnunet/po/es.po
gnunet/po/fr.po
gnunet/po/sv.po
gnunet/po/vi.po
gnunet/po/zh_CN.po
gnunet/src/dht/Makefile.am
Log:
Adding files for whanau.
Modified: gnunet/po/POTFILES.in
===================================================================
--- gnunet/po/POTFILES.in 2015-04-24 07:04:18 UTC (rev 35558)
+++ gnunet/po/POTFILES.in 2015-04-27 11:12:21 UTC (rev 35559)
@@ -3,21 +3,13 @@
src/arm/gnunet-arm.c
src/arm/gnunet-service-arm.c
src/arm/mockup-service.c
-src/ats-tests/ats-testing-experiment.c
-src/ats-tests/ats-testing-log.c
-src/ats-tests/ats-testing-preferences.c
-src/ats-tests/ats-testing-traffic.c
-src/ats-tests/ats-testing.c
-src/ats-tests/gnunet-ats-sim.c
-src/ats-tests/gnunet-solver-eval.c
-src/ats-tool/gnunet-ats.c
src/ats/ats_api_connectivity.c
src/ats/ats_api_performance.c
src/ats/ats_api_scanner.c
src/ats/ats_api_scheduling.c
src/ats/gnunet-ats-solver-eval.c
+src/ats/gnunet-service-ats_addresses.c
src/ats/gnunet-service-ats.c
-src/ats/gnunet-service-ats_addresses.c
src/ats/gnunet-service-ats_connectivity.c
src/ats/gnunet-service-ats_feedback.c
src/ats/gnunet-service-ats_normalization.c
@@ -29,6 +21,14 @@
src/ats/plugin_ats_mlp.c
src/ats/plugin_ats_proportional.c
src/ats/plugin_ats_ril.c
+src/ats-tests/ats-testing.c
+src/ats-tests/ats-testing-experiment.c
+src/ats-tests/ats-testing-log.c
+src/ats-tests/ats-testing-preferences.c
+src/ats-tests/ats-testing-traffic.c
+src/ats-tests/gnunet-ats-sim.c
+src/ats-tests/gnunet-solver-eval.c
+src/ats-tool/gnunet-ats.c
src/block/block.c
src/block/plugin_block_template.c
src/block/plugin_block_test.c
@@ -37,8 +37,8 @@
src/cadet/cadet_path.c
src/cadet/cadet_test_lib.c
src/cadet/cadet_tunnel_tree.c
+src/cadet/gnunet-cadet.c
src/cadet/gnunet-cadet-profiler.c
-src/cadet/gnunet-cadet.c
src/cadet/gnunet-service-cadet.c
src/cadet/gnunet-service-cadet_channel.c
src/cadet/gnunet-service-cadet_connection.c
@@ -52,12 +52,12 @@
src/consensus/gnunet-service-consensus.c
src/conversation/conversation_api.c
src/conversation/conversation_api_call.c
+src/conversation/gnunet-conversation.c
src/conversation/gnunet-conversation-test.c
-src/conversation/gnunet-conversation.c
+src/conversation/gnunet-helper-audio-playback.c
src/conversation/gnunet-helper-audio-playback-gst.c
-src/conversation/gnunet-helper-audio-playback.c
+src/conversation/gnunet-helper-audio-record.c
src/conversation/gnunet-helper-audio-record-gst.c
-src/conversation/gnunet-helper-audio-record.c
src/conversation/gnunet-service-conversation.c
src/conversation/microphone.c
src/conversation/plugin_gnsrecord_conversation.c
@@ -89,6 +89,7 @@
src/dht/dht_test_lib.c
src/dht/gnunet-dht-get.c
src/dht/gnunet-dht-monitor.c
+src/dht/gnunet_dht_profiler.c
src/dht/gnunet-dht-put.c
src/dht/gnunet-service-dht.c
src/dht/gnunet-service-dht_clients.c
@@ -104,7 +105,6 @@
src/dht/gnunet-service-xdht_neighbours.c
src/dht/gnunet-service-xdht_nse.c
src/dht/gnunet-service-xdht_routing.c
-src/dht/gnunet_dht_profiler.c
src/dht/plugin_block_dht.c
src/dns/dns_api.c
src/dns/dnsparser.c
@@ -120,8 +120,8 @@
src/dv/plugin_transport_dv.c
src/env/env.c
src/exit/gnunet-daemon-exit.c
+src/exit/gnunet-helper-exit.c
src/exit/gnunet-helper-exit-windows.c
-src/exit/gnunet-helper-exit.c
src/fragmentation/defragmentation.c
src/fragmentation/fragmentation.c
src/fs/fs_api.c
@@ -146,8 +146,8 @@
src/fs/gnunet-daemon-fsprofiler.c
src/fs/gnunet-directory.c
src/fs/gnunet-download.c
+src/fs/gnunet-fs.c
src/fs/gnunet-fs-profiler.c
-src/fs/gnunet-fs.c
src/fs/gnunet-helper-fs-publish.c
src/fs/gnunet-publish.c
src/fs/gnunet-search.c
@@ -166,10 +166,10 @@
src/gns/gns_api.c
src/gns/gnunet-bcd.c
src/gns/gnunet-dns2gns.c
+src/gns/gnunet-gns.c
src/gns/gnunet-gns-helper-service-w32.c
src/gns/gnunet-gns-import.c
src/gns/gnunet-gns-proxy.c
-src/gns/gnunet-gns.c
src/gns/gnunet-service-gns.c
src/gns/gnunet-service-gns_interceptor.c
src/gns/gnunet-service-gns_resolver.c
@@ -179,15 +179,15 @@
src/gns/plugin_block_gns.c
src/gns/plugin_gnsrecord_gns.c
src/gns/plugin_rest_gns.c
-src/gns/w32nsp-install.c
-src/gns/w32nsp-resolve.c
-src/gns/w32nsp-uninstall.c
-src/gns/w32nsp.c
src/gnsrecord/gnsrecord.c
src/gnsrecord/gnsrecord_crypto.c
src/gnsrecord/gnsrecord_misc.c
src/gnsrecord/gnsrecord_serialization.c
src/gnsrecord/plugin_gnsrecord_dns.c
+src/gns/w32nsp.c
+src/gns/w32nsp-install.c
+src/gns/w32nsp-resolve.c
+src/gns/w32nsp-uninstall.c
src/hello/address.c
src/hello/gnunet-hello.c
src/hello/hello.c
@@ -208,31 +208,32 @@
src/namecache/namecache_api.c
src/namecache/plugin_namecache_postgres.c
src/namecache/plugin_namecache_sqlite.c
+src/namestore/gnunet-namestore.c
src/namestore/gnunet-namestore-fcfsd.c
-src/namestore/gnunet-namestore.c
src/namestore/gnunet-service-namestore.c
src/namestore/namestore_api.c
src/namestore/namestore_api_monitor.c
src/namestore/plugin_namestore_postgres.c
src/namestore/plugin_namestore_sqlite.c
+src/namestore/plugin_rest_namestore.c
+src/nat/gnunet-helper-nat-client.c
src/nat/gnunet-helper-nat-client-windows.c
-src/nat/gnunet-helper-nat-client.c
+src/nat/gnunet-helper-nat-server.c
src/nat/gnunet-helper-nat-server-windows.c
-src/nat/gnunet-helper-nat-server.c
src/nat/gnunet-nat-server.c
+src/nat/nat_auto.c
src/nat/nat.c
-src/nat/nat_auto.c
src/nat/nat_mini.c
src/nat/nat_test.c
+src/nse/gnunet-nse.c
src/nse/gnunet-nse-profiler.c
-src/nse/gnunet-nse.c
src/nse/gnunet-service-nse.c
src/nse/nse_api.c
-src/peerinfo-tool/gnunet-peerinfo.c
-src/peerinfo-tool/gnunet-peerinfo_plugins.c
src/peerinfo/gnunet-service-peerinfo.c
src/peerinfo/peerinfo_api.c
src/peerinfo/peerinfo_api_notify.c
+src/peerinfo-tool/gnunet-peerinfo.c
+src/peerinfo-tool/gnunet-peerinfo_plugins.c
src/peerstore/gnunet-peerstore.c
src/peerstore/gnunet-service-peerstore.c
src/peerstore/peerstore_api.c
@@ -276,10 +277,12 @@
src/secretsharing/gnunet-service-secretsharing.c
src/secretsharing/secretsharing_api.c
src/secretsharing/secretsharing_common.c
+src/sensordashboard/gnunet-sensordashboard.c
+src/sensordashboard/gnunet-service-sensordashboard.c
+src/sensor/gnunet-sensor.c
src/sensor/gnunet-sensor-profiler.c
-src/sensor/gnunet-sensor.c
+src/sensor/gnunet-service-sensor_analysis.c
src/sensor/gnunet-service-sensor.c
-src/sensor/gnunet-service-sensor_analysis.c
src/sensor/gnunet-service-sensor_monitoring.c
src/sensor/gnunet-service-sensor_reporting.c
src/sensor/gnunet-service-sensor_update.c
@@ -287,8 +290,6 @@
src/sensor/sensor_api.c
src/sensor/sensor_util_lib.c
src/sensor/sensor_util_lib_crypto.c
-src/sensordashboard/gnunet-sensordashboard.c
-src/sensordashboard/gnunet-service-sensordashboard.c
src/set/gnunet-service-set.c
src/set/gnunet-service-set_intersection.c
src/set/gnunet-service-set_union.c
@@ -309,30 +310,30 @@
src/testbed/gnunet-daemon-testbed-blacklist.c
src/testbed/gnunet-daemon-testbed-underlay.c
src/testbed/gnunet-helper-testbed.c
+src/testbed/gnunet_mpi_test.c
src/testbed/gnunet-service-test-barriers.c
-src/testbed/gnunet-service-testbed-logger.c
+src/testbed/gnunet-service-testbed_barriers.c
src/testbed/gnunet-service-testbed.c
-src/testbed/gnunet-service-testbed_barriers.c
src/testbed/gnunet-service-testbed_cache.c
src/testbed/gnunet-service-testbed_connectionpool.c
src/testbed/gnunet-service-testbed_cpustatus.c
src/testbed/gnunet-service-testbed_links.c
+src/testbed/gnunet-service-testbed-logger.c
src/testbed/gnunet-service-testbed_meminfo.c
src/testbed/gnunet-service-testbed_oc.c
src/testbed/gnunet-service-testbed_peers.c
+src/testbed/gnunet_testbed_mpi_spawn.c
src/testbed/gnunet-testbed-profiler.c
-src/testbed/gnunet_mpi_test.c
-src/testbed/gnunet_testbed_mpi_spawn.c
+src/testbed/testbed_api_barriers.c
src/testbed/testbed_api.c
-src/testbed/testbed_api_barriers.c
src/testbed/testbed_api_hosts.c
src/testbed/testbed_api_operations.c
src/testbed/testbed_api_peers.c
src/testbed/testbed_api_sd.c
src/testbed/testbed_api_services.c
src/testbed/testbed_api_statistics.c
+src/testbed/testbed_api_testbed.c
src/testbed/testbed_api_test.c
-src/testbed/testbed_api_testbed.c
src/testbed/testbed_api_topology.c
src/testbed/testbed_api_underlay.c
src/testbed/testbed_logger_api.c
@@ -342,39 +343,39 @@
src/topology/friends.c
src/topology/gnunet-daemon-topology.c
src/transport/gnunet-helper-transport-bluetooth.c
+src/transport/gnunet-helper-transport-wlan.c
src/transport/gnunet-helper-transport-wlan-dummy.c
-src/transport/gnunet-helper-transport-wlan.c
-src/transport/gnunet-service-transport.c
src/transport/gnunet-service-transport_ats.c
src/transport/gnunet-service-transport_blacklist.c
+src/transport/gnunet-service-transport.c
src/transport/gnunet-service-transport_clients.c
src/transport/gnunet-service-transport_hello.c
src/transport/gnunet-service-transport_manipulation.c
src/transport/gnunet-service-transport_neighbours.c
src/transport/gnunet-service-transport_plugins.c
src/transport/gnunet-service-transport_validation.c
+src/transport/gnunet-transport.c
src/transport/gnunet-transport-certificate-creation.c
src/transport/gnunet-transport-profiler.c
src/transport/gnunet-transport-wlan-receiver.c
src/transport/gnunet-transport-wlan-sender.c
-src/transport/gnunet-transport.c
src/transport/plugin_transport_http_client.c
src/transport/plugin_transport_http_common.c
src/transport/plugin_transport_http_server.c
src/transport/plugin_transport_smtp.c
src/transport/plugin_transport_tcp.c
src/transport/plugin_transport_template.c
+src/transport/plugin_transport_udp_broadcasting.c
src/transport/plugin_transport_udp.c
-src/transport/plugin_transport_udp_broadcasting.c
src/transport/plugin_transport_unix.c
src/transport/plugin_transport_wlan.c
-src/transport/transport-testing.c
-src/transport/transport_api.c
src/transport/transport_api_address_to_string.c
src/transport/transport_api_blacklist.c
+src/transport/transport_api.c
src/transport/transport_api_monitor_peers.c
src/transport/transport_api_monitor_plugins.c
src/transport/transport_api_monitor_validation.c
+src/transport/transport-testing.c
src/tun/regex.c
src/tun/tun.c
src/util/bandwidth.c
@@ -389,8 +390,8 @@
src/util/container_bloomfilter.c
src/util/container_heap.c
src/util/container_meta_data.c
+src/util/container_multihashmap32.c
src/util/container_multihashmap.c
-src/util/container_multihashmap32.c
src/util/container_multipeermap.c
src/util/crypto_crc.c
src/util/crypto_ecc.c
@@ -405,8 +406,8 @@
src/util/disk.c
src/util/getopt.c
src/util/getopt_helpers.c
+src/util/gnunet-config.c
src/util/gnunet-config-diff.c
-src/util/gnunet-config.c
src/util/gnunet-ecc.c
src/util/gnunet-helper-w32-console.c
src/util/gnunet-resolver.c
@@ -437,8 +438,8 @@
src/util/w32cat.c
src/util/win.c
src/util/winproc.c
+src/vpn/gnunet-helper-vpn.c
src/vpn/gnunet-helper-vpn-windows.c
-src/vpn/gnunet-helper-vpn.c
src/vpn/gnunet-service-vpn.c
src/vpn/gnunet-vpn.c
src/vpn/vpn_api.c
Modified: gnunet/po/de.po
===================================================================
--- gnunet/po/de.po 2015-04-24 07:04:18 UTC (rev 35558)
+++ gnunet/po/de.po 2015-04-27 11:12:21 UTC (rev 35559)
@@ -10,7 +10,7 @@
msgstr ""
"Project-Id-Version: gnunet 0.10.1\n"
"Report-Msgid-Bugs-To: address@hidden"
-"POT-Creation-Date: 2015-03-14 18:00+0100\n"
+"POT-Creation-Date: 2015-04-27 13:05+0200\n"
"PO-Revision-Date: 2015-03-08 16:16+0100\n"
"Last-Translator: Mario Blättermann <address@hidden>\n"
"Language-Team: German <address@hidden>\n"
@@ -496,16 +496,16 @@
msgid "Could not connect master [%u] and slave [%u]\n"
msgstr "Verbindung zu gnunetd konnte nicht hergestellt werden.\n"
-#: src/ats-tests/ats-testing.c:490 src/ats-tests/ats-testing.c:662
+#: src/ats-tests/ats-testing.c:490 src/ats-tests/ats-testing.c:634
#, fuzzy
msgid "Initialization failed, shutdown\n"
msgstr " Verbindung fehlgeschlagen\n"
-#: src/ats-tests/ats-testing-log.c:846
+#: src/ats-tests/ats-testing-log.c:834
msgid "Stop logging\n"
msgstr "Protokollierung stoppen\n"
-#: src/ats-tests/ats-testing-log.c:897
+#: src/ats-tests/ats-testing-log.c:885
#, fuzzy, c-format
msgid "Start logging `%s'\n"
msgstr "Collection `%s' begonnen.\n"
@@ -553,6 +553,7 @@
msgstr ""
#: src/ats-tool/gnunet-ats.c:708 src/namestore/gnunet-namestore.c:700
+#: src/namestore/plugin_rest_namestore.c:812
#: src/transport/gnunet-transport.c:1890
#: src/transport/gnunet-transport-profiler.c:531
#, c-format
@@ -1409,29 +1410,29 @@
msgid "# PAYLOAD dropped (out of order)"
msgstr ""
-#: src/core/gnunet-service-core_neighbours.c:168
+#: src/core/gnunet-service-core_neighbours.c:177
msgid "# sessions terminated by transport disconnect"
msgstr ""
-#: src/core/gnunet-service-core_neighbours.c:184
-#: src/core/gnunet-service-core_neighbours.c:342
+#: src/core/gnunet-service-core_neighbours.c:193
+#: src/core/gnunet-service-core_neighbours.c:355
msgid "# neighbour entries allocated"
msgstr ""
-#: src/core/gnunet-service-core_neighbours.c:252
+#: src/core/gnunet-service-core_neighbours.c:264
msgid "# encrypted bytes given to transport"
msgstr ""
-#: src/core/gnunet-service-core_neighbours.c:425
+#: src/core/gnunet-service-core_neighbours.c:438
#, fuzzy, c-format
msgid "Unsupported message of type %u (%u bytes) received from peer `%s'\n"
msgstr "Ungültige `%s' Nachricht von Knoten `%s' empfangen.\n"
-#: src/core/gnunet-service-core_sessions.c:245
-#: src/core/gnunet-service-core_sessions.c:331
+#: src/core/gnunet-service-core_sessions.c:252
+#: src/core/gnunet-service-core_sessions.c:338
#: src/dht/gnunet-service-dht_neighbours.c:661
#: src/dht/gnunet-service-dht_neighbours.c:726
-#: src/fs/gnunet-service-fs_cp.c:645 src/fs/gnunet-service-fs_cp.c:1627
+#: src/fs/gnunet-service-fs_cp.c:654 src/fs/gnunet-service-fs_cp.c:1647
#: src/topology/gnunet-daemon-topology.c:734
#: src/topology/gnunet-daemon-topology.c:835
#: src/transport/gnunet-service-transport_neighbours.c:755
@@ -1439,22 +1440,22 @@
msgid "# peers connected"
msgstr "# verbundener Knoten"
-#: src/core/gnunet-service-core_sessions.c:278
+#: src/core/gnunet-service-core_sessions.c:285
#, fuzzy
msgid "# type map refreshes sent"
msgstr "# p2p Trace-Antworten gesendet"
-#: src/core/gnunet-service-core_sessions.c:397
+#: src/core/gnunet-service-core_sessions.c:404
#, fuzzy
msgid "# outdated typemap confirmations received"
msgstr "# Bytes empfangen über TCP"
-#: src/core/gnunet-service-core_sessions.c:408
+#: src/core/gnunet-service-core_sessions.c:415
#, fuzzy
msgid "# valid typemap confirmations received"
msgstr "# Bytes empfangen über TCP"
-#: src/core/gnunet-service-core_sessions.c:546
+#: src/core/gnunet-service-core_sessions.c:554
msgid "# messages discarded (expired prior to transmission)"
msgstr ""
@@ -1469,7 +1470,7 @@
msgstr ""
#: src/datacache/datacache.c:115 src/datacache/datacache.c:266
-#: src/datastore/gnunet-service-datastore.c:855
+#: src/datastore/gnunet-service-datastore.c:841
msgid "# bytes stored"
msgstr "# gespeicherte Bytes"
@@ -1478,8 +1479,8 @@
msgstr "# gespeicherte Objekte"
#: src/datacache/datacache.c:143 src/datacache/datacache.c:150
-#: src/datastore/gnunet-service-datastore.c:1557
-#: src/datastore/gnunet-service-datastore.c:1568
+#: src/datastore/gnunet-service-datastore.c:1598
+#: src/datastore/gnunet-service-datastore.c:1609
#, fuzzy, c-format
msgid "No `%s' specified for `%s' in configuration!\n"
msgstr "In der Konfigurationsdatei wurden keine Anwendungen definiert!\n"
@@ -1512,8 +1513,8 @@
#: src/datacache/plugin_datacache_sqlite.c:69
#: src/datacache/plugin_datacache_sqlite.c:72
-#: src/datastore/plugin_datastore_mysql.c:809
-#: src/datastore/plugin_datastore_mysql.c:823
+#: src/datastore/plugin_datastore_mysql.c:818
+#: src/datastore/plugin_datastore_mysql.c:834
#: src/datastore/plugin_datastore_sqlite.c:57 src/mysql/mysql.c:41
#: src/mysql/mysql.c:48 src/mysql/mysql.c:522 src/mysql/mysql.c:531
#: src/mysql/mysql.c:591 src/mysql/mysql.c:607
@@ -1716,8 +1717,8 @@
#: src/datastore/gnunet-service-datastore.c:712
#: src/datastore/gnunet-service-datastore.c:767
-#: src/datastore/gnunet-service-datastore.c:982
-#: src/datastore/gnunet-service-datastore.c:1529
+#: src/datastore/gnunet-service-datastore.c:999
+#: src/datastore/gnunet-service-datastore.c:1570
msgid "# reserved"
msgstr ""
@@ -1725,133 +1726,148 @@
msgid "Could not find matching reservation"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:867
+#: src/datastore/gnunet-service-datastore.c:853
#, c-format
msgid "Need %llu bytes more space (%llu allowed, using %llu)\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1029
+#: src/datastore/gnunet-service-datastore.c:1046
#, fuzzy
msgid "# GET requests received"
msgstr "# Client Trace-Anfragen empfangen"
-#: src/datastore/gnunet-service-datastore.c:1041
+#: src/datastore/gnunet-service-datastore.c:1058
msgid "# requests filtered by bloomfilter"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1069
+#: src/datastore/gnunet-service-datastore.c:1094
#, fuzzy
msgid "# UPDATE requests received"
msgstr "# Client Trace-Anfragen empfangen"
-#: src/datastore/gnunet-service-datastore.c:1099
+#: src/datastore/gnunet-service-datastore.c:1122
#, fuzzy
msgid "# GET REPLICATION requests received"
msgstr "# Client Trace-Anfragen empfangen"
-#: src/datastore/gnunet-service-datastore.c:1132
+#: src/datastore/gnunet-service-datastore.c:1155
#, fuzzy
msgid "# GET ZERO ANONYMITY requests received"
msgstr "# Client Trace-Anfragen empfangen"
-#: src/datastore/gnunet-service-datastore.c:1157
+#: src/datastore/gnunet-service-datastore.c:1180
msgid "Content not found"
msgstr "Kein Inhalt gefunden"
-#: src/datastore/gnunet-service-datastore.c:1165
+#: src/datastore/gnunet-service-datastore.c:1188
msgid "# bytes removed (explicit request)"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1197
+#: src/datastore/gnunet-service-datastore.c:1220
#, fuzzy
msgid "# REMOVE requests received"
msgstr "# Client Trace-Anfragen empfangen"
-#: src/datastore/gnunet-service-datastore.c:1241
+#: src/datastore/gnunet-service-datastore.c:1264
#, c-format
msgid ""
"Datastore payload must have been inaccurate (%lld < %lld). Recomputing it.\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1246
+#: src/datastore/gnunet-service-datastore.c:1269
#, c-format
msgid "New payload: %lld\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1299
+#: src/datastore/gnunet-service-datastore.c:1322
#, c-format
msgid "Loading `%s' datastore plugin\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1310
+#: src/datastore/gnunet-service-datastore.c:1333
#, fuzzy, c-format
msgid "Failed to load datastore plugin for `%s'\n"
msgstr "Anwendung `%s' konnte nicht initialisiert werden.\n"
-#: src/datastore/gnunet-service-datastore.c:1412
+#: src/datastore/gnunet-service-datastore.c:1402
+#: src/datastore/gnunet-service-datastore.c:1463
+msgid "Bloomfilter construction complete.\n"
+msgstr ""
+
+#: src/datastore/gnunet-service-datastore.c:1450
msgid "Rebuilding bloomfilter. Please be patient.\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1419
+#: src/datastore/gnunet-service-datastore.c:1460
msgid "Plugin does not support get_keys function. Please fix!\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1422
-msgid "Bloomfilter construction complete.\n"
-msgstr ""
-
-#: src/datastore/gnunet-service-datastore.c:1562
+#: src/datastore/gnunet-service-datastore.c:1603
#, fuzzy, c-format
msgid "# bytes used in file-sharing datastore `%s'"
msgstr "# bytes erlaubt in der Datenbank"
-#: src/datastore/gnunet-service-datastore.c:1573
+#: src/datastore/gnunet-service-datastore.c:1614
msgid "# quota"
msgstr "# Kontingent"
-#: src/datastore/gnunet-service-datastore.c:1575
+#: src/datastore/gnunet-service-datastore.c:1616
msgid "# cache size"
msgstr "# Zwischenspeichergröße"
-#: src/datastore/gnunet-service-datastore.c:1588
+#: src/datastore/gnunet-service-datastore.c:1629
#, c-format
msgid "Could not use specified filename `%s' for bloomfilter.\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1606
-#: src/datastore/gnunet-service-datastore.c:1622
+#: src/datastore/gnunet-service-datastore.c:1647
+#: src/datastore/gnunet-service-datastore.c:1663
#, fuzzy, c-format
msgid "Failed to remove bogus bloomfilter file `%s'\n"
msgstr "Datei wurde als `%s' gespeichert.\n"
-#: src/datastore/gnunet-service-datastore.c:1652
+#: src/datastore/gnunet-service-datastore.c:1693
msgid "Failed to initialize bloomfilter.\n"
msgstr "Bloomfilter konnte nicht initialisiert werden.\n"
-#: src/datastore/plugin_datastore_heap.c:821
+#: src/datastore/plugin_datastore_heap.c:826
msgid "Heap database running\n"
msgstr "Heap-Datenbank läuft\n"
-#: src/datastore/plugin_datastore_mysql.c:786
+#: src/datastore/plugin_datastore_mysql.c:309
+#: src/datastore/plugin_datastore_sqlite.c:499
+#, fuzzy
+msgid "Data too large"
+msgstr "Anzahl der Werte"
+
+#: src/datastore/plugin_datastore_mysql.c:328
+msgid "MySQL statement run failure"
+msgstr ""
+
+#: src/datastore/plugin_datastore_mysql.c:793
#, fuzzy, c-format
msgid "Failed to prepare statement `%s'\n"
msgstr "Fehler beim Lesen der Freunde-Liste von `%s'\n"
-#: src/datastore/plugin_datastore_mysql.c:794
+#: src/datastore/plugin_datastore_mysql.c:802
#, fuzzy, c-format
msgid "`%s' for `%s' failed at %s:%d with error: %s\n"
msgstr "`%s' an `%s' schlug fehl bei %s:%d mit dem Fehler: %s\n"
-#: src/datastore/plugin_datastore_mysql.c:1025
+#: src/datastore/plugin_datastore_mysql.c:1036
msgid "Mysql database running\n"
msgstr "MySQL-Datenbank läuft\n"
-#: src/datastore/plugin_datastore_postgres.c:837
+#: src/datastore/plugin_datastore_postgres.c:331
+msgid "Postgress exec failure"
+msgstr ""
+
+#: src/datastore/plugin_datastore_postgres.c:846
#, fuzzy
msgid "Failed to drop table from database.\n"
msgstr "Fehler beim Binden an UDP Port %d.\n"
-#: src/datastore/plugin_datastore_postgres.c:873
+#: src/datastore/plugin_datastore_postgres.c:882
#: src/namecache/plugin_namecache_postgres.c:414
#: src/namestore/plugin_namestore_postgres.c:569
msgid "Postgres database running\n"
@@ -1874,29 +1890,29 @@
msgid "Unable to initialize SQLite: %s.\n"
msgstr "SQLite-Datenbank konnte nicht initialisiert werden: %s.\n"
-#: src/datastore/plugin_datastore_sqlite.c:661
+#: src/datastore/plugin_datastore_sqlite.c:680
#, fuzzy
msgid "Invalid data in database. Trying to fix (by deletion).\n"
msgstr "Ungültige Daten in %s. Korrektur wird versucht (durch Löschung).\n"
-#: src/datastore/plugin_datastore_sqlite.c:1156
+#: src/datastore/plugin_datastore_sqlite.c:1177
msgid "sqlite version to old to determine size, assuming zero\n"
msgstr ""
-#: src/datastore/plugin_datastore_sqlite.c:1176
+#: src/datastore/plugin_datastore_sqlite.c:1197
#, c-format
msgid ""
"Using sqlite page utilization to estimate payload (%llu pages of size %llu "
"bytes)\n"
msgstr ""
-#: src/datastore/plugin_datastore_sqlite.c:1216
+#: src/datastore/plugin_datastore_sqlite.c:1237
#: src/namecache/plugin_namecache_sqlite.c:580
#: src/namestore/plugin_namestore_sqlite.c:716
msgid "Sqlite database running\n"
msgstr "Sqlite-Datenbank läuft\n"
-#: src/datastore/plugin_datastore_template.c:259
+#: src/datastore/plugin_datastore_template.c:260
msgid "Template database running\n"
msgstr ""
@@ -2514,50 +2530,50 @@
msgid "Change DNS replies to point elsewhere."
msgstr ""
-#: src/dns/gnunet-service-dns.c:456
+#: src/dns/gnunet-service-dns.c:459
msgid "# DNS requests answered via TUN interface"
msgstr ""
-#: src/dns/gnunet-service-dns.c:603
+#: src/dns/gnunet-service-dns.c:606
msgid "# DNS exit failed (failed to open socket)"
msgstr ""
-#: src/dns/gnunet-service-dns.c:714
+#: src/dns/gnunet-service-dns.c:717
msgid "# External DNS response discarded (no matching request)"
msgstr ""
-#: src/dns/gnunet-service-dns.c:792
+#: src/dns/gnunet-service-dns.c:795
msgid "# Client response discarded (no matching request)"
msgstr ""
-#: src/dns/gnunet-service-dns.c:907
+#: src/dns/gnunet-service-dns.c:910
msgid "Received malformed IPv4-UDP packet on TUN interface.\n"
msgstr ""
-#: src/dns/gnunet-service-dns.c:923
+#: src/dns/gnunet-service-dns.c:926
msgid "Received malformed IPv6-UDP packet on TUN interface.\n"
msgstr ""
-#: src/dns/gnunet-service-dns.c:932
+#: src/dns/gnunet-service-dns.c:935
#, c-format
msgid "Got non-IP packet with %u bytes and protocol %u from TUN\n"
msgstr ""
-#: src/dns/gnunet-service-dns.c:942
+#: src/dns/gnunet-service-dns.c:945
msgid "# Non-DNS UDP packet received via TUN interface"
msgstr ""
-#: src/dns/gnunet-service-dns.c:1009
+#: src/dns/gnunet-service-dns.c:1012
msgid "# DNS requests received via TUN interface"
msgstr ""
-#: src/dns/gnunet-service-dns.c:1049
-#, c-format
-msgid "`%s' must be installed SUID, refusing to run\n"
+#: src/dns/gnunet-service-dns.c:1064 src/exit/gnunet-daemon-exit.c:3594
+msgid "need a valid IPv4 or IPv6 address\n"
msgstr ""
-#: src/dns/gnunet-service-dns.c:1069 src/exit/gnunet-daemon-exit.c:3594
-msgid "need a valid IPv4 or IPv6 address\n"
+#: src/dns/gnunet-service-dns.c:1082
+#, c-format
+msgid "`%s' must be installed SUID, will not run DNS interceptor\n"
msgstr ""
#: src/dv/gnunet-dv.c:169
@@ -2796,58 +2812,58 @@
msgid "Daemon to run to provide an IP exit node for the VPN"
msgstr ""
-#: src/fragmentation/defragmentation.c:271
+#: src/fragmentation/defragmentation.c:277
msgid "# acknowledgements sent for fragment"
msgstr ""
-#: src/fragmentation/defragmentation.c:463
+#: src/fragmentation/defragmentation.c:470
#: src/transport/plugin_transport_wlan.c:1515
#, fuzzy
msgid "# fragments received"
msgstr "# verworfener Nachrichten"
-#: src/fragmentation/defragmentation.c:533
+#: src/fragmentation/defragmentation.c:540
#, fuzzy
msgid "# duplicate fragments received"
msgstr "# Bytes empfangen über TCP"
-#: src/fragmentation/defragmentation.c:549
+#: src/fragmentation/defragmentation.c:558
msgid "# messages defragmented"
msgstr "# defragmentierter Nachrichten"
-#: src/fragmentation/fragmentation.c:234
+#: src/fragmentation/fragmentation.c:235
#, fuzzy
msgid "# fragments transmitted"
msgstr "# Selbstbekanntmachungen übertragen"
-#: src/fragmentation/fragmentation.c:237
+#: src/fragmentation/fragmentation.c:240
#, fuzzy
msgid "# fragments retransmitted"
msgstr "# Selbstbekanntmachungen übertragen"
-#: src/fragmentation/fragmentation.c:263
+#: src/fragmentation/fragmentation.c:269
#, fuzzy
msgid "# fragments wrap arounds"
msgstr "# verworfener Nachrichten"
-#: src/fragmentation/fragmentation.c:307
+#: src/fragmentation/fragmentation.c:315
msgid "# messages fragmented"
msgstr "# fragmentierter Nachrichten"
-#: src/fragmentation/fragmentation.c:310
+#: src/fragmentation/fragmentation.c:321
msgid "# total size of fragmented messages"
msgstr ""
-#: src/fragmentation/fragmentation.c:431
+#: src/fragmentation/fragmentation.c:444
#, fuzzy
msgid "# fragment acknowledgements received"
msgstr "# Knotenankündigungen empfangen"
-#: src/fragmentation/fragmentation.c:437
+#: src/fragmentation/fragmentation.c:451
msgid "# bits removed from fragmentation ACKs"
msgstr ""
-#: src/fragmentation/fragmentation.c:461
+#: src/fragmentation/fragmentation.c:475
#, fuzzy
msgid "# fragmentation transmissions completed"
msgstr "# Klartext PONG Nachrichten empfangen"
@@ -3120,59 +3136,59 @@
msgid "Got result with unknown block type `%d', ignoring"
msgstr ""
-#: src/fs/fs_unindex.c:59
+#: src/fs/fs_unindex.c:63
msgid "Failed to find given position in file"
msgstr ""
-#: src/fs/fs_unindex.c:64
+#: src/fs/fs_unindex.c:68
#, fuzzy
msgid "Failed to read file"
msgstr "Zustellung der Nachricht `%s' fehlgeschlagen.\n"
-#: src/fs/fs_unindex.c:234
+#: src/fs/fs_unindex.c:245
msgid "Unexpected time for a response from `fs' service."
msgstr ""
-#: src/fs/fs_unindex.c:242
+#: src/fs/fs_unindex.c:253
msgid "Timeout waiting for `fs' service."
msgstr ""
-#: src/fs/fs_unindex.c:250
+#: src/fs/fs_unindex.c:261
#, fuzzy
msgid "Invalid response from `fs' service."
msgstr "Ungültige Antwort auf `%s'.\n"
-#: src/fs/fs_unindex.c:291
+#: src/fs/fs_unindex.c:304
#, fuzzy
msgid "Failed to connect to FS service for unindexing."
msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden."
-#: src/fs/fs_unindex.c:347 src/fs/fs_unindex.c:359
+#: src/fs/fs_unindex.c:360 src/fs/fs_unindex.c:372
#, fuzzy
msgid "Failed to get KSKs from directory scan."
msgstr "Dateiformat fehlerhaft (kein GNUnet Verzeichnis?)\n"
-#: src/fs/fs_unindex.c:355
+#: src/fs/fs_unindex.c:368
#, fuzzy, c-format
msgid "Internal error scanning `%s'.\n"
msgstr "Absicherung fehlgeschlagen bei %s:%d.\n"
-#: src/fs/fs_unindex.c:414
+#: src/fs/fs_unindex.c:427
#, fuzzy, c-format
msgid "Failed to remove UBlock: %s\n"
msgstr "Datei wurde als `%s' gespeichert.\n"
-#: src/fs/fs_unindex.c:562 src/fs/fs_unindex.c:626
+#: src/fs/fs_unindex.c:590 src/fs/fs_unindex.c:656
#, fuzzy
msgid "Failed to connect to `datastore' service."
msgstr "`%s' Dienst konnte nicht initialisiert werden.\n"
-#: src/fs/fs_unindex.c:639
+#: src/fs/fs_unindex.c:669
#, fuzzy
msgid "Failed to open file for unindexing."
msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden."
-#: src/fs/fs_unindex.c:673
+#: src/fs/fs_unindex.c:708
#, fuzzy
msgid "Failed to compute hash of file."
msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden."
@@ -3767,96 +3783,96 @@
msgid "# cadet connections active"
msgstr " Verbindung fehlgeschlagen\n"
-#: src/fs/gnunet-service-fs_cp.c:726
+#: src/fs/gnunet-service-fs_cp.c:735
#, fuzzy
msgid "# migration stop messages received"
msgstr "# verschlüsselter PING Nachrichten empfangen"
-#: src/fs/gnunet-service-fs_cp.c:730
+#: src/fs/gnunet-service-fs_cp.c:739
#, c-format
msgid "Migration of content to peer `%s' blocked for %s\n"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:768
+#: src/fs/gnunet-service-fs_cp.c:776
#, fuzzy
msgid "# replies transmitted to other peers"
msgstr "# Bytes des Typs %d übertragen"
-#: src/fs/gnunet-service-fs_cp.c:774
+#: src/fs/gnunet-service-fs_cp.c:784
#, fuzzy
msgid "# replies dropped"
msgstr "# gap falsche Antworten"
-#: src/fs/gnunet-service-fs_cp.c:799 src/fs/gnunet-service-fs_cp.c:1384
+#: src/fs/gnunet-service-fs_cp.c:810 src/fs/gnunet-service-fs_cp.c:1404
msgid "# P2P searches active"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:904
+#: src/fs/gnunet-service-fs_cp.c:915
msgid "# artificial delays introduced (ms)"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:960
+#: src/fs/gnunet-service-fs_cp.c:971
msgid "# replies dropped due to type mismatch"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:968
+#: src/fs/gnunet-service-fs_cp.c:979
#, fuzzy
msgid "# replies received for other peers"
msgstr "# Bytes des Typs %d empfangen"
-#: src/fs/gnunet-service-fs_cp.c:982
+#: src/fs/gnunet-service-fs_cp.c:993
msgid "# replies dropped due to insufficient cover traffic"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:1030
+#: src/fs/gnunet-service-fs_cp.c:1041
msgid "# P2P searches destroyed due to ultimate reply"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:1098
+#: src/fs/gnunet-service-fs_cp.c:1109
msgid "# requests done for free (low load)"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:1123
+#: src/fs/gnunet-service-fs_cp.c:1134
#, fuzzy
msgid "# request dropped, priority insufficient"
msgstr "# gap Anfragen verworfen: Kollision in RT"
-#: src/fs/gnunet-service-fs_cp.c:1133
+#: src/fs/gnunet-service-fs_cp.c:1144
msgid "# requests done for a price (normal load)"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:1210
+#: src/fs/gnunet-service-fs_cp.c:1221
msgid "# GET requests received (from other peers)"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:1245
+#: src/fs/gnunet-service-fs_cp.c:1256
msgid "# requests dropped due to initiator not being connected"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:1266
+#: src/fs/gnunet-service-fs_cp.c:1277
#, fuzzy
msgid "# requests dropped due to missing reverse route"
msgstr "# gap Anfragen verworfen: Kollision in RT"
-#: src/fs/gnunet-service-fs_cp.c:1277
+#: src/fs/gnunet-service-fs_cp.c:1288
#, fuzzy
msgid "# requests dropped due to full reply queue"
msgstr "# gap Anfragen verworfen: Kollision in RT"
-#: src/fs/gnunet-service-fs_cp.c:1329
+#: src/fs/gnunet-service-fs_cp.c:1340
msgid "# requests dropped due TTL underflow"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:1353
+#: src/fs/gnunet-service-fs_cp.c:1365
msgid "# requests dropped due to higher-TTL request"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:1382
+#: src/fs/gnunet-service-fs_cp.c:1402
#, fuzzy
msgid "# P2P query messages received and processed"
msgstr "# verschlüsselter PING Nachrichten empfangen"
-#: src/fs/gnunet-service-fs_cp.c:1821
+#: src/fs/gnunet-service-fs_cp.c:1841
#, fuzzy
msgid "# migration stop messages sent"
msgstr "# verschlüsselter PING Nachrichten empfangen"
@@ -4200,7 +4216,7 @@
msgid "GNUnet DNS-to-GNS proxy (a DNS server)"
msgstr ""
-#: src/gns/gnunet-gns.c:215
+#: src/gns/gnunet-gns.c:215 src/gns/plugin_rest_gns.c:334
#, c-format
msgid "Invalid typename specified, assuming `ANY'\n"
msgstr ""
@@ -4216,6 +4232,7 @@
msgstr ""
#: src/gns/gnunet-gns.c:353 src/gns/gnunet-gns-helper-service-w32.c:798
+#: src/gns/plugin_rest_gns.c:459
#, c-format
msgid ""
"Ego for `gns-master' not found, cannot perform lookup. Did you run gnunet-"
@@ -4354,7 +4371,7 @@
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:2225
+#: src/gns/gnunet-gns-proxy.c:2225 src/rest/gnunet-rest-server.c:529
#, fuzzy
msgid "Failed to pass client to MHD\n"
msgstr "Fehler beim Starten der Collection.\n"
@@ -4459,21 +4476,21 @@
msgid "GNS lookup resulted in DNS name that is too long (`%s')\n"
msgstr ""
-#: src/gns/gnunet-service-gns_resolver.c:1886
+#: src/gns/gnunet-service-gns_resolver.c:1891
msgid "GNS lookup recursion failed (no delegation record found)\n"
msgstr ""
-#: src/gns/gnunet-service-gns_resolver.c:1910
+#: src/gns/gnunet-service-gns_resolver.c:1915
#, fuzzy, c-format
msgid "Failed to cache GNS resolution: %s\n"
msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n"
-#: src/gns/gnunet-service-gns_resolver.c:2192
+#: src/gns/gnunet-service-gns_resolver.c:2197
#, c-format
msgid "Zone %s was revoked, resolution fails\n"
msgstr ""
-#: src/gns/gnunet-service-gns_resolver.c:2341
+#: src/gns/gnunet-service-gns_resolver.c:2346
#, c-format
msgid "Hostname `%s' is not well-formed, resolution fails\n"
msgstr ""
@@ -4503,6 +4520,15 @@
msgid "Unable to parse BOX record string `%s'\n"
msgstr "Fehler beim Speichern der Konfigurationsdatei `%s':"
+#: src/gns/plugin_rest_gns.c:422
+msgid "Ego for not found, cannot perform lookup.\n"
+msgstr ""
+
+#: src/gns/plugin_rest_gns.c:652
+#, fuzzy
+msgid "GNS REST API initialized\n"
+msgstr " Verbindung fehlgeschlagen\n"
+
#: src/gnsrecord/plugin_gnsrecord_dns.c:291
#, c-format
msgid "Unable to parse IPv4 address `%s'\n"
@@ -5026,6 +5052,10 @@
msgid "Failed to create directory `%s' for storing egos\n"
msgstr "Dateiformat fehlerhaft (kein GNUnet Verzeichnis?)\n"
+#: src/identity/plugin_rest_identity.c:803
+msgid "Identity REST API initialized\n"
+msgstr ""
+
#: src/mysql/mysql.c:174
#, c-format
msgid "Trying to use file `%s' for MySQL configuration.\n"
@@ -5051,10 +5081,10 @@
msgid "You must specify which zone should be accessed\n"
msgstr "Gibt an, welcher TRANSPORT getestet werden soll"
-#: src/namecache/gnunet-namecache.c:195 src/namestore/gnunet-namestore.c:844
-#, c-format
-msgid "Invalid public key for reverse lookup `%s'\n"
-msgstr ""
+#: src/namecache/gnunet-namecache.c:195
+#, fuzzy, c-format
+msgid "Invalid public key for zone `%s'\n"
+msgstr "Ungültiger Parameter: `%s'\n"
#: src/namecache/gnunet-namecache.c:203
#, fuzzy, c-format
@@ -5091,11 +5121,13 @@
msgstr ""
#: src/namestore/gnunet-namestore.c:332
+#: src/namestore/plugin_rest_namestore.c:505
#, c-format
msgid "Deleting record failed, record does not exist%s%s\n"
msgstr ""
#: src/namestore/gnunet-namestore.c:339
+#: src/namestore/plugin_rest_namestore.c:514
#, c-format
msgid "Deleting record failed%s%s\n"
msgstr ""
@@ -5113,6 +5145,7 @@
msgstr ""
#: src/namestore/gnunet-namestore.c:628
+#: src/namestore/plugin_rest_namestore.c:538
#, c-format
msgid "There are no records under label `%s' that could be deleted.\n"
msgstr ""
@@ -5130,6 +5163,7 @@
#: src/namestore/gnunet-namestore.c:719
#: src/namestore/gnunet-namestore-fcfsd.c:984
+#: src/namestore/plugin_rest_namestore.c:821
#, fuzzy
msgid "Failed to connect to namestore\n"
msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n"
@@ -5147,11 +5181,14 @@
msgstr ""
#: src/namestore/gnunet-namestore.c:745
+#: src/namestore/plugin_rest_namestore.c:608
#, fuzzy, c-format
msgid "Unsupported type `%s'\n"
msgstr "Kommando `%s' wird nicht unterstützt. Vorgang wird abgebrochen.\n"
#: src/namestore/gnunet-namestore.c:765
+#: src/namestore/plugin_rest_namestore.c:626
+#: src/namestore/plugin_rest_namestore.c:666
#, fuzzy, c-format
msgid "Value `%s' invalid for record type `%s'\n"
msgstr "%s: Symbolwert `%s' ist ungültig für %s\n"
@@ -5165,6 +5202,11 @@
msgid "del"
msgstr ""
+#: src/namestore/gnunet-namestore.c:844
+#, c-format
+msgid "Invalid public key for reverse lookup `%s'\n"
+msgstr ""
+
#: src/namestore/gnunet-namestore.c:868
#: src/peerinfo-tool/gnunet-peerinfo.c:817
#, fuzzy, c-format
@@ -5177,21 +5219,25 @@
msgstr "Ungültiger Parameter: `%s'\n"
#: src/namestore/gnunet-namestore.c:943
+#: src/namestore/plugin_rest_namestore.c:851
#, fuzzy, c-format
msgid "Ego `%s' not known to identity service\n"
msgstr "`%s': unbekannter Dienst: %s\n"
#: src/namestore/gnunet-namestore.c:970
+#: src/namestore/plugin_rest_namestore.c:878
#, c-format
msgid "No default ego configured in identity service\n"
msgstr ""
#: src/namestore/gnunet-namestore.c:1006
+#: src/namestore/plugin_rest_namestore.c:917
#, c-format
msgid "Identity service is not running\n"
msgstr ""
#: src/namestore/gnunet-namestore.c:1018
+#: src/namestore/plugin_rest_namestore.c:946
#, fuzzy, c-format
msgid "Cannot connect to identity service\n"
msgstr "Verbindung zu %u.%u.%u.%u:%u fehlgeschlagen: %s\n"
@@ -5320,6 +5366,11 @@
msgid "Namestore failed to store record\n"
msgstr ""
+#: src/namestore/plugin_rest_namestore.c:1023
+#, fuzzy
+msgid "Namestore REST API initialized\n"
+msgstr " Verbindung fehlgeschlagen\n"
+
#: src/nat/gnunet-nat-server.c:279
#, c-format
msgid "Please pass valid port number as the first argument! (got `%s')\n"
@@ -5568,7 +5619,7 @@
msgstr ""
#: src/nse/gnunet-service-nse.c:1537
-#: src/revocation/gnunet-service-revocation.c:815 src/util/gnunet-scrypt.c:260
+#: src/revocation/gnunet-service-revocation.c:827 src/util/gnunet-scrypt.c:260
msgid "Value is too large.\n"
msgstr ""
@@ -6101,6 +6152,15 @@
msgid "Regex `%s' is too long!\n"
msgstr ""
+#: src/rest/gnunet-rest-server.c:766
+msgid "listen on specified port (default: 7776)"
+msgstr ""
+
+#: src/rest/gnunet-rest-server.c:783
+#, fuzzy
+msgid "GNUnet REST server"
+msgstr "GNUnet Netzwerk Topologie tracen."
+
#: src/revocation/gnunet-revocation.c:126
#, c-format
msgid "Key `%s' is valid\n"
@@ -6227,11 +6287,11 @@
msgstr "# Klartext PONG Nachrichten empfangen"
#: src/revocation/gnunet-service-revocation.c:493
-#: src/revocation/gnunet-service-revocation.c:747
+#: src/revocation/gnunet-service-revocation.c:759
msgid "SET service crashed, terminating revocation service\n"
msgstr ""
-#: src/revocation/gnunet-service-revocation.c:839
+#: src/revocation/gnunet-service-revocation.c:851
#, fuzzy
msgid "Could not open revocation database file!"
msgstr "Knoten `%s' konnte nicht in der Routing Tabelle gefunden werden!\n"
@@ -7928,7 +7988,7 @@
msgstr ""
#: src/transport/plugin_transport_http_server.c:2825
-#: src/transport/plugin_transport_udp.c:3336
+#: src/transport/plugin_transport_udp.c:3335
msgid "Disabling IPv6 since it is not supported on this system!\n"
msgstr ""
@@ -8157,49 +8217,49 @@
msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n"
msgstr "Der Transportdienst auf Port %d konnte nicht gestartet werden.\n"
-#: src/transport/plugin_transport_udp.c:3082
+#: src/transport/plugin_transport_udp.c:3081
#, c-format
msgid ""
"UDP could not transmit message to `%s': Network seems down, please check "
"your network configuration\n"
msgstr ""
-#: src/transport/plugin_transport_udp.c:3096
+#: src/transport/plugin_transport_udp.c:3095
msgid ""
"UDP 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_udp.c:3412
-#: src/transport/plugin_transport_udp.c:3511
+#: src/transport/plugin_transport_udp.c:3411
+#: src/transport/plugin_transport_udp.c:3510
#, fuzzy, c-format
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:3430
+#: src/transport/plugin_transport_udp.c:3429
msgid "Disabling IPv4 since it is not supported on this system!\n"
msgstr ""
-#: src/transport/plugin_transport_udp.c:3521
+#: src/transport/plugin_transport_udp.c:3520
msgid "Failed to open UDP sockets\n"
msgstr "UDP-Sockets können nicht geöffnet werden\n"
-#: src/transport/plugin_transport_udp.c:3592
-#: src/transport/plugin_transport_udp.c:3606
+#: src/transport/plugin_transport_udp.c:3591
+#: src/transport/plugin_transport_udp.c:3605
msgid "must be in [0,65535]"
msgstr ""
-#: src/transport/plugin_transport_udp.c:3638
+#: src/transport/plugin_transport_udp.c:3637
#, fuzzy
msgid "must be valid IPv4 address"
msgstr "»%s« ist keine gültige IP-Adresse.\n"
-#: src/transport/plugin_transport_udp.c:3665
+#: src/transport/plugin_transport_udp.c:3664
#, fuzzy
msgid "must be valid IPv6 address"
msgstr "»%s« ist keine gültige IP-Adresse.\n"
-#: src/transport/plugin_transport_udp.c:3731
+#: src/transport/plugin_transport_udp.c:3730
#, fuzzy
msgid "Failed to create UDP network sockets\n"
msgstr "UDP-Sockets können nicht geöffnet werden\n"
@@ -8425,24 +8485,24 @@
msgid "Syntax error while deserializing in line %u\n"
msgstr "Syntaxfehler in Konfigurationsdatei `%s' in Zeile %d.\n"
-#: src/util/configuration.c:1026
+#: src/util/configuration.c:1025
#, c-format
msgid ""
"Configuration value '%s' for '%s' in section '%s' is not in set of legal "
"choices\n"
msgstr ""
-#: src/util/configuration.c:1145
+#: src/util/configuration.c:1144
#, c-format
msgid "Recursive expansion suspected, aborting $-expansion for term `%s'\n"
msgstr ""
-#: src/util/configuration.c:1177
+#: src/util/configuration.c:1176
#, c-format
msgid "Missing closing `%s' in option `%s'\n"
msgstr ""
-#: src/util/configuration.c:1251
+#: src/util/configuration.c:1250
#, c-format
msgid ""
"Failed to expand `%s' in `%s' as it is neither found in [PATHS] nor defined "
@@ -8466,52 +8526,52 @@
"%llu)\n"
msgstr ""
-#: src/util/crypto_ecc.c:731 src/util/crypto_ecc.c:769
-#: src/util/crypto_ecc.c:887 src/util/crypto_ecc.c:925
+#: src/util/crypto_ecc.c:733 src/util/crypto_ecc.c:771
+#: src/util/crypto_ecc.c:889 src/util/crypto_ecc.c:927
#, fuzzy, c-format
msgid "Could not acquire lock on file `%s': %s...\n"
msgstr "PID konnte nicht in Datei `%s' geschrieben werden: %s.\n"
-#: src/util/crypto_ecc.c:736 src/util/crypto_ecc.c:892
+#: src/util/crypto_ecc.c:738 src/util/crypto_ecc.c:894
#, fuzzy
msgid "Creating a new private key. This may take a while.\n"
msgstr "Ein neuer Hostkey wird erzeugt (dies kann eine Weile dauern).\n"
-#: src/util/crypto_ecc.c:773 src/util/crypto_ecc.c:929
+#: src/util/crypto_ecc.c:775 src/util/crypto_ecc.c:931
msgid "This may be ok if someone is currently generating a private key.\n"
msgstr ""
-#: src/util/crypto_ecc.c:803 src/util/crypto_ecc.c:959
+#: src/util/crypto_ecc.c:805 src/util/crypto_ecc.c:961
#, c-format
msgid ""
"When trying to read key file `%s' I found %u bytes but I need at least %u.\n"
msgstr ""
-#: src/util/crypto_ecc.c:807 src/util/crypto_ecc.c:963
+#: src/util/crypto_ecc.c:809 src/util/crypto_ecc.c:965
msgid "This may be ok if someone is currently generating a key.\n"
msgstr ""
-#: src/util/crypto_ecc.c:1045
+#: src/util/crypto_ecc.c:1047
#, fuzzy
msgid "Could not load peer's private key\n"
msgstr "Anwendung `%s' konnte nicht initialisiert werden.\n"
-#: src/util/crypto_ecc.c:1149
+#: src/util/crypto_ecc.c:1151
#, fuzzy, c-format
msgid "ECC signing failed at %s:%d: %s\n"
msgstr "`%s' schlug fehl bei %s:%d mit dem Fehler: `%s'.\n"
-#: src/util/crypto_ecc.c:1199
+#: src/util/crypto_ecc.c:1201
#, fuzzy, c-format
msgid "EdDSA signing failed at %s:%d: %s\n"
msgstr "`%s' schlug fehl bei %s:%d mit dem Fehler: `%s'.\n"
-#: src/util/crypto_ecc.c:1273
+#: src/util/crypto_ecc.c:1275
#, fuzzy, c-format
msgid "ECDSA signature verification failed at %s:%d: %s\n"
msgstr "RSA Signaturüberprüfung fehlgeschlagen bei %s:%d: %s\n"
-#: src/util/crypto_ecc.c:1330
+#: src/util/crypto_ecc.c:1332
#, fuzzy, c-format
msgid "EdDSA signature verification failed at %s:%d: %s\n"
msgstr "RSA Signaturüberprüfung fehlgeschlagen bei %s:%d: %s\n"
@@ -8522,17 +8582,17 @@
msgstr ""
"libgcrypt hat nicht die erwartete Version (Version %s wird vorausgesetzt).\n"
-#: src/util/crypto_rsa.c:809
+#: src/util/crypto_rsa.c:825
#, fuzzy, c-format
msgid "RSA signature verification failed at %s:%d: %s\n"
msgstr "RSA Signaturüberprüfung fehlgeschlagen bei %s:%d: %s\n"
-#: src/util/disk.c:1218
+#: src/util/disk.c:1222
#, fuzzy, c-format
msgid "Expected `%s' to be a directory!\n"
msgstr "`%s' erwartet, dass `%s' ein Verzeichnis ist!\n"
-#: src/util/disk.c:1580 src/util/service.c:1328
+#: src/util/disk.c:1584 src/util/service.c:1328
#, fuzzy, c-format
msgid "Cannot obtain information about user `%s': %s\n"
msgstr "Fehler beim Speichern der Konfigurationsdatei: `%s': %s.\n"
@@ -8597,7 +8657,7 @@
msgid "Use %s to get a list of options.\n"
msgstr "Verwenden Sie --help, um eine Liste der Optionen zu erhalten.\n"
-#: src/util/getopt_helpers.c:84
+#: src/util/getopt_helpers.c:90
#, c-format
msgid ""
"Arguments mandatory for long options are also mandatory for short options.\n"
@@ -8605,12 +8665,12 @@
"Argumente, die für lange Optionen zwingend sind, sind auch für kurze "
"Optionen zwingend.\n"
-#: src/util/getopt_helpers.c:268 src/util/getopt_helpers.c:326
+#: src/util/getopt_helpers.c:274 src/util/getopt_helpers.c:332
#, c-format
msgid "You must pass a number to the `%s' option.\n"
msgstr "Sie müssen für die Option »%s« zusätzlich eine Zahl angeben.\n"
-#: src/util/getopt_helpers.c:298
+#: src/util/getopt_helpers.c:304
#, c-format
msgid "You must pass relative time to the `%s' option.\n"
msgstr "Sie müssen eine relative Zeit zu der Option »%s« übergeben.\n"
@@ -8854,23 +8914,23 @@
msgid "GetExitCodeProcess failed for binary %s (%d).\n"
msgstr ""
-#: src/util/plugin.c:87
+#: src/util/plugin.c:86
#, c-format
msgid "Initialization of plugin mechanism failed: %s!\n"
msgstr "Initialisierung des Plugin-Mechanismus fehlgeschlagen: %s!\n"
-#: src/util/plugin.c:148
+#: src/util/plugin.c:151
#, fuzzy, c-format
msgid "`%s' failed to resolve method '%s' with error: %s\n"
msgstr ""
"`%s' konnte die Methode '%s%s' nicht auflösen. Ort: %s:%d. Fehler: %s\n"
-#: src/util/plugin.c:223
+#: src/util/plugin.c:226
#, fuzzy, c-format
msgid "`%s' failed for library `%s' with error: %s\n"
msgstr "`%s' fehlgeschlagen für die Bibliothek `%s'. Ort: %s:%d. Fehler: %s\n"
-#: src/util/plugin.c:382
+#: src/util/plugin.c:385
#, fuzzy
msgid "Could not determine plugin installation path.\n"
msgstr "Öffentliche IP-Adresse konnte nicht ermittelt werden.\n"
@@ -9452,10 +9512,6 @@
#~ msgstr "Empfangene Client-Nachricht ist ungültig.\n"
#, fuzzy
-#~ msgid "Mesh initialized\n"
-#~ msgstr " Verbindung fehlgeschlagen\n"
-
-#, fuzzy
#~ msgid "# SUC responder result messages received"
#~ msgstr "# verschlüsselter PING Nachrichten empfangen"
Modified: gnunet/po/es.po
===================================================================
--- gnunet/po/es.po 2015-04-24 07:04:18 UTC (rev 35558)
+++ gnunet/po/es.po 2015-04-27 11:12:21 UTC (rev 35559)
@@ -7,7 +7,7 @@
msgstr ""
"Project-Id-Version: gnunet 0.9.5a\n"
"Report-Msgid-Bugs-To: address@hidden"
-"POT-Creation-Date: 2015-03-14 18:00+0100\n"
+"POT-Creation-Date: 2015-04-27 13:05+0200\n"
"PO-Revision-Date: 2013-02-23 17:50+0100\n"
"Last-Translator: Miguel Ángel Arruga Vivas <address@hidden>\n"
"Language-Team: Spanish <address@hidden>\n"
@@ -535,16 +535,16 @@
msgid "Could not connect master [%u] and slave [%u]\n"
msgstr "¡No se pudo conectar al servicio %s!\n"
-#: src/ats-tests/ats-testing.c:490 src/ats-tests/ats-testing.c:662
+#: src/ats-tests/ats-testing.c:490 src/ats-tests/ats-testing.c:634
#, fuzzy
msgid "Initialization failed, shutdown\n"
msgstr "¡La inicialización del mecanismo de módulos falló: %s!\n"
-#: src/ats-tests/ats-testing-log.c:846
+#: src/ats-tests/ats-testing-log.c:834
msgid "Stop logging\n"
msgstr ""
-#: src/ats-tests/ats-testing-log.c:897
+#: src/ats-tests/ats-testing-log.c:885
#, fuzzy, c-format
msgid "Start logging `%s'\n"
msgstr "Iniciando descarga «%s».\n"
@@ -600,6 +600,7 @@
msgstr "Cuota para la red «%11s» (entrada/salida): %10s / %10s\n"
#: src/ats-tool/gnunet-ats.c:708 src/namestore/gnunet-namestore.c:700
+#: src/namestore/plugin_rest_namestore.c:812
#: src/transport/gnunet-transport.c:1890
#: src/transport/gnunet-transport-profiler.c:531
#, c-format
@@ -1480,29 +1481,29 @@
msgid "# PAYLOAD dropped (out of order)"
msgstr "# bytes omitidos (fuera de secuencia)"
-#: src/core/gnunet-service-core_neighbours.c:168
+#: src/core/gnunet-service-core_neighbours.c:177
msgid "# sessions terminated by transport disconnect"
msgstr "# sesiones terminadas por desconexión de transporte"
-#: src/core/gnunet-service-core_neighbours.c:184
-#: src/core/gnunet-service-core_neighbours.c:342
+#: src/core/gnunet-service-core_neighbours.c:193
+#: src/core/gnunet-service-core_neighbours.c:355
msgid "# neighbour entries allocated"
msgstr "# entradas de vecinos alojadas"
-#: src/core/gnunet-service-core_neighbours.c:252
+#: src/core/gnunet-service-core_neighbours.c:264
msgid "# encrypted bytes given to transport"
msgstr "# bytes cifrados dados al transporte"
-#: src/core/gnunet-service-core_neighbours.c:425
+#: src/core/gnunet-service-core_neighbours.c:438
#, c-format
msgid "Unsupported message of type %u (%u bytes) received from peer `%s'\n"
msgstr "Mensaje no soportado del tipo %u (%u bytes) recibido del par «%s»\n"
-#: src/core/gnunet-service-core_sessions.c:245
-#: src/core/gnunet-service-core_sessions.c:331
+#: src/core/gnunet-service-core_sessions.c:252
+#: src/core/gnunet-service-core_sessions.c:338
#: src/dht/gnunet-service-dht_neighbours.c:661
#: src/dht/gnunet-service-dht_neighbours.c:726
-#: src/fs/gnunet-service-fs_cp.c:645 src/fs/gnunet-service-fs_cp.c:1627
+#: src/fs/gnunet-service-fs_cp.c:654 src/fs/gnunet-service-fs_cp.c:1647
#: src/topology/gnunet-daemon-topology.c:734
#: src/topology/gnunet-daemon-topology.c:835
#: src/transport/gnunet-service-transport_neighbours.c:755
@@ -1510,21 +1511,21 @@
msgid "# peers connected"
msgstr "# pares conectados"
-#: src/core/gnunet-service-core_sessions.c:278
+#: src/core/gnunet-service-core_sessions.c:285
msgid "# type map refreshes sent"
msgstr "# envíos de refrescos del mapa de tipos"
-#: src/core/gnunet-service-core_sessions.c:397
+#: src/core/gnunet-service-core_sessions.c:404
#, fuzzy
msgid "# outdated typemap confirmations received"
msgstr "Se produjo un fallo al encolar una confirmación de recepción\n"
-#: src/core/gnunet-service-core_sessions.c:408
+#: src/core/gnunet-service-core_sessions.c:415
#, fuzzy
msgid "# valid typemap confirmations received"
msgstr "Se produjo un fallo al encolar una confirmación de recepción\n"
-#: src/core/gnunet-service-core_sessions.c:546
+#: src/core/gnunet-service-core_sessions.c:554
msgid "# messages discarded (expired prior to transmission)"
msgstr "# mensajes descartados (expirados antes de su transmisión)"
@@ -1538,7 +1539,7 @@
msgstr "# actualizaciones de mi mapa de tipos"
#: src/datacache/datacache.c:115 src/datacache/datacache.c:266
-#: src/datastore/gnunet-service-datastore.c:855
+#: src/datastore/gnunet-service-datastore.c:841
msgid "# bytes stored"
msgstr "# bytes almacenados"
@@ -1547,8 +1548,8 @@
msgstr "# elementos almacenados"
#: src/datacache/datacache.c:143 src/datacache/datacache.c:150
-#: src/datastore/gnunet-service-datastore.c:1557
-#: src/datastore/gnunet-service-datastore.c:1568
+#: src/datastore/gnunet-service-datastore.c:1598
+#: src/datastore/gnunet-service-datastore.c:1609
#, c-format
msgid "No `%s' specified for `%s' in configuration!\n"
msgstr "¡No se ha especificado ningún «%s» para «%s» en la configuración!\n"
@@ -1582,8 +1583,8 @@
#: src/datacache/plugin_datacache_sqlite.c:69
#: src/datacache/plugin_datacache_sqlite.c:72
-#: src/datastore/plugin_datastore_mysql.c:809
-#: src/datastore/plugin_datastore_mysql.c:823
+#: src/datastore/plugin_datastore_mysql.c:818
+#: src/datastore/plugin_datastore_mysql.c:834
#: src/datastore/plugin_datastore_sqlite.c:57 src/mysql/mysql.c:41
#: src/mysql/mysql.c:48 src/mysql/mysql.c:522 src/mysql/mysql.c:531
#: src/mysql/mysql.c:591 src/mysql/mysql.c:607
@@ -1788,8 +1789,8 @@
#: src/datastore/gnunet-service-datastore.c:712
#: src/datastore/gnunet-service-datastore.c:767
-#: src/datastore/gnunet-service-datastore.c:982
-#: src/datastore/gnunet-service-datastore.c:1529
+#: src/datastore/gnunet-service-datastore.c:999
+#: src/datastore/gnunet-service-datastore.c:1570
msgid "# reserved"
msgstr "# reservado"
@@ -1797,46 +1798,46 @@
msgid "Could not find matching reservation"
msgstr "No se pudo encontrar una reserva coincidente"
-#: src/datastore/gnunet-service-datastore.c:867
+#: src/datastore/gnunet-service-datastore.c:853
#, c-format
msgid "Need %llu bytes more space (%llu allowed, using %llu)\n"
msgstr ""
"Se necesitan %llu bytes más de espacio (%llu permitidos, usando %llu)\n"
-#: src/datastore/gnunet-service-datastore.c:1029
+#: src/datastore/gnunet-service-datastore.c:1046
msgid "# GET requests received"
msgstr "# peticiones «GET» recibidas"
-#: src/datastore/gnunet-service-datastore.c:1041
+#: src/datastore/gnunet-service-datastore.c:1058
msgid "# requests filtered by bloomfilter"
msgstr "# peticiones filtradas por el «bloomfilter»"
-#: src/datastore/gnunet-service-datastore.c:1069
+#: src/datastore/gnunet-service-datastore.c:1094
msgid "# UPDATE requests received"
msgstr "# peticiones «UPDATE» recibidas"
-#: src/datastore/gnunet-service-datastore.c:1099
+#: src/datastore/gnunet-service-datastore.c:1122
msgid "# GET REPLICATION requests received"
msgstr "# peticiones «GET REPLICATION» recibidas"
-#: src/datastore/gnunet-service-datastore.c:1132
+#: src/datastore/gnunet-service-datastore.c:1155
msgid "# GET ZERO ANONYMITY requests received"
msgstr "# peticiones «GET ZERO ANONYMITY» recibidas"
-#: src/datastore/gnunet-service-datastore.c:1157
+#: src/datastore/gnunet-service-datastore.c:1180
msgid "Content not found"
msgstr "Contenido no encontrado"
-#: src/datastore/gnunet-service-datastore.c:1165
+#: src/datastore/gnunet-service-datastore.c:1188
msgid "# bytes removed (explicit request)"
msgstr "# bytes eliminados (petición explícita)"
-#: src/datastore/gnunet-service-datastore.c:1197
+#: src/datastore/gnunet-service-datastore.c:1220
msgid "# REMOVE requests received"
msgstr "# peticiones «REMOVE» recibidas"
# Miguel: ¿Cómo traducir «payload»? ¿Código cargado?
-#: src/datastore/gnunet-service-datastore.c:1241
+#: src/datastore/gnunet-service-datastore.c:1264
#, fuzzy, c-format
msgid ""
"Datastore payload must have been inaccurate (%lld < %lld). Recomputing it.\n"
@@ -1844,88 +1845,103 @@
"El «payload» del almacén de datos es impreciso (%lld < %lld). Intentando "
"repararlo.\n"
-#: src/datastore/gnunet-service-datastore.c:1246
+#: src/datastore/gnunet-service-datastore.c:1269
#, c-format
msgid "New payload: %lld\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1299
+#: src/datastore/gnunet-service-datastore.c:1322
#, c-format
msgid "Loading `%s' datastore plugin\n"
msgstr "Cargando el módulo del almacén de datos «%s»\n"
-#: src/datastore/gnunet-service-datastore.c:1310
+#: src/datastore/gnunet-service-datastore.c:1333
#, c-format
msgid "Failed to load datastore plugin for `%s'\n"
msgstr ""
"Se produjo un fallo al inicializar el módulo del almacén de datos para «%s»\n"
-#: src/datastore/gnunet-service-datastore.c:1412
+#: src/datastore/gnunet-service-datastore.c:1402
+#: src/datastore/gnunet-service-datastore.c:1463
+msgid "Bloomfilter construction complete.\n"
+msgstr "Construcción de «bloomfilter» completa.\n"
+
+#: src/datastore/gnunet-service-datastore.c:1450
msgid "Rebuilding bloomfilter. Please be patient.\n"
msgstr "Reconstruyendo «bloomfilter». Por favor, tenga paciencia.\n"
-#: src/datastore/gnunet-service-datastore.c:1419
+#: src/datastore/gnunet-service-datastore.c:1460
msgid "Plugin does not support get_keys function. Please fix!\n"
msgstr "El módulo no soporta la función «get_keys». Por favor, corríjalo.\n"
-#: src/datastore/gnunet-service-datastore.c:1422
-msgid "Bloomfilter construction complete.\n"
-msgstr "Construcción de «bloomfilter» completa.\n"
-
-#: src/datastore/gnunet-service-datastore.c:1562
+#: src/datastore/gnunet-service-datastore.c:1603
#, c-format
msgid "# bytes used in file-sharing datastore `%s'"
msgstr "# bytes usados en el almacén de ficheros compartidos «%s»"
-#: src/datastore/gnunet-service-datastore.c:1573
+#: src/datastore/gnunet-service-datastore.c:1614
msgid "# quota"
msgstr "# cuota"
-#: src/datastore/gnunet-service-datastore.c:1575
+#: src/datastore/gnunet-service-datastore.c:1616
msgid "# cache size"
msgstr "# tamaño de la caché"
-#: src/datastore/gnunet-service-datastore.c:1588
+#: src/datastore/gnunet-service-datastore.c:1629
#, c-format
msgid "Could not use specified filename `%s' for bloomfilter.\n"
msgstr ""
"No se pudo usar el nombre de fichero especificado «%s» para «bloomfilter».\n"
-#: src/datastore/gnunet-service-datastore.c:1606
-#: src/datastore/gnunet-service-datastore.c:1622
+#: src/datastore/gnunet-service-datastore.c:1647
+#: src/datastore/gnunet-service-datastore.c:1663
#, c-format
msgid "Failed to remove bogus bloomfilter file `%s'\n"
msgstr ""
"Se produjo un fallo al borrar el fichero de configuración defectuoso de "
"«bloomfilter» «%s»:\n"
-#: src/datastore/gnunet-service-datastore.c:1652
+#: src/datastore/gnunet-service-datastore.c:1693
msgid "Failed to initialize bloomfilter.\n"
msgstr "Se produjo un fallo al inicializar «bloomfilter».\n"
-#: src/datastore/plugin_datastore_heap.c:821
+#: src/datastore/plugin_datastore_heap.c:826
msgid "Heap database running\n"
msgstr "Base de datos de montículo ejecutándose\n"
-#: src/datastore/plugin_datastore_mysql.c:786
+#: src/datastore/plugin_datastore_mysql.c:309
+#: src/datastore/plugin_datastore_sqlite.c:499
+#, fuzzy
+msgid "Data too large"
+msgstr "número de valores"
+
+#: src/datastore/plugin_datastore_mysql.c:328
+msgid "MySQL statement run failure"
+msgstr ""
+
+#: src/datastore/plugin_datastore_mysql.c:793
#, c-format
msgid "Failed to prepare statement `%s'\n"
msgstr "Se produjo un fallo al preparar la sentencia «%s»\n"
-#: src/datastore/plugin_datastore_mysql.c:794
+#: src/datastore/plugin_datastore_mysql.c:802
#, c-format
msgid "`%s' for `%s' failed at %s:%d with error: %s\n"
msgstr "«%s» para «%s» falló en %s: %d con error: %s\n"
-#: src/datastore/plugin_datastore_mysql.c:1025
+#: src/datastore/plugin_datastore_mysql.c:1036
msgid "Mysql database running\n"
msgstr "Base de datos Mysql ejecutándose\n"
-#: src/datastore/plugin_datastore_postgres.c:837
+#: src/datastore/plugin_datastore_postgres.c:331
+msgid "Postgress exec failure"
+msgstr ""
+
+#: src/datastore/plugin_datastore_postgres.c:846
msgid "Failed to drop table from database.\n"
msgstr "Se produjo un fallo al borrar una tabla de la base de datos.\n"
-#: src/datastore/plugin_datastore_postgres.c:873
+#: src/datastore/plugin_datastore_postgres.c:882
#: src/namecache/plugin_namecache_postgres.c:414
#: src/namestore/plugin_namestore_postgres.c:569
msgid "Postgres database running\n"
@@ -1948,19 +1964,19 @@
msgid "Unable to initialize SQLite: %s.\n"
msgstr "Imposible inicializar SQLite: %s.\n"
-#: src/datastore/plugin_datastore_sqlite.c:661
+#: src/datastore/plugin_datastore_sqlite.c:680
msgid "Invalid data in database. Trying to fix (by deletion).\n"
msgstr ""
"Datos no válidos en la base de datos. Intentando arreglar (por borrado).\n"
# to should be too, i think
-#: src/datastore/plugin_datastore_sqlite.c:1156
+#: src/datastore/plugin_datastore_sqlite.c:1177
msgid "sqlite version to old to determine size, assuming zero\n"
msgstr ""
"la versión de sqlite es muy antigua para determinar el tamaño, se asume "
"cero\n"
-#: src/datastore/plugin_datastore_sqlite.c:1176
+#: src/datastore/plugin_datastore_sqlite.c:1197
#, c-format
msgid ""
"Using sqlite page utilization to estimate payload (%llu pages of size %llu "
@@ -1969,13 +1985,13 @@
"Usando la utilización de páginas de sqlite para estimar el «payload» (%llu "
"páginas de %llu bytes de tamaño)\n"
-#: src/datastore/plugin_datastore_sqlite.c:1216
+#: src/datastore/plugin_datastore_sqlite.c:1237
#: src/namecache/plugin_namecache_sqlite.c:580
#: src/namestore/plugin_namestore_sqlite.c:716
msgid "Sqlite database running\n"
msgstr "Base de datos sqlite ejecutándose\n"
-#: src/datastore/plugin_datastore_template.c:259
+#: src/datastore/plugin_datastore_template.c:260
msgid "Template database running\n"
msgstr "Base de datos de plantilla ejecutándose\n"
@@ -2600,52 +2616,52 @@
msgid "Change DNS replies to point elsewhere."
msgstr "Cambiar las respuestas DNS apuntando a cualquier otro lado."
-#: src/dns/gnunet-service-dns.c:456
+#: src/dns/gnunet-service-dns.c:459
msgid "# DNS requests answered via TUN interface"
msgstr "# Peticiones DNS contestadas vía interfaz TUN"
-#: src/dns/gnunet-service-dns.c:603
+#: src/dns/gnunet-service-dns.c:606
msgid "# DNS exit failed (failed to open socket)"
msgstr "# Salidas DNS fallidas (se produjo un fallo al abrir el «socket»)"
-#: src/dns/gnunet-service-dns.c:714
+#: src/dns/gnunet-service-dns.c:717
msgid "# External DNS response discarded (no matching request)"
msgstr "# Respuestas DNS externas descartadas (ninguna petición coincidente)"
-#: src/dns/gnunet-service-dns.c:792
+#: src/dns/gnunet-service-dns.c:795
msgid "# Client response discarded (no matching request)"
msgstr "# Respuestas de cliente descartadas (ninguna petición coincidente)"
-#: src/dns/gnunet-service-dns.c:907
+#: src/dns/gnunet-service-dns.c:910
msgid "Received malformed IPv4-UDP packet on TUN interface.\n"
msgstr "Recibido paquete UDP IPv4 mal formado en interfaz TUN.\n"
-#: src/dns/gnunet-service-dns.c:923
+#: src/dns/gnunet-service-dns.c:926
msgid "Received malformed IPv6-UDP packet on TUN interface.\n"
msgstr "Recibido paquete UDP IPv6 mal formado en interfaz TUN.\n"
-#: src/dns/gnunet-service-dns.c:932
+#: src/dns/gnunet-service-dns.c:935
#, c-format
msgid "Got non-IP packet with %u bytes and protocol %u from TUN\n"
msgstr "Se obtuvo un paquete no-IP con %u bytes y protocolo %u de TUN\n"
-#: src/dns/gnunet-service-dns.c:942
+#: src/dns/gnunet-service-dns.c:945
msgid "# Non-DNS UDP packet received via TUN interface"
msgstr "# Paquetes UDP no-DNS recibidos vía interfaz TUN"
-#: src/dns/gnunet-service-dns.c:1009
+#: src/dns/gnunet-service-dns.c:1012
msgid "# DNS requests received via TUN interface"
msgstr "# Peticiones DNS recibidas vía interfaz TUN"
-#: src/dns/gnunet-service-dns.c:1049
-#, c-format
-msgid "`%s' must be installed SUID, refusing to run\n"
-msgstr "«%s» debe ser instalado con SUID, se niega a arrancar\n"
-
-#: src/dns/gnunet-service-dns.c:1069 src/exit/gnunet-daemon-exit.c:3594
+#: src/dns/gnunet-service-dns.c:1064 src/exit/gnunet-daemon-exit.c:3594
msgid "need a valid IPv4 or IPv6 address\n"
msgstr "se necesita una dirección IPv4 o IPv6 válida\n"
+#: src/dns/gnunet-service-dns.c:1082
+#, fuzzy, c-format
+msgid "`%s' must be installed SUID, will not run DNS interceptor\n"
+msgstr "«%s» debe ser instalado con SUID, se niega a arrancar\n"
+
#: src/dv/gnunet-dv.c:169
msgid "verbose output"
msgstr ""
@@ -2888,52 +2904,52 @@
msgid "Daemon to run to provide an IP exit node for the VPN"
msgstr "Demonio a ejecutar para obtener un nodo de salida IP para la VPN"
-#: src/fragmentation/defragmentation.c:271
+#: src/fragmentation/defragmentation.c:277
msgid "# acknowledgements sent for fragment"
msgstr "# reconocimientos enviados por framentos"
-#: src/fragmentation/defragmentation.c:463
+#: src/fragmentation/defragmentation.c:470
#: src/transport/plugin_transport_wlan.c:1515
msgid "# fragments received"
msgstr "# fragmentos recibidos"
-#: src/fragmentation/defragmentation.c:533
+#: src/fragmentation/defragmentation.c:540
msgid "# duplicate fragments received"
msgstr "# fragmentos duplicados recibidos"
-#: src/fragmentation/defragmentation.c:549
+#: src/fragmentation/defragmentation.c:558
msgid "# messages defragmented"
msgstr "# mensajes defragmentados"
-#: src/fragmentation/fragmentation.c:234
+#: src/fragmentation/fragmentation.c:235
msgid "# fragments transmitted"
msgstr "# fragmentos transmitidos"
-#: src/fragmentation/fragmentation.c:237
+#: src/fragmentation/fragmentation.c:240
msgid "# fragments retransmitted"
msgstr "# fragmentos retransmitidos"
-#: src/fragmentation/fragmentation.c:263
+#: src/fragmentation/fragmentation.c:269
msgid "# fragments wrap arounds"
msgstr "# encajes de fragmentos"
-#: src/fragmentation/fragmentation.c:307
+#: src/fragmentation/fragmentation.c:315
msgid "# messages fragmented"
msgstr "# mensajes fragmentados"
-#: src/fragmentation/fragmentation.c:310
+#: src/fragmentation/fragmentation.c:321
msgid "# total size of fragmented messages"
msgstr "# tamaño total de los mensajes fragmentados"
-#: src/fragmentation/fragmentation.c:431
+#: src/fragmentation/fragmentation.c:444
msgid "# fragment acknowledgements received"
msgstr "# reconocimientos de fragmentos recibidos"
-#: src/fragmentation/fragmentation.c:437
+#: src/fragmentation/fragmentation.c:451
msgid "# bits removed from fragmentation ACKs"
msgstr "# bits eliminados de reconocimientos de fragmentos"
-#: src/fragmentation/fragmentation.c:461
+#: src/fragmentation/fragmentation.c:475
msgid "# fragmentation transmissions completed"
msgstr "# transmisiones de fragmentos completadas"
@@ -3225,56 +3241,56 @@
msgstr ""
"Se obtuvo un resultado con un tipo desconocido de bloque «%d», ignorándolo"
-#: src/fs/fs_unindex.c:59
+#: src/fs/fs_unindex.c:63
msgid "Failed to find given position in file"
msgstr "Se produjo un fallo al buscar la posición dada en el fichero"
-#: src/fs/fs_unindex.c:64
+#: src/fs/fs_unindex.c:68
msgid "Failed to read file"
msgstr "No se pudo leer el fichero"
-#: src/fs/fs_unindex.c:234
+#: src/fs/fs_unindex.c:245
msgid "Unexpected time for a response from `fs' service."
msgstr "Tiempo inesperado para una respuesta del servicio «fs»."
-#: src/fs/fs_unindex.c:242
+#: src/fs/fs_unindex.c:253
msgid "Timeout waiting for `fs' service."
msgstr "Esperando al servicio «fs»."
-#: src/fs/fs_unindex.c:250
+#: src/fs/fs_unindex.c:261
msgid "Invalid response from `fs' service."
msgstr "Respuesta no válida del servicio «fs»."
-#: src/fs/fs_unindex.c:291
+#: src/fs/fs_unindex.c:304
msgid "Failed to connect to FS service for unindexing."
msgstr ""
"Se produjo un fallo al conectar con el servicio «FS» para el desindexado."
-#: src/fs/fs_unindex.c:347 src/fs/fs_unindex.c:359
+#: src/fs/fs_unindex.c:360 src/fs/fs_unindex.c:372
msgid "Failed to get KSKs from directory scan."
msgstr "Se produjo un fallo al obtener KSKs de la búsqueda de directorios."
-#: src/fs/fs_unindex.c:355
+#: src/fs/fs_unindex.c:368
#, c-format
msgid "Internal error scanning `%s'.\n"
msgstr "Error interno escaneando «%s».\n"
-#: src/fs/fs_unindex.c:414
+#: src/fs/fs_unindex.c:427
#, fuzzy, c-format
msgid "Failed to remove UBlock: %s\n"
msgstr "Se produjo un fallo al eliminar el KBlock: %s\n"
-#: src/fs/fs_unindex.c:562 src/fs/fs_unindex.c:626
+#: src/fs/fs_unindex.c:590 src/fs/fs_unindex.c:656
msgid "Failed to connect to `datastore' service."
msgstr ""
"Se produjo un fallo al conectar con el servicio de almacenamiento de datos "
"(datastore)."
-#: src/fs/fs_unindex.c:639
+#: src/fs/fs_unindex.c:669
msgid "Failed to open file for unindexing."
msgstr "Se produjo un fallo al abrir el fichero para desindexado."
-#: src/fs/fs_unindex.c:673
+#: src/fs/fs_unindex.c:708
msgid "Failed to compute hash of file."
msgstr "Se produjo un fallo al calcular el hash del fichero."
@@ -3890,89 +3906,89 @@
msgid "# cadet connections active"
msgstr "# conexiones «stream» activas"
-#: src/fs/gnunet-service-fs_cp.c:726
+#: src/fs/gnunet-service-fs_cp.c:735
msgid "# migration stop messages received"
msgstr "# mensajes de detención de migración recibidos"
-#: src/fs/gnunet-service-fs_cp.c:730
+#: src/fs/gnunet-service-fs_cp.c:739
#, c-format
msgid "Migration of content to peer `%s' blocked for %s\n"
msgstr "Migración de contenido al par «%s» bloqueada durante %s\n"
-#: src/fs/gnunet-service-fs_cp.c:768
+#: src/fs/gnunet-service-fs_cp.c:776
msgid "# replies transmitted to other peers"
msgstr "# respuestas transmitidas a otros pares"
-#: src/fs/gnunet-service-fs_cp.c:774
+#: src/fs/gnunet-service-fs_cp.c:784
msgid "# replies dropped"
msgstr "# respuestas omitidas"
-#: src/fs/gnunet-service-fs_cp.c:799 src/fs/gnunet-service-fs_cp.c:1384
+#: src/fs/gnunet-service-fs_cp.c:810 src/fs/gnunet-service-fs_cp.c:1404
msgid "# P2P searches active"
msgstr "# busquedas P2P activas"
-#: src/fs/gnunet-service-fs_cp.c:904
+#: src/fs/gnunet-service-fs_cp.c:915
msgid "# artificial delays introduced (ms)"
msgstr "# retardos artificiales introducidos (ms)"
-#: src/fs/gnunet-service-fs_cp.c:960
+#: src/fs/gnunet-service-fs_cp.c:971
msgid "# replies dropped due to type mismatch"
msgstr "# respuestas omitidas debido a incompatibilidad de tipos"
-#: src/fs/gnunet-service-fs_cp.c:968
+#: src/fs/gnunet-service-fs_cp.c:979
msgid "# replies received for other peers"
msgstr "# respuestas recibidas de otros pares"
-#: src/fs/gnunet-service-fs_cp.c:982
+#: src/fs/gnunet-service-fs_cp.c:993
msgid "# replies dropped due to insufficient cover traffic"
msgstr "# respuestas omitidas debido a insuficiente tráfico de cobertura"
-#: src/fs/gnunet-service-fs_cp.c:1030
+#: src/fs/gnunet-service-fs_cp.c:1041
msgid "# P2P searches destroyed due to ultimate reply"
msgstr "# búsquedas P2P destruidas debido a respuesta definitiva"
-#: src/fs/gnunet-service-fs_cp.c:1098
+#: src/fs/gnunet-service-fs_cp.c:1109
msgid "# requests done for free (low load)"
msgstr "# peticiones realizadas gratuitamente (baja carga)"
-#: src/fs/gnunet-service-fs_cp.c:1123
+#: src/fs/gnunet-service-fs_cp.c:1134
msgid "# request dropped, priority insufficient"
msgstr "# peticiones omitidas, prioridad insuficiente"
-#: src/fs/gnunet-service-fs_cp.c:1133
+#: src/fs/gnunet-service-fs_cp.c:1144
msgid "# requests done for a price (normal load)"
msgstr "# peticiones realizadas por un precio (carga normal)"
-#: src/fs/gnunet-service-fs_cp.c:1210
+#: src/fs/gnunet-service-fs_cp.c:1221
msgid "# GET requests received (from other peers)"
msgstr "# peticiones «GET» recibidas (de otros pares)"
-#: src/fs/gnunet-service-fs_cp.c:1245
+#: src/fs/gnunet-service-fs_cp.c:1256
msgid "# requests dropped due to initiator not being connected"
msgstr "# peticiones omitidas debido a que el iniciador no está conectado"
-#: src/fs/gnunet-service-fs_cp.c:1266
+#: src/fs/gnunet-service-fs_cp.c:1277
msgid "# requests dropped due to missing reverse route"
msgstr "# peticiones omitidas debido a falta de ruta inversa"
-#: src/fs/gnunet-service-fs_cp.c:1277
+#: src/fs/gnunet-service-fs_cp.c:1288
#, fuzzy
msgid "# requests dropped due to full reply queue"
msgstr "# Mensajes P2P omitidos debido a saturación de la cola"
-#: src/fs/gnunet-service-fs_cp.c:1329
+#: src/fs/gnunet-service-fs_cp.c:1340
msgid "# requests dropped due TTL underflow"
msgstr "# peticiones omitidas debido a expiración del TTL"
-#: src/fs/gnunet-service-fs_cp.c:1353
+#: src/fs/gnunet-service-fs_cp.c:1365
msgid "# requests dropped due to higher-TTL request"
msgstr "# peticiones omitidas debido a una petición de mayor TTL"
-#: src/fs/gnunet-service-fs_cp.c:1382
+#: src/fs/gnunet-service-fs_cp.c:1402
msgid "# P2P query messages received and processed"
msgstr "# mensajes de búsqueda P2P recibidos y procesados"
-#: src/fs/gnunet-service-fs_cp.c:1821
+#: src/fs/gnunet-service-fs_cp.c:1841
msgid "# migration stop messages sent"
msgstr "# mensajes de detención de migración enviados"
@@ -4313,7 +4329,7 @@
msgid "GNUnet DNS-to-GNS proxy (a DNS server)"
msgstr "Pasarela GNUnet DNS-a-GNS (un servidor DNS)"
-#: src/gns/gnunet-gns.c:215
+#: src/gns/gnunet-gns.c:215 src/gns/plugin_rest_gns.c:334
#, c-format
msgid "Invalid typename specified, assuming `ANY'\n"
msgstr ""
@@ -4329,6 +4345,7 @@
msgstr ""
#: src/gns/gnunet-gns.c:353 src/gns/gnunet-gns-helper-service-w32.c:798
+#: src/gns/plugin_rest_gns.c:459
#, c-format
msgid ""
"Ego for `gns-master' not found, cannot perform lookup. Did you run gnunet-"
@@ -4469,7 +4486,7 @@
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:2225
+#: src/gns/gnunet-gns-proxy.c:2225 src/rest/gnunet-rest-server.c:529
#, fuzzy
msgid "Failed to pass client to MHD\n"
msgstr "Se produjo un fallo al conectar con GNS\n"
@@ -4573,21 +4590,21 @@
msgid "GNS lookup resulted in DNS name that is too long (`%s')\n"
msgstr ""
-#: src/gns/gnunet-service-gns_resolver.c:1886
+#: src/gns/gnunet-service-gns_resolver.c:1891
msgid "GNS lookup recursion failed (no delegation record found)\n"
msgstr ""
-#: src/gns/gnunet-service-gns_resolver.c:1910
+#: src/gns/gnunet-service-gns_resolver.c:1915
#, fuzzy, c-format
msgid "Failed to cache GNS resolution: %s\n"
msgstr "Se produjo un fallo al mandar la petición DNS a %s\n"
-#: src/gns/gnunet-service-gns_resolver.c:2192
+#: src/gns/gnunet-service-gns_resolver.c:2197
#, c-format
msgid "Zone %s was revoked, resolution fails\n"
msgstr ""
-#: src/gns/gnunet-service-gns_resolver.c:2341
+#: src/gns/gnunet-service-gns_resolver.c:2346
#, c-format
msgid "Hostname `%s' is not well-formed, resolution fails\n"
msgstr ""
@@ -4619,6 +4636,15 @@
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:422
+msgid "Ego for not found, cannot perform lookup.\n"
+msgstr ""
+
+#: src/gns/plugin_rest_gns.c:652
+#, fuzzy
+msgid "GNS REST API initialized\n"
+msgstr "Conexión fallida\n"
+
#: src/gnsrecord/plugin_gnsrecord_dns.c:291
#, c-format
msgid "Unable to parse IPv4 address `%s'\n"
@@ -5181,6 +5207,11 @@
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:803
+#, fuzzy
+msgid "Identity REST API initialized\n"
+msgstr "Conexión fallida\n"
+
#: src/mysql/mysql.c:174
#, c-format
msgid "Trying to use file `%s' for MySQL configuration.\n"
@@ -5206,9 +5237,9 @@
msgid "You must specify which zone should be accessed\n"
msgstr "Se debe especificar un apodo\n"
-#: src/namecache/gnunet-namecache.c:195 src/namestore/gnunet-namestore.c:844
+#: src/namecache/gnunet-namecache.c:195
#, fuzzy, c-format
-msgid "Invalid public key for reverse lookup `%s'\n"
+msgid "Invalid public key for zone `%s'\n"
msgstr "Parámetro no válido «%s»\n"
#: src/namecache/gnunet-namecache.c:203
@@ -5245,11 +5276,13 @@
msgstr "No se pudo añadir el registro: %s\n"
#: src/namestore/gnunet-namestore.c:332
+#: src/namestore/plugin_rest_namestore.c:505
#, fuzzy, c-format
msgid "Deleting record failed, record does not exist%s%s\n"
msgstr "No se pudo borrar el registro: %s\n"
#: src/namestore/gnunet-namestore.c:339
+#: src/namestore/plugin_rest_namestore.c:514
#, fuzzy, c-format
msgid "Deleting record failed%s%s\n"
msgstr "No se pudo borrar el registro: %s\n"
@@ -5267,6 +5300,7 @@
msgstr ""
#: src/namestore/gnunet-namestore.c:628
+#: src/namestore/plugin_rest_namestore.c:538
#, c-format
msgid "There are no records under label `%s' that could be deleted.\n"
msgstr ""
@@ -5284,6 +5318,7 @@
#: src/namestore/gnunet-namestore.c:719
#: src/namestore/gnunet-namestore-fcfsd.c:984
+#: src/namestore/plugin_rest_namestore.c:821
msgid "Failed to connect to namestore\n"
msgstr "Se produjo un fallo al conectar con el almacén de nombres\n"
@@ -5300,11 +5335,14 @@
msgstr "añadir"
#: src/namestore/gnunet-namestore.c:745
+#: src/namestore/plugin_rest_namestore.c:608
#, c-format
msgid "Unsupported type `%s'\n"
msgstr "Tipo no soportado «%s»\n"
#: src/namestore/gnunet-namestore.c:765
+#: src/namestore/plugin_rest_namestore.c:626
+#: src/namestore/plugin_rest_namestore.c:666
#, c-format
msgid "Value `%s' invalid for record type `%s'\n"
msgstr "Valor «%s» no válido para el tipo de registro «%s»\n"
@@ -5318,6 +5356,11 @@
msgid "del"
msgstr "borrar"
+#: src/namestore/gnunet-namestore.c:844
+#, fuzzy, c-format
+msgid "Invalid public key for reverse lookup `%s'\n"
+msgstr "Parámetro no válido «%s»\n"
+
#: src/namestore/gnunet-namestore.c:868
#: src/peerinfo-tool/gnunet-peerinfo.c:817
#, c-format
@@ -5330,21 +5373,25 @@
msgstr "URI no válida: «%s»\n"
#: src/namestore/gnunet-namestore.c:943
+#: src/namestore/plugin_rest_namestore.c:851
#, fuzzy, c-format
msgid "Ego `%s' not known to identity service\n"
msgstr "'%s': servicio desconocido: %s\n"
#: src/namestore/gnunet-namestore.c:970
+#: src/namestore/plugin_rest_namestore.c:878
#, fuzzy, c-format
msgid "No default ego configured in identity service\n"
msgstr "'%s': servicio desconocido: %s\n"
#: src/namestore/gnunet-namestore.c:1006
+#: src/namestore/plugin_rest_namestore.c:917
#, fuzzy, c-format
msgid "Identity service is not running\n"
msgstr "El servicio «%s» no está ejecutandose\n"
#: src/namestore/gnunet-namestore.c:1018
+#: src/namestore/plugin_rest_namestore.c:946
#, fuzzy, c-format
msgid "Cannot connect to identity service\n"
msgstr "¡No se pudo conectar al servicio %s!\n"
@@ -5481,6 +5528,11 @@
msgid "Namestore failed to store record\n"
msgstr "El almacén de nombres no pudo añadir el registro\n"
+#: src/namestore/plugin_rest_namestore.c:1023
+#, fuzzy
+msgid "Namestore REST API initialized\n"
+msgstr "Conexión fallida\n"
+
#: src/nat/gnunet-nat-server.c:279
#, c-format
msgid "Please pass valid port number as the first argument! (got `%s')\n"
@@ -5742,7 +5794,7 @@
msgstr "Medir la calidad y rendimiento del servicio NSE."
#: src/nse/gnunet-service-nse.c:1537
-#: src/revocation/gnunet-service-revocation.c:815 src/util/gnunet-scrypt.c:260
+#: src/revocation/gnunet-service-revocation.c:827 src/util/gnunet-scrypt.c:260
msgid "Value is too large.\n"
msgstr ""
@@ -6294,6 +6346,16 @@
msgid "Regex `%s' is too long!\n"
msgstr "El servicio «%s» no está ejecutandose\n"
+#: src/rest/gnunet-rest-server.c:766
+#, fuzzy
+msgid "listen on specified port (default: 7776)"
+msgstr "escuchar en el puerto especificado (predeterminado: 7777)"
+
+#: src/rest/gnunet-rest-server.c:783
+#, fuzzy
+msgid "GNUnet REST server"
+msgstr "Herramienta de acceso GNUnet GNS"
+
#: src/revocation/gnunet-revocation.c:126
#, fuzzy, c-format
msgid "Key `%s' is valid\n"
@@ -6426,11 +6488,11 @@
msgstr "# transmisiones de fragmentos completadas"
#: src/revocation/gnunet-service-revocation.c:493
-#: src/revocation/gnunet-service-revocation.c:747
+#: src/revocation/gnunet-service-revocation.c:759
msgid "SET service crashed, terminating revocation service\n"
msgstr ""
-#: src/revocation/gnunet-service-revocation.c:839
+#: src/revocation/gnunet-service-revocation.c:851
#, fuzzy
msgid "Could not open revocation database file!"
msgstr "No se pudo conectar con el almacén de datos."
@@ -8231,7 +8293,7 @@
msgstr "Encontradas %u direcciones para comunicar al servicio NAT\n"
#: src/transport/plugin_transport_http_server.c:2825
-#: src/transport/plugin_transport_udp.c:3336
+#: src/transport/plugin_transport_udp.c:3335
msgid "Disabling IPv6 since it is not supported on this system!\n"
msgstr "¡Deshabilitando IPv6 ya que no está soportado en este sistema!\n"
@@ -8466,7 +8528,7 @@
"Se produjo un fallo al establecer la opción de «broadcast» IPv4 para el "
"«socket» en el puerto %d\n"
-#: src/transport/plugin_transport_udp.c:3082
+#: src/transport/plugin_transport_udp.c:3081
#, c-format
msgid ""
"UDP could not transmit message to `%s': Network seems down, please check "
@@ -8475,7 +8537,7 @@
"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_udp.c:3096
+#: src/transport/plugin_transport_udp.c:3095
#, fuzzy
msgid ""
"UDP could not transmit IPv6 message! Please check your network configuration "
@@ -8485,37 +8547,37 @@
"configuración de red y deshabilite IPv6 si su conexión carece de una "
"dirección IPv6 global\n"
-#: src/transport/plugin_transport_udp.c:3412
-#: src/transport/plugin_transport_udp.c:3511
+#: src/transport/plugin_transport_udp.c:3411
+#: src/transport/plugin_transport_udp.c:3510
#, fuzzy, c-format
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:3430
+#: src/transport/plugin_transport_udp.c:3429
#, 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"
-#: src/transport/plugin_transport_udp.c:3521
+#: src/transport/plugin_transport_udp.c:3520
msgid "Failed to open UDP sockets\n"
msgstr "Se produjo un fallo al abrir los «sockets» UDP\n"
-#: src/transport/plugin_transport_udp.c:3592
-#: src/transport/plugin_transport_udp.c:3606
+#: src/transport/plugin_transport_udp.c:3591
+#: src/transport/plugin_transport_udp.c:3605
msgid "must be in [0,65535]"
msgstr ""
-#: src/transport/plugin_transport_udp.c:3638
+#: src/transport/plugin_transport_udp.c:3637
#, fuzzy
msgid "must be valid IPv4 address"
msgstr "«%s» no es una dirección IP válida.\n"
-#: src/transport/plugin_transport_udp.c:3665
+#: src/transport/plugin_transport_udp.c:3664
#, fuzzy
msgid "must be valid IPv6 address"
msgstr "«%s» no es una dirección IP válida.\n"
-#: src/transport/plugin_transport_udp.c:3731
+#: src/transport/plugin_transport_udp.c:3730
#, fuzzy
msgid "Failed to create UDP network sockets\n"
msgstr "Se produjo un fallo al crear una nueva firma"
@@ -8745,7 +8807,7 @@
msgid "Syntax error while deserializing in line %u\n"
msgstr "Error de sintaxis en la línea %u mientras se deserializaba\n"
-#: src/util/configuration.c:1026
+#: src/util/configuration.c:1025
#, c-format
msgid ""
"Configuration value '%s' for '%s' in section '%s' is not in set of legal "
@@ -8754,17 +8816,17 @@
"El valor de configuración «%s» para «%s» de la sección «%s» no está dentro "
"de las opciones legales\n"
-#: src/util/configuration.c:1145
+#: src/util/configuration.c:1144
#, c-format
msgid "Recursive expansion suspected, aborting $-expansion for term `%s'\n"
msgstr ""
-#: src/util/configuration.c:1177
+#: src/util/configuration.c:1176
#, fuzzy, c-format
msgid "Missing closing `%s' in option `%s'\n"
msgstr "Falta la opción «%s» para la operación «%s»\n"
-#: src/util/configuration.c:1251
+#: src/util/configuration.c:1250
#, c-format
msgid ""
"Failed to expand `%s' in `%s' as it is neither found in [PATHS] nor defined "
@@ -8790,23 +8852,23 @@
"El tamaño del fichero en disco es incorrecto para este «Bloom "
"filter» (esperado %llu, tiene %llu)\n"
-#: src/util/crypto_ecc.c:731 src/util/crypto_ecc.c:769
-#: src/util/crypto_ecc.c:887 src/util/crypto_ecc.c:925
+#: src/util/crypto_ecc.c:733 src/util/crypto_ecc.c:771
+#: src/util/crypto_ecc.c:889 src/util/crypto_ecc.c:927
#, c-format
msgid "Could not acquire lock on file `%s': %s...\n"
msgstr "No se pudo bloquear el fichero «%s»: %s...\n"
-#: src/util/crypto_ecc.c:736 src/util/crypto_ecc.c:892
+#: src/util/crypto_ecc.c:738 src/util/crypto_ecc.c:894
msgid "Creating a new private key. This may take a while.\n"
msgstr "Generando una clave privada nueva. Esto puede tomar un tiempo.\n"
-#: src/util/crypto_ecc.c:773 src/util/crypto_ecc.c:929
+#: src/util/crypto_ecc.c:775 src/util/crypto_ecc.c:931
msgid "This may be ok if someone is currently generating a private key.\n"
msgstr ""
"Esto puede estar bien si alguien está actualmente generando una clave "
"privada.\n"
-#: src/util/crypto_ecc.c:803 src/util/crypto_ecc.c:959
+#: src/util/crypto_ecc.c:805 src/util/crypto_ecc.c:961
#, c-format
msgid ""
"When trying to read key file `%s' I found %u bytes but I need at least %u.\n"
@@ -8814,33 +8876,33 @@
"Cuando se intentaba leer el fichero de claves «%s» se encontraron %u bytes "
"pero al menos %u son necesarios.\n"
-#: src/util/crypto_ecc.c:807 src/util/crypto_ecc.c:963
+#: src/util/crypto_ecc.c:809 src/util/crypto_ecc.c:965
msgid "This may be ok if someone is currently generating a key.\n"
msgstr ""
"Esto puede ser correcto si alguien está actualmente generando una clave de "
"máquina.\n"
-#: src/util/crypto_ecc.c:1045
+#: src/util/crypto_ecc.c:1047
#, fuzzy
msgid "Could not load peer's private key\n"
msgstr "No se pudo acceder a la clave de máquina.\n"
-#: src/util/crypto_ecc.c:1149
+#: src/util/crypto_ecc.c:1151
#, c-format
msgid "ECC signing failed at %s:%d: %s\n"
msgstr "El firmado ECC falló en %s:%d: %s\n"
-#: src/util/crypto_ecc.c:1199
+#: src/util/crypto_ecc.c:1201
#, fuzzy, c-format
msgid "EdDSA signing failed at %s:%d: %s\n"
msgstr "El firmado ECC falló en %s:%d: %s\n"
-#: src/util/crypto_ecc.c:1273
+#: src/util/crypto_ecc.c:1275
#, fuzzy, c-format
msgid "ECDSA signature verification failed at %s:%d: %s\n"
msgstr "La verificación de la firma RSA fallo en %s:%d: %s\n"
-#: src/util/crypto_ecc.c:1330
+#: src/util/crypto_ecc.c:1332
#, fuzzy, c-format
msgid "EdDSA signature verification failed at %s:%d: %s\n"
msgstr "La verificación de la firma RSA fallo en %s:%d: %s\n"
@@ -8850,17 +8912,17 @@
msgid "libgcrypt has not the expected version (version %s is required).\n"
msgstr "libgcrypt no tiene la versión esperada (se necesita la versión %s).\n"
-#: src/util/crypto_rsa.c:809
+#: src/util/crypto_rsa.c:825
#, c-format
msgid "RSA signature verification failed at %s:%d: %s\n"
msgstr "La verificación de la firma RSA fallo en %s:%d: %s\n"
-#: src/util/disk.c:1218
+#: src/util/disk.c:1222
#, c-format
msgid "Expected `%s' to be a directory!\n"
msgstr "¡Se esperaba que «%s» fuera un directorio!\n"
-#: src/util/disk.c:1580 src/util/service.c:1328
+#: src/util/disk.c:1584 src/util/service.c:1328
#, c-format
msgid "Cannot obtain information about user `%s': %s\n"
msgstr "No se pudo obtener información acerca del usuario «%s»: %s\n"
@@ -8925,7 +8987,7 @@
msgid "Use %s to get a list of options.\n"
msgstr "Use %s para obtener una lista de opciones.\n"
-#: src/util/getopt_helpers.c:84
+#: src/util/getopt_helpers.c:90
#, c-format
msgid ""
"Arguments mandatory for long options are also mandatory for short options.\n"
@@ -8933,12 +8995,12 @@
"Los parámetros obligatorios para las opciones largas también lo son para sus "
"versiones cortas.\n"
-#: src/util/getopt_helpers.c:268 src/util/getopt_helpers.c:326
+#: src/util/getopt_helpers.c:274 src/util/getopt_helpers.c:332
#, c-format
msgid "You must pass a number to the `%s' option.\n"
msgstr "Tienes que introducir un número en la opción «%s».\n"
-#: src/util/getopt_helpers.c:298
+#: src/util/getopt_helpers.c:304
#, c-format
msgid "You must pass relative time to the `%s' option.\n"
msgstr "Debes introducir un tiempo relativo en la opción «%s».\n"
@@ -9188,22 +9250,22 @@
msgid "GetExitCodeProcess failed for binary %s (%d).\n"
msgstr ""
-#: src/util/plugin.c:87
+#: src/util/plugin.c:86
#, c-format
msgid "Initialization of plugin mechanism failed: %s!\n"
msgstr "¡La inicialización del mecanismo de módulos falló: %s!\n"
-#: src/util/plugin.c:148
+#: src/util/plugin.c:151
#, c-format
msgid "`%s' failed to resolve method '%s' with error: %s\n"
msgstr "«%s» falló al resolver el método «%s» con error: %s\n"
-#: src/util/plugin.c:223
+#: src/util/plugin.c:226
#, c-format
msgid "`%s' failed for library `%s' with error: %s\n"
msgstr "Falló «%s» para la biblioteca «%s» con error: %s\n"
-#: src/util/plugin.c:382
+#: src/util/plugin.c:385
msgid "Could not determine plugin installation path.\n"
msgstr "No se pudo determinar la ruta de instalación de los módulos.\n"
@@ -9695,6 +9757,9 @@
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"
+#~ msgid "`%s' must be installed SUID, refusing to run\n"
+#~ msgstr "«%s» debe ser instalado con SUID, se niega a arrancar\n"
+
# Miguel: "Outbound" lo he traducido como salida en todo el texto.
#~ msgid "Outbound quota configure for network `%s' is %llu\n"
#~ msgstr "La cuota de salida configurada para la red «%s» es %llu\n"
@@ -9935,10 +10000,6 @@
#~ msgstr "Desconectado de %s\n"
#, fuzzy
-#~ msgid "CADET initialized\n"
-#~ msgstr "Conexión fallida\n"
-
-#, fuzzy
#~ msgid "Reloading sensor definitions from directory `%s'\n"
#~ msgstr "Descarga los ficheros de GNUnet"
Modified: gnunet/po/fr.po
===================================================================
--- gnunet/po/fr.po 2015-04-24 07:04:18 UTC (rev 35558)
+++ gnunet/po/fr.po 2015-04-27 11:12:21 UTC (rev 35559)
@@ -7,7 +7,7 @@
msgstr ""
"Project-Id-Version: gnunet 0.10.1\n"
"Report-Msgid-Bugs-To: address@hidden"
-"POT-Creation-Date: 2014-04-08 11:11+0200\n"
+"POT-Creation-Date: 2015-04-27 13:05+0200\n"
"PO-Revision-Date: 2015-03-24 01:41+0100\n"
"Last-Translator: Stéphane Aulery <address@hidden>\n"
"Language-Team: French <address@hidden>\n"
@@ -21,7 +21,8 @@
msgstr ""
#: src/arm/arm_monitor_api.c:321
-msgid "Monitoring client was disconnected from arm service, trying to
reconnect.\n"
+msgid ""
+"Monitoring client was disconnected from arm service, trying to reconnect.\n"
msgstr ""
#: src/arm/gnunet-arm.c:164
@@ -279,173 +280,177 @@
msgid "ARM now monitors connections to service `%s' at `%s'\n"
msgstr ""
-#: src/arm/gnunet-service-arm.c:831
+#: src/arm/gnunet-service-arm.c:835
#, c-format
msgid "Preparing to stop `%s'\n"
msgstr ""
-#: src/arm/gnunet-service-arm.c:1100
+#: src/arm/gnunet-service-arm.c:1105
#, c-format
msgid "Restarting service `%s'.\n"
msgstr ""
-#: src/arm/gnunet-service-arm.c:1193
+#: src/arm/gnunet-service-arm.c:1199
msgid "exit"
msgstr "exit"
-#: src/arm/gnunet-service-arm.c:1198
+#: src/arm/gnunet-service-arm.c:1204
msgid "signal"
msgstr "signal"
-#: src/arm/gnunet-service-arm.c:1203
+#: src/arm/gnunet-service-arm.c:1209
msgid "unknown"
msgstr "inconnu"
-#: src/arm/gnunet-service-arm.c:1209
+#: src/arm/gnunet-service-arm.c:1215
#, c-format
msgid "Service `%s' took %s to terminate\n"
msgstr ""
-#: src/arm/gnunet-service-arm.c:1231
+#: src/arm/gnunet-service-arm.c:1237
#, c-format
msgid "Service `%s' terminated normally, will restart at any time\n"
msgstr ""
-#: src/arm/gnunet-service-arm.c:1246
+#: src/arm/gnunet-service-arm.c:1252
#, c-format
msgid "Service `%s' terminated with status %s/%d, will restart in %s\n"
msgstr ""
-#: src/arm/gnunet-service-arm.c:1500
-#, c-format
-msgid "Starting default services `%s'\n"
+#: src/arm/mockup-service.c:41
+msgid "Initiating shutdown as requested by client.\n"
msgstr ""
-#: src/arm/gnunet-service-arm.c:1511
+#: src/ats/gnunet-ats-solver-eval.c:2778 src/ats/gnunet-ats-solver-eval.c:2819
#, c-format
-msgid "Default service `%s' not configured correctly!\n"
+msgid ""
+"Could not load quota for network `%s': `%s', assigning default bandwidth "
+"%llu\n"
msgstr ""
-#: src/arm/gnunet-service-arm.c:1524
-msgid "No default services configured, GNUnet will not really start right
now.\n"
+#: src/ats/gnunet-ats-solver-eval.c:2796
+#, c-format
+msgid ""
+"No outbound quota configured for network `%s', assigning default bandwidth "
+"%llu\n"
msgstr ""
-#: src/arm/mockup-service.c:41
-msgid "Initiating shutdown as requested by client.\n"
-msgstr ""
-
-#: src/ats/ats_api_performance.c:468
+#: src/ats/gnunet-ats-solver-eval.c:2837
#, c-format
-msgid "Received %s message\n"
+msgid ""
+"No outbound quota configure for network `%s', assigning default bandwidth "
+"%llu\n"
msgstr ""
-#: src/ats/ats_api_performance.c:511
-#, c-format
-msgid "Received last message for %s \n"
+#: src/ats/gnunet-ats-solver-eval.c:3290
+#: src/ats-tests/gnunet-solver-eval.c:918
+msgid "solver to use"
+msgstr "solveur utilisé"
+
+#: src/ats/gnunet-ats-solver-eval.c:3293
+#: src/ats-tests/gnunet-solver-eval.c:921
+#: src/ats-tests/gnunet-solver-eval.c:924
+msgid "experiment to use"
msgstr ""
-#: src/ats/gnunet-ats-solver-eval.c:2199 src/ats/gnunet-ats-solver-eval.c:2233
-#: src/ats/gnunet-service-ats_addresses.c:1980
-#: src/ats/gnunet-service-ats_addresses.c:2024
-#, c-format
-msgid "Could not load quota for network `%s': `%s', assigning default
bandwidth %llu\n"
+#: src/ats/gnunet-ats-solver-eval.c:3296
+msgid "be verbose"
msgstr ""
-#: src/ats/gnunet-ats-solver-eval.c:2205
-#: src/ats/gnunet-service-ats_addresses.c:1987
-#, c-format
-msgid "Outbound quota configure for network `%s' is %llu\n"
+#: src/ats/gnunet-ats-solver-eval.c:3299
+msgid "print logging"
+msgstr "afficher le journal"
+
+#: src/ats/gnunet-ats-solver-eval.c:3302
+msgid "save logging to disk"
msgstr ""
-#: src/ats/gnunet-ats-solver-eval.c:2212
-#: src/ats/gnunet-service-ats_addresses.c:1995
-#, c-format
-msgid "No outbound quota configured for network `%s', assigning default
bandwidth %llu\n"
+#: src/ats/gnunet-ats-solver-eval.c:3305
+msgid "disable normalization"
msgstr ""
-#: src/ats/gnunet-ats-solver-eval.c:2239
-#: src/ats/gnunet-service-ats_addresses.c:2031
+#: src/ats/gnunet-service-ats_plugins.c:304
#, c-format
-msgid "Inbound quota configured for network `%s' is %llu\n"
+msgid ""
+"Could not load %s quota for network `%s': `%s', assigning default bandwidth "
+"%llu\n"
msgstr ""
-#: src/ats/gnunet-ats-solver-eval.c:2246
-#: src/ats/gnunet-service-ats_addresses.c:2039
+#: src/ats/gnunet-service-ats_plugins.c:314
#, c-format
-msgid "No outbound quota configure for network `%s', assigning default
bandwidth %llu\n"
+msgid "%s quota configured for network `%s' is %llu\n"
msgstr ""
-#: src/ats/gnunet-ats-solver-eval.c:2671
-#: src/ats-tests/gnunet-solver-eval.c:919
-msgid "solver to use"
-msgstr "solveur utilisé"
-
-#: src/ats/gnunet-ats-solver-eval.c:2674 src/ats/gnunet-ats-solver-eval.c:2677
-#: src/ats-tests/gnunet-solver-eval.c:922
-#: src/ats-tests/gnunet-solver-eval.c:925
-msgid "experiment to use"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:2680
-msgid "print logging"
-msgstr "afficher le journal"
-
-#: src/ats/gnunet-service-ats_addresses.c:2217
+#: src/ats/gnunet-service-ats_plugins.c:359
#, c-format
-msgid "Initializing solver `%s '`%s'\n"
+msgid ""
+"No %s-quota configured for network `%s', assigning default bandwidth %llu\n"
msgstr ""
-#: src/ats/gnunet-service-ats_addresses.c:2220
+#: src/ats/gnunet-service-ats_plugins.c:451
#, c-format
msgid "Failed to initialize solver `%s'!\n"
msgstr ""
-#: src/ats/gnunet-service-ats_addresses.c:2243
-msgid "Failed to initialize solver!\n"
-msgstr ""
-
-#: src/ats/plugin_ats_mlp.c:892
+#: src/ats/plugin_ats_mlp.c:1274
msgid "Problem size too large, cannot allocate memory!\n"
msgstr ""
-#: src/ats/plugin_ats_mlp.c:1329
+#: src/ats/plugin_ats_mlp.c:1869
#, c-format
msgid "Adding address for peer `%s' multiple times\n"
msgstr ""
-#: src/ats/plugin_ats_mlp.c:1376
+#: src/ats/plugin_ats_mlp.c:1913
#, c-format
-msgid "Updating address property `%s' for peer `%s' %p not added before\n"
+msgid "Updating address property for peer `%s' %p not added before\n"
msgstr ""
-#: src/ats/plugin_ats_mlp.c:2122
+#: src/ats/plugin_ats_mlp.c:2475
+msgid ""
+"MLP solver is not optimizing for anything, changing to feasibility check\n"
+msgstr ""
+
+#: src/ats/plugin_ats_mlp.c:2515 src/ats/plugin_ats_mlp.c:2532
+#: src/ats/plugin_ats_mlp.c:2564 src/ats/plugin_ats_mlp.c:2582
+#: src/ats/plugin_ats_mlp.c:2601 src/ats/plugin_ats_proportional.c:1140
+#: src/ats/plugin_ats_ril.c:2613 src/ats/plugin_ats_ril.c:2630
+#: src/ats/plugin_ats_ril.c:2647 src/ats/plugin_ats_ril.c:2664
+#: src/ats/plugin_ats_ril.c:2681 src/ats/plugin_ats_ril.c:2698
+#: src/ats/plugin_ats_ril.c:2715 src/ats/plugin_ats_ril.c:2732
#, c-format
-msgid "Adjusting inconsistent outbound quota configuration for network `%s',
is %llu must be at least %llu\n"
+msgid "Invalid %s configuration %f \n"
msgstr ""
-#: src/ats/plugin_ats_mlp.c:2131
+#: src/ats/plugin_ats_mlp.c:2670
#, c-format
-msgid "Adjusting inconsistent inbound quota configuration for network `%s', is
%llu must be at least %llu\n"
+msgid ""
+"Adjusting inconsistent outbound quota configuration for network `%s', is "
+"%llu must be at least %llu\n"
msgstr ""
-#: src/ats/plugin_ats_mlp.c:2142
+#: src/ats/plugin_ats_mlp.c:2679
#, c-format
-msgid "Adjusting outbound quota configuration for network `%s'from %llu to
%.0f\n"
+msgid ""
+"Adjusting inconsistent inbound quota configuration for network `%s', is %llu "
+"must be at least %llu\n"
msgstr ""
-#: src/ats/plugin_ats_mlp.c:2150
+#: src/ats/plugin_ats_mlp.c:2689
#, c-format
-msgid "Adjusting inbound quota configuration for network `%s' from %llu to
%.0f\n"
+msgid ""
+"Adjusting outbound quota configuration for network `%s'from %llu to %.0f\n"
msgstr ""
-#: src/ats/plugin_ats_mlp.c:2161
+#: src/ats/plugin_ats_mlp.c:2698
#, c-format
-msgid "Using default quota configuration for network `%s' (in/out) %llu/%llu\n"
+msgid ""
+"Adjusting inbound quota configuration for network `%s' from %llu to %.0f\n"
msgstr ""
-#: src/ats/plugin_ats_proportional.c:1511
+#: src/ats/plugin_ats_proportional.c:1163
#, c-format
-msgid "Invalid network type `%u' `%s': Disconnect!\n"
+msgid "Invalid %s configuration %f\n"
msgstr ""
#: src/ats-tests/ats-testing.c:72
@@ -481,131 +486,202 @@
msgid "Could not connect master [%u] and slave [%u]\n"
msgstr ""
-#: src/ats-tests/ats-testing.c:490 src/ats-tests/ats-testing.c:671
+#: src/ats-tests/ats-testing.c:490 src/ats-tests/ats-testing.c:634
msgid "Initialization failed, shutdown\n"
msgstr ""
-#: src/ats-tests/ats-testing-log.c:842
+#: src/ats-tests/ats-testing-log.c:834
msgid "Stop logging\n"
msgstr "Arrêter la journalisation\n"
-#: src/ats-tests/ats-testing-log.c:893
+#: src/ats-tests/ats-testing-log.c:885
#, c-format
msgid "Start logging `%s'\n"
msgstr "Démarrer la journalisation « %s »\n"
#: src/ats-tests/gnunet-ats-sim.c:86
#, c-format
-msgid "Master [%u]: sent: %u KiB in %u sec. = %u KiB/s, received: %u KiB in %u
sec. = %u KiB/s\n"
+msgid ""
+"Master [%u]: sent: %u KiB in %u sec. = %u KiB/s, received: %u KiB in %u sec. "
+"= %u KiB/s\n"
msgstr ""
-#: src/ats-tool/gnunet-ats.c:169
+#: src/ats-tool/gnunet-ats.c:289
#, c-format
msgid "%u address resolutions had a timeout\n"
msgstr ""
-#: src/ats-tool/gnunet-ats.c:171
+#: src/ats-tool/gnunet-ats.c:293
#, c-format
-msgid "ATS returned results for %u addresses\n"
+msgid "ATS returned stat_results for %u addresses\n"
msgstr ""
-#: src/ats-tool/gnunet-ats.c:232
+#: src/ats-tool/gnunet-ats.c:366
#, c-format
-msgid "Peer `%s' plugin `%s', address `%s', `%s' bw out: %u Bytes/s, bw in %u
Bytes/s, %s\n"
+msgid ""
+"Peer `%s' plugin `%s', address `%s', `%s' bw out: %u Bytes/s, bw in %u Bytes/"
+"s, %s\n"
msgstr ""
-#: src/ats-tool/gnunet-ats.c:413
+#: src/ats-tool/gnunet-ats.c:373
+msgid "active "
+msgstr ""
+
+#: src/ats-tool/gnunet-ats.c:373
+msgid "inactive "
+msgstr ""
+
+#: src/ats-tool/gnunet-ats.c:483
#, c-format
+msgid "Removed address of peer `%s' with plugin `%s'\n"
+msgstr ""
+
+#: src/ats-tool/gnunet-ats.c:676
+#, c-format
msgid "Quota for network `%11s' (in/out): %10s / %10s\n"
msgstr ""
-#: src/ats-tool/gnunet-ats.c:433 src/core/gnunet-core.c:163
-#: src/namestore/gnunet-namestore.c:550 src/transport/gnunet-transport.c:1246
+#: src/ats-tool/gnunet-ats.c:708 src/namestore/gnunet-namestore.c:700
+#: src/namestore/plugin_rest_namestore.c:812
+#: src/transport/gnunet-transport.c:1890
+#: src/transport/gnunet-transport-profiler.c:531
#, c-format
msgid "Service `%s' is not running\n"
msgstr ""
-#: src/ats-tool/gnunet-ats.c:445 src/transport/gnunet-transport.c:1255
+#: src/ats-tool/gnunet-ats.c:722 src/transport/gnunet-transport.c:1899
+#: src/transport/gnunet-transport-profiler.c:549
#, c-format
msgid "Failed to parse peer identity `%s'\n"
msgstr ""
-#: src/ats-tool/gnunet-ats.c:454
+#: src/ats-tool/gnunet-ats.c:732
#, c-format
msgid "Please select one operation : %s or %s or %s or %s or %s\n"
msgstr ""
-#: src/ats-tool/gnunet-ats.c:470 src/ats-tool/gnunet-ats.c:489
-#: src/ats-tool/gnunet-ats.c:506 src/ats-tool/gnunet-ats.c:543
-#, c-format
+#: src/ats-tool/gnunet-ats.c:754 src/ats-tool/gnunet-ats.c:780
+#: src/ats-tool/gnunet-ats.c:808 src/ats-tool/gnunet-ats.c:854
msgid "Cannot connect to ATS service, exiting...\n"
msgstr ""
-#: src/ats-tool/gnunet-ats.c:478 src/ats-tool/gnunet-ats.c:495
-#, c-format
+#: src/ats-tool/gnunet-ats.c:766 src/ats-tool/gnunet-ats.c:792
msgid "Cannot issue request to ATS service, exiting...\n"
msgstr ""
-#: src/ats-tool/gnunet-ats.c:515
-#, c-format
+#: src/ats-tool/gnunet-ats.c:820
msgid "No preference type given!\n"
msgstr ""
-#: src/ats-tool/gnunet-ats.c:520
-#, c-format
+#: src/ats-tool/gnunet-ats.c:827
msgid "No peer given!\n"
msgstr ""
-#: src/ats-tool/gnunet-ats.c:536
+#: src/ats-tool/gnunet-ats.c:845
msgid "Valid type required\n"
msgstr ""
-#: src/ats-tool/gnunet-ats.c:594
+#: src/ats-tool/gnunet-ats.c:916
msgid "get list of active addresses currently used"
msgstr ""
-#: src/ats-tool/gnunet-ats.c:596
+#: src/ats-tool/gnunet-ats.c:918
msgid "get list of all active addresses"
msgstr ""
-#: src/ats-tool/gnunet-ats.c:599
+#: src/ats-tool/gnunet-ats.c:921
msgid "do not resolve IP addresses to hostnames"
msgstr ""
-#: src/ats-tool/gnunet-ats.c:601
+#: src/ats-tool/gnunet-ats.c:923
msgid "monitor mode"
msgstr ""
-#: src/ats-tool/gnunet-ats.c:603
+#: src/ats-tool/gnunet-ats.c:925
msgid "set preference for the given peer"
msgstr ""
-#: src/ats-tool/gnunet-ats.c:605
+#: src/ats-tool/gnunet-ats.c:927
msgid "print all configured quotas"
msgstr ""
-#: src/ats-tool/gnunet-ats.c:607
+#: src/ats-tool/gnunet-ats.c:929
msgid "peer id"
msgstr ""
-#: src/ats-tool/gnunet-ats.c:610
+#: src/ats-tool/gnunet-ats.c:932
msgid "preference type to set: latency | bandwidth"
msgstr ""
-#: src/ats-tool/gnunet-ats.c:612
+#: src/ats-tool/gnunet-ats.c:934
msgid "preference value"
msgstr ""
-#: src/ats-tool/gnunet-ats.c:615
+#: src/ats-tool/gnunet-ats.c:937
msgid "verbose output (include ATS address properties)"
msgstr ""
-#: src/ats-tool/gnunet-ats.c:622
+#: src/ats-tool/gnunet-ats.c:944
msgid "Print information about ATS state"
msgstr ""
+#: src/cadet/gnunet-cadet.c:376
+#, c-format
+msgid "Invalid target `%s'\n"
+msgstr ""
+
+#: src/cadet/gnunet-cadet.c:626
+#, c-format
+msgid "Invalid peer ID `%s'\n"
+msgstr ""
+
+#: src/cadet/gnunet-cadet.c:669
+#, c-format
+msgid "Invalid tunnel owner `%s'\n"
+msgstr ""
+
+#: src/cadet/gnunet-cadet.c:735
+msgid "You must NOT give a TARGETwhen using 'request all' options\n"
+msgstr ""
+
+#: src/cadet/gnunet-cadet.c:832
+msgid "provide information about a particular connection"
+msgstr ""
+
+#: src/cadet/gnunet-cadet.c:835
+msgid "activate echo mode"
+msgstr ""
+
+#: src/cadet/gnunet-cadet.c:838
+msgid "dump debug information to STDERR"
+msgstr ""
+
+#: src/cadet/gnunet-cadet.c:844
+msgid "port to listen to (default; 0)"
+msgstr ""
+
+#: src/cadet/gnunet-cadet.c:847
+msgid "provide information about a patricular peer"
+msgstr ""
+
+#: src/cadet/gnunet-cadet.c:850
+msgid "provide information about all peers"
+msgstr ""
+
+#: src/cadet/gnunet-cadet.c:853
+msgid "provide information about a particular tunnel"
+msgstr ""
+
+#: src/cadet/gnunet-cadet.c:856
+msgid "provide information about all tunnels"
+msgstr ""
+
+#: src/cadet/gnunet-service-cadet_peer.c:507
+msgid "Wrong CORE service\n"
+msgstr ""
+
#: src/consensus/gnunet-consensus-profiler.c:437
-#: src/secretsharing/gnunet-secretsharing-profiler.c:535
+#: src/secretsharing/gnunet-secretsharing-profiler.c:610
msgid "number of peers in consensus"
msgstr ""
@@ -614,8 +690,8 @@
msgstr ""
#: src/consensus/gnunet-consensus-profiler.c:443
-#: src/set/gnunet-set-profiler.c:286 src/set/gnunet-set-profiler.c:289
-#: src/set/gnunet-set-profiler.c:292
+#: src/set/gnunet-set-profiler.c:289 src/set/gnunet-set-profiler.c:292
+#: src/set/gnunet-set-profiler.c:295
msgid "number of values"
msgstr "nombre de valeurs"
@@ -628,260 +704,271 @@
msgstr ""
#: src/consensus/gnunet-consensus-profiler.c:452
-#: src/secretsharing/gnunet-secretsharing-profiler.c:550
+#: src/secretsharing/gnunet-secretsharing-profiler.c:625
msgid "be more verbose (print received values)"
msgstr ""
-#: src/conversation/conversation_api.c:557
-#: src/conversation/conversation_api_call.c:470
+#: src/conversation/conversation_api.c:493
+#: src/conversation/conversation_api_call.c:475
msgid "Connection to conversation service lost, trying to reconnect\n"
msgstr ""
-#: src/conversation/gnunet-conversation.c:264
+#: src/conversation/conversation_api.c:617
+#, fuzzy
+msgid "number too large"
+msgstr "nombre de valeurs"
+
+#: src/conversation/gnunet-conversation.c:269
#, c-format
-msgid "Incoming call from `%s'. Please /accept #%u or /cancel %u the call.\n"
+msgid "Incoming call from `%s'. Please /accept %u or /cancel %u the call.\n"
msgstr ""
-#: src/conversation/gnunet-conversation.c:286
+#: src/conversation/gnunet-conversation.c:294
#, c-format
msgid "Call from `%s' terminated\n"
msgstr ""
-#: src/conversation/gnunet-conversation.c:319
+#: src/conversation/gnunet-conversation.c:329
#, c-format
msgid "Call from `%s' suspended by other user\n"
msgstr ""
-#: src/conversation/gnunet-conversation.c:324
+#: src/conversation/gnunet-conversation.c:334
#, c-format
msgid "Call from `%s' resumed by other user\n"
msgstr ""
-#: src/conversation/gnunet-conversation.c:342
+#: src/conversation/gnunet-conversation.c:352
#, c-format
msgid "Ego `%s' no longer available, phone is now down.\n"
msgstr ""
-#: src/conversation/gnunet-conversation.c:356
+#: src/conversation/gnunet-conversation.c:366
msgid "Failed to setup phone (internal error)\n"
msgstr ""
-#: src/conversation/gnunet-conversation.c:368
+#: src/conversation/gnunet-conversation.c:378
#, c-format
-msgid "Phone active on line %u. Type `/help' for a list of available
commands\n"
+msgid ""
+"Phone active on line %u. Type `/help' for a list of available commands\n"
msgstr ""
-#: src/conversation/gnunet-conversation.c:390
+#: src/conversation/gnunet-conversation.c:400
#, c-format
msgid "Resolved address of `%s'. Now ringing other party.\n"
msgstr ""
-#: src/conversation/gnunet-conversation.c:397
+#: src/conversation/gnunet-conversation.c:407
#, c-format
msgid "Connection established to `%s'\n"
msgstr ""
-#: src/conversation/gnunet-conversation.c:404
+#: src/conversation/gnunet-conversation.c:414
#, c-format
msgid "Failed to resolve `%s'\n"
msgstr ""
-#: src/conversation/gnunet-conversation.c:411
-msgid "Call terminated\n"
+#: src/conversation/gnunet-conversation.c:422
+#, c-format
+msgid "Call to `%s' terminated\n"
msgstr ""
-#: src/conversation/gnunet-conversation.c:417
+#: src/conversation/gnunet-conversation.c:431
#, c-format
msgid "Connection to `%s' suspended (by other user)\n"
msgstr ""
-#: src/conversation/gnunet-conversation.c:423
+#: src/conversation/gnunet-conversation.c:437
#, c-format
msgid "Connection to `%s' resumed (by other user)\n"
msgstr ""
-#: src/conversation/gnunet-conversation.c:428
+#: src/conversation/gnunet-conversation.c:442
msgid "Error with the call, restarting it\n"
msgstr ""
-#: src/conversation/gnunet-conversation.c:495
+#: src/conversation/gnunet-conversation.c:511
#, c-format
msgid "Unknown command `%s'\n"
msgstr ""
-#: src/conversation/gnunet-conversation.c:511
-#: src/conversation/gnunet-conversation.c:525
+#: src/conversation/gnunet-conversation.c:527
+#: src/conversation/gnunet-conversation.c:541
#, c-format
msgid "Ego `%s' not available\n"
msgstr ""
-#: src/conversation/gnunet-conversation.c:518
-#: src/conversation/gnunet-conversation.c:575
+#: src/conversation/gnunet-conversation.c:534
+#: src/conversation/gnunet-conversation.c:591
msgid "You are calling someone else already, hang up first!\n"
msgstr ""
-#: src/conversation/gnunet-conversation.c:533
-#: src/conversation/gnunet-conversation.c:588
+#: src/conversation/gnunet-conversation.c:549
+#: src/conversation/gnunet-conversation.c:604
#, c-format
msgid "You are answering call from `%s', hang up or suspend that call first!\n"
msgstr ""
-#: src/conversation/gnunet-conversation.c:544
+#: src/conversation/gnunet-conversation.c:559
msgid "Call recipient missing.\n"
msgstr ""
-#: src/conversation/gnunet-conversation.c:599
+#: src/conversation/gnunet-conversation.c:615
msgid "There is no incoming call to accept here!\n"
msgstr ""
-#: src/conversation/gnunet-conversation.c:616
+#: src/conversation/gnunet-conversation.c:632
#, c-format
msgid "There is no incoming call `%s' to accept right now!\n"
msgstr ""
-#: src/conversation/gnunet-conversation.c:647
+#: src/conversation/gnunet-conversation.c:662
msgid "We currently do not have an address.\n"
msgstr ""
-#: src/conversation/gnunet-conversation.c:670
+#: src/conversation/gnunet-conversation.c:685
#, c-format
msgid "We are currently trying to locate the private key for the ego `%s'.\n"
msgstr ""
-#: src/conversation/gnunet-conversation.c:675
+#: src/conversation/gnunet-conversation.c:690
#, c-format
msgid "We are listening for incoming calls for ego `%s' on line %u.\n"
msgstr ""
-#: src/conversation/gnunet-conversation.c:681
-#: src/conversation/gnunet-conversation.c:705
+#: src/conversation/gnunet-conversation.c:696
+#: src/conversation/gnunet-conversation.c:720
#, c-format
msgid "You are having a conversation with `%s'.\n"
msgstr ""
-#: src/conversation/gnunet-conversation.c:686
-msgid "We had an internal error setting up our phone line. You can still make
calls.\n"
+#: src/conversation/gnunet-conversation.c:701
+msgid ""
+"We had an internal error setting up our phone line. You can still make "
+"calls.\n"
msgstr ""
-#: src/conversation/gnunet-conversation.c:695
+#: src/conversation/gnunet-conversation.c:710
#, c-format
msgid "We are trying to find the network address to call `%s'.\n"
msgstr ""
-#: src/conversation/gnunet-conversation.c:700
+#: src/conversation/gnunet-conversation.c:715
#, c-format
msgid "We are calling `%s', his phone should be ringing.\n"
msgstr ""
-#: src/conversation/gnunet-conversation.c:719
+#: src/conversation/gnunet-conversation.c:734
msgid "Calls waiting:\n"
msgstr ""
-#: src/conversation/gnunet-conversation.c:725
+#: src/conversation/gnunet-conversation.c:740
#, c-format
msgid "#%u: `%s'\n"
msgstr "#%u : « %s »\n"
-#: src/conversation/gnunet-conversation.c:753
#: src/conversation/gnunet-conversation.c:768
+#: src/conversation/gnunet-conversation.c:783
msgid "There is no call that could be suspended right now.\n"
msgstr ""
-#: src/conversation/gnunet-conversation.c:801
-#: src/conversation/gnunet-conversation.c:817
+#: src/conversation/gnunet-conversation.c:816
+#: src/conversation/gnunet-conversation.c:832
msgid "There is no call that could be resumed right now.\n"
msgstr ""
-#: src/conversation/gnunet-conversation.c:824
+#: src/conversation/gnunet-conversation.c:839
#, c-format
msgid "Already talking with `%s', cannot resume a call right now.\n"
msgstr ""
-#: src/conversation/gnunet-conversation.c:833
+#: src/conversation/gnunet-conversation.c:848
msgid "There is no incoming call to resume here!\n"
msgstr ""
-#: src/conversation/gnunet-conversation.c:850
+#: src/conversation/gnunet-conversation.c:865
#, c-format
msgid "There is no incoming call `%s' to resume right now!\n"
msgstr ""
-#: src/conversation/gnunet-conversation.c:885
+#: src/conversation/gnunet-conversation.c:900
msgid "There is no call that could be cancelled right now.\n"
msgstr ""
-#: src/conversation/gnunet-conversation.c:893
+#: src/conversation/gnunet-conversation.c:908
msgid "There is no incoming call to refuse here!\n"
msgstr ""
-#: src/conversation/gnunet-conversation.c:910
+#: src/conversation/gnunet-conversation.c:925
#, c-format
msgid "There is no incoming call `%s' to refuse right now!\n"
msgstr ""
-#: src/conversation/gnunet-conversation.c:937
+#: src/conversation/gnunet-conversation.c:951
msgid "Use `/address' to find out which address this phone should have in GNS"
msgstr ""
-#: src/conversation/gnunet-conversation.c:939
+#: src/conversation/gnunet-conversation.c:953
msgid "Use `/call USER.gnu' to call USER"
msgstr ""
-#: src/conversation/gnunet-conversation.c:941
+#: src/conversation/gnunet-conversation.c:955
msgid "Use `/accept #NUM' to accept incoming call #NUM"
msgstr ""
-#: src/conversation/gnunet-conversation.c:943
+#: src/conversation/gnunet-conversation.c:957
msgid "Use `/suspend' to suspend the active call"
msgstr ""
-#: src/conversation/gnunet-conversation.c:945
-msgid "Use `/resume [#NUM]' to resume a call, #NUM is needed to resume
incoming calls, no argument is needed to resume the current outgoing call."
+#: src/conversation/gnunet-conversation.c:959
+msgid ""
+"Use `/resume [#NUM]' to resume a call, #NUM is needed to resume incoming "
+"calls, no argument is needed to resume the current outgoing call."
msgstr ""
-#: src/conversation/gnunet-conversation.c:947
+#: src/conversation/gnunet-conversation.c:961
msgid "Use `/cancel' to reject or terminate a call"
msgstr ""
-#: src/conversation/gnunet-conversation.c:949
+#: src/conversation/gnunet-conversation.c:963
msgid "Use `/status' to print status information"
msgstr ""
-#: src/conversation/gnunet-conversation.c:951
+#: src/conversation/gnunet-conversation.c:965
msgid "Use `/quit' to terminate gnunet-conversation"
msgstr ""
-#: src/conversation/gnunet-conversation.c:953
+#: src/conversation/gnunet-conversation.c:967
msgid "Use `/help command' to get help for a specific command"
msgstr ""
-#: src/conversation/gnunet-conversation.c:1151
+#: src/conversation/gnunet-conversation.c:1175
#, c-format
msgid "Name of our ego changed to `%s'\n"
msgstr ""
-#: src/conversation/gnunet-conversation.c:1164
+#: src/conversation/gnunet-conversation.c:1188
#, c-format
msgid "Our ego `%s' was deleted!\n"
msgstr ""
-#: src/conversation/gnunet-conversation.c:1199
+#: src/conversation/gnunet-conversation.c:1223
msgid "You must specify the NAME of an ego to use\n"
msgstr ""
-#: src/conversation/gnunet-conversation.c:1223
+#: src/conversation/gnunet-conversation.c:1247
msgid "Failed to start gnunet-helper-w32-console\n"
msgstr ""
-#: src/conversation/gnunet-conversation.c:1249
+#: src/conversation/gnunet-conversation.c:1273
msgid "sets the NAME of the ego to use for the phone (and name resolution)"
msgstr ""
-#: src/conversation/gnunet-conversation.c:1252
+#: src/conversation/gnunet-conversation.c:1276
msgid "sets the LINE to use for the phone"
msgstr ""
-#: src/conversation/gnunet-conversation.c:1276
+#: src/conversation/gnunet-conversation.c:1302
msgid "Enables having a conversation with other GNUnet users."
msgstr ""
@@ -896,16 +983,20 @@
#, c-format
msgid ""
"\n"
-"We are now playing your recording back. If you can hear it, your audio
settings are working..."
+"We are now playing your recording back. If you can hear it, your audio "
+"settings are working..."
msgstr ""
#: src/conversation/gnunet-conversation-test.c:215
#, c-format
-msgid "We will now be recording you for %s. After that time, the recording
will be played back to you..."
+msgid ""
+"We will now be recording you for %s. After that time, the recording will be "
+"played back to you..."
msgstr ""
#: src/conversation/gnunet-conversation-test.c:248
#: src/multicast/gnunet-multicast.c:70 src/revocation/gnunet-revocation.c:522
+#: src/sensordashboard/gnunet-sensordashboard.c:70
#: src/template/gnunet-template.c:70
msgid "help text"
msgstr ""
@@ -915,59 +1006,59 @@
msgid "pa_stream_write() failed: %s\n"
msgstr "pa_stream_write() échoué : %s\n"
-#: src/conversation/gnunet-helper-audio-playback.c:587
+#: src/conversation/gnunet-helper-audio-playback.c:589
msgid "gnunet-helper-audio-playback - Got signal, exiting\n"
msgstr ""
-#: src/conversation/gnunet-helper-audio-playback.c:612
+#: src/conversation/gnunet-helper-audio-playback.c:614
#: src/conversation/gnunet-helper-audio-record.c:545
msgid "Connection established.\n"
msgstr ""
-#: src/conversation/gnunet-helper-audio-playback.c:617
+#: src/conversation/gnunet-helper-audio-playback.c:619
#: src/conversation/gnunet-helper-audio-record.c:550
#, c-format
msgid "pa_stream_new() failed: %s\n"
msgstr "pa_stream_new() échoué : %s\n"
-#: src/conversation/gnunet-helper-audio-playback.c:631
+#: src/conversation/gnunet-helper-audio-playback.c:633
#, c-format
msgid "pa_stream_connect_playback() failed: %s\n"
msgstr "pa_stream_connect_playback() échoué : %s\n"
-#: src/conversation/gnunet-helper-audio-playback.c:644
+#: src/conversation/gnunet-helper-audio-playback.c:646
#: src/conversation/gnunet-helper-audio-record.c:576
#, c-format
msgid "Connection failure: %s\n"
msgstr ""
-#: src/conversation/gnunet-helper-audio-playback.c:665
+#: src/conversation/gnunet-helper-audio-playback.c:667
#: src/conversation/gnunet-helper-audio-record.c:599
msgid "Wrong Spec\n"
msgstr "Spécification incorrecte\n"
-#: src/conversation/gnunet-helper-audio-playback.c:671
+#: src/conversation/gnunet-helper-audio-playback.c:673
#: src/conversation/gnunet-helper-audio-record.c:605
msgid "pa_mainloop_new() failed.\n"
msgstr "pa_mainloop_new() échoué.\n"
-#: src/conversation/gnunet-helper-audio-playback.c:685
+#: src/conversation/gnunet-helper-audio-playback.c:687
#: src/conversation/gnunet-helper-audio-record.c:620
msgid "pa_context_new() failed.\n"
msgstr "pa_context_new() échoué.\n"
-#: src/conversation/gnunet-helper-audio-playback.c:692
+#: src/conversation/gnunet-helper-audio-playback.c:694
#: src/conversation/gnunet-helper-audio-record.c:626
#, c-format
msgid "pa_context_connect() failed: %s\n"
msgstr "pa_context_connect() échoué : %s\n"
-#: src/conversation/gnunet-helper-audio-playback.c:698
+#: src/conversation/gnunet-helper-audio-playback.c:700
#: src/conversation/gnunet-helper-audio-record.c:632
msgid "pa_mainloop_run() failed.\n"
msgstr "pa_mainloop_run() échoué.\n"
-#: src/conversation/gnunet-helper-audio-playback.c:768
+#: src/conversation/gnunet-helper-audio-playback.c:770
#, c-format
msgid "Read error from STDIN: %s\n"
msgstr ""
@@ -1034,18 +1125,19 @@
msgid "Failed to allocate %d bytes for second packet\n"
msgstr ""
-#: src/conversation/gnunet-service-conversation.c:841
-msgid "Mesh audio channel not ready; audio data dropped\n"
+#: src/conversation/gnunet-service-conversation.c:853
+msgid "Cadet audio channel not ready; audio data dropped\n"
msgstr ""
-#: src/conversation/gnunet-service-conversation.c:932
+#: src/conversation/gnunet-service-conversation.c:944
#, c-format
-msgid "No available phone for incoming call on line %u, sending HANG_UP
signal\n"
+msgid ""
+"No available phone for incoming call on line %u, sending HANG_UP signal\n"
msgstr ""
-#: src/conversation/gnunet-service-conversation.c:1338
+#: src/conversation/gnunet-service-conversation.c:1351
#, c-format
-msgid "Received incoming channel on port %u\n"
+msgid "Received incoming Cadet channel on port %u\n"
msgstr ""
#: src/conversation/microphone.c:121
@@ -1061,238 +1153,275 @@
msgid "Could not start playback audio helper.\n"
msgstr ""
-#: src/core/core_api.c:767
+#: src/core/core_api.c:787
msgid "Client was disconnected from core service, trying to reconnect.\n"
msgstr ""
-#: src/core/gnunet-core.c:80
-#, c-format
-msgid "Peer `%s'\n"
+#: src/core/gnunet-core.c:92
+msgid "fresh connection"
msgstr ""
-#: src/core/gnunet-core.c:110 src/core/gnunet-core.c:138
-#: src/transport/gnunet-transport.c:910 src/transport/gnunet-transport.c:930
-#, c-format
-msgid "%24s: %-17s %4s (%u connections in total)\n"
+#: src/core/gnunet-core.c:95
+msgid "key sent"
msgstr ""
-#: src/core/gnunet-core.c:112 src/transport/gnunet-transport.c:911
-msgid "Connected to"
+#: src/core/gnunet-core.c:98
+msgid "key received"
msgstr ""
-#: src/core/gnunet-core.c:140 src/transport/gnunet-transport.c:931
-msgid "Disconnected from"
+#: src/core/gnunet-core.c:101
+msgid "connection established"
msgstr ""
-#: src/core/gnunet-core.c:211 src/peerinfo-tool/gnunet-peerinfo.c:694
+#: src/core/gnunet-core.c:104
+msgid "rekeying"
+msgstr ""
+
+#: src/core/gnunet-core.c:107
+msgid "disconnected"
+msgstr ""
+
+#: src/core/gnunet-core.c:114
+msgid "Connection to CORE service lost (reconnecting)"
+msgstr ""
+
+#: src/core/gnunet-core.c:117
+#, fuzzy
+msgid "unknown state"
+msgstr "inconnu"
+
+#: src/core/gnunet-core.c:122
#, c-format
+msgid "%24s: %-30s %4s (timeout in %6s)\n"
+msgstr ""
+
+#: src/core/gnunet-core.c:146 src/peerinfo-tool/gnunet-peerinfo.c:786
+#, c-format
msgid "Invalid command line argument `%s'\n"
msgstr ""
-#: src/core/gnunet-core.c:233 src/transport/gnunet-transport.c:1486
+#: src/core/gnunet-core.c:157
+msgid "Failed to connect to CORE service!\n"
+msgstr ""
+
+#: src/core/gnunet-core.c:179 src/transport/gnunet-transport.c:2154
msgid "provide information about all current connections (continuously)"
msgstr ""
-#: src/core/gnunet-core.c:244
+#: src/core/gnunet-core.c:188
msgid "Print information about connected peers."
msgstr ""
-#: src/core/gnunet-service-core.c:105
+#: src/core/gnunet-service-core.c:104
msgid "Core service is lacking HOSTKEY configuration setting. Exiting.\n"
msgstr ""
-#: src/core/gnunet-service-core.c:126
+#: src/core/gnunet-service-core.c:128
#, c-format
msgid "Core service of `%4s' ready.\n"
msgstr ""
-#: src/core/gnunet-service-core_clients.c:370
+#: src/core/gnunet-service-core_clients.c:375
msgid "# send requests dropped (disconnected)"
msgstr ""
-#: src/core/gnunet-service-core_clients.c:480
+#: src/core/gnunet-service-core_clients.c:490
msgid "# messages discarded (session disconnected)"
msgstr ""
-#: src/core/gnunet-service-core_clients.c:526
+#: src/core/gnunet-service-core_clients.c:536
#, c-format
msgid "# bytes of messages of type %u received"
msgstr ""
-#: src/core/gnunet-service-core_kx.c:535
+#: src/core/gnunet-service-core_kx.c:571
msgid "# bytes encrypted"
msgstr ""
-#: src/core/gnunet-service-core_kx.c:586
+#: src/core/gnunet-service-core_kx.c:630
msgid "# bytes decrypted"
msgstr ""
-#: src/core/gnunet-service-core_kx.c:673
+#: src/core/gnunet-service-core_kx.c:719
msgid "# key exchanges initiated"
msgstr ""
-#: src/core/gnunet-service-core_kx.c:713
+#: src/core/gnunet-service-core_kx.c:765
msgid "# key exchanges stopped"
msgstr ""
-#: src/core/gnunet-service-core_kx.c:810
+#: src/core/gnunet-service-core_kx.c:795
+msgid "# PING messages transmitted"
+msgstr ""
+
+#: src/core/gnunet-service-core_kx.c:870
msgid "# old ephemeral keys ignored"
msgstr ""
-#: src/core/gnunet-service-core_kx.c:816
+#: src/core/gnunet-service-core_kx.c:877
msgid "# ephemeral keys received"
msgstr ""
-#: src/core/gnunet-service-core_kx.c:850
+#: src/core/gnunet-service-core_kx.c:916
#, c-format
-msgid "Ephemeral key message from peer `%s' rejected as its validity range
does not match our system time (%llu not in [%llu,%llu]).\n"
+msgid ""
+"Ephemeral key message from peer `%s' rejected as its validity range does not "
+"match our system time (%llu not in [%llu,%llu]).\n"
msgstr ""
-#: src/core/gnunet-service-core_kx.c:861
+#: src/core/gnunet-service-core_kx.c:927
msgid "# EPHEMERAL_KEY messages received"
msgstr ""
-#: src/core/gnunet-service-core_kx.c:951
-#: src/transport/gnunet-service-transport_validation.c:1016
+#: src/core/gnunet-service-core_kx.c:1029
+#: src/transport/gnunet-service-transport_validation.c:1053
msgid "# PING messages received"
msgstr ""
-#: src/core/gnunet-service-core_kx.c:959
+#: src/core/gnunet-service-core_kx.c:1038
msgid "# PING messages dropped (out of order)"
msgstr ""
-#: src/core/gnunet-service-core_kx.c:986
+#: src/core/gnunet-service-core_kx.c:1067
#, c-format
-msgid "Received PING from `%s' for different identity: I am `%s', PONG
identity: `%s'\n"
+msgid ""
+"Received PING from `%s' for different identity: I am `%s', PONG identity: `"
+"%s'\n"
msgstr ""
-#: src/core/gnunet-service-core_kx.c:1003
+#: src/core/gnunet-service-core_kx.c:1093
msgid "# PONG messages created"
msgstr ""
-#: src/core/gnunet-service-core_kx.c:1029
+#: src/core/gnunet-service-core_kx.c:1122
msgid "# sessions terminated by timeout"
msgstr ""
-#: src/core/gnunet-service-core_kx.c:1039
+#: src/core/gnunet-service-core_kx.c:1135
msgid "# keepalive messages sent"
msgstr ""
-#: src/core/gnunet-service-core_kx.c:1096
-#: src/transport/gnunet-service-transport_validation.c:1328
+#: src/core/gnunet-service-core_kx.c:1206
+#: src/transport/gnunet-service-transport_validation.c:1370
msgid "# PONG messages received"
msgstr ""
-#: src/core/gnunet-service-core_kx.c:1102
+#: src/core/gnunet-service-core_kx.c:1213
msgid "# PONG messages dropped (connection down)"
msgstr ""
-#: src/core/gnunet-service-core_kx.c:1107
+#: src/core/gnunet-service-core_kx.c:1218
msgid "# PONG messages dropped (out of order)"
msgstr ""
-#: src/core/gnunet-service-core_kx.c:1137
+#: src/core/gnunet-service-core_kx.c:1254
msgid "# PONG messages decrypted"
msgstr ""
-#: src/core/gnunet-service-core_kx.c:1171
+#: src/core/gnunet-service-core_kx.c:1292
msgid "# session keys confirmed via PONG"
msgstr ""
-#: src/core/gnunet-service-core_kx.c:1181
+#: src/core/gnunet-service-core_kx.c:1303
msgid "# timeouts prevented via PONG"
msgstr ""
-#: src/core/gnunet-service-core_kx.c:1188
+#: src/core/gnunet-service-core_kx.c:1310
msgid "# rekey operations confirmed via PONG"
msgstr ""
-#: src/core/gnunet-service-core_kx.c:1328
+#: src/core/gnunet-service-core_kx.c:1466
msgid "# DATA message dropped (out of order)"
msgstr ""
-#: src/core/gnunet-service-core_kx.c:1335
+#: src/core/gnunet-service-core_kx.c:1474
#, c-format
-msgid "Session to peer `%s' went down due to key expiration (should not
happen)\n"
+msgid ""
+"Session to peer `%s' went down due to key expiration (should not happen)\n"
msgstr ""
-#: src/core/gnunet-service-core_kx.c:1338
+#: src/core/gnunet-service-core_kx.c:1477
msgid "# sessions terminated by key expiration"
msgstr ""
-#: src/core/gnunet-service-core_kx.c:1383
-#: src/core/gnunet-service-core_kx.c:1408
+#: src/core/gnunet-service-core_kx.c:1535
+#: src/core/gnunet-service-core_kx.c:1561
msgid "# bytes dropped (duplicates)"
msgstr ""
-#: src/core/gnunet-service-core_kx.c:1395
+#: src/core/gnunet-service-core_kx.c:1548
msgid "# bytes dropped (out of sequence)"
msgstr ""
-#: src/core/gnunet-service-core_kx.c:1437
+#: src/core/gnunet-service-core_kx.c:1590
msgid "# bytes dropped (ancient message)"
msgstr ""
-#: src/core/gnunet-service-core_kx.c:1445
+#: src/core/gnunet-service-core_kx.c:1598
msgid "# bytes of payload decrypted"
msgstr ""
-#: src/core/gnunet-service-core_kx.c:1480
+#: src/core/gnunet-service-core_kx.c:1632
msgid "# PAYLOAD dropped (out of order)"
msgstr ""
-#: src/core/gnunet-service-core_neighbours.c:168
+#: src/core/gnunet-service-core_neighbours.c:177
msgid "# sessions terminated by transport disconnect"
msgstr ""
-#: src/core/gnunet-service-core_neighbours.c:184
-#: src/core/gnunet-service-core_neighbours.c:335
+#: src/core/gnunet-service-core_neighbours.c:193
+#: src/core/gnunet-service-core_neighbours.c:355
msgid "# neighbour entries allocated"
msgstr ""
-#: src/core/gnunet-service-core_neighbours.c:252
+#: src/core/gnunet-service-core_neighbours.c:264
msgid "# encrypted bytes given to transport"
msgstr ""
-#: src/core/gnunet-service-core_neighbours.c:418
+#: src/core/gnunet-service-core_neighbours.c:438
#, c-format
msgid "Unsupported message of type %u (%u bytes) received from peer `%s'\n"
msgstr ""
-#: src/core/gnunet-service-core_sessions.c:216
-#: src/core/gnunet-service-core_sessions.c:288
-#: src/dht/gnunet-service-dht_neighbours.c:662
-#: src/dht/gnunet-service-dht_neighbours.c:727
-#: src/dht/gnunet-service-xdht_neighbours.c:1304
-#: src/fs/gnunet-service-fs_cp.c:606 src/fs/gnunet-service-fs_cp.c:1501
-#: src/topology/gnunet-daemon-topology.c:707
-#: src/topology/gnunet-daemon-topology.c:808
-#: src/transport/gnunet-service-transport_neighbours.c:917
-#: src/transport/gnunet-service-transport_neighbours.c:1141
-#: src/transport/gnunet-service-transport_neighbours.c:3142
-#: src/transport/gnunet-service-transport_neighbours.c:3438
+#: src/core/gnunet-service-core_sessions.c:252
+#: src/core/gnunet-service-core_sessions.c:338
+#: src/dht/gnunet-service-dht_neighbours.c:661
+#: src/dht/gnunet-service-dht_neighbours.c:726
+#: src/fs/gnunet-service-fs_cp.c:654 src/fs/gnunet-service-fs_cp.c:1647
+#: src/topology/gnunet-daemon-topology.c:734
+#: src/topology/gnunet-daemon-topology.c:835
+#: src/transport/gnunet-service-transport_neighbours.c:755
+#: src/transport/gnunet-service-transport_neighbours.c:763
msgid "# peers connected"
msgstr ""
-#: src/core/gnunet-service-core_sessions.c:255
+#: src/core/gnunet-service-core_sessions.c:285
msgid "# type map refreshes sent"
msgstr ""
-#: src/core/gnunet-service-core_sessions.c:426
+#: src/core/gnunet-service-core_sessions.c:404
+msgid "# outdated typemap confirmations received"
+msgstr ""
+
+#: src/core/gnunet-service-core_sessions.c:415
+msgid "# valid typemap confirmations received"
+msgstr ""
+
+#: src/core/gnunet-service-core_sessions.c:554
msgid "# messages discarded (expired prior to transmission)"
msgstr ""
-#: src/core/gnunet-service-core_typemap.c:110
-#: src/core/gnunet-service-core_typemap.c:121
+#: src/core/gnunet-service-core_typemap.c:169
+#: src/core/gnunet-service-core_typemap.c:180
msgid "# type maps received"
msgstr ""
-#: src/core/gnunet-service-core_typemap.c:151
+#: src/core/gnunet-service-core_typemap.c:210
msgid "# updates to my type map"
msgstr ""
#: src/datacache/datacache.c:115 src/datacache/datacache.c:266
-#: src/datastore/gnunet-service-datastore.c:838
+#: src/datastore/gnunet-service-datastore.c:841
msgid "# bytes stored"
msgstr ""
@@ -1301,8 +1430,8 @@
msgstr ""
#: src/datacache/datacache.c:143 src/datacache/datacache.c:150
-#: src/datastore/gnunet-service-datastore.c:1487
-#: src/datastore/gnunet-service-datastore.c:1498
+#: src/datastore/gnunet-service-datastore.c:1598
+#: src/datastore/gnunet-service-datastore.c:1609
#, c-format
msgid "No `%s' specified for `%s' in configuration!\n"
msgstr ""
@@ -1329,14 +1458,14 @@
msgid "Heap datacache running\n"
msgstr ""
-#: src/datacache/plugin_datacache_postgres.c:392
+#: src/datacache/plugin_datacache_postgres.c:391
msgid "Postgres datacache running\n"
msgstr ""
#: src/datacache/plugin_datacache_sqlite.c:69
#: src/datacache/plugin_datacache_sqlite.c:72
-#: src/datastore/plugin_datastore_mysql.c:806
-#: src/datastore/plugin_datastore_mysql.c:820
+#: src/datastore/plugin_datastore_mysql.c:818
+#: src/datastore/plugin_datastore_mysql.c:834
#: src/datastore/plugin_datastore_sqlite.c:57 src/mysql/mysql.c:41
#: src/mysql/mysql.c:48 src/mysql/mysql.c:522 src/mysql/mysql.c:531
#: src/mysql/mysql.c:591 src/mysql/mysql.c:607
@@ -1344,28 +1473,29 @@
#: src/namecache/plugin_namecache_sqlite.c:52
#: src/namestore/plugin_namestore_postgres.c:52
#: src/namestore/plugin_namestore_sqlite.c:52
+#: src/peerstore/plugin_peerstore_sqlite.c:50
#: src/testbed/generate-underlay-topology.c:47
#: src/testbed/gnunet-daemon-latency-logger.c:52
#: src/testbed/gnunet-daemon-testbed-underlay.c:55
#: src/testbed/testbed_api_hosts.c:69 src/util/crypto_ecc.c:51
-#: src/util/crypto_mpi.c:39 src/include/gnunet_common.h:602
-#: src/include/gnunet_common.h:611 src/scalarproduct/scalarproduct.h:50
+#: src/util/crypto_mpi.c:39 src/include/gnunet_common.h:626
+#: src/include/gnunet_common.h:635 src/scalarproduct/scalarproduct.h:35
#, c-format
msgid "`%s' failed at %s:%d with error: %s\n"
msgstr ""
-#: src/datacache/plugin_datacache_sqlite.c:450
+#: src/datacache/plugin_datacache_sqlite.c:449
msgid "Sqlite datacache running\n"
msgstr ""
-#: src/datacache/plugin_datacache_sqlite.c:484
-#: src/datastore/plugin_datastore_sqlite.c:404
-#: src/namecache/plugin_namecache_sqlite.c:295
-#: src/namestore/plugin_namestore_sqlite.c:327
+#: src/datacache/plugin_datacache_sqlite.c:483
+#: src/datastore/plugin_datastore_sqlite.c:401
+#: src/namecache/plugin_namecache_sqlite.c:292
+#: src/namestore/plugin_namestore_sqlite.c:324
msgid "Tried to close sqlite without finalizing all prepared statements.\n"
msgstr ""
-#: src/datacache/plugin_datacache_sqlite.c:491
+#: src/datacache/plugin_datacache_sqlite.c:490
#, c-format
msgid "Failed to close statement %p: %d\n"
msgstr ""
@@ -1398,67 +1528,63 @@
msgid "# datastore connections (re)created"
msgstr ""
-#: src/datastore/datastore_api.c:616 src/scalarproduct/scalarproduct_api.c:279
+#: src/datastore/datastore_api.c:621
msgid "# transmission request failures"
msgstr ""
-#: src/datastore/datastore_api.c:638
+#: src/datastore/datastore_api.c:645
msgid "# bytes sent to datastore"
msgstr ""
-#: src/datastore/datastore_api.c:770
+#: src/datastore/datastore_api.c:787
msgid "Failed to receive status response from database."
msgstr ""
-#: src/datastore/datastore_api.c:784
+#: src/datastore/datastore_api.c:801
msgid "Error reading response from datastore service"
msgstr ""
-#: src/datastore/datastore_api.c:796 src/datastore/datastore_api.c:802
+#: src/datastore/datastore_api.c:813 src/datastore/datastore_api.c:819
msgid "Invalid error message received from datastore service"
msgstr ""
-#: src/datastore/datastore_api.c:806
+#: src/datastore/datastore_api.c:823
msgid "# status messages received"
msgstr ""
-#: src/datastore/datastore_api.c:876
+#: src/datastore/datastore_api.c:893
msgid "# PUT requests executed"
msgstr ""
-#: src/datastore/datastore_api.c:944
+#: src/datastore/datastore_api.c:959
msgid "# RESERVE requests executed"
msgstr ""
-#: src/datastore/datastore_api.c:1005
+#: src/datastore/datastore_api.c:1020
msgid "# RELEASE RESERVE requests executed"
msgstr ""
-#: src/datastore/datastore_api.c:1065
+#: src/datastore/datastore_api.c:1080
msgid "# UPDATE requests executed"
msgstr ""
-#: src/datastore/datastore_api.c:1129
+#: src/datastore/datastore_api.c:1144
msgid "# REMOVE requests executed"
msgstr ""
-#: src/datastore/datastore_api.c:1174
-msgid "Failed to receive response from database.\n"
-msgstr ""
-
-#: src/datastore/datastore_api.c:1233
+#: src/datastore/datastore_api.c:1248
msgid "# Results received"
msgstr ""
-#: src/datastore/datastore_api.c:1300
+#: src/datastore/datastore_api.c:1315
msgid "# GET REPLICATION requests executed"
msgstr ""
-#: src/datastore/datastore_api.c:1363
+#: src/datastore/datastore_api.c:1378
msgid "# GET ZERO ANONYMITY requests executed"
msgstr ""
-#: src/datastore/datastore_api.c:1424
+#: src/datastore/datastore_api.c:1447
msgid "# GET requests executed"
msgstr ""
@@ -1473,179 +1599,207 @@
msgstr ""
#: src/datastore/gnunet-datastore.c:246
-msgid "specifies the configuration to use to access an alternative datastore;
will merge that datastore into our current datastore"
+msgid ""
+"specifies the configuration to use to access an alternative datastore; will "
+"merge that datastore into our current datastore"
msgstr ""
#: src/datastore/gnunet-datastore.c:255
msgid "Manipulate GNUnet datastore"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:351
+#: src/datastore/gnunet-service-datastore.c:365
msgid "# bytes expired"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:425
+#: src/datastore/gnunet-service-datastore.c:439
msgid "# bytes purged (low-priority)"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:483
+#: src/datastore/gnunet-service-datastore.c:497
#: src/gns/gnunet-gns-helper-service-w32.c:223
msgid "Transmission to client failed!\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:514
+#: src/datastore/gnunet-service-datastore.c:528
#: src/gns/gnunet-gns-helper-service-w32.c:262
msgid "Shutdown in progress, aborting transmission.\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:630
+#: src/datastore/gnunet-service-datastore.c:643
msgid "# results found"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:673
+#: src/datastore/gnunet-service-datastore.c:686
#, c-format
-msgid "Insufficient space (%llu bytes are available) to satisfy `%s' request
for %llu bytes\n"
+msgid ""
+"Insufficient space (%llu bytes are available) to satisfy `%s' request for "
+"%llu bytes\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:684
+#: src/datastore/gnunet-service-datastore.c:697
#, c-format
-msgid "The requested amount (%llu bytes) is larger than the cache size (%llu
bytes)\n"
+msgid ""
+"The requested amount (%llu bytes) is larger than the cache size (%llu "
+"bytes)\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:688
-msgid "Insufficient space to satisfy request and requested amount is larger
than cache size"
+#: src/datastore/gnunet-service-datastore.c:701
+msgid ""
+"Insufficient space to satisfy request and requested amount is larger than "
+"cache size"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:694
+#: src/datastore/gnunet-service-datastore.c:707
msgid "Insufficient space to satisfy request"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:699
-#: src/datastore/gnunet-service-datastore.c:751
-#: src/datastore/gnunet-service-datastore.c:964
-#: src/datastore/gnunet-service-datastore.c:1421
+#: src/datastore/gnunet-service-datastore.c:712
+#: src/datastore/gnunet-service-datastore.c:767
+#: src/datastore/gnunet-service-datastore.c:999
+#: src/datastore/gnunet-service-datastore.c:1570
msgid "# reserved"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:764
+#: src/datastore/gnunet-service-datastore.c:780
msgid "Could not find matching reservation"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:850
+#: src/datastore/gnunet-service-datastore.c:853
#, c-format
msgid "Need %llu bytes more space (%llu allowed, using %llu)\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1010
+#: src/datastore/gnunet-service-datastore.c:1046
msgid "# GET requests received"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1022
+#: src/datastore/gnunet-service-datastore.c:1058
msgid "# requests filtered by bloomfilter"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1050
+#: src/datastore/gnunet-service-datastore.c:1094
msgid "# UPDATE requests received"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1080
+#: src/datastore/gnunet-service-datastore.c:1122
msgid "# GET REPLICATION requests received"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1113
+#: src/datastore/gnunet-service-datastore.c:1155
msgid "# GET ZERO ANONYMITY requests received"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1138
+#: src/datastore/gnunet-service-datastore.c:1180
msgid "Content not found"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1146
+#: src/datastore/gnunet-service-datastore.c:1188
msgid "# bytes removed (explicit request)"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1178
+#: src/datastore/gnunet-service-datastore.c:1220
msgid "# REMOVE requests received"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1220
+#: src/datastore/gnunet-service-datastore.c:1264
#, c-format
-msgid "Datastore payload inaccurate (%lld < %lld). Trying to fix.\n"
+msgid ""
+"Datastore payload must have been inaccurate (%lld < %lld). Recomputing it.\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1281
+#: src/datastore/gnunet-service-datastore.c:1269
#, c-format
+msgid "New payload: %lld\n"
+msgstr ""
+
+#: src/datastore/gnunet-service-datastore.c:1322
+#, c-format
msgid "Loading `%s' datastore plugin\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1290
+#: src/datastore/gnunet-service-datastore.c:1333
#, c-format
msgid "Failed to load datastore plugin for `%s'\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1492
+#: src/datastore/gnunet-service-datastore.c:1402
+#: src/datastore/gnunet-service-datastore.c:1463
+msgid "Bloomfilter construction complete.\n"
+msgstr ""
+
+#: src/datastore/gnunet-service-datastore.c:1450
+msgid "Rebuilding bloomfilter. Please be patient.\n"
+msgstr ""
+
+#: src/datastore/gnunet-service-datastore.c:1460
+msgid "Plugin does not support get_keys function. Please fix!\n"
+msgstr ""
+
+#: src/datastore/gnunet-service-datastore.c:1603
#, c-format
msgid "# bytes used in file-sharing datastore `%s'"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1503
+#: src/datastore/gnunet-service-datastore.c:1614
msgid "# quota"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1505
+#: src/datastore/gnunet-service-datastore.c:1616
msgid "# cache size"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1518
+#: src/datastore/gnunet-service-datastore.c:1629
#, c-format
msgid "Could not use specified filename `%s' for bloomfilter.\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1536
-#: src/datastore/gnunet-service-datastore.c:1552
+#: src/datastore/gnunet-service-datastore.c:1647
+#: src/datastore/gnunet-service-datastore.c:1663
#, c-format
msgid "Failed to remove bogus bloomfilter file `%s'\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1582
+#: src/datastore/gnunet-service-datastore.c:1693
msgid "Failed to initialize bloomfilter.\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1611
-msgid "Rebuilding bloomfilter. Please be patient.\n"
+#: src/datastore/plugin_datastore_heap.c:826
+msgid "Heap database running\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1616
-msgid "Plugin does not support get_keys function. Please fix!\n"
+#: src/datastore/plugin_datastore_mysql.c:309
+#: src/datastore/plugin_datastore_sqlite.c:499
+msgid "Data too large"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1619
-msgid "Bloomfilter construction complete.\n"
+#: src/datastore/plugin_datastore_mysql.c:328
+msgid "MySQL statement run failure"
msgstr ""
-#: src/datastore/plugin_datastore_heap.c:820
-msgid "Heap database running\n"
-msgstr ""
-
-#: src/datastore/plugin_datastore_mysql.c:783
+#: src/datastore/plugin_datastore_mysql.c:793
#, c-format
msgid "Failed to prepare statement `%s'\n"
msgstr ""
-#: src/datastore/plugin_datastore_mysql.c:791
+#: src/datastore/plugin_datastore_mysql.c:802
#, c-format
msgid "`%s' for `%s' failed at %s:%d with error: %s\n"
msgstr ""
-#: src/datastore/plugin_datastore_mysql.c:1022
+#: src/datastore/plugin_datastore_mysql.c:1036
msgid "Mysql database running\n"
msgstr ""
-#: src/datastore/plugin_datastore_postgres.c:824
+#: src/datastore/plugin_datastore_postgres.c:331
+msgid "Postgress exec failure"
+msgstr ""
+
+#: src/datastore/plugin_datastore_postgres.c:846
msgid "Failed to drop table from database.\n"
msgstr ""
-#: src/datastore/plugin_datastore_postgres.c:860
+#: src/datastore/plugin_datastore_postgres.c:882
#: src/namecache/plugin_namecache_postgres.c:414
#: src/namestore/plugin_namestore_postgres.c:569
msgid "Postgres database running\n"
@@ -1662,35 +1816,38 @@
#: src/datastore/plugin_datastore_sqlite.c:255
#: src/namecache/plugin_namecache_sqlite.c:193
#: src/namestore/plugin_namestore_sqlite.c:204
-#: src/psycstore/plugin_psycstore_sqlite.c:319
+#: src/peerstore/plugin_peerstore_sqlite.c:479
+#: src/psycstore/plugin_psycstore_sqlite.c:329
#, c-format
msgid "Unable to initialize SQLite: %s.\n"
msgstr ""
-#: src/datastore/plugin_datastore_sqlite.c:663
+#: src/datastore/plugin_datastore_sqlite.c:680
msgid "Invalid data in database. Trying to fix (by deletion).\n"
msgstr ""
-#: src/datastore/plugin_datastore_sqlite.c:1156
+#: src/datastore/plugin_datastore_sqlite.c:1177
msgid "sqlite version to old to determine size, assuming zero\n"
msgstr ""
-#: src/datastore/plugin_datastore_sqlite.c:1175
+#: src/datastore/plugin_datastore_sqlite.c:1197
#, c-format
-msgid "Using sqlite page utilization to estimate payload (%llu pages of size
%llu bytes)\n"
+msgid ""
+"Using sqlite page utilization to estimate payload (%llu pages of size %llu "
+"bytes)\n"
msgstr ""
-#: src/datastore/plugin_datastore_sqlite.c:1215
-#: src/namecache/plugin_namecache_sqlite.c:583
-#: src/namestore/plugin_namestore_sqlite.c:719
+#: src/datastore/plugin_datastore_sqlite.c:1237
+#: src/namecache/plugin_namecache_sqlite.c:580
+#: src/namestore/plugin_namestore_sqlite.c:716
msgid "Sqlite database running\n"
msgstr ""
-#: src/datastore/plugin_datastore_template.c:257
+#: src/datastore/plugin_datastore_template.c:260
msgid "Template database running\n"
msgstr ""
-#: src/dht/dht_api.c:376
+#: src/dht/dht_api.c:403
msgid "Failed to connect to the DHT service!\n"
msgstr ""
@@ -1735,8 +1892,8 @@
msgstr ""
#: src/dht/gnunet-dht-get.c:204 src/dht/gnunet-dht-monitor.c:271
-#: src/dht/gnunet-dht-put.c:213 src/fs/gnunet-auto-share.c:753
-#: src/fs/gnunet-download.c:328 src/fs/gnunet-publish.c:877
+#: src/dht/gnunet-dht-put.c:213 src/fs/gnunet-auto-share.c:755
+#: src/fs/gnunet-download.c:328 src/fs/gnunet-publish.c:941
#: src/fs/gnunet-search.c:301 src/fs/gnunet-unindex.c:168
#: src/nse/gnunet-nse-profiler.c:873
msgid "be verbose (print progress information)"
@@ -1754,6 +1911,52 @@
msgid "Prints all packets that go through the DHT."
msgstr ""
+#: src/dht/gnunet_dht_profiler.c:1393
+#: src/testbed/gnunet-testbed-profiler.c:267
+#, c-format
+msgid "Exiting as the number of peers is %u\n"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1418
+#, fuzzy
+msgid "number of peers to start"
+msgstr "nombre de valeurs"
+
+#: src/dht/gnunet_dht_profiler.c:1421
+msgid ""
+"maximum number of times we try to search for successor circle formation (0 "
+"for R5N)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1424 src/nse/gnunet-nse-profiler.c:864
+#: src/testbed/gnunet-testbed-profiler.c:306
+msgid "name of the file with the login information for the testbed"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1427
+msgid "delay between rounds for collecting statistics (default: 30 sec)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1430
+msgid "delay to start doing PUTs (default: 1 sec)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1433
+msgid "delay to start doing GETs (default: 5 min)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1436
+msgid "replication degree for DHT PUTs"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1439
+msgid "timeout for DHT PUT and GET requests (default: 1 min)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1457
+msgid "Measure quality and performance of the DHT service."
+msgstr ""
+
#: src/dht/gnunet-dht-put.c:118
msgid "PUT request sent with key"
msgstr ""
@@ -1800,107 +2003,107 @@
msgid "Issue a PUT request to the GNUnet DHT insert DATA under KEY."
msgstr ""
-#: src/dht/gnunet-service-dht.c:172 src/dht/gnunet-service-xdht.c:176
+#: src/dht/gnunet-service-dht.c:172 src/dht/gnunet-service-xdht.c:193
msgid "Failed to connect to transport service!\n"
msgstr ""
#: src/dht/gnunet-service-dht_clients.c:417
-#: src/dht/gnunet-service-xdht_clients.c:838
+#: src/dht/gnunet-service-xdht_clients.c:849
msgid "# GET requests from clients injected"
msgstr ""
#: src/dht/gnunet-service-dht_clients.c:513
-#: src/dht/gnunet-service-xdht_clients.c:927
+#: src/dht/gnunet-service-xdht_clients.c:933
msgid "# PUT requests received from clients"
msgstr ""
#: src/dht/gnunet-service-dht_clients.c:597
-#: src/dht/gnunet-service-xdht_clients.c:1013
+#: src/dht/gnunet-service-xdht_clients.c:998
msgid "# GET requests received from clients"
msgstr ""
#: src/dht/gnunet-service-dht_clients.c:798
-#: src/dht/gnunet-service-xdht_clients.c:1214
+#: src/dht/gnunet-service-xdht_clients.c:1200
msgid "# GET STOP requests received from clients"
msgstr ""
-#: src/dht/gnunet-service-dht_clients.c:1039
-#: src/dht/gnunet-service-xdht_clients.c:498
+#: src/dht/gnunet-service-dht_clients.c:1040
+#: src/dht/gnunet-service-xdht_clients.c:503
msgid "# Key match, type mismatches in REPLY to CLIENT"
msgstr ""
-#: src/dht/gnunet-service-dht_clients.c:1052
-#: src/dht/gnunet-service-xdht_clients.c:511
+#: src/dht/gnunet-service-dht_clients.c:1053
+#: src/dht/gnunet-service-xdht_clients.c:517
msgid "# Duplicate REPLIES to CLIENT request dropped"
msgstr ""
-#: src/dht/gnunet-service-dht_clients.c:1089
-#: src/dht/gnunet-service-xdht_clients.c:548
+#: src/dht/gnunet-service-dht_clients.c:1098
+#: src/dht/gnunet-service-xdht_clients.c:559
#, c-format
msgid "Unsupported block type (%u) in request!\n"
msgstr ""
-#: src/dht/gnunet-service-dht_clients.c:1112
-#: src/dht/gnunet-service-xdht_clients.c:571
+#: src/dht/gnunet-service-dht_clients.c:1121
+#: src/dht/gnunet-service-xdht_clients.c:582
msgid "# RESULTS queued for clients"
msgstr ""
-#: src/dht/gnunet-service-dht_clients.c:1166
-#: src/dht/gnunet-service-dht_clients.c:1209
-#: src/dht/gnunet-service-xdht_clients.c:625
-#: src/dht/gnunet-service-xdht_clients.c:668
+#: src/dht/gnunet-service-dht_clients.c:1175
+#: src/dht/gnunet-service-dht_clients.c:1218
+#: src/dht/gnunet-service-xdht_clients.c:636
+#: src/dht/gnunet-service-xdht_clients.c:679
msgid "# REPLIES ignored for CLIENTS (no match)"
msgstr ""
-#: src/dht/gnunet-service-dht_clients.c:1176
-#: src/dht/gnunet-service-xdht_clients.c:635
+#: src/dht/gnunet-service-dht_clients.c:1185
+#: src/dht/gnunet-service-xdht_clients.c:646
msgid "Could not pass reply to client, message too big!\n"
msgstr ""
-#: src/dht/gnunet-service-dht_datacache.c:68
-#: src/dht/gnunet-service-xdht_datacache.c:68
+#: src/dht/gnunet-service-dht_datacache.c:69
+#: src/dht/gnunet-service-xdht_datacache.c:71
#, c-format
msgid "%s request received, but have no datacache!\n"
msgstr ""
-#: src/dht/gnunet-service-dht_datacache.c:78
-#: src/dht/gnunet-service-xdht_datacache.c:78
+#: src/dht/gnunet-service-dht_datacache.c:79
+#: src/dht/gnunet-service-xdht_datacache.c:82
msgid "# ITEMS stored in datacache"
msgstr ""
-#: src/dht/gnunet-service-dht_datacache.c:165
-#: src/dht/gnunet-service-xdht_datacache.c:165
+#: src/dht/gnunet-service-dht_datacache.c:176
+#: src/dht/gnunet-service-xdht_datacache.c:230
msgid "# Good RESULTS found in datacache"
msgstr ""
-#: src/dht/gnunet-service-dht_datacache.c:176
-#: src/dht/gnunet-service-xdht_datacache.c:176
+#: src/dht/gnunet-service-dht_datacache.c:193
+#: src/dht/gnunet-service-xdht_datacache.c:253
msgid "# Duplicate RESULTS found in datacache"
msgstr ""
-#: src/dht/gnunet-service-dht_datacache.c:182
-#: src/dht/gnunet-service-xdht_datacache.c:182
+#: src/dht/gnunet-service-dht_datacache.c:199
+#: src/dht/gnunet-service-xdht_datacache.c:259
msgid "# Invalid RESULTS found in datacache"
msgstr ""
-#: src/dht/gnunet-service-dht_datacache.c:188
-#: src/dht/gnunet-service-xdht_datacache.c:188
+#: src/dht/gnunet-service-dht_datacache.c:205
+#: src/dht/gnunet-service-xdht_datacache.c:265
msgid "# Irrelevant RESULTS found in datacache"
msgstr ""
-#: src/dht/gnunet-service-dht_datacache.c:200
-#: src/dht/gnunet-service-xdht_datacache.c:200
+#: src/dht/gnunet-service-dht_datacache.c:217
+#: src/dht/gnunet-service-xdht_datacache.c:277
msgid "# Unsupported RESULTS found in datacache"
msgstr ""
-#: src/dht/gnunet-service-dht_datacache.c:203
-#: src/dht/gnunet-service-xdht_datacache.c:203
+#: src/dht/gnunet-service-dht_datacache.c:221
+#: src/dht/gnunet-service-xdht_datacache.c:280
#, c-format
msgid "Unsupported block type (%u) in local response!\n"
msgstr ""
-#: src/dht/gnunet-service-dht_datacache.c:234
-#: src/dht/gnunet-service-xdht_datacache.c:234
+#: src/dht/gnunet-service-dht_datacache.c:254
+#: src/dht/gnunet-service-xdht_datacache.c:318
msgid "# GET requests given to datacache"
msgstr ""
@@ -1909,110 +2112,119 @@
msgid "# HELLOs obtained from peerinfo"
msgstr ""
-#: src/dht/gnunet-service-dht_neighbours.c:516
+#: src/dht/gnunet-service-dht_neighbours.c:515
msgid "# Preference updates given to core"
msgstr ""
-#: src/dht/gnunet-service-dht_neighbours.c:610
+#: src/dht/gnunet-service-dht_neighbours.c:609
msgid "# FIND PEER messages initiated"
msgstr ""
-#: src/dht/gnunet-service-dht_neighbours.c:764
+#: src/dht/gnunet-service-dht_neighbours.c:763
+#: src/dht/gnunet-service-xdht_neighbours.c:6060
msgid "# Queued messages discarded (peer disconnected)"
msgstr ""
-#: src/dht/gnunet-service-dht_neighbours.c:819
-#: src/dht/gnunet-service-xdht_neighbours.c:703
+#: src/dht/gnunet-service-dht_neighbours.c:793
+#: src/dht/gnunet-service-xdht_neighbours.c:987
+msgid "# Messages dropped (CORE timeout)"
+msgstr ""
+
+#: src/dht/gnunet-service-dht_neighbours.c:823
+#: src/dht/gnunet-service-xdht_neighbours.c:1019
msgid "# Bytes transmitted to other peers"
msgstr ""
-#: src/dht/gnunet-service-dht_neighbours.c:857
-#: src/dht/gnunet-service-xdht_neighbours.c:742
+#: src/dht/gnunet-service-dht_neighbours.c:861
msgid "# Bytes of bandwidth requested from core"
msgstr ""
-#: src/dht/gnunet-service-dht_neighbours.c:889
+#: src/dht/gnunet-service-dht_neighbours.c:893
msgid "# requests TTL-dropped"
msgstr ""
-#: src/dht/gnunet-service-dht_neighbours.c:1093
-#: src/dht/gnunet-service-dht_neighbours.c:1130
+#: src/dht/gnunet-service-dht_neighbours.c:1097
+#: src/dht/gnunet-service-dht_neighbours.c:1134
msgid "# Peers excluded from routing due to Bloomfilter"
msgstr ""
-#: src/dht/gnunet-service-dht_neighbours.c:1108
-#: src/dht/gnunet-service-dht_neighbours.c:1145
+#: src/dht/gnunet-service-dht_neighbours.c:1112
+#: src/dht/gnunet-service-dht_neighbours.c:1149
msgid "# Peer selection failed"
msgstr ""
-#: src/dht/gnunet-service-dht_neighbours.c:1287
+#: src/dht/gnunet-service-dht_neighbours.c:1293
msgid "# PUT requests routed"
msgstr ""
-#: src/dht/gnunet-service-dht_neighbours.c:1316
+#: src/dht/gnunet-service-dht_neighbours.c:1322
msgid "# PUT messages queued for transmission"
msgstr ""
-#: src/dht/gnunet-service-dht_neighbours.c:1323
-#: src/dht/gnunet-service-dht_neighbours.c:1440
-#: src/dht/gnunet-service-dht_neighbours.c:1543
-#: src/dht/gnunet-service-xdht_neighbours.c:794
-#: src/dht/gnunet-service-xdht_neighbours.c:860
-#: src/dht/gnunet-service-xdht_neighbours.c:919
-#: src/dht/gnunet-service-xdht_neighbours.c:981
-#: src/dht/gnunet-service-xdht_neighbours.c:1041
+#: src/dht/gnunet-service-dht_neighbours.c:1332
+#: src/dht/gnunet-service-dht_neighbours.c:1456
+#: src/dht/gnunet-service-dht_neighbours.c:1561
+#: src/dht/gnunet-service-xdht_neighbours.c:1129
+#: src/dht/gnunet-service-xdht_neighbours.c:1198
+#: src/dht/gnunet-service-xdht_neighbours.c:1248
+#: src/dht/gnunet-service-xdht_neighbours.c:1312
+#: src/dht/gnunet-service-xdht_neighbours.c:1379
+#: src/dht/gnunet-service-xdht_neighbours.c:1441
+#: src/dht/gnunet-service-xdht_neighbours.c:1503
+#: src/dht/gnunet-service-xdht_neighbours.c:1565
+#: src/dht/gnunet-service-xdht_neighbours.c:1625
msgid "# P2P messages dropped due to full queue"
msgstr ""
-#: src/dht/gnunet-service-dht_neighbours.c:1405
+#: src/dht/gnunet-service-dht_neighbours.c:1418
msgid "# GET requests routed"
msgstr ""
-#: src/dht/gnunet-service-dht_neighbours.c:1432
+#: src/dht/gnunet-service-dht_neighbours.c:1445
msgid "# GET messages queued for transmission"
msgstr ""
-#: src/dht/gnunet-service-dht_neighbours.c:1550
+#: src/dht/gnunet-service-dht_neighbours.c:1568
msgid "# RESULT messages queued for transmission"
msgstr ""
-#: src/dht/gnunet-service-dht_neighbours.c:1636
+#: src/dht/gnunet-service-dht_neighbours.c:1655
msgid "# P2P PUT requests received"
msgstr ""
-#: src/dht/gnunet-service-dht_neighbours.c:1639
+#: src/dht/gnunet-service-dht_neighbours.c:1658
msgid "# P2P PUT bytes received"
msgstr ""
-#: src/dht/gnunet-service-dht_neighbours.c:1803
+#: src/dht/gnunet-service-dht_neighbours.c:1826
msgid "# FIND PEER requests ignored due to Bloomfilter"
msgstr ""
-#: src/dht/gnunet-service-dht_neighbours.c:1811
+#: src/dht/gnunet-service-dht_neighbours.c:1834
msgid "# FIND PEER requests ignored due to lack of HELLO"
msgstr ""
-#: src/dht/gnunet-service-dht_neighbours.c:1904
+#: src/dht/gnunet-service-dht_neighbours.c:1929
msgid "# P2P GET requests received"
msgstr ""
-#: src/dht/gnunet-service-dht_neighbours.c:1907
+#: src/dht/gnunet-service-dht_neighbours.c:1932
msgid "# P2P GET bytes received"
msgstr ""
-#: src/dht/gnunet-service-dht_neighbours.c:1961
+#: src/dht/gnunet-service-dht_neighbours.c:1997
msgid "# P2P FIND PEER requests processed"
msgstr ""
-#: src/dht/gnunet-service-dht_neighbours.c:1975
+#: src/dht/gnunet-service-dht_neighbours.c:2011
msgid "# P2P GET requests ONLY routed"
msgstr ""
-#: src/dht/gnunet-service-dht_neighbours.c:2052
+#: src/dht/gnunet-service-dht_neighbours.c:2096
msgid "# P2P RESULTS received"
msgstr ""
-#: src/dht/gnunet-service-dht_neighbours.c:2055
+#: src/dht/gnunet-service-dht_neighbours.c:2099
msgid "# P2P RESULT bytes received"
msgstr ""
@@ -2020,76 +2232,161 @@
msgid "# Network size estimates received"
msgstr ""
-#: src/dht/gnunet-service-dht_routing.c:211
+#: src/dht/gnunet-service-dht_routing.c:218
msgid "# Good REPLIES matched against routing table"
msgstr ""
-#: src/dht/gnunet-service-dht_routing.c:220
+#: src/dht/gnunet-service-dht_routing.c:227
msgid "# Duplicate REPLIES matched against routing table"
msgstr ""
-#: src/dht/gnunet-service-dht_routing.c:226
+#: src/dht/gnunet-service-dht_routing.c:233
msgid "# Invalid REPLIES matched against routing table"
msgstr ""
-#: src/dht/gnunet-service-dht_routing.c:232
+#: src/dht/gnunet-service-dht_routing.c:239
msgid "# Irrelevant REPLIES matched against routing table"
msgstr ""
-#: src/dht/gnunet-service-dht_routing.c:244
+#: src/dht/gnunet-service-dht_routing.c:251
msgid "# Unsupported REPLIES matched against routing table"
msgstr ""
-#: src/dht/gnunet-service-dht_routing.c:317
+#: src/dht/gnunet-service-dht_routing.c:324
msgid "# Entries removed from routing table"
msgstr ""
-#: src/dht/gnunet-service-dht_routing.c:399
+#: src/dht/gnunet-service-dht_routing.c:406
msgid "# Entries added to routing table"
msgstr ""
-#: src/dht/gnunet-service-dht_routing.c:417
+#: src/dht/gnunet-service-dht_routing.c:424
msgid "# DHT requests combined"
msgstr ""
-#: src/dht/gnunet-service-xdht_neighbours.c:1398
+#: src/dht/gnunet-service-xdht_neighbours.c:1832
#, c-format
msgid ""
"\n"
-"SUPU %s, %s, %d,my_identity = %s"
+"SUPU %s, %s, %d,trail_length = %d"
msgstr ""
-#: src/dht/gnunet-service-xdht_neighbours.c:1514
-#: src/dht/gnunet-service-xdht_neighbours.c:1524
-#: src/dht/gnunet-service-xdht_neighbours.c:1530
-#: src/dht/gnunet-service-xdht_neighbours.c:1536
-#: src/dht/gnunet-service-xdht_neighbours.c:1545
+#: src/dht/gnunet-service-xdht_neighbours.c:1837
#, c-format
msgid ""
"\n"
-"SUPU %s, %s, %d"
+"SUPU %s, %s, %d,trail[%d]=%s"
msgstr ""
-#: src/dht/plugin_block_dht.c:138
+#: src/dht/gnunet-service-xdht_neighbours.c:1857
#, c-format
+msgid ""
+"\n"
+"SUPU************ FRIEND_PEERMAP of %s"
+msgstr ""
+
+#: src/dht/gnunet-service-xdht_neighbours.c:1867
+#, c-format
+msgid ""
+"\n"
+"SUPU %s, %s, %d, friend = %s, friend->trails_count = %d"
+msgstr ""
+
+#: src/dht/gnunet-service-xdht_neighbours.c:1888
+#, c-format
+msgid ""
+"\n"
+"SUPU************ FINGER_TABLE of %s"
+msgstr ""
+
+#: src/dht/gnunet-service-xdht_neighbours.c:1897
+#, c-format
+msgid ""
+"\n"
+"SUPU %s, %s, %d, finger_table[%d] = %s, trails_count = %d"
+msgstr ""
+
+#: src/dht/gnunet-service-xdht_neighbours.c:1904
+#, c-format
+msgid ""
+"\n"
+"SUPU %s, %s, %d, trail_id[%d]=%s"
+msgstr ""
+
+#: src/dht/gnunet-service-xdht_neighbours.c:1910
+#, c-format
+msgid ""
+"\n"
+"SUPU %s, %s, %d,trail[%d] = %s "
+msgstr ""
+
+#: src/dht/gnunet-service-xdht_neighbours.c:3559
+msgid "# FINGERS_COUNT"
+msgstr ""
+
+#: src/dht/gnunet-service-xdht_neighbours.c:3700
+#: src/dht/gnunet-service-xdht_neighbours.c:3938
+#: src/dht/gnunet-service-xdht_neighbours.c:4090
+#: src/dht/gnunet-service-xdht_neighbours.c:4240
+#: src/dht/gnunet-service-xdht_neighbours.c:4421
+#: src/dht/gnunet-service-xdht_neighbours.c:4934
+#: src/dht/gnunet-service-xdht_neighbours.c:5327
+#: src/dht/gnunet-service-xdht_neighbours.c:5420
+#: src/dht/gnunet-service-xdht_neighbours.c:5510
+#: src/dht/gnunet-service-xdht_neighbours.c:5614
+#: src/dht/gnunet-service-xdht_neighbours.c:5758
+#: src/dht/gnunet-service-xdht_neighbours.c:5847
+msgid "# Bytes received from other peers"
+msgstr ""
+
+#: src/dht/gnunet-service-xdht_routing.c:256
+#, c-format
+msgid ""
+"\n"
+"SUPU ***PRINTING ROUTING TABLE ***** of =%s"
+msgstr ""
+
+#: src/dht/gnunet-service-xdht_routing.c:264
+#, c-format
+msgid ""
+"\n"
+"SUPU %s, %s, %d, trail->trail_id = %s"
+msgstr ""
+
+#: src/dht/gnunet-service-xdht_routing.c:267
+#, c-format
+msgid ""
+"\n"
+"SUPU %s, %s, %d, trail->next_hop = %s"
+msgstr ""
+
+#: src/dht/gnunet-service-xdht_routing.c:270
+#, c-format
+msgid ""
+"\n"
+"SUPU %s, %s, %d, trail->prev_hop = %s"
+msgstr ""
+
+#: src/dht/plugin_block_dht.c:142
+#, c-format
msgid "Block not of type %u\n"
msgstr ""
-#: src/dht/plugin_block_dht.c:145
+#: src/dht/plugin_block_dht.c:149
msgid "Size mismatch for block\n"
msgstr ""
-#: src/dht/plugin_block_dht.c:155
+#: src/dht/plugin_block_dht.c:159
#, c-format
msgid "Block of type %u is malformed\n"
msgstr ""
-#: src/dns/dnsparser.c:257
+#: src/dns/dnsparser.c:254
#, c-format
msgid "Failed to convert DNS IDNA name `%s' to UTF-8: %s\n"
msgstr ""
-#: src/dns/dnsparser.c:856
+#: src/dns/dnsparser.c:818
#, c-format
msgid "Failed to convert UTF-8 name `%s' to DNS IDNA format: %s\n"
msgstr ""
@@ -2119,15 +2416,15 @@
msgid "Received DNS response that is too small (%u bytes)"
msgstr ""
-#: src/dns/gnunet-dns-monitor.c:355
+#: src/dns/gnunet-dns-monitor.c:352
msgid "only monitor DNS queries"
msgstr ""
-#: src/dns/gnunet-dns-monitor.c:358
+#: src/dns/gnunet-dns-monitor.c:355
msgid "only monitor DNS replies"
msgstr ""
-#: src/dns/gnunet-dns-monitor.c:369
+#: src/dns/gnunet-dns-monitor.c:366
msgid "Monitor DNS queries."
msgstr ""
@@ -2143,50 +2440,50 @@
msgid "Change DNS replies to point elsewhere."
msgstr ""
-#: src/dns/gnunet-service-dns.c:456
+#: src/dns/gnunet-service-dns.c:459
msgid "# DNS requests answered via TUN interface"
msgstr ""
-#: src/dns/gnunet-service-dns.c:603
+#: src/dns/gnunet-service-dns.c:606
msgid "# DNS exit failed (failed to open socket)"
msgstr ""
-#: src/dns/gnunet-service-dns.c:714
+#: src/dns/gnunet-service-dns.c:717
msgid "# External DNS response discarded (no matching request)"
msgstr ""
-#: src/dns/gnunet-service-dns.c:792
+#: src/dns/gnunet-service-dns.c:795
msgid "# Client response discarded (no matching request)"
msgstr ""
-#: src/dns/gnunet-service-dns.c:907
+#: src/dns/gnunet-service-dns.c:910
msgid "Received malformed IPv4-UDP packet on TUN interface.\n"
msgstr ""
-#: src/dns/gnunet-service-dns.c:923
+#: src/dns/gnunet-service-dns.c:926
msgid "Received malformed IPv6-UDP packet on TUN interface.\n"
msgstr ""
-#: src/dns/gnunet-service-dns.c:932
+#: src/dns/gnunet-service-dns.c:935
#, c-format
msgid "Got non-IP packet with %u bytes and protocol %u from TUN\n"
msgstr ""
-#: src/dns/gnunet-service-dns.c:942
+#: src/dns/gnunet-service-dns.c:945
msgid "# Non-DNS UDP packet received via TUN interface"
msgstr ""
-#: src/dns/gnunet-service-dns.c:1009
+#: src/dns/gnunet-service-dns.c:1012
msgid "# DNS requests received via TUN interface"
msgstr ""
-#: src/dns/gnunet-service-dns.c:1049 src/exit/gnunet-daemon-exit.c:3514
-#, c-format
-msgid "`%s' must be installed SUID, refusing to run\n"
+#: src/dns/gnunet-service-dns.c:1064 src/exit/gnunet-daemon-exit.c:3594
+msgid "need a valid IPv4 or IPv6 address\n"
msgstr ""
-#: src/dns/gnunet-service-dns.c:1069 src/exit/gnunet-daemon-exit.c:3571
-msgid "need a valid IPv4 or IPv6 address\n"
+#: src/dns/gnunet-service-dns.c:1082
+#, c-format
+msgid "`%s' must be installed SUID, will not run DNS interceptor\n"
msgstr ""
#: src/dv/gnunet-dv.c:169
@@ -2203,7 +2500,7 @@
msgstr ""
#: src/exit/gnunet-daemon-exit.c:853
-msgid "# Bytes transmitted via mesh channels"
+msgid "# Bytes transmitted via cadet channels"
msgstr ""
#: src/exit/gnunet-daemon-exit.c:970 src/exit/gnunet-daemon-exit.c:2397
@@ -2266,14 +2563,14 @@
msgstr ""
#: src/exit/gnunet-daemon-exit.c:1872
-msgid "# TCP service creation requests received via mesh"
+msgid "# TCP service creation requests received via cadet"
msgstr ""
#: src/exit/gnunet-daemon-exit.c:1875 src/exit/gnunet-daemon-exit.c:1968
#: src/exit/gnunet-daemon-exit.c:2073 src/exit/gnunet-daemon-exit.c:2321
#: src/exit/gnunet-daemon-exit.c:2570 src/exit/gnunet-daemon-exit.c:2859
#: src/exit/gnunet-daemon-exit.c:2966
-msgid "# Bytes received from MESH"
+msgid "# Bytes received from CADET"
msgstr ""
#: src/exit/gnunet-daemon-exit.c:1909 src/exit/gnunet-daemon-exit.c:2990
@@ -2286,11 +2583,11 @@
msgstr ""
#: src/exit/gnunet-daemon-exit.c:1971
-msgid "# TCP IP-exit creation requests received via mesh"
+msgid "# TCP IP-exit creation requests received via cadet"
msgstr ""
#: src/exit/gnunet-daemon-exit.c:2076
-msgid "# TCP data requests received via mesh"
+msgid "# TCP data requests received via cadet"
msgstr ""
#: src/exit/gnunet-daemon-exit.c:2090
@@ -2302,11 +2599,11 @@
msgstr ""
#: src/exit/gnunet-daemon-exit.c:2324
-msgid "# ICMP IP-exit requests received via mesh"
+msgid "# ICMP IP-exit requests received via cadet"
msgstr ""
#: src/exit/gnunet-daemon-exit.c:2573
-msgid "# ICMP service requests received via mesh"
+msgid "# ICMP service requests received via cadet"
msgstr ""
#: src/exit/gnunet-daemon-exit.c:2639 src/vpn/gnunet-service-vpn.c:1397
@@ -2324,11 +2621,11 @@
msgstr ""
#: src/exit/gnunet-daemon-exit.c:2862
-msgid "# UDP IP-exit requests received via mesh"
+msgid "# UDP IP-exit requests received via cadet"
msgstr ""
#: src/exit/gnunet-daemon-exit.c:2969
-msgid "# UDP service requests received via mesh"
+msgid "# UDP service requests received via cadet"
msgstr ""
#: src/exit/gnunet-daemon-exit.c:2995
@@ -2336,300 +2633,190 @@
msgstr ""
#: src/exit/gnunet-daemon-exit.c:3031
-msgid "# Inbound MESH channels created"
+msgid "# Inbound CADET channels created"
msgstr ""
-#: src/exit/gnunet-daemon-exit.c:3235 src/exit/gnunet-daemon-exit.c:3245
+#: src/exit/gnunet-daemon-exit.c:3255 src/exit/gnunet-daemon-exit.c:3265
#, c-format
msgid "Option `%s' for domain `%s' is not formatted correctly!\n"
msgstr ""
-#: src/exit/gnunet-daemon-exit.c:3259 src/exit/gnunet-daemon-exit.c:3267
+#: src/exit/gnunet-daemon-exit.c:3279 src/exit/gnunet-daemon-exit.c:3287
#, c-format
msgid "`%s' is not a valid port number (for domain `%s')!"
msgstr ""
-#: src/exit/gnunet-daemon-exit.c:3300
+#: src/exit/gnunet-daemon-exit.c:3320
#, c-format
msgid "No addresses found for hostname `%s' of service `%s'!\n"
msgstr ""
-#: src/exit/gnunet-daemon-exit.c:3314 src/exit/gnunet-daemon-exit.c:3326
+#: src/exit/gnunet-daemon-exit.c:3334 src/exit/gnunet-daemon-exit.c:3346
#, c-format
msgid "Service `%s' configured for IPv4, but IPv4 is disabled!\n"
msgstr ""
-#: src/exit/gnunet-daemon-exit.c:3337
+#: src/exit/gnunet-daemon-exit.c:3357
#, c-format
msgid "No IP addresses found for hostname `%s' of service `%s'!\n"
msgstr ""
-#: src/exit/gnunet-daemon-exit.c:3527
-msgid "This system does not support IPv4, will disable IPv4 functions despite
them being enabled in the configuration\n"
+#: src/exit/gnunet-daemon-exit.c:3534
+#, c-format
+msgid "`%s' must be installed SUID, EXIT will not work\n"
msgstr ""
-#: src/exit/gnunet-daemon-exit.c:3535
-msgid "This system does not support IPv6, will disable IPv6 functions despite
them being enabled in the configuration\n"
+#: src/exit/gnunet-daemon-exit.c:3550
+msgid ""
+"This system does not support IPv4, will disable IPv4 functions despite them "
+"being enabled in the configuration\n"
msgstr ""
-#: src/exit/gnunet-daemon-exit.c:3542
-msgid "Cannot enable IPv4 exit but disable IPv4 on TUN interface, will use
ENABLE_IPv4=YES\n"
+#: src/exit/gnunet-daemon-exit.c:3558
+msgid ""
+"This system does not support IPv6, will disable IPv6 functions despite them "
+"being enabled in the configuration\n"
msgstr ""
-#: src/exit/gnunet-daemon-exit.c:3548
-msgid "Cannot enable IPv6 exit but disable IPv6 on TUN interface, will use
ENABLE_IPv6=YES\n"
+#: src/exit/gnunet-daemon-exit.c:3565
+msgid ""
+"Cannot enable IPv4 exit but disable IPv4 on TUN interface, will use "
+"ENABLE_IPv4=YES\n"
msgstr ""
-#: src/exit/gnunet-daemon-exit.c:3554 src/exit/gnunet-daemon-exit.c:3717
+#: src/exit/gnunet-daemon-exit.c:3571
+msgid ""
+"Cannot enable IPv6 exit but disable IPv6 on TUN interface, will use "
+"ENABLE_IPv6=YES\n"
+msgstr ""
+
+#: src/exit/gnunet-daemon-exit.c:3577 src/exit/gnunet-daemon-exit.c:3742
#: src/pt/gnunet-daemon-pt.c:1247
msgid "No useful service enabled. Exiting.\n"
msgstr ""
-#: src/exit/gnunet-daemon-exit.c:3664
+#: src/exit/gnunet-daemon-exit.c:3689
msgid "Must be a number"
msgstr ""
-#: src/exit/gnunet-daemon-exit.c:3813
+#: src/exit/gnunet-daemon-exit.c:3838
msgid "Daemon to run to provide an IP exit node for the VPN"
msgstr ""
-#: src/experimentation/gnunet-daemon-experimentation.c:55
-msgid "Experimentation daemon shutting down ...\n"
-msgstr ""
-
-#: src/experimentation/gnunet-daemon-experimentation.c:77
-msgid "Experimentation daemon starting ...\n"
-msgstr ""
-
-#: src/experimentation/gnunet-daemon-experimentation.c:83
-msgid "Failed to create statistics!\n"
-msgstr ""
-
-#: src/experimentation/gnunet-daemon-experimentation.c:120
-msgid "GNUnet experimentation daemon"
-msgstr ""
-
-#: src/experimentation/gnunet-daemon-experimentation_experiments.c:241
-#, c-format
-msgid "Experiment `%s': Experiment signature is invalid\n"
-msgstr ""
-
-#: src/experimentation/gnunet-daemon-experimentation_experiments.c:250
-#, c-format
-msgid "Adding experiment `%s' running from `%s' to `%s' every %llu sec. for
%llu sec. \n"
-msgstr ""
-
-#: src/experimentation/gnunet-daemon-experimentation_experiments.c:303
-#, c-format
-msgid "Experiment `%s': Issuer missing\n"
-msgstr ""
-
-#: src/experimentation/gnunet-daemon-experimentation_experiments.c:312
-#, c-format
-msgid "Experiment `%s': Issuer invalid\n"
-msgstr ""
-
-#: src/experimentation/gnunet-daemon-experimentation_experiments.c:320
-#, c-format
-msgid "Experiment `%s': Issuer not accepted!\n"
-msgstr ""
-
-#: src/experimentation/gnunet-daemon-experimentation_experiments.c:330
-#, c-format
-msgid "Experiment `%s': Version missing or invalid \n"
-msgstr ""
-
-#: src/experimentation/gnunet-daemon-experimentation_experiments.c:339
-#, c-format
-msgid "Experiment `%s': Required capabilities missing \n"
-msgstr ""
-
-#: src/experimentation/gnunet-daemon-experimentation_experiments.c:345
-#, c-format
-msgid "Experiment `%s': Required capabilities invalid \n"
-msgstr ""
-
-#: src/experimentation/gnunet-daemon-experimentation_experiments.c:390
-#, c-format
-msgid "Failed to parse file `%s'\n"
-msgstr ""
-
-#: src/experimentation/gnunet-daemon-experimentation_experiments.c:420
-#: src/experimentation/gnunet-daemon-experimentation_experiments.c:452
-msgid "No valid experiment issuers configured! Set value to public keys of
issuers! Exiting.\n"
-msgstr ""
-
-#: src/experimentation/gnunet-daemon-experimentation_experiments.c:435
-msgid "Invalid value for public key\n"
-msgstr ""
-
-#: src/experimentation/gnunet-daemon-experimentation_experiments.c:473
-#, c-format
-msgid "Cannot read experiments file `%s'\n"
-msgstr ""
-
-#: src/experimentation/gnunet-daemon-experimentation_nodes.c:221
-#, c-format
-msgid "Cannot send message to peer `%s' for experiment `%s'\n"
-msgstr ""
-
-#: src/experimentation/gnunet-daemon-experimentation_nodes.c:309
-#, c-format
-msgid "Sending experimentation request to peer %s\n"
-msgstr ""
-
-#: src/experimentation/gnunet-daemon-experimentation_nodes.c:453
-#, c-format
-msgid "Added peer `%s' as active node\n"
-msgstr ""
-
-#: src/experimentation/gnunet-daemon-experimentation_nodes.c:891
-#, c-format
-msgid "Connected to peer %s\n"
-msgstr ""
-
-#: src/experimentation/gnunet-daemon-experimentation_nodes.c:921
-#, c-format
-msgid "Disconnected from peer %s\n"
-msgstr ""
-
-#: src/experimentation/gnunet-daemon-experimentation_nodes.c:1104
-msgid "Failed to connect to CORE service!\n"
-msgstr ""
-
-#: src/experimentation/gnunet-daemon-experimentation_scheduler.c:108
-#, c-format
-msgid "Peer `%s' did not respond to request for experiment `%s'\n"
-msgstr ""
-
-#: src/experimentation/gnunet-daemon-experimentation_scheduler.c:143
-#, c-format
-msgid "Starting inbound experiment `%s' with peer `%s'\n"
-msgstr ""
-
-#: src/experimentation/gnunet-daemon-experimentation_scheduler.c:276
-#, c-format
-msgid "Starting outbound experiment `%s' with peer `%s'\n"
-msgstr ""
-
-#: src/experimentation/gnunet-daemon-experimentation_scheduler.c:294
-#, c-format
-msgid "Received %s message from peer %s for experiment `%s'\n"
-msgstr ""
-
-#: src/fragmentation/defragmentation.c:270
+#: src/fragmentation/defragmentation.c:277
msgid "# acknowledgements sent for fragment"
msgstr ""
-#: src/fragmentation/defragmentation.c:456
+#: src/fragmentation/defragmentation.c:470
+#: src/transport/plugin_transport_wlan.c:1515
msgid "# fragments received"
msgstr ""
-#: src/fragmentation/defragmentation.c:521
+#: src/fragmentation/defragmentation.c:540
msgid "# duplicate fragments received"
msgstr ""
-#: src/fragmentation/defragmentation.c:534
+#: src/fragmentation/defragmentation.c:558
msgid "# messages defragmented"
msgstr ""
-#: src/fragmentation/fragmentation.c:208
+#: src/fragmentation/fragmentation.c:235
msgid "# fragments transmitted"
msgstr ""
-#: src/fragmentation/fragmentation.c:211
+#: src/fragmentation/fragmentation.c:240
msgid "# fragments retransmitted"
msgstr ""
-#: src/fragmentation/fragmentation.c:237
+#: src/fragmentation/fragmentation.c:269
msgid "# fragments wrap arounds"
msgstr ""
-#: src/fragmentation/fragmentation.c:281
+#: src/fragmentation/fragmentation.c:315
msgid "# messages fragmented"
msgstr ""
-#: src/fragmentation/fragmentation.c:284
+#: src/fragmentation/fragmentation.c:321
msgid "# total size of fragmented messages"
msgstr ""
-#: src/fragmentation/fragmentation.c:405
+#: src/fragmentation/fragmentation.c:444
msgid "# fragment acknowledgements received"
msgstr ""
-#: src/fragmentation/fragmentation.c:411
+#: src/fragmentation/fragmentation.c:451
msgid "# bits removed from fragmentation ACKs"
msgstr ""
-#: src/fragmentation/fragmentation.c:435
+#: src/fragmentation/fragmentation.c:475
msgid "# fragmentation transmissions completed"
msgstr ""
-#: src/fs/fs_api.c:465
+#: src/fs/fs_api.c:491
#, c-format
msgid "Could not open file `%s': %s"
msgstr ""
-#: src/fs/fs_api.c:474
+#: src/fs/fs_api.c:502
#, c-format
msgid "Could not read file `%s': %s"
msgstr ""
-#: src/fs/fs_api.c:480
+#: src/fs/fs_api.c:510
#, c-format
msgid "Short read reading from file `%s'!"
msgstr ""
-#: src/fs/fs_api.c:1066
+#: src/fs/fs_api.c:1118
#, c-format
msgid "Failed to resume publishing information `%s': %s\n"
msgstr ""
-#: src/fs/fs_api.c:1571
+#: src/fs/fs_api.c:1638
#, c-format
msgid "Failure while resuming publishing operation `%s': %s\n"
msgstr ""
-#: src/fs/fs_api.c:1585
+#: src/fs/fs_api.c:1652
#, c-format
msgid "Failed to resume publishing operation `%s': %s\n"
msgstr ""
-#: src/fs/fs_api.c:2242
+#: src/fs/fs_api.c:2310
#, c-format
msgid "Failure while resuming unindexing operation `%s': %s\n"
msgstr ""
-#: src/fs/fs_api.c:2252
+#: src/fs/fs_api.c:2320
#, c-format
msgid "Failed to resume unindexing operation `%s': %s\n"
msgstr ""
-#: src/fs/fs_api.c:2378 src/fs/fs_api.c:2619
+#: src/fs/fs_api.c:2448 src/fs/fs_api.c:2696
#, c-format
msgid "Failed to resume sub-download `%s': %s\n"
msgstr ""
-#: src/fs/fs_api.c:2395
+#: src/fs/fs_api.c:2466
#, c-format
msgid "Failed to resume sub-search `%s': %s\n"
msgstr ""
-#: src/fs/fs_api.c:2409 src/fs/fs_api.c:2428 src/fs/fs_api.c:2911
+#: src/fs/fs_api.c:2481 src/fs/fs_api.c:2500 src/fs/fs_api.c:2992
#, c-format
msgid "Failure while resuming search operation `%s': %s\n"
msgstr ""
-#: src/fs/fs_api.c:2610
+#: src/fs/fs_api.c:2686
#, c-format
msgid "Failed to resume sub-download `%s': could not open file `%s'\n"
msgstr ""
-#: src/fs/fs_api.c:2855
+#: src/fs/fs_api.c:2935
msgid "Could not resume running search, will resume as paused search\n"
msgstr ""
-#: src/fs/fs_api.c:2949
+#: src/fs/fs_api.c:3030
#, c-format
msgid "Failure while resuming download operation `%s': %s\n"
msgstr ""
@@ -2639,7 +2826,9 @@
msgstr ""
#: src/fs/fs_download.c:322
-msgid "Recursive downloads of directories larger than 4 GB are not supported
on 32-bit systems\n"
+msgid ""
+"Recursive downloads of directories larger than 4 GB are not supported on 32-"
+"bit systems\n"
msgstr ""
#: src/fs/fs_download.c:342
@@ -2658,7 +2847,9 @@
#: src/fs/fs_download.c:987
#, c-format
-msgid "Internal error or bogus download URI (expected %u bytes at depth %u and
offset %llu/%llu, got %u bytes)"
+msgid ""
+"Internal error or bogus download URI (expected %u bytes at depth %u and "
+"offset %llu/%llu, got %u bytes)"
msgstr ""
#: src/fs/fs_download.c:1013
@@ -2690,7 +2881,9 @@
#: src/fs/fs_getopt.c:192
#, c-format
-msgid "Unknown metadata type in metadata option `%s'. Using metadata type
`unknown' instead.\n"
+msgid ""
+"Unknown metadata type in metadata option `%s'. Using metadata type "
+"`unknown' instead.\n"
msgstr ""
#: src/fs/fs_list_indexed.c:90
@@ -2732,62 +2925,66 @@
msgid "Failed to connect to datastore."
msgstr ""
-#: src/fs/fs_publish.c:125 src/fs/fs_publish.c:415
+#: src/fs/fs_publish.c:126 src/fs/fs_publish.c:431
#, c-format
msgid "Publishing failed: %s"
msgstr ""
-#: src/fs/fs_publish.c:667 src/fs/fs_publish.c:684 src/fs/fs_publish.c:723
-#: src/fs/fs_publish.c:744 src/fs/fs_publish.c:768 src/fs/fs_publish.c:914
+#: src/fs/fs_publish.c:683 src/fs/fs_publish.c:700 src/fs/fs_publish.c:739
+#: src/fs/fs_publish.c:760 src/fs/fs_publish.c:784 src/fs/fs_publish.c:1034
#, c-format
msgid "Can not index file `%s': %s. Will try to insert instead.\n"
msgstr ""
-#: src/fs/fs_publish.c:669
+#: src/fs/fs_publish.c:685
msgid "timeout on index-start request to `fs' service"
msgstr ""
-#: src/fs/fs_publish.c:681
+#: src/fs/fs_publish.c:697
msgid "unknown error"
msgstr ""
-#: src/fs/fs_publish.c:725
+#: src/fs/fs_publish.c:741
msgid "failed to compute hash"
msgstr ""
-#: src/fs/fs_publish.c:745
+#: src/fs/fs_publish.c:761
msgid "filename too long"
msgstr ""
-#: src/fs/fs_publish.c:770
+#: src/fs/fs_publish.c:786
msgid "could not connect to `fs' service"
msgstr ""
-#: src/fs/fs_publish.c:793
+#: src/fs/fs_publish.c:809
#, c-format
msgid "Failed to get file identifiers for `%s'\n"
msgstr ""
-#: src/fs/fs_publish.c:862
+#: src/fs/fs_publish.c:873 src/fs/fs_publish.c:914
+msgid "Can not create LOC URI. Will continue with CHK instead.\n"
+msgstr ""
+
+#: src/fs/fs_publish.c:988
#, c-format
msgid "Recursive upload failed at `%s': %s"
msgstr ""
-#: src/fs/fs_publish.c:868
+#: src/fs/fs_publish.c:996
#, c-format
msgid "Recursive upload failed: %s"
msgstr ""
-#: src/fs/fs_publish.c:915
+#: src/fs/fs_publish.c:1036
msgid "needs to be an actual file"
msgstr ""
-#: src/fs/fs_publish.c:1151
+#: src/fs/fs_publish.c:1272
#, c-format
msgid "Insufficient space for publishing: %s"
msgstr ""
-#: src/fs/fs_publish.c:1243
+#: src/fs/fs_publish.c:1363
#, c-format
msgid "Reserving space for %u entries and %llu bytes for publication\n"
msgstr ""
@@ -2796,196 +2993,212 @@
msgid "Could not connect to datastore."
msgstr ""
-#: src/fs/fs_publish_ublock.c:219
+#: src/fs/fs_publish_ublock.c:243
msgid "Internal error."
msgstr ""
-#: src/fs/fs_search.c:813
+#: src/fs/fs_search.c:812 src/fs/fs_search.c:882
#, c-format
msgid "Failed to parse URI `%s': %s\n"
msgstr ""
-#: src/fs/fs_search.c:872
+#: src/fs/fs_search.c:941
#, c-format
msgid "Got result with unknown block type `%d', ignoring"
msgstr ""
-#: src/fs/fs_unindex.c:59
+#: src/fs/fs_unindex.c:63
msgid "Failed to find given position in file"
msgstr ""
-#: src/fs/fs_unindex.c:64
+#: src/fs/fs_unindex.c:68
msgid "Failed to read file"
msgstr ""
-#: src/fs/fs_unindex.c:234
+#: src/fs/fs_unindex.c:245
msgid "Unexpected time for a response from `fs' service."
msgstr ""
-#: src/fs/fs_unindex.c:242
+#: src/fs/fs_unindex.c:253
msgid "Timeout waiting for `fs' service."
msgstr ""
-#: src/fs/fs_unindex.c:250
+#: src/fs/fs_unindex.c:261
msgid "Invalid response from `fs' service."
msgstr ""
-#: src/fs/fs_unindex.c:291
+#: src/fs/fs_unindex.c:304
msgid "Failed to connect to FS service for unindexing."
msgstr ""
-#: src/fs/fs_unindex.c:347 src/fs/fs_unindex.c:359
+#: src/fs/fs_unindex.c:360 src/fs/fs_unindex.c:372
msgid "Failed to get KSKs from directory scan."
msgstr ""
-#: src/fs/fs_unindex.c:355
+#: src/fs/fs_unindex.c:368
#, c-format
msgid "Internal error scanning `%s'.\n"
msgstr ""
-#: src/fs/fs_unindex.c:414
+#: src/fs/fs_unindex.c:427
#, c-format
msgid "Failed to remove UBlock: %s\n"
msgstr ""
-#: src/fs/fs_unindex.c:562 src/fs/fs_unindex.c:626
+#: src/fs/fs_unindex.c:590 src/fs/fs_unindex.c:656
msgid "Failed to connect to `datastore' service."
msgstr ""
-#: src/fs/fs_unindex.c:639
+#: src/fs/fs_unindex.c:669
msgid "Failed to open file for unindexing."
msgstr ""
-#: src/fs/fs_unindex.c:673
+#: src/fs/fs_unindex.c:708
msgid "Failed to compute hash of file."
msgstr ""
-#: src/fs/fs_uri.c:222
+#: src/fs/fs_uri.c:223
#, no-c-format
-msgid "`%' must be followed by HEX number"
+msgid "Malformed KSK URI (`%' must be followed by HEX number)"
msgstr ""
-#: src/fs/fs_uri.c:281
+#: src/fs/fs_uri.c:282
msgid "Malformed KSK URI (must not begin or end with `+')"
msgstr ""
-#: src/fs/fs_uri.c:299
-msgid "`++' not allowed in KSK URI"
+#: src/fs/fs_uri.c:300
+msgid "Malformed KSK URI (`++' not allowed)"
msgstr ""
-#: src/fs/fs_uri.c:306
-msgid "Quotes not balanced in KSK URI"
+#: src/fs/fs_uri.c:307
+msgid "Malformed KSK URI (quotes not balanced)"
msgstr ""
#: src/fs/fs_uri.c:376
-msgid "Malformed SKS URI"
+msgid "Malformed SKS URI (wrong syntax)"
msgstr ""
-#: src/fs/fs_uri.c:419 src/fs/fs_uri.c:434
-msgid "Malformed CHK URI"
+#: src/fs/fs_uri.c:417
+msgid "Malformed CHK URI (wrong syntax)"
msgstr ""
-#: src/fs/fs_uri.c:512 src/fs/fs_uri.c:580
-msgid "SKS URI malformed"
+#: src/fs/fs_uri.c:432
+msgid "Malformed CHK URI (failed to decode CHK)"
msgstr ""
-#: src/fs/fs_uri.c:527 src/fs/fs_uri.c:537
-msgid "LOC URI malformed"
+#: src/fs/fs_uri.c:511
+msgid "LOC URI malformed (wrong syntax)"
msgstr ""
-#: src/fs/fs_uri.c:545 src/fs/fs_uri.c:553
+#: src/fs/fs_uri.c:526
+msgid "LOC URI malformed (no CHK)"
+msgstr ""
+
+#: src/fs/fs_uri.c:536
+msgid "LOC URI malformed (missing LOC)"
+msgstr ""
+
+#: src/fs/fs_uri.c:544
+msgid "LOC URI malformed (wrong syntax for public key)"
+msgstr ""
+
+#: src/fs/fs_uri.c:552
msgid "LOC URI malformed (could not decode public key)"
msgstr ""
-#: src/fs/fs_uri.c:559
-msgid "SKS URI malformed (could not find signature)"
+#: src/fs/fs_uri.c:558
+msgid "LOC URI malformed (could not find signature)"
msgstr ""
-#: src/fs/fs_uri.c:565 src/fs/fs_uri.c:574
-msgid "SKS URI malformed (could not decode signature)"
+#: src/fs/fs_uri.c:564
+msgid "LOC URI malformed (wrong syntax for signature)"
msgstr ""
-#: src/fs/fs_uri.c:586
-msgid "SKS URI malformed (could not parse expiration time)"
+#: src/fs/fs_uri.c:573
+msgid "LOC URI malformed (could not decode signature)"
msgstr ""
-#: src/fs/fs_uri.c:598
-msgid "SKS URI malformed (signature failed validation)"
+#: src/fs/fs_uri.c:579
+msgid "LOC URI malformed (wrong syntax for expiration time)"
msgstr ""
-#: src/fs/fs_uri.c:636
-msgid "Unrecognized URI type"
+#: src/fs/fs_uri.c:585
+msgid "LOC URI malformed (could not parse expiration time)"
msgstr ""
-#: src/fs/fs_uri.c:860
-msgid "Lacking key configuration settings.\n"
+#: src/fs/fs_uri.c:597
+msgid "LOC URI malformed (signature failed validation)"
msgstr ""
-#: src/fs/fs_uri.c:866
-#, c-format
-msgid "Could not access hostkey file `%s'.\n"
+#: src/fs/fs_uri.c:631
+msgid "invalid argument"
msgstr ""
-#: src/fs/fs_uri.c:1050 src/fs/fs_uri.c:1077
+#: src/fs/fs_uri.c:643
+msgid "Unrecognized URI type"
+msgstr ""
+
+#: src/fs/fs_uri.c:1045 src/fs/fs_uri.c:1072
msgid "No keywords specified!\n"
msgstr ""
-#: src/fs/fs_uri.c:1083
+#: src/fs/fs_uri.c:1078
msgid "Number of double-quotes not balanced!\n"
msgstr ""
-#: src/fs/gnunet-auto-share.c:236
+#: src/fs/gnunet-auto-share.c:237
#, c-format
msgid "Failed to load state: %s\n"
msgstr ""
-#: src/fs/gnunet-auto-share.c:289 src/fs/gnunet-auto-share.c:299
-#: src/fs/gnunet-auto-share.c:309
+#: src/fs/gnunet-auto-share.c:290 src/fs/gnunet-auto-share.c:300
+#: src/fs/gnunet-auto-share.c:310
#, c-format
msgid "Failed to save state to file %s\n"
msgstr ""
-#: src/fs/gnunet-auto-share.c:401
+#: src/fs/gnunet-auto-share.c:402
#, c-format
msgid "Publication of `%s' done\n"
msgstr ""
-#: src/fs/gnunet-auto-share.c:488
+#: src/fs/gnunet-auto-share.c:490
#, c-format
msgid "Publishing `%s'\n"
msgstr ""
-#: src/fs/gnunet-auto-share.c:497
+#: src/fs/gnunet-auto-share.c:499
#, c-format
msgid "Failed to run `%s'\n"
msgstr ""
-#: src/fs/gnunet-auto-share.c:686
+#: src/fs/gnunet-auto-share.c:688
#, c-format
-msgid "You must specify one and only one directory name for automatic
publication.\n"
+msgid ""
+"You must specify one and only one directory name for automatic publication.\n"
msgstr ""
-#: src/fs/gnunet-auto-share.c:737 src/fs/gnunet-publish.c:824
+#: src/fs/gnunet-auto-share.c:739 src/fs/gnunet-publish.c:888
msgid "set the desired LEVEL of sender-anonymity"
msgstr ""
-#: src/fs/gnunet-auto-share.c:741 src/fs/gnunet-publish.c:828
+#: src/fs/gnunet-auto-share.c:743 src/fs/gnunet-publish.c:892
msgid "disable adding the creation time to the metadata of the uploaded file"
msgstr ""
-#: src/fs/gnunet-auto-share.c:744 src/fs/gnunet-publish.c:831
+#: src/fs/gnunet-auto-share.c:746 src/fs/gnunet-publish.c:895
msgid "do not use libextractor to add keywords or metadata"
msgstr ""
-#: src/fs/gnunet-auto-share.c:747 src/fs/gnunet-publish.c:855
+#: src/fs/gnunet-auto-share.c:749 src/fs/gnunet-publish.c:919
msgid "specify the priority of the content"
msgstr ""
-#: src/fs/gnunet-auto-share.c:750 src/fs/gnunet-publish.c:862
+#: src/fs/gnunet-auto-share.c:752 src/fs/gnunet-publish.c:926
msgid "set the desired replication LEVEL"
msgstr ""
-#: src/fs/gnunet-auto-share.c:770
+#: src/fs/gnunet-auto-share.c:772
msgid "Automatically publish files from a directory on GNUnet"
msgstr ""
@@ -3037,7 +3250,9 @@
#: src/fs/gnunet-download.c:157
#, c-format
-msgid "Downloading `%s' at %llu/%llu (%s remaining, %s/s). Block took %s to
download\n"
+msgid ""
+"Downloading `%s' at %llu/%llu (%s remaining, %s/s). Block took %s to "
+"download\n"
msgstr ""
#: src/fs/gnunet-download.c:179
@@ -3050,7 +3265,7 @@
msgid "Downloading `%s' done (%s/s).\n"
msgstr ""
-#: src/fs/gnunet-download.c:209 src/fs/gnunet-publish.c:286
+#: src/fs/gnunet-download.c:209 src/fs/gnunet-publish.c:304
#: src/fs/gnunet-search.c:200 src/fs/gnunet-unindex.c:108
#, c-format
msgid "Unexpected status: %d\n"
@@ -3060,7 +3275,7 @@
msgid "You need to specify a URI argument.\n"
msgstr ""
-#: src/fs/gnunet-download.c:240 src/fs/gnunet-publish.c:665
+#: src/fs/gnunet-download.c:240 src/fs/gnunet-publish.c:714
#, c-format
msgid "Failed to parse URI: %s\n"
msgstr ""
@@ -3073,7 +3288,7 @@
msgid "Target filename must be specified.\n"
msgstr ""
-#: src/fs/gnunet-download.c:268 src/fs/gnunet-publish.c:797
+#: src/fs/gnunet-download.c:268 src/fs/gnunet-publish.c:858
#: src/fs/gnunet-search.c:250 src/fs/gnunet-unindex.c:140
#, c-format
msgid "Could not initialize `%s' subsystem.\n"
@@ -3108,7 +3323,9 @@
msgstr ""
#: src/fs/gnunet-download.c:339
-msgid "Download files from GNUnet using a GNUnet CHK or LOC URI
(gnunet://fs/chk/...)"
+msgid ""
+"Download files from GNUnet using a GNUnet CHK or LOC URI (gnunet://fs/"
+"chk/...)"
msgstr ""
#: src/fs/gnunet-fs.c:117
@@ -3135,158 +3352,178 @@
msgid "run a testbed to measure file-sharing performance"
msgstr ""
-#: src/fs/gnunet-publish.c:231 src/fs/gnunet-publish.c:243
+#: src/fs/gnunet-publish.c:238 src/fs/gnunet-publish.c:250
#, c-format
msgid "Publishing `%s' at %llu/%llu (%s remaining)\n"
msgstr ""
-#: src/fs/gnunet-publish.c:250
+#: src/fs/gnunet-publish.c:257
#, c-format
msgid "Error publishing: %s.\n"
msgstr ""
-#: src/fs/gnunet-publish.c:260
+#: src/fs/gnunet-publish.c:268
#, c-format
msgid "Publishing `%s' done.\n"
msgstr ""
-#: src/fs/gnunet-publish.c:264
+#: src/fs/gnunet-publish.c:273
#, c-format
msgid "URI is `%s'.\n"
msgstr ""
-#: src/fs/gnunet-publish.c:283
+#: src/fs/gnunet-publish.c:281
+#, c-format
+msgid "Namespace URI is `%s'.\n"
+msgstr ""
+
+#: src/fs/gnunet-publish.c:301
msgid "Cleanup after abort complete.\n"
msgstr ""
-#: src/fs/gnunet-publish.c:401
+#: src/fs/gnunet-publish.c:427
#, c-format
msgid "Meta data for file `%s' (%s)\n"
msgstr ""
-#: src/fs/gnunet-publish.c:403
+#: src/fs/gnunet-publish.c:429
#, c-format
msgid "Keywords for file `%s' (%s)\n"
msgstr ""
-#: src/fs/gnunet-publish.c:542
+#: src/fs/gnunet-publish.c:574
msgid "Could not publish\n"
msgstr ""
-#: src/fs/gnunet-publish.c:565
+#: src/fs/gnunet-publish.c:599
msgid "Could not start publishing.\n"
msgstr ""
-#: src/fs/gnunet-publish.c:598
+#: src/fs/gnunet-publish.c:633
#, c-format
msgid "Scanning directory `%s'.\n"
msgstr ""
-#: src/fs/gnunet-publish.c:600
+#: src/fs/gnunet-publish.c:637
#, c-format
msgid "Scanning file `%s'.\n"
msgstr ""
-#: src/fs/gnunet-publish.c:605
+#: src/fs/gnunet-publish.c:643
#, c-format
msgid "There was trouble processing file `%s', skipping it.\n"
msgstr ""
-#: src/fs/gnunet-publish.c:610
+#: src/fs/gnunet-publish.c:650
msgid "Preprocessing complete.\n"
msgstr ""
-#: src/fs/gnunet-publish.c:614
+#: src/fs/gnunet-publish.c:655
#, c-format
msgid "Extracting meta data from file `%s' complete.\n"
msgstr ""
-#: src/fs/gnunet-publish.c:618
+#: src/fs/gnunet-publish.c:662
msgid "Meta data extraction has finished.\n"
msgstr ""
-#: src/fs/gnunet-publish.c:625
+#: src/fs/gnunet-publish.c:671
msgid "Internal error scanning directory.\n"
msgstr ""
-#: src/fs/gnunet-publish.c:656
+#: src/fs/gnunet-publish.c:703
#, c-format
msgid "Selected pseudonym `%s' unknown\n"
msgstr ""
-#: src/fs/gnunet-publish.c:682
+#: src/fs/gnunet-publish.c:735
#, c-format
msgid "Failed to access `%s': %s\n"
msgstr ""
-#: src/fs/gnunet-publish.c:695
-msgid "Failed to start meta directory scanner. Is gnunet-helper-publish-fs
installed?\n"
+#: src/fs/gnunet-publish.c:749
+msgid ""
+"Failed to start meta directory scanner. Is gnunet-helper-publish-fs "
+"installed?\n"
msgstr ""
-#: src/fs/gnunet-publish.c:747
+#: src/fs/gnunet-publish.c:805
#, c-format
msgid "Cannot extract metadata from a URI!\n"
msgstr ""
-#: src/fs/gnunet-publish.c:754
+#: src/fs/gnunet-publish.c:812
#, c-format
msgid "You must specify one and only one filename for insertion.\n"
msgstr ""
-#: src/fs/gnunet-publish.c:760
+#: src/fs/gnunet-publish.c:818
#, c-format
msgid "You must NOT specify an URI and a filename.\n"
msgstr ""
-#: src/fs/gnunet-publish.c:768 src/vpn/gnunet-vpn.c:209
+#: src/fs/gnunet-publish.c:826 src/vpn/gnunet-vpn.c:209
#, c-format
msgid "Option `%s' is required when using option `%s'.\n"
msgstr ""
-#: src/fs/gnunet-publish.c:778 src/fs/gnunet-publish.c:785
-#: src/transport/gnunet-transport.c:1284 src/transport/gnunet-transport.c:1314
-#: src/transport/gnunet-transport.c:1344
+#: src/fs/gnunet-publish.c:837 src/fs/gnunet-publish.c:845
+#: src/transport/gnunet-transport.c:1928 src/transport/gnunet-transport.c:1958
+#: src/transport/gnunet-transport.c:1989
#, c-format
msgid "Option `%s' makes no sense without option `%s'.\n"
msgstr ""
-#: src/fs/gnunet-publish.c:835
-msgid "print list of extracted keywords that would be used, but do not perform
upload"
+#: src/fs/gnunet-publish.c:899
+msgid ""
+"print list of extracted keywords that would be used, but do not perform "
+"upload"
msgstr ""
-#: src/fs/gnunet-publish.c:839
-msgid "add an additional keyword for the top-level file or directory (this
option can be specified multiple times)"
+#: src/fs/gnunet-publish.c:903
+msgid ""
+"add an additional keyword for the top-level file or directory (this option "
+"can be specified multiple times)"
msgstr ""
-#: src/fs/gnunet-publish.c:843
+#: src/fs/gnunet-publish.c:907
msgid "set the meta-data for the given TYPE to the given VALUE"
msgstr ""
-#: src/fs/gnunet-publish.c:846
-msgid "do not index, perform full insertion (stores entire file in encrypted
form in GNUnet database)"
+#: src/fs/gnunet-publish.c:910
+msgid ""
+"do not index, perform full insertion (stores entire file in encrypted form "
+"in GNUnet database)"
msgstr ""
-#: src/fs/gnunet-publish.c:851
-msgid "specify ID of an updated version to be published in the future (for
namespace insertions only)"
+#: src/fs/gnunet-publish.c:915
+msgid ""
+"specify ID of an updated version to be published in the future (for "
+"namespace insertions only)"
msgstr ""
-#: src/fs/gnunet-publish.c:859
+#: src/fs/gnunet-publish.c:923
msgid "publish the files under the pseudonym NAME (place file into namespace)"
msgstr ""
-#: src/fs/gnunet-publish.c:865
-msgid "only simulate the process but do not do any actual publishing (useful
to compute URIs)"
+#: src/fs/gnunet-publish.c:929
+msgid ""
+"only simulate the process but do not do any actual publishing (useful to "
+"compute URIs)"
msgstr ""
-#: src/fs/gnunet-publish.c:869
-msgid "set the ID of this version of the publication (for namespace insertions
only)"
+#: src/fs/gnunet-publish.c:933
+msgid ""
+"set the ID of this version of the publication (for namespace insertions only)"
msgstr ""
-#: src/fs/gnunet-publish.c:873
-msgid "URI to be published (can be used instead of passing a file to add
keywords to the file with the respective URI)"
+#: src/fs/gnunet-publish.c:937
+msgid ""
+"URI to be published (can be used instead of passing a file to add keywords "
+"to the file with the respective URI)"
msgstr ""
-#: src/fs/gnunet-publish.c:889
+#: src/fs/gnunet-publish.c:953
msgid "Publish a file or directory on GNUnet"
msgstr ""
@@ -3324,99 +3561,138 @@
msgid "Search GNUnet for files that were published on GNUnet"
msgstr ""
-#: src/fs/gnunet-service-fs.c:271
+#: src/fs/gnunet-service-fs.c:274
msgid "# running average P2P latency (ms)"
msgstr ""
-#: src/fs/gnunet-service-fs.c:326 src/fs/gnunet-service-fs.c:539
+#: src/fs/gnunet-service-fs.c:332 src/fs/gnunet-service-fs.c:595
msgid "# Loopback routes suppressed"
msgstr ""
-#: src/fs/gnunet-service-fs.c:639 src/hostlist/gnunet-daemon-hostlist.c:288
-#: src/topology/gnunet-daemon-topology.c:1254
-#: src/topology/gnunet-daemon-topology.c:1261
+#: src/fs/gnunet-service-fs.c:719
+msgid "FS service is lacking HOSTKEY configuration setting. Exiting.\n"
+msgstr ""
+
+#: src/fs/gnunet-service-fs.c:745 src/hostlist/gnunet-daemon-hostlist.c:311
+#: src/sensordashboard/gnunet-service-sensordashboard.c:864
+#: src/sensordashboard/gnunet-service-sensordashboard.c:872
+#: src/topology/gnunet-daemon-topology.c:1287
+#: src/topology/gnunet-daemon-topology.c:1294
#, c-format
msgid "Failed to connect to `%s' service.\n"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:682
+#: src/fs/gnunet-service-fs_cadet_client.c:494
+msgid "# replies received via cadet"
+msgstr ""
+
+#: src/fs/gnunet-service-fs_cadet_client.c:508
+msgid "# replies received via cadet dropped"
+msgstr ""
+
+#: src/fs/gnunet-service-fs_cadet_server.c:260
+msgid "# Blocks transferred via cadet"
+msgstr ""
+
+#: src/fs/gnunet-service-fs_cadet_server.c:361
+msgid "# queries received via CADET not answered"
+msgstr ""
+
+#: src/fs/gnunet-service-fs_cadet_server.c:441
+msgid "# queries received via cadet"
+msgstr ""
+
+#: src/fs/gnunet-service-fs_cadet_server.c:485
+msgid "# cadet client connections rejected"
+msgstr ""
+
+#: src/fs/gnunet-service-fs_cadet_server.c:491
+#: src/fs/gnunet-service-fs_cadet_server.c:531
+msgid "# cadet connections active"
+msgstr ""
+
+#: src/fs/gnunet-service-fs_cp.c:735
msgid "# migration stop messages received"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:686
+#: src/fs/gnunet-service-fs_cp.c:739
#, c-format
msgid "Migration of content to peer `%s' blocked for %s\n"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:721
+#: src/fs/gnunet-service-fs_cp.c:776
msgid "# replies transmitted to other peers"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:727
+#: src/fs/gnunet-service-fs_cp.c:784
msgid "# replies dropped"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:752 src/fs/gnunet-service-fs_cp.c:1301
+#: src/fs/gnunet-service-fs_cp.c:810 src/fs/gnunet-service-fs_cp.c:1404
msgid "# P2P searches active"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:845
+#: src/fs/gnunet-service-fs_cp.c:915
msgid "# artificial delays introduced (ms)"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:898
+#: src/fs/gnunet-service-fs_cp.c:971
msgid "# replies dropped due to type mismatch"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:906
+#: src/fs/gnunet-service-fs_cp.c:979
msgid "# replies received for other peers"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:920
+#: src/fs/gnunet-service-fs_cp.c:993
msgid "# replies dropped due to insufficient cover traffic"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:958
+#: src/fs/gnunet-service-fs_cp.c:1041
msgid "# P2P searches destroyed due to ultimate reply"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:1026
+#: src/fs/gnunet-service-fs_cp.c:1109
msgid "# requests done for free (low load)"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:1051
+#: src/fs/gnunet-service-fs_cp.c:1134
msgid "# request dropped, priority insufficient"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:1061
+#: src/fs/gnunet-service-fs_cp.c:1144
msgid "# requests done for a price (normal load)"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:1139
+#: src/fs/gnunet-service-fs_cp.c:1221
msgid "# GET requests received (from other peers)"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:1173
+#: src/fs/gnunet-service-fs_cp.c:1256
msgid "# requests dropped due to initiator not being connected"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:1195
+#: src/fs/gnunet-service-fs_cp.c:1277
msgid "# requests dropped due to missing reverse route"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:1246
+#: src/fs/gnunet-service-fs_cp.c:1288
+msgid "# requests dropped due to full reply queue"
+msgstr ""
+
+#: src/fs/gnunet-service-fs_cp.c:1340
msgid "# requests dropped due TTL underflow"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:1270
+#: src/fs/gnunet-service-fs_cp.c:1365
msgid "# requests dropped due to higher-TTL request"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:1299
+#: src/fs/gnunet-service-fs_cp.c:1402
msgid "# P2P query messages received and processed"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:1670
+#: src/fs/gnunet-service-fs_cp.c:1841
msgid "# migration stop messages sent"
msgstr ""
@@ -3433,7 +3709,9 @@
#: src/fs/gnunet-service-fs_indexing.c:237
#, c-format
-msgid "Index request received for file `%s' is already indexed as `%s'.
Permitting anyway.\n"
+msgid ""
+"Index request received for file `%s' is already indexed as `%s'. Permitting "
+"anyway.\n"
msgstr ""
#: src/fs/gnunet-service-fs_indexing.c:275
@@ -3464,51 +3742,22 @@
msgid "Indexed file `%s' changed at offset %llu\n"
msgstr ""
-#: src/fs/gnunet-service-fs_lc.c:202 src/fs/gnunet-service-fs_lc.c:368
+#: src/fs/gnunet-service-fs_lc.c:201 src/fs/gnunet-service-fs_lc.c:376
msgid "# client searches active"
msgstr ""
-#: src/fs/gnunet-service-fs_lc.c:256
+#: src/fs/gnunet-service-fs_lc.c:259
msgid "# replies received for local clients"
msgstr ""
-#: src/fs/gnunet-service-fs_lc.c:327
+#: src/fs/gnunet-service-fs_lc.c:330
msgid "# client searches received"
msgstr ""
-#: src/fs/gnunet-service-fs_lc.c:362
+#: src/fs/gnunet-service-fs_lc.c:370
msgid "# client searches updated (merged content seen list)"
msgstr ""
-#: src/fs/gnunet-service-fs_mesh_client.c:484
-msgid "# replies received via mesh"
-msgstr ""
-
-#: src/fs/gnunet-service-fs_mesh_client.c:498
-msgid "# replies received via mesh dropped"
-msgstr ""
-
-#: src/fs/gnunet-service-fs_mesh_server.c:260
-msgid "# Blocks transferred via mesh"
-msgstr ""
-
-#: src/fs/gnunet-service-fs_mesh_server.c:352
-msgid "# queries received via mesh not answered"
-msgstr ""
-
-#: src/fs/gnunet-service-fs_mesh_server.c:432
-msgid "# queries received via mesh"
-msgstr ""
-
-#: src/fs/gnunet-service-fs_mesh_server.c:476
-msgid "# mesh client connections rejected"
-msgstr ""
-
-#: src/fs/gnunet-service-fs_mesh_server.c:482
-#: src/fs/gnunet-service-fs_mesh_server.c:522
-msgid "# mesh connections active"
-msgstr ""
-
#: src/fs/gnunet-service-fs_pe.c:269
msgid "# average retransmission delay (ms)"
msgstr ""
@@ -3550,103 +3799,103 @@
msgid "# Pending requests active"
msgstr ""
-#: src/fs/gnunet-service-fs_pr.c:814
+#: src/fs/gnunet-service-fs_pr.c:820
msgid "# replies received and matched"
msgstr ""
-#: src/fs/gnunet-service-fs_pr.c:844
+#: src/fs/gnunet-service-fs_pr.c:857
msgid "# duplicate replies discarded (bloomfilter)"
msgstr ""
-#: src/fs/gnunet-service-fs_pr.c:853
+#: src/fs/gnunet-service-fs_pr.c:866
msgid "# irrelevant replies discarded"
msgstr ""
-#: src/fs/gnunet-service-fs_pr.c:867
+#: src/fs/gnunet-service-fs_pr.c:881
#, c-format
msgid "Unsupported block type %u\n"
msgstr ""
-#: src/fs/gnunet-service-fs_pr.c:880
+#: src/fs/gnunet-service-fs_pr.c:898
msgid "# results found locally"
msgstr ""
-#: src/fs/gnunet-service-fs_pr.c:1001
+#: src/fs/gnunet-service-fs_pr.c:1028
msgid "# Datastore `PUT' failures"
msgstr ""
-#: src/fs/gnunet-service-fs_pr.c:1029
+#: src/fs/gnunet-service-fs_pr.c:1056
msgid "# storage requests dropped due to high load"
msgstr ""
-#: src/fs/gnunet-service-fs_pr.c:1064
+#: src/fs/gnunet-service-fs_pr.c:1094
msgid "# Replies received from DHT"
msgstr ""
-#: src/fs/gnunet-service-fs_pr.c:1192
-msgid "# Replies received from MESH"
+#: src/fs/gnunet-service-fs_pr.c:1226
+msgid "# Replies received from CADET"
msgstr ""
-#: src/fs/gnunet-service-fs_pr.c:1244
+#: src/fs/gnunet-service-fs_pr.c:1279
#, c-format
msgid "Datastore lookup already took %s!\n"
msgstr ""
-#: src/fs/gnunet-service-fs_pr.c:1264
+#: src/fs/gnunet-service-fs_pr.c:1301
#, c-format
msgid "On-demand lookup already took %s!\n"
msgstr ""
-#: src/fs/gnunet-service-fs_pr.c:1311
+#: src/fs/gnunet-service-fs_pr.c:1353
msgid "# Datastore lookups concluded (no results)"
msgstr ""
-#: src/fs/gnunet-service-fs_pr.c:1326
+#: src/fs/gnunet-service-fs_pr.c:1368
msgid "# Datastore lookups concluded (seen all)"
msgstr ""
-#: src/fs/gnunet-service-fs_pr.c:1335
+#: src/fs/gnunet-service-fs_pr.c:1377
msgid "# Datastore lookups aborted (more than MAX_RESULTS)"
msgstr ""
-#: src/fs/gnunet-service-fs_pr.c:1350
+#: src/fs/gnunet-service-fs_pr.c:1392
msgid "# requested DBLOCK or IBLOCK not found"
msgstr ""
-#: src/fs/gnunet-service-fs_pr.c:1364
+#: src/fs/gnunet-service-fs_pr.c:1406
msgid "# on-demand blocks matched requests"
msgstr ""
-#: src/fs/gnunet-service-fs_pr.c:1377
+#: src/fs/gnunet-service-fs_pr.c:1419
msgid "# on-demand lookups performed successfully"
msgstr ""
-#: src/fs/gnunet-service-fs_pr.c:1382
+#: src/fs/gnunet-service-fs_pr.c:1424
msgid "# on-demand lookups failed"
msgstr ""
-#: src/fs/gnunet-service-fs_pr.c:1409 src/fs/gnunet-service-fs_pr.c:1449
-#: src/fs/gnunet-service-fs_pr.c:1590
+#: src/fs/gnunet-service-fs_pr.c:1451 src/fs/gnunet-service-fs_pr.c:1491
+#: src/fs/gnunet-service-fs_pr.c:1660
msgid "# Datastore lookups concluded (error queueing)"
msgstr ""
-#: src/fs/gnunet-service-fs_pr.c:1467
+#: src/fs/gnunet-service-fs_pr.c:1510
msgid "# Datastore lookups concluded (found last result)"
msgstr ""
-#: src/fs/gnunet-service-fs_pr.c:1478
+#: src/fs/gnunet-service-fs_pr.c:1522
msgid "# Datastore lookups concluded (load too high)"
msgstr ""
-#: src/fs/gnunet-service-fs_pr.c:1566
+#: src/fs/gnunet-service-fs_pr.c:1636
msgid "# Datastore lookups initiated"
msgstr ""
-#: src/fs/gnunet-service-fs_pr.c:1651
+#: src/fs/gnunet-service-fs_pr.c:1725
msgid "# GAP PUT messages received"
msgstr ""
-#: src/fs/gnunet-service-fs_push.c:631
+#: src/fs/gnunet-service-fs_push.c:672
msgid "time required, content pushing disabled"
msgstr ""
@@ -3686,7 +3935,7 @@
msgid "Refusing `%s' request to HTTP server\n"
msgstr ""
-#: src/gns/gnunet-bcd.c:355 src/hostlist/hostlist-server.c:567
+#: src/gns/gnunet-bcd.c:355 src/hostlist/gnunet-daemon-hostlist_server.c:759
#, c-format
msgid "Invalid port number %llu. Exiting.\n"
msgstr ""
@@ -3709,117 +3958,128 @@
msgid "GNUnet HTTP server to create business cards"
msgstr ""
-#: src/gns/gnunet-dns2gns.c:228
+#: src/gns/gnunet-dns2gns.c:234
msgid "Failed to pack DNS response into UDP packet!\n"
msgstr ""
-#: src/gns/gnunet-dns2gns.c:400
+#: src/gns/gnunet-dns2gns.c:406
#, c-format
msgid "Cannot parse DNS request from %s\n"
msgstr ""
-#: src/gns/gnunet-dns2gns.c:416
+#: src/gns/gnunet-dns2gns.c:422
#, c-format
msgid "Received malformed DNS request from %s\n"
msgstr ""
-#: src/gns/gnunet-dns2gns.c:424
+#: src/gns/gnunet-dns2gns.c:430
#, c-format
msgid "Received unsupported DNS request from %s\n"
msgstr ""
-#: src/gns/gnunet-dns2gns.c:701
+#: src/gns/gnunet-dns2gns.c:708
msgid "No ego configured for `dns2gns` subsystem\n"
msgstr ""
-#: src/gns/gnunet-dns2gns.c:727
+#: src/gns/gnunet-dns2gns.c:734
msgid "No DNS server specified!\n"
msgstr ""
-#: src/gns/gnunet-dns2gns.c:749
+#: src/gns/gnunet-dns2gns.c:756
msgid "No valid GNS zone specified!\n"
msgstr ""
-#: src/gns/gnunet-dns2gns.c:770
+#: src/gns/gnunet-dns2gns.c:777
msgid "IP of recursive DNS resolver to use (required)"
msgstr ""
-#: src/gns/gnunet-dns2gns.c:773
+#: src/gns/gnunet-dns2gns.c:780
msgid "Authoritative FCFS suffix to use (optional); default: fcfs.zkey.eu"
msgstr ""
-#: src/gns/gnunet-dns2gns.c:776
+#: src/gns/gnunet-dns2gns.c:783
msgid "Authoritative DNS suffix to use (optional); default: zkey.eu"
msgstr ""
-#: src/gns/gnunet-dns2gns.c:779
+#: src/gns/gnunet-dns2gns.c:786
msgid "UDP port to listen on for inbound DNS requests; default: 53"
msgstr ""
-#: src/gns/gnunet-dns2gns.c:782
+#: src/gns/gnunet-dns2gns.c:789
msgid "Public key of the GNS zone to use (overrides default)"
msgstr ""
-#: src/gns/gnunet-dns2gns.c:795
+#: src/gns/gnunet-dns2gns.c:802
msgid "GNUnet DNS-to-GNS proxy (a DNS server)"
msgstr ""
-#: src/gns/gnunet-gns.c:227
+#: src/gns/gnunet-gns.c:215 src/gns/plugin_rest_gns.c:334
#, c-format
+msgid "Invalid typename specified, assuming `ANY'\n"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:233
+#, c-format
msgid "Please specify name to lookup!\n"
msgstr ""
-#: src/gns/gnunet-gns.c:308
+#: src/gns/gnunet-gns.c:314
#, c-format
msgid "Ego for `%s' not found, cannot perform lookup.\n"
msgstr ""
-#: src/gns/gnunet-gns.c:347 src/gns/gnunet-gns-helper-service-w32.c:798
+#: src/gns/gnunet-gns.c:353 src/gns/gnunet-gns-helper-service-w32.c:798
+#: src/gns/plugin_rest_gns.c:459
#, c-format
-msgid "Ego for `gns-master' not found, cannot perform lookup. Did you run
gnunet-gns-import.sh?\n"
+msgid ""
+"Ego for `gns-master' not found, cannot perform lookup. Did you run gnunet-"
+"gns-import.sh?\n"
msgstr ""
-#: src/gns/gnunet-gns.c:386 src/gns/gnunet-gns-helper-service-w32.c:828
+#: src/gns/gnunet-gns.c:392 src/gns/gnunet-gns-helper-service-w32.c:828
#, c-format
msgid "Failed to connect to GNS\n"
msgstr ""
-#: src/gns/gnunet-gns.c:399
+#: src/gns/gnunet-gns.c:405
#, c-format
msgid "Public key `%s' is not well-formed\n"
msgstr ""
-#: src/gns/gnunet-gns.c:449
+#: src/gns/gnunet-gns.c:455
msgid "Lookup a record for the given name"
msgstr ""
-#: src/gns/gnunet-gns.c:452
+#: src/gns/gnunet-gns.c:458
msgid "Specify the type of the record to lookup"
msgstr ""
-#: src/gns/gnunet-gns.c:455
+#: src/gns/gnunet-gns.c:461
msgid "Specify timeout for the lookup"
msgstr ""
-#: src/gns/gnunet-gns.c:458
+#: src/gns/gnunet-gns.c:464
msgid "No unneeded output"
msgstr ""
-#: src/gns/gnunet-gns.c:461
+#: src/gns/gnunet-gns.c:467
msgid "Specify the public key of the zone to lookup the record in"
msgstr ""
-#: src/gns/gnunet-gns.c:464
+#: src/gns/gnunet-gns.c:470
msgid "Specify the name of the ego of the zone to lookup the record in"
msgstr ""
-#: src/gns/gnunet-gns.c:478
+#: src/gns/gnunet-gns.c:484
msgid "GNUnet GNS resolver tool"
msgstr ""
#: src/gns/gnunet-gns-helper-service-w32.c:768
#, c-format
-msgid "Ego for `gns-short' not found. This is not really fatal, but i'll
pretend that it is and refuse to perform a lookup. Did you run
gnunet-gns-import.sh?\n"
+msgid ""
+"Ego for `gns-short' not found. This is not really fatal, but i'll pretend "
+"that it is and refuse to perform a lookup. Did you run gnunet-gns-import."
+"sh?\n"
msgstr ""
#: src/gns/gnunet-gns-helper-service-w32.c:838
@@ -3831,139 +4091,143 @@
msgid "This program will import some GNS authorities into your GNS namestore."
msgstr ""
-#: src/gns/gnunet-gns-proxy.c:105 src/hostlist/hostlist-client.c:469
-#: src/hostlist/hostlist-client.c:683 src/hostlist/hostlist-client.c:689
-#: src/hostlist/hostlist-client.c:741 src/hostlist/hostlist-client.c:750
-#: src/hostlist/hostlist-client.c:871 src/hostlist/hostlist-client.c:963
-#: src/hostlist/hostlist-client.c:968
-#: src/transport/plugin_transport_http_client.c:1062
-#: src/transport/plugin_transport_http_client.c:1077
+#: src/gns/gnunet-gns-proxy.c:105
+#: src/hostlist/gnunet-daemon-hostlist_client.c:524
+#: src/hostlist/gnunet-daemon-hostlist_client.c:741
+#: src/hostlist/gnunet-daemon-hostlist_client.c:747
+#: src/hostlist/gnunet-daemon-hostlist_client.c:800
+#: src/hostlist/gnunet-daemon-hostlist_client.c:809
+#: src/hostlist/gnunet-daemon-hostlist_client.c:931
+#: src/hostlist/gnunet-daemon-hostlist_client.c:1026
+#: src/hostlist/gnunet-daemon-hostlist_client.c:1031
+#: src/transport/plugin_transport_http_client.c:595
+#: src/transport/plugin_transport_http_client.c:613
#, c-format
msgid "%s failed at %s:%d: `%s'\n"
msgstr ""
-#: src/gns/gnunet-gns-proxy.c:833
+#: src/gns/gnunet-gns-proxy.c:842
#, c-format
msgid "Unsupported CURL SSL backend %d\n"
msgstr ""
-#: src/gns/gnunet-gns-proxy.c:856
+#: src/gns/gnunet-gns-proxy.c:865
#, c-format
msgid "Failed to fetch CN from cert: %s\n"
msgstr ""
-#: src/gns/gnunet-gns-proxy.c:879
+#: src/gns/gnunet-gns-proxy.c:888
#, c-format
msgid "Failed to initialize DANE: %s\n"
msgstr ""
-#: src/gns/gnunet-gns-proxy.c:892
+#: src/gns/gnunet-gns-proxy.c:901
#, c-format
msgid "Failed to parse DANE record: %s\n"
msgstr ""
-#: src/gns/gnunet-gns-proxy.c:907
+#: src/gns/gnunet-gns-proxy.c:916
#, c-format
msgid "Failed to verify TLS connection using DANE: %s\n"
msgstr ""
-#: src/gns/gnunet-gns-proxy.c:917
+#: src/gns/gnunet-gns-proxy.c:926
#, c-format
msgid "Failed DANE verification failed with GnuTLS verify status code: %u\n"
msgstr ""
-#: src/gns/gnunet-gns-proxy.c:941
+#: src/gns/gnunet-gns-proxy.c:950
#, c-format
msgid "SSL certificate subject name (%s) does not match `%s'\n"
msgstr ""
-#: src/gns/gnunet-gns-proxy.c:1086
+#: src/gns/gnunet-gns-proxy.c:1095
#, c-format
msgid "Cookie domain `%s' supplied by server is invalid\n"
msgstr ""
-#: src/gns/gnunet-gns-proxy.c:1602
+#: src/gns/gnunet-gns-proxy.c:1630
#, c-format
msgid "Unsupported HTTP method `%s'\n"
msgstr ""
-#: src/gns/gnunet-gns-proxy.c:1973
+#: src/gns/gnunet-gns-proxy.c:2002
#, c-format
msgid "Unable to import private key from file `%s'\n"
msgstr ""
-#: src/gns/gnunet-gns-proxy.c:2003
+#: src/gns/gnunet-gns-proxy.c:2032
#, c-format
msgid "Unable to import certificate %s\n"
msgstr ""
-#: src/gns/gnunet-gns-proxy.c:2177
+#: src/gns/gnunet-gns-proxy.c:2206
#, c-format
msgid "Failed to start HTTPS server for `%s'\n"
msgstr ""
-#: src/gns/gnunet-gns-proxy.c:2196
+#: src/gns/gnunet-gns-proxy.c:2225 src/rest/gnunet-rest-server.c:529
msgid "Failed to pass client to MHD\n"
msgstr ""
-#: src/gns/gnunet-gns-proxy.c:2504
+#: src/gns/gnunet-gns-proxy.c:2547
#, c-format
msgid "Unsupported socks version %d\n"
msgstr ""
-#: src/gns/gnunet-gns-proxy.c:2533
+#: src/gns/gnunet-gns-proxy.c:2576
#, c-format
msgid "Unsupported socks command %d\n"
msgstr ""
-#: src/gns/gnunet-gns-proxy.c:2551 src/gns/gnunet-gns-proxy.c:2580
+#: src/gns/gnunet-gns-proxy.c:2594 src/gns/gnunet-gns-proxy.c:2623
msgid "SSL connection to plain IPv4 address requested\n"
msgstr ""
-#: src/gns/gnunet-gns-proxy.c:2631
+#: src/gns/gnunet-gns-proxy.c:2674
#, c-format
msgid "Unsupported socks address type %d\n"
msgstr ""
-#: src/gns/gnunet-gns-proxy.c:2970
+#: src/gns/gnunet-gns-proxy.c:3013
msgid "No ego configured for `shorten-zone`\n"
msgstr ""
-#: src/gns/gnunet-gns-proxy.c:3010
+#: src/gns/gnunet-gns-proxy.c:3053
#, c-format
msgid "No ego configured for `%s`\n"
msgstr ""
-#: src/gns/gnunet-gns-proxy.c:3072
+#: src/gns/gnunet-gns-proxy.c:3115
#, c-format
msgid "Failed to load SSL/TLS key and certificate from `%s'\n"
msgstr ""
-#: src/gns/gnunet-gns-proxy.c:3113
+#: src/gns/gnunet-gns-proxy.c:3156
msgid "listen on specified port (default: 7777)"
msgstr ""
-#: src/gns/gnunet-gns-proxy.c:3116
+#: src/gns/gnunet-gns-proxy.c:3159
msgid "pem file to use as CA"
msgstr ""
-#: src/gns/gnunet-gns-proxy.c:3135
+#: src/gns/gnunet-gns-proxy.c:3178
msgid "GNUnet GNS proxy"
msgstr ""
-#: src/gns/gnunet-service-gns.c:862
+#: src/gns/gnunet-service-gns.c:864
msgid "Failed to connect to the namestore!\n"
msgstr ""
-#: src/gns/gnunet-service-gns.c:870
+#: src/gns/gnunet-service-gns.c:872
msgid "Failed to connect to the namecache!\n"
msgstr ""
-#: src/gns/gnunet-service-gns.c:903
+#: src/gns/gnunet-service-gns.c:905
msgid "Could not connect to DHT!\n"
msgstr ""
-#: src/gns/gnunet-service-gns.c:919
+#: src/gns/gnunet-service-gns.c:921
msgid "valid public key required"
msgstr ""
@@ -3975,436 +4239,503 @@
msgid "Failed to connect to the DNS service!\n"
msgstr ""
-#: src/gns/gnunet-service-gns_resolver.c:816
+#: src/gns/gnunet-service-gns_resolver.c:650
+#, c-format
+msgid "Protocol `%s' unknown, skipping labels.\n"
+msgstr ""
+
+#: src/gns/gnunet-service-gns_resolver.c:661
+#, c-format
+msgid "Service `%s' unknown for protocol `%s', skipping labels.\n"
+msgstr ""
+
+#: src/gns/gnunet-service-gns_resolver.c:854
msgid "Failed to parse DNS response\n"
msgstr ""
-#: src/gns/gnunet-service-gns_resolver.c:958
+#: src/gns/gnunet-service-gns_resolver.c:996
#, c-format
msgid "Skipping record of unsupported type %d\n"
msgstr ""
-#: src/gns/gnunet-service-gns_resolver.c:1317
+#: src/gns/gnunet-service-gns_resolver.c:1356
#, c-format
msgid "GNS lookup resulted in DNS name that is too long (`%s')\n"
msgstr ""
-#: src/gns/gnunet-service-gns_resolver.c:1817
+#: src/gns/gnunet-service-gns_resolver.c:1891
msgid "GNS lookup recursion failed (no delegation record found)\n"
msgstr ""
-#: src/gns/gnunet-service-gns_resolver.c:1841
+#: src/gns/gnunet-service-gns_resolver.c:1915
#, c-format
msgid "Failed to cache GNS resolution: %s\n"
msgstr ""
-#: src/gns/gnunet-service-gns_resolver.c:2123
+#: src/gns/gnunet-service-gns_resolver.c:2197
#, c-format
msgid "Zone %s was revoked, resolution fails\n"
msgstr ""
-#: src/gns/gnunet-service-gns_resolver.c:2272
+#: src/gns/gnunet-service-gns_resolver.c:2346
#, c-format
msgid "Hostname `%s' is not well-formed, resolution fails\n"
msgstr ""
-#: src/gns/plugin_gnsrecord_gns.c:151
+#: src/gns/plugin_gnsrecord_gns.c:172
#, c-format
msgid "Unable to parse PKEY record `%s'\n"
msgstr ""
-#: src/gns/plugin_gnsrecord_gns.c:180
+#: src/gns/plugin_gnsrecord_gns.c:201
#, c-format
msgid "Unable to parse GNS2DNS record `%s'\n"
msgstr ""
-#: src/gns/plugin_gnsrecord_gns.c:201
+#: src/gns/plugin_gnsrecord_gns.c:222
#, c-format
msgid "Failed to serialize GNS2DNS record with value `%s'\n"
msgstr ""
-#: src/gns/plugin_gnsrecord_gns.c:217
+#: src/gns/plugin_gnsrecord_gns.c:245
#, c-format
msgid "Unable to parse VPN record string `%s'\n"
msgstr ""
-#: src/gnsrecord/plugin_gnsrecord_dns.c:293
+#: src/gns/plugin_gnsrecord_gns.c:280
#, c-format
+msgid "Unable to parse BOX record string `%s'\n"
+msgstr ""
+
+#: src/gns/plugin_rest_gns.c:422
+msgid "Ego for not found, cannot perform lookup.\n"
+msgstr ""
+
+#: src/gns/plugin_rest_gns.c:652
+msgid "GNS REST API initialized\n"
+msgstr ""
+
+#: src/gnsrecord/plugin_gnsrecord_dns.c:291
+#, c-format
msgid "Unable to parse IPv4 address `%s'\n"
msgstr ""
-#: src/gnsrecord/plugin_gnsrecord_dns.c:314
+#: src/gnsrecord/plugin_gnsrecord_dns.c:312
#, c-format
msgid "Failed to serialize NS record with value `%s'\n"
msgstr ""
-#: src/gnsrecord/plugin_gnsrecord_dns.c:336
+#: src/gnsrecord/plugin_gnsrecord_dns.c:334
#, c-format
msgid "Failed to serialize CNAME record with value `%s'\n"
msgstr ""
-#: src/gnsrecord/plugin_gnsrecord_dns.c:420
+#: src/gnsrecord/plugin_gnsrecord_dns.c:418
#, c-format
msgid "Failed to serialize CERT record with %u bytes\n"
msgstr ""
-#: src/gnsrecord/plugin_gnsrecord_dns.c:452
+#: src/gnsrecord/plugin_gnsrecord_dns.c:455
#, c-format
msgid "Unable to parse SOA record `%s'\n"
msgstr ""
-#: src/gnsrecord/plugin_gnsrecord_dns.c:471
+#: src/gnsrecord/plugin_gnsrecord_dns.c:474
#, c-format
msgid "Failed to serialize SOA record with mname `%s' and rname `%s'\n"
msgstr ""
-#: src/gnsrecord/plugin_gnsrecord_dns.c:494
+#: src/gnsrecord/plugin_gnsrecord_dns.c:497
#, c-format
msgid "Failed to serialize PTR record with value `%s'\n"
msgstr ""
-#: src/gnsrecord/plugin_gnsrecord_dns.c:514
+#: src/gnsrecord/plugin_gnsrecord_dns.c:520
#, c-format
msgid "Unable to parse MX record `%s'\n"
msgstr ""
-#: src/gnsrecord/plugin_gnsrecord_dns.c:529
+#: src/gnsrecord/plugin_gnsrecord_dns.c:535
#, c-format
msgid "Failed to serialize MX record with hostname `%s'\n"
msgstr ""
-#: src/gnsrecord/plugin_gnsrecord_dns.c:549
+#: src/gnsrecord/plugin_gnsrecord_dns.c:562
#, c-format
+msgid "Unable to parse SRV record `%s'\n"
+msgstr ""
+
+#: src/gnsrecord/plugin_gnsrecord_dns.c:578
+#, c-format
+msgid "Failed to serialize SRV record with target `%s'\n"
+msgstr ""
+
+#: src/gnsrecord/plugin_gnsrecord_dns.c:595
+#, c-format
msgid "Unable to parse IPv6 address `%s'\n"
msgstr ""
-#: src/gnsrecord/plugin_gnsrecord_dns.c:567
+#: src/gnsrecord/plugin_gnsrecord_dns.c:619
+#: src/gnsrecord/plugin_gnsrecord_dns.c:635
#, c-format
msgid "Unable to parse TLSA record string `%s'\n"
msgstr ""
-#: src/hello/gnunet-hello.c:123
+#: src/hello/gnunet-hello.c:126
msgid "Call with name of HELLO file to modify.\n"
msgstr ""
-#: src/hello/gnunet-hello.c:129
+#: src/hello/gnunet-hello.c:132
#, c-format
msgid "Error accessing file `%s': %s\n"
msgstr ""
-#: src/hello/gnunet-hello.c:137
+#: src/hello/gnunet-hello.c:140
#, c-format
msgid "File `%s' is too big to be a HELLO\n"
msgstr ""
-#: src/hello/gnunet-hello.c:144
+#: src/hello/gnunet-hello.c:147
#, c-format
msgid "File `%s' is too small to be a HELLO\n"
msgstr ""
-#: src/hello/gnunet-hello.c:154 src/hello/gnunet-hello.c:183
+#: src/hello/gnunet-hello.c:157 src/hello/gnunet-hello.c:196
#, c-format
msgid "Error opening file `%s': %s\n"
msgstr ""
-#: src/hello/gnunet-hello.c:170
+#: src/hello/gnunet-hello.c:173
#, c-format
msgid "Did not find well-formed HELLO in file `%s'\n"
msgstr ""
-#: src/hello/gnunet-hello.c:195
+#: src/hello/gnunet-hello.c:208
#, c-format
msgid "Error writing HELLO to file `%s': %s\n"
msgstr ""
-#: src/hello/gnunet-hello.c:203
+#: src/hello/gnunet-hello.c:216
#, c-format
msgid "Modified %u addresses \n"
msgstr ""
-#: src/hello/hello.c:944
+#: src/hello/hello.c:955
msgid "Failed to parse HELLO message: missing expiration time\n"
msgstr ""
-#: src/hello/hello.c:953
+#: src/hello/hello.c:964
msgid "Failed to parse HELLO message: invalid expiration time\n"
msgstr ""
-#: src/hello/hello.c:963
+#: src/hello/hello.c:974
msgid "Failed to parse HELLO message: malformed\n"
msgstr ""
-#: src/hello/hello.c:973
+#: src/hello/hello.c:984
msgid "Failed to parse HELLO message: missing transport plugin\n"
msgstr ""
-#: src/hello/hello.c:990
+#: src/hello/hello.c:1002
#, c-format
-msgid "Plugin `%s' not found\n"
+msgid "Plugin `%s' not found, skipping address\n"
msgstr ""
-#: src/hello/hello.c:999
+#: src/hello/hello.c:1010
#, c-format
msgid "Plugin `%s' does not support URIs yet\n"
msgstr ""
-#: src/hello/hello.c:1018
+#: src/hello/hello.c:1025
#, c-format
msgid "Failed to parse `%s' as an address for plugin `%s'\n"
msgstr ""
-#: src/hostlist/gnunet-daemon-hostlist.c:259
-msgid "None of the functions for the hostlist daemon were enabled. I have no
reason to run!\n"
+#: src/hello/hello.c:1098
+#, c-format
+msgid "HELLO URI contained %u addresses, added %u addresses\n"
msgstr ""
-#: src/hostlist/gnunet-daemon-hostlist.c:308
+#: src/hostlist/gnunet-daemon-hostlist.c:274
+msgid ""
+"None of the functions for the hostlist daemon were enabled. I have no "
+"reason to run!\n"
+msgstr ""
+
+#: src/hostlist/gnunet-daemon-hostlist.c:331
msgid "advertise our hostlist to other peers"
msgstr ""
-#: src/hostlist/gnunet-daemon-hostlist.c:313
-msgid "bootstrap using hostlists (it is highly recommended that you always use
this option)"
+#: src/hostlist/gnunet-daemon-hostlist.c:336
+msgid ""
+"bootstrap using hostlists (it is highly recommended that you always use this "
+"option)"
msgstr ""
-#: src/hostlist/gnunet-daemon-hostlist.c:316
+#: src/hostlist/gnunet-daemon-hostlist.c:339
msgid "enable learning about hostlist servers from other peers"
msgstr ""
-#: src/hostlist/gnunet-daemon-hostlist.c:320
+#: src/hostlist/gnunet-daemon-hostlist.c:343
msgid "provide a hostlist server"
msgstr ""
-#: src/hostlist/gnunet-daemon-hostlist.c:335
+#: src/hostlist/gnunet-daemon-hostlist.c:359
msgid "GNUnet hostlist server and client"
msgstr ""
-#: src/hostlist/hostlist-client.c:288
+#: src/hostlist/gnunet-daemon-hostlist_client.c:343
msgid "# bytes downloaded from hostlist servers"
msgstr ""
-#: src/hostlist/hostlist-client.c:309 src/hostlist/hostlist-client.c:339
+#: src/hostlist/gnunet-daemon-hostlist_client.c:364
+#: src/hostlist/gnunet-daemon-hostlist_client.c:394
msgid "# invalid HELLOs downloaded from hostlist servers"
msgstr ""
-#: src/hostlist/hostlist-client.c:312 src/hostlist/hostlist-client.c:342
+#: src/hostlist/gnunet-daemon-hostlist_client.c:367
+#: src/hostlist/gnunet-daemon-hostlist_client.c:397
#, c-format
msgid "Invalid `%s' message received from hostlist at `%s'\n"
msgstr ""
-#: src/hostlist/hostlist-client.c:330
+#: src/hostlist/gnunet-daemon-hostlist_client.c:385
msgid "# valid HELLOs downloaded from hostlist servers"
msgstr ""
-#: src/hostlist/hostlist-client.c:592 src/hostlist/hostlist-client.c:1333
+#: src/hostlist/gnunet-daemon-hostlist_client.c:650
+#: src/hostlist/gnunet-daemon-hostlist_client.c:1402
msgid "# advertised hostlist URIs"
msgstr ""
-#: src/hostlist/hostlist-client.c:622
+#: src/hostlist/gnunet-daemon-hostlist_client.c:680
#, c-format
msgid "# advertised URI `%s' downloaded"
msgstr ""
-#: src/hostlist/hostlist-client.c:664
+#: src/hostlist/gnunet-daemon-hostlist_client.c:722
#, c-format
-msgid "Advertised hostlist with URI `%s' could not be downloaded. Advertised
URI gets dismissed.\n"
+msgid ""
+"Advertised hostlist with URI `%s' could not be downloaded. Advertised URI "
+"gets dismissed.\n"
msgstr ""
-#: src/hostlist/hostlist-client.c:802
+#: src/hostlist/gnunet-daemon-hostlist_client.c:862
#, c-format
msgid "Timeout trying to download hostlist from `%s'\n"
msgstr ""
-#: src/hostlist/hostlist-client.c:816
+#: src/hostlist/gnunet-daemon-hostlist_client.c:876
#, c-format
msgid "Download limit of %u bytes exceeded, stopping download\n"
msgstr ""
-#: src/hostlist/hostlist-client.c:836
+#: src/hostlist/gnunet-daemon-hostlist_client.c:896
#, c-format
msgid "Download of hostlist from `%s' failed: `%s'\n"
msgstr ""
-#: src/hostlist/hostlist-client.c:842
+#: src/hostlist/gnunet-daemon-hostlist_client.c:902
#, c-format
msgid "Download of hostlist `%s' completed.\n"
msgstr ""
-#: src/hostlist/hostlist-client.c:850
+#: src/hostlist/gnunet-daemon-hostlist_client.c:910
#, c-format
msgid "Adding successfully tested hostlist `%s' datastore.\n"
msgstr ""
-#: src/hostlist/hostlist-client.c:903
+#: src/hostlist/gnunet-daemon-hostlist_client.c:963
#, c-format
msgid "Bootstrapping using hostlist at `%s'.\n"
msgstr ""
-#: src/hostlist/hostlist-client.c:911
+#: src/hostlist/gnunet-daemon-hostlist_client.c:971
msgid "# hostlist downloads initiated"
msgstr ""
-#: src/hostlist/hostlist-client.c:1040 src/hostlist/hostlist-client.c:1506
+#: src/hostlist/gnunet-daemon-hostlist_client.c:1103
+#: src/hostlist/gnunet-daemon-hostlist_client.c:1655
msgid "# milliseconds between hostlist downloads"
msgstr ""
-#: src/hostlist/hostlist-client.c:1049
+#: src/hostlist/gnunet-daemon-hostlist_client.c:1112
#, c-format
msgid "Have %u/%u connections. Will consider downloading hostlist in %s\n"
msgstr ""
-#: src/hostlist/hostlist-client.c:1109 src/hostlist/hostlist-client.c:1125
+#: src/hostlist/gnunet-daemon-hostlist_client.c:1172
+#: src/hostlist/gnunet-daemon-hostlist_client.c:1188
msgid "# active connections"
msgstr ""
-#: src/hostlist/hostlist-client.c:1280
+#: src/hostlist/gnunet-daemon-hostlist_client.c:1348
#, c-format
msgid "Loading saved hostlist entries from file `%s' \n"
msgstr ""
-#: src/hostlist/hostlist-client.c:1285
+#: src/hostlist/gnunet-daemon-hostlist_client.c:1353
#, c-format
msgid "Hostlist file `%s' does not exist\n"
msgstr ""
-#: src/hostlist/hostlist-client.c:1296
+#: src/hostlist/gnunet-daemon-hostlist_client.c:1362
#, c-format
msgid "Could not open file `%s' for reading to load hostlists: %s\n"
msgstr ""
-#: src/hostlist/hostlist-client.c:1329
+#: src/hostlist/gnunet-daemon-hostlist_client.c:1396
#, c-format
msgid "%u hostlist URIs loaded from file\n"
msgstr ""
-#: src/hostlist/hostlist-client.c:1331
+#: src/hostlist/gnunet-daemon-hostlist_client.c:1399
msgid "# hostlist URIs read from file"
msgstr ""
-#: src/hostlist/hostlist-client.c:1376
+#: src/hostlist/gnunet-daemon-hostlist_client.c:1445
#, c-format
msgid "Could not open file `%s' for writing to save hostlists: %s\n"
msgstr ""
-#: src/hostlist/hostlist-client.c:1381
+#: src/hostlist/gnunet-daemon-hostlist_client.c:1452
#, c-format
msgid "Writing %u hostlist URIs to `%s'\n"
msgstr ""
-#: src/hostlist/hostlist-client.c:1405 src/hostlist/hostlist-client.c:1422
+#: src/hostlist/gnunet-daemon-hostlist_client.c:1476
+#: src/hostlist/gnunet-daemon-hostlist_client.c:1493
#, c-format
msgid "Error writing hostlist URIs to file `%s'\n"
msgstr ""
-#: src/hostlist/hostlist-client.c:1417
+#: src/hostlist/gnunet-daemon-hostlist_client.c:1488
msgid "# hostlist URIs written to file"
msgstr ""
-#: src/hostlist/hostlist-client.c:1471
+#: src/hostlist/gnunet-daemon-hostlist_client.c:1588
+#: src/transport/plugin_transport_http_client.c:2265
+#, c-format
+msgid "Invalid proxy type: `%s', disabling proxy! Check configuration!\n"
+msgstr ""
+
+#: src/hostlist/gnunet-daemon-hostlist_client.c:1617
msgid "Learning is enabled on this peer\n"
msgstr ""
-#: src/hostlist/hostlist-client.c:1483
+#: src/hostlist/gnunet-daemon-hostlist_client.c:1630
msgid "Learning is not enabled on this peer\n"
msgstr ""
-#: src/hostlist/hostlist-client.c:1495
+#: src/hostlist/gnunet-daemon-hostlist_client.c:1641
#, c-format
-msgid "Since learning is not enabled on this peer, hostlist file `%s' was
removed\n"
+msgid ""
+"Since learning is not enabled on this peer, hostlist file `%s' was removed\n"
msgstr ""
-#: src/hostlist/hostlist-client.c:1499
-#, c-format
-msgid "Hostlist file `%s' could not be removed\n"
-msgstr ""
-
-#: src/hostlist/hostlist-server.c:137
+#: src/hostlist/gnunet-daemon-hostlist_server.c:181
msgid "bytes in hostlist"
msgstr ""
-#: src/hostlist/hostlist-server.c:161
+#: src/hostlist/gnunet-daemon-hostlist_server.c:206
msgid "expired addresses encountered"
msgstr ""
-#: src/hostlist/hostlist-server.c:189 src/hostlist/hostlist-server.c:425
-#: src/peerinfo-tool/gnunet-peerinfo.c:350
-#: src/peerinfo-tool/gnunet-peerinfo.c:419
-#: src/peerinfo-tool/gnunet-peerinfo.c:490
-#: src/topology/gnunet-daemon-topology.c:925
+#: src/hostlist/gnunet-daemon-hostlist_server.c:241
+#: src/hostlist/gnunet-daemon-hostlist_server.c:590
+#: src/peerinfo-tool/gnunet-peerinfo.c:382
+#: src/peerinfo-tool/gnunet-peerinfo.c:531
+#: src/topology/gnunet-daemon-topology.c:952
#, c-format
msgid "Error in communication with PEERINFO service: %s\n"
msgstr ""
-#: src/hostlist/hostlist-server.c:210
+#: src/hostlist/gnunet-daemon-hostlist_server.c:265
msgid "HELLOs without addresses encountered (ignored)"
msgstr ""
-#: src/hostlist/hostlist-server.c:224
+#: src/hostlist/gnunet-daemon-hostlist_server.c:282
msgid "bytes not included in hostlist (size limit)"
msgstr ""
-#: src/hostlist/hostlist-server.c:268
+#: src/hostlist/gnunet-daemon-hostlist_server.c:386
#, c-format
msgid "Refusing `%s' request to hostlist server\n"
msgstr ""
-#: src/hostlist/hostlist-server.c:271
+#: src/hostlist/gnunet-daemon-hostlist_server.c:389
msgid "hostlist requests refused (not HTTP GET)"
msgstr ""
-#: src/hostlist/hostlist-server.c:284
+#: src/hostlist/gnunet-daemon-hostlist_server.c:403
#, c-format
msgid "Refusing `%s' request with %llu bytes of upload data\n"
msgstr ""
-#: src/hostlist/hostlist-server.c:288
+#: src/hostlist/gnunet-daemon-hostlist_server.c:407
msgid "hostlist requests refused (upload data)"
msgstr ""
-#: src/hostlist/hostlist-server.c:296
+#: src/hostlist/gnunet-daemon-hostlist_server.c:414
msgid "Could not handle hostlist request since I do not have a response yet\n"
msgstr ""
-#: src/hostlist/hostlist-server.c:299
+#: src/hostlist/gnunet-daemon-hostlist_server.c:417
msgid "hostlist requests refused (not ready)"
msgstr ""
-#: src/hostlist/hostlist-server.c:303
+#: src/hostlist/gnunet-daemon-hostlist_server.c:422
msgid "Received request for our hostlist\n"
msgstr ""
-#: src/hostlist/hostlist-server.c:304
+#: src/hostlist/gnunet-daemon-hostlist_server.c:424
msgid "hostlist requests processed"
msgstr ""
-#: src/hostlist/hostlist-server.c:346
+#: src/hostlist/gnunet-daemon-hostlist_server.c:485
msgid "# hostlist advertisements send"
msgstr ""
-#: src/hostlist/hostlist-server.c:390
+#: src/hostlist/gnunet-daemon-hostlist_server.c:535
msgid "Advertisement message could not be queued by core\n"
msgstr ""
-#: src/hostlist/hostlist-server.c:557 src/peerinfo-tool/gnunet-peerinfo.c:639
-#: src/transport/gnunet-service-transport.c:1114
+#: src/hostlist/gnunet-daemon-hostlist_server.c:747
+#: src/peerinfo-tool/gnunet-peerinfo.c:736
+#: src/transport/gnunet-service-transport.c:852
msgid "Could not access PEERINFO service. Exiting.\n"
msgstr ""
-#: src/hostlist/hostlist-server.c:576
+#: src/hostlist/gnunet-daemon-hostlist_server.c:771
#, c-format
msgid "Hostlist service starts on %s:%llu\n"
msgstr ""
-#: src/hostlist/hostlist-server.c:590
+#: src/hostlist/gnunet-daemon-hostlist_server.c:786
#, c-format
msgid "Address to obtain hostlist: `%s'\n"
msgstr ""
-#: src/hostlist/hostlist-server.c:630
+#: src/hostlist/gnunet-daemon-hostlist_server.c:799
+msgid "BINDTOIP does not a valid IPv4 address! Ignoring BINDTOIPV4.\n"
+msgstr ""
+
+#: src/hostlist/gnunet-daemon-hostlist_server.c:812
+msgid "BINDTOIP does not a valid IPv4 address! Ignoring BINDTOIPV6.\n"
+msgstr ""
+
+#: src/hostlist/gnunet-daemon-hostlist_server.c:833
#, c-format
-msgid "`%s' is not a valid IP address! Ignoring BINDTOIP.\n"
+msgid "`%s' is not a valid IPv4 address! Ignoring BINDTOIPV4.\n"
msgstr ""
-#: src/hostlist/hostlist-server.c:673
+#: src/hostlist/gnunet-daemon-hostlist_server.c:853
#, c-format
+msgid "`%s' is not a valid IPv6 address! Ignoring BINDTOIPV6.\n"
+msgstr ""
+
+#: src/hostlist/gnunet-daemon-hostlist_server.c:893
+#, c-format
msgid "Could not start hostlist HTTP server on port %u\n"
msgstr ""
@@ -4431,7 +4762,8 @@
msgstr ""
#: src/identity/gnunet-identity.c:336
-msgid "set default identity to EGO for a subsystem SUBSYSTEM (use together
with -s)"
+msgid ""
+"set default identity to EGO for a subsystem SUBSYSTEM (use together with -s)"
msgstr ""
#: src/identity/gnunet-identity.c:339
@@ -4439,7 +4771,8 @@
msgstr ""
#: src/identity/gnunet-identity.c:342
-msgid "set default identity to EGO for a subsystem SUBSYSTEM (use together
with -e)"
+msgid ""
+"set default identity to EGO for a subsystem SUBSYSTEM (use together with -e)"
msgstr ""
#: src/identity/gnunet-identity.c:351
@@ -4493,53 +4826,10 @@
msgid "Failed to create directory `%s' for storing egos\n"
msgstr ""
-#: src/mesh/gnunet-mesh.c:357
-#, c-format
-msgid "Invalid target `%s'\n"
+#: src/identity/plugin_rest_identity.c:803
+msgid "Identity REST API initialized\n"
msgstr ""
-#: src/mesh/gnunet-mesh.c:607
-#, c-format
-msgid "Invalid peer ID `%s'\n"
-msgstr ""
-
-#: src/mesh/gnunet-mesh.c:650
-#, c-format
-msgid "Invalid tunnel owner `%s'\n"
-msgstr ""
-
-#: src/mesh/gnunet-mesh.c:716
-msgid "You must NOT give a TARGETwhen using 'request all' options\n"
-msgstr ""
-
-#: src/mesh/gnunet-mesh.c:807
-msgid "provide information about a particular connection"
-msgstr ""
-
-#: src/mesh/gnunet-mesh.c:810
-msgid "activate echo mode"
-msgstr ""
-
-#: src/mesh/gnunet-mesh.c:816
-msgid "port to listen to (default; 0)"
-msgstr ""
-
-#: src/mesh/gnunet-mesh.c:819 src/mesh/gnunet-mesh.c:822
-msgid "provide information about all peers"
-msgstr ""
-
-#: src/mesh/gnunet-mesh.c:825
-msgid "provide information about a particular tunnel"
-msgstr ""
-
-#: src/mesh/gnunet-mesh.c:828
-msgid "provide information about all tunnels"
-msgstr ""
-
-#: src/mesh/gnunet-service-mesh_peer.c:390
-msgid "Wrong CORE service\n"
-msgstr ""
-
#: src/mysql/mysql.c:174
#, c-format
msgid "Trying to use file `%s' for MySQL configuration.\n"
@@ -4565,9 +4855,9 @@
msgid "You must specify which zone should be accessed\n"
msgstr ""
-#: src/namecache/gnunet-namecache.c:195 src/namestore/gnunet-namestore.c:695
+#: src/namecache/gnunet-namecache.c:195
#, c-format
-msgid "Invalid public key for reverse lookup `%s'\n"
+msgid "Invalid public key for zone `%s'\n"
msgstr ""
#: src/namecache/gnunet-namecache.c:203
@@ -4575,7 +4865,7 @@
msgid "You must specify a name\n"
msgstr ""
-#: src/namecache/gnunet-namecache.c:234 src/namestore/gnunet-namestore.c:931
+#: src/namecache/gnunet-namecache.c:234 src/namestore/gnunet-namestore.c:1084
msgid "name of the record to add/delete/display"
msgstr ""
@@ -4583,7 +4873,7 @@
msgid "spezifies the public key of the zone to look in"
msgstr ""
-#: src/namecache/gnunet-namecache.c:248 src/namestore/gnunet-namestore.c:963
+#: src/namecache/gnunet-namecache.c:248 src/namestore/gnunet-namestore.c:1116
msgid "GNUnet zone manipulation tool"
msgstr ""
@@ -4602,194 +4892,236 @@
msgstr ""
#: src/namestore/gnunet-namestore.c:332
+#: src/namestore/plugin_rest_namestore.c:505
#, c-format
msgid "Deleting record failed, record does not exist%s%s\n"
msgstr ""
#: src/namestore/gnunet-namestore.c:339
+#: src/namestore/plugin_rest_namestore.c:514
#, c-format
msgid "Deleting record failed%s%s\n"
msgstr ""
-#: src/namestore/gnunet-namestore.c:558
+#: src/namestore/gnunet-namestore.c:477 src/namestore/gnunet-namestore.c:485
+#: src/namestore/gnunet-namestore.c:493
#, c-format
+msgid "A %s record exists already under `%s', no other records can be added.\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore.c:507 src/namestore/gnunet-namestore.c:519
+#: src/namestore/gnunet-namestore.c:531
+#, c-format
+msgid "Records already exist under `%s', cannot add `%s' record.\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore.c:628
+#: src/namestore/plugin_rest_namestore.c:538
+#, c-format
+msgid "There are no records under label `%s' that could be deleted.\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore.c:667
+#, c-format
+msgid ""
+"There are no records under label `%s' that match the request for deletion.\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore.c:708
+#, c-format
msgid "No options given\n"
msgstr ""
-#: src/namestore/gnunet-namestore.c:569
-#: src/namestore/gnunet-namestore-fcfsd.c:970
+#: src/namestore/gnunet-namestore.c:719
+#: src/namestore/gnunet-namestore-fcfsd.c:984
+#: src/namestore/plugin_rest_namestore.c:821
msgid "Failed to connect to namestore\n"
msgstr ""
-#: src/namestore/gnunet-namestore.c:577 src/namestore/gnunet-namestore.c:586
-#: src/namestore/gnunet-namestore.c:603 src/namestore/gnunet-namestore.c:625
-#: src/namestore/gnunet-namestore.c:665
+#: src/namestore/gnunet-namestore.c:727 src/namestore/gnunet-namestore.c:736
+#: src/namestore/gnunet-namestore.c:753 src/namestore/gnunet-namestore.c:775
+#: src/namestore/gnunet-namestore.c:815
#, c-format
msgid "Missing option `%s' for operation `%s'\n"
msgstr ""
-#: src/namestore/gnunet-namestore.c:578 src/namestore/gnunet-namestore.c:587
-#: src/namestore/gnunet-namestore.c:604 src/namestore/gnunet-namestore.c:626
+#: src/namestore/gnunet-namestore.c:728 src/namestore/gnunet-namestore.c:737
+#: src/namestore/gnunet-namestore.c:754 src/namestore/gnunet-namestore.c:776
msgid "add"
msgstr ""
-#: src/namestore/gnunet-namestore.c:595
+#: src/namestore/gnunet-namestore.c:745
+#: src/namestore/plugin_rest_namestore.c:608
#, c-format
msgid "Unsupported type `%s'\n"
msgstr ""
-#: src/namestore/gnunet-namestore.c:615
+#: src/namestore/gnunet-namestore.c:765
+#: src/namestore/plugin_rest_namestore.c:626
+#: src/namestore/plugin_rest_namestore.c:666
#, c-format
msgid "Value `%s' invalid for record type `%s'\n"
msgstr ""
-#: src/namestore/gnunet-namestore.c:651
+#: src/namestore/gnunet-namestore.c:801
#, c-format
msgid "Invalid time format `%s'\n"
msgstr ""
-#: src/namestore/gnunet-namestore.c:666
+#: src/namestore/gnunet-namestore.c:816
msgid "del"
msgstr ""
-#: src/namestore/gnunet-namestore.c:715
-#: src/peerinfo-tool/gnunet-peerinfo.c:723
+#: src/namestore/gnunet-namestore.c:844
#, c-format
+msgid "Invalid public key for reverse lookup `%s'\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore.c:868
+#: src/peerinfo-tool/gnunet-peerinfo.c:817
+#, c-format
msgid "Invalid URI `%s'\n"
msgstr ""
-#: src/namestore/gnunet-namestore.c:750
+#: src/namestore/gnunet-namestore.c:903
#, c-format
msgid "Invalid nick `%s'\n"
msgstr ""
-#: src/namestore/gnunet-namestore.c:790
+#: src/namestore/gnunet-namestore.c:943
+#: src/namestore/plugin_rest_namestore.c:851
#, c-format
msgid "Ego `%s' not known to identity service\n"
msgstr ""
-#: src/namestore/gnunet-namestore.c:817
+#: src/namestore/gnunet-namestore.c:970
+#: src/namestore/plugin_rest_namestore.c:878
#, c-format
msgid "No default ego configured in identity service\n"
msgstr ""
-#: src/namestore/gnunet-namestore.c:853
+#: src/namestore/gnunet-namestore.c:1006
+#: src/namestore/plugin_rest_namestore.c:917
#, c-format
msgid "Identity service is not running\n"
msgstr ""
-#: src/namestore/gnunet-namestore.c:865
+#: src/namestore/gnunet-namestore.c:1018
+#: src/namestore/plugin_rest_namestore.c:946
#, c-format
msgid "Cannot connect to identity service\n"
msgstr ""
-#: src/namestore/gnunet-namestore.c:913
+#: src/namestore/gnunet-namestore.c:1066
msgid "add record"
msgstr ""
-#: src/namestore/gnunet-namestore.c:916
+#: src/namestore/gnunet-namestore.c:1069
msgid "delete record"
msgstr ""
-#: src/namestore/gnunet-namestore.c:919
+#: src/namestore/gnunet-namestore.c:1072
msgid "display records"
msgstr ""
-#: src/namestore/gnunet-namestore.c:922
-msgid "expiration time for record to use (for adding only), \"never\" is
possible"
+#: src/namestore/gnunet-namestore.c:1075
+msgid ""
+"expiration time for record to use (for adding only), \"never\" is possible"
msgstr ""
-#: src/namestore/gnunet-namestore.c:925
+#: src/namestore/gnunet-namestore.c:1078
msgid "set the desired nick name for the zone"
msgstr ""
-#: src/namestore/gnunet-namestore.c:928
+#: src/namestore/gnunet-namestore.c:1081
msgid "monitor changes in the namestore"
msgstr ""
-#: src/namestore/gnunet-namestore.c:934
+#: src/namestore/gnunet-namestore.c:1087
msgid "determine our name for the given PKEY"
msgstr ""
-#: src/namestore/gnunet-namestore.c:937
+#: src/namestore/gnunet-namestore.c:1090
msgid "type of the record to add/delete/display"
msgstr ""
-#: src/namestore/gnunet-namestore.c:940
+#: src/namestore/gnunet-namestore.c:1093
msgid "URI to import into our zone"
msgstr ""
-#: src/namestore/gnunet-namestore.c:943
+#: src/namestore/gnunet-namestore.c:1096
msgid "value of the record to add/delete"
msgstr ""
-#: src/namestore/gnunet-namestore.c:946
+#: src/namestore/gnunet-namestore.c:1099
msgid "create or list public record"
msgstr ""
-#: src/namestore/gnunet-namestore.c:949
-msgid "create shadow record (only valid if all other records of the same type
have expired"
+#: src/namestore/gnunet-namestore.c:1102
+msgid ""
+"create shadow record (only valid if all other records of the same type have "
+"expired"
msgstr ""
-#: src/namestore/gnunet-namestore.c:952
+#: src/namestore/gnunet-namestore.c:1105
msgid "name of the ego controlling the zone"
msgstr ""
-#: src/namestore/gnunet-namestore-fcfsd.c:464
+#: src/namestore/gnunet-namestore-fcfsd.c:478
#, c-format
msgid "Unsupported form value `%s'\n"
msgstr ""
-#: src/namestore/gnunet-namestore-fcfsd.c:491
+#: src/namestore/gnunet-namestore-fcfsd.c:505
#, c-format
msgid "Failed to create record for domain `%s': %s\n"
msgstr ""
-#: src/namestore/gnunet-namestore-fcfsd.c:525
+#: src/namestore/gnunet-namestore-fcfsd.c:539
#, c-format
msgid "Found existing name `%s' for the given key\n"
msgstr ""
-#: src/namestore/gnunet-namestore-fcfsd.c:534
+#: src/namestore/gnunet-namestore-fcfsd.c:548
msgid "Error when mapping zone to name\n"
msgstr ""
-#: src/namestore/gnunet-namestore-fcfsd.c:596
+#: src/namestore/gnunet-namestore-fcfsd.c:610
#, c-format
msgid "Found %u existing records for domain `%s'\n"
msgstr ""
-#: src/namestore/gnunet-namestore-fcfsd.c:652
+#: src/namestore/gnunet-namestore-fcfsd.c:666
#, c-format
msgid "Failed to create page for `%s'\n"
msgstr ""
-#: src/namestore/gnunet-namestore-fcfsd.c:668
+#: src/namestore/gnunet-namestore-fcfsd.c:682
#, c-format
msgid "Failed to setup post processor for `%s'\n"
msgstr ""
-#: src/namestore/gnunet-namestore-fcfsd.c:704
+#: src/namestore/gnunet-namestore-fcfsd.c:718
msgid "Domain name must not contain `.'\n"
msgstr ""
-#: src/namestore/gnunet-namestore-fcfsd.c:712
+#: src/namestore/gnunet-namestore-fcfsd.c:726
msgid "Domain name must not contain `+'\n"
msgstr ""
-#: src/namestore/gnunet-namestore-fcfsd.c:910
+#: src/namestore/gnunet-namestore-fcfsd.c:924
msgid "No ego configured for `fcfsd` subsystem\n"
msgstr ""
-#: src/namestore/gnunet-namestore-fcfsd.c:936
+#: src/namestore/gnunet-namestore-fcfsd.c:950
msgid "Failed to start HTTP server\n"
msgstr ""
-#: src/namestore/gnunet-namestore-fcfsd.c:978
+#: src/namestore/gnunet-namestore-fcfsd.c:992
msgid "Failed to connect to identity\n"
msgstr ""
-#: src/namestore/gnunet-namestore-fcfsd.c:1011
+#: src/namestore/gnunet-namestore-fcfsd.c:1025
msgid "GNU Name System First Come First Serve name registration service"
msgstr ""
@@ -4802,6 +5134,10 @@
msgid "Namestore failed to store record\n"
msgstr ""
+#: src/namestore/plugin_rest_namestore.c:1023
+msgid "Namestore REST API initialized\n"
+msgstr ""
+
#: src/nat/gnunet-nat-server.c:279
#, c-format
msgid "Please pass valid port number as the first argument! (got `%s')\n"
@@ -4811,129 +5147,198 @@
msgid "GNUnet NAT traversal test helper daemon"
msgstr ""
-#: src/nat/nat_auto.c:170
-msgid "NAT traversal with ICMP Server timed out.\n"
-msgstr ""
-
-#: src/nat/nat_auto.c:203
+#: src/nat/nat_auto.c:179
msgid "NAT traversal with ICMP Server succeeded.\n"
msgstr ""
-#: src/nat/nat_auto.c:204
+#: src/nat/nat_auto.c:180
msgid "NAT traversal with ICMP Server failed.\n"
msgstr ""
-#: src/nat/nat_auto.c:225
+#: src/nat/nat_auto.c:201
msgid "Testing connection reversal with ICMP server.\n"
msgstr ""
-#: src/nat/nat_auto.c:274
+#: src/nat/nat_auto.c:249
#, c-format
msgid "Detected external IP `%s'\n"
msgstr ""
-#: src/nat/nat_auto.c:344
+#: src/nat/nat_auto.c:327
msgid "This system has a global IPv6 address, setting IPv6 to supported.\n"
msgstr ""
-#: src/nat/nat_auto.c:360
+#: src/nat/nat_auto.c:343
#, c-format
msgid "Detected internal network address `%s'.\n"
msgstr ""
-#: src/nat/nat_auto.c:413
+#: src/nat/nat_auto.c:406
msgid "upnpc found, enabling its use\n"
msgstr ""
-#: src/nat/nat_auto.c:414
+#: src/nat/nat_auto.c:407
msgid "upnpc not found\n"
msgstr ""
-#: src/nat/nat_auto.c:447
-msgid "gnunet-helper-nat-server found, testing it\n"
+#: src/nat/nat_auto.c:437
+msgid "test_icmp_server not possible, as we have no public IPv4 address\n"
msgstr ""
-#: src/nat/nat_auto.c:448
-msgid "No working gnunet-helper-nat-server found\n"
+#: src/nat/nat_auto.c:445 src/nat/nat_auto.c:490
+msgid "test_icmp_server not possible, as we are not behind NAT\n"
msgstr ""
-#: src/nat/nat_auto.c:482
-msgid "gnunet-helper-nat-client found, enabling it\n"
+#: src/nat/nat_auto.c:453 src/nat/nat_auto.c:498
+msgid "No working gnunet-helper-nat-server found\n"
msgstr ""
#: src/nat/nat_auto.c:483
-msgid "gnunet-helper-nat-client not found or behind NAT, disabling it\n"
+msgid "test_icmp_client not possible, as we have no internal IPv4 address\n"
msgstr ""
-#: src/nat/nat.c:867
+#: src/nat/nat.c:862
#, c-format
msgid "gnunet-helper-nat-server generated malformed address `%s'\n"
msgstr ""
-#: src/nat/nat.c:917
+#: src/nat/nat.c:912
#, c-format
msgid "Failed to start %s\n"
msgstr ""
-#: src/nat/nat.c:1205
+#: src/nat/nat.c:1027
+msgid "Error while running upnp client:\n"
+msgstr ""
+
+#: src/nat/nat.c:1097
+#, c-format
+msgid "Failed to run upnp client for port %u\n"
+msgstr ""
+
+#: src/nat/nat.c:1237
msgid "malformed"
msgstr ""
-#: src/nat/nat.c:1276 src/nat/nat.c:1288
+#: src/nat/nat.c:1291
+msgid ""
+"UPnP enabled in configuration, but UPnP client `upnpc` command not found, "
+"disabling UPnP \n"
+msgstr ""
+
+#: src/nat/nat.c:1318 src/nat/nat.c:1330
#, c-format
-msgid "Configuration requires `%s', but binary is not installed properly (SUID
bit not set). Option disabled.\n"
+msgid ""
+"Configuration requires `%s', but binary is not installed properly (SUID bit "
+"not set). Option disabled.\n"
msgstr ""
-#: src/nat/nat.c:1426
+#: src/nat/nat.c:1468
msgid "Internal IP address not known, cannot use ICMP NAT traversal method\n"
msgstr ""
-#: src/nat/nat.c:1442
+#: src/nat/nat.c:1484
#, c-format
msgid "Running gnunet-helper-nat-client %s %s %u\n"
msgstr ""
-#: src/nat/nat_mini.c:155
-msgid "no valid address was returned by `external-ip'"
+#: src/nat/nat.c:1569
+msgid "Operation Successful"
msgstr ""
-#: src/nat/nat_mini.c:175
-msgid "`external-ip' command not found"
+#: src/nat/nat.c:1571
+msgid "Internal Failure (IPC, ...)"
msgstr ""
-#: src/nat/nat_mini.c:201
-msgid "`external-ip' command not found\n"
+#: src/nat/nat.c:1573
+msgid "Failure in network subsystem, check permissions."
msgstr ""
-#: src/nat/nat_mini.c:366
+#: src/nat/nat.c:1575
+msgid "Encountered timeout while performing operation"
+msgstr ""
+
+#: src/nat/nat.c:1577
+msgid "detected that we are offline"
+msgstr ""
+
+#: src/nat/nat.c:1579
+msgid "`upnpc` command not found"
+msgstr ""
+
+#: src/nat/nat.c:1581
msgid "Failed to run `upnpc` command"
msgstr ""
-#: src/nat/nat_mini.c:512
+#: src/nat/nat.c:1583
msgid "`upnpc' command took too long, process killed"
msgstr ""
-#: src/nat/nat_mini.c:540
+#: src/nat/nat.c:1585
msgid "`upnpc' command failed to establish port mapping"
msgstr ""
-#: src/nat/nat_mini.c:604
-msgid "`upnpc' command not found\n"
+#: src/nat/nat.c:1587
+msgid "`external-ip' command not found"
msgstr ""
-#: src/nat/nat_mini.c:608
-msgid "`upnpc` command not found"
+#: src/nat/nat.c:1589
+msgid "Failed to run `external-ip` command"
msgstr ""
-#: src/nat/nat_test.c:351
+#: src/nat/nat.c:1591
+msgid "`external-ip' command output invalid"
+msgstr ""
+
+#: src/nat/nat.c:1593
+msgid "no valid address was returned by `external-ip'"
+msgstr ""
+
+#: src/nat/nat.c:1595
+msgid "Could not determine interface with internal/local network address"
+msgstr ""
+
+#: src/nat/nat.c:1597
+msgid "No functioning gnunet-helper-nat-server installation found"
+msgstr ""
+
+#: src/nat/nat.c:1599
+msgid "NAT test could not be initialized"
+msgstr ""
+
+#: src/nat/nat.c:1601
+msgid "NAT test timeout reached"
+msgstr ""
+
+#: src/nat/nat.c:1603
+msgid "could not register NAT"
+msgstr ""
+
+#: src/nat/nat.c:1605
+msgid "No working gnunet-helper-nat-client installation found"
+msgstr ""
+
+#: src/nat/nat_mini.c:203
+msgid "`external-ip' command not found\n"
+msgstr ""
+
+#: src/nat/nat_mini.c:609
+msgid "`upnpc' command not found\n"
+msgstr ""
+
+#: src/nat/nat_test.c:360
msgid "Failed to connect to `gnunet-nat-server'\n"
msgstr ""
-#: src/nat/nat_test.c:423
+#: src/nat/nat_test.c:462
#, c-format
msgid "Failed to create listen socket bound to `%s' for NAT test: %s\n"
msgstr ""
+#: src/nat/nat_test.c:497
+msgid "NAT test failed to start NAT library\n"
+msgstr ""
+
#: src/nse/gnunet-nse.c:117
msgid "NSE service is not running\n"
msgstr ""
@@ -4954,10 +5359,6 @@
msgid "name of the file for writing connection information and statistics"
msgstr ""
-#: src/nse/gnunet-nse-profiler.c:864 src/testbed/gnunet-testbed-profiler.c:306
-msgid "name of the file with the login information for the testbed"
-msgstr ""
-
#: src/nse/gnunet-nse-profiler.c:867
msgid "name of the file for writing the main results"
msgstr ""
@@ -4974,8 +5375,8 @@
msgid "Measure quality and performance of the NSE service."
msgstr ""
-#: src/nse/gnunet-service-nse.c:1517
-#: src/revocation/gnunet-service-revocation.c:789 src/util/gnunet-scrypt.c:248
+#: src/nse/gnunet-service-nse.c:1537
+#: src/revocation/gnunet-service-revocation.c:827 src/util/gnunet-scrypt.c:260
msgid "Value is too large.\n"
msgstr ""
@@ -4995,58 +5396,59 @@
msgid "Failed to parse HELLO in file `%s'\n"
msgstr ""
-#: src/peerinfo/gnunet-service-peerinfo.c:466
+#: src/peerinfo/gnunet-service-peerinfo.c:468
msgid "# peers known"
msgstr ""
-#: src/peerinfo/gnunet-service-peerinfo.c:503
+#: src/peerinfo/gnunet-service-peerinfo.c:506
#, c-format
-msgid "File `%s' in directory `%s' does not match naming convention.
Removed.\n"
+msgid ""
+"File `%s' in directory `%s' does not match naming convention. Removed.\n"
msgstr ""
-#: src/peerinfo/gnunet-service-peerinfo.c:653
+#: src/peerinfo/gnunet-service-peerinfo.c:662
#, c-format
msgid "Scanning directory `%s'\n"
msgstr ""
-#: src/peerinfo/gnunet-service-peerinfo.c:658
+#: src/peerinfo/gnunet-service-peerinfo.c:668
#, c-format
msgid "Still no peers found in `%s'!\n"
msgstr ""
-#: src/peerinfo/gnunet-service-peerinfo.c:994
+#: src/peerinfo/gnunet-service-peerinfo.c:1037
#, c-format
msgid "Cleaning up directory `%s'\n"
msgstr ""
-#: src/peerinfo/gnunet-service-peerinfo.c:1287
+#: src/peerinfo/gnunet-service-peerinfo.c:1358
#, c-format
msgid "Importing HELLOs from `%s'\n"
msgstr ""
-#: src/peerinfo/gnunet-service-peerinfo.c:1298
+#: src/peerinfo/gnunet-service-peerinfo.c:1371
msgid "Skipping import of included HELLOs\n"
msgstr ""
-#: src/peerinfo/peerinfo_api.c:236
+#: src/peerinfo/peerinfo_api.c:237
msgid "aborted due to explicit disconnect request"
msgstr ""
-#: src/peerinfo/peerinfo_api.c:356
+#: src/peerinfo/peerinfo_api.c:363
msgid "failed to transmit request (service down?)"
msgstr ""
-#: src/peerinfo/peerinfo_api.c:506
+#: src/peerinfo/peerinfo_api.c:518
msgid "Failed to receive response from `PEERINFO' service."
msgstr ""
-#: src/peerinfo/peerinfo_api.c:547 src/peerinfo/peerinfo_api.c:566
-#: src/peerinfo/peerinfo_api.c:581 src/peerinfo/peerinfo_api.c:592
-#: src/peerinfo/peerinfo_api.c:603
+#: src/peerinfo/peerinfo_api.c:562 src/peerinfo/peerinfo_api.c:585
+#: src/peerinfo/peerinfo_api.c:602 src/peerinfo/peerinfo_api.c:615
+#: src/peerinfo/peerinfo_api.c:630
msgid "Received invalid message from `PEERINFO' service."
msgstr ""
-#: src/peerinfo/peerinfo_api.c:678
+#: src/peerinfo/peerinfo_api.c:719
msgid "Timeout transmitting iteration request to `PEERINFO' service."
msgstr ""
@@ -5055,110 +5457,198 @@
msgid "Could not connect to `%s' service.\n"
msgstr ""
-#: src/peerinfo-tool/gnunet-peerinfo.c:232
+#: src/peerinfo-tool/gnunet-peerinfo.c:245
#, c-format
msgid "%sPeer `%s'\n"
msgstr ""
-#: src/peerinfo-tool/gnunet-peerinfo.c:239
+#: src/peerinfo-tool/gnunet-peerinfo.c:252
#, c-format
msgid "\tExpires: %s \t %s\n"
msgstr ""
-#: src/peerinfo-tool/gnunet-peerinfo.c:428
+#: src/peerinfo-tool/gnunet-peerinfo.c:301
#, c-format
-msgid "Failure: Did not receive %s\n"
+msgid "Failure: Cannot convert address to string for peer `%s'\n"
msgstr ""
-#: src/peerinfo-tool/gnunet-peerinfo.c:436
+#: src/peerinfo-tool/gnunet-peerinfo.c:463
#, c-format
msgid "Failure: Received invalid %s\n"
msgstr ""
-#: src/peerinfo-tool/gnunet-peerinfo.c:445
+#: src/peerinfo-tool/gnunet-peerinfo.c:477
#, c-format
msgid "Failed to write HELLO with %u bytes to file `%s'\n"
msgstr ""
-#: src/peerinfo-tool/gnunet-peerinfo.c:458
+#: src/peerinfo-tool/gnunet-peerinfo.c:496
#, c-format
msgid "Wrote %s HELLO containing %u addresses with %u bytes to file `%s'\n"
msgstr ""
-#: src/peerinfo-tool/gnunet-peerinfo.c:522
+#: src/peerinfo-tool/gnunet-peerinfo.c:566
#, c-format
msgid "Failure adding HELLO: %s\n"
msgstr ""
-#: src/peerinfo-tool/gnunet-peerinfo.c:633
+#: src/peerinfo-tool/gnunet-peerinfo.c:695
#, c-format
-msgid "Service `%s' is not running, please start GNUnet\n"
+msgid "Failed to get my own HELLO from this peer!\n"
msgstr ""
-#: src/peerinfo-tool/gnunet-peerinfo.c:654 src/util/gnunet-scrypt.c:224
+#: src/peerinfo-tool/gnunet-peerinfo.c:727
#, c-format
-msgid "Loading hostkey from `%s' failed.\n"
+msgid "Service `%s' is not running, please start GNUnet\n"
msgstr ""
-#: src/peerinfo-tool/gnunet-peerinfo.c:745
+#: src/peerinfo-tool/gnunet-peerinfo.c:841
#, c-format
msgid "I am peer `%s'.\n"
msgstr ""
-#: src/peerinfo-tool/gnunet-peerinfo.c:789
+#: src/peerinfo-tool/gnunet-peerinfo.c:882
msgid "don't resolve host names"
msgstr ""
-#: src/peerinfo-tool/gnunet-peerinfo.c:792
+#: src/peerinfo-tool/gnunet-peerinfo.c:885
msgid "output only the identity strings"
msgstr ""
-#: src/peerinfo-tool/gnunet-peerinfo.c:795
+#: src/peerinfo-tool/gnunet-peerinfo.c:888
msgid "include friend-only information"
msgstr ""
-#: src/peerinfo-tool/gnunet-peerinfo.c:798
+#: src/peerinfo-tool/gnunet-peerinfo.c:891
msgid "output our own identity only"
msgstr ""
-#: src/peerinfo-tool/gnunet-peerinfo.c:801
+#: src/peerinfo-tool/gnunet-peerinfo.c:894
msgid "list all known peers"
msgstr ""
-#: src/peerinfo-tool/gnunet-peerinfo.c:804
+#: src/peerinfo-tool/gnunet-peerinfo.c:897
msgid "dump hello to file"
msgstr ""
-#: src/peerinfo-tool/gnunet-peerinfo.c:807
+#: src/peerinfo-tool/gnunet-peerinfo.c:900
msgid "also output HELLO uri(s)"
msgstr ""
-#: src/peerinfo-tool/gnunet-peerinfo.c:810
+#: src/peerinfo-tool/gnunet-peerinfo.c:903
msgid "add given HELLO uri to the database"
msgstr ""
-#: src/peerinfo-tool/gnunet-peerinfo.c:821
+#: src/peerinfo-tool/gnunet-peerinfo.c:917
msgid "Print information about peers."
msgstr ""
#: src/peerinfo-tool/gnunet-peerinfo_plugins.c:105
-#: src/transport/gnunet-service-transport_plugins.c:128
+#: src/transport/gnunet-service-transport_plugins.c:168
#, c-format
msgid "Starting transport plugins `%s'\n"
msgstr ""
#: src/peerinfo-tool/gnunet-peerinfo_plugins.c:109
-#: src/transport/gnunet-service-transport_plugins.c:133
+#: src/transport/gnunet-service-transport_plugins.c:173
#, c-format
msgid "Loading `%s' transport plugin\n"
msgstr ""
#: src/peerinfo-tool/gnunet-peerinfo_plugins.c:129
-#: src/transport/gnunet-service-transport_plugins.c:165
+#: src/transport/gnunet-service-transport_plugins.c:208
#, c-format
msgid "Failed to load transport plugin for `%s'\n"
msgstr ""
+#: src/peerstore/gnunet-peerstore.c:92
+msgid "peerstore"
+msgstr ""
+
+#: src/peerstore/gnunet-service-peerstore.c:384
+msgid "Malformed iterate request.\n"
+msgstr ""
+
+#: src/peerstore/gnunet-service-peerstore.c:391
+msgid "Sub system not supplied in client iterate request.\n"
+msgstr ""
+
+#: src/peerstore/gnunet-service-peerstore.c:451
+msgid "Malformed store request from client\n"
+msgstr ""
+
+#: src/peerstore/gnunet-service-peerstore.c:459
+msgid "Full key not supplied in client store request\n"
+msgstr ""
+
+#: src/peerstore/gnunet-service-peerstore.c:478
+msgid "Failed to store requested value, database error."
+msgstr ""
+
+#: src/peerstore/gnunet-service-peerstore.c:557
+msgid "No database backend configured\n"
+msgstr ""
+
+#: src/peerstore/gnunet-service-peerstore.c:568
+#, c-format
+msgid "Could not load database backend `%s'\n"
+msgstr ""
+
+#: src/peerstore/peerstore_api.c:329 src/sensor/sensor_api.c:179
+#, c-format
+msgid "Received an error notification from MQ of type: %d\n"
+msgstr ""
+
+#: src/peerstore/peerstore_api.c:375
+msgid "timeout"
+msgstr ""
+
+#: src/peerstore/peerstore_api.c:402
+msgid "Iteration canceled due to reconnection."
+msgstr ""
+
+#: src/peerstore/peerstore_api.c:681
+msgid "Unexpected iteration response, this should not happen.\n"
+msgstr ""
+
+#: src/peerstore/peerstore_api.c:692
+msgid "Error communicating with `PEERSTORE' service."
+msgstr ""
+
+#: src/peerstore/peerstore_api.c:711
+msgid "Received a malformed response from service."
+msgstr ""
+
+#: src/peerstore/peerstore_api.c:821
+msgid ""
+"Problem receiving a watch response, no way to determine which request.\n"
+msgstr ""
+
+#: src/peerstore/peerstore_api.c:833
+msgid "Received a watch result for a non existing watch.\n"
+msgstr ""
+
+#: src/peerstore/plugin_peerstore_sqlite.c:398
+#: src/psycstore/plugin_psycstore_sqlite.c:286
+#, c-format
+msgid ""
+"Error executing SQL query: %s\n"
+" %s\n"
+msgstr ""
+
+#: src/peerstore/plugin_peerstore_sqlite.c:422
+#: src/psycstore/plugin_psycstore_sqlite.c:263
+#, c-format
+msgid ""
+"Error preparing SQL query: %s\n"
+" %s\n"
+msgstr ""
+
+#: src/peerstore/plugin_peerstore_sqlite.c:504
+#, c-format
+msgid "Unable to create indices: %s.\n"
+msgstr ""
+
#: src/postgres/postgres.c:59
#, c-format
msgid "`%s:%s' failed at %s:%d with error: %s"
@@ -5169,72 +5659,72 @@
msgid "Unable to initialize Postgres: %s"
msgstr ""
-#: src/psycstore/gnunet-service-psycstore.c:200
+#: src/psycstore/gnunet-service-psycstore.c:260
msgid "Failed to store membership information!\n"
msgstr ""
-#: src/psycstore/gnunet-service-psycstore.c:224
+#: src/psycstore/gnunet-service-psycstore.c:284
msgid "Failed to test membership!\n"
msgstr ""
-#: src/psycstore/gnunet-service-psycstore.c:246
+#: src/psycstore/gnunet-service-psycstore.c:306
msgid "Failed to store fragment!\n"
msgstr ""
-#: src/psycstore/gnunet-service-psycstore.c:272
+#: src/psycstore/gnunet-service-psycstore.c:362
msgid "Failed to get fragment!\n"
msgstr ""
-#: src/psycstore/gnunet-service-psycstore.c:299
+#: src/psycstore/gnunet-service-psycstore.c:402
msgid "Failed to get message!\n"
msgstr ""
-#: src/psycstore/gnunet-service-psycstore.c:328
+#: src/psycstore/gnunet-service-psycstore.c:433
msgid "Failed to get message fragment!\n"
msgstr ""
-#: src/psycstore/gnunet-service-psycstore.c:356
+#: src/psycstore/gnunet-service-psycstore.c:461
msgid "Failed to get master counters!\n"
msgstr ""
-#: src/psycstore/gnunet-service-psycstore.c:392
-#: src/psycstore/gnunet-service-psycstore.c:465
+#: src/psycstore/gnunet-service-psycstore.c:497
+#: src/psycstore/gnunet-service-psycstore.c:570
msgid "Tried to set invalid state variable name!\n"
msgstr ""
-#: src/psycstore/gnunet-service-psycstore.c:408
+#: src/psycstore/gnunet-service-psycstore.c:513
msgid "Failed to begin modifying state!\n"
msgstr ""
-#: src/psycstore/gnunet-service-psycstore.c:431
+#: src/psycstore/gnunet-service-psycstore.c:536
#, c-format
msgid "Unknown operator: %c\n"
msgstr ""
-#: src/psycstore/gnunet-service-psycstore.c:441
+#: src/psycstore/gnunet-service-psycstore.c:546
msgid "Failed to end modifying state!\n"
msgstr ""
-#: src/psycstore/gnunet-service-psycstore.c:479
+#: src/psycstore/gnunet-service-psycstore.c:584
msgid "Failed to begin synchronizing state!\n"
msgstr ""
-#: src/psycstore/gnunet-service-psycstore.c:495
+#: src/psycstore/gnunet-service-psycstore.c:600
msgid "Failed to end synchronizing state!\n"
msgstr ""
-#: src/psycstore/gnunet-service-psycstore.c:515
-#: src/psycstore/gnunet-service-psycstore.c:534
+#: src/psycstore/gnunet-service-psycstore.c:620
+#: src/psycstore/gnunet-service-psycstore.c:639
msgid "Failed to reset state!\n"
msgstr ""
-#: src/psycstore/gnunet-service-psycstore.c:557
-#: src/psycstore/gnunet-service-psycstore.c:608
+#: src/psycstore/gnunet-service-psycstore.c:662
+#: src/psycstore/gnunet-service-psycstore.c:713
msgid "Tried to get invalid state variable name!\n"
msgstr ""
-#: src/psycstore/gnunet-service-psycstore.c:584
-#: src/psycstore/gnunet-service-psycstore.c:623
+#: src/psycstore/gnunet-service-psycstore.c:689
+#: src/psycstore/gnunet-service-psycstore.c:728
msgid "Failed to get state variable!\n"
msgstr ""
@@ -5243,21 +5733,7 @@
msgid "`%s' failed at %s:%d with error: %s (%d)\n"
msgstr ""
-#: src/psycstore/plugin_psycstore_sqlite.c:253
-#, c-format
-msgid ""
-"Error preparing SQL query: %s\n"
-" %s\n"
-msgstr ""
-
-#: src/psycstore/plugin_psycstore_sqlite.c:276
-#, c-format
-msgid ""
-"Error executing SQL query: %s\n"
-" %s\n"
-msgstr ""
-
-#: src/psycstore/plugin_psycstore_sqlite.c:1796
+#: src/psycstore/plugin_psycstore_sqlite.c:1932
msgid "SQLite database running\n"
msgstr ""
@@ -5290,7 +5766,7 @@
msgstr ""
#: src/pt/gnunet-daemon-pt.c:888
-msgid "# DNS requests dropped (DNS mesh channel down)"
+msgid "# DNS requests dropped (DNS cadet channel down)"
msgstr ""
#: src/pt/gnunet-daemon-pt.c:896
@@ -5323,7 +5799,7 @@
msgstr ""
#: src/regex/gnunet-daemon-regexprofiler.c:380
-msgid "Daemon to announce regular expressions for the peer using mesh."
+msgid "Daemon to announce regular expressions for the peer using cadet."
msgstr ""
#: src/regex/gnunet-regex-profiler.c:1288
@@ -5400,6 +5876,14 @@
msgid "Regex `%s' is too long!\n"
msgstr ""
+#: src/rest/gnunet-rest-server.c:766
+msgid "listen on specified port (default: 7776)"
+msgstr ""
+
+#: src/rest/gnunet-rest-server.c:783
+msgid "GNUnet REST server"
+msgstr ""
+
#: src/revocation/gnunet-revocation.c:126
#, c-format
msgid "Key `%s' is valid\n"
@@ -5465,7 +5949,8 @@
msgstr ""
#: src/revocation/gnunet-revocation.c:421
-msgid "Testing and revoking at the same time is not allowed, only executing
test.\n"
+msgid ""
+"Testing and revoking at the same time is not allowed, only executing test.\n"
msgstr ""
#: src/revocation/gnunet-revocation.c:441
@@ -5486,7 +5971,9 @@
msgstr ""
#: src/revocation/gnunet-revocation.c:507
-msgid "revoke the private key associated for the the private key associated
with the ego NAME "
+msgid ""
+"revoke the private key associated for the the private key associated with "
+"the ego NAME "
msgstr ""
#: src/revocation/gnunet-revocation.c:510
@@ -5497,349 +5984,453 @@
msgid "test if the public key KEY has been revoked"
msgstr ""
-#: src/revocation/gnunet-service-revocation.c:272
-msgid "Duplicate revocation received from peer. Ignored.\n"
+#: src/revocation/gnunet-service-revocation.c:427
+msgid "# unsupported revocations received via set union"
msgstr ""
-#: src/revocation/gnunet-service-revocation.c:434
+#: src/revocation/gnunet-service-revocation.c:436
+msgid "# revocation messages received via set union"
+msgstr ""
+
+#: src/revocation/gnunet-service-revocation.c:441
#, c-format
msgid "Error computing revocation set union with %s\n"
msgstr ""
-#: src/revocation/gnunet-service-revocation.c:486
+#: src/revocation/gnunet-service-revocation.c:445
+msgid "# revocation set unions failed"
+msgstr ""
+
+#: src/revocation/gnunet-service-revocation.c:454
+msgid "# revocation set unions completed"
+msgstr ""
+
+#: src/revocation/gnunet-service-revocation.c:493
+#: src/revocation/gnunet-service-revocation.c:759
msgid "SET service crashed, terminating revocation service\n"
msgstr ""
-#: src/revocation/gnunet-service-revocation.c:812
+#: src/revocation/gnunet-service-revocation.c:851
msgid "Could not open revocation database file!"
msgstr ""
-#: src/scalarproduct/gnunet-scalarproduct.c:225
+#: src/rps/gnunet-rps.c:67
+msgid "rps"
+msgstr ""
+
+#: src/scalarproduct/gnunet-scalarproduct.c:221
msgid "You must specify at least one message ID to check!\n"
msgstr ""
-#: src/scalarproduct/gnunet-scalarproduct.c:232
+#: src/scalarproduct/gnunet-scalarproduct.c:228
msgid "This program needs a session identifier for comparing vectors.\n"
msgstr ""
-#: src/scalarproduct/gnunet-scalarproduct.c:239
-msgid "Please give a session key for --input_key!\n"
+#: src/scalarproduct/gnunet-scalarproduct.c:241
+#, c-format
+msgid ""
+"Tried to set initiator mode, as peer ID was given. However, `%s' is not a "
+"valid peer identifier.\n"
msgstr ""
-#: src/scalarproduct/gnunet-scalarproduct.c:251
-#, c-format
-msgid "Tried to set initiator mode, as peer ID was given. However, `%s' is not
a valid peer identifier.\n"
+#: src/scalarproduct/gnunet-scalarproduct.c:259
+msgid "Need elements to compute the scalarproduct, got none.\n"
msgstr ""
-#: src/scalarproduct/gnunet-scalarproduct.c:278
-#: src/scalarproduct/gnunet-scalarproduct.c:314
+#: src/scalarproduct/gnunet-scalarproduct.c:281
#, c-format
-msgid "Could not convert `%s' to int32_t.\n"
+msgid "Malformed input, could not parse `%s'\n"
msgstr ""
-#: src/scalarproduct/gnunet-scalarproduct.c:286
-msgid "Need elements to compute the vectorproduct, got none.\n"
+#: src/scalarproduct/gnunet-scalarproduct.c:299
+#, c-format
+msgid "Could not convert `%s' to int64_t.\n"
msgstr ""
-#: src/scalarproduct/gnunet-scalarproduct.c:346
+#: src/scalarproduct/gnunet-scalarproduct.c:326
#, c-format
-msgid "Could not convert `%s' to integer.\n"
+msgid "Failed to initiate computation, were all keys unique?\n"
msgstr ""
-#: src/scalarproduct/gnunet-scalarproduct.c:407
-msgid "A comma separated list of elements to compare as vector with our remote
peer."
+#: src/scalarproduct/gnunet-scalarproduct.c:350
+msgid ""
+"A comma separated list of elements to compare as vector with our remote peer."
msgstr ""
-#: src/scalarproduct/gnunet-scalarproduct.c:410
-msgid "A comma separated mask to select which elements should actually be
compared."
+#: src/scalarproduct/gnunet-scalarproduct.c:353
+msgid ""
+"[Optional] peer to calculate our scalarproduct with. If this parameter is "
+"not given, the service will wait for a remote peer to compute the request."
msgstr ""
-#: src/scalarproduct/gnunet-scalarproduct.c:413
-msgid "[Optional] peer to calculate our scalarproduct with. If this parameter
is not given, the service will wait for a remote peer to compute the request."
-msgstr ""
-
-#: src/scalarproduct/gnunet-scalarproduct.c:416
+#: src/scalarproduct/gnunet-scalarproduct.c:356
msgid "Transaction ID shared with peer."
msgstr ""
-#: src/scalarproduct/gnunet-scalarproduct.c:425
+#: src/scalarproduct/gnunet-scalarproduct.c:365
msgid "Calculate the Vectorproduct with a GNUnet peer."
msgstr ""
-#: src/scalarproduct/gnunet-service-scalarproduct.c:541
-#, c-format
-msgid "Client (%p) disconnected from us.\n"
+#: src/scalarproduct/gnunet-service-scalarproduct_alice.c:1419
+#: src/scalarproduct/gnunet-service-scalarproduct_bob.c:1564
+msgid "Connect to CADET failed\n"
msgstr ""
-#: src/scalarproduct/gnunet-service-scalarproduct.c:613
-#: src/scalarproduct/gnunet-service-scalarproduct.c:702
-#, c-format
-msgid "Could not send message to client (%p)!\n"
+#: src/scalarproduct/scalarproduct_api.c:296
+msgid "Keys given to SCALARPRODUCT not unique!\n"
msgstr ""
-#: src/scalarproduct/gnunet-service-scalarproduct.c:619
-#, c-format
-msgid "Sending session-end notification to client (%p) for session %s\n"
+#: src/secretsharing/gnunet-secretsharing-profiler.c:613
+msgid "dkg start delay"
msgstr ""
-#: src/scalarproduct/gnunet-service-scalarproduct.c:712
-#, c-format
-msgid "Sent result to client (%p), this session (%s) has ended!\n"
+#: src/secretsharing/gnunet-secretsharing-profiler.c:616
+msgid "dkg timeout"
msgstr ""
-#: src/scalarproduct/gnunet-service-scalarproduct.c:766
-#: src/scalarproduct/gnunet-service-scalarproduct.c:855
-msgid "Could not send service-response message via mesh!)\n"
+#: src/secretsharing/gnunet-secretsharing-profiler.c:619
+msgid "threshold"
msgstr ""
-#: src/scalarproduct/gnunet-service-scalarproduct.c:1028
+#: src/secretsharing/gnunet-secretsharing-profiler.c:622
+msgid "also profile decryption"
+msgstr ""
+
+#: src/sensordashboard/gnunet-service-sensordashboard.c:353
#, c-format
-msgid "Failed to communicate with `%s', scalar product calculation aborted.\n"
+msgid "Error trying to send a message to peer `%s'.\n"
msgstr ""
-#: src/scalarproduct/gnunet-service-scalarproduct.c:1099
-#: src/scalarproduct/gnunet-service-scalarproduct.c:1208
-msgid "Transmitting service request.\n"
+#: src/sensor/gnunet-sensor.c:162
+msgid "Retrieve information about all defined sensors"
msgstr ""
-#: src/scalarproduct/gnunet-service-scalarproduct.c:1108
-msgid "Could not send service-request multipart message to channel!\n"
+#: src/sensor/gnunet-sensor.c:165
+msgid "Retrieve information about a single sensor"
msgstr ""
-#: src/scalarproduct/gnunet-service-scalarproduct.c:1147
-#, c-format
-msgid "Successfully created new channel to peer (%s)!\n"
+#: src/sensor/gnunet-sensor.c:168
+msgid "Force an anomaly on a sensor, use only for testing"
msgstr ""
-#: src/scalarproduct/gnunet-service-scalarproduct.c:1217
-msgid "Could not send message to channel!\n"
+#: src/sensor/gnunet-sensor.c:175
+msgid "sensor"
msgstr ""
-#: src/scalarproduct/gnunet-service-scalarproduct.c:1274
-msgid "Too short message received from client!\n"
+#: src/sensor/gnunet-sensor-profiler.c:729
+msgid "Invalid or missing number of peers. Set at least 2 peers.\n"
msgstr ""
-#: src/scalarproduct/gnunet-service-scalarproduct.c:1287
-msgid "Invalid message received from client, session information incorrect!\n"
+#: src/sensor/gnunet-sensor-profiler.c:736
+msgid "Missing or invalid topology file.\n"
msgstr ""
-#: src/scalarproduct/gnunet-service-scalarproduct.c:1298
-#, c-format
-msgid "Duplicate session information received, cannot create new session with
key `%s'\n"
+#: src/sensor/gnunet-sensor-profiler.c:782
+msgid "Number of peers to run"
msgstr ""
-#: src/scalarproduct/gnunet-service-scalarproduct.c:1318
-#, c-format
-msgid "Got client-request-session with key %s, preparing channel to remote
service.\n"
+#: src/sensor/gnunet-sensor-profiler.c:784
+msgid "Path to topology file"
msgstr ""
-#: src/scalarproduct/gnunet-service-scalarproduct.c:1354
+#: src/sensor/gnunet-sensor-profiler.c:787
+msgid "Change the interval of running sensors to given value"
+msgstr ""
+
+#: src/sensor/gnunet-sensor-profiler.c:790
+msgid "Number of peers to simulate anomalies on"
+msgstr ""
+
+#: src/sensor/gnunet-sensor-profiler.c:797
+msgid "Profiler for sensor service"
+msgstr ""
+
+#: src/sensor/gnunet-service-sensor_analysis.c:204
+msgid "Received an invalid sensor value."
+msgstr ""
+
+#: src/sensor/gnunet-service-sensor_analysis.c:295
+msgid "Analysis model not defined in configuration.\n"
+msgstr ""
+
+#: src/sensor/gnunet-service-sensor_analysis.c:304
#, c-format
-msgid "Creating new channel for session with key %s.\n"
+msgid "Could not load analysis model `%s'.\n"
msgstr ""
-#: src/scalarproduct/gnunet-service-scalarproduct.c:1399
+#: src/sensor/gnunet-service-sensor_analysis.c:312
+msgid "Could not connect to peerstore service.\n"
+msgstr ""
+
+#: src/sensor/gnunet-service-sensor_monitoring.c:233
+msgid "Unknown value type expected by sensor, this should not happen.\n"
+msgstr ""
+
+#: src/sensor/gnunet-service-sensor_monitoring.c:268
#, c-format
-msgid "Got client-responder-session with key %s and a matching
service-request-session set, processing.\n"
+msgid "Received an invalid value for sensor `%s': %s\n"
msgstr ""
-#: src/scalarproduct/gnunet-service-scalarproduct.c:1409
+#: src/sensor/gnunet-service-sensor_monitoring.c:347
#, c-format
-msgid "Got client-responder-session with key %s but NO matching
service-request-session set, queuing element for later use.\n"
+msgid "Sensor `%s': External process should not be a path, disabling sensor.\n"
msgstr ""
-#: src/scalarproduct/gnunet-service-scalarproduct.c:1439
+#: src/sensor/gnunet-service-sensor_monitoring.c:370
#, c-format
-msgid "New incoming channel from peer %s.\n"
+msgid ""
+"Sensor `%s' process `%s' problem: binary doesn't exist or not executable\n"
msgstr ""
-#: src/scalarproduct/gnunet-service-scalarproduct.c:1471
+#: src/sensor/gnunet-service-sensor_monitoring.c:418
#, c-format
-msgid "Peer disconnected, terminating session %s with peer (%s)\n"
+msgid "Sensor `%s' execution task already set, this should not happen\n"
msgstr ""
-#: src/scalarproduct/gnunet-service-scalarproduct.c:1672
-#: src/scalarproduct/gnunet-service-scalarproduct.c:1814
+#: src/sensor/gnunet-service-sensor_reporting.c:828
+msgid "Double creation of proof-of-work, this should not happen.\n"
+msgstr ""
+
+#: src/sensor/gnunet-service-sensor_reporting.c:834
+msgid "Failed to create pow and signature block.\n"
+msgstr ""
+
+#: src/sensor/gnunet-service-sensor_reporting.c:1046
#, c-format
-msgid "Got session with key %s and a matching element set, processing.\n"
+msgid "PEERSTORE error: %s.\n"
msgstr ""
-#: src/scalarproduct/gnunet-service-scalarproduct.c:1681
-#: src/scalarproduct/gnunet-service-scalarproduct.c:1821
+#: src/sensor/gnunet-service-sensor_reporting.c:1151
+#: src/sensor/gnunet-service-sensor_reporting.c:1409
+msgid "Failed to connect to CORE service.\n"
+msgstr ""
+
+#: src/sensor/gnunet-service-sensor_reporting.c:1158
+msgid "Peer identity received from CORE init doesn't match ours.\n"
+msgstr ""
+
+#: src/sensor/gnunet-service-sensor_reporting.c:1398
+msgid "Failed to connect to peerstore service.\n"
+msgstr ""
+
+#: src/sensor/gnunet-service-sensor_reporting.c:1419
+#: src/sensor/gnunet-service-sensor_update.c:781
+msgid "Failed to connect to CADET service.\n"
+msgstr ""
+
+#: src/sensor/gnunet-service-sensor_reporting.c:1426
+msgid "Failed to load my private key.\n"
+msgstr ""
+
+#: src/sensor/gnunet-service-sensor_update.c:327
#, c-format
-msgid "Got session with key %s without a matching element set, queueing.\n"
+msgid "Error trying to send a message to update point `%s'.\n"
msgstr ""
-#: src/scalarproduct/gnunet-service-scalarproduct.c:1771
+#: src/sensor/gnunet-service-sensor_update.c:418
#, c-format
-msgid "Got message with duplicate session key (`%s'), ignoring service
request.\n"
+msgid "Failed to connect to update point `%s'.\n"
msgstr ""
-#: src/scalarproduct/gnunet-service-scalarproduct.c:2014
-msgid "Shutting down, initiating cleanup.\n"
+#: src/sensor/plugin_sensor_model_gaussian.c:203
+msgid "Missing `TRAINING_WINDOW' value in configuration.\n"
msgstr ""
-#: src/scalarproduct/gnunet-service-scalarproduct.c:2100
-msgid "Connect to MESH failed\n"
+#: src/sensor/plugin_sensor_model_gaussian.c:221
+msgid "Missing `CONFIDENCE_INTERVAL' value in configuration.\n"
msgstr ""
-#: src/scalarproduct/gnunet-service-scalarproduct.c:2104
-msgid "Mesh initialized\n"
+#: src/sensor/plugin_sensor_model_gaussian.c:229
+msgid "Missing `WEIGHT_INC' value in configuration.\n"
msgstr ""
-#: src/scalarproduct/scalarproduct_api.c:246
-msgid "# SUC responder result messages received"
+#: src/sensor/sensor_api.c:296
+msgid "Iterate request canceled due to disconnection.\n"
msgstr ""
-#: src/scalarproduct/scalarproduct_api.c:300
-msgid "# bytes sent to scalarproduct"
+#: src/sensor/sensor_api.c:307
+msgid "Force anomaly request canceled due to disconnection.\n"
msgstr ""
-#: src/scalarproduct/scalarproduct_api.c:345
-#: src/scalarproduct/scalarproduct_api.c:440
-msgid "Failed to connect to the scalarproduct service\n"
+#: src/sensor/sensor_api.c:374
+msgid "Timeout transmitting iteration request to `SENSOR' service."
msgstr ""
-#: src/scalarproduct/scalarproduct_api.c:353
-#: src/scalarproduct/scalarproduct_api.c:448
-msgid "Failed to send a message to the statistics service\n"
+#: src/sensor/sensor_util_lib.c:107
+msgid "Error reading sensor version\n"
msgstr ""
-#: src/scalarproduct/scalarproduct_api.c:387
-#: src/scalarproduct/scalarproduct_api.c:485
-msgid "Failed to send a message to the scalarproduct service\n"
+#: src/sensor/sensor_util_lib.c:116
+msgid "Invalid sensor version number, format should be major.minor\n"
msgstr ""
-#: src/secretsharing/gnunet-secretsharing-profiler.c:538
-msgid "dkg start delay"
+#: src/sensor/sensor_util_lib.c:131
+msgid "Error reading sensor category\n"
msgstr ""
-#: src/secretsharing/gnunet-secretsharing-profiler.c:541
-msgid "dkg timeout"
+#: src/sensor/sensor_util_lib.c:164
+msgid "Error reading sensor run interval\n"
msgstr ""
-#: src/secretsharing/gnunet-secretsharing-profiler.c:544
-msgid "threshold"
+#: src/sensor/sensor_util_lib.c:191
+msgid "Error reading sensor source\n"
msgstr ""
-#: src/secretsharing/gnunet-secretsharing-profiler.c:547
-msgid "also profile decryption"
+#: src/sensor/sensor_util_lib.c:206
+msgid "Error reading sensor gnunet-statistics source information\n"
msgstr ""
-#: src/set/gnunet-service-set.c:1431
-msgid "Could not connect to mesh service\n"
+#: src/sensor/sensor_util_lib.c:218
+msgid "Error reading sensor process name\n"
msgstr ""
-#: src/set/gnunet-set-ibf-profiler.c:221
+#: src/sensor/sensor_util_lib.c:233
+msgid "Error reading sensor expected datatype\n"
+msgstr ""
+
+#: src/sensor/sensor_util_lib.c:241
+msgid "Invalid expected datatype, gnunet-statistics returns uint64 values\n"
+msgstr ""
+
+#: src/sensor/sensor_util_lib.c:299
+#, c-format
+msgid "Failed to access sensor file: %s\n"
+msgstr ""
+
+#: src/sensor/sensor_util_lib.c:308
+#, c-format
+msgid "Failed to load sensor definition: %s\n"
+msgstr ""
+
+#: src/sensor/sensor_util_lib.c:370
+#, c-format
+msgid "Sensor `%s' already exists with same or newer version\n"
+msgstr ""
+
+#: src/sensor/sensor_util_lib.c:387
+#, c-format
+msgid "Error adding new sensor `%s' to global hashmap.\n"
+msgstr ""
+
+#: src/sensor/sensor_util_lib.c:412
+#, c-format
+msgid "Error loading sensor from file: %s\n"
+msgstr ""
+
+#: src/set/gnunet-service-set.c:1531
+msgid "Could not connect to cadet service\n"
+msgstr ""
+
+#: src/set/gnunet-set-ibf-profiler.c:237
msgid "number of element in set A-B"
msgstr ""
-#: src/set/gnunet-set-ibf-profiler.c:224
+#: src/set/gnunet-set-ibf-profiler.c:240
msgid "number of element in set B-A"
msgstr ""
-#: src/set/gnunet-set-ibf-profiler.c:227
+#: src/set/gnunet-set-ibf-profiler.c:243
msgid "number of common elements in A and B"
msgstr ""
-#: src/set/gnunet-set-ibf-profiler.c:230
+#: src/set/gnunet-set-ibf-profiler.c:246
msgid "hash num"
msgstr ""
-#: src/set/gnunet-set-ibf-profiler.c:233
+#: src/set/gnunet-set-ibf-profiler.c:249
msgid "ibf size"
msgstr ""
-#: src/set/gnunet-set-profiler.c:295
+#: src/set/gnunet-set-profiler.c:298
msgid "oeration to execute"
msgstr ""
-#: src/statistics/gnunet-service-statistics.c:280
+#: src/statistics/gnunet-service-statistics.c:323
#, c-format
msgid "Loading %llu bytes of statistics from `%s'\n"
msgstr ""
-#: src/statistics/gnunet-service-statistics.c:346
+#: src/statistics/gnunet-service-statistics.c:434
#, c-format
msgid "Wrote %llu bytes of statistics to `%s'\n"
msgstr ""
-#: src/statistics/gnunet-statistics.c:140
+#: src/statistics/gnunet-statistics.c:145
msgid "Failed to obtain statistics.\n"
msgstr ""
-#: src/statistics/gnunet-statistics.c:142
+#: src/statistics/gnunet-statistics.c:148
#, c-format
msgid "Failed to obtain statistics from host `%s:%llu'\n"
msgstr ""
-#: src/statistics/gnunet-statistics.c:189
+#: src/statistics/gnunet-statistics.c:198
msgid "Missing argument: subsystem \n"
msgstr ""
-#: src/statistics/gnunet-statistics.c:195
+#: src/statistics/gnunet-statistics.c:204
msgid "Missing argument: name\n"
msgstr ""
-#: src/statistics/gnunet-statistics.c:226
+#: src/statistics/gnunet-statistics.c:235
#, c-format
msgid "No subsystem or name given\n"
msgstr ""
-#: src/statistics/gnunet-statistics.c:234
+#: src/statistics/gnunet-statistics.c:243
#, c-format
msgid "Failed to initialize watch routine\n"
msgstr ""
-#: src/statistics/gnunet-statistics.c:261
+#: src/statistics/gnunet-statistics.c:269
#, c-format
msgid "Trying to connect to remote host, but service `%s' is not running\n"
msgstr ""
-#: src/statistics/gnunet-statistics.c:269
+#: src/statistics/gnunet-statistics.c:282
#, c-format
msgid "A port is required to connect to host `%s'\n"
msgstr ""
-#: src/statistics/gnunet-statistics.c:276
+#: src/statistics/gnunet-statistics.c:290
#, c-format
msgid "A port has to be between 1 and 65535 to connect to host `%s'\n"
msgstr ""
-#: src/statistics/gnunet-statistics.c:308
+#: src/statistics/gnunet-statistics.c:323
#, c-format
msgid "Invalid argument `%s'\n"
msgstr ""
-#: src/statistics/gnunet-statistics.c:334
+#: src/statistics/gnunet-statistics.c:349
msgid "limit output to statistics for the given NAME"
msgstr ""
-#: src/statistics/gnunet-statistics.c:337
+#: src/statistics/gnunet-statistics.c:352
msgid "make the value being set persistent"
msgstr ""
-#: src/statistics/gnunet-statistics.c:340
+#: src/statistics/gnunet-statistics.c:355
msgid "limit output to the given SUBSYSTEM"
msgstr ""
-#: src/statistics/gnunet-statistics.c:343
+#: src/statistics/gnunet-statistics.c:358
msgid "just print the statistics value"
msgstr ""
-#: src/statistics/gnunet-statistics.c:346
+#: src/statistics/gnunet-statistics.c:361
msgid "watch value continuously"
msgstr ""
-#: src/statistics/gnunet-statistics.c:349
+#: src/statistics/gnunet-statistics.c:364
msgid "connect to remote host"
msgstr ""
-#: src/statistics/gnunet-statistics.c:352
+#: src/statistics/gnunet-statistics.c:367
msgid "port for remote host"
msgstr ""
-#: src/statistics/gnunet-statistics.c:364
+#: src/statistics/gnunet-statistics.c:379
msgid "Print statistics about GNUnet operations."
msgstr ""
@@ -5848,61 +6439,64 @@
msgstr ""
#: src/statistics/statistics_api.c:1090
-msgid "Failed to receive acknowledgement from statistics service, some
statistics might have been lost!\n"
+msgid ""
+"Failed to receive acknowledgement from statistics service, some statistics "
+"might have been lost!\n"
msgstr ""
-#: src/testbed/generate-underlay-topology.c:223
-msgid "Need atleast 2 arguments\n"
+#: src/testbed/generate-underlay-topology.c:225
+msgid "Need at least 2 arguments\n"
msgstr ""
-#: src/testbed/generate-underlay-topology.c:228
+#: src/testbed/generate-underlay-topology.c:230
msgid "Database filename missing\n"
msgstr ""
-#: src/testbed/generate-underlay-topology.c:235
+#: src/testbed/generate-underlay-topology.c:237
msgid "Topology string missing\n"
msgstr ""
-#: src/testbed/generate-underlay-topology.c:240
+#: src/testbed/generate-underlay-topology.c:242
#, c-format
msgid "Invalid topology: %s\n"
msgstr ""
-#: src/testbed/generate-underlay-topology.c:252
+#: src/testbed/generate-underlay-topology.c:255
#, c-format
msgid "An argument is missing for given topology `%s'\n"
msgstr ""
-#: src/testbed/generate-underlay-topology.c:258
+#: src/testbed/generate-underlay-topology.c:261
#, c-format
msgid "Invalid argument `%s' given as topology argument\n"
msgstr ""
-#: src/testbed/generate-underlay-topology.c:266
+#: src/testbed/generate-underlay-topology.c:269
#, c-format
msgid "Filename argument missing for topology `%s'\n"
msgstr ""
-#: src/testbed/generate-underlay-topology.c:280
+#: src/testbed/generate-underlay-topology.c:283
#, c-format
msgid "Second argument for topology `%s' is missing\n"
msgstr ""
-#: src/testbed/generate-underlay-topology.c:286
+#: src/testbed/generate-underlay-topology.c:289
#, c-format
msgid "Invalid argument `%s'; expecting unsigned int\n"
msgstr ""
-#: src/testbed/generate-underlay-topology.c:335
+#: src/testbed/generate-underlay-topology.c:338
#: src/testbed/gnunet-testbed-profiler.c:293
msgid "create COUNT number of peers"
msgstr ""
-#: src/testbed/generate-underlay-topology.c:344
+#: src/testbed/generate-underlay-topology.c:347
msgid ""
"Generates SQLite3 database representing a given underlay topology.\n"
"Usage: gnunet-underlay-topology [OPTIONS] db-filename TOPO [TOPOOPTS]\n"
-"The following options are available for TOPO followed by TOPOOPTS if
applicable:\n"
+"The following options are available for TOPO followed by TOPOOPTS if "
+"applicable:\n"
"\t LINE\n"
"\t RING\n"
"\t RANDOM <num_rnd_links>\n"
@@ -5917,30 +6511,34 @@
"\t cap: the maximum number of links a node can have\n"
"\t m: the number of links a node should have while joining the network\n"
"\t filename: the path of the file which contains topology information\n"
-"NOTE: the format of the above file is descibed here:
https://www.gnunet.org/content/topology-file-format\n"
+"NOTE: the format of the above file is descibed here: https://www.gnunet.org/"
+"content/topology-file-format\n"
msgstr ""
-#: src/testbed/gnunet-daemon-latency-logger.c:325
+#: src/testbed/gnunet-daemon-latency-logger.c:323
msgid "Daemon to log latency values of connections to neighbours"
msgstr ""
#: src/testbed/gnunet-daemon-testbed-blacklist.c:264
-msgid "Daemon to restrict incoming transport layer connections during testbed
deployments"
+msgid ""
+"Daemon to restrict incoming transport layer connections during testbed "
+"deployments"
msgstr ""
#: src/testbed/gnunet-daemon-testbed-underlay.c:235 src/testing/list-keys.c:50
-#: src/testing/testing.c:293 src/util/gnunet-ecc.c:217
+#: src/testing/testing.c:293 src/util/gnunet-ecc.c:295
#, c-format
msgid "Incorrect hostkey file format: %s\n"
msgstr ""
-#: src/testbed/gnunet-daemon-testbed-underlay.c:474
+#: src/testbed/gnunet-daemon-testbed-underlay.c:476
msgid "Daemon to restrict underlay network in testbed deployments"
msgstr ""
#: src/testbed/gnunet-service-testbed_cpustatus.c:730
#, c-format
-msgid "Cannot open %s for writing load statistics. Not logging load
statistics\n"
+msgid ""
+"Cannot open %s for writing load statistics. Not logging load statistics\n"
msgstr ""
#: src/testbed/gnunet-service-testbed_peers.c:1015
@@ -5965,17 +6563,15 @@
msgid "Spawning process `%s'\n"
msgstr ""
-#: src/testbed/gnunet-testbed-profiler.c:267
-#, c-format
-msgid "Exiting as the number of peers is %u\n"
-msgstr ""
-
#: src/testbed/gnunet-testbed-profiler.c:296
msgid "tolerate COUNT number of continious timeout failures"
msgstr ""
#: src/testbed/gnunet-testbed-profiler.c:299
-msgid "run profiler in non-interactive mode where upon testbed setup the
profiler does not wait for a keystroke but continues to run until a termination
signal is received"
+msgid ""
+"run profiler in non-interactive mode where upon testbed setup the profiler "
+"does not wait for a keystroke but continues to run until a termination "
+"signal is received"
msgstr ""
#: src/testbed/testbed_api_hosts.c:415
@@ -6047,12 +6643,16 @@
#: src/testbed/testbed_api_testbed.c:1349
#, c-format
-msgid "Maximum number of edges a peer can have in a scale free topology cannot
be more than %u. Given `%s = %llu'"
+msgid ""
+"Maximum number of edges a peer can have in a scale free topology cannot be "
+"more than %u. Given `%s = %llu'"
msgstr ""
#: src/testbed/testbed_api_testbed.c:1365
#, c-format
-msgid "The number of edges that can established when adding a new node to
scale free topology cannot be more than %u. Given `%s = %llu'"
+msgid ""
+"The number of edges that can established when adding a new node to scale "
+"free topology cannot be more than %u. Given `%s = %llu'"
msgstr ""
#: src/testbed/testbed_api_topology.c:960
@@ -6116,7 +6716,9 @@
msgstr ""
#: src/testing/gnunet-testing.c:359
-msgid "number of unique configuration files to create, or number of the
hostkey to extract"
+msgid ""
+"number of unique configuration files to create, or number of the hostkey to "
+"extract"
msgstr ""
#: src/testing/gnunet-testing.c:361
@@ -6151,7 +6753,9 @@
#: src/testing/testing.c:1157
#, c-format
-msgid "You attempted to create a testbed with more than %u hosts. Please
precompute more hostkeys first.\n"
+msgid ""
+"You attempted to create a testbed with more than %u hosts. Please "
+"precompute more hostkeys first.\n"
msgstr ""
#: src/testing/testing.c:1166
@@ -6202,458 +6806,482 @@
msgid "Directory for file `%s' does not seem to be writable.\n"
msgstr ""
-#: src/topology/gnunet-daemon-topology.c:255
+#: src/topology/gnunet-daemon-topology.c:265
msgid "# peers blacklisted"
msgstr ""
-#: src/topology/gnunet-daemon-topology.c:388
+#: src/topology/gnunet-daemon-topology.c:406
msgid "# connect requests issued to transport"
msgstr ""
-#: src/topology/gnunet-daemon-topology.c:728
-#: src/topology/gnunet-daemon-topology.c:813
+#: src/topology/gnunet-daemon-topology.c:756
+#: src/topology/gnunet-daemon-topology.c:840
msgid "# friends connected"
msgstr ""
-#: src/topology/gnunet-daemon-topology.c:993
+#: src/topology/gnunet-daemon-topology.c:1020
msgid "Failed to connect to core service, can not manage topology!\n"
msgstr ""
-#: src/topology/gnunet-daemon-topology.c:1022
+#: src/topology/gnunet-daemon-topology.c:1049
#, c-format
msgid "Found myself `%s' in friend list (useless, ignored)\n"
msgstr ""
-#: src/topology/gnunet-daemon-topology.c:1029
+#: src/topology/gnunet-daemon-topology.c:1056
#, c-format
msgid "Found friend `%s' in configuration\n"
msgstr ""
-#: src/topology/gnunet-daemon-topology.c:1050
+#: src/topology/gnunet-daemon-topology.c:1077
msgid "Encountered errors parsing friends list!\n"
msgstr ""
-#: src/topology/gnunet-daemon-topology.c:1052
+#: src/topology/gnunet-daemon-topology.c:1079
msgid "# friends in configuration"
msgstr ""
-#: src/topology/gnunet-daemon-topology.c:1057
-msgid "Fewer friends specified than required by minimum friend count. Will
only connect to friends.\n"
+#: src/topology/gnunet-daemon-topology.c:1084
+msgid ""
+"Fewer friends specified than required by minimum friend count. Will only "
+"connect to friends.\n"
msgstr ""
-#: src/topology/gnunet-daemon-topology.c:1063
-msgid "More friendly connections required than target total number of
connections.\n"
+#: src/topology/gnunet-daemon-topology.c:1090
+msgid ""
+"More friendly connections required than target total number of connections.\n"
msgstr ""
-#: src/topology/gnunet-daemon-topology.c:1094
+#: src/topology/gnunet-daemon-topology.c:1121
+#: src/transport/plugin_transport_wlan.c:1478
msgid "# HELLO messages received"
msgstr ""
-#: src/topology/gnunet-daemon-topology.c:1151
+#: src/topology/gnunet-daemon-topology.c:1178
msgid "# HELLO messages gossipped"
msgstr ""
-#: src/topology/gnunet-daemon-topology.c:1290
-msgid "GNUnet topology control (maintaining P2P mesh and F2F constraints)"
+#: src/topology/gnunet-daemon-topology.c:1323
+msgid "GNUnet topology control (maintaining P2P cadet and F2F constraints)"
msgstr ""
-#: src/transport/gnunet-service-transport_blacklist.c:271
+#: src/transport/gnunet-service-transport_ats.c:136
+msgid "# Addresses given to ATS"
+msgstr ""
+
+#: src/transport/gnunet-service-transport_blacklist.c:286
#, c-format
msgid "Adding blacklisting entry for peer `%s'\n"
msgstr ""
-#: src/transport/gnunet-service-transport_blacklist.c:279
+#: src/transport/gnunet-service-transport_blacklist.c:295
#, c-format
msgid "Adding blacklisting entry for peer `%s':`%s'\n"
msgstr ""
-#: src/transport/gnunet-service-transport_blacklist.c:464
-#: src/transport/gnunet-service-transport_blacklist.c:745
+#: src/transport/gnunet-service-transport_blacklist.c:504
+#: src/transport/gnunet-service-transport_blacklist.c:855
msgid "# disconnects due to blacklist"
msgstr ""
-#: src/transport/gnunet-service-transport.c:220
+#: src/transport/gnunet-service-transport_blacklist.c:859
+#, c-format
+msgid "Disallowing connection to peer `%s' on transport %s\n"
+msgstr ""
+
+#: src/transport/gnunet-service-transport.c:231
msgid "# bytes payload discarded due to not connected peer"
msgstr ""
-#: src/transport/gnunet-service-transport.c:424
+#: src/transport/gnunet-service-transport.c:385
msgid "# bytes total received"
msgstr ""
-#: src/transport/gnunet-service-transport.c:515
+#: src/transport/gnunet-service-transport.c:480
msgid "# bytes payload received"
msgstr ""
-#: src/transport/gnunet-service-transport.c:686
-#, c-format
-msgid "Could not obtain a valid network for `%s' %s (%s)\n"
-msgstr ""
-
-#: src/transport/gnunet-service-transport.c:733
-#, c-format
-msgid "Address or session unknown: failed to update properties for peer `%s'
plugin `%s' address `%s' session %p\n"
-msgstr ""
-
-#: src/transport/gnunet-service-transport.c:1084
+#: src/transport/gnunet-service-transport.c:818
msgid "Transport service is lacking key configuration settings. Exiting.\n"
msgstr ""
-#: src/transport/gnunet-service-transport_clients.c:432
-#, c-format
-msgid "Dropping message of type %u and size %u, have %u/%u messages pending\n"
-msgstr ""
-
-#: src/transport/gnunet-service-transport_clients.c:439
+#: src/transport/gnunet-service-transport_clients.c:481
msgid "# messages dropped due to slow client"
msgstr ""
-#: src/transport/gnunet-service-transport_clients.c:596
-#, c-format
-msgid "Rejecting control connection from peer `%s', which is not me!\n"
-msgstr ""
-
-#: src/transport/gnunet-service-transport_clients.c:737
+#: src/transport/gnunet-service-transport_clients.c:783
msgid "# bytes payload dropped (other peer was not connected)"
msgstr ""
-#: src/transport/gnunet-service-transport_clients.c:770
-#, c-format
-msgid "Blacklist refuses connection attempt to peer `%s'\n"
-msgstr ""
-
-#: src/transport/gnunet-service-transport_clients.c:776
-#, c-format
-msgid "Blacklist allows connection attempt to peer `%s'\n"
-msgstr ""
-
-#: src/transport/gnunet-service-transport_clients.c:801
+#: src/transport/gnunet-service-transport_clients.c:827
msgid "# REQUEST CONNECT messages received"
msgstr ""
-#: src/transport/gnunet-service-transport_clients.c:815
-#, c-format
-msgid "Received a request connect message for peer `%s'\n"
-msgstr ""
-
-#: src/transport/gnunet-service-transport_clients.c:826
+#: src/transport/gnunet-service-transport_clients.c:864
msgid "# REQUEST DISCONNECT messages received"
msgstr ""
-#: src/transport/gnunet-service-transport_clients.c:840
-#, c-format
-msgid "Received a request disconnect message for peer `%s'\n"
+#: src/transport/gnunet-service-transport_hello.c:188
+msgid "# refreshed my HELLO"
msgstr ""
-#: src/transport/gnunet-service-transport_hello.c:181
-msgid "# refreshed my HELLO"
+#: src/transport/gnunet-service-transport_neighbours.c:840
+msgid "# session creation failed"
msgstr ""
-#: src/transport/gnunet-service-transport_neighbours.c:1095
+#: src/transport/gnunet-service-transport_neighbours.c:1168
msgid "# DISCONNECT messages sent"
msgstr ""
-#: src/transport/gnunet-service-transport_neighbours.c:1220
-#: src/transport/gnunet-service-transport_neighbours.c:1629
+#: src/transport/gnunet-service-transport_neighbours.c:1304
+#: src/transport/gnunet-service-transport_neighbours.c:1761
msgid "# bytes in message queue for other peers"
msgstr ""
-#: src/transport/gnunet-service-transport_neighbours.c:1225
+#: src/transport/gnunet-service-transport_neighbours.c:1309
msgid "# messages transmitted to other peers"
msgstr ""
-#: src/transport/gnunet-service-transport_neighbours.c:1230
+#: src/transport/gnunet-service-transport_neighbours.c:1315
msgid "# transmission failures for messages to other peers"
msgstr ""
-#: src/transport/gnunet-service-transport_neighbours.c:1287
+#: src/transport/gnunet-service-transport_neighbours.c:1375
msgid "# messages timed out while in transport queue"
msgstr ""
-#: src/transport/gnunet-service-transport_neighbours.c:1343
-msgid "# keepalives sent"
+#: src/transport/gnunet-service-transport_neighbours.c:1451
+msgid "# KEEPALIVES sent"
msgstr ""
-#: src/transport/gnunet-service-transport_neighbours.c:1376
+#: src/transport/gnunet-service-transport_neighbours.c:1487
msgid "# KEEPALIVE messages discarded (peer unknown)"
msgstr ""
-#: src/transport/gnunet-service-transport_neighbours.c:1384
+#: src/transport/gnunet-service-transport_neighbours.c:1495
msgid "# KEEPALIVE messages discarded (no session)"
msgstr ""
-#: src/transport/gnunet-service-transport_neighbours.c:1431
-msgid "# KEEPALIVE_RESPONSE messages discarded (not connected)"
+#: src/transport/gnunet-service-transport_neighbours.c:1505
+msgid "# KEEPALIVES received in good order"
msgstr ""
-#: src/transport/gnunet-service-transport_neighbours.c:1440
-msgid "# KEEPALIVE_RESPONSE messages discarded (not expected)"
+#: src/transport/gnunet-service-transport_neighbours.c:1550
+msgid "# KEEPALIVE_RESPONSEs discarded (not connected)"
msgstr ""
-#: src/transport/gnunet-service-transport_neighbours.c:1448
-msgid "# KEEPALIVE_RESPONSE messages discarded (address changed)"
+#: src/transport/gnunet-service-transport_neighbours.c:1559
+msgid "# KEEPALIVE_RESPONSEs discarded (not expected)"
msgstr ""
-#: src/transport/gnunet-service-transport_neighbours.c:1456
-msgid "# KEEPALIVE_RESPONSE messages discarded (wrong nonce)"
+#: src/transport/gnunet-service-transport_neighbours.c:1567
+msgid "# KEEPALIVE_RESPONSEs discarded (address changed)"
msgstr ""
-#: src/transport/gnunet-service-transport_neighbours.c:1534
+#: src/transport/gnunet-service-transport_neighbours.c:1576
+msgid "# KEEPALIVE_RESPONSEs discarded (no nonce)"
+msgstr ""
+
+#: src/transport/gnunet-service-transport_neighbours.c:1581
+msgid "# KEEPALIVE_RESPONSEs discarded (bad nonce)"
+msgstr ""
+
+#: src/transport/gnunet-service-transport_neighbours.c:1587
+msgid "# KEEPALIVE_RESPONSEs received (OK)"
+msgstr ""
+
+#: src/transport/gnunet-service-transport_neighbours.c:1658
msgid "# messages discarded due to lack of neighbour record"
msgstr ""
-#: src/transport/gnunet-service-transport_neighbours.c:1568
+#: src/transport/gnunet-service-transport_neighbours.c:1692
msgid "# bandwidth quota violations by other peers"
msgstr ""
-#: src/transport/gnunet-service-transport_neighbours.c:1584
+#: src/transport/gnunet-service-transport_neighbours.c:1707
msgid "# ms throttling suggested"
msgstr ""
-#: src/transport/gnunet-service-transport_neighbours.c:1678
+#: src/transport/gnunet-service-transport_neighbours.c:1827
#, c-format
-msgid "Failed to send CONNECT message to peer `%s' using address `%s' session
%p\n"
+msgid "Failed to send SYN message to peer `%s'\n"
msgstr ""
-#: src/transport/gnunet-service-transport_neighbours.c:1705
-msgid "# Failed attempts to switch addresses (failed to send CONNECT CONT)"
+#: src/transport/gnunet-service-transport_neighbours.c:1847
+msgid "# Failed attempts to switch addresses (failed to send SYN CONT)"
msgstr ""
-#: src/transport/gnunet-service-transport_neighbours.c:1751
-msgid "# SESSION_CONNECT messages sent"
+#: src/transport/gnunet-service-transport_neighbours.c:1886
+msgid "# SYN messages sent"
msgstr ""
-#: src/transport/gnunet-service-transport_neighbours.c:1767
+#: src/transport/gnunet-service-transport_neighbours.c:1903
#, c-format
-msgid "Failed to transmit CONNECT message via plugin to %s\n"
+msgid "Failed to transmit SYN message to %s\n"
msgstr ""
-#: src/transport/gnunet-service-transport_neighbours.c:1794
-msgid "# Failed attempts to switch addresses (failed to send CONNECT)"
+#: src/transport/gnunet-service-transport_neighbours.c:1933
+msgid "# Failed attempts to switch addresses (failed to send SYN)"
msgstr ""
-#: src/transport/gnunet-service-transport_neighbours.c:1844
+#: src/transport/gnunet-service-transport_neighbours.c:1998
#, c-format
-msgid "Failed to send CONNECT_ACK message to peer `%s' using address `%s'
session %p\n"
+msgid "Failed to send SYN_ACK message to peer `%s' using address `%s'\n"
msgstr ""
-#: src/transport/gnunet-service-transport_neighbours.c:1899
-msgid "# CONNECT_ACK messages sent"
+#: src/transport/gnunet-service-transport_neighbours.c:2052
+msgid "# SYN_ACK messages sent"
msgstr ""
-#: src/transport/gnunet-service-transport_neighbours.c:1914
+#: src/transport/gnunet-service-transport_neighbours.c:2069
#, c-format
-msgid "Failed to transmit CONNECT_ACK message via plugin to %s\n"
+msgid "Failed to transmit SYN_ACK message to %s\n"
msgstr ""
-#: src/transport/gnunet-service-transport_neighbours.c:2192
+#: src/transport/gnunet-service-transport_neighbours.c:2225
#, c-format
msgid "Blacklisting disapproved to connect to peer `%s'\n"
msgstr ""
-#: src/transport/gnunet-service-transport_neighbours.c:2312
-msgid "# CONNECT messages received"
+#: src/transport/gnunet-service-transport_neighbours.c:2352
+msgid "# SYN messages received"
msgstr ""
-#: src/transport/gnunet-service-transport_neighbours.c:2317
+#: src/transport/gnunet-service-transport_neighbours.c:2357
#, c-format
-msgid "CONNECT request from peer `%s' ignored due impending shutdown\n"
+msgid "SYN request from peer `%s' ignored due impending shutdown\n"
msgstr ""
-#: src/transport/gnunet-service-transport_neighbours.c:2590
+#: src/transport/gnunet-service-transport_neighbours.c:2726
msgid "# Attempts to switch addresses"
msgstr ""
-#: src/transport/gnunet-service-transport_neighbours.c:3012
-msgid "# Failed attempts to switch addresses (no response)"
+#: src/transport/gnunet-service-transport_neighbours.c:3212
+msgid "# SYN_ACK messages received"
msgstr ""
-#: src/transport/gnunet-service-transport_neighbours.c:3107
-msgid "# CONNECT_ACK messages received"
+#: src/transport/gnunet-service-transport_neighbours.c:3220
+msgid "# unexpected SYN_ACK messages (no peer)"
msgstr ""
-#: src/transport/gnunet-service-transport_neighbours.c:3115
-msgid "# unexpected CONNECT_ACK messages (no peer)"
+#: src/transport/gnunet-service-transport_neighbours.c:3238
+#: src/transport/gnunet-service-transport_neighbours.c:3262
+msgid "# unexpected SYN_ACK messages (not ready)"
msgstr ""
-#: src/transport/gnunet-service-transport_neighbours.c:3129
-#: src/transport/gnunet-service-transport_neighbours.c:3164
-msgid "# unexpected CONNECT_ACK messages (not ready)"
+#: src/transport/gnunet-service-transport_neighbours.c:3274
+msgid "# unexpected SYN_ACK messages (waiting on ATS)"
msgstr ""
-#: src/transport/gnunet-service-transport_neighbours.c:3176
-msgid "# unexpected CONNECT_ACK messages (waiting on ATS)"
-msgstr ""
-
-#: src/transport/gnunet-service-transport_neighbours.c:3200
+#: src/transport/gnunet-service-transport_neighbours.c:3299
msgid "# Successful attempts to switch addresses"
msgstr ""
-#: src/transport/gnunet-service-transport_neighbours.c:3208
-msgid "# unexpected CONNECT_ACK messages (disconnecting)"
+#: src/transport/gnunet-service-transport_neighbours.c:3312
+msgid "# unexpected SYN_ACK messages (disconnecting)"
msgstr ""
-#: src/transport/gnunet-service-transport_neighbours.c:3396
-msgid "# SESSION_ACK messages received"
+#: src/transport/gnunet-service-transport_neighbours.c:3506
+msgid "# ACK messages received"
msgstr ""
-#: src/transport/gnunet-service-transport_neighbours.c:3424
-msgid "# unexpected SESSION_ACK messages"
+#: src/transport/gnunet-service-transport_neighbours.c:3541
+msgid "# unexpected ACK messages"
msgstr ""
-#: src/transport/gnunet-service-transport_neighbours.c:3490
+#: src/transport/gnunet-service-transport_neighbours.c:3595
msgid "# SET QUOTA messages ignored (no such peer)"
msgstr ""
-#: src/transport/gnunet-service-transport_neighbours.c:3505
+#: src/transport/gnunet-service-transport_neighbours.c:3624
msgid "# disconnects due to quota of 0"
msgstr ""
-#: src/transport/gnunet-service-transport_neighbours.c:3545
+#: src/transport/gnunet-service-transport_neighbours.c:3672
+msgid "# quota messages ignored (malformed)"
+msgstr ""
+
+#: src/transport/gnunet-service-transport_neighbours.c:3679
+msgid "# QUOTA messages received"
+msgstr ""
+
+#: src/transport/gnunet-service-transport_neighbours.c:3720
msgid "# disconnect messages ignored (malformed)"
msgstr ""
-#: src/transport/gnunet-service-transport_neighbours.c:3551
+#: src/transport/gnunet-service-transport_neighbours.c:3727
msgid "# DISCONNECT messages received"
msgstr ""
-#: src/transport/gnunet-service-transport_neighbours.c:3560
+#: src/transport/gnunet-service-transport_neighbours.c:3738
msgid "# disconnect messages ignored (timestamp)"
msgstr ""
-#: src/transport/gnunet-service-transport_neighbours.c:3687
+#: src/transport/gnunet-service-transport_neighbours.c:3867
msgid "# disconnected from peer upon explicit request"
msgstr ""
-#: src/transport/gnunet-service-transport_plugins.c:120
+#: src/transport/gnunet-service-transport_plugins.c:158
msgid "Transport service is lacking NEIGHBOUR_LIMIT option.\n"
msgstr ""
-#: src/transport/gnunet-service-transport_plugins.c:178
-#: src/transport/gnunet-service-transport_plugins.c:186
-#: src/transport/gnunet-service-transport_plugins.c:194
-#: src/transport/gnunet-service-transport_plugins.c:202
-#: src/transport/gnunet-service-transport_plugins.c:210
-#: src/transport/gnunet-service-transport_plugins.c:218
-#: src/transport/gnunet-service-transport_plugins.c:226
-#: src/transport/gnunet-service-transport_plugins.c:234
-#: src/transport/gnunet-service-transport_plugins.c:242
-#: src/transport/gnunet-service-transport_plugins.c:250
-#: src/transport/gnunet-service-transport_plugins.c:258
+#: src/transport/gnunet-service-transport_plugins.c:223
+#: src/transport/gnunet-service-transport_plugins.c:231
+#: src/transport/gnunet-service-transport_plugins.c:239
+#: src/transport/gnunet-service-transport_plugins.c:247
+#: src/transport/gnunet-service-transport_plugins.c:255
+#: src/transport/gnunet-service-transport_plugins.c:263
+#: src/transport/gnunet-service-transport_plugins.c:271
+#: src/transport/gnunet-service-transport_plugins.c:279
+#: src/transport/gnunet-service-transport_plugins.c:287
+#: src/transport/gnunet-service-transport_plugins.c:295
+#: src/transport/gnunet-service-transport_plugins.c:303
#, c-format
msgid "Missing function `%s' in transport plugin for `%s'\n"
msgstr ""
-#: src/transport/gnunet-service-transport_plugins.c:265
+#: src/transport/gnunet-service-transport_plugins.c:310
#, c-format
msgid "Did not load plugin `%s' due to missing functions\n"
msgstr ""
-#: src/transport/gnunet-service-transport_validation.c:488
-msgid "# address records discarded"
+#: src/transport/gnunet-service-transport_validation.c:343
+msgid "# Addresses in validation map"
msgstr ""
-#: src/transport/gnunet-service-transport_validation.c:558
-#, c-format
-msgid "Not transmitting `%s' with `%s', message too big (%u bytes!). This
should not happen.\n"
+#: src/transport/gnunet-service-transport_validation.c:450
+#: src/transport/gnunet-service-transport_validation.c:638
+#: src/transport/gnunet-service-transport_validation.c:927
+#: src/transport/gnunet-service-transport_validation.c:1508
+msgid "# validations running"
msgstr ""
-#: src/transport/gnunet-service-transport_validation.c:616
-msgid "# PING without HELLO messages sent"
+#: src/transport/gnunet-service-transport_validation.c:493
+msgid "# address records discarded (timeout)"
msgstr ""
-#: src/transport/gnunet-service-transport_validation.c:722
+#: src/transport/gnunet-service-transport_validation.c:541
+msgid "# address records discarded (blacklist)"
+msgstr ""
+
+#: src/transport/gnunet-service-transport_validation.c:629
+msgid "# PINGs for address validation sent"
+msgstr ""
+
+#: src/transport/gnunet-service-transport_validation.c:711
+msgid "# validations delayed by global throttle"
+msgstr ""
+
+#: src/transport/gnunet-service-transport_validation.c:748
msgid "# address revalidations started"
msgstr ""
-#: src/transport/gnunet-service-transport_validation.c:1011
+#: src/transport/gnunet-service-transport_validation.c:1048
msgid "# PING message for different peer received"
msgstr ""
-#: src/transport/gnunet-service-transport_validation.c:1062
+#: src/transport/gnunet-service-transport_validation.c:1099
#, c-format
msgid "Plugin `%s' not available, cannot confirm having this address\n"
msgstr ""
-#: src/transport/gnunet-service-transport_validation.c:1072
+#: src/transport/gnunet-service-transport_validation.c:1112
msgid "# failed address checks during validation"
msgstr ""
-#: src/transport/gnunet-service-transport_validation.c:1075
+#: src/transport/gnunet-service-transport_validation.c:1115
#, c-format
msgid "Address `%s' is not one of my addresses, not confirming PING\n"
msgstr ""
-#: src/transport/gnunet-service-transport_validation.c:1083
+#: src/transport/gnunet-service-transport_validation.c:1123
msgid "# successful address checks during validation"
msgstr ""
-#: src/transport/gnunet-service-transport_validation.c:1095
+#: src/transport/gnunet-service-transport_validation.c:1136
#, c-format
-msgid "Not confirming PING from peer `%s' with address `%s' since I cannot
confirm having this address.\n"
+msgid ""
+"Not confirming PING from peer `%s' with address `%s' since I cannot confirm "
+"having this address.\n"
msgstr ""
-#: src/transport/gnunet-service-transport_validation.c:1103
+#: src/transport/gnunet-service-transport_validation.c:1191
#, c-format
-msgid "Received a PING message with validation bug from `%s'\n"
-msgstr ""
-
-#: src/transport/gnunet-service-transport_validation.c:1157
-#, c-format
msgid "Failed to create PONG signature for peer `%s'\n"
msgstr ""
-#: src/transport/gnunet-service-transport_validation.c:1206
+#: src/transport/gnunet-service-transport_validation.c:1242
msgid "# PONGs unicast via reliable transport"
msgstr ""
-#: src/transport/gnunet-service-transport_validation.c:1215
+#: src/transport/gnunet-service-transport_validation.c:1251
msgid "# PONGs multicast to all available addresses"
msgstr ""
-#: src/transport/gnunet-service-transport_validation.c:1356
+#: src/transport/gnunet-service-transport_validation.c:1408
msgid "# PONGs dropped, no matching pending validation"
msgstr ""
-#: src/transport/gnunet-service-transport_validation.c:1371
+#: src/transport/gnunet-service-transport_validation.c:1426
msgid "# PONGs dropped, signature expired"
msgstr ""
-#: src/transport/gnunet-service-transport_validation.c:1493
-#, c-format
-msgid "Validation received new %s message for peer `%s' with size %u\n"
+#: src/transport/gnunet-service-transport_validation.c:1478
+msgid "# validations succeeded"
msgstr ""
-#: src/transport/gnunet-service-transport_validation.c:1500
+#: src/transport/gnunet-transport.c:580
#, c-format
-msgid "Adding `%s' without addresses for peer `%s'\n"
-msgstr ""
-
-#: src/transport/gnunet-transport.c:367
-#, c-format
msgid "Transmitted %llu bytes/s (%llu bytes in %s)\n"
msgstr ""
-#: src/transport/gnunet-transport.c:375
+#: src/transport/gnunet-transport.c:589
+#: src/transport/gnunet-transport-profiler.c:274
#, c-format
msgid "Received %llu bytes/s (%llu bytes in %s)\n"
msgstr ""
-#: src/transport/gnunet-transport.c:415
+#: src/transport/gnunet-transport.c:621
#, c-format
msgid "Failed to connect to `%s'\n"
msgstr ""
-#: src/transport/gnunet-transport.c:428
+#: src/transport/gnunet-transport.c:636
#, c-format
msgid "Failed to resolve address for peer `%s'\n"
msgstr ""
-#: src/transport/gnunet-transport.c:438
+#: src/transport/gnunet-transport.c:648
msgid "Failed to list connections, timeout occured\n"
msgstr ""
-#: src/transport/gnunet-transport.c:559
+#: src/transport/gnunet-transport.c:675 src/transport/gnunet-transport.c:700
#, c-format
+msgid "Configuration for plugin `%s' did not work!\n"
+msgstr ""
+
+#: src/transport/gnunet-transport.c:680
+#, c-format
+msgid "Configuration for plugin `%s' did work!\n"
+msgstr ""
+
+#: src/transport/gnunet-transport.c:685
+#, c-format
+msgid "Internal NAT error while running test for plugin `%s'\n"
+msgstr ""
+
+#: src/transport/gnunet-transport.c:690
+#, c-format
+msgid "Failed to start NAT test for plugin `%s'\n"
+msgstr ""
+
+#: src/transport/gnunet-transport.c:695
+#, c-format
+msgid "Timeout while waiting for result of NAT test for plugin `%s'\n"
+msgstr ""
+
+#: src/transport/gnunet-transport.c:820
+#, c-format
msgid ""
"Peer `%s' %s %s\n"
"\t%s%s\n"
@@ -6661,329 +7289,420 @@
"\t%s%s\n"
msgstr ""
-#: src/transport/gnunet-transport.c:586
+#: src/transport/gnunet-transport.c:855
#, c-format
msgid "Peer `%s' %s `%s' \n"
msgstr ""
-#: src/transport/gnunet-transport.c:712
+#: src/transport/gnunet-transport.c:949 src/transport/gnunet-transport.c:1744
+msgid "Monitor disconnected from transport service. Reconnecting.\n"
+msgstr ""
+
+#: src/transport/gnunet-transport.c:1006
msgid "No transport plugins configured, peer will never communicate\n"
msgstr ""
-#: src/transport/gnunet-transport.c:726
+#: src/transport/gnunet-transport.c:1020
#, c-format
msgid "No port configured for plugin `%s', cannot test it\n"
msgstr ""
-#: src/transport/gnunet-transport.c:789
+#: src/transport/gnunet-transport.c:1045
+msgid "Failed to start resolver!\n"
+msgstr ""
+
+#: src/transport/gnunet-transport.c:1091
#, c-format
msgid "Transmitting %u bytes to %s\n"
msgstr ""
-#: src/transport/gnunet-transport.c:810
+#: src/transport/gnunet-transport.c:1114
+#: src/transport/gnunet-transport-profiler.c:406
#, c-format
msgid "Successfully connected to `%s'\n"
msgstr ""
-#: src/transport/gnunet-transport.c:834
+#: src/transport/gnunet-transport.c:1138
#, c-format
-msgid "Successfully connected to `%s', starting to send benchmark data in %u
Kb blocks\n"
+msgid ""
+"Successfully connected to `%s', starting to send benchmark data in %u Kb "
+"blocks\n"
msgstr ""
-#: src/transport/gnunet-transport.c:865
+#: src/transport/gnunet-transport.c:1171
#, c-format
msgid "Successfully disconnected from `%s'\n"
msgstr ""
-#: src/transport/gnunet-transport.c:888
+#: src/transport/gnunet-transport.c:1194
+#: src/transport/gnunet-transport-profiler.c:434
#, c-format
msgid "Disconnected from peer `%s' while benchmarking\n"
msgstr ""
-#: src/transport/gnunet-transport.c:950
+#: src/transport/gnunet-transport.c:1219 src/transport/gnunet-transport.c:1245
#, c-format
+msgid "%24s: %-17s %4s (%u connections in total)\n"
+msgstr ""
+
+#: src/transport/gnunet-transport.c:1221
+msgid "Connected to"
+msgstr ""
+
+#: src/transport/gnunet-transport.c:1247
+msgid "Disconnected from"
+msgstr ""
+
+#: src/transport/gnunet-transport.c:1271
+#: src/transport/gnunet-transport-profiler.c:458
+#, c-format
msgid "Received %u bytes from %s\n"
msgstr ""
-#: src/transport/gnunet-transport.c:975
+#: src/transport/gnunet-transport.c:1311
#, c-format
msgid "Peer `%s': %s %s in state `%s' until %s\n"
msgstr ""
-#: src/transport/gnunet-transport.c:986
+#: src/transport/gnunet-transport.c:1323
#, c-format
msgid "Peer `%s': %s %s\n"
msgstr ""
-#: src/transport/gnunet-transport.c:1197 src/transport/gnunet-transport.c:1222
+#: src/transport/gnunet-transport.c:1831
+#: src/transport/gnunet-transport-profiler.c:492
msgid "Failed to send connect request to transport service\n"
msgstr ""
-#: src/transport/gnunet-transport.c:1266
+#: src/transport/gnunet-transport.c:1866
+msgid "Failed to send disconnect request to transport service\n"
+msgstr ""
+
+#: src/transport/gnunet-transport.c:1910
#, c-format
-msgid "Multiple operations given. Please choose only one operation: %s, %s,
%s, %s, %s, %s\n"
+msgid ""
+"Multiple operations given. Please choose only one operation: %s, %s, %s, %s, "
+"%s, %s %s\n"
msgstr ""
-#: src/transport/gnunet-transport.c:1274
+#: src/transport/gnunet-transport.c:1918
#, c-format
-msgid "No operation given. Please choose one operation: %s, %s, %s, %s, %s,
%s\n"
+msgid ""
+"No operation given. Please choose one operation: %s, %s, %s, %s, %s, %s, %s\n"
msgstr ""
-#: src/transport/gnunet-transport.c:1293 src/transport/gnunet-transport.c:1323
-#: src/transport/gnunet-transport.c:1353 src/transport/gnunet-transport.c:1376
-#: src/transport/gnunet-transport.c:1419
+#: src/transport/gnunet-transport.c:1937 src/transport/gnunet-transport.c:1967
+#: src/transport/gnunet-transport.c:2000 src/transport/gnunet-transport.c:2026
+#: src/transport/gnunet-transport.c:2085
+#: src/transport/gnunet-transport-profiler.c:578
msgid "Failed to connect to transport service\n"
msgstr ""
-#: src/transport/gnunet-transport.c:1302 src/transport/gnunet-transport.c:1332
-#: src/transport/gnunet-transport.c:1362
+#: src/transport/gnunet-transport.c:1946 src/transport/gnunet-transport.c:1977
+#: src/transport/gnunet-transport.c:2011
msgid "Failed to send request to transport service\n"
msgstr ""
-#: src/transport/gnunet-transport.c:1381
+#: src/transport/gnunet-transport.c:2031
msgid "Starting to receive benchmark data\n"
msgstr ""
-#: src/transport/gnunet-transport.c:1465
-msgid "print information for all peers (instead of only connected peers )"
+#: src/transport/gnunet-transport.c:2133
+msgid "print information for all peers (instead of only connected peers)"
msgstr ""
-#: src/transport/gnunet-transport.c:1468
+#: src/transport/gnunet-transport.c:2136
msgid "measure how fast we are receiving data from all peers (until CTRL-C)"
msgstr ""
-#: src/transport/gnunet-transport.c:1471
+#: src/transport/gnunet-transport.c:2139
msgid "connect to a peer"
msgstr ""
-#: src/transport/gnunet-transport.c:1474
+#: src/transport/gnunet-transport.c:2142
msgid "disconnect to a peer"
msgstr ""
-#: src/transport/gnunet-transport.c:1477
+#: src/transport/gnunet-transport.c:2145
msgid "print information for all pending validations "
msgstr ""
-#: src/transport/gnunet-transport.c:1480
-msgid "print information for all pending validations continously"
+#: src/transport/gnunet-transport.c:2148
+msgid "print information for all pending validations continuously"
msgstr ""
-#: src/transport/gnunet-transport.c:1483
+#: src/transport/gnunet-transport.c:2151
msgid "provide information about all current connections (once)"
msgstr ""
-#: src/transport/gnunet-transport.c:1489
-msgid "provide information about all connects and disconnect events
(continuously)"
+#: src/transport/gnunet-transport.c:2157
+msgid ""
+"provide information about all connects and disconnect events (continuously)"
msgstr ""
-#: src/transport/gnunet-transport.c:1491
+#: src/transport/gnunet-transport.c:2160
msgid "do not resolve hostnames"
msgstr ""
-#: src/transport/gnunet-transport.c:1493
+#: src/transport/gnunet-transport.c:2163
+#: src/transport/gnunet-transport-profiler.c:638
msgid "peer identity"
msgstr ""
-#: src/transport/gnunet-transport.c:1495
+#: src/transport/gnunet-transport.c:2166
+msgid "monitor plugin sessions"
+msgstr ""
+
+#: src/transport/gnunet-transport.c:2169
msgid "send data for benchmarking to the other peer (until CTRL-C)"
msgstr ""
-#: src/transport/gnunet-transport.c:1498
+#: src/transport/gnunet-transport.c:2172
msgid "test transport configuration (involves external server)"
msgstr ""
-#: src/transport/gnunet-transport.c:1507
+#: src/transport/gnunet-transport.c:2183
+#: src/transport/gnunet-transport-profiler.c:649
msgid "Direct access to transport service."
msgstr ""
-#: src/transport/plugin_transport_bluetooth.c:621
-msgid "# Bluetooth ACKs sent"
+#: src/transport/gnunet-transport-profiler.c:218
+#, c-format
+msgid "%llu B in %llu ms == %.2f KB/s!\n"
msgstr ""
-#: src/transport/plugin_transport_bluetooth.c:640
-msgid "# Bluetooth messages defragmented"
+#: src/transport/gnunet-transport-profiler.c:254
+#, c-format
+msgid "%u;%u;%llu;%llu;%.2f;%.2f"
msgstr ""
-#: src/transport/plugin_transport_bluetooth.c:686
-#: src/transport/plugin_transport_bluetooth.c:737
-#: src/transport/plugin_transport_bluetooth.c:1942
-msgid "# Bluetooth sessions allocated"
+#: src/transport/gnunet-transport-profiler.c:263
+#, c-format
+msgid ";%llu;%.2f"
msgstr ""
-#: src/transport/plugin_transport_bluetooth.c:837
-msgid "# Bluetooth message fragments sent"
+#: src/transport/gnunet-transport-profiler.c:280
+msgid "\n"
msgstr ""
-#: src/transport/plugin_transport_bluetooth.c:861
-msgid "# Bluetooth messages pending (with fragmentation)"
+#: src/transport/gnunet-transport-profiler.c:332
+msgid "."
msgstr ""
-#: src/transport/plugin_transport_bluetooth.c:969
-#: src/transport/plugin_transport_bluetooth.c:1054
-#: src/transport/plugin_transport_bluetooth.c:1944
-msgid "# Bluetooth MAC endpoints allocated"
+#: src/transport/gnunet-transport-profiler.c:352
+#, c-format
+msgid ""
+"\n"
+"Starting benchmark to `%s', starting to send %u messages in %u byte blocks\n"
msgstr ""
-#: src/transport/plugin_transport_bluetooth.c:1307
-msgid "# HELLO messages received via Bluetooth"
+#: src/transport/gnunet-transport-profiler.c:400
+#, c-format
+msgid "Connected to different peer `%s'\n"
msgstr ""
-#: src/transport/plugin_transport_bluetooth.c:1331
-msgid "# fragments received via Bluetooth"
+#: src/transport/gnunet-transport-profiler.c:483
+#, c-format
+msgid "Retrying to connect to `%s'\n"
msgstr ""
-#: src/transport/plugin_transport_bluetooth.c:1341
-msgid "# ACKs received via Bluetooth"
+#: src/transport/gnunet-transport-profiler.c:508
+#, c-format
+msgid "Denying connection to `%s'\n"
msgstr ""
-#: src/transport/plugin_transport_bluetooth.c:1401
-msgid "# Bluetooth DATA messages discarded due to CRC32 error"
+#: src/transport/gnunet-transport-profiler.c:537
+msgid "Message size too big!\n"
msgstr ""
-#: src/transport/plugin_transport_bluetooth.c:1512
-msgid "# DATA messages received via Bluetooth"
+#: src/transport/gnunet-transport-profiler.c:543
+msgid "No peer identity given\n"
msgstr ""
-#: src/transport/plugin_transport_bluetooth.c:1547
-msgid "# Bluetooth DATA messages processed"
+#: src/transport/gnunet-transport-profiler.c:558
+#, c-format
+msgid "Trying to send %u messages with size %u to peer `%s'\n"
msgstr ""
-#: src/transport/plugin_transport_bluetooth.c:1610
-msgid "# HELLO beacons sent via Bluetooth"
+#: src/transport/gnunet-transport-profiler.c:564
+#, c-format
+msgid "Trying to receive messages from peer `%s'\n"
msgstr ""
-#: src/transport/plugin_transport_bluetooth.c:1723
-msgid "Bluetooth address with invalid size encountered\n"
+#: src/transport/gnunet-transport-profiler.c:569
+msgid "No operation given\n"
msgstr ""
-#: src/transport/plugin_transport_bluetooth.c:1923
-#, c-format
-msgid "Helper binary `%s' not SUID, cannot run bluetooth transport\n"
+#: src/transport/gnunet-transport-profiler.c:623
+msgid "send data to peer"
msgstr ""
-#: src/transport/plugin_transport_http_client.c:1622
+#: src/transport/gnunet-transport-profiler.c:626
+msgid "receive data from peer"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:629
+msgid "iterations"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:632
+#, fuzzy
+msgid "number of messages to send"
+msgstr "nombre de valeurs"
+
+#: src/transport/gnunet-transport-profiler.c:635
+msgid "message size to use"
+msgstr ""
+
+#: src/transport/plugin_transport_http_client.c:1481
+#: src/transport/plugin_transport_http_server.c:2247
+#: src/transport/plugin_transport_http_server.c:3414
+#: src/transport/plugin_transport_tcp.c:2923
+#: src/transport/plugin_transport_tcp.c:2930
+msgid "TCP_STEALTH not supported on this platform.\n"
+msgstr ""
+
+#: src/transport/plugin_transport_http_client.c:2106
#, c-format
msgid "Could not initialize curl multi handle, failed to start %s plugin!\n"
msgstr ""
-#: src/transport/plugin_transport_http_client.c:1697
-#: src/transport/plugin_transport_http_server.c:3007
+#: src/transport/plugin_transport_http_client.c:2155
+#: src/transport/plugin_transport_http_server.c:3148
#, c-format
msgid "Shutting down plugin `%s'\n"
msgstr ""
-#: src/transport/plugin_transport_http_client.c:1722
-#: src/transport/plugin_transport_http_server.c:3063
+#: src/transport/plugin_transport_http_client.c:2172
+#: src/transport/plugin_transport_http_server.c:3218
#, c-format
msgid "Shutdown for plugin `%s' complete\n"
msgstr ""
-#: src/transport/plugin_transport_http_client.c:1750
-#: src/transport/plugin_transport_http_server.c:2907
+#: src/transport/plugin_transport_http_client.c:2206
#, c-format
-msgid "Maximum number of connections is %u\n"
+msgid "Maximum number of requests is %u\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:1402
+#: src/transport/plugin_transport_http_server.c:1734
#, c-format
-msgid "Access from connection %p (%u of %u) for `%s' `%s' url `%s' with upload
data size %u\n"
+msgid ""
+"Access from connection %p (%u of %u) for `%s' `%s' url `%s' with upload data "
+"size %u\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:1663
+#: src/transport/plugin_transport_http_server.c:1965
#, c-format
msgid "Accepting connection (%u of %u) from `%s'\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:1671
+#: src/transport/plugin_transport_http_server.c:1973
#, c-format
-msgid "Server reached maximum number connections (%u), rejecting new
connection\n"
+msgid ""
+"Server reached maximum number connections (%u), rejecting new connection\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:1958
-msgid "Could not create a new TLS certificate, program
`gnunet-transport-certificate-creation' could not be started!\n"
+#: src/transport/plugin_transport_http_server.c:2123
+msgid ""
+"Could not create a new TLS certificate, program `gnunet-transport-"
+"certificate-creation' could not be started!\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:1982
+#: src/transport/plugin_transport_http_server.c:2146
#, c-format
msgid "No usable TLS certificate found and creating one at `%s/%s' failed!\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2405
+#: src/transport/plugin_transport_http_server.c:2273
+msgid "Could not load or create server certificate! Loading plugin failed!\n"
+msgstr ""
+
+#: src/transport/plugin_transport_http_server.c:2582
msgid "Require valid port number for service in configuration!\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2437 src/util/service.c:698
+#: src/transport/plugin_transport_http_server.c:2616 src/util/service.c:704
#, c-format
msgid "Failed to resolve `%s': %s\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2454 src/util/service.c:715
+#: src/transport/plugin_transport_http_server.c:2634 src/util/service.c:723
#, c-format
msgid "Failed to find %saddress for `%s'.\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2565
+#: src/transport/plugin_transport_http_server.c:2747
#, c-format
msgid "Found %u addresses to report to NAT service\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2637
+#: src/transport/plugin_transport_http_server.c:2825
+#: src/transport/plugin_transport_udp.c:3335
msgid "Disabling IPv6 since it is not supported on this system!\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2730
+#: src/transport/plugin_transport_http_server.c:2924
#, c-format
msgid "IPv4 support is %s\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2744
+#: src/transport/plugin_transport_http_server.c:2939
#, c-format
msgid "IPv6 support is %s\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2751
+#: src/transport/plugin_transport_http_server.c:2945
msgid "Neither IPv4 nor IPv6 are enabled! Fix in configuration\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2762
+#: src/transport/plugin_transport_http_server.c:2956
msgid "Port is required! Fix in configuration\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2769
+#: src/transport/plugin_transport_http_server.c:2962
#, c-format
msgid "Using port %u\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2784
+#: src/transport/plugin_transport_http_server.c:2976
#, c-format
msgid "Specific IPv4 address `%s' in configuration file is invalid!\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2794
+#: src/transport/plugin_transport_http_server.c:2986
#, c-format
msgid "Binding to IPv4 address %s\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2815
+#: src/transport/plugin_transport_http_server.c:3008
#, c-format
msgid "Specific IPv6 address `%s' in configuration file is invalid!\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2825
+#: src/transport/plugin_transport_http_server.c:3018
#, c-format
msgid "Binding to IPv6 address %s\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2877
+#: src/transport/plugin_transport_http_server.c:3081
#, c-format
msgid "Using external hostname `%s'\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2893
+#: src/transport/plugin_transport_http_server.c:3102
#, c-format
msgid "Notifying transport only about hostname `%s'\n"
msgstr ""
+#: src/transport/plugin_transport_http_server.c:3119
+#, c-format
+msgid "Maximum number of connections is %u\n"
+msgstr ""
+
+#: src/transport/plugin_transport_http_server.c:3426
+msgid "Unable to compile URL regex\n"
+msgstr ""
+
#: src/transport/plugin_transport_smtp.c:223
#, c-format
msgid "Received malformed message via %s. Ignored.\n"
@@ -7026,221 +7745,238 @@
msgid "# bytes dropped by SMTP (outgoing)"
msgstr ""
-#: src/transport/plugin_transport_tcp.c:555
+#: src/transport/plugin_transport_tcp.c:672
#, c-format
msgid "Unexpected address length: %u bytes\n"
msgstr ""
-#: src/transport/plugin_transport_tcp.c:762
-#: src/transport/plugin_transport_tcp.c:928
-#: src/transport/plugin_transport_tcp.c:2005
-#: src/transport/plugin_transport_tcp.c:2558
+#: src/transport/plugin_transport_tcp.c:855
+#: src/transport/plugin_transport_tcp.c:1081
+#: src/transport/plugin_transport_tcp.c:2251
+#: src/transport/plugin_transport_tcp.c:3042
msgid "# TCP sessions active"
msgstr ""
-#: src/transport/plugin_transport_tcp.c:795
-#: src/transport/plugin_transport_tcp.c:921
-#: src/transport/plugin_transport_tcp.c:1009
-#: src/transport/plugin_transport_tcp.c:1056
-#: src/transport/plugin_transport_tcp.c:1219
-#: src/transport/plugin_transport_tcp.c:1237
+#: src/transport/plugin_transport_tcp.c:897
+#: src/transport/plugin_transport_tcp.c:1063
+#: src/transport/plugin_transport_tcp.c:1187
+#: src/transport/plugin_transport_tcp.c:1260
+#: src/transport/plugin_transport_tcp.c:1360
+#: src/transport/plugin_transport_tcp.c:1385
msgid "# bytes currently in TCP buffers"
msgstr ""
-#: src/transport/plugin_transport_tcp.c:798
+#: src/transport/plugin_transport_tcp.c:900
msgid "# bytes discarded by TCP (disconnect)"
msgstr ""
-#: src/transport/plugin_transport_tcp.c:1012
+#: src/transport/plugin_transport_tcp.c:1190
msgid "# bytes discarded by TCP (timeout)"
msgstr ""
-#: src/transport/plugin_transport_tcp.c:1059
+#: src/transport/plugin_transport_tcp.c:1264
msgid "# bytes transmitted via TCP"
msgstr ""
-#: src/transport/plugin_transport_tcp.c:1193
-#, c-format
-msgid "Trying to send with invalid session %p\n"
-msgstr ""
-
-#: src/transport/plugin_transport_tcp.c:1462
+#: src/transport/plugin_transport_tcp.c:1659
msgid "# requests to create session with invalid address"
msgstr ""
-#: src/transport/plugin_transport_tcp.c:1567
+#: src/transport/plugin_transport_tcp.c:1827
msgid "# transport-service disconnect requests for TCP"
msgstr ""
-#: src/transport/plugin_transport_tcp.c:2055
+#: src/transport/plugin_transport_tcp.c:2310
msgid "# TCP WELCOME messages received"
msgstr ""
-#: src/transport/plugin_transport_tcp.c:2215
+#: src/transport/plugin_transport_tcp.c:2501
msgid "# bytes received via TCP"
msgstr ""
-#: src/transport/plugin_transport_tcp.c:2279
+#: src/transport/plugin_transport_tcp.c:2552
+#: src/transport/plugin_transport_tcp.c:2610
+msgid "# TCP server connections active"
+msgstr ""
+
+#: src/transport/plugin_transport_tcp.c:2556
+msgid "# TCP server connect events"
+msgstr ""
+
+#: src/transport/plugin_transport_tcp.c:2562
+msgid "TCP connection limit reached, suspending server\n"
+msgstr ""
+
+#: src/transport/plugin_transport_tcp.c:2564
+msgid "# TCP service suspended"
+msgstr ""
+
+#: src/transport/plugin_transport_tcp.c:2604
+msgid "# TCP service resumed"
+msgstr ""
+
+#: src/transport/plugin_transport_tcp.c:2614
msgid "# network-level TCP disconnect events"
msgstr ""
-#: src/transport/plugin_transport_tcp.c:2437 src/util/service.c:582
-#: src/util/service.c:588
+#: src/transport/plugin_transport_tcp.c:2857 src/util/service.c:584
+#: src/util/service.c:590
#, c-format
msgid "Require valid port number for service `%s' in configuration!\n"
msgstr ""
-#: src/transport/plugin_transport_tcp.c:2451
+#: src/transport/plugin_transport_tcp.c:2873
msgid "Failed to start service.\n"
msgstr ""
-#: src/transport/plugin_transport_tcp.c:2547
+#: src/transport/plugin_transport_tcp.c:3030
#, c-format
msgid "TCP transport listening on port %llu\n"
msgstr ""
-#: src/transport/plugin_transport_tcp.c:2551
+#: src/transport/plugin_transport_tcp.c:3034
msgid "TCP transport not listening on any port (client only)\n"
msgstr ""
-#: src/transport/plugin_transport_tcp.c:2554
+#: src/transport/plugin_transport_tcp.c:3038
#, c-format
msgid "TCP transport advertises itself as being on port %llu\n"
msgstr ""
-#: src/transport/plugin_transport_udp_broadcasting.c:167
-msgid "# IPv6 multicast HELLO beacons received via udp"
+#: src/transport/plugin_transport_udp_broadcasting.c:170
+msgid "# Multicast HELLO beacons received via UDP"
msgstr ""
-#: src/transport/plugin_transport_udp_broadcasting.c:210
-msgid "# IPv4 broadcast HELLO beacons received via udp"
+#: src/transport/plugin_transport_udp_broadcasting.c:548
+msgid ""
+"Disabling HELLO broadcasting due to friend-to-friend only configuration!\n"
msgstr ""
-#: src/transport/plugin_transport_udp_broadcasting.c:603
-msgid "Disabling HELLO broadcasting due to friend-to-friend only
configuration!\n"
-msgstr ""
-
-#: src/transport/plugin_transport_udp_broadcasting.c:626
+#: src/transport/plugin_transport_udp_broadcasting.c:569
#, c-format
msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n"
msgstr ""
-#: src/transport/plugin_transport_udp.c:1513
+#: src/transport/plugin_transport_udp.c:3081
#, c-format
-msgid "Trying to create session for address of unexpected length %u (should be
%u or %u)\n"
+msgid ""
+"UDP could not transmit message to `%s': Network seems down, please check "
+"your network configuration\n"
msgstr ""
-#: src/transport/plugin_transport_udp.c:2602
+#: src/transport/plugin_transport_udp.c:3095
+msgid ""
+"UDP 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_udp.c:3411
+#: src/transport/plugin_transport_udp.c:3510
#, c-format
-msgid "UDP could not transmit message to `%s': Network seems down, please
check your network configuration\n"
+msgid "Failed to bind UDP socket to %s: %s\n"
msgstr ""
-#: src/transport/plugin_transport_udp.c:2616
-msgid "UDP could not transmit IPv6 message! Please check your network
configuration and disable IPv6 if your connection does not have a global IPv6
address\n"
+#: src/transport/plugin_transport_udp.c:3429
+msgid "Disabling IPv4 since it is not supported on this system!\n"
msgstr ""
-#: src/transport/plugin_transport_udp.c:2961
+#: src/transport/plugin_transport_udp.c:3520
msgid "Failed to open UDP sockets\n"
msgstr ""
-#: src/transport/plugin_transport_udp.c:3056
-#, c-format
-msgid "Given `%s' option is out of range: %llu > %u\n"
+#: src/transport/plugin_transport_udp.c:3591
+#: src/transport/plugin_transport_udp.c:3605
+msgid "must be in [0,65535]"
msgstr ""
-#: src/transport/plugin_transport_udp.c:3097
-#, c-format
-msgid "Invalid IPv6 address: `%s'\n"
+#: src/transport/plugin_transport_udp.c:3637
+msgid "must be valid IPv4 address"
msgstr ""
-#: src/transport/plugin_transport_udp.c:3168
-msgid "Failed to create network sockets, plugin failed\n"
+#: src/transport/plugin_transport_udp.c:3664
+msgid "must be valid IPv6 address"
msgstr ""
-#: src/transport/plugin_transport_unix.c:1321
+#: src/transport/plugin_transport_udp.c:3730
+msgid "Failed to create UDP network sockets\n"
+msgstr ""
+
+#: src/transport/plugin_transport_unix.c:1393
#, c-format
msgid "Cannot create path to `%s'\n"
msgstr ""
-#: src/transport/plugin_transport_unix.c:1652
-msgid "No UNIXPATH given in configuration!\n"
+#: src/transport/plugin_transport_unix.c:1406
+#, c-format
+msgid "Cannot bind to `%s'\n"
msgstr ""
-#: src/transport/plugin_transport_unix.c:1688
+#: src/transport/plugin_transport_unix.c:1807
msgid "Failed to open UNIX listen socket\n"
msgstr ""
-#: src/transport/plugin_transport_wlan.c:620
-msgid "# WLAN ACKs sent"
+#: src/transport/plugin_transport_wlan.c:742
+msgid "# ACKs sent"
msgstr ""
-#: src/transport/plugin_transport_wlan.c:639
-msgid "# WLAN messages defragmented"
+#: src/transport/plugin_transport_wlan.c:762
+msgid "# Messages defragmented"
msgstr ""
-#: src/transport/plugin_transport_wlan.c:688
-#: src/transport/plugin_transport_wlan.c:772
-#: src/transport/plugin_transport_wlan.c:1948
-msgid "# WLAN sessions allocated"
+#: src/transport/plugin_transport_wlan.c:803
+#: src/transport/plugin_transport_wlan.c:890
+msgid "# Sessions allocated"
msgstr ""
-#: src/transport/plugin_transport_wlan.c:876
-msgid "# WLAN message fragments sent"
+#: src/transport/plugin_transport_wlan.c:1011
+msgid "# message fragments sent"
msgstr ""
-#: src/transport/plugin_transport_wlan.c:900
-msgid "# WLAN messages pending (with fragmentation)"
+#: src/transport/plugin_transport_wlan.c:1040
+msgid "# messages pending (with fragmentation)"
msgstr ""
-#: src/transport/plugin_transport_wlan.c:1008
-#: src/transport/plugin_transport_wlan.c:1098
-#: src/transport/plugin_transport_wlan.c:1950
-msgid "# WLAN MAC endpoints allocated"
+#: src/transport/plugin_transport_wlan.c:1171
+#: src/transport/plugin_transport_wlan.c:1264
+#: src/transport/plugin_transport_wlan.c:2268
+msgid "# MAC endpoints allocated"
msgstr ""
-#: src/transport/plugin_transport_wlan.c:1302
-msgid "# HELLO messages received via WLAN"
+#: src/transport/plugin_transport_wlan.c:1528
+msgid "# ACKs received"
msgstr ""
-#: src/transport/plugin_transport_wlan.c:1326
-msgid "# fragments received via WLAN"
+#: src/transport/plugin_transport_wlan.c:1597
+msgid "# DATA messages discarded due to CRC32 error"
msgstr ""
-#: src/transport/plugin_transport_wlan.c:1336
-msgid "# ACKs received via WLAN"
+#: src/transport/plugin_transport_wlan.c:1703
+msgid "# HELLO beacons sent"
msgstr ""
-#: src/transport/plugin_transport_wlan.c:1396
-msgid "# WLAN DATA messages discarded due to CRC32 error"
+#: src/transport/plugin_transport_wlan.c:1820
+msgid "# DATA messages received"
msgstr ""
-#: src/transport/plugin_transport_wlan.c:1518
-msgid "# DATA messages received via WLAN"
+#: src/transport/plugin_transport_wlan.c:1854
+msgid "# DATA messages processed"
msgstr ""
-#: src/transport/plugin_transport_wlan.c:1553
-msgid "# WLAN DATA messages processed"
+#: src/transport/plugin_transport_wlan.c:2243
+#, c-format
+msgid "Helper binary `%s' not SUID, cannot run WLAN transport\n"
msgstr ""
-#: src/transport/plugin_transport_wlan.c:1616
-msgid "# HELLO beacons sent via WLAN"
+#: src/transport/plugin_transport_wlan.c:2265
+msgid "# sessions allocated"
msgstr ""
-#: src/transport/plugin_transport_wlan.c:1729
-msgid "WLAN address with invalid size encountered\n"
-msgstr ""
-
-#: src/transport/plugin_transport_wlan.c:1929
+#: src/transport/transport_api.c:812
#, c-format
-msgid "Helper binary `%s' not SUID, cannot run WLAN transport\n"
-msgstr ""
-
-#: src/transport/transport_api.c:739
-#, c-format
msgid "Received unexpected message of type %u in %s:%u\n"
msgstr ""
-#: src/transport/transport-testing.c:584
+#: src/transport/transport-testing.c:603
msgid "Failed to initialize testing library!\n"
msgstr ""
@@ -7278,40 +8014,38 @@
msgid "Metadata `%s' failed to deserialize"
msgstr ""
-#: src/util/client.c:261 src/util/client.c:858 src/util/service.c:619
+#: src/util/client.c:263 src/util/client.c:889 src/util/service.c:621
#, c-format
msgid "UNIXPATH `%s' too long, maximum length is %llu\n"
msgstr ""
-#: src/util/client.c:265 src/util/client.c:863 src/util/service.c:623
+#: src/util/client.c:267 src/util/client.c:894 src/util/service.c:625
#, c-format
msgid "Using `%s' instead\n"
msgstr ""
-#: src/util/client.c:360
+#: src/util/client.c:362
#, c-format
-msgid "Could not determine valid hostname and port for service `%s' from
configuration.\n"
+msgid ""
+"Could not determine valid hostname and port for service `%s' from "
+"configuration.\n"
msgstr ""
-#: src/util/client.c:368
+#: src/util/client.c:370
#, c-format
msgid "Need a non-empty hostname for service `%s'.\n"
msgstr ""
-#: src/util/client.c:1008
+#: src/util/client.c:1039
#, c-format
msgid "Could not connect to service `%s', configuration broken.\n"
msgstr ""
-#: src/util/client.c:1020
+#: src/util/client.c:1051
#, c-format
msgid "Failure to transmit request to service `%s'\n"
msgstr ""
-#: src/util/client.c:1303
-msgid "Could not submit request, not expecting to receive a response.\n"
-msgstr ""
-
#: src/util/common_logging.c:254 src/util/common_logging.c:1039
msgid "DEBUG"
msgstr ""
@@ -7346,22 +8080,23 @@
msgid "INVALID"
msgstr ""
-#: src/util/common_logging.c:1157
+#: src/util/common_logging.c:1158
msgid "unknown address"
msgstr ""
-#: src/util/common_logging.c:1196
+#: src/util/common_logging.c:1200
msgid "invalid address"
msgstr ""
-#: src/util/common_logging.c:1214
+#: src/util/common_logging.c:1218
#, c-format
msgid "Configuration fails to specify option `%s' in section `%s'!\n"
msgstr ""
-#: src/util/common_logging.c:1235
+#: src/util/common_logging.c:1239
#, c-format
-msgid "Configuration specifies invalid value for option `%s' in section `%s':
%s\n"
+msgid ""
+"Configuration specifies invalid value for option `%s' in section `%s': %s\n"
msgstr ""
#: src/util/configuration.c:288
@@ -7369,99 +8104,91 @@
msgid "Syntax error while deserializing in line %u\n"
msgstr ""
-#: src/util/configuration.c:996
+#: src/util/configuration.c:1025
#, c-format
-msgid "Configuration value '%s' for '%s' in section '%s' is not in set of
legal choices\n"
+msgid ""
+"Configuration value '%s' for '%s' in section '%s' is not in set of legal "
+"choices\n"
msgstr ""
-#: src/util/configuration.c:1066
+#: src/util/configuration.c:1144
#, c-format
msgid "Recursive expansion suspected, aborting $-expansion for term `%s'\n"
msgstr ""
-#: src/util/configuration.c:1098
+#: src/util/configuration.c:1176
#, c-format
msgid "Missing closing `%s' in option `%s'\n"
msgstr ""
-#: src/util/configuration.c:1172
+#: src/util/configuration.c:1250
#, c-format
-msgid "Failed to expand `%s' in `%s' as it is neither found in [PATHS] nor
defined as an environmental variable\n"
+msgid ""
+"Failed to expand `%s' in `%s' as it is neither found in [PATHS] nor defined "
+"as an environmental variable\n"
msgstr ""
-#: src/util/connection.c:423
+#: src/util/connection.c:424
#, c-format
msgid "Access denied to `%s'\n"
msgstr ""
-#: src/util/connection.c:438
+#: src/util/connection.c:441
#, c-format
msgid "Accepting connection from `%s': %p\n"
msgstr ""
-#: src/util/connection.c:553
-#, c-format
-msgid "Failed to establish TCP connection to `%s:%u', no further addresses to
try.\n"
-msgstr ""
-
-#: src/util/connection.c:751 src/util/connection.c:919
-#, c-format
-msgid "Trying to connect to `%s' (%p)\n"
-msgstr ""
-
-#: src/util/connection.c:910
-#, c-format
-msgid "Attempt to connect to `%s' failed\n"
-msgstr ""
-
#: src/util/container_bloomfilter.c:531
#, c-format
-msgid "Size of file on disk is incorrect for this Bloom filter (want %llu,
have %llu)\n"
+msgid ""
+"Size of file on disk is incorrect for this Bloom filter (want %llu, have "
+"%llu)\n"
msgstr ""
-#: src/util/crypto_ecc.c:702 src/util/crypto_ecc.c:740
-#: src/util/crypto_ecc.c:858 src/util/crypto_ecc.c:896
+#: src/util/crypto_ecc.c:733 src/util/crypto_ecc.c:771
+#: src/util/crypto_ecc.c:889 src/util/crypto_ecc.c:927
#, c-format
msgid "Could not acquire lock on file `%s': %s...\n"
msgstr ""
-#: src/util/crypto_ecc.c:707 src/util/crypto_ecc.c:863
+#: src/util/crypto_ecc.c:738 src/util/crypto_ecc.c:894
msgid "Creating a new private key. This may take a while.\n"
msgstr ""
-#: src/util/crypto_ecc.c:744 src/util/crypto_ecc.c:900
+#: src/util/crypto_ecc.c:775 src/util/crypto_ecc.c:931
msgid "This may be ok if someone is currently generating a private key.\n"
msgstr ""
-#: src/util/crypto_ecc.c:774 src/util/crypto_ecc.c:930
+#: src/util/crypto_ecc.c:805 src/util/crypto_ecc.c:961
#, c-format
-msgid "When trying to read key file `%s' I found %u bytes but I need at least
%u.\n"
+msgid ""
+"When trying to read key file `%s' I found %u bytes but I need at least %u.\n"
msgstr ""
-#: src/util/crypto_ecc.c:778 src/util/crypto_ecc.c:934
+#: src/util/crypto_ecc.c:809 src/util/crypto_ecc.c:965
msgid "This may be ok if someone is currently generating a key.\n"
msgstr ""
-#: src/util/crypto_ecc.c:1016
+#: src/util/crypto_ecc.c:1047
msgid "Could not load peer's private key\n"
msgstr ""
-#: src/util/crypto_ecc.c:1120
+#: src/util/crypto_ecc.c:1151
#, c-format
msgid "ECC signing failed at %s:%d: %s\n"
msgstr ""
-#: src/util/crypto_ecc.c:1170
+#: src/util/crypto_ecc.c:1201
#, c-format
msgid "EdDSA signing failed at %s:%d: %s\n"
msgstr ""
-#: src/util/crypto_ecc.c:1244
+#: src/util/crypto_ecc.c:1275
#, c-format
msgid "ECDSA signature verification failed at %s:%d: %s\n"
msgstr ""
-#: src/util/crypto_ecc.c:1301
+#: src/util/crypto_ecc.c:1332
#, c-format
msgid "EdDSA signature verification failed at %s:%d: %s\n"
msgstr ""
@@ -7471,12 +8198,17 @@
msgid "libgcrypt has not the expected version (version %s is required).\n"
msgstr ""
-#: src/util/disk.c:1184
+#: src/util/crypto_rsa.c:825
#, c-format
+msgid "RSA signature verification failed at %s:%d: %s\n"
+msgstr ""
+
+#: src/util/disk.c:1222
+#, c-format
msgid "Expected `%s' to be a directory!\n"
msgstr ""
-#: src/util/disk.c:1546 src/util/service.c:1318
+#: src/util/disk.c:1584 src/util/service.c:1328
#, c-format
msgid "Cannot obtain information about user `%s': %s\n"
msgstr ""
@@ -7541,126 +8273,137 @@
msgid "Use %s to get a list of options.\n"
msgstr ""
-#: src/util/getopt_helpers.c:84
+#: src/util/getopt_helpers.c:90
#, c-format
-msgid "Arguments mandatory for long options are also mandatory for short
options.\n"
+msgid ""
+"Arguments mandatory for long options are also mandatory for short options.\n"
msgstr ""
-#: src/util/getopt_helpers.c:268 src/util/getopt_helpers.c:326
+#: src/util/getopt_helpers.c:274 src/util/getopt_helpers.c:332
#, c-format
msgid "You must pass a number to the `%s' option.\n"
msgstr ""
-#: src/util/getopt_helpers.c:298
+#: src/util/getopt_helpers.c:304
#, c-format
msgid "You must pass relative time to the `%s' option.\n"
msgstr ""
-#: src/util/gnunet-config.c:90
+#: src/util/gnunet-config.c:111
#, c-format
msgid "--section argument is required\n"
msgstr ""
-#: src/util/gnunet-config.c:133
+#: src/util/gnunet-config.c:113
#, c-format
+msgid "The following sections are available:\n"
+msgstr ""
+
+#: src/util/gnunet-config.c:157
+#, c-format
msgid "--option argument required to set value\n"
msgstr ""
-#: src/util/gnunet-config.c:160
+#: src/util/gnunet-config.c:184
msgid "obtain option of value as a filename (with $-expansion)"
msgstr ""
-#: src/util/gnunet-config.c:163
+#: src/util/gnunet-config.c:187
msgid "name of the section to access"
msgstr ""
-#: src/util/gnunet-config.c:166
+#: src/util/gnunet-config.c:190
msgid "name of the option to access"
msgstr ""
-#: src/util/gnunet-config.c:169
+#: src/util/gnunet-config.c:193
msgid "value to set"
msgstr ""
-#: src/util/gnunet-config.c:178
+#: src/util/gnunet-config.c:196
+msgid "print available configuration sections"
+msgstr ""
+
+#: src/util/gnunet-config.c:205
msgid "Manipulate GNUnet configuration files"
msgstr ""
-#: src/util/gnunet-ecc.c:75
+#: src/util/gnunet-ecc.c:81
#, c-format
msgid "Failed to open `%s': %s\n"
msgstr ""
-#: src/util/gnunet-ecc.c:81
+#: src/util/gnunet-ecc.c:117
#, c-format
+msgid "Generating %u keys like %s, please wait"
+msgstr ""
+
+#: src/util/gnunet-ecc.c:130
+#, c-format
msgid "Generating %u keys, please wait"
msgstr ""
-#: src/util/gnunet-ecc.c:97
+#: src/util/gnunet-ecc.c:171
#, c-format
msgid ""
"\n"
"Failed to write to `%s': %s\n"
msgstr ""
-#: src/util/gnunet-ecc.c:107
+#: src/util/gnunet-ecc.c:181
#, c-format
msgid ""
"\n"
"Finished!\n"
msgstr ""
-#: src/util/gnunet-ecc.c:110
+#: src/util/gnunet-ecc.c:184
#, c-format
msgid ""
"\n"
"Error, %u keys not generated\n"
msgstr ""
-#: src/util/gnunet-ecc.c:199
+#: src/util/gnunet-ecc.c:277
#, c-format
msgid "Hostkeys file `%s' not found\n"
msgstr ""
-#: src/util/gnunet-ecc.c:210
+#: src/util/gnunet-ecc.c:288
#, c-format
msgid "Hostkeys file `%s' is empty\n"
msgstr ""
-#: src/util/gnunet-ecc.c:232
+#: src/util/gnunet-ecc.c:310
#, c-format
msgid "Could not read hostkey file: %s\n"
msgstr ""
-#: src/util/gnunet-ecc.c:283
+#: src/util/gnunet-ecc.c:361
msgid "No hostkey file specified on command line\n"
msgstr ""
-#: src/util/gnunet-ecc.c:349
+#: src/util/gnunet-ecc.c:411
msgid "list keys included in a file (for testing)"
msgstr ""
-#: src/util/gnunet-ecc.c:352
+#: src/util/gnunet-ecc.c:414
msgid "number of keys to list included in a file (for testing)"
msgstr ""
-#: src/util/gnunet-ecc.c:355
+#: src/util/gnunet-ecc.c:417
msgid "create COUNT public-private key pairs (for testing)"
msgstr ""
-#: src/util/gnunet-ecc.c:358
+#: src/util/gnunet-ecc.c:420
msgid "print the public key in ASCII format"
msgstr ""
-#: src/util/gnunet-ecc.c:361
-msgid "print the hash of the public key in ASCII format"
-msgstr ""
-
-#: src/util/gnunet-ecc.c:364
+#: src/util/gnunet-ecc.c:423
msgid "print examples of ECC operations (used for compatibility testing)"
msgstr ""
-#: src/util/gnunet-ecc.c:375
+#: src/util/gnunet-ecc.c:434
msgid "Manipulate GNUnet private ECC key files"
msgstr ""
@@ -7672,33 +8415,38 @@
msgid "Use build-in GNUnet stub resolver"
msgstr ""
-#: src/util/gnunet-scrypt.c:279
+#: src/util/gnunet-scrypt.c:233
+#, c-format
+msgid "Loading hostkey from `%s' failed.\n"
+msgstr ""
+
+#: src/util/gnunet-scrypt.c:294
msgid "number of bits to require for the proof of work"
msgstr ""
-#: src/util/gnunet-scrypt.c:282
+#: src/util/gnunet-scrypt.c:297
msgid "file with private key, otherwise default is used"
msgstr ""
-#: src/util/gnunet-scrypt.c:285
+#: src/util/gnunet-scrypt.c:300
msgid "file with proof of work, otherwise default is used"
msgstr ""
-#: src/util/gnunet-scrypt.c:288
+#: src/util/gnunet-scrypt.c:303
msgid "time to wait between calculations"
msgstr ""
-#: src/util/gnunet-scrypt.c:299
+#: src/util/gnunet-scrypt.c:315
msgid "Manipulate GNUnet proof of work files"
msgstr ""
-#: src/util/gnunet-service-resolver.c:299
+#: src/util/gnunet-service-resolver.c:310
#, c-format
msgid "Could not resolve `%s' (%s): %s\n"
msgstr ""
-#: src/util/gnunet-service-resolver.c:371
-#: src/util/gnunet-service-resolver.c:412
+#: src/util/gnunet-service-resolver.c:382
+#: src/util/gnunet-service-resolver.c:423
#, c-format
msgid "Could not find IP of host `%s': %s\n"
msgstr ""
@@ -7727,34 +8475,37 @@
msgid "Perform default-actions for GNUnet URIs"
msgstr ""
-#: src/util/helper.c:338
+#: src/util/helper.c:342
#, c-format
msgid "Error reading from `%s': %s\n"
msgstr ""
-#: src/util/helper.c:383
+#: src/util/helper.c:388
#, c-format
msgid "Failed to parse inbound message from helper `%s'\n"
msgstr ""
-#: src/util/helper.c:609
+#: src/util/helper.c:620
#, c-format
msgid "Error writing to `%s': %s\n"
msgstr ""
-#: src/util/network.c:134
+#: src/util/network.c:137
#, c-format
msgid "Unable to shorten unix path `%s' while keeping name unique\n"
msgstr ""
-#: src/util/network.c:1355 src/util/network.c:1480
+#: src/util/network.c:1681 src/util/network.c:1857
#, c-format
-msgid "Fatal internal logic error, process hangs in `%s' (abort with
CTRL-C)!\n"
+msgid ""
+"Fatal internal logic error, process hangs in `%s' (abort with CTRL-C)!\n"
msgstr ""
#: src/util/os_installation.c:421
#, c-format
-msgid "Could not determine installation path for %s. Set `%s' environment
variable.\n"
+msgid ""
+"Could not determine installation path for %s. Set `%s' environment "
+"variable.\n"
msgstr ""
#: src/util/os_installation.c:766
@@ -7772,75 +8523,67 @@
msgid "GetExitCodeProcess failed for binary %s (%d).\n"
msgstr ""
-#: src/util/plugin.c:87
+#: src/util/plugin.c:86
#, c-format
msgid "Initialization of plugin mechanism failed: %s!\n"
msgstr ""
-#: src/util/plugin.c:148
+#: src/util/plugin.c:151
#, c-format
msgid "`%s' failed to resolve method '%s' with error: %s\n"
msgstr ""
-#: src/util/plugin.c:223
+#: src/util/plugin.c:226
#, c-format
msgid "`%s' failed for library `%s' with error: %s\n"
msgstr ""
-#: src/util/plugin.c:382
+#: src/util/plugin.c:385
msgid "Could not determine plugin installation path.\n"
msgstr ""
-#: src/util/program.c:246 src/util/service.c:1452
+#: src/util/program.c:246 src/util/service.c:1462
#, c-format
msgid "Malformed configuration file `%s', exit ...\n"
msgstr ""
-#: src/util/program.c:258 src/util/service.c:1467
+#: src/util/program.c:258 src/util/service.c:1477
#, c-format
msgid "Could not access configuration file `%s'\n"
msgstr ""
-#: src/util/program.c:263 src/util/service.c:1462
+#: src/util/program.c:263 src/util/service.c:1472
msgid "Malformed configuration, exit ...\n"
msgstr ""
-#: src/util/resolver_api.c:198
+#: src/util/resolver_api.c:201
#, c-format
msgid "Must specify `%s' for `%s' in configuration!\n"
msgstr ""
-#: src/util/resolver_api.c:216
+#: src/util/resolver_api.c:220
#, c-format
-msgid "Must specify `%s' or numeric IP address for `%s' of `%s' in
configuration!\n"
+msgid ""
+"Must specify `%s' or numeric IP address for `%s' of `%s' in configuration!\n"
msgstr ""
-#: src/util/resolver_api.c:348
+#: src/util/resolver_api.c:354
#, c-format
msgid "Timeout trying to resolve IP address `%s'.\n"
msgstr ""
-#: src/util/resolver_api.c:352
+#: src/util/resolver_api.c:361
#, c-format
msgid "Timeout trying to resolve hostname `%s'.\n"
msgstr ""
-#: src/util/resolver_api.c:908
+#: src/util/resolver_api.c:1004
#, c-format
msgid "Could not resolve our FQDN : %s\n"
msgstr ""
-#: src/util/scheduler.c:813
-msgid "Looks like we're busy waiting...\n"
-msgstr ""
-
-#: src/util/scheduler.c:948
+#: src/util/server.c:483
#, c-format
-msgid "Attempt to cancel dead task %llu!\n"
-msgstr ""
-
-#: src/util/server.c:484
-#, c-format
msgid "`%s' failed for port %d (%s).\n"
msgstr ""
@@ -7854,9 +8597,11 @@
msgid "`%s' failed for `%s': address already in use\n"
msgstr ""
-#: src/util/server.c:892
+#: src/util/server.c:904
#, c-format
-msgid "Processing code for message of type %u did not call
`GNUNET_SERVER_receive_done' after %s\n"
+msgid ""
+"Processing code for message of type %u did not call "
+"`GNUNET_SERVER_receive_done' after %s\n"
msgstr ""
#: src/util/service.c:347
@@ -7869,77 +8614,80 @@
msgid "Access from `%s' denied to service `%s'\n"
msgstr ""
-#: src/util/service.c:409
+#: src/util/service.c:410
#, c-format
msgid "Could not parse IPv4 network specification `%s' for `%s:%s'\n"
msgstr ""
-#: src/util/service.c:446
+#: src/util/service.c:448
#, c-format
msgid "Could not parse IPv6 network specification `%s' for `%s:%s'\n"
msgstr ""
-#: src/util/service.c:563
+#: src/util/service.c:565
#, c-format
-msgid "Disabling IPv6 support for service `%s', failed to create IPv6 socket:
%s\n"
+msgid ""
+"Disabling IPv6 support for service `%s', failed to create IPv6 socket: %s\n"
msgstr ""
-#: src/util/service.c:653
+#: src/util/service.c:656
#, c-format
-msgid "Disabling UNIX domain socket support for service `%s', failed to create
UNIX domain socket: %s\n"
+msgid ""
+"Disabling UNIX domain socket support for service `%s', failed to create UNIX "
+"domain socket: %s\n"
msgstr ""
-#: src/util/service.c:669
+#: src/util/service.c:673
#, c-format
msgid "Have neither PORT nor UNIXPATH for service `%s', but one is required\n"
msgstr ""
-#: src/util/service.c:903
+#: src/util/service.c:912
msgid "Could not access a pre-bound socket, will try to bind myself\n"
msgstr ""
-#: src/util/service.c:952 src/util/service.c:970
+#: src/util/service.c:961 src/util/service.c:979
#, c-format
msgid "Specified value for `%s' of service `%s' is invalid\n"
msgstr ""
-#: src/util/service.c:995
+#: src/util/service.c:1004
#, c-format
msgid "Could not access pre-bound socket %u, will try to bind myself\n"
msgstr ""
-#: src/util/service.c:1165
+#: src/util/service.c:1175
#, c-format
msgid "Failed to start `%s' at `%s'\n"
msgstr ""
-#: src/util/service.c:1207
+#: src/util/service.c:1217
#, c-format
msgid "Service `%s' runs at %s\n"
msgstr ""
-#: src/util/service.c:1256
+#: src/util/service.c:1266
msgid "Service process failed to initialize\n"
msgstr ""
-#: src/util/service.c:1260
+#: src/util/service.c:1270
msgid "Service process could not initialize server function\n"
msgstr ""
-#: src/util/service.c:1264
+#: src/util/service.c:1274
msgid "Service process failed to report status\n"
msgstr ""
-#: src/util/service.c:1319
+#: src/util/service.c:1329
msgid "No such user"
msgstr ""
-#: src/util/service.c:1332
+#: src/util/service.c:1342
#, c-format
msgid "Cannot change user/group to `%s': %s\n"
msgstr ""
-#: src/util/service.c:1402
+#: src/util/service.c:1412
msgid "do daemonize (detach from terminal)"
msgstr ""
@@ -7952,112 +8700,112 @@
msgid "b"
msgstr ""
-#: src/util/strings.c:433
+#: src/util/strings.c:434
#, c-format
msgid "Character sets requested were `%s'->`%s'\n"
msgstr ""
-#: src/util/strings.c:561
+#: src/util/strings.c:562
msgid "Failed to expand `$HOME': environment variable `HOME' not set"
msgstr ""
-#: src/util/strings.c:658
+#: src/util/strings.c:659
msgid "µs"
msgstr ""
-#: src/util/strings.c:662
+#: src/util/strings.c:663
msgid "forever"
msgstr ""
-#: src/util/strings.c:664
+#: src/util/strings.c:665
msgid "0 ms"
msgstr ""
-#: src/util/strings.c:670
+#: src/util/strings.c:671
msgid "ms"
msgstr ""
-#: src/util/strings.c:676
+#: src/util/strings.c:677
msgid "s"
msgstr ""
-#: src/util/strings.c:682
+#: src/util/strings.c:683
msgid "m"
msgstr ""
-#: src/util/strings.c:688
+#: src/util/strings.c:689
msgid "h"
msgstr ""
-#: src/util/strings.c:695
+#: src/util/strings.c:696
msgid "day"
msgstr ""
-#: src/util/strings.c:697
+#: src/util/strings.c:698
msgid "days"
msgstr ""
-#: src/util/strings.c:726
+#: src/util/strings.c:727
msgid "end of time"
msgstr ""
-#: src/util/strings.c:1159
+#: src/util/strings.c:1226
msgid "IPv6 address did not start with `['\n"
msgstr ""
-#: src/util/strings.c:1167
+#: src/util/strings.c:1234
msgid "IPv6 address did contain ':' to separate port number\n"
msgstr ""
-#: src/util/strings.c:1173
+#: src/util/strings.c:1240
msgid "IPv6 address did contain ']' before ':' to separate port number\n"
msgstr ""
-#: src/util/strings.c:1180
+#: src/util/strings.c:1247
msgid "IPv6 address did contain a valid port number after the last ':'\n"
msgstr ""
-#: src/util/strings.c:1189
+#: src/util/strings.c:1256
#, c-format
msgid "Invalid IPv6 address `%s': %s\n"
msgstr ""
-#: src/util/strings.c:1395 src/util/strings.c:1411
+#: src/util/strings.c:1462 src/util/strings.c:1478
msgid "Port not in range\n"
msgstr ""
-#: src/util/strings.c:1420
+#: src/util/strings.c:1487
#, c-format
msgid "Malformed port policy `%s'\n"
msgstr ""
-#: src/util/strings.c:1503 src/util/strings.c:1534 src/util/strings.c:1582
-#: src/util/strings.c:1603
+#: src/util/strings.c:1570 src/util/strings.c:1601 src/util/strings.c:1649
+#: src/util/strings.c:1670
#, c-format
msgid "Invalid format for IP: `%s'\n"
msgstr ""
-#: src/util/strings.c:1560
+#: src/util/strings.c:1627
#, c-format
msgid "Invalid network notation ('/%d' is not legal in IPv4 CIDR)."
msgstr ""
-#: src/util/strings.c:1612
+#: src/util/strings.c:1679
#, c-format
msgid "Invalid format: `%s'\n"
msgstr ""
-#: src/util/strings.c:1664
+#: src/util/strings.c:1731
#, c-format
msgid "Invalid network notation (does not end with ';': `%s')\n"
msgstr ""
-#: src/util/strings.c:1714
+#: src/util/strings.c:1781
#, c-format
msgid "Wrong format `%s' for netmask\n"
msgstr ""
-#: src/util/strings.c:1745
+#: src/util/strings.c:1812
#, c-format
msgid "Wrong format `%s' for network\n"
msgstr ""
@@ -8067,19 +8815,19 @@
msgstr ""
#: src/vpn/gnunet-service-vpn.c:642
-msgid "# Bytes given to mesh for transmission"
+msgid "# Bytes given to cadet for transmission"
msgstr ""
#: src/vpn/gnunet-service-vpn.c:680
-msgid "# Bytes dropped in mesh queue (overflow)"
+msgid "# Bytes dropped in cadet queue (overflow)"
msgstr ""
#: src/vpn/gnunet-service-vpn.c:753
-msgid "# Mesh channels created"
+msgid "# Cadet channels created"
msgstr ""
#: src/vpn/gnunet-service-vpn.c:784
-msgid "Failed to setup mesh channel!\n"
+msgid "Failed to setup cadet channel!\n"
msgstr ""
#: src/vpn/gnunet-service-vpn.c:978
@@ -8114,15 +8862,15 @@
msgstr ""
#: src/vpn/gnunet-service-vpn.c:1706
-msgid "# ICMP packets received from mesh"
+msgid "# ICMP packets received from cadet"
msgstr ""
#: src/vpn/gnunet-service-vpn.c:2045
-msgid "# UDP packets received from mesh"
+msgid "# UDP packets received from cadet"
msgstr ""
#: src/vpn/gnunet-service-vpn.c:2200
-msgid "# TCP packets received from mesh"
+msgid "# TCP packets received from cadet"
msgstr ""
#: src/vpn/gnunet-service-vpn.c:2351
@@ -8141,27 +8889,27 @@
msgid "Failed to allocate IP address for new destination\n"
msgstr ""
-#: src/vpn/gnunet-service-vpn.c:2982
+#: src/vpn/gnunet-service-vpn.c:2987
msgid "Must specify valid IPv6 address"
msgstr ""
-#: src/vpn/gnunet-service-vpn.c:3006
+#: src/vpn/gnunet-service-vpn.c:3011
msgid "Must specify valid IPv6 mask"
msgstr ""
-#: src/vpn/gnunet-service-vpn.c:3014
+#: src/vpn/gnunet-service-vpn.c:3019
msgid "IPv6 support disabled as this system does not support IPv6\n"
msgstr ""
-#: src/vpn/gnunet-service-vpn.c:3027
+#: src/vpn/gnunet-service-vpn.c:3032
msgid "Must specify valid IPv4 address"
msgstr ""
-#: src/vpn/gnunet-service-vpn.c:3040
+#: src/vpn/gnunet-service-vpn.c:3045
msgid "Must specify valid IPv4 mask"
msgstr ""
-#: src/vpn/gnunet-service-vpn.c:3050
+#: src/vpn/gnunet-service-vpn.c:3055
msgid "IPv4 support disabled as this system does not support IPv4\n"
msgstr ""
@@ -8230,18 +8978,18 @@
msgid "Setup tunnels via VPN."
msgstr ""
-#: src/include/gnunet_common.h:566 src/include/gnunet_common.h:573
-#: src/include/gnunet_common.h:581
+#: src/include/gnunet_common.h:590 src/include/gnunet_common.h:597
+#: src/include/gnunet_common.h:605
#, c-format
msgid "Assertion failed at %s:%d.\n"
msgstr ""
-#: src/include/gnunet_common.h:593
+#: src/include/gnunet_common.h:617
#, c-format
msgid "External protocol violation detected at %s:%d.\n"
msgstr ""
-#: src/include/gnunet_common.h:620 src/include/gnunet_common.h:629
+#: src/include/gnunet_common.h:644 src/include/gnunet_common.h:653
#, c-format
msgid "`%s' failed on file `%s' at %s:%d with error: %s\n"
msgstr ""
Modified: gnunet/po/sv.po
===================================================================
--- gnunet/po/sv.po 2015-04-24 07:04:18 UTC (rev 35558)
+++ gnunet/po/sv.po 2015-04-27 11:12:21 UTC (rev 35559)
@@ -7,7 +7,7 @@
msgstr ""
"Project-Id-Version: GNUnet 0.7.0b\n"
"Report-Msgid-Bugs-To: address@hidden"
-"POT-Creation-Date: 2015-03-14 18:00+0100\n"
+"POT-Creation-Date: 2015-04-27 13:05+0200\n"
"PO-Revision-Date: 2006-01-21 17:16+0100\n"
"Last-Translator: Daniel Nylander <address@hidden>\n"
"Language-Team: Swedish <address@hidden>\n"
@@ -497,16 +497,16 @@
msgid "Could not connect master [%u] and slave [%u]\n"
msgstr "Kunde inte ansluta till gnunetd.\n"
-#: src/ats-tests/ats-testing.c:490 src/ats-tests/ats-testing.c:662
+#: src/ats-tests/ats-testing.c:490 src/ats-tests/ats-testing.c:634
#, fuzzy
msgid "Initialization failed, shutdown\n"
msgstr "Initiering av insticksmekanism misslyckades: %s!\n"
-#: src/ats-tests/ats-testing-log.c:846
+#: src/ats-tests/ats-testing-log.c:834
msgid "Stop logging\n"
msgstr ""
-#: src/ats-tests/ats-testing-log.c:897
+#: src/ats-tests/ats-testing-log.c:885
#, fuzzy, c-format
msgid "Start logging `%s'\n"
msgstr "Startade samling \"%s\".\n"
@@ -554,6 +554,7 @@
msgstr ""
#: src/ats-tool/gnunet-ats.c:708 src/namestore/gnunet-namestore.c:700
+#: src/namestore/plugin_rest_namestore.c:812
#: src/transport/gnunet-transport.c:1890
#: src/transport/gnunet-transport-profiler.c:531
#, fuzzy, c-format
@@ -1436,30 +1437,30 @@
msgid "# PAYLOAD dropped (out of order)"
msgstr "# byte kastade via UDP (utgående)"
-#: src/core/gnunet-service-core_neighbours.c:168
+#: src/core/gnunet-service-core_neighbours.c:177
#, fuzzy
msgid "# sessions terminated by transport disconnect"
msgstr "Nätverksannonsering avstängd i konfigurationen!\n"
-#: src/core/gnunet-service-core_neighbours.c:184
-#: src/core/gnunet-service-core_neighbours.c:342
+#: src/core/gnunet-service-core_neighbours.c:193
+#: src/core/gnunet-service-core_neighbours.c:355
msgid "# neighbour entries allocated"
msgstr ""
-#: src/core/gnunet-service-core_neighbours.c:252
+#: src/core/gnunet-service-core_neighbours.c:264
msgid "# encrypted bytes given to transport"
msgstr ""
-#: src/core/gnunet-service-core_neighbours.c:425
+#: src/core/gnunet-service-core_neighbours.c:438
#, c-format
msgid "Unsupported message of type %u (%u bytes) received from peer `%s'\n"
msgstr ""
-#: src/core/gnunet-service-core_sessions.c:245
-#: src/core/gnunet-service-core_sessions.c:331
+#: src/core/gnunet-service-core_sessions.c:252
+#: src/core/gnunet-service-core_sessions.c:338
#: src/dht/gnunet-service-dht_neighbours.c:661
#: src/dht/gnunet-service-dht_neighbours.c:726
-#: src/fs/gnunet-service-fs_cp.c:645 src/fs/gnunet-service-fs_cp.c:1627
+#: src/fs/gnunet-service-fs_cp.c:654 src/fs/gnunet-service-fs_cp.c:1647
#: src/topology/gnunet-daemon-topology.c:734
#: src/topology/gnunet-daemon-topology.c:835
#: src/transport/gnunet-service-transport_neighbours.c:755
@@ -1468,21 +1469,21 @@
msgid "# peers connected"
msgstr "# av anslutna parter"
-#: src/core/gnunet-service-core_sessions.c:278
+#: src/core/gnunet-service-core_sessions.c:285
msgid "# type map refreshes sent"
msgstr ""
-#: src/core/gnunet-service-core_sessions.c:397
+#: src/core/gnunet-service-core_sessions.c:404
#, fuzzy
msgid "# outdated typemap confirmations received"
msgstr "Kunde inte spara konfiguration!"
-#: src/core/gnunet-service-core_sessions.c:408
+#: src/core/gnunet-service-core_sessions.c:415
#, fuzzy
msgid "# valid typemap confirmations received"
msgstr "Kunde inte spara konfiguration!"
-#: src/core/gnunet-service-core_sessions.c:546
+#: src/core/gnunet-service-core_sessions.c:554
msgid "# messages discarded (expired prior to transmission)"
msgstr ""
@@ -1497,7 +1498,7 @@
msgstr ""
#: src/datacache/datacache.c:115 src/datacache/datacache.c:266
-#: src/datastore/gnunet-service-datastore.c:855
+#: src/datastore/gnunet-service-datastore.c:841
#, fuzzy
msgid "# bytes stored"
msgstr "# byte krypterade"
@@ -1508,8 +1509,8 @@
msgstr "# byte krypterade"
#: src/datacache/datacache.c:143 src/datacache/datacache.c:150
-#: src/datastore/gnunet-service-datastore.c:1557
-#: src/datastore/gnunet-service-datastore.c:1568
+#: src/datastore/gnunet-service-datastore.c:1598
+#: src/datastore/gnunet-service-datastore.c:1609
#, fuzzy, c-format
msgid "No `%s' specified for `%s' in configuration!\n"
msgstr "Inga applikationer definierade i konfiguration!\n"
@@ -1543,8 +1544,8 @@
#: src/datacache/plugin_datacache_sqlite.c:69
#: src/datacache/plugin_datacache_sqlite.c:72
-#: src/datastore/plugin_datastore_mysql.c:809
-#: src/datastore/plugin_datastore_mysql.c:823
+#: src/datastore/plugin_datastore_mysql.c:818
+#: src/datastore/plugin_datastore_mysql.c:834
#: src/datastore/plugin_datastore_sqlite.c:57 src/mysql/mysql.c:41
#: src/mysql/mysql.c:48 src/mysql/mysql.c:522 src/mysql/mysql.c:531
#: src/mysql/mysql.c:591 src/mysql/mysql.c:607
@@ -1746,8 +1747,8 @@
#: src/datastore/gnunet-service-datastore.c:712
#: src/datastore/gnunet-service-datastore.c:767
-#: src/datastore/gnunet-service-datastore.c:982
-#: src/datastore/gnunet-service-datastore.c:1529
+#: src/datastore/gnunet-service-datastore.c:999
+#: src/datastore/gnunet-service-datastore.c:1570
msgid "# reserved"
msgstr ""
@@ -1755,133 +1756,148 @@
msgid "Could not find matching reservation"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:867
+#: src/datastore/gnunet-service-datastore.c:853
#, c-format
msgid "Need %llu bytes more space (%llu allowed, using %llu)\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1029
+#: src/datastore/gnunet-service-datastore.c:1046
#, fuzzy
msgid "# GET requests received"
msgstr "# byte mottogs via TCP"
-#: src/datastore/gnunet-service-datastore.c:1041
+#: src/datastore/gnunet-service-datastore.c:1058
msgid "# requests filtered by bloomfilter"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1069
+#: src/datastore/gnunet-service-datastore.c:1094
#, fuzzy
msgid "# UPDATE requests received"
msgstr "# byte mottogs via TCP"
-#: src/datastore/gnunet-service-datastore.c:1099
+#: src/datastore/gnunet-service-datastore.c:1122
msgid "# GET REPLICATION requests received"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1132
+#: src/datastore/gnunet-service-datastore.c:1155
msgid "# GET ZERO ANONYMITY requests received"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1157
+#: src/datastore/gnunet-service-datastore.c:1180
#, fuzzy
msgid "Content not found"
msgstr "Kommando \"%s\" hittades inte!\n"
-#: src/datastore/gnunet-service-datastore.c:1165
+#: src/datastore/gnunet-service-datastore.c:1188
msgid "# bytes removed (explicit request)"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1197
+#: src/datastore/gnunet-service-datastore.c:1220
#, fuzzy
msgid "# REMOVE requests received"
msgstr "# byte mottogs via TCP"
-#: src/datastore/gnunet-service-datastore.c:1241
+#: src/datastore/gnunet-service-datastore.c:1264
#, c-format
msgid ""
"Datastore payload must have been inaccurate (%lld < %lld). Recomputing it.\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1246
+#: src/datastore/gnunet-service-datastore.c:1269
#, c-format
msgid "New payload: %lld\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1299
+#: src/datastore/gnunet-service-datastore.c:1322
#, c-format
msgid "Loading `%s' datastore plugin\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1310
+#: src/datastore/gnunet-service-datastore.c:1333
#, fuzzy, c-format
msgid "Failed to load datastore plugin for `%s'\n"
msgstr "Kunde inte slå upp \"%s\": %s\n"
-#: src/datastore/gnunet-service-datastore.c:1412
+#: src/datastore/gnunet-service-datastore.c:1402
+#: src/datastore/gnunet-service-datastore.c:1463
+msgid "Bloomfilter construction complete.\n"
+msgstr ""
+
+#: src/datastore/gnunet-service-datastore.c:1450
msgid "Rebuilding bloomfilter. Please be patient.\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1419
+#: src/datastore/gnunet-service-datastore.c:1460
msgid "Plugin does not support get_keys function. Please fix!\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1422
-msgid "Bloomfilter construction complete.\n"
-msgstr ""
-
-#: src/datastore/gnunet-service-datastore.c:1562
+#: src/datastore/gnunet-service-datastore.c:1603
#, fuzzy, c-format
msgid "# bytes used in file-sharing datastore `%s'"
msgstr "# byte krypterade"
-#: src/datastore/gnunet-service-datastore.c:1573
+#: src/datastore/gnunet-service-datastore.c:1614
msgid "# quota"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1575
+#: src/datastore/gnunet-service-datastore.c:1616
msgid "# cache size"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1588
+#: src/datastore/gnunet-service-datastore.c:1629
#, c-format
msgid "Could not use specified filename `%s' for bloomfilter.\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1606
-#: src/datastore/gnunet-service-datastore.c:1622
+#: src/datastore/gnunet-service-datastore.c:1647
+#: src/datastore/gnunet-service-datastore.c:1663
#, fuzzy, c-format
msgid "Failed to remove bogus bloomfilter file `%s'\n"
msgstr "Kunde inte spara konfigurationsfil \"%s\":"
-#: src/datastore/gnunet-service-datastore.c:1652
+#: src/datastore/gnunet-service-datastore.c:1693
#, fuzzy
msgid "Failed to initialize bloomfilter.\n"
msgstr "Misslyckades att initiera tjänsten \"%s\".\n"
-#: src/datastore/plugin_datastore_heap.c:821
+#: src/datastore/plugin_datastore_heap.c:826
msgid "Heap database running\n"
msgstr ""
-#: src/datastore/plugin_datastore_mysql.c:786
+#: src/datastore/plugin_datastore_mysql.c:309
+#: src/datastore/plugin_datastore_sqlite.c:499
+#, fuzzy
+msgid "Data too large"
+msgstr "antal iterationer"
+
+#: src/datastore/plugin_datastore_mysql.c:328
+msgid "MySQL statement run failure"
+msgstr ""
+
+#: src/datastore/plugin_datastore_mysql.c:793
#, fuzzy, c-format
msgid "Failed to prepare statement `%s'\n"
msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
-#: src/datastore/plugin_datastore_mysql.c:794
+#: src/datastore/plugin_datastore_mysql.c:802
#, fuzzy, c-format
msgid "`%s' for `%s' failed at %s:%d with error: %s\n"
msgstr "\"%s\" till \"%s\" misslyckades vid %s:%d med fel: %s\n"
-#: src/datastore/plugin_datastore_mysql.c:1025
+#: src/datastore/plugin_datastore_mysql.c:1036
msgid "Mysql database running\n"
msgstr ""
-#: src/datastore/plugin_datastore_postgres.c:837
+#: src/datastore/plugin_datastore_postgres.c:331
+msgid "Postgress exec failure"
+msgstr ""
+
+#: src/datastore/plugin_datastore_postgres.c:846
#, fuzzy
msgid "Failed to drop table from database.\n"
msgstr "Misslyckades att ta emot svar till \"%s\" meddelande från gnunetd\n"
-#: src/datastore/plugin_datastore_postgres.c:873
+#: src/datastore/plugin_datastore_postgres.c:882
#: src/namecache/plugin_namecache_postgres.c:414
#: src/namestore/plugin_namestore_postgres.c:569
msgid "Postgres database running\n"
@@ -1904,28 +1920,28 @@
msgid "Unable to initialize SQLite: %s.\n"
msgstr "Kunde inte initiera SQLite.\n"
-#: src/datastore/plugin_datastore_sqlite.c:661
+#: src/datastore/plugin_datastore_sqlite.c:680
msgid "Invalid data in database. Trying to fix (by deletion).\n"
msgstr ""
-#: src/datastore/plugin_datastore_sqlite.c:1156
+#: src/datastore/plugin_datastore_sqlite.c:1177
msgid "sqlite version to old to determine size, assuming zero\n"
msgstr ""
-#: src/datastore/plugin_datastore_sqlite.c:1176
+#: src/datastore/plugin_datastore_sqlite.c:1197
#, c-format
msgid ""
"Using sqlite page utilization to estimate payload (%llu pages of size %llu "
"bytes)\n"
msgstr ""
-#: src/datastore/plugin_datastore_sqlite.c:1216
+#: src/datastore/plugin_datastore_sqlite.c:1237
#: src/namecache/plugin_namecache_sqlite.c:580
#: src/namestore/plugin_namestore_sqlite.c:716
msgid "Sqlite database running\n"
msgstr ""
-#: src/datastore/plugin_datastore_template.c:259
+#: src/datastore/plugin_datastore_template.c:260
msgid "Template database running\n"
msgstr ""
@@ -2558,54 +2574,54 @@
msgid "Change DNS replies to point elsewhere."
msgstr ""
-#: src/dns/gnunet-service-dns.c:456
+#: src/dns/gnunet-service-dns.c:459
msgid "# DNS requests answered via TUN interface"
msgstr ""
-#: src/dns/gnunet-service-dns.c:603
+#: src/dns/gnunet-service-dns.c:606
msgid "# DNS exit failed (failed to open socket)"
msgstr ""
-#: src/dns/gnunet-service-dns.c:714
+#: src/dns/gnunet-service-dns.c:717
msgid "# External DNS response discarded (no matching request)"
msgstr ""
-#: src/dns/gnunet-service-dns.c:792
+#: src/dns/gnunet-service-dns.c:795
msgid "# Client response discarded (no matching request)"
msgstr ""
-#: src/dns/gnunet-service-dns.c:907
+#: src/dns/gnunet-service-dns.c:910
msgid "Received malformed IPv4-UDP packet on TUN interface.\n"
msgstr ""
-#: src/dns/gnunet-service-dns.c:923
+#: src/dns/gnunet-service-dns.c:926
msgid "Received malformed IPv6-UDP packet on TUN interface.\n"
msgstr ""
-#: src/dns/gnunet-service-dns.c:932
+#: src/dns/gnunet-service-dns.c:935
#, c-format
msgid "Got non-IP packet with %u bytes and protocol %u from TUN\n"
msgstr ""
-#: src/dns/gnunet-service-dns.c:942
+#: src/dns/gnunet-service-dns.c:945
msgid "# Non-DNS UDP packet received via TUN interface"
msgstr ""
-#: src/dns/gnunet-service-dns.c:1009
+#: src/dns/gnunet-service-dns.c:1012
#, fuzzy
msgid "# DNS requests received via TUN interface"
msgstr "Meddelande mottaget från klient är ogiltig.\n"
-#: src/dns/gnunet-service-dns.c:1049
-#, c-format
-msgid "`%s' must be installed SUID, refusing to run\n"
-msgstr ""
-
-#: src/dns/gnunet-service-dns.c:1069 src/exit/gnunet-daemon-exit.c:3594
+#: src/dns/gnunet-service-dns.c:1064 src/exit/gnunet-daemon-exit.c:3594
#, fuzzy
msgid "need a valid IPv4 or IPv6 address\n"
msgstr "Ogiltigt svar på \"%s\".\n"
+#: src/dns/gnunet-service-dns.c:1082
+#, c-format
+msgid "`%s' must be installed SUID, will not run DNS interceptor\n"
+msgstr ""
+
#: src/dv/gnunet-dv.c:169
msgid "verbose output"
msgstr ""
@@ -2842,57 +2858,57 @@
msgid "Daemon to run to provide an IP exit node for the VPN"
msgstr ""
-#: src/fragmentation/defragmentation.c:271
+#: src/fragmentation/defragmentation.c:277
msgid "# acknowledgements sent for fragment"
msgstr ""
-#: src/fragmentation/defragmentation.c:463
+#: src/fragmentation/defragmentation.c:470
#: src/transport/plugin_transport_wlan.c:1515
#, fuzzy
msgid "# fragments received"
msgstr "# byte mottogs via TCP"
-#: src/fragmentation/defragmentation.c:533
+#: src/fragmentation/defragmentation.c:540
#, fuzzy
msgid "# duplicate fragments received"
msgstr "# byte mottogs via TCP"
-#: src/fragmentation/defragmentation.c:549
+#: src/fragmentation/defragmentation.c:558
msgid "# messages defragmented"
msgstr ""
-#: src/fragmentation/fragmentation.c:234
+#: src/fragmentation/fragmentation.c:235
#, fuzzy
msgid "# fragments transmitted"
msgstr "# byte skickade av typen %d"
-#: src/fragmentation/fragmentation.c:237
+#: src/fragmentation/fragmentation.c:240
#, fuzzy
msgid "# fragments retransmitted"
msgstr "# byte skickade av typen %d"
-#: src/fragmentation/fragmentation.c:263
+#: src/fragmentation/fragmentation.c:269
#, fuzzy
msgid "# fragments wrap arounds"
msgstr "# byte skickade av typen %d"
-#: src/fragmentation/fragmentation.c:307
+#: src/fragmentation/fragmentation.c:315
msgid "# messages fragmented"
msgstr ""
-#: src/fragmentation/fragmentation.c:310
+#: src/fragmentation/fragmentation.c:321
msgid "# total size of fragmented messages"
msgstr ""
-#: src/fragmentation/fragmentation.c:431
+#: src/fragmentation/fragmentation.c:444
msgid "# fragment acknowledgements received"
msgstr ""
-#: src/fragmentation/fragmentation.c:437
+#: src/fragmentation/fragmentation.c:451
msgid "# bits removed from fragmentation ACKs"
msgstr ""
-#: src/fragmentation/fragmentation.c:461
+#: src/fragmentation/fragmentation.c:475
#, fuzzy
msgid "# fragmentation transmissions completed"
msgstr "# klartext PONG-meddelanden mottagna"
@@ -3164,59 +3180,59 @@
msgid "Got result with unknown block type `%d', ignoring"
msgstr ""
-#: src/fs/fs_unindex.c:59
+#: src/fs/fs_unindex.c:63
msgid "Failed to find given position in file"
msgstr ""
-#: src/fs/fs_unindex.c:64
+#: src/fs/fs_unindex.c:68
#, fuzzy
msgid "Failed to read file"
msgstr "Misslyckades att leverera \"%s\" meddelande.\n"
-#: src/fs/fs_unindex.c:234
+#: src/fs/fs_unindex.c:245
msgid "Unexpected time for a response from `fs' service."
msgstr ""
-#: src/fs/fs_unindex.c:242
+#: src/fs/fs_unindex.c:253
msgid "Timeout waiting for `fs' service."
msgstr ""
-#: src/fs/fs_unindex.c:250
+#: src/fs/fs_unindex.c:261
#, fuzzy
msgid "Invalid response from `fs' service."
msgstr "Ogiltigt svar till \"%s\" från \"%s\"\n"
-#: src/fs/fs_unindex.c:291
+#: src/fs/fs_unindex.c:304
#, fuzzy
msgid "Failed to connect to FS service for unindexing."
msgstr "Misslyckades att ansluta till gnunetd.\n"
-#: src/fs/fs_unindex.c:347 src/fs/fs_unindex.c:359
+#: src/fs/fs_unindex.c:360 src/fs/fs_unindex.c:372
#, fuzzy
msgid "Failed to get KSKs from directory scan."
msgstr "Filformatsfel (inte en GNUnet-katalog?)\n"
-#: src/fs/fs_unindex.c:355
+#: src/fs/fs_unindex.c:368
#, fuzzy, c-format
msgid "Internal error scanning `%s'.\n"
msgstr "=\tFel vid läsning av katalog.\n"
-#: src/fs/fs_unindex.c:414
+#: src/fs/fs_unindex.c:427
#, fuzzy, c-format
msgid "Failed to remove UBlock: %s\n"
msgstr "Misslyckades att leverera \"%s\" meddelande.\n"
-#: src/fs/fs_unindex.c:562 src/fs/fs_unindex.c:626
+#: src/fs/fs_unindex.c:590 src/fs/fs_unindex.c:656
#, fuzzy
msgid "Failed to connect to `datastore' service."
msgstr "Misslyckades att initiera tjänsten \"%s\".\n"
-#: src/fs/fs_unindex.c:639
+#: src/fs/fs_unindex.c:669
#, fuzzy
msgid "Failed to open file for unindexing."
msgstr "Misslyckades att ansluta till gnunetd.\n"
-#: src/fs/fs_unindex.c:673
+#: src/fs/fs_unindex.c:708
#, fuzzy
msgid "Failed to compute hash of file."
msgstr "Misslyckades att ansluta till gnunetd.\n"
@@ -3801,94 +3817,94 @@
msgid "# cadet connections active"
msgstr "Nätverksanslutning"
-#: src/fs/gnunet-service-fs_cp.c:726
+#: src/fs/gnunet-service-fs_cp.c:735
#, fuzzy
msgid "# migration stop messages received"
msgstr "# krypterade PONG-meddelanden mottagna"
-#: src/fs/gnunet-service-fs_cp.c:730
+#: src/fs/gnunet-service-fs_cp.c:739
#, c-format
msgid "Migration of content to peer `%s' blocked for %s\n"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:768
+#: src/fs/gnunet-service-fs_cp.c:776
#, fuzzy
msgid "# replies transmitted to other peers"
msgstr "# byte skickade av typen %d"
-#: src/fs/gnunet-service-fs_cp.c:774
+#: src/fs/gnunet-service-fs_cp.c:784
msgid "# replies dropped"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:799 src/fs/gnunet-service-fs_cp.c:1384
+#: src/fs/gnunet-service-fs_cp.c:810 src/fs/gnunet-service-fs_cp.c:1404
msgid "# P2P searches active"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:904
+#: src/fs/gnunet-service-fs_cp.c:915
msgid "# artificial delays introduced (ms)"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:960
+#: src/fs/gnunet-service-fs_cp.c:971
#, fuzzy
msgid "# replies dropped due to type mismatch"
msgstr "# byte mottagna av typen %d"
-#: src/fs/gnunet-service-fs_cp.c:968
+#: src/fs/gnunet-service-fs_cp.c:979
#, fuzzy
msgid "# replies received for other peers"
msgstr "# byte mottagna av typen %d"
-#: src/fs/gnunet-service-fs_cp.c:982
+#: src/fs/gnunet-service-fs_cp.c:993
msgid "# replies dropped due to insufficient cover traffic"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:1030
+#: src/fs/gnunet-service-fs_cp.c:1041
msgid "# P2P searches destroyed due to ultimate reply"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:1098
+#: src/fs/gnunet-service-fs_cp.c:1109
msgid "# requests done for free (low load)"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:1123
+#: src/fs/gnunet-service-fs_cp.c:1134
msgid "# request dropped, priority insufficient"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:1133
+#: src/fs/gnunet-service-fs_cp.c:1144
msgid "# requests done for a price (normal load)"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:1210
+#: src/fs/gnunet-service-fs_cp.c:1221
msgid "# GET requests received (from other peers)"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:1245
+#: src/fs/gnunet-service-fs_cp.c:1256
msgid "# requests dropped due to initiator not being connected"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:1266
+#: src/fs/gnunet-service-fs_cp.c:1277
msgid "# requests dropped due to missing reverse route"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:1277
+#: src/fs/gnunet-service-fs_cp.c:1288
#, fuzzy
msgid "# requests dropped due to full reply queue"
msgstr "Nätverksannonsering avstängd i konfigurationen!\n"
-#: src/fs/gnunet-service-fs_cp.c:1329
+#: src/fs/gnunet-service-fs_cp.c:1340
msgid "# requests dropped due TTL underflow"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:1353
+#: src/fs/gnunet-service-fs_cp.c:1365
msgid "# requests dropped due to higher-TTL request"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:1382
+#: src/fs/gnunet-service-fs_cp.c:1402
#, fuzzy
msgid "# P2P query messages received and processed"
msgstr "# krypterade PONG-meddelanden mottagna"
-#: src/fs/gnunet-service-fs_cp.c:1821
+#: src/fs/gnunet-service-fs_cp.c:1841
#, fuzzy
msgid "# migration stop messages sent"
msgstr "# krypterade PONG-meddelanden mottagna"
@@ -4232,7 +4248,7 @@
msgid "GNUnet DNS-to-GNS proxy (a DNS server)"
msgstr ""
-#: src/gns/gnunet-gns.c:215
+#: src/gns/gnunet-gns.c:215 src/gns/plugin_rest_gns.c:334
#, c-format
msgid "Invalid typename specified, assuming `ANY'\n"
msgstr ""
@@ -4248,6 +4264,7 @@
msgstr ""
#: src/gns/gnunet-gns.c:353 src/gns/gnunet-gns-helper-service-w32.c:798
+#: src/gns/plugin_rest_gns.c:459
#, c-format
msgid ""
"Ego for `gns-master' not found, cannot perform lookup. Did you run gnunet-"
@@ -4389,7 +4406,7 @@
msgid "Failed to start HTTPS server for `%s'\n"
msgstr "Misslyckades att starta samling.\n"
-#: src/gns/gnunet-gns-proxy.c:2225
+#: src/gns/gnunet-gns-proxy.c:2225 src/rest/gnunet-rest-server.c:529
#, fuzzy
msgid "Failed to pass client to MHD\n"
msgstr "Misslyckades att ansluta till gnunetd.\n"
@@ -4493,21 +4510,21 @@
msgid "GNS lookup resulted in DNS name that is too long (`%s')\n"
msgstr ""
-#: src/gns/gnunet-service-gns_resolver.c:1886
+#: src/gns/gnunet-service-gns_resolver.c:1891
msgid "GNS lookup recursion failed (no delegation record found)\n"
msgstr ""
-#: src/gns/gnunet-service-gns_resolver.c:1910
+#: src/gns/gnunet-service-gns_resolver.c:1915
#, fuzzy, c-format
msgid "Failed to cache GNS resolution: %s\n"
msgstr "Misslyckades att skicka HTTP-begäran till värd \"%s\": %s\n"
-#: src/gns/gnunet-service-gns_resolver.c:2192
+#: src/gns/gnunet-service-gns_resolver.c:2197
#, c-format
msgid "Zone %s was revoked, resolution fails\n"
msgstr ""
-#: src/gns/gnunet-service-gns_resolver.c:2341
+#: src/gns/gnunet-service-gns_resolver.c:2346
#, c-format
msgid "Hostname `%s' is not well-formed, resolution fails\n"
msgstr ""
@@ -4537,6 +4554,15 @@
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:422
+msgid "Ego for not found, cannot perform lookup.\n"
+msgstr ""
+
+#: src/gns/plugin_rest_gns.c:652
+#, fuzzy
+msgid "GNS REST API initialized\n"
+msgstr " Anslutning misslyckades\n"
+
#: src/gnsrecord/plugin_gnsrecord_dns.c:291
#, fuzzy, c-format
msgid "Unable to parse IPv4 address `%s'\n"
@@ -5059,6 +5085,11 @@
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:803
+#, fuzzy
+msgid "Identity REST API initialized\n"
+msgstr " Anslutning misslyckades\n"
+
#: src/mysql/mysql.c:174
#, c-format
msgid "Trying to use file `%s' for MySQL configuration.\n"
@@ -5084,9 +5115,9 @@
msgid "You must specify which zone should be accessed\n"
msgstr "anger vilken TRANSPORT som ska testas"
-#: src/namecache/gnunet-namecache.c:195 src/namestore/gnunet-namestore.c:844
+#: src/namecache/gnunet-namecache.c:195
#, fuzzy, c-format
-msgid "Invalid public key for reverse lookup `%s'\n"
+msgid "Invalid public key for zone `%s'\n"
msgstr "Ogiltigt argument: \"%s\"\n"
#: src/namecache/gnunet-namecache.c:203
@@ -5126,6 +5157,7 @@
"Fel vid uppladdning av fil: %s\n"
#: src/namestore/gnunet-namestore.c:332
+#: src/namestore/plugin_rest_namestore.c:505
#, fuzzy, c-format
msgid "Deleting record failed, record does not exist%s%s\n"
msgstr ""
@@ -5133,6 +5165,7 @@
"Fel vid uppladdning av fil: %s\n"
#: src/namestore/gnunet-namestore.c:339
+#: src/namestore/plugin_rest_namestore.c:514
#, fuzzy, c-format
msgid "Deleting record failed%s%s\n"
msgstr ""
@@ -5152,6 +5185,7 @@
msgstr ""
#: src/namestore/gnunet-namestore.c:628
+#: src/namestore/plugin_rest_namestore.c:538
#, c-format
msgid "There are no records under label `%s' that could be deleted.\n"
msgstr ""
@@ -5169,6 +5203,7 @@
#: src/namestore/gnunet-namestore.c:719
#: src/namestore/gnunet-namestore-fcfsd.c:984
+#: src/namestore/plugin_rest_namestore.c:821
#, fuzzy
msgid "Failed to connect to namestore\n"
msgstr "Misslyckades att ansluta till gnunetd.\n"
@@ -5186,11 +5221,14 @@
msgstr ""
#: src/namestore/gnunet-namestore.c:745
+#: src/namestore/plugin_rest_namestore.c:608
#, fuzzy, c-format
msgid "Unsupported type `%s'\n"
msgstr "Kommando \"%s\" stöds ej. Avbryter.\n"
#: src/namestore/gnunet-namestore.c:765
+#: src/namestore/plugin_rest_namestore.c:626
+#: src/namestore/plugin_rest_namestore.c:666
#, fuzzy, c-format
msgid "Value `%s' invalid for record type `%s'\n"
msgstr "%s: symbolvärde \"%s\" ogiltigt för %s\n"
@@ -5204,6 +5242,11 @@
msgid "del"
msgstr ""
+#: src/namestore/gnunet-namestore.c:844
+#, fuzzy, c-format
+msgid "Invalid public key for reverse lookup `%s'\n"
+msgstr "Ogiltigt argument: \"%s\"\n"
+
#: src/namestore/gnunet-namestore.c:868
#: src/peerinfo-tool/gnunet-peerinfo.c:817
#, fuzzy, c-format
@@ -5216,21 +5259,25 @@
msgstr "Ogiltiga argument: "
#: src/namestore/gnunet-namestore.c:943
+#: src/namestore/plugin_rest_namestore.c:851
#, fuzzy, c-format
msgid "Ego `%s' not known to identity service\n"
msgstr "\"%s\": okänd tjänst: %s\n"
#: src/namestore/gnunet-namestore.c:970
+#: src/namestore/plugin_rest_namestore.c:878
#, fuzzy, c-format
msgid "No default ego configured in identity service\n"
msgstr "\"%s\": okänd tjänst: %s\n"
#: src/namestore/gnunet-namestore.c:1006
+#: src/namestore/plugin_rest_namestore.c:917
#, fuzzy, c-format
msgid "Identity service is not running\n"
msgstr "\"%s\" är inte en fil.\n"
#: src/namestore/gnunet-namestore.c:1018
+#: src/namestore/plugin_rest_namestore.c:946
#, fuzzy, c-format
msgid "Cannot connect to identity service\n"
msgstr "Kunde inte ansluta till gnunetd.\n"
@@ -5363,6 +5410,11 @@
msgid "Namestore failed to store record\n"
msgstr ""
+#: src/namestore/plugin_rest_namestore.c:1023
+#, fuzzy
+msgid "Namestore REST API initialized\n"
+msgstr " Anslutning misslyckades\n"
+
#: src/nat/gnunet-nat-server.c:279
#, c-format
msgid "Please pass valid port number as the first argument! (got `%s')\n"
@@ -5615,7 +5667,7 @@
msgstr "Kan inte tillgå tjänsten"
#: src/nse/gnunet-service-nse.c:1537
-#: src/revocation/gnunet-service-revocation.c:815 src/util/gnunet-scrypt.c:260
+#: src/revocation/gnunet-service-revocation.c:827 src/util/gnunet-scrypt.c:260
msgid "Value is too large.\n"
msgstr ""
@@ -6155,6 +6207,15 @@
msgid "Regex `%s' is too long!\n"
msgstr "\"%s\" är inte en fil.\n"
+#: src/rest/gnunet-rest-server.c:766
+msgid "listen on specified port (default: 7776)"
+msgstr ""
+
+#: src/rest/gnunet-rest-server.c:783
+#, fuzzy
+msgid "GNUnet REST server"
+msgstr "Spåra GNUnets nätverkstopologi."
+
#: src/revocation/gnunet-revocation.c:126
#, fuzzy, c-format
msgid "Key `%s' is valid\n"
@@ -6285,11 +6346,11 @@
msgstr "# klartext PONG-meddelanden mottagna"
#: src/revocation/gnunet-service-revocation.c:493
-#: src/revocation/gnunet-service-revocation.c:747
+#: src/revocation/gnunet-service-revocation.c:759
msgid "SET service crashed, terminating revocation service\n"
msgstr ""
-#: src/revocation/gnunet-service-revocation.c:839
+#: src/revocation/gnunet-service-revocation.c:851
#, fuzzy
msgid "Could not open revocation database file!"
msgstr "Kunde inte ansluta till gnunetd.\n"
@@ -8026,7 +8087,7 @@
msgstr ""
#: src/transport/plugin_transport_http_server.c:2825
-#: src/transport/plugin_transport_udp.c:3336
+#: src/transport/plugin_transport_udp.c:3335
msgid "Disabling IPv6 since it is not supported on this system!\n"
msgstr ""
@@ -8268,50 +8329,50 @@
msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n"
msgstr ""
-#: src/transport/plugin_transport_udp.c:3082
+#: src/transport/plugin_transport_udp.c:3081
#, c-format
msgid ""
"UDP could not transmit message to `%s': Network seems down, please check "
"your network configuration\n"
msgstr ""
-#: src/transport/plugin_transport_udp.c:3096
+#: src/transport/plugin_transport_udp.c:3095
msgid ""
"UDP 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_udp.c:3412
-#: src/transport/plugin_transport_udp.c:3511
+#: src/transport/plugin_transport_udp.c:3411
+#: src/transport/plugin_transport_udp.c:3510
#, fuzzy, c-format
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:3430
+#: src/transport/plugin_transport_udp.c:3429
msgid "Disabling IPv4 since it is not supported on this system!\n"
msgstr ""
-#: src/transport/plugin_transport_udp.c:3521
+#: src/transport/plugin_transport_udp.c:3520
#, fuzzy
msgid "Failed to open UDP sockets\n"
msgstr "Misslyckades att binda till UDP6-port %d.\n"
-#: src/transport/plugin_transport_udp.c:3592
-#: src/transport/plugin_transport_udp.c:3606
+#: src/transport/plugin_transport_udp.c:3591
+#: src/transport/plugin_transport_udp.c:3605
msgid "must be in [0,65535]"
msgstr ""
-#: src/transport/plugin_transport_udp.c:3638
+#: src/transport/plugin_transport_udp.c:3637
#, fuzzy
msgid "must be valid IPv4 address"
msgstr "\"%s\" är inte tillgänglig."
-#: src/transport/plugin_transport_udp.c:3665
+#: src/transport/plugin_transport_udp.c:3664
#, fuzzy
msgid "must be valid IPv6 address"
msgstr "\"%s\" är inte tillgänglig."
-#: src/transport/plugin_transport_udp.c:3731
+#: src/transport/plugin_transport_udp.c:3730
#, fuzzy
msgid "Failed to create UDP network sockets\n"
msgstr "Kunde inte skapa namnrymd \"%s\" (existerar?).\n"
@@ -8533,24 +8594,24 @@
msgid "Syntax error while deserializing in line %u\n"
msgstr "Syntaxfel i konfigurationsfil \"%s\" på rad %d.\n"
-#: src/util/configuration.c:1026
+#: src/util/configuration.c:1025
#, c-format
msgid ""
"Configuration value '%s' for '%s' in section '%s' is not in set of legal "
"choices\n"
msgstr ""
-#: src/util/configuration.c:1145
+#: src/util/configuration.c:1144
#, c-format
msgid "Recursive expansion suspected, aborting $-expansion for term `%s'\n"
msgstr ""
-#: src/util/configuration.c:1177
+#: src/util/configuration.c:1176
#, fuzzy, c-format
msgid "Missing closing `%s' in option `%s'\n"
msgstr "Konfigurationsfil \"%s\" skapad.\n"
-#: src/util/configuration.c:1251
+#: src/util/configuration.c:1250
#, c-format
msgid ""
"Failed to expand `%s' in `%s' as it is neither found in [PATHS] nor defined "
@@ -8574,52 +8635,52 @@
"%llu)\n"
msgstr ""
-#: src/util/crypto_ecc.c:731 src/util/crypto_ecc.c:769
-#: src/util/crypto_ecc.c:887 src/util/crypto_ecc.c:925
+#: src/util/crypto_ecc.c:733 src/util/crypto_ecc.c:771
+#: src/util/crypto_ecc.c:889 src/util/crypto_ecc.c:927
#, fuzzy, c-format
msgid "Could not acquire lock on file `%s': %s...\n"
msgstr "Kunde inte slå upp \"%s\": %s\n"
-#: src/util/crypto_ecc.c:736 src/util/crypto_ecc.c:892
+#: src/util/crypto_ecc.c:738 src/util/crypto_ecc.c:894
#, fuzzy
msgid "Creating a new private key. This may take a while.\n"
msgstr "Skapar ny värdnyckel (det här kan ta en stund).\n"
-#: src/util/crypto_ecc.c:773 src/util/crypto_ecc.c:929
+#: src/util/crypto_ecc.c:775 src/util/crypto_ecc.c:931
msgid "This may be ok if someone is currently generating a private key.\n"
msgstr ""
-#: src/util/crypto_ecc.c:803 src/util/crypto_ecc.c:959
+#: src/util/crypto_ecc.c:805 src/util/crypto_ecc.c:961
#, c-format
msgid ""
"When trying to read key file `%s' I found %u bytes but I need at least %u.\n"
msgstr ""
-#: src/util/crypto_ecc.c:807 src/util/crypto_ecc.c:963
+#: src/util/crypto_ecc.c:809 src/util/crypto_ecc.c:965
msgid "This may be ok if someone is currently generating a key.\n"
msgstr ""
-#: src/util/crypto_ecc.c:1045
+#: src/util/crypto_ecc.c:1047
#, fuzzy
msgid "Could not load peer's private key\n"
msgstr "Kunde inte tolka konfigurationsfil \"%s\".\n"
-#: src/util/crypto_ecc.c:1149
+#: src/util/crypto_ecc.c:1151
#, fuzzy, c-format
msgid "ECC signing failed at %s:%d: %s\n"
msgstr "\"%s\" misslyckades vid %s:%d med fel: \"%s\".\n"
-#: src/util/crypto_ecc.c:1199
+#: src/util/crypto_ecc.c:1201
#, fuzzy, c-format
msgid "EdDSA signing failed at %s:%d: %s\n"
msgstr "\"%s\" misslyckades vid %s:%d med fel: \"%s\".\n"
-#: src/util/crypto_ecc.c:1273
+#: src/util/crypto_ecc.c:1275
#, fuzzy, c-format
msgid "ECDSA signature verification failed at %s:%d: %s\n"
msgstr "\"%s\" misslyckades vid %s:%d med fel: \"%s\".\n"
-#: src/util/crypto_ecc.c:1330
+#: src/util/crypto_ecc.c:1332
#, fuzzy, c-format
msgid "EdDSA signature verification failed at %s:%d: %s\n"
msgstr "\"%s\" misslyckades vid %s:%d med fel: \"%s\".\n"
@@ -8629,17 +8690,17 @@
msgid "libgcrypt has not the expected version (version %s is required).\n"
msgstr "libgcrypt har inte den förväntande versionen (version %s krävs).\n"
-#: src/util/crypto_rsa.c:809
+#: src/util/crypto_rsa.c:825
#, fuzzy, c-format
msgid "RSA signature verification failed at %s:%d: %s\n"
msgstr "\"%s\" misslyckades vid %s:%d med fel: \"%s\".\n"
-#: src/util/disk.c:1218
+#: src/util/disk.c:1222
#, fuzzy, c-format
msgid "Expected `%s' to be a directory!\n"
msgstr "\"%s\" förväntade att \"%s\" skulle vara en katalog!\n"
-#: src/util/disk.c:1580 src/util/service.c:1328
+#: src/util/disk.c:1584 src/util/service.c:1328
#, fuzzy, c-format
msgid "Cannot obtain information about user `%s': %s\n"
msgstr "Kan inte öppna konfigurationsfil \"%s\".\n"
@@ -8704,7 +8765,7 @@
msgid "Use %s to get a list of options.\n"
msgstr "Använd --help för att få en lista på flaggor.\n"
-#: src/util/getopt_helpers.c:84
+#: src/util/getopt_helpers.c:90
#, c-format
msgid ""
"Arguments mandatory for long options are also mandatory for short options.\n"
@@ -8712,12 +8773,12 @@
"Argument som är obligatoriska för långa flaggor är också obligatoriska för "
"korta flaggor.\n"
-#: src/util/getopt_helpers.c:268 src/util/getopt_helpers.c:326
+#: src/util/getopt_helpers.c:274 src/util/getopt_helpers.c:332
#, c-format
msgid "You must pass a number to the `%s' option.\n"
msgstr "Du måste skicka med ett nummer till flaggan \"%s\".\n"
-#: src/util/getopt_helpers.c:298
+#: src/util/getopt_helpers.c:304
#, fuzzy, c-format
msgid "You must pass relative time to the `%s' option.\n"
msgstr "Du måste skicka med ett nummer till flaggan \"%s\".\n"
@@ -8962,22 +9023,22 @@
msgid "GetExitCodeProcess failed for binary %s (%d).\n"
msgstr ""
-#: src/util/plugin.c:87
+#: src/util/plugin.c:86
#, c-format
msgid "Initialization of plugin mechanism failed: %s!\n"
msgstr "Initiering av insticksmekanism misslyckades: %s!\n"
-#: src/util/plugin.c:148
+#: src/util/plugin.c:151
#, fuzzy, c-format
msgid "`%s' failed to resolve method '%s' with error: %s\n"
msgstr "\"%s\" misslyckades för fil \"%s\" vid %s:%d med fel: %s\n"
-#: src/util/plugin.c:223
+#: src/util/plugin.c:226
#, fuzzy, c-format
msgid "`%s' failed for library `%s' with error: %s\n"
msgstr "\"%s\" misslyckades vid %s:%d med fel: %s\n"
-#: src/util/plugin.c:382
+#: src/util/plugin.c:385
#, fuzzy
msgid "Could not determine plugin installation path.\n"
msgstr "Kunde inte fastställa min publika IPv6-adress.\n"
@@ -9627,10 +9688,6 @@
#~ msgstr "\"%s\" ansluten till \"%s\".\n"
#, fuzzy
-#~ msgid "CADET initialized\n"
-#~ msgstr " Anslutning misslyckades\n"
-
-#, fuzzy
#~ msgid "Reloading sensor definitions from directory `%s'\n"
#~ msgstr "Ladda ner filer från GNUnet."
Modified: gnunet/po/vi.po
===================================================================
--- gnunet/po/vi.po 2015-04-24 07:04:18 UTC (rev 35558)
+++ gnunet/po/vi.po 2015-04-27 11:12:21 UTC (rev 35559)
@@ -8,7 +8,7 @@
msgstr ""
"Project-Id-Version: gnunet 0.8.0a\n"
"Report-Msgid-Bugs-To: address@hidden"
-"POT-Creation-Date: 2015-03-14 18:00+0100\n"
+"POT-Creation-Date: 2015-04-27 13:05+0200\n"
"PO-Revision-Date: 2008-09-10 22:05+0930\n"
"Last-Translator: Clytie Siddall <address@hidden>\n"
"Language-Team: Vietnamese <address@hidden>\n"
@@ -503,17 +503,17 @@
msgid "Could not connect master [%u] and slave [%u]\n"
msgstr "Không thể kết nối tới %s:%u: %s\n"
-#: src/ats-tests/ats-testing.c:490 src/ats-tests/ats-testing.c:662
+#: src/ats-tests/ats-testing.c:490 src/ats-tests/ats-testing.c:634
#, fuzzy
msgid "Initialization failed, shutdown\n"
msgstr "Lỗi sơ khởi cơ chế phần bổ sung: %s\n"
-#: src/ats-tests/ats-testing-log.c:846
+#: src/ats-tests/ats-testing-log.c:834
#, fuzzy
msgid "Stop logging\n"
msgstr "Theo dõi"
-#: src/ats-tests/ats-testing-log.c:897
+#: src/ats-tests/ats-testing-log.c:885
#, fuzzy, c-format
msgid "Start logging `%s'\n"
msgstr "Đang bắt đầu tài về « %s »\n"
@@ -561,6 +561,7 @@
msgstr ""
#: src/ats-tool/gnunet-ats.c:708 src/namestore/gnunet-namestore.c:700
+#: src/namestore/plugin_rest_namestore.c:812
#: src/transport/gnunet-transport.c:1890
#: src/transport/gnunet-transport-profiler.c:531
#, fuzzy, c-format
@@ -1442,30 +1443,30 @@
msgid "# PAYLOAD dropped (out of order)"
msgstr "# các byte loại bỏ bởi UDP (đi ra)"
-#: src/core/gnunet-service-core_neighbours.c:168
+#: src/core/gnunet-service-core_neighbours.c:177
#, fuzzy
msgid "# sessions terminated by transport disconnect"
msgstr "# Các quảng cáo đồng đẳng bị hủy do trọng tải"
-#: src/core/gnunet-service-core_neighbours.c:184
-#: src/core/gnunet-service-core_neighbours.c:342
+#: src/core/gnunet-service-core_neighbours.c:193
+#: src/core/gnunet-service-core_neighbours.c:355
msgid "# neighbour entries allocated"
msgstr ""
-#: src/core/gnunet-service-core_neighbours.c:252
+#: src/core/gnunet-service-core_neighbours.c:264
msgid "# encrypted bytes given to transport"
msgstr ""
-#: src/core/gnunet-service-core_neighbours.c:425
+#: src/core/gnunet-service-core_neighbours.c:438
#, c-format
msgid "Unsupported message of type %u (%u bytes) received from peer `%s'\n"
msgstr ""
-#: src/core/gnunet-service-core_sessions.c:245
-#: src/core/gnunet-service-core_sessions.c:331
+#: src/core/gnunet-service-core_sessions.c:252
+#: src/core/gnunet-service-core_sessions.c:338
#: src/dht/gnunet-service-dht_neighbours.c:661
#: src/dht/gnunet-service-dht_neighbours.c:726
-#: src/fs/gnunet-service-fs_cp.c:645 src/fs/gnunet-service-fs_cp.c:1627
+#: src/fs/gnunet-service-fs_cp.c:654 src/fs/gnunet-service-fs_cp.c:1647
#: src/topology/gnunet-daemon-topology.c:734
#: src/topology/gnunet-daemon-topology.c:835
#: src/transport/gnunet-service-transport_neighbours.c:755
@@ -1474,22 +1475,22 @@
msgid "# peers connected"
msgstr "# của các đồng đẳng đã kết nối"
-#: src/core/gnunet-service-core_sessions.c:278
+#: src/core/gnunet-service-core_sessions.c:285
#, fuzzy
msgid "# type map refreshes sent"
msgstr "# tổng số yêu cầu lỗ hổng được gửi"
-#: src/core/gnunet-service-core_sessions.c:397
+#: src/core/gnunet-service-core_sessions.c:404
#, fuzzy
msgid "# outdated typemap confirmations received"
msgstr "Lỗi lưu cấu hình."
-#: src/core/gnunet-service-core_sessions.c:408
+#: src/core/gnunet-service-core_sessions.c:415
#, fuzzy
msgid "# valid typemap confirmations received"
msgstr "Lỗi lưu cấu hình."
-#: src/core/gnunet-service-core_sessions.c:546
+#: src/core/gnunet-service-core_sessions.c:554
msgid "# messages discarded (expired prior to transmission)"
msgstr ""
@@ -1504,7 +1505,7 @@
msgstr ""
#: src/datacache/datacache.c:115 src/datacache/datacache.c:266
-#: src/datastore/gnunet-service-datastore.c:855
+#: src/datastore/gnunet-service-datastore.c:841
#, fuzzy
msgid "# bytes stored"
msgstr "# các byte trong kho dữ liệu"
@@ -1515,8 +1516,8 @@
msgstr "# các byte trong kho dữ liệu"
#: src/datacache/datacache.c:143 src/datacache/datacache.c:150
-#: src/datastore/gnunet-service-datastore.c:1557
-#: src/datastore/gnunet-service-datastore.c:1568
+#: src/datastore/gnunet-service-datastore.c:1598
+#: src/datastore/gnunet-service-datastore.c:1609
#, c-format
msgid "No `%s' specified for `%s' in configuration!\n"
msgstr ""
@@ -1551,8 +1552,8 @@
#: src/datacache/plugin_datacache_sqlite.c:69
#: src/datacache/plugin_datacache_sqlite.c:72
-#: src/datastore/plugin_datastore_mysql.c:809
-#: src/datastore/plugin_datastore_mysql.c:823
+#: src/datastore/plugin_datastore_mysql.c:818
+#: src/datastore/plugin_datastore_mysql.c:834
#: src/datastore/plugin_datastore_sqlite.c:57 src/mysql/mysql.c:41
#: src/mysql/mysql.c:48 src/mysql/mysql.c:522 src/mysql/mysql.c:531
#: src/mysql/mysql.c:591 src/mysql/mysql.c:607
@@ -1761,8 +1762,8 @@
#: src/datastore/gnunet-service-datastore.c:712
#: src/datastore/gnunet-service-datastore.c:767
-#: src/datastore/gnunet-service-datastore.c:982
-#: src/datastore/gnunet-service-datastore.c:1529
+#: src/datastore/gnunet-service-datastore.c:999
+#: src/datastore/gnunet-service-datastore.c:1570
msgid "# reserved"
msgstr ""
@@ -1770,138 +1771,153 @@
msgid "Could not find matching reservation"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:867
+#: src/datastore/gnunet-service-datastore.c:853
#, c-format
msgid "Need %llu bytes more space (%llu allowed, using %llu)\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1029
+#: src/datastore/gnunet-service-datastore.c:1046
#, fuzzy
msgid "# GET requests received"
msgstr "# các yêu cầu get (lấy) dht được nhận"
-#: src/datastore/gnunet-service-datastore.c:1041
+#: src/datastore/gnunet-service-datastore.c:1058
#, fuzzy
msgid "# requests filtered by bloomfilter"
msgstr "# các yêu cầu được lọc theo bộ lọc bloom"
-#: src/datastore/gnunet-service-datastore.c:1069
+#: src/datastore/gnunet-service-datastore.c:1094
#, fuzzy
msgid "# UPDATE requests received"
msgstr "# các yêu cầu get (lấy) dht được nhận"
-#: src/datastore/gnunet-service-datastore.c:1099
+#: src/datastore/gnunet-service-datastore.c:1122
#, fuzzy
msgid "# GET REPLICATION requests received"
msgstr "# các yêu cầu get (lấy) dht được nhận"
-#: src/datastore/gnunet-service-datastore.c:1132
+#: src/datastore/gnunet-service-datastore.c:1155
#, fuzzy
msgid "# GET ZERO ANONYMITY requests received"
msgstr "# các yêu cầu get (lấy) dht được nhận"
-#: src/datastore/gnunet-service-datastore.c:1157
+#: src/datastore/gnunet-service-datastore.c:1180
msgid "Content not found"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1165
+#: src/datastore/gnunet-service-datastore.c:1188
msgid "# bytes removed (explicit request)"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1197
+#: src/datastore/gnunet-service-datastore.c:1220
#, fuzzy
msgid "# REMOVE requests received"
msgstr "# các yêu cầu get (lấy) dht được nhận"
-#: src/datastore/gnunet-service-datastore.c:1241
+#: src/datastore/gnunet-service-datastore.c:1264
#, c-format
msgid ""
"Datastore payload must have been inaccurate (%lld < %lld). Recomputing it.\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1246
+#: src/datastore/gnunet-service-datastore.c:1269
#, c-format
msgid "New payload: %lld\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1299
+#: src/datastore/gnunet-service-datastore.c:1322
#, c-format
msgid "Loading `%s' datastore plugin\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1310
+#: src/datastore/gnunet-service-datastore.c:1333
#, fuzzy, c-format
msgid "Failed to load datastore plugin for `%s'\n"
msgstr "Không thể nạp phần bổ sung truyền tải « %s »\n"
-#: src/datastore/gnunet-service-datastore.c:1412
+#: src/datastore/gnunet-service-datastore.c:1402
+#: src/datastore/gnunet-service-datastore.c:1463
+msgid "Bloomfilter construction complete.\n"
+msgstr ""
+
+#: src/datastore/gnunet-service-datastore.c:1450
msgid "Rebuilding bloomfilter. Please be patient.\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1419
+#: src/datastore/gnunet-service-datastore.c:1460
msgid "Plugin does not support get_keys function. Please fix!\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1422
-msgid "Bloomfilter construction complete.\n"
-msgstr ""
-
-#: src/datastore/gnunet-service-datastore.c:1562
+#: src/datastore/gnunet-service-datastore.c:1603
#, fuzzy, c-format
msgid "# bytes used in file-sharing datastore `%s'"
msgstr "# các byte được phép trong kho dữ liệu"
-#: src/datastore/gnunet-service-datastore.c:1573
+#: src/datastore/gnunet-service-datastore.c:1614
msgid "# quota"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1575
+#: src/datastore/gnunet-service-datastore.c:1616
msgid "# cache size"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1588
+#: src/datastore/gnunet-service-datastore.c:1629
#, c-format
msgid "Could not use specified filename `%s' for bloomfilter.\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1606
-#: src/datastore/gnunet-service-datastore.c:1622
+#: src/datastore/gnunet-service-datastore.c:1647
+#: src/datastore/gnunet-service-datastore.c:1663
#, fuzzy, c-format
msgid "Failed to remove bogus bloomfilter file `%s'\n"
msgstr "Không thể lưu tập tin cấu hình « %s »:"
-#: src/datastore/gnunet-service-datastore.c:1652
+#: src/datastore/gnunet-service-datastore.c:1693
#, fuzzy
msgid "Failed to initialize bloomfilter.\n"
msgstr "Lỗi sơ khởi dịch vụ « %s ».\n"
-#: src/datastore/plugin_datastore_heap.c:821
+#: src/datastore/plugin_datastore_heap.c:826
#, fuzzy
msgid "Heap database running\n"
msgstr "kho dữ liệu sqlite"
-#: src/datastore/plugin_datastore_mysql.c:786
+#: src/datastore/plugin_datastore_mysql.c:309
+#: src/datastore/plugin_datastore_sqlite.c:499
+#, fuzzy
+msgid "Data too large"
+msgstr "số lần lặp lại"
+
+#: src/datastore/plugin_datastore_mysql.c:328
+msgid "MySQL statement run failure"
+msgstr ""
+
+#: src/datastore/plugin_datastore_mysql.c:793
#, fuzzy, c-format
msgid "Failed to prepare statement `%s'\n"
msgstr "Lỗi đọc danh sách bạn bè từ « %s »\n"
-#: src/datastore/plugin_datastore_mysql.c:794
+#: src/datastore/plugin_datastore_mysql.c:802
#, fuzzy, c-format
msgid "`%s' for `%s' failed at %s:%d with error: %s\n"
msgstr "« %s » bị lỗi tại %s:%d với lỗi: %s\n"
-#: src/datastore/plugin_datastore_mysql.c:1025
+#: src/datastore/plugin_datastore_mysql.c:1036
msgid "Mysql database running\n"
msgstr ""
-#: src/datastore/plugin_datastore_postgres.c:837
+#: src/datastore/plugin_datastore_postgres.c:331
+msgid "Postgress exec failure"
+msgstr ""
+
+#: src/datastore/plugin_datastore_postgres.c:846
#, fuzzy
msgid "Failed to drop table from database.\n"
msgstr ""
"\n"
"Không nhận được đáp ứng từ gnunetd.\n"
-#: src/datastore/plugin_datastore_postgres.c:873
+#: src/datastore/plugin_datastore_postgres.c:882
#: src/namecache/plugin_namecache_postgres.c:414
#: src/namestore/plugin_namestore_postgres.c:569
msgid "Postgres database running\n"
@@ -1924,30 +1940,30 @@
msgid "Unable to initialize SQLite: %s.\n"
msgstr "Không thể sơ khởi SQLite: %s.\n"
-#: src/datastore/plugin_datastore_sqlite.c:661
+#: src/datastore/plugin_datastore_sqlite.c:680
#, fuzzy
msgid "Invalid data in database. Trying to fix (by deletion).\n"
msgstr "Dữ liệu sai trong %s. Đang thử sửa chữa (bằng cách xoá).\n"
-#: src/datastore/plugin_datastore_sqlite.c:1156
+#: src/datastore/plugin_datastore_sqlite.c:1177
msgid "sqlite version to old to determine size, assuming zero\n"
msgstr ""
-#: src/datastore/plugin_datastore_sqlite.c:1176
+#: src/datastore/plugin_datastore_sqlite.c:1197
#, c-format
msgid ""
"Using sqlite page utilization to estimate payload (%llu pages of size %llu "
"bytes)\n"
msgstr ""
-#: src/datastore/plugin_datastore_sqlite.c:1216
+#: src/datastore/plugin_datastore_sqlite.c:1237
#: src/namecache/plugin_namecache_sqlite.c:580
#: src/namestore/plugin_namestore_sqlite.c:716
#, fuzzy
msgid "Sqlite database running\n"
msgstr "kho dữ liệu sqlite"
-#: src/datastore/plugin_datastore_template.c:259
+#: src/datastore/plugin_datastore_template.c:260
msgid "Template database running\n"
msgstr ""
@@ -2581,54 +2597,54 @@
msgid "Change DNS replies to point elsewhere."
msgstr ""
-#: src/dns/gnunet-service-dns.c:456
+#: src/dns/gnunet-service-dns.c:459
msgid "# DNS requests answered via TUN interface"
msgstr ""
-#: src/dns/gnunet-service-dns.c:603
+#: src/dns/gnunet-service-dns.c:606
msgid "# DNS exit failed (failed to open socket)"
msgstr ""
-#: src/dns/gnunet-service-dns.c:714
+#: src/dns/gnunet-service-dns.c:717
msgid "# External DNS response discarded (no matching request)"
msgstr ""
-#: src/dns/gnunet-service-dns.c:792
+#: src/dns/gnunet-service-dns.c:795
msgid "# Client response discarded (no matching request)"
msgstr ""
-#: src/dns/gnunet-service-dns.c:907
+#: src/dns/gnunet-service-dns.c:910
msgid "Received malformed IPv4-UDP packet on TUN interface.\n"
msgstr ""
-#: src/dns/gnunet-service-dns.c:923
+#: src/dns/gnunet-service-dns.c:926
msgid "Received malformed IPv6-UDP packet on TUN interface.\n"
msgstr ""
-#: src/dns/gnunet-service-dns.c:932
+#: src/dns/gnunet-service-dns.c:935
#, c-format
msgid "Got non-IP packet with %u bytes and protocol %u from TUN\n"
msgstr ""
-#: src/dns/gnunet-service-dns.c:942
+#: src/dns/gnunet-service-dns.c:945
msgid "# Non-DNS UDP packet received via TUN interface"
msgstr ""
-#: src/dns/gnunet-service-dns.c:1009
+#: src/dns/gnunet-service-dns.c:1012
#, fuzzy
msgid "# DNS requests received via TUN interface"
msgstr "# các đáp ứng lỗ hổng được gửi cho trình/máy khách"
-#: src/dns/gnunet-service-dns.c:1049
-#, c-format
-msgid "`%s' must be installed SUID, refusing to run\n"
-msgstr ""
-
-#: src/dns/gnunet-service-dns.c:1069 src/exit/gnunet-daemon-exit.c:3594
+#: src/dns/gnunet-service-dns.c:1064 src/exit/gnunet-daemon-exit.c:3594
#, fuzzy
msgid "need a valid IPv4 or IPv6 address\n"
msgstr "Mức ưu tiên tiến trình không hợp lê « %s ».\n"
+#: src/dns/gnunet-service-dns.c:1082
+#, c-format
+msgid "`%s' must be installed SUID, will not run DNS interceptor\n"
+msgstr ""
+
#: src/dv/gnunet-dv.c:169
msgid "verbose output"
msgstr ""
@@ -2865,58 +2881,58 @@
msgid "Daemon to run to provide an IP exit node for the VPN"
msgstr ""
-#: src/fragmentation/defragmentation.c:271
+#: src/fragmentation/defragmentation.c:277
msgid "# acknowledgements sent for fragment"
msgstr ""
-#: src/fragmentation/defragmentation.c:463
+#: src/fragmentation/defragmentation.c:470
#: src/transport/plugin_transport_wlan.c:1515
#, fuzzy
msgid "# fragments received"
msgstr "# các mảnh bị loại bỏ"
-#: src/fragmentation/defragmentation.c:533
+#: src/fragmentation/defragmentation.c:540
#, fuzzy
msgid "# duplicate fragments received"
msgstr "# các kết quả dht được nhận"
-#: src/fragmentation/defragmentation.c:549
+#: src/fragmentation/defragmentation.c:558
msgid "# messages defragmented"
msgstr "# các thông báo được chắp liền"
-#: src/fragmentation/fragmentation.c:234
+#: src/fragmentation/fragmentation.c:235
#, fuzzy
msgid "# fragments transmitted"
msgstr "# Các tự quảng cáo được truyền"
-#: src/fragmentation/fragmentation.c:237
+#: src/fragmentation/fragmentation.c:240
#, fuzzy
msgid "# fragments retransmitted"
msgstr "# Các tự quảng cáo được truyền"
-#: src/fragmentation/fragmentation.c:263
+#: src/fragmentation/fragmentation.c:269
#, fuzzy
msgid "# fragments wrap arounds"
msgstr "# Các tự quảng cáo được truyền"
-#: src/fragmentation/fragmentation.c:307
+#: src/fragmentation/fragmentation.c:315
msgid "# messages fragmented"
msgstr "# các thông báo bị tế phân"
-#: src/fragmentation/fragmentation.c:310
+#: src/fragmentation/fragmentation.c:321
msgid "# total size of fragmented messages"
msgstr ""
-#: src/fragmentation/fragmentation.c:431
+#: src/fragmentation/fragmentation.c:444
#, fuzzy
msgid "# fragment acknowledgements received"
msgstr "# Các quảng cáo đồng đẳng được nhận"
-#: src/fragmentation/fragmentation.c:437
+#: src/fragmentation/fragmentation.c:451
msgid "# bits removed from fragmentation ACKs"
msgstr ""
-#: src/fragmentation/fragmentation.c:461
+#: src/fragmentation/fragmentation.c:475
#, fuzzy
msgid "# fragmentation transmissions completed"
msgstr "# các sự truyền PONG bị lỗi"
@@ -3186,59 +3202,59 @@
msgid "Got result with unknown block type `%d', ignoring"
msgstr ""
-#: src/fs/fs_unindex.c:59
+#: src/fs/fs_unindex.c:63
msgid "Failed to find given position in file"
msgstr ""
-#: src/fs/fs_unindex.c:64
+#: src/fs/fs_unindex.c:68
#, fuzzy
msgid "Failed to read file"
msgstr "Lỗi gửi tin nhẳn.\n"
-#: src/fs/fs_unindex.c:234
+#: src/fs/fs_unindex.c:245
msgid "Unexpected time for a response from `fs' service."
msgstr ""
-#: src/fs/fs_unindex.c:242
+#: src/fs/fs_unindex.c:253
msgid "Timeout waiting for `fs' service."
msgstr ""
-#: src/fs/fs_unindex.c:250
+#: src/fs/fs_unindex.c:261
#, fuzzy
msgid "Invalid response from `fs' service."
msgstr "Đối số không hợp lệ cho « %s ».\n"
-#: src/fs/fs_unindex.c:291
+#: src/fs/fs_unindex.c:304
#, fuzzy
msgid "Failed to connect to FS service for unindexing."
msgstr "Không kết nối được đến trình nền gnunetd."
-#: src/fs/fs_unindex.c:347 src/fs/fs_unindex.c:359
+#: src/fs/fs_unindex.c:360 src/fs/fs_unindex.c:372
#, fuzzy
msgid "Failed to get KSKs from directory scan."
msgstr "Lỗi truy cập đến thư mục nhà GNUnet « %s »\n"
-#: src/fs/fs_unindex.c:355
+#: src/fs/fs_unindex.c:368
#, fuzzy, c-format
msgid "Internal error scanning `%s'.\n"
msgstr "=\tLỗi đọc thư mục.\n"
-#: src/fs/fs_unindex.c:414
+#: src/fs/fs_unindex.c:427
#, fuzzy, c-format
msgid "Failed to remove UBlock: %s\n"
msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n"
-#: src/fs/fs_unindex.c:562 src/fs/fs_unindex.c:626
+#: src/fs/fs_unindex.c:590 src/fs/fs_unindex.c:656
#, fuzzy
msgid "Failed to connect to `datastore' service."
msgstr "Lỗi sơ khởi dịch vụ « %s ».\n"
-#: src/fs/fs_unindex.c:639
+#: src/fs/fs_unindex.c:669
#, fuzzy
msgid "Failed to open file for unindexing."
msgstr "Không kết nối được đến trình nền gnunetd."
-#: src/fs/fs_unindex.c:673
+#: src/fs/fs_unindex.c:708
#, fuzzy
msgid "Failed to compute hash of file."
msgstr "Không kết nối được đến trình nền gnunetd."
@@ -3837,101 +3853,101 @@
msgid "# cadet connections active"
msgstr "# các kết nối dht"
-#: src/fs/gnunet-service-fs_cp.c:726
+#: src/fs/gnunet-service-fs_cp.c:735
#, fuzzy
msgid "# migration stop messages received"
msgstr "# các thông báo phát hiện dht được nhận"
-#: src/fs/gnunet-service-fs_cp.c:730
+#: src/fs/gnunet-service-fs_cp.c:739
#, c-format
msgid "Migration of content to peer `%s' blocked for %s\n"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:768
+#: src/fs/gnunet-service-fs_cp.c:776
#, fuzzy
msgid "# replies transmitted to other peers"
msgstr "# các byte kiểu %d được gửi "
-#: src/fs/gnunet-service-fs_cp.c:774
+#: src/fs/gnunet-service-fs_cp.c:784
#, fuzzy
msgid "# replies dropped"
msgstr "# các đáp ứng dht được định tuyến"
-#: src/fs/gnunet-service-fs_cp.c:799 src/fs/gnunet-service-fs_cp.c:1384
+#: src/fs/gnunet-service-fs_cp.c:810 src/fs/gnunet-service-fs_cp.c:1404
msgid "# P2P searches active"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:904
+#: src/fs/gnunet-service-fs_cp.c:915
msgid "# artificial delays introduced (ms)"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:960
+#: src/fs/gnunet-service-fs_cp.c:971
#, fuzzy
msgid "# replies dropped due to type mismatch"
msgstr "# các yêu cầu lỗ hổng bị bỏ do trọng tải"
-#: src/fs/gnunet-service-fs_cp.c:968
+#: src/fs/gnunet-service-fs_cp.c:979
#, fuzzy
msgid "# replies received for other peers"
msgstr "# các byte kiểu %d được nhận"
-#: src/fs/gnunet-service-fs_cp.c:982
+#: src/fs/gnunet-service-fs_cp.c:993
msgid "# replies dropped due to insufficient cover traffic"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:1030
+#: src/fs/gnunet-service-fs_cp.c:1041
msgid "# P2P searches destroyed due to ultimate reply"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:1098
+#: src/fs/gnunet-service-fs_cp.c:1109
#, fuzzy
msgid "# requests done for free (low load)"
msgstr "# các yêu cầu lỗ hổng bị bỏ do trọng tải"
-#: src/fs/gnunet-service-fs_cp.c:1123
+#: src/fs/gnunet-service-fs_cp.c:1134
msgid "# request dropped, priority insufficient"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:1133
+#: src/fs/gnunet-service-fs_cp.c:1144
#, fuzzy
msgid "# requests done for a price (normal load)"
msgstr "# các yêu cầu lỗ hổng bị bỏ do trọng tải"
-#: src/fs/gnunet-service-fs_cp.c:1210
+#: src/fs/gnunet-service-fs_cp.c:1221
msgid "# GET requests received (from other peers)"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:1245
+#: src/fs/gnunet-service-fs_cp.c:1256
#, fuzzy
msgid "# requests dropped due to initiator not being connected"
msgstr "# các yêu cầu lỗ hổng bị bỏ do trọng tải"
-#: src/fs/gnunet-service-fs_cp.c:1266
+#: src/fs/gnunet-service-fs_cp.c:1277
#, fuzzy
msgid "# requests dropped due to missing reverse route"
msgstr "# các yêu cầu lỗ hổng bị bỏ do trọng tải"
-#: src/fs/gnunet-service-fs_cp.c:1277
+#: src/fs/gnunet-service-fs_cp.c:1288
#, fuzzy
msgid "# requests dropped due to full reply queue"
msgstr "# các yêu cầu lỗ hổng bị bỏ do trọng tải"
-#: src/fs/gnunet-service-fs_cp.c:1329
+#: src/fs/gnunet-service-fs_cp.c:1340
#, fuzzy
msgid "# requests dropped due TTL underflow"
msgstr "# các yêu cầu lỗ hổng bị bỏ do trọng tải"
-#: src/fs/gnunet-service-fs_cp.c:1353
+#: src/fs/gnunet-service-fs_cp.c:1365
#, fuzzy
msgid "# requests dropped due to higher-TTL request"
msgstr "# các yêu cầu lỗ hổng bị bỏ do trọng tải"
-#: src/fs/gnunet-service-fs_cp.c:1382
+#: src/fs/gnunet-service-fs_cp.c:1402
#, fuzzy
msgid "# P2P query messages received and processed"
msgstr "# các thông báo phát hiện dht được nhận"
-#: src/fs/gnunet-service-fs_cp.c:1821
+#: src/fs/gnunet-service-fs_cp.c:1841
#, fuzzy
msgid "# migration stop messages sent"
msgstr "# các thông báo phát hiện dht được nhận"
@@ -4280,7 +4296,7 @@
msgid "GNUnet DNS-to-GNS proxy (a DNS server)"
msgstr ""
-#: src/gns/gnunet-gns.c:215
+#: src/gns/gnunet-gns.c:215 src/gns/plugin_rest_gns.c:334
#, c-format
msgid "Invalid typename specified, assuming `ANY'\n"
msgstr ""
@@ -4296,6 +4312,7 @@
msgstr ""
#: src/gns/gnunet-gns.c:353 src/gns/gnunet-gns-helper-service-w32.c:798
+#: src/gns/plugin_rest_gns.c:459
#, c-format
msgid ""
"Ego for `gns-master' not found, cannot perform lookup. Did you run gnunet-"
@@ -4437,7 +4454,7 @@
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:2225
+#: src/gns/gnunet-gns-proxy.c:2225 src/rest/gnunet-rest-server.c:529
#, fuzzy
msgid "Failed to pass client to MHD\n"
msgstr "Lỗi kết nối đến gnunetd.\n"
@@ -4542,21 +4559,21 @@
msgid "GNS lookup resulted in DNS name that is too long (`%s')\n"
msgstr ""
-#: src/gns/gnunet-service-gns_resolver.c:1886
+#: src/gns/gnunet-service-gns_resolver.c:1891
msgid "GNS lookup recursion failed (no delegation record found)\n"
msgstr ""
-#: src/gns/gnunet-service-gns_resolver.c:1910
+#: src/gns/gnunet-service-gns_resolver.c:1915
#, fuzzy, c-format
msgid "Failed to cache GNS resolution: %s\n"
msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n"
-#: src/gns/gnunet-service-gns_resolver.c:2192
+#: src/gns/gnunet-service-gns_resolver.c:2197
#, c-format
msgid "Zone %s was revoked, resolution fails\n"
msgstr ""
-#: src/gns/gnunet-service-gns_resolver.c:2341
+#: src/gns/gnunet-service-gns_resolver.c:2346
#, c-format
msgid "Hostname `%s' is not well-formed, resolution fails\n"
msgstr ""
@@ -4586,6 +4603,15 @@
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:422
+msgid "Ego for not found, cannot perform lookup.\n"
+msgstr ""
+
+#: src/gns/plugin_rest_gns.c:652
+#, fuzzy
+msgid "GNS REST API initialized\n"
+msgstr "Lỗi sơ khởi lõi.\n"
+
#: src/gnsrecord/plugin_gnsrecord_dns.c:291
#, fuzzy, c-format
msgid "Unable to parse IPv4 address `%s'\n"
@@ -5120,6 +5146,11 @@
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:803
+#, fuzzy
+msgid "Identity REST API initialized\n"
+msgstr "Lỗi sơ khởi lõi.\n"
+
#: src/mysql/mysql.c:174
#, c-format
msgid "Trying to use file `%s' for MySQL configuration.\n"
@@ -5145,9 +5176,9 @@
msgid "You must specify which zone should be accessed\n"
msgstr "chỉ ra TRUYỀN_TẢI nào cần được thử nghiệm"
-#: src/namecache/gnunet-namecache.c:195 src/namestore/gnunet-namestore.c:844
+#: src/namecache/gnunet-namecache.c:195
#, fuzzy, c-format
-msgid "Invalid public key for reverse lookup `%s'\n"
+msgid "Invalid public key for zone `%s'\n"
msgstr "Đối số không hợp lệ cho « %s ».\n"
#: src/namecache/gnunet-namecache.c:203
@@ -5185,11 +5216,13 @@
msgstr "Gặp lỗi khi tải lên tập tin: %s\n"
#: src/namestore/gnunet-namestore.c:332
+#: src/namestore/plugin_rest_namestore.c:505
#, fuzzy, c-format
msgid "Deleting record failed, record does not exist%s%s\n"
msgstr "Gặp lỗi khi tải lên tập tin: %s\n"
#: src/namestore/gnunet-namestore.c:339
+#: src/namestore/plugin_rest_namestore.c:514
#, fuzzy, c-format
msgid "Deleting record failed%s%s\n"
msgstr "Gặp lỗi khi tải lên tập tin: %s\n"
@@ -5207,6 +5240,7 @@
msgstr ""
#: src/namestore/gnunet-namestore.c:628
+#: src/namestore/plugin_rest_namestore.c:538
#, c-format
msgid "There are no records under label `%s' that could be deleted.\n"
msgstr ""
@@ -5224,6 +5258,7 @@
#: src/namestore/gnunet-namestore.c:719
#: src/namestore/gnunet-namestore-fcfsd.c:984
+#: src/namestore/plugin_rest_namestore.c:821
#, fuzzy
msgid "Failed to connect to namestore\n"
msgstr "Không kết nối được đến trình nền gnunetd."
@@ -5241,11 +5276,14 @@
msgstr ""
#: src/namestore/gnunet-namestore.c:745
+#: src/namestore/plugin_rest_namestore.c:608
#, fuzzy, c-format
msgid "Unsupported type `%s'\n"
msgstr "Lệnh không được hỗ trợ « %s ». Đang hủy bỏ.\n"
#: src/namestore/gnunet-namestore.c:765
+#: src/namestore/plugin_rest_namestore.c:626
+#: src/namestore/plugin_rest_namestore.c:666
#, c-format
msgid "Value `%s' invalid for record type `%s'\n"
msgstr ""
@@ -5259,6 +5297,11 @@
msgid "del"
msgstr ""
+#: src/namestore/gnunet-namestore.c:844
+#, fuzzy, c-format
+msgid "Invalid public key for reverse lookup `%s'\n"
+msgstr "Đối số không hợp lệ cho « %s ».\n"
+
#: src/namestore/gnunet-namestore.c:868
#: src/peerinfo-tool/gnunet-peerinfo.c:817
#, fuzzy, c-format
@@ -5271,21 +5314,25 @@
msgstr "Dữ liệu nhập không hợp lệ.\n"
#: src/namestore/gnunet-namestore.c:943
+#: src/namestore/plugin_rest_namestore.c:851
#, c-format
msgid "Ego `%s' not known to identity service\n"
msgstr ""
#: src/namestore/gnunet-namestore.c:970
+#: src/namestore/plugin_rest_namestore.c:878
#, c-format
msgid "No default ego configured in identity service\n"
msgstr ""
#: src/namestore/gnunet-namestore.c:1006
+#: src/namestore/plugin_rest_namestore.c:917
#, fuzzy, c-format
msgid "Identity service is not running\n"
msgstr "« %s » không phải là một tập tin.\n"
#: src/namestore/gnunet-namestore.c:1018
+#: src/namestore/plugin_rest_namestore.c:946
#, fuzzy, c-format
msgid "Cannot connect to identity service\n"
msgstr "Không thể kết nối tới %s:%u: %s\n"
@@ -5417,6 +5464,11 @@
msgid "Namestore failed to store record\n"
msgstr ""
+#: src/namestore/plugin_rest_namestore.c:1023
+#, fuzzy
+msgid "Namestore REST API initialized\n"
+msgstr "Lỗi sơ khởi lõi.\n"
+
#: src/nat/gnunet-nat-server.c:279
#, c-format
msgid "Please pass valid port number as the first argument! (got `%s')\n"
@@ -5665,7 +5717,7 @@
msgstr "Không thể truy cập đến dịch vụ"
#: src/nse/gnunet-service-nse.c:1537
-#: src/revocation/gnunet-service-revocation.c:815 src/util/gnunet-scrypt.c:260
+#: src/revocation/gnunet-service-revocation.c:827 src/util/gnunet-scrypt.c:260
#, fuzzy
msgid "Value is too large.\n"
msgstr "Giá trị không nằm trong phạm vi được phép."
@@ -6214,6 +6266,15 @@
msgid "Regex `%s' is too long!\n"
msgstr "« %s » không phải là một tập tin.\n"
+#: src/rest/gnunet-rest-server.c:766
+msgid "listen on specified port (default: 7776)"
+msgstr ""
+
+#: src/rest/gnunet-rest-server.c:783
+#, fuzzy
+msgid "GNUnet REST server"
+msgstr "Bản ghi lỗi GNUnet"
+
#: src/revocation/gnunet-revocation.c:126
#, fuzzy, c-format
msgid "Key `%s' is valid\n"
@@ -6344,11 +6405,11 @@
msgstr "# các sự truyền PONG bị lỗi"
#: src/revocation/gnunet-service-revocation.c:493
-#: src/revocation/gnunet-service-revocation.c:747
+#: src/revocation/gnunet-service-revocation.c:759
msgid "SET service crashed, terminating revocation service\n"
msgstr ""
-#: src/revocation/gnunet-service-revocation.c:839
+#: src/revocation/gnunet-service-revocation.c:851
#, fuzzy
msgid "Could not open revocation database file!"
msgstr "« %s »: Không thể kết nối.\n"
@@ -8095,7 +8156,7 @@
msgstr ""
#: src/transport/plugin_transport_http_server.c:2825
-#: src/transport/plugin_transport_udp.c:3336
+#: src/transport/plugin_transport_udp.c:3335
msgid "Disabling IPv6 since it is not supported on this system!\n"
msgstr ""
@@ -8329,50 +8390,50 @@
msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n"
msgstr ""
-#: src/transport/plugin_transport_udp.c:3082
+#: src/transport/plugin_transport_udp.c:3081
#, c-format
msgid ""
"UDP could not transmit message to `%s': Network seems down, please check "
"your network configuration\n"
msgstr ""
-#: src/transport/plugin_transport_udp.c:3096
+#: src/transport/plugin_transport_udp.c:3095
msgid ""
"UDP 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_udp.c:3412
-#: src/transport/plugin_transport_udp.c:3511
+#: src/transport/plugin_transport_udp.c:3411
+#: src/transport/plugin_transport_udp.c:3510
#, fuzzy, c-format
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:3430
+#: src/transport/plugin_transport_udp.c:3429
msgid "Disabling IPv4 since it is not supported on this system!\n"
msgstr ""
-#: src/transport/plugin_transport_udp.c:3521
+#: src/transport/plugin_transport_udp.c:3520
#, fuzzy
msgid "Failed to open UDP sockets\n"
msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n"
-#: src/transport/plugin_transport_udp.c:3592
-#: src/transport/plugin_transport_udp.c:3606
+#: src/transport/plugin_transport_udp.c:3591
+#: src/transport/plugin_transport_udp.c:3605
msgid "must be in [0,65535]"
msgstr ""
-#: src/transport/plugin_transport_udp.c:3638
+#: src/transport/plugin_transport_udp.c:3637
#, fuzzy
msgid "must be valid IPv4 address"
msgstr "« %s » không sẵn sàng.\n"
-#: src/transport/plugin_transport_udp.c:3665
+#: src/transport/plugin_transport_udp.c:3664
#, fuzzy
msgid "must be valid IPv6 address"
msgstr "« %s » không sẵn sàng.\n"
-#: src/transport/plugin_transport_udp.c:3731
+#: src/transport/plugin_transport_udp.c:3730
#, fuzzy
msgid "Failed to create UDP network sockets\n"
msgstr "Không thể tạo miền tên.\n"
@@ -8595,7 +8656,7 @@
msgid "Syntax error while deserializing in line %u\n"
msgstr "Gặp lỗi cú pháp trong tập tin cấu hình « %s » tại dòng %d.\n"
-#: src/util/configuration.c:1026
+#: src/util/configuration.c:1025
#, c-format
msgid ""
"Configuration value '%s' for '%s' in section '%s' is not in set of legal "
@@ -8604,17 +8665,17 @@
"Giá trị cấu hình « %s » cho « %s » trong phần « %s » không phải nằm trong "
"tập hợp các sự chọn được phép\n"
-#: src/util/configuration.c:1145
+#: src/util/configuration.c:1144
#, c-format
msgid "Recursive expansion suspected, aborting $-expansion for term `%s'\n"
msgstr ""
-#: src/util/configuration.c:1177
+#: src/util/configuration.c:1176
#, fuzzy, c-format
msgid "Missing closing `%s' in option `%s'\n"
msgstr "Giá trị cấu hình « %s » cho « %s » trong phần « %s » nên là con số\n"
-#: src/util/configuration.c:1251
+#: src/util/configuration.c:1250
#, c-format
msgid ""
"Failed to expand `%s' in `%s' as it is neither found in [PATHS] nor defined "
@@ -8638,52 +8699,52 @@
"%llu)\n"
msgstr ""
-#: src/util/crypto_ecc.c:731 src/util/crypto_ecc.c:769
-#: src/util/crypto_ecc.c:887 src/util/crypto_ecc.c:925
+#: src/util/crypto_ecc.c:733 src/util/crypto_ecc.c:771
+#: src/util/crypto_ecc.c:889 src/util/crypto_ecc.c:927
#, fuzzy, c-format
msgid "Could not acquire lock on file `%s': %s...\n"
msgstr "Lỗi mở tập tin theo dõi « %s »: %s\n"
-#: src/util/crypto_ecc.c:736 src/util/crypto_ecc.c:892
+#: src/util/crypto_ecc.c:738 src/util/crypto_ecc.c:894
#, fuzzy
msgid "Creating a new private key. This may take a while.\n"
msgstr "Đang tạo khoá máy mới (có thể hơi lâu).\n"
-#: src/util/crypto_ecc.c:773 src/util/crypto_ecc.c:929
+#: src/util/crypto_ecc.c:775 src/util/crypto_ecc.c:931
msgid "This may be ok if someone is currently generating a private key.\n"
msgstr ""
-#: src/util/crypto_ecc.c:803 src/util/crypto_ecc.c:959
+#: src/util/crypto_ecc.c:805 src/util/crypto_ecc.c:961
#, c-format
msgid ""
"When trying to read key file `%s' I found %u bytes but I need at least %u.\n"
msgstr ""
-#: src/util/crypto_ecc.c:807 src/util/crypto_ecc.c:963
+#: src/util/crypto_ecc.c:809 src/util/crypto_ecc.c:965
msgid "This may be ok if someone is currently generating a key.\n"
msgstr ""
-#: src/util/crypto_ecc.c:1045
+#: src/util/crypto_ecc.c:1047
#, fuzzy
msgid "Could not load peer's private key\n"
msgstr "Không thể truy cập đến tập tin gnunet-directory « %s »\n"
-#: src/util/crypto_ecc.c:1149
+#: src/util/crypto_ecc.c:1151
#, fuzzy, c-format
msgid "ECC signing failed at %s:%d: %s\n"
msgstr "%s bị lỗi tại %s:%d: « %s »\n"
-#: src/util/crypto_ecc.c:1199
+#: src/util/crypto_ecc.c:1201
#, fuzzy, c-format
msgid "EdDSA signing failed at %s:%d: %s\n"
msgstr "%s bị lỗi tại %s:%d: « %s »\n"
-#: src/util/crypto_ecc.c:1273
+#: src/util/crypto_ecc.c:1275
#, fuzzy, c-format
msgid "ECDSA signature verification failed at %s:%d: %s\n"
msgstr "Lỗi thẩm tra chữ ký RSA tại %s:%d: %s\n"
-#: src/util/crypto_ecc.c:1330
+#: src/util/crypto_ecc.c:1332
#, fuzzy, c-format
msgid "EdDSA signature verification failed at %s:%d: %s\n"
msgstr "Lỗi thẩm tra chữ ký RSA tại %s:%d: %s\n"
@@ -8693,17 +8754,17 @@
msgid "libgcrypt has not the expected version (version %s is required).\n"
msgstr "libgcrypt không có phiên bản mong đợi (yêu cầu phiên bản %s).\n"
-#: src/util/crypto_rsa.c:809
+#: src/util/crypto_rsa.c:825
#, c-format
msgid "RSA signature verification failed at %s:%d: %s\n"
msgstr "Lỗi thẩm tra chữ ký RSA tại %s:%d: %s\n"
-#: src/util/disk.c:1218
+#: src/util/disk.c:1222
#, c-format
msgid "Expected `%s' to be a directory!\n"
msgstr "Mong đợi « %s » là một thư mục.\n"
-#: src/util/disk.c:1580 src/util/service.c:1328
+#: src/util/disk.c:1584 src/util/service.c:1328
#, 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"
@@ -8769,7 +8830,7 @@
msgstr ""
"Hãy sử dụng câu lệnh trợ giúp « --help » để xem danh sách các tùy chọn.\n"
-#: src/util/getopt_helpers.c:84
+#: src/util/getopt_helpers.c:90
#, c-format
msgid ""
"Arguments mandatory for long options are also mandatory for short options.\n"
@@ -8777,12 +8838,12 @@
"Mọi đối số bắt buộc phải sử dụng với tùy chọn dài cũng bắt buộc với tùy chọn "
"ngắn.\n"
-#: src/util/getopt_helpers.c:268 src/util/getopt_helpers.c:326
+#: src/util/getopt_helpers.c:274 src/util/getopt_helpers.c:332
#, c-format
msgid "You must pass a number to the `%s' option.\n"
msgstr "Phải gửi một con số cho tùy chọn « %s ».\n"
-#: src/util/getopt_helpers.c:298
+#: src/util/getopt_helpers.c:304
#, fuzzy, c-format
msgid "You must pass relative time to the `%s' option.\n"
msgstr "Phải gửi một con số cho tùy chọn « %s ».\n"
@@ -9025,22 +9086,22 @@
msgid "GetExitCodeProcess failed for binary %s (%d).\n"
msgstr ""
-#: src/util/plugin.c:87
+#: src/util/plugin.c:86
#, c-format
msgid "Initialization of plugin mechanism failed: %s!\n"
msgstr "Lỗi sơ khởi cơ chế phần bổ sung: %s\n"
-#: src/util/plugin.c:148
+#: src/util/plugin.c:151
#, c-format
msgid "`%s' failed to resolve method '%s' with error: %s\n"
msgstr "« %s » không giải quyết được phương pháp « %s », với lỗi: %s\n"
-#: src/util/plugin.c:223
+#: src/util/plugin.c:226
#, c-format
msgid "`%s' failed for library `%s' with error: %s\n"
msgstr "« %s » thất bại cho thư viện « %s » với lỗi: %s\n"
-#: src/util/plugin.c:382
+#: src/util/plugin.c:385
#, fuzzy
msgid "Could not determine plugin installation path.\n"
msgstr "Không thể truy cập đến thông tin về không gian tên.\n"
@@ -9694,10 +9755,6 @@
#~ msgstr "« %.*s » được kết nối tới « %.*s ».\n"
#, fuzzy
-#~ msgid "CADET initialized\n"
-#~ msgstr "Lỗi sơ khởi lõi.\n"
-
-#, fuzzy
#~ msgid "Reloading sensor definitions from directory `%s'\n"
#~ msgstr "Đang tải %d tập tin xuống thư mục « %s ».\n"
Modified: gnunet/po/zh_CN.po
===================================================================
--- gnunet/po/zh_CN.po 2015-04-24 07:04:18 UTC (rev 35558)
+++ gnunet/po/zh_CN.po 2015-04-27 11:12:21 UTC (rev 35559)
@@ -7,7 +7,7 @@
msgstr ""
"Project-Id-Version: gnunet-0.8.1\n"
"Report-Msgid-Bugs-To: address@hidden"
-"POT-Creation-Date: 2015-03-14 18:00+0100\n"
+"POT-Creation-Date: 2015-04-27 13:05+0200\n"
"PO-Revision-Date: 2011-07-09 12:12+0800\n"
"Last-Translator: Wylmer Wang <address@hidden>\n"
"Language-Team: Chinese (simplified) <address@hidden>\n"
@@ -496,16 +496,16 @@
msgid "Could not connect master [%u] and slave [%u]\n"
msgstr "无法连接到 %s:%u:%s\n"
-#: src/ats-tests/ats-testing.c:490 src/ats-tests/ats-testing.c:662
+#: src/ats-tests/ats-testing.c:490 src/ats-tests/ats-testing.c:634
#, fuzzy
msgid "Initialization failed, shutdown\n"
msgstr "插件机构初始化失败:%s!\n"
-#: src/ats-tests/ats-testing-log.c:846
+#: src/ats-tests/ats-testing-log.c:834
msgid "Stop logging\n"
msgstr ""
-#: src/ats-tests/ats-testing-log.c:897
+#: src/ats-tests/ats-testing-log.c:885
#, fuzzy, c-format
msgid "Start logging `%s'\n"
msgstr "未知的命令“%s”。\n"
@@ -553,6 +553,7 @@
msgstr ""
#: src/ats-tool/gnunet-ats.c:708 src/namestore/gnunet-namestore.c:700
+#: src/namestore/plugin_rest_namestore.c:812
#: src/transport/gnunet-transport.c:1890
#: src/transport/gnunet-transport-profiler.c:531
#, fuzzy, c-format
@@ -1402,29 +1403,29 @@
msgid "# PAYLOAD dropped (out of order)"
msgstr ""
-#: src/core/gnunet-service-core_neighbours.c:168
+#: src/core/gnunet-service-core_neighbours.c:177
msgid "# sessions terminated by transport disconnect"
msgstr ""
-#: src/core/gnunet-service-core_neighbours.c:184
-#: src/core/gnunet-service-core_neighbours.c:342
+#: src/core/gnunet-service-core_neighbours.c:193
+#: src/core/gnunet-service-core_neighbours.c:355
msgid "# neighbour entries allocated"
msgstr ""
-#: src/core/gnunet-service-core_neighbours.c:252
+#: src/core/gnunet-service-core_neighbours.c:264
msgid "# encrypted bytes given to transport"
msgstr ""
-#: src/core/gnunet-service-core_neighbours.c:425
+#: src/core/gnunet-service-core_neighbours.c:438
#, c-format
msgid "Unsupported message of type %u (%u bytes) received from peer `%s'\n"
msgstr ""
-#: src/core/gnunet-service-core_sessions.c:245
-#: src/core/gnunet-service-core_sessions.c:331
+#: src/core/gnunet-service-core_sessions.c:252
+#: src/core/gnunet-service-core_sessions.c:338
#: src/dht/gnunet-service-dht_neighbours.c:661
#: src/dht/gnunet-service-dht_neighbours.c:726
-#: src/fs/gnunet-service-fs_cp.c:645 src/fs/gnunet-service-fs_cp.c:1627
+#: src/fs/gnunet-service-fs_cp.c:654 src/fs/gnunet-service-fs_cp.c:1647
#: src/topology/gnunet-daemon-topology.c:734
#: src/topology/gnunet-daemon-topology.c:835
#: src/transport/gnunet-service-transport_neighbours.c:755
@@ -1432,21 +1433,21 @@
msgid "# peers connected"
msgstr ""
-#: src/core/gnunet-service-core_sessions.c:278
+#: src/core/gnunet-service-core_sessions.c:285
msgid "# type map refreshes sent"
msgstr ""
-#: src/core/gnunet-service-core_sessions.c:397
+#: src/core/gnunet-service-core_sessions.c:404
#, fuzzy
msgid "# outdated typemap confirmations received"
msgstr "保存配置失败。"
-#: src/core/gnunet-service-core_sessions.c:408
+#: src/core/gnunet-service-core_sessions.c:415
#, fuzzy
msgid "# valid typemap confirmations received"
msgstr "保存配置失败。"
-#: src/core/gnunet-service-core_sessions.c:546
+#: src/core/gnunet-service-core_sessions.c:554
msgid "# messages discarded (expired prior to transmission)"
msgstr ""
@@ -1460,7 +1461,7 @@
msgstr ""
#: src/datacache/datacache.c:115 src/datacache/datacache.c:266
-#: src/datastore/gnunet-service-datastore.c:855
+#: src/datastore/gnunet-service-datastore.c:841
msgid "# bytes stored"
msgstr ""
@@ -1469,8 +1470,8 @@
msgstr ""
#: src/datacache/datacache.c:143 src/datacache/datacache.c:150
-#: src/datastore/gnunet-service-datastore.c:1557
-#: src/datastore/gnunet-service-datastore.c:1568
+#: src/datastore/gnunet-service-datastore.c:1598
+#: src/datastore/gnunet-service-datastore.c:1609
#, c-format
msgid "No `%s' specified for `%s' in configuration!\n"
msgstr ""
@@ -1504,8 +1505,8 @@
#: src/datacache/plugin_datacache_sqlite.c:69
#: src/datacache/plugin_datacache_sqlite.c:72
-#: src/datastore/plugin_datastore_mysql.c:809
-#: src/datastore/plugin_datastore_mysql.c:823
+#: src/datastore/plugin_datastore_mysql.c:818
+#: src/datastore/plugin_datastore_mysql.c:834
#: src/datastore/plugin_datastore_sqlite.c:57 src/mysql/mysql.c:41
#: src/mysql/mysql.c:48 src/mysql/mysql.c:522 src/mysql/mysql.c:531
#: src/mysql/mysql.c:591 src/mysql/mysql.c:607
@@ -1697,8 +1698,8 @@
#: src/datastore/gnunet-service-datastore.c:712
#: src/datastore/gnunet-service-datastore.c:767
-#: src/datastore/gnunet-service-datastore.c:982
-#: src/datastore/gnunet-service-datastore.c:1529
+#: src/datastore/gnunet-service-datastore.c:999
+#: src/datastore/gnunet-service-datastore.c:1570
msgid "# reserved"
msgstr ""
@@ -1706,130 +1707,145 @@
msgid "Could not find matching reservation"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:867
+#: src/datastore/gnunet-service-datastore.c:853
#, c-format
msgid "Need %llu bytes more space (%llu allowed, using %llu)\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1029
+#: src/datastore/gnunet-service-datastore.c:1046
msgid "# GET requests received"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1041
+#: src/datastore/gnunet-service-datastore.c:1058
msgid "# requests filtered by bloomfilter"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1069
+#: src/datastore/gnunet-service-datastore.c:1094
msgid "# UPDATE requests received"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1099
+#: src/datastore/gnunet-service-datastore.c:1122
msgid "# GET REPLICATION requests received"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1132
+#: src/datastore/gnunet-service-datastore.c:1155
msgid "# GET ZERO ANONYMITY requests received"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1157
+#: src/datastore/gnunet-service-datastore.c:1180
msgid "Content not found"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1165
+#: src/datastore/gnunet-service-datastore.c:1188
msgid "# bytes removed (explicit request)"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1197
+#: src/datastore/gnunet-service-datastore.c:1220
msgid "# REMOVE requests received"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1241
+#: src/datastore/gnunet-service-datastore.c:1264
#, c-format
msgid ""
"Datastore payload must have been inaccurate (%lld < %lld). Recomputing it.\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1246
+#: src/datastore/gnunet-service-datastore.c:1269
#, c-format
msgid "New payload: %lld\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1299
+#: src/datastore/gnunet-service-datastore.c:1322
#, c-format
msgid "Loading `%s' datastore plugin\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1310
+#: src/datastore/gnunet-service-datastore.c:1333
#, fuzzy, c-format
msgid "Failed to load datastore plugin for `%s'\n"
msgstr "解析配置文件“%s”失败\n"
-#: src/datastore/gnunet-service-datastore.c:1412
+#: src/datastore/gnunet-service-datastore.c:1402
+#: src/datastore/gnunet-service-datastore.c:1463
+msgid "Bloomfilter construction complete.\n"
+msgstr ""
+
+#: src/datastore/gnunet-service-datastore.c:1450
msgid "Rebuilding bloomfilter. Please be patient.\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1419
+#: src/datastore/gnunet-service-datastore.c:1460
msgid "Plugin does not support get_keys function. Please fix!\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1422
-msgid "Bloomfilter construction complete.\n"
-msgstr ""
-
-#: src/datastore/gnunet-service-datastore.c:1562
+#: src/datastore/gnunet-service-datastore.c:1603
#, c-format
msgid "# bytes used in file-sharing datastore `%s'"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1573
+#: src/datastore/gnunet-service-datastore.c:1614
msgid "# quota"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1575
+#: src/datastore/gnunet-service-datastore.c:1616
msgid "# cache size"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1588
+#: src/datastore/gnunet-service-datastore.c:1629
#, c-format
msgid "Could not use specified filename `%s' for bloomfilter.\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1606
-#: src/datastore/gnunet-service-datastore.c:1622
+#: src/datastore/gnunet-service-datastore.c:1647
+#: src/datastore/gnunet-service-datastore.c:1663
#, fuzzy, c-format
msgid "Failed to remove bogus bloomfilter file `%s'\n"
msgstr "解析配置文件“%s”失败\n"
-#: src/datastore/gnunet-service-datastore.c:1652
+#: src/datastore/gnunet-service-datastore.c:1693
#, fuzzy
msgid "Failed to initialize bloomfilter.\n"
msgstr "初始化“%s”服务失败。\n"
-#: src/datastore/plugin_datastore_heap.c:821
+#: src/datastore/plugin_datastore_heap.c:826
#, fuzzy
msgid "Heap database running\n"
msgstr "sqlite 数据仓库"
-#: src/datastore/plugin_datastore_mysql.c:786
+#: src/datastore/plugin_datastore_mysql.c:309
+#: src/datastore/plugin_datastore_sqlite.c:499
+#, fuzzy
+msgid "Data too large"
+msgstr "迭代次数"
+
+#: src/datastore/plugin_datastore_mysql.c:328
+msgid "MySQL statement run failure"
+msgstr ""
+
+#: src/datastore/plugin_datastore_mysql.c:793
#, fuzzy, c-format
msgid "Failed to prepare statement `%s'\n"
msgstr "解析配置文件“%s”失败\n"
-#: src/datastore/plugin_datastore_mysql.c:794
+#: src/datastore/plugin_datastore_mysql.c:802
#, fuzzy, c-format
msgid "`%s' for `%s' failed at %s:%d with error: %s\n"
msgstr "“%s”于 %s:%d 处失败,错误为:%s\n"
-#: src/datastore/plugin_datastore_mysql.c:1025
+#: src/datastore/plugin_datastore_mysql.c:1036
msgid "Mysql database running\n"
msgstr ""
-#: src/datastore/plugin_datastore_postgres.c:837
+#: src/datastore/plugin_datastore_postgres.c:331
+msgid "Postgress exec failure"
+msgstr ""
+
+#: src/datastore/plugin_datastore_postgres.c:846
#, fuzzy
msgid "Failed to drop table from database.\n"
msgstr "发送消息失败。\n"
-#: src/datastore/plugin_datastore_postgres.c:873
+#: src/datastore/plugin_datastore_postgres.c:882
#: src/namecache/plugin_namecache_postgres.c:414
#: src/namestore/plugin_namestore_postgres.c:569
msgid "Postgres database running\n"
@@ -1852,30 +1868,30 @@
msgid "Unable to initialize SQLite: %s.\n"
msgstr "无法初始化 SQLite:%s。\n"
-#: src/datastore/plugin_datastore_sqlite.c:661
+#: src/datastore/plugin_datastore_sqlite.c:680
#, fuzzy
msgid "Invalid data in database. Trying to fix (by deletion).\n"
msgstr "%s 中有无效数据。请尝试修复(删除之)。\n"
-#: src/datastore/plugin_datastore_sqlite.c:1156
+#: src/datastore/plugin_datastore_sqlite.c:1177
msgid "sqlite version to old to determine size, assuming zero\n"
msgstr ""
-#: src/datastore/plugin_datastore_sqlite.c:1176
+#: src/datastore/plugin_datastore_sqlite.c:1197
#, c-format
msgid ""
"Using sqlite page utilization to estimate payload (%llu pages of size %llu "
"bytes)\n"
msgstr ""
-#: src/datastore/plugin_datastore_sqlite.c:1216
+#: src/datastore/plugin_datastore_sqlite.c:1237
#: src/namecache/plugin_namecache_sqlite.c:580
#: src/namestore/plugin_namestore_sqlite.c:716
#, fuzzy
msgid "Sqlite database running\n"
msgstr "sqlite 数据仓库"
-#: src/datastore/plugin_datastore_template.c:259
+#: src/datastore/plugin_datastore_template.c:260
msgid "Template database running\n"
msgstr ""
@@ -2476,53 +2492,53 @@
msgid "Change DNS replies to point elsewhere."
msgstr ""
-#: src/dns/gnunet-service-dns.c:456
+#: src/dns/gnunet-service-dns.c:459
msgid "# DNS requests answered via TUN interface"
msgstr ""
-#: src/dns/gnunet-service-dns.c:603
+#: src/dns/gnunet-service-dns.c:606
msgid "# DNS exit failed (failed to open socket)"
msgstr ""
-#: src/dns/gnunet-service-dns.c:714
+#: src/dns/gnunet-service-dns.c:717
msgid "# External DNS response discarded (no matching request)"
msgstr ""
-#: src/dns/gnunet-service-dns.c:792
+#: src/dns/gnunet-service-dns.c:795
msgid "# Client response discarded (no matching request)"
msgstr ""
-#: src/dns/gnunet-service-dns.c:907
+#: src/dns/gnunet-service-dns.c:910
msgid "Received malformed IPv4-UDP packet on TUN interface.\n"
msgstr ""
-#: src/dns/gnunet-service-dns.c:923
+#: src/dns/gnunet-service-dns.c:926
msgid "Received malformed IPv6-UDP packet on TUN interface.\n"
msgstr ""
-#: src/dns/gnunet-service-dns.c:932
+#: src/dns/gnunet-service-dns.c:935
#, c-format
msgid "Got non-IP packet with %u bytes and protocol %u from TUN\n"
msgstr ""
-#: src/dns/gnunet-service-dns.c:942
+#: src/dns/gnunet-service-dns.c:945
msgid "# Non-DNS UDP packet received via TUN interface"
msgstr ""
-#: src/dns/gnunet-service-dns.c:1009
+#: src/dns/gnunet-service-dns.c:1012
msgid "# DNS requests received via TUN interface"
msgstr ""
-#: src/dns/gnunet-service-dns.c:1049
-#, c-format
-msgid "`%s' must be installed SUID, refusing to run\n"
-msgstr ""
-
-#: src/dns/gnunet-service-dns.c:1069 src/exit/gnunet-daemon-exit.c:3594
+#: src/dns/gnunet-service-dns.c:1064 src/exit/gnunet-daemon-exit.c:3594
#, fuzzy
msgid "need a valid IPv4 or IPv6 address\n"
msgstr "无效的进程优先级“%s”\n"
+#: src/dns/gnunet-service-dns.c:1082
+#, c-format
+msgid "`%s' must be installed SUID, will not run DNS interceptor\n"
+msgstr ""
+
#: src/dv/gnunet-dv.c:169
msgid "verbose output"
msgstr ""
@@ -2747,52 +2763,52 @@
msgid "Daemon to run to provide an IP exit node for the VPN"
msgstr ""
-#: src/fragmentation/defragmentation.c:271
+#: src/fragmentation/defragmentation.c:277
msgid "# acknowledgements sent for fragment"
msgstr ""
-#: src/fragmentation/defragmentation.c:463
+#: src/fragmentation/defragmentation.c:470
#: src/transport/plugin_transport_wlan.c:1515
msgid "# fragments received"
msgstr ""
-#: src/fragmentation/defragmentation.c:533
+#: src/fragmentation/defragmentation.c:540
msgid "# duplicate fragments received"
msgstr ""
-#: src/fragmentation/defragmentation.c:549
+#: src/fragmentation/defragmentation.c:558
msgid "# messages defragmented"
msgstr ""
-#: src/fragmentation/fragmentation.c:234
+#: src/fragmentation/fragmentation.c:235
msgid "# fragments transmitted"
msgstr ""
-#: src/fragmentation/fragmentation.c:237
+#: src/fragmentation/fragmentation.c:240
msgid "# fragments retransmitted"
msgstr ""
-#: src/fragmentation/fragmentation.c:263
+#: src/fragmentation/fragmentation.c:269
msgid "# fragments wrap arounds"
msgstr ""
-#: src/fragmentation/fragmentation.c:307
+#: src/fragmentation/fragmentation.c:315
msgid "# messages fragmented"
msgstr ""
-#: src/fragmentation/fragmentation.c:310
+#: src/fragmentation/fragmentation.c:321
msgid "# total size of fragmented messages"
msgstr ""
-#: src/fragmentation/fragmentation.c:431
+#: src/fragmentation/fragmentation.c:444
msgid "# fragment acknowledgements received"
msgstr ""
-#: src/fragmentation/fragmentation.c:437
+#: src/fragmentation/fragmentation.c:451
msgid "# bits removed from fragmentation ACKs"
msgstr ""
-#: src/fragmentation/fragmentation.c:461
+#: src/fragmentation/fragmentation.c:475
msgid "# fragmentation transmissions completed"
msgstr ""
@@ -3055,58 +3071,58 @@
msgid "Got result with unknown block type `%d', ignoring"
msgstr ""
-#: src/fs/fs_unindex.c:59
+#: src/fs/fs_unindex.c:63
msgid "Failed to find given position in file"
msgstr ""
-#: src/fs/fs_unindex.c:64
+#: src/fs/fs_unindex.c:68
#, fuzzy
msgid "Failed to read file"
msgstr "发送消息失败。\n"
-#: src/fs/fs_unindex.c:234
+#: src/fs/fs_unindex.c:245
msgid "Unexpected time for a response from `fs' service."
msgstr ""
-#: src/fs/fs_unindex.c:242
+#: src/fs/fs_unindex.c:253
msgid "Timeout waiting for `fs' service."
msgstr ""
-#: src/fs/fs_unindex.c:250
+#: src/fs/fs_unindex.c:261
#, fuzzy
msgid "Invalid response from `fs' service."
msgstr "“%s”的参数无效。\n"
-#: src/fs/fs_unindex.c:291
+#: src/fs/fs_unindex.c:304
msgid "Failed to connect to FS service for unindexing."
msgstr ""
-#: src/fs/fs_unindex.c:347 src/fs/fs_unindex.c:359
+#: src/fs/fs_unindex.c:360 src/fs/fs_unindex.c:372
#, fuzzy
msgid "Failed to get KSKs from directory scan."
msgstr "解析配置文件“%s”失败\n"
-#: src/fs/fs_unindex.c:355
+#: src/fs/fs_unindex.c:368
#, fuzzy, c-format
msgid "Internal error scanning `%s'.\n"
msgstr "未知错误。\n"
-#: src/fs/fs_unindex.c:414
+#: src/fs/fs_unindex.c:427
#, fuzzy, c-format
msgid "Failed to remove UBlock: %s\n"
msgstr "打开日志文件“%s”失败:%s\n"
-#: src/fs/fs_unindex.c:562 src/fs/fs_unindex.c:626
+#: src/fs/fs_unindex.c:590 src/fs/fs_unindex.c:656
#, fuzzy
msgid "Failed to connect to `datastore' service."
msgstr "初始化“%s”服务失败。\n"
-#: src/fs/fs_unindex.c:639
+#: src/fs/fs_unindex.c:669
#, fuzzy
msgid "Failed to open file for unindexing."
msgstr "打开日志文件“%s”失败:%s\n"
-#: src/fs/fs_unindex.c:673
+#: src/fs/fs_unindex.c:708
msgid "Failed to compute hash of file."
msgstr ""
@@ -3678,88 +3694,88 @@
"\n"
"按任意键继续\n"
-#: src/fs/gnunet-service-fs_cp.c:726
+#: src/fs/gnunet-service-fs_cp.c:735
msgid "# migration stop messages received"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:730
+#: src/fs/gnunet-service-fs_cp.c:739
#, c-format
msgid "Migration of content to peer `%s' blocked for %s\n"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:768
+#: src/fs/gnunet-service-fs_cp.c:776
msgid "# replies transmitted to other peers"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:774
+#: src/fs/gnunet-service-fs_cp.c:784
msgid "# replies dropped"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:799 src/fs/gnunet-service-fs_cp.c:1384
+#: src/fs/gnunet-service-fs_cp.c:810 src/fs/gnunet-service-fs_cp.c:1404
msgid "# P2P searches active"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:904
+#: src/fs/gnunet-service-fs_cp.c:915
msgid "# artificial delays introduced (ms)"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:960
+#: src/fs/gnunet-service-fs_cp.c:971
msgid "# replies dropped due to type mismatch"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:968
+#: src/fs/gnunet-service-fs_cp.c:979
msgid "# replies received for other peers"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:982
+#: src/fs/gnunet-service-fs_cp.c:993
msgid "# replies dropped due to insufficient cover traffic"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:1030
+#: src/fs/gnunet-service-fs_cp.c:1041
msgid "# P2P searches destroyed due to ultimate reply"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:1098
+#: src/fs/gnunet-service-fs_cp.c:1109
msgid "# requests done for free (low load)"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:1123
+#: src/fs/gnunet-service-fs_cp.c:1134
msgid "# request dropped, priority insufficient"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:1133
+#: src/fs/gnunet-service-fs_cp.c:1144
msgid "# requests done for a price (normal load)"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:1210
+#: src/fs/gnunet-service-fs_cp.c:1221
msgid "# GET requests received (from other peers)"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:1245
+#: src/fs/gnunet-service-fs_cp.c:1256
msgid "# requests dropped due to initiator not being connected"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:1266
+#: src/fs/gnunet-service-fs_cp.c:1277
msgid "# requests dropped due to missing reverse route"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:1277
+#: src/fs/gnunet-service-fs_cp.c:1288
msgid "# requests dropped due to full reply queue"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:1329
+#: src/fs/gnunet-service-fs_cp.c:1340
msgid "# requests dropped due TTL underflow"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:1353
+#: src/fs/gnunet-service-fs_cp.c:1365
msgid "# requests dropped due to higher-TTL request"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:1382
+#: src/fs/gnunet-service-fs_cp.c:1402
msgid "# P2P query messages received and processed"
msgstr ""
-#: src/fs/gnunet-service-fs_cp.c:1821
+#: src/fs/gnunet-service-fs_cp.c:1841
msgid "# migration stop messages sent"
msgstr ""
@@ -4082,7 +4098,7 @@
msgid "GNUnet DNS-to-GNS proxy (a DNS server)"
msgstr ""
-#: src/gns/gnunet-gns.c:215
+#: src/gns/gnunet-gns.c:215 src/gns/plugin_rest_gns.c:334
#, c-format
msgid "Invalid typename specified, assuming `ANY'\n"
msgstr ""
@@ -4098,6 +4114,7 @@
msgstr ""
#: src/gns/gnunet-gns.c:353 src/gns/gnunet-gns-helper-service-w32.c:798
+#: src/gns/plugin_rest_gns.c:459
#, c-format
msgid ""
"Ego for `gns-master' not found, cannot perform lookup. Did you run gnunet-"
@@ -4235,7 +4252,7 @@
msgid "Failed to start HTTPS server for `%s'\n"
msgstr "初始化“%s”服务失败。\n"
-#: src/gns/gnunet-gns-proxy.c:2225
+#: src/gns/gnunet-gns-proxy.c:2225 src/rest/gnunet-rest-server.c:529
#, fuzzy
msgid "Failed to pass client to MHD\n"
msgstr "初始化“%s”服务失败。\n"
@@ -4339,21 +4356,21 @@
msgid "GNS lookup resulted in DNS name that is too long (`%s')\n"
msgstr ""
-#: src/gns/gnunet-service-gns_resolver.c:1886
+#: src/gns/gnunet-service-gns_resolver.c:1891
msgid "GNS lookup recursion failed (no delegation record found)\n"
msgstr ""
-#: src/gns/gnunet-service-gns_resolver.c:1910
+#: src/gns/gnunet-service-gns_resolver.c:1915
#, fuzzy, c-format
msgid "Failed to cache GNS resolution: %s\n"
msgstr "打开日志文件“%s”失败:%s\n"
-#: src/gns/gnunet-service-gns_resolver.c:2192
+#: src/gns/gnunet-service-gns_resolver.c:2197
#, c-format
msgid "Zone %s was revoked, resolution fails\n"
msgstr ""
-#: src/gns/gnunet-service-gns_resolver.c:2341
+#: src/gns/gnunet-service-gns_resolver.c:2346
#, c-format
msgid "Hostname `%s' is not well-formed, resolution fails\n"
msgstr ""
@@ -4383,6 +4400,14 @@
msgid "Unable to parse BOX record string `%s'\n"
msgstr "解析配置文件“%s”失败\n"
+#: src/gns/plugin_rest_gns.c:422
+msgid "Ego for not found, cannot perform lookup.\n"
+msgstr ""
+
+#: src/gns/plugin_rest_gns.c:652
+msgid "GNS REST API initialized\n"
+msgstr ""
+
#: src/gnsrecord/plugin_gnsrecord_dns.c:291
#, fuzzy, c-format
msgid "Unable to parse IPv4 address `%s'\n"
@@ -4899,6 +4924,10 @@
msgid "Failed to create directory `%s' for storing egos\n"
msgstr "解析配置文件“%s”失败\n"
+#: src/identity/plugin_rest_identity.c:803
+msgid "Identity REST API initialized\n"
+msgstr ""
+
#: src/mysql/mysql.c:174
#, c-format
msgid "Trying to use file `%s' for MySQL configuration.\n"
@@ -4924,9 +4953,9 @@
msgid "You must specify which zone should be accessed\n"
msgstr "您必须指定一个昵称\n"
-#: src/namecache/gnunet-namecache.c:195 src/namestore/gnunet-namestore.c:844
+#: src/namecache/gnunet-namecache.c:195
#, fuzzy, c-format
-msgid "Invalid public key for reverse lookup `%s'\n"
+msgid "Invalid public key for zone `%s'\n"
msgstr "“%s”的参数无效。\n"
#: src/namecache/gnunet-namecache.c:203
@@ -4963,11 +4992,13 @@
msgstr ""
#: src/namestore/gnunet-namestore.c:332
+#: src/namestore/plugin_rest_namestore.c:505
#, c-format
msgid "Deleting record failed, record does not exist%s%s\n"
msgstr ""
#: src/namestore/gnunet-namestore.c:339
+#: src/namestore/plugin_rest_namestore.c:514
#, c-format
msgid "Deleting record failed%s%s\n"
msgstr ""
@@ -4985,6 +5016,7 @@
msgstr ""
#: src/namestore/gnunet-namestore.c:628
+#: src/namestore/plugin_rest_namestore.c:538
#, c-format
msgid "There are no records under label `%s' that could be deleted.\n"
msgstr ""
@@ -5002,6 +5034,7 @@
#: src/namestore/gnunet-namestore.c:719
#: src/namestore/gnunet-namestore-fcfsd.c:984
+#: src/namestore/plugin_rest_namestore.c:821
#, fuzzy
msgid "Failed to connect to namestore\n"
msgstr "初始化“%s”服务失败。\n"
@@ -5019,11 +5052,14 @@
msgstr ""
#: src/namestore/gnunet-namestore.c:745
+#: src/namestore/plugin_rest_namestore.c:608
#, fuzzy, c-format
msgid "Unsupported type `%s'\n"
msgstr "未知的命令“%s”。\n"
#: src/namestore/gnunet-namestore.c:765
+#: src/namestore/plugin_rest_namestore.c:626
+#: src/namestore/plugin_rest_namestore.c:666
#, c-format
msgid "Value `%s' invalid for record type `%s'\n"
msgstr ""
@@ -5037,6 +5073,11 @@
msgid "del"
msgstr ""
+#: src/namestore/gnunet-namestore.c:844
+#, fuzzy, c-format
+msgid "Invalid public key for reverse lookup `%s'\n"
+msgstr "“%s”的参数无效。\n"
+
#: src/namestore/gnunet-namestore.c:868
#: src/peerinfo-tool/gnunet-peerinfo.c:817
#, fuzzy, c-format
@@ -5049,21 +5090,25 @@
msgstr "无效条目。\n"
#: src/namestore/gnunet-namestore.c:943
+#: src/namestore/plugin_rest_namestore.c:851
#, c-format
msgid "Ego `%s' not known to identity service\n"
msgstr ""
#: src/namestore/gnunet-namestore.c:970
+#: src/namestore/plugin_rest_namestore.c:878
#, c-format
msgid "No default ego configured in identity service\n"
msgstr ""
#: src/namestore/gnunet-namestore.c:1006
+#: src/namestore/plugin_rest_namestore.c:917
#, fuzzy, c-format
msgid "Identity service is not running\n"
msgstr "服务已删除。\n"
#: src/namestore/gnunet-namestore.c:1018
+#: src/namestore/plugin_rest_namestore.c:946
#, fuzzy, c-format
msgid "Cannot connect to identity service\n"
msgstr "无法连接到 %s:%u:%s\n"
@@ -5195,6 +5240,10 @@
msgid "Namestore failed to store record\n"
msgstr ""
+#: src/namestore/plugin_rest_namestore.c:1023
+msgid "Namestore REST API initialized\n"
+msgstr ""
+
#: src/nat/gnunet-nat-server.c:279
#, c-format
msgid "Please pass valid port number as the first argument! (got `%s')\n"
@@ -5439,7 +5488,7 @@
msgstr "无法访问该服务"
#: src/nse/gnunet-service-nse.c:1537
-#: src/revocation/gnunet-service-revocation.c:815 src/util/gnunet-scrypt.c:260
+#: src/revocation/gnunet-service-revocation.c:827 src/util/gnunet-scrypt.c:260
#, fuzzy
msgid "Value is too large.\n"
msgstr "值不在合法范围内。"
@@ -5970,6 +6019,15 @@
msgid "Regex `%s' is too long!\n"
msgstr "服务已删除。\n"
+#: src/rest/gnunet-rest-server.c:766
+msgid "listen on specified port (default: 7776)"
+msgstr ""
+
+#: src/rest/gnunet-rest-server.c:783
+#, fuzzy
+msgid "GNUnet REST server"
+msgstr "GNUnet 错误日志"
+
#: src/revocation/gnunet-revocation.c:126
#, c-format
msgid "Key `%s' is valid\n"
@@ -6098,11 +6156,11 @@
msgstr ""
#: src/revocation/gnunet-service-revocation.c:493
-#: src/revocation/gnunet-service-revocation.c:747
+#: src/revocation/gnunet-service-revocation.c:759
msgid "SET service crashed, terminating revocation service\n"
msgstr ""
-#: src/revocation/gnunet-service-revocation.c:839
+#: src/revocation/gnunet-service-revocation.c:851
#, fuzzy
msgid "Could not open revocation database file!"
msgstr "无法连接到 %s:%u:%s\n"
@@ -7795,7 +7853,7 @@
msgstr ""
#: src/transport/plugin_transport_http_server.c:2825
-#: src/transport/plugin_transport_udp.c:3336
+#: src/transport/plugin_transport_udp.c:3335
msgid "Disabling IPv6 since it is not supported on this system!\n"
msgstr ""
@@ -8026,50 +8084,50 @@
msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n"
msgstr ""
-#: src/transport/plugin_transport_udp.c:3082
+#: src/transport/plugin_transport_udp.c:3081
#, c-format
msgid ""
"UDP could not transmit message to `%s': Network seems down, please check "
"your network configuration\n"
msgstr ""
-#: src/transport/plugin_transport_udp.c:3096
+#: src/transport/plugin_transport_udp.c:3095
msgid ""
"UDP 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_udp.c:3412
-#: src/transport/plugin_transport_udp.c:3511
+#: src/transport/plugin_transport_udp.c:3411
+#: src/transport/plugin_transport_udp.c:3510
#, fuzzy, c-format
msgid "Failed to bind UDP socket to %s: %s\n"
msgstr "打开日志文件“%s”失败:%s\n"
-#: src/transport/plugin_transport_udp.c:3430
+#: src/transport/plugin_transport_udp.c:3429
msgid "Disabling IPv4 since it is not supported on this system!\n"
msgstr ""
-#: src/transport/plugin_transport_udp.c:3521
+#: src/transport/plugin_transport_udp.c:3520
#, fuzzy
msgid "Failed to open UDP sockets\n"
msgstr "打开日志文件“%s”失败:%s\n"
-#: src/transport/plugin_transport_udp.c:3592
-#: src/transport/plugin_transport_udp.c:3606
+#: src/transport/plugin_transport_udp.c:3591
+#: src/transport/plugin_transport_udp.c:3605
msgid "must be in [0,65535]"
msgstr ""
-#: src/transport/plugin_transport_udp.c:3638
+#: src/transport/plugin_transport_udp.c:3637
#, fuzzy
msgid "must be valid IPv4 address"
msgstr "“%s”不可用。\n"
-#: src/transport/plugin_transport_udp.c:3665
+#: src/transport/plugin_transport_udp.c:3664
#, fuzzy
msgid "must be valid IPv6 address"
msgstr "“%s”不可用。\n"
-#: src/transport/plugin_transport_udp.c:3731
+#: src/transport/plugin_transport_udp.c:3730
#, fuzzy
msgid "Failed to create UDP network sockets\n"
msgstr "发送消息失败。\n"
@@ -8280,24 +8338,24 @@
msgid "Syntax error while deserializing in line %u\n"
msgstr "配置文件“%s”第 %d 行有语法错误。\n"
-#: src/util/configuration.c:1026
+#: src/util/configuration.c:1025
#, c-format
msgid ""
"Configuration value '%s' for '%s' in section '%s' is not in set of legal "
"choices\n"
msgstr ""
-#: src/util/configuration.c:1145
+#: src/util/configuration.c:1144
#, c-format
msgid "Recursive expansion suspected, aborting $-expansion for term `%s'\n"
msgstr ""
-#: src/util/configuration.c:1177
+#: src/util/configuration.c:1176
#, fuzzy, c-format
msgid "Missing closing `%s' in option `%s'\n"
msgstr "配置文件“%s”已写入。\n"
-#: src/util/configuration.c:1251
+#: src/util/configuration.c:1250
#, c-format
msgid ""
"Failed to expand `%s' in `%s' as it is neither found in [PATHS] nor defined "
@@ -8321,52 +8379,52 @@
"%llu)\n"
msgstr ""
-#: src/util/crypto_ecc.c:731 src/util/crypto_ecc.c:769
-#: src/util/crypto_ecc.c:887 src/util/crypto_ecc.c:925
+#: src/util/crypto_ecc.c:733 src/util/crypto_ecc.c:771
+#: src/util/crypto_ecc.c:889 src/util/crypto_ecc.c:927
#, fuzzy, c-format
msgid "Could not acquire lock on file `%s': %s...\n"
msgstr "无法解析“%s”(%s):%s\n"
-#: src/util/crypto_ecc.c:736 src/util/crypto_ecc.c:892
+#: src/util/crypto_ecc.c:738 src/util/crypto_ecc.c:894
#, fuzzy
msgid "Creating a new private key. This may take a while.\n"
msgstr "正在启动数据仓库转换(可能需要一段时间)。\n"
-#: src/util/crypto_ecc.c:773 src/util/crypto_ecc.c:929
+#: src/util/crypto_ecc.c:775 src/util/crypto_ecc.c:931
msgid "This may be ok if someone is currently generating a private key.\n"
msgstr ""
-#: src/util/crypto_ecc.c:803 src/util/crypto_ecc.c:959
+#: src/util/crypto_ecc.c:805 src/util/crypto_ecc.c:961
#, c-format
msgid ""
"When trying to read key file `%s' I found %u bytes but I need at least %u.\n"
msgstr ""
-#: src/util/crypto_ecc.c:807 src/util/crypto_ecc.c:963
+#: src/util/crypto_ecc.c:809 src/util/crypto_ecc.c:965
msgid "This may be ok if someone is currently generating a key.\n"
msgstr ""
-#: src/util/crypto_ecc.c:1045
+#: src/util/crypto_ecc.c:1047
#, fuzzy
msgid "Could not load peer's private key\n"
msgstr "找不到接口“%s”的一个 IP 地址。\n"
-#: src/util/crypto_ecc.c:1149
+#: src/util/crypto_ecc.c:1151
#, fuzzy, c-format
msgid "ECC signing failed at %s:%d: %s\n"
msgstr "对驱动器“%2$s”的“%1$s”操作失败:%3$u\n"
-#: src/util/crypto_ecc.c:1199
+#: src/util/crypto_ecc.c:1201
#, fuzzy, c-format
msgid "EdDSA signing failed at %s:%d: %s\n"
msgstr "对驱动器“%2$s”的“%1$s”操作失败:%3$u\n"
-#: src/util/crypto_ecc.c:1273
+#: src/util/crypto_ecc.c:1275
#, fuzzy, c-format
msgid "ECDSA signature verification failed at %s:%d: %s\n"
msgstr "对驱动器“%2$s”的“%1$s”操作失败:%3$u\n"
-#: src/util/crypto_ecc.c:1330
+#: src/util/crypto_ecc.c:1332
#, fuzzy, c-format
msgid "EdDSA signature verification failed at %s:%d: %s\n"
msgstr "对驱动器“%2$s”的“%1$s”操作失败:%3$u\n"
@@ -8376,17 +8434,17 @@
msgid "libgcrypt has not the expected version (version %s is required).\n"
msgstr "libgcrypt 的版本不符合预期(要求版本 %s)。\n"
-#: src/util/crypto_rsa.c:809
+#: src/util/crypto_rsa.c:825
#, fuzzy, c-format
msgid "RSA signature verification failed at %s:%d: %s\n"
msgstr "对驱动器“%2$s”的“%1$s”操作失败:%3$u\n"
-#: src/util/disk.c:1218
+#: src/util/disk.c:1222
#, c-format
msgid "Expected `%s' to be a directory!\n"
msgstr "“%s”应为目录!\n"
-#: src/util/disk.c:1580 src/util/service.c:1328
+#: src/util/disk.c:1584 src/util/service.c:1328
#, c-format
msgid "Cannot obtain information about user `%s': %s\n"
msgstr "无法获取有关用户“%s”的信息:%s\n"
@@ -8451,18 +8509,18 @@
msgid "Use %s to get a list of options.\n"
msgstr "请使用 --help 获取选项列表。\n"
-#: src/util/getopt_helpers.c:84
+#: src/util/getopt_helpers.c:90
#, c-format
msgid ""
"Arguments mandatory for long options are also mandatory for short options.\n"
msgstr "长选项的必选参数对短选项也是必选的。\n"
-#: src/util/getopt_helpers.c:268 src/util/getopt_helpers.c:326
+#: src/util/getopt_helpers.c:274 src/util/getopt_helpers.c:332
#, c-format
msgid "You must pass a number to the `%s' option.\n"
msgstr "您必须向“%s”选项传递一个数字。\n"
-#: src/util/getopt_helpers.c:298
+#: src/util/getopt_helpers.c:304
#, fuzzy, c-format
msgid "You must pass relative time to the `%s' option.\n"
msgstr "您必须向“%s”选项传递一个数字。\n"
@@ -8705,22 +8763,22 @@
msgid "GetExitCodeProcess failed for binary %s (%d).\n"
msgstr ""
-#: src/util/plugin.c:87
+#: src/util/plugin.c:86
#, c-format
msgid "Initialization of plugin mechanism failed: %s!\n"
msgstr "插件机构初始化失败:%s!\n"
-#: src/util/plugin.c:148
+#: src/util/plugin.c:151
#, c-format
msgid "`%s' failed to resolve method '%s' with error: %s\n"
msgstr ""
-#: src/util/plugin.c:223
+#: src/util/plugin.c:226
#, c-format
msgid "`%s' failed for library `%s' with error: %s\n"
msgstr ""
-#: src/util/plugin.c:382
+#: src/util/plugin.c:385
#, fuzzy
msgid "Could not determine plugin installation path.\n"
msgstr "无法确定用户界面定义文件。"
Modified: gnunet/src/dht/Makefile.am
===================================================================
--- gnunet/src/dht/Makefile.am 2015-04-24 07:04:18 UTC (rev 35558)
+++ gnunet/src/dht/Makefile.am 2015-04-27 11:12:21 UTC (rev 35559)
@@ -48,7 +48,8 @@
libexec_PROGRAMS = \
gnunet-service-dht \
- gnunet-service-dht-xvine
+ gnunet-service-dht-xvine\
+ gnunet-service-dht-whanau
noinst_PROGRAMS = \
gnunet-dht-monitor \
@@ -98,8 +99,27 @@
$(top_builddir)/src/util/libgnunetutil.la \
-lm
+gnunet_service_dht_whanau_SOURCES = \
+ gnunet-service-wdht.c gnunet-service-wdht.h \
+ gnunet-service-wdht_clients.c gnunet-service-wdht_clients.h \
+ gnunet-service-wdht_datacache.c gnunet-service-wdht_datacache.h \
+ gnunet-service-wdht_hello.c gnunet-service-wdht_hello.h \
+ gnunet-service-wdht_nse.c gnunet-service-wdht_nse.h \
+ gnunet-service-wdht_neighbours.c gnunet-service-wdht_neighbours.h \
+ gnunet-service-wdht_routing.c gnunet-service-wdht_routing.h
+gnunet_service_dht_whanau_LDADD = \
+ $(top_builddir)/src/statistics/libgnunetstatistics.la \
+ $(top_builddir)/src/core/libgnunetcore.la \
+ $(top_builddir)/src/nse/libgnunetnse.la \
+ $(top_builddir)/src/ats/libgnunetats.la \
+ $(top_builddir)/src/transport/libgnunettransport.la \
+ $(top_builddir)/src/peerinfo/libgnunetpeerinfo.la \
+ $(top_builddir)/src/hello/libgnunethello.la \
+ $(top_builddir)/src/block/libgnunetblock.la \
+ $(top_builddir)/src/datacache/libgnunetdatacache.la \
+ $(top_builddir)/src/util/libgnunetutil.la \
+ -lm
-
gnunet_dht_get_SOURCES = \
gnunet-dht-get.c
gnunet_dht_get_LDADD = \
Added: gnunet/src/dht/gnunet-service-wdht.c
===================================================================
--- gnunet/src/dht/gnunet-service-wdht.c (rev 0)
+++ gnunet/src/dht/gnunet-service-wdht.c 2015-04-27 11:12:21 UTC (rev
35559)
@@ -0,0 +1,220 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2009, 2010, 2011 Christian Grothoff (and other contributing
authors)
+
+ GNUnet is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 3, or (at your
+ option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNUnet; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+/**
+ * @file dht/gnunet-service-xdht.c
+ * @brief GNUnet DHT service
+ * @author Christian Grothoff
+ * @author Nathan Evans
+ */
+
+#include "platform.h"
+#include "gnunet_block_lib.h"
+#include "gnunet_util_lib.h"
+#include "gnunet_transport_service.h"
+#include "gnunet_hello_lib.h"
+#include "gnunet_dht_service.h"
+#include "gnunet_statistics_service.h"
+#include "gnunet-service-wdht.h"
+#include "gnunet-service-wdht_clients.h"
+#include "gnunet-service-wdht_datacache.h"
+#include "gnunet-service-wdht_hello.h"
+#include "gnunet-service-wdht_neighbours.h"
+#include "gnunet-service-wdht_nse.h"
+#include "gnunet-service-wdht_routing.h"
+
+
+
+/**
+ * Handle for the statistics service.
+ */
+struct GNUNET_STATISTICS_Handle *GDS_stats;
+
+/**
+ * Our handle to the BLOCK library.
+ */
+struct GNUNET_BLOCK_Context *GDS_block_context;
+
+/**
+ * The configuration the DHT service is running with
+ */
+const struct GNUNET_CONFIGURATION_Handle *GDS_cfg;
+
+/**
+ * Our HELLO
+ */
+struct GNUNET_MessageHeader *GDS_my_hello;
+
+/**
+ * Handle to the transport service, for getting our hello
+ */
+struct GNUNET_TRANSPORT_Handle *GDS_transport_handle;
+
+/**
+ * Handle to get our current HELLO.
+ */
+static struct GNUNET_TRANSPORT_GetHelloHandle *ghh;
+
+/**
+ * Hello address expiration
+ */
+struct GNUNET_TIME_Relative hello_expiration;
+
+/**
+ * Should we store our topology predecessor and successor IDs into statistics?
+ */
+extern unsigned int track_topology;
+
+#if ENABLE_MALICIOUS
+/**
+ * Should this peer act malicious?
+ */
+unsigned int malicious;
+#endif
+
+
+/**
+ * Receive the HELLO from transport service, free current and replace
+ * if necessary.
+ *
+ * @param cls NULL
+ * @param message HELLO message of peer
+ */
+static void
+process_hello (void *cls, const struct GNUNET_MessageHeader *message)
+{
+ GNUNET_assert (message != NULL);
+ GNUNET_free_non_null (GDS_my_hello);
+ GDS_my_hello = GNUNET_malloc (ntohs (message->size));
+ memcpy (GDS_my_hello, message, ntohs (message->size));
+}
+
+
+/**
+ * Task run during shutdown.
+ *
+ * @param cls unused
+ * @param tc unused
+ */
+static void
+shutdown_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+{
+ if (NULL != ghh)
+ {
+ GNUNET_TRANSPORT_get_hello_cancel (ghh);
+ ghh = NULL;
+ }
+ if (GDS_transport_handle != NULL)
+ {
+ GNUNET_TRANSPORT_disconnect (GDS_transport_handle);
+ GDS_transport_handle = NULL;
+ }
+
+ GDS_NEIGHBOURS_done ();
+ GDS_DATACACHE_done ();
+ GDS_ROUTING_done ();
+ GDS_HELLO_done ();
+ GDS_NSE_done ();
+ if (GDS_block_context != NULL)
+ {
+ GNUNET_BLOCK_context_destroy (GDS_block_context);
+ GDS_block_context = NULL;
+ }
+ if (GDS_stats != NULL)
+ {
+ GNUNET_STATISTICS_destroy (GDS_stats, GNUNET_YES);
+ GDS_stats = NULL;
+ }
+ GNUNET_free_non_null (GDS_my_hello);
+ GDS_my_hello = NULL;
+}
+
+
+/**
+ * Process dht requests.
+ *
+ * @param cls closure
+ * @param server the initialized server
+ * @param c configuration to use
+ */
+static void
+run (void *cls, struct GNUNET_SERVER_Handle *server,
+ const struct GNUNET_CONFIGURATION_Handle *c)
+{
+ unsigned long long _track_topology;
+ GDS_cfg = c;
+ if (GNUNET_OK !=
+ GNUNET_CONFIGURATION_get_value_time (c, "transport", "HELLO_EXPIRATION",
&hello_expiration))
+ {
+ hello_expiration = GNUNET_CONSTANTS_HELLO_ADDRESS_EXPIRATION;
+ }
+ GDS_block_context = GNUNET_BLOCK_context_create (GDS_cfg);
+ GDS_stats = GNUNET_STATISTICS_create ("dht", GDS_cfg);
+ GDS_ROUTING_init ();
+ GDS_NSE_init ();
+ GDS_DATACACHE_init ();
+ GDS_HELLO_init ();
+ GDS_CLIENTS_init (server);
+ if (GNUNET_OK ==
+ GNUNET_CONFIGURATION_get_value_number (c, "xdht", "track_toplogy",
+ &_track_topology))
+ {
+ track_topology = (unsigned int) _track_topology;
+ }
+ if (GNUNET_OK != GDS_NEIGHBOURS_init ())
+ {
+ shutdown_task (NULL, NULL);
+ return;
+ }
+ GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, &shutdown_task,
+ NULL);
+ GDS_transport_handle =
+ GNUNET_TRANSPORT_connect (GDS_cfg, NULL, NULL, NULL, NULL, NULL);
+ if (GDS_transport_handle == NULL)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+ _("Failed to connect to transport service!\n"));
+ return;
+ }
+ ghh = GNUNET_TRANSPORT_get_hello (GDS_transport_handle, &process_hello,
NULL);
+}
+
+
+/**
+ * The main function for the dht service.
+ *
+ * @param argc number of arguments from the command line
+ * @param argv command line arguments
+ * @return 0 ok, 1 on error
+ */
+int
+main (int argc, char *const *argv)
+{
+ int ret;
+
+ ret =
+ (GNUNET_OK ==
+ GNUNET_SERVICE_run (argc, argv, "dht", GNUNET_SERVICE_OPTION_NONE, &run,
+ NULL)) ? 0 : 1;
+ GDS_CLIENTS_done ();
+ return ret;
+}
+
+/* end of gnunet-service-dht.c */
Added: gnunet/src/dht/gnunet-service-wdht.h
===================================================================
--- gnunet/src/dht/gnunet-service-wdht.h (rev 0)
+++ gnunet/src/dht/gnunet-service-wdht.h 2015-04-27 11:12:21 UTC (rev
35559)
@@ -0,0 +1,60 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2011 Christian Grothoff (and other contributing authors)
+
+ GNUnet is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 3, or (at your
+ option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNUnet; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+/**
+ * @file dht/gnunet-service-xdht.h
+ * @brief GNUnet DHT globals
+ * @author Christian Grothoff
+ */
+#ifndef GNUNET_SERVICE_XDHT_H
+#define GNUNET_SERVICE_XDHT_H
+
+#include "gnunet_util_lib.h"
+#include "gnunet_statistics_service.h"
+#include "gnunet_transport_service.h"
+
+#define DEBUG_DHT GNUNET_EXTRA_LOGGING
+
+/**
+ * Configuration we use.
+ */
+extern const struct GNUNET_CONFIGURATION_Handle *GDS_cfg;
+
+/**
+ * Our handle to the BLOCK library.
+ */
+extern struct GNUNET_BLOCK_Context *GDS_block_context;
+
+/**
+ * Handle for the statistics service.
+ */
+extern struct GNUNET_STATISTICS_Handle *GDS_stats;
+
+/**
+ * Our HELLO
+ */
+extern struct GNUNET_MessageHeader *GDS_my_hello;
+
+/**
+ * Handle to the transport service, for getting our hello
+ */
+extern struct GNUNET_TRANSPORT_Handle *GDS_transport_handle;
+
+#endif
Added: gnunet/src/dht/gnunet-service-wdht_clients.c
===================================================================
--- gnunet/src/dht/gnunet-service-wdht_clients.c
(rev 0)
+++ gnunet/src/dht/gnunet-service-wdht_clients.c 2015-04-27 11:12:21 UTC
(rev 35559)
@@ -0,0 +1,1449 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2009, 2010, 2011 Christian Grothoff (and other contributing
authors)
+
+ GNUnet is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 3, or (at your
+ option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNUnet; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+/**
+ * @file dht/gnunet-service-dht_clients.c
+ * @brief GNUnet DHT service's client management code
+ * @author Christian Grothoff
+ * @author Nathan Evans
+ */
+
+#include "platform.h"
+#include "gnunet_constants.h"
+#include "gnunet_protocols.h"
+#include "gnunet_statistics_service.h"
+#include "gnunet-service-wdht.h"
+#include "gnunet-service-wdht_clients.h"
+#include "gnunet-service-wdht_datacache.h"
+#include "gnunet-service-wdht_neighbours.h"
+#include "dht.h"
+
+
+/**
+ * Should routing details be logged to stderr (for debugging)?
+ */
+#define LOG_TRAFFIC(kind,...) GNUNET_log_from (kind, "dht-traffic",__VA_ARGS__)
+
+#define LOG(kind,...) GNUNET_log_from (kind, "dht-clients",__VA_ARGS__)
+
+#define DEBUG(...) \
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, __VA_ARGS__)
+
+/**
+ * Linked list of messages to send to clients.
+ */
+struct PendingMessage
+{
+ /**
+ * Pointer to next item in the list
+ */
+ struct PendingMessage *next;
+
+ /**
+ * Pointer to previous item in the list
+ */
+ struct PendingMessage *prev;
+
+ /**
+ * Actual message to be sent, allocated at the end of the struct:
+ * // msg = (cast) &pm[1];
+ * // memcpy (&pm[1], data, len);
+ */
+ const struct GNUNET_MessageHeader *msg;
+
+};
+
+
+/**
+ * Struct containing information about a client,
+ * handle to connect to it, and any pending messages
+ * that need to be sent to it.
+ */
+struct ClientList
+{
+ /**
+ * Linked list of active clients
+ */
+ struct ClientList *next;
+
+ /**
+ * Linked list of active clients
+ */
+ struct ClientList *prev;
+
+ /**
+ * The handle to this client
+ */
+ struct GNUNET_SERVER_Client *client_handle;
+
+ /**
+ * Handle to the current transmission request, NULL
+ * if none pending.
+ */
+ struct GNUNET_SERVER_TransmitHandle *transmit_handle;
+
+ /**
+ * Linked list of pending messages for this client
+ */
+ struct PendingMessage *pending_head;
+
+ /**
+ * Tail of linked list of pending messages for this client
+ */
+ struct PendingMessage *pending_tail;
+
+};
+
+
+/**
+ * Entry in the local forwarding map for a client's GET request.
+ */
+struct ClientQueryRecord
+{
+
+ /**
+ * The key this request was about
+ */
+ struct GNUNET_HashCode key;
+
+ /**
+ * Client responsible for the request.
+ */
+ struct ClientList *client;
+
+ /**
+ * Extended query (see gnunet_block_lib.h), allocated at the end of this
struct.
+ */
+ const void *xquery;
+
+ /**
+ * Replies we have already seen for this request.
+ */
+ struct GNUNET_HashCode *seen_replies;
+
+ /**
+ * Pointer to this nodes heap location in the retry-heap (for fast removal)
+ */
+ struct GNUNET_CONTAINER_HeapNode *hnode;
+
+ /**
+ * What's the delay between re-try operations that we currently use for this
+ * request?
+ */
+ struct GNUNET_TIME_Relative retry_frequency;
+
+ /**
+ * What's the next time we should re-try this request?
+ */
+ struct GNUNET_TIME_Absolute retry_time;
+
+ /**
+ * The unique identifier of this request
+ */
+ uint64_t unique_id;
+
+ /**
+ * Number of bytes in xquery.
+ */
+ size_t xquery_size;
+
+ /**
+ * Number of entries in 'seen_replies'.
+ */
+ unsigned int seen_replies_count;
+
+ /**
+ * Desired replication level
+ */
+ uint32_t replication;
+
+ /**
+ * Any message options for this request
+ */
+ uint32_t msg_options;
+
+ /**
+ * The type for the data for the GET request.
+ */
+ enum GNUNET_BLOCK_Type type;
+
+};
+
+
+/**
+ * Struct containing paremeters of monitoring requests.
+ */
+struct ClientMonitorRecord
+{
+
+ /**
+ * Next element in DLL.
+ */
+ struct ClientMonitorRecord *next;
+
+ /**
+ * Previous element in DLL.
+ */
+ struct ClientMonitorRecord *prev;
+
+ /**
+ * Type of blocks that are of interest
+ */
+ enum GNUNET_BLOCK_Type type;
+
+ /**
+ * Key of data of interest, NULL for all.
+ */
+ struct GNUNET_HashCode *key;
+
+ /**
+ * Flag whether to notify about GET messages.
+ */
+ int16_t get;
+
+ /**
+ * Flag whether to notify about GET_REPONSE messages.
+ */
+ int16_t get_resp;
+
+ /**
+ * Flag whether to notify about PUT messages.
+ */
+ uint16_t put;
+
+ /**
+ * Client to notify of these requests.
+ */
+ struct ClientList *client;
+};
+
+
+/**
+ * List of active clients.
+ */
+static struct ClientList *client_head;
+
+/**
+ * List of active clients.
+ */
+static struct ClientList *client_tail;
+
+/**
+ * List of active monitoring requests.
+ */
+static struct ClientMonitorRecord *monitor_head;
+
+/**
+ * List of active monitoring requests.
+ */
+static struct ClientMonitorRecord *monitor_tail;
+
+/**
+ * Hashmap for fast key based lookup, maps keys to `struct ClientQueryRecord`
entries.
+ */
+static struct GNUNET_CONTAINER_MultiHashMap *forward_map;
+
+/**
+ * Heap with all of our client's request, sorted by retry time (earliest on
top).
+ */
+static struct GNUNET_CONTAINER_Heap *retry_heap;
+
+/**
+ * Task that re-transmits requests (using retry_heap).
+ */
+static struct GNUNET_SCHEDULER_Task * retry_task;
+
+
+/**
+ * Task run to check for messages that need to be sent to a client.
+ *
+ * @param client a ClientList, containing the client and any messages to be
sent to it
+ */
+static void
+process_pending_messages (struct ClientList *client);
+
+
+/**
+ * Callback called as a result of issuing a GNUNET_SERVER_notify_transmit_ready
+ * request. A ClientList is passed as closure, take the head of the list
+ * and copy it into buf, which has the result of sending the message to the
+ * client.
+ *
+ * @param cls closure to this call
+ * @param size maximum number of bytes available to send
+ * @param buf where to copy the actual message to
+ *
+ * @return the number of bytes actually copied, 0 indicates failure
+ */
+static size_t
+send_reply_to_client (void *cls, size_t size, void *buf)
+{
+ struct ClientList *client = cls;
+ char *cbuf = buf;
+ struct PendingMessage *reply;
+ size_t off;
+ size_t msize;
+
+ client->transmit_handle = NULL;
+ if (buf == NULL)
+ {
+ /* client disconnected */
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Client %p disconnected, pending messages will be discarded\n",
+ client->client_handle);
+ return 0;
+ }
+ off = 0;
+ while ((NULL != (reply = client->pending_head)) &&
+ (size >= off + (msize = ntohs (reply->msg->size))))
+ {
+ GNUNET_CONTAINER_DLL_remove (client->pending_head, client->pending_tail,
+ reply);
+ memcpy (&cbuf[off], reply->msg, msize);
+ GNUNET_free (reply);
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Transmitting %u bytes to client
%p\n",
+ msize, client->client_handle);
+ off += msize;
+ }
+ process_pending_messages (client);
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Transmitted %u/%u bytes to client
%p\n",
+ (unsigned int) off, (unsigned int) size, client->client_handle);
+ return off;
+}
+
+
+/**
+ * Task run to check for messages that need to be sent to a client.
+ *
+ * @param client a ClientList, containing the client and any messages to be
sent to it
+ */
+static void
+process_pending_messages (struct ClientList *client)
+{
+ if ((client->pending_head == NULL) || (client->transmit_handle != NULL))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Not asking for transmission to %p now: %s\n",
+ client->client_handle,
+ client->pending_head ==
+ NULL ? "no more messages" : "request already pending");
+ return;
+ }
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Asking for transmission of %u bytes to client %p\n",
+ ntohs (client->pending_head->msg->size), client->client_handle);
+ client->transmit_handle =
+ GNUNET_SERVER_notify_transmit_ready (client->client_handle,
+ ntohs (client->pending_head->
+ msg->size),
+ GNUNET_TIME_UNIT_FOREVER_REL,
+ &send_reply_to_client, client);
+}
+
+
+/**
+ * Add a PendingMessage to the clients list of messages to be sent
+ *
+ * @param client the active client to send the message to
+ * @param pending_message the actual message to send
+ */
+static void
+add_pending_message (struct ClientList *client,
+ struct PendingMessage *pending_message)
+{
+ GNUNET_CONTAINER_DLL_insert_tail (client->pending_head, client->pending_tail,
+ pending_message);
+ process_pending_messages (client);
+}
+
+
+/**
+ * Closure for 'forward_reply'
+ */
+struct ForwardReplyContext
+{
+
+ /**
+ * Actual message to send to matching clients.
+ */
+ struct PendingMessage *pm;
+
+ /**
+ * Embedded payload.
+ */
+ const void *data;
+
+ /**
+ * Type of the data.
+ */
+ enum GNUNET_BLOCK_Type type;
+
+ /**
+ * Number of bytes in data.
+ */
+ size_t data_size;
+
+ /**
+ * Do we need to copy 'pm' because it was already used?
+ */
+ int do_copy;
+
+};
+
+
+/**
+ * Find a client if it exists, add it otherwise.
+ *
+ * @param client the server handle to the client
+ *
+ * @return the client if found, a new client otherwise
+ */
+static struct ClientList *
+find_active_client (struct GNUNET_SERVER_Client *client)
+{
+ struct ClientList *pos = client_head;
+ struct ClientList *ret;
+
+ while (pos != NULL)
+ {
+ if (pos->client_handle == client)
+ return pos;
+ pos = pos->next;
+ }
+ ret = GNUNET_new (struct ClientList);
+ ret->client_handle = client;
+ GNUNET_CONTAINER_DLL_insert (client_head, client_tail, ret);
+ return ret;
+}
+
+
+/**
+ * Iterator over hash map entries that frees all entries
+ * associated with the given client.
+ *
+ * @param cls client to search for in source routes
+ * @param key current key code (ignored)
+ * @param value value in the hash map, a ClientQueryRecord
+ * @return #GNUNET_YES (we should continue to iterate)
+ */
+static int
+remove_client_records (void *cls, const struct GNUNET_HashCode * key, void
*value)
+{
+ struct ClientList *client = cls;
+ struct ClientQueryRecord *record = value;
+
+ if (record->client != client)
+ return GNUNET_YES;
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Removing client %p's record for key %s\n", client,
+ GNUNET_h2s (key));
+ GNUNET_assert (GNUNET_YES ==
+ GNUNET_CONTAINER_multihashmap_remove (forward_map, key,
+ record));
+ if (NULL != record->hnode)
+ GNUNET_CONTAINER_heap_remove_node (record->hnode);
+ GNUNET_array_grow (record->seen_replies, record->seen_replies_count, 0);
+ GNUNET_free (record);
+ return GNUNET_YES;
+}
+
+
+/**
+ * Iterator over hash map entries that send a given reply to
+ * each of the matching clients. With some tricky recycling
+ * of the buffer.
+ *
+ * @param cls the 'struct ForwardReplyContext'
+ * @param key current key
+ * @param value value in the hash map, a ClientQueryRecord
+ * @return GNUNET_YES (we should continue to iterate),
+ * if the result is mal-formed, GNUNET_NO
+ */
+static int
+forward_reply (void *cls, const struct GNUNET_HashCode * key, void *value)
+{
+ struct ForwardReplyContext *frc = cls;
+ struct ClientQueryRecord *record = value;
+ struct PendingMessage *pm;
+ struct GNUNET_DHT_ClientResultMessage *reply;
+ enum GNUNET_BLOCK_EvaluationResult eval;
+ int do_free;
+ struct GNUNET_HashCode ch;
+ unsigned int i;
+
+ LOG_TRAFFIC (GNUNET_ERROR_TYPE_DEBUG,
+ "XVINE CLIENT-RESULT %s\n",
+ GNUNET_h2s_full (key));
+#if 0
+ if ((record->type != GNUNET_BLOCK_TYPE_ANY) && (record->type != frc->type))
+ {
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Record type missmatch, not passing request for key %s to local
client\n",
+ GNUNET_h2s (key));
+
+ GNUNET_STATISTICS_update (GDS_stats,
+ gettext_noop
+ ("# Key match, type mismatches in REPLY to
CLIENT"),
+ 1, GNUNET_NO);
+ return GNUNET_YES; /* type mismatch */
+ }
+#endif
+ GNUNET_CRYPTO_hash (frc->data, frc->data_size, &ch);
+ for (i = 0; i < record->seen_replies_count; i++)
+ if (0 == memcmp (&record->seen_replies[i], &ch, sizeof (struct
GNUNET_HashCode)))
+ {
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Duplicate reply, not passing request for key %s to local client\n",
+ GNUNET_h2s (key));
+ GNUNET_STATISTICS_update (GDS_stats,
+ gettext_noop
+ ("# Duplicate REPLIES to CLIENT request
dropped"),
+ 1, GNUNET_NO);
+ return GNUNET_YES; /* duplicate */
+ }
+ eval =
+ GNUNET_BLOCK_evaluate (GDS_block_context,
+ record->type,
+ GNUNET_BLOCK_EO_NONE,
+ key, NULL, 0,
+ record->xquery,
+ record->xquery_size,
+ frc->data,
+ frc->data_size);
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Evaluation result is %d for key %s for local client's query\n",
+ (int) eval, GNUNET_h2s (key));
+ switch (eval)
+ {
+ case GNUNET_BLOCK_EVALUATION_OK_LAST:
+ do_free = GNUNET_YES;
+ break;
+ case GNUNET_BLOCK_EVALUATION_OK_MORE:
+ GNUNET_array_append (record->seen_replies, record->seen_replies_count, ch);
+ do_free = GNUNET_NO;
+ break;
+ case GNUNET_BLOCK_EVALUATION_OK_DUPLICATE:
+ /* should be impossible to encounter here */
+ GNUNET_break (0);
+ return GNUNET_YES;
+ case GNUNET_BLOCK_EVALUATION_RESULT_INVALID:
+ GNUNET_break_op (0);
+ return GNUNET_NO;
+ case GNUNET_BLOCK_EVALUATION_REQUEST_VALID:
+ GNUNET_break (0);
+ return GNUNET_NO;
+ case GNUNET_BLOCK_EVALUATION_REQUEST_INVALID:
+ GNUNET_break (0);
+ return GNUNET_NO;
+ case GNUNET_BLOCK_EVALUATION_RESULT_IRRELEVANT:
+ return GNUNET_YES;
+ case GNUNET_BLOCK_EVALUATION_TYPE_NOT_SUPPORTED:
+ GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+ _("Unsupported block type (%u) in request!\n"), record->type);
+ return GNUNET_NO;
+ default:
+ GNUNET_break (0);
+ return GNUNET_NO;
+ }
+ if (GNUNET_NO == frc->do_copy)
+ {
+ /* first time, we can use the original data */
+ pm = frc->pm;
+ frc->do_copy = GNUNET_YES;
+ }
+ else
+ {
+ /* two clients waiting for same reply, must copy for queueing */
+ pm = GNUNET_malloc (sizeof (struct PendingMessage) +
+ ntohs (frc->pm->msg->size));
+ memcpy (pm, frc->pm,
+ sizeof (struct PendingMessage) + ntohs (frc->pm->msg->size));
+ pm->next = pm->prev = NULL;
+ pm->msg = (struct GNUNET_MessageHeader *) &pm[1];
+ }
+ GNUNET_STATISTICS_update (GDS_stats,
+ gettext_noop ("# RESULTS queued for clients"), 1,
+ GNUNET_NO);
+ reply = (struct GNUNET_DHT_ClientResultMessage *) &pm[1];
+ reply->unique_id = record->unique_id;
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Queueing reply to query %s for client %p\n",
+ GNUNET_h2s (key),
+ record->client->client_handle);
+ add_pending_message (record->client, pm);
+ if (GNUNET_YES == do_free)
+ remove_client_records (record->client, key, record);
+ return GNUNET_YES;
+}
+
+
+/**
+ * Handle a reply we've received from another peer. If the reply
+ * matches any of our pending queries, forward it to the respective
+ * client(s).
+ *
+ * @param expiration when will the reply expire
+ * @param key the query this reply is for
+ * @param get_path_length number of peers in @a get_path
+ * @param get_path path the reply took on get
+ * @param put_path_length number of peers in @a put_path
+ * @param put_path path the reply took on put
+ * @param type type of the reply
+ * @param data_size number of bytes in @a data
+ * @param data application payload data
+ */
+void
+GDS_CLIENTS_handle_reply (struct GNUNET_TIME_Absolute expiration,
+ const struct GNUNET_HashCode *key,
+ unsigned int get_path_length,
+ const struct GNUNET_PeerIdentity *get_path,
+ unsigned int put_path_length,
+ const struct GNUNET_PeerIdentity *put_path,
+ enum GNUNET_BLOCK_Type type, size_t data_size,
+ const void *data)
+{
+ struct ForwardReplyContext frc;
+ struct PendingMessage *pm;
+ struct GNUNET_DHT_ClientResultMessage *reply;
+ struct GNUNET_PeerIdentity *paths;
+ size_t msize;
+
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "reply for key %s\n",
+ GNUNET_h2s (key));
+
+ if (NULL == GNUNET_CONTAINER_multihashmap_get (forward_map, key))
+ {
+ GNUNET_STATISTICS_update (GDS_stats,
+ gettext_noop
+ ("# REPLIES ignored for CLIENTS (no match)"), 1,
+ GNUNET_NO);
+ return; /* no matching request, fast exit! */
+ }
+ msize =
+ sizeof (struct GNUNET_DHT_ClientResultMessage) + data_size +
+ (get_path_length + put_path_length) * sizeof (struct
GNUNET_PeerIdentity);
+ if (msize >= GNUNET_SERVER_MAX_MESSAGE_SIZE)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+ _("Could not pass reply to client, message too big!\n"));
+ return;
+ }
+ DEBUG("reply FOR DATA_SIZE = %lu\n",msize);
+ pm = GNUNET_malloc (msize + sizeof (struct PendingMessage));
+ reply = (struct GNUNET_DHT_ClientResultMessage *) &pm[1];
+ pm->msg = &reply->header;
+ reply->header.size = htons ((uint16_t) msize);
+ reply->header.type = htons (GNUNET_MESSAGE_TYPE_DHT_CLIENT_RESULT);
+ reply->type = htonl (type);
+ reply->get_path_length = htonl (get_path_length);
+ reply->put_path_length = htonl (put_path_length);
+ reply->unique_id = 0; /* filled in later */
+ reply->expiration = GNUNET_TIME_absolute_hton (expiration);
+ reply->key = *key;
+ paths = (struct GNUNET_PeerIdentity *) &reply[1];
+ memcpy (paths, put_path,
+ sizeof (struct GNUNET_PeerIdentity) * put_path_length);
+ memcpy (&paths[put_path_length], get_path,
+ sizeof (struct GNUNET_PeerIdentity) * get_path_length);
+ memcpy (&paths[get_path_length + put_path_length], data, data_size);
+ frc.do_copy = GNUNET_NO;
+ frc.pm = pm;
+ frc.data = data;
+ frc.data_size = data_size;
+ frc.type = type;
+ GNUNET_CONTAINER_multihashmap_get_multiple (forward_map, key, &forward_reply,
+ &frc);
+ if (GNUNET_NO == frc.do_copy)
+ {
+ /* did not match any of the requests, free! */
+ GNUNET_STATISTICS_update (GDS_stats,
+ gettext_noop
+ ("# REPLIES ignored for CLIENTS (no match)"), 1,
+ GNUNET_NO);
+ GNUNET_free (pm);
+ }
+}
+
+/**
+ * Check if some client is monitoring GET messages and notify
+ * them in that case.
+ *
+ * @param options Options, for instance RecordRoute, DemultiplexEverywhere.
+ * @param type The type of data in the request.
+ * @param hop_count Hop count so far.
+ * @param path_length number of entries in path (or 0 if not recorded).
+ * @param path peers on the GET path (or NULL if not recorded).
+ * @param desired_replication_level Desired replication level.
+ * @param key Key of the requested data.
+ */
+void
+GDS_CLIENTS_process_get (uint32_t options,
+ enum GNUNET_BLOCK_Type type,
+ uint32_t hop_count,
+ uint32_t desired_replication_level,
+ unsigned int path_length,
+ const struct GNUNET_PeerIdentity *path,
+ const struct GNUNET_HashCode * key)
+{
+ struct ClientMonitorRecord *m;
+ struct ClientList **cl;
+ unsigned int cl_size;
+
+ cl = NULL;
+ cl_size = 0;
+ for (m = monitor_head; NULL != m; m = m->next)
+ {
+ if ((GNUNET_BLOCK_TYPE_ANY == m->type || m->type == type) &&
+ (NULL == m->key ||
+ memcmp (key, m->key, sizeof(struct GNUNET_HashCode)) == 0))
+ {
+ struct PendingMessage *pm;
+ struct GNUNET_DHT_MonitorGetMessage *mmsg;
+ struct GNUNET_PeerIdentity *msg_path;
+ size_t msize;
+ unsigned int i;
+
+ /* Don't send duplicates */
+ for (i = 0; i < cl_size; i++)
+ if (cl[i] == m->client)
+ break;
+ if (i < cl_size)
+ continue;
+ GNUNET_array_append (cl, cl_size, m->client);
+
+ msize = path_length * sizeof (struct GNUNET_PeerIdentity);
+ msize += sizeof (struct GNUNET_DHT_MonitorGetMessage);
+ msize += sizeof (struct PendingMessage);
+ pm = GNUNET_malloc (msize);
+ mmsg = (struct GNUNET_DHT_MonitorGetMessage *) &pm[1];
+ pm->msg = &mmsg->header;
+ mmsg->header.size = htons (msize - sizeof (struct PendingMessage));
+ mmsg->header.type = htons (GNUNET_MESSAGE_TYPE_DHT_MONITOR_GET);
+ mmsg->options = htonl(options);
+ mmsg->type = htonl(type);
+ mmsg->hop_count = htonl(hop_count);
+ mmsg->desired_replication_level = htonl(desired_replication_level);
+ mmsg->get_path_length = htonl(path_length);
+ memcpy (&mmsg->key, key, sizeof (struct GNUNET_HashCode));
+ msg_path = (struct GNUNET_PeerIdentity *) &mmsg[1];
+ if (path_length > 0)
+ memcpy (msg_path, path,
+ path_length * sizeof (struct GNUNET_PeerIdentity));
+ add_pending_message (m->client, pm);
+ }
+ }
+ GNUNET_free_non_null (cl);
+}
+
+
+/**
+ * Check if some client is monitoring PUT messages and notify
+ * them in that case.
+ *
+ * @param options Options, for instance RecordRoute, DemultiplexEverywhere.
+ * @param type The type of data in the request.
+ * @param hop_count Hop count so far.
+ * @param path_length number of entries in path (or 0 if not recorded).
+ * @param path peers on the PUT path (or NULL if not recorded).
+ * @param desired_replication_level Desired replication level.
+ * @param exp Expiration time of the data.
+ * @param key Key under which data is to be stored.
+ * @param data Pointer to the data carried.
+ * @param size Number of bytes in data.
+ */
+void
+GDS_CLIENTS_process_put (uint32_t options,
+ enum GNUNET_BLOCK_Type type,
+ uint32_t hop_count,
+ uint32_t desired_replication_level,
+ unsigned int path_length,
+ const struct GNUNET_PeerIdentity *path,
+ struct GNUNET_TIME_Absolute exp,
+ const struct GNUNET_HashCode * key,
+ const void *data,
+ size_t size)
+{
+ struct ClientMonitorRecord *m;
+ struct ClientList **cl;
+ unsigned int cl_size;
+
+ cl = NULL;
+ cl_size = 0;
+ for (m = monitor_head; NULL != m; m = m->next)
+ {
+ if ((GNUNET_BLOCK_TYPE_ANY == m->type || m->type == type) &&
+ (NULL == m->key ||
+ memcmp (key, m->key, sizeof(struct GNUNET_HashCode)) == 0))
+ {
+ struct PendingMessage *pm;
+ struct GNUNET_DHT_MonitorPutMessage *mmsg;
+ struct GNUNET_PeerIdentity *msg_path;
+ size_t msize;
+ unsigned int i;
+
+ /* Don't send duplicates */
+ for (i = 0; i < cl_size; i++)
+ if (cl[i] == m->client)
+ break;
+ if (i < cl_size)
+ continue;
+ GNUNET_array_append (cl, cl_size, m->client);
+
+ msize = size;
+ msize += path_length * sizeof (struct GNUNET_PeerIdentity);
+ msize += sizeof (struct GNUNET_DHT_MonitorPutMessage);
+ msize += sizeof (struct PendingMessage);
+ pm = GNUNET_malloc (msize);
+ mmsg = (struct GNUNET_DHT_MonitorPutMessage *) &pm[1];
+ pm->msg = (struct GNUNET_MessageHeader *) mmsg;
+ mmsg->header.size = htons (msize - sizeof (struct PendingMessage));
+ mmsg->header.type = htons (GNUNET_MESSAGE_TYPE_DHT_MONITOR_PUT);
+ mmsg->options = htonl(options);
+ mmsg->type = htonl(type);
+ mmsg->hop_count = htonl(hop_count);
+ mmsg->desired_replication_level = htonl(desired_replication_level);
+ mmsg->put_path_length = htonl(path_length);
+ msg_path = (struct GNUNET_PeerIdentity *) &mmsg[1];
+ if (path_length > 0)
+ {
+ memcpy (msg_path, path,
+ path_length * sizeof (struct GNUNET_PeerIdentity));
+ }
+ mmsg->expiration_time = GNUNET_TIME_absolute_hton(exp);
+ memcpy (&mmsg->key, key, sizeof (struct GNUNET_HashCode));
+ if (size > 0)
+ memcpy (&msg_path[path_length], data, size);
+ add_pending_message (m->client, pm);
+ }
+ }
+ GNUNET_free_non_null (cl);
+}
+
+
+/**
+ * Route the given request via the DHT.
+ */
+static void
+transmit_request (struct ClientQueryRecord *cqr)
+{
+ GNUNET_STATISTICS_update (GDS_stats,
+ gettext_noop
+ ("# GET requests from clients injected"), 1,
+ GNUNET_NO);
+
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Initiating GET for %s, replication %u, already have %u replies\n",
+ GNUNET_h2s (&cqr->key),
+ cqr->replication,
+ cqr->seen_replies_count);
+
+ GDS_NEIGHBOURS_handle_get (&cqr->key, cqr->type, cqr->msg_options,
+ cqr->replication);
+
+ /* exponential back-off for retries.
+ * max GNUNET_TIME_STD_EXPONENTIAL_BACKOFF_THRESHOLD (15 min) */
+ cqr->retry_frequency = GNUNET_TIME_STD_BACKOFF (cqr->retry_frequency);
+ cqr->retry_time = GNUNET_TIME_relative_to_absolute (cqr->retry_frequency);
+}
+
+
+/**
+ * Task that looks at the 'retry_heap' and transmits all of the requests
+ * on the heap that are ready for transmission. Then re-schedules
+ * itself (unless the heap is empty).
+ *
+ * @param cls unused
+ * @param tc scheduler context
+ */
+static void
+transmit_next_request_task (void *cls,
+ const struct GNUNET_SCHEDULER_TaskContext *tc)
+{
+ struct ClientQueryRecord *cqr;
+ struct GNUNET_TIME_Relative delay;
+
+ retry_task = NULL;
+ if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN))
+ return;
+ while (NULL != (cqr = GNUNET_CONTAINER_heap_remove_root (retry_heap)))
+ {
+ cqr->hnode = NULL;
+ delay = GNUNET_TIME_absolute_get_remaining (cqr->retry_time);
+ if (delay.rel_value_us > 0)
+ {
+ cqr->hnode =
+ GNUNET_CONTAINER_heap_insert (retry_heap, cqr,
+ cqr->retry_time.abs_value_us);
+ retry_task =
+ GNUNET_SCHEDULER_add_delayed (delay, &transmit_next_request_task,
+ NULL);
+ return;
+ }
+ transmit_request (cqr);
+ cqr->hnode =
+ GNUNET_CONTAINER_heap_insert (retry_heap, cqr,
+ cqr->retry_time.abs_value_us);
+ }
+}
+
+
+/**
+ * Handler for PUT messages.
+ *
+ * @param cls closure for the service
+ * @param client the client we received this message from
+ * @param message the actual message received
+ */
+static void
+handle_dht_local_put (void *cls, struct GNUNET_SERVER_Client *client,
+ const struct GNUNET_MessageHeader *message)
+{
+ const struct GNUNET_DHT_ClientPutMessage *put_msg;
+ struct PendingMessage *pm;
+ struct GNUNET_DHT_ClientPutConfirmationMessage *conf;
+ uint16_t size;
+
+ size = ntohs (message->size);
+ if (size < sizeof (struct GNUNET_DHT_ClientPutMessage))
+ {
+ GNUNET_break (0);
+ GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
+ return;
+ }
+ GNUNET_STATISTICS_update (GDS_stats,
+ gettext_noop
+ ("# PUT requests received from clients"), 1,
+ GNUNET_NO);
+ put_msg = (const struct GNUNET_DHT_ClientPutMessage *) message;
+ LOG_TRAFFIC (GNUNET_ERROR_TYPE_DEBUG, "X-VINE DHT CLIENT-PUT %s\n",
+ GNUNET_h2s_full (&put_msg->key));
+ /* give to local clients */
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Handling local PUT of %u-bytes for query %s\n",
+ size - sizeof (struct GNUNET_DHT_ClientPutMessage),
+ GNUNET_h2s (&put_msg->key));
+ DEBUG("PUT doing put i = %s\n",GNUNET_h2s(&(put_msg->key)));
+ GDS_CLIENTS_handle_reply (GNUNET_TIME_absolute_ntoh (put_msg->expiration),
+ &put_msg->key, 0, NULL, 0, NULL,
+ ntohl (put_msg->type),
+ size - sizeof (struct GNUNET_DHT_ClientPutMessage),
+ &put_msg[1]);
+
+ GDS_NEIGHBOURS_handle_put (&put_msg->key,
+ ntohl (put_msg->type), ntohl (put_msg->options),
+ ntohl (put_msg->desired_replication_level),
+ GNUNET_TIME_absolute_ntoh (put_msg->expiration),
+ &put_msg[1],
+ size - sizeof (struct
GNUNET_DHT_ClientPutMessage));
+ pm = GNUNET_malloc (sizeof (struct PendingMessage) +
+ sizeof (struct GNUNET_DHT_ClientPutConfirmationMessage));
+ conf = (struct GNUNET_DHT_ClientPutConfirmationMessage *) &pm[1];
+ conf->header.size = htons (sizeof (struct
GNUNET_DHT_ClientPutConfirmationMessage));
+ conf->header.type = htons (GNUNET_MESSAGE_TYPE_DHT_CLIENT_PUT_OK);
+ conf->reserved = htonl (0);
+ conf->unique_id = put_msg->unique_id;
+ pm->msg = &conf->header;
+ add_pending_message (find_active_client (client), pm);
+ GNUNET_SERVER_receive_done (client, GNUNET_OK);
+}
+
+
+/**
+ * Handler for DHT GET messages from the client.
+ *
+ * @param cls closure for the service
+ * @param client the client we received this message from
+ * @param message the actual message received
+ */
+static void
+handle_dht_local_get (void *cls, struct GNUNET_SERVER_Client *client,
+ const struct GNUNET_MessageHeader *message)
+{
+ const struct GNUNET_DHT_ClientGetMessage *get;
+ struct ClientQueryRecord *cqr;
+ size_t xquery_size;
+ const char *xquery;
+ uint16_t size;
+
+ size = ntohs (message->size);
+ if (size < sizeof (struct GNUNET_DHT_ClientGetMessage))
+ {
+ GNUNET_break (0);
+ GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
+ return;
+ }
+ xquery_size = size - sizeof (struct GNUNET_DHT_ClientGetMessage);
+ get = (const struct GNUNET_DHT_ClientGetMessage *) message;
+ xquery = (const char *) &get[1];
+ GNUNET_STATISTICS_update (GDS_stats,
+ gettext_noop
+ ("# GET requests received from clients"), 1,
+ GNUNET_NO);
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Received GET request for %s from local client %p, xq: %.*s\n",
+ GNUNET_h2s (&get->key), client, xquery_size, xquery);
+
+ LOG_TRAFFIC (GNUNET_ERROR_TYPE_DEBUG, "X-VINE CLIENT-GET %s\n",
+ GNUNET_h2s_full (&get->key));
+
+
+ cqr = GNUNET_malloc (sizeof (struct ClientQueryRecord) + xquery_size);
+ cqr->key = get->key;
+ cqr->client = find_active_client (client);
+ cqr->xquery = (void *) &cqr[1];
+ memcpy (&cqr[1], xquery, xquery_size);
+ cqr->hnode = GNUNET_CONTAINER_heap_insert (retry_heap, cqr, 0);
+ cqr->retry_frequency = GNUNET_TIME_UNIT_SECONDS;
+ cqr->retry_time = GNUNET_TIME_absolute_get ();
+ cqr->unique_id = get->unique_id;
+ cqr->xquery_size = xquery_size;
+ cqr->replication = ntohl (get->desired_replication_level);
+ cqr->msg_options = ntohl (get->options);
+ cqr->type = ntohl (get->type);
+
+ // FIXME use cqr->key, set multihashmap create to GNUNET_YES
+ GNUNET_CONTAINER_multihashmap_put (forward_map, &get->key, cqr,
+
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
+
+ struct GNUNET_PeerIdentity my_identity;
+ my_identity = GDS_NEIGHBOURS_get_my_id();
+ GDS_CLIENTS_process_get (ntohl (get->options),
+ ntohl (get->type),
+ 0,
+ ntohl (get->desired_replication_level),
+ 1,
+ &my_identity,
+ &get->key);
+ /* start remote requests */
+ if (NULL != retry_task)
+ GNUNET_SCHEDULER_cancel (retry_task);
+ retry_task = GNUNET_SCHEDULER_add_now (&transmit_next_request_task, NULL);
+ GNUNET_SERVER_receive_done (client, GNUNET_OK);
+}
+
+
+/**
+ * Closure for 'find_by_unique_id'.
+ */
+struct FindByUniqueIdContext
+{
+ /**
+ * Where to store the result, if found.
+ */
+ struct ClientQueryRecord *cqr;
+
+ uint64_t unique_id;
+};
+
+
+/**
+ * Function called for each existing DHT record for the given
+ * query. Checks if it matches the UID given in the closure
+ * and if so returns the entry as a result.
+ *
+ * @param cls the search context
+ * @param key query for the lookup (not used)
+ * @param value the 'struct ClientQueryRecord'
+ * @return GNUNET_YES to continue iteration (result not yet found)
+ */
+static int
+find_by_unique_id (void *cls,
+ const struct GNUNET_HashCode *key,
+ void *value)
+{
+ struct FindByUniqueIdContext *fui_ctx = cls;
+ struct ClientQueryRecord *cqr = value;
+
+ if (cqr->unique_id != fui_ctx->unique_id)
+ return GNUNET_YES;
+ fui_ctx->cqr = cqr;
+ return GNUNET_NO;
+}
+
+
+/**
+ * Handler for "GET result seen" messages from the client.
+ *
+ * @param cls closure for the service
+ * @param client the client we received this message from
+ * @param message the actual message received
+ */
+static void
+handle_dht_local_get_result_seen (void *cls, struct GNUNET_SERVER_Client
*client,
+ const struct GNUNET_MessageHeader *message)
+{
+ const struct GNUNET_DHT_ClientGetResultSeenMessage *seen;
+ uint16_t size;
+ unsigned int hash_count;
+ unsigned int old_count;
+ const struct GNUNET_HashCode *hc;
+ struct FindByUniqueIdContext fui_ctx;
+ struct ClientQueryRecord *cqr;
+
+ size = ntohs (message->size);
+ if (size < sizeof (struct GNUNET_DHT_ClientGetResultSeenMessage))
+ {
+ GNUNET_break (0);
+ GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
+ return;
+ }
+ seen = (const struct GNUNET_DHT_ClientGetResultSeenMessage *) message;
+ hash_count = (size - sizeof (struct GNUNET_DHT_ClientGetResultSeenMessage))
/ sizeof (struct GNUNET_HashCode);
+ if (size != sizeof (struct GNUNET_DHT_ClientGetResultSeenMessage) +
hash_count * sizeof (struct GNUNET_HashCode))
+ {
+ GNUNET_break (0);
+ GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
+ return;
+ }
+ hc = (const struct GNUNET_HashCode*) &seen[1];
+ fui_ctx.unique_id = seen->unique_id;
+ fui_ctx.cqr = NULL;
+ GNUNET_CONTAINER_multihashmap_get_multiple (forward_map,
+ &seen->key,
+ &find_by_unique_id,
+ &fui_ctx);
+ if (NULL == (cqr = fui_ctx.cqr))
+ {
+ GNUNET_break (0);
+ GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
+ return;
+ }
+ /* finally, update 'seen' list */
+ old_count = cqr->seen_replies_count;
+ GNUNET_array_grow (cqr->seen_replies,
+ cqr->seen_replies_count,
+ cqr->seen_replies_count + hash_count);
+ memcpy (&cqr->seen_replies[old_count],
+ hc,
+ sizeof (struct GNUNET_HashCode) * hash_count);
+}
+
+
+/**
+ * Closure for 'remove_by_unique_id'.
+ */
+struct RemoveByUniqueIdContext
+{
+ /**
+ * Client that issued the removal request.
+ */
+ struct ClientList *client;
+
+ /**
+ * Unique ID of the request.
+ */
+ uint64_t unique_id;
+};
+
+
+/**
+ * Iterator over hash map entries that frees all entries
+ * that match the given client and unique ID.
+ *
+ * @param cls unique ID and client to search for in source routes
+ * @param key current key code
+ * @param value value in the hash map, a ClientQueryRecord
+ * @return GNUNET_YES (we should continue to iterate)
+ */
+static int
+remove_by_unique_id (void *cls, const struct GNUNET_HashCode * key, void
*value)
+{
+ const struct RemoveByUniqueIdContext *ctx = cls;
+ struct ClientQueryRecord *record = value;
+
+ if (record->unique_id != ctx->unique_id)
+ return GNUNET_YES;
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Removing client %p's record for key %s (by unique id)\n",
+ ctx->client->client_handle, GNUNET_h2s (key));
+ return remove_client_records (ctx->client, key, record);
+}
+
+
+/**
+ * Handler for any generic DHT stop messages, calls the appropriate handler
+ * depending on message type (if processed locally)
+ *
+ * @param cls closure for the service
+ * @param client the client we received this message from
+ * @param message the actual message received
+ *
+ */
+static void
+handle_dht_local_get_stop (void *cls, struct GNUNET_SERVER_Client *client,
+ const struct GNUNET_MessageHeader *message)
+{
+ const struct GNUNET_DHT_ClientGetStopMessage *dht_stop_msg =
+ (const struct GNUNET_DHT_ClientGetStopMessage *) message;
+ struct RemoveByUniqueIdContext ctx;
+
+ GNUNET_STATISTICS_update (GDS_stats,
+ gettext_noop
+ ("# GET STOP requests received from clients"), 1,
+ GNUNET_NO);
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Received GET STOP request for %s from local client %p\n",
+ client, GNUNET_h2s (&dht_stop_msg->key));
+ ctx.client = find_active_client (client);
+ ctx.unique_id = dht_stop_msg->unique_id;
+ GNUNET_CONTAINER_multihashmap_get_multiple (forward_map, &dht_stop_msg->key,
+ &remove_by_unique_id, &ctx);
+ GNUNET_SERVER_receive_done (client, GNUNET_OK);
+}
+
+
+/**
+ * Handler for monitor start messages
+ *
+ * @param cls closure for the service
+ * @param client the client we received this message from
+ * @param message the actual message received
+ *
+ */
+static void
+handle_dht_local_monitor (void *cls, struct GNUNET_SERVER_Client *client,
+ const struct GNUNET_MessageHeader *message)
+{
+ struct ClientMonitorRecord *r;
+ const struct GNUNET_DHT_MonitorStartStopMessage *msg;
+
+ msg = (struct GNUNET_DHT_MonitorStartStopMessage *) message;
+ r = GNUNET_new (struct ClientMonitorRecord);
+
+ r->client = find_active_client(client);
+ r->type = ntohl(msg->type);
+ r->get = ntohs(msg->get);
+ r->get_resp = ntohs(msg->get_resp);
+ r->put = ntohs(msg->put);
+ if (0 == ntohs(msg->filter_key))
+ r->key = NULL;
+ else
+ {
+ r->key = GNUNET_new (struct GNUNET_HashCode);
+ memcpy (r->key, &msg->key, sizeof (struct GNUNET_HashCode));
+ }
+ GNUNET_CONTAINER_DLL_insert (monitor_head, monitor_tail, r);
+ GNUNET_SERVER_receive_done (client, GNUNET_OK);
+}
+
+
+/**
+ * Handler for monitor stop messages
+ *
+ * @param cls closure for the service
+ * @param client the client we received this message from
+ * @param message the actual message received
+ *
+ */
+static void
+handle_dht_local_monitor_stop (void *cls, struct GNUNET_SERVER_Client *client,
+ const struct GNUNET_MessageHeader *message)
+{
+ struct ClientMonitorRecord *r;
+ const struct GNUNET_DHT_MonitorStartStopMessage *msg;
+ int keys_match;
+
+ msg = (struct GNUNET_DHT_MonitorStartStopMessage *) message;
+ r = monitor_head;
+
+ while (NULL != r)
+ {
+ if (NULL == r->key)
+ keys_match = (0 == ntohs(msg->filter_key));
+ else
+ {
+ keys_match = (0 != ntohs(msg->filter_key)
+ && !memcmp(r->key, &msg->key, sizeof(struct
GNUNET_HashCode)));
+ }
+ if (find_active_client(client) == r->client
+ && ntohl(msg->type) == r->type
+ && r->get == msg->get
+ && r->get_resp == msg->get_resp
+ && r->put == msg->put
+ && keys_match
+ )
+ {
+ GNUNET_CONTAINER_DLL_remove (monitor_head, monitor_tail, r);
+ GNUNET_free_non_null (r->key);
+ GNUNET_free (r);
+ GNUNET_SERVER_receive_done (client, GNUNET_OK);
+ return; /* Delete only ONE entry */
+ }
+ r = r->next;
+ }
+
+ GNUNET_SERVER_receive_done (client, GNUNET_OK);
+}
+
+
+#if ENABLE_MALICIOUS
+/**
+ * Handler for act malicious message.
+ *
+ * @param cls closure for the service
+ * @param client the client we received this message from
+ * @param message the actual message received
+ *
+ */
+static void
+handle_dht_act_malicious (void *cls, struct GNUNET_SERVER_Client *client,
+ const struct GNUNET_MessageHeader *message)
+{
+ const struct GNUNET_DHT_ActMaliciousMessage *msg;
+ struct PendingMessage *pm;
+ struct GNUNET_DHT_ClientActMaliciousConfirmationMessage *conf;
+ unsigned int malicious_action;
+
+ msg = (const struct GNUNET_DHT_ActMaliciousMessage *)message;
+ malicious_action = msg->action;
+
+ if(GNUNET_OK == GDS_NEIGHBOURS_act_malicious (malicious_action))
+ {
+ pm = GNUNET_malloc (sizeof (struct PendingMessage) +
+ sizeof (struct
GNUNET_DHT_ClientActMaliciousConfirmationMessage));
+ conf = (struct GNUNET_DHT_ClientActMaliciousConfirmationMessage *) &pm[1];
+ conf->header.size = htons (sizeof (struct
GNUNET_DHT_ClientActMaliciousConfirmationMessage));
+ conf->header.type = htons
(GNUNET_MESSAGE_TYPE_DHT_CLIENT_ACT_MALICIOUS_OK);
+ pm->msg = &conf->header;
+ add_pending_message (find_active_client (client), pm);
+ GNUNET_SERVER_receive_done (client, GNUNET_OK);
+ }
+}
+#endif
+
+
+/**
+ * Functions with this signature are called whenever a client
+ * is disconnected on the network level.
+ *
+ * @param cls closure (NULL for dht)
+ * @param client identification of the client; NULL
+ * for the last call when the server is destroyed
+ */
+static void
+handle_client_disconnect (void *cls,
+ struct GNUNET_SERVER_Client *client)
+{
+ struct ClientList *pos;
+ struct PendingMessage *reply;
+ struct ClientMonitorRecord *monitor;
+
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Local client %p disconnects\n",
+ client);
+ pos = find_active_client (client);
+ GNUNET_CONTAINER_DLL_remove (client_head, client_tail, pos);
+ if (pos->transmit_handle != NULL)
+ GNUNET_SERVER_notify_transmit_ready_cancel (pos->transmit_handle);
+ while (NULL != (reply = pos->pending_head))
+ {
+ GNUNET_CONTAINER_DLL_remove (pos->pending_head, pos->pending_tail, reply);
+ GNUNET_free (reply);
+ }
+ monitor = monitor_head;
+ while (NULL != monitor)
+ {
+ if (monitor->client == pos)
+ {
+ struct ClientMonitorRecord *next;
+
+ GNUNET_free_non_null (monitor->key);
+ next = monitor->next;
+ GNUNET_CONTAINER_DLL_remove (monitor_head, monitor_tail, monitor);
+ GNUNET_free (monitor);
+ monitor = next;
+ }
+ else
+ monitor = monitor->next;
+ }
+ GNUNET_CONTAINER_multihashmap_iterate (forward_map, &remove_client_records,
+ pos);
+ GNUNET_free (pos);
+}
+
+
+
+/**
+ * Initialize client subsystem.
+ *
+ * @param server the initialized server
+ */
+void
+GDS_CLIENTS_init (struct GNUNET_SERVER_Handle *server)
+{
+ static struct GNUNET_SERVER_MessageHandler plugin_handlers[] = {
+ {&handle_dht_local_put, NULL,
+ GNUNET_MESSAGE_TYPE_DHT_CLIENT_PUT, 0},
+ {&handle_dht_local_get, NULL,
+ GNUNET_MESSAGE_TYPE_DHT_CLIENT_GET, 0},
+ {&handle_dht_local_get_stop, NULL,
+ GNUNET_MESSAGE_TYPE_DHT_CLIENT_GET_STOP,
+ sizeof (struct GNUNET_DHT_ClientGetStopMessage)},
+ {&handle_dht_local_monitor, NULL,
+ GNUNET_MESSAGE_TYPE_DHT_MONITOR_START,
+ sizeof (struct GNUNET_DHT_MonitorStartStopMessage)},
+ {&handle_dht_local_monitor_stop, NULL,
+ GNUNET_MESSAGE_TYPE_DHT_MONITOR_STOP,
+ sizeof (struct GNUNET_DHT_MonitorStartStopMessage)},
+ {&handle_dht_local_get_result_seen, NULL,
+ GNUNET_MESSAGE_TYPE_DHT_CLIENT_GET_RESULTS_KNOWN, 0},
+ #if ENABLE_MALICIOUS
+ {&handle_dht_act_malicious, NULL,
+ GNUNET_MESSAGE_TYPE_DHT_ACT_MALICIOUS,
+ sizeof (struct GNUNET_DHT_ActMaliciousMessage)},
+ #endif
+ {NULL, NULL, 0, 0}
+ };
+ forward_map = GNUNET_CONTAINER_multihashmap_create (1024, GNUNET_NO);
+ retry_heap = GNUNET_CONTAINER_heap_create (GNUNET_CONTAINER_HEAP_ORDER_MIN);
+ GNUNET_SERVER_add_handlers (server, plugin_handlers);
+ GNUNET_SERVER_disconnect_notify (server, &handle_client_disconnect, NULL);
+}
+
+
+/**
+ * Shutdown client subsystem.
+ */
+void
+GDS_CLIENTS_done ()
+{
+ GNUNET_assert (client_head == NULL);
+ GNUNET_assert (client_tail == NULL);
+ if (NULL != retry_task)
+ {
+ GNUNET_SCHEDULER_cancel (retry_task);
+ retry_task = NULL;
+ }
+ if (NULL != retry_heap)
+ {
+ GNUNET_assert (0 == GNUNET_CONTAINER_heap_get_size (retry_heap));
+ GNUNET_CONTAINER_heap_destroy (retry_heap);
+ retry_heap = NULL;
+ }
+ if (NULL != forward_map)
+ {
+ GNUNET_assert (0 == GNUNET_CONTAINER_multihashmap_size (forward_map));
+ GNUNET_CONTAINER_multihashmap_destroy (forward_map);
+ forward_map = NULL;
+ }
+}
+
+/* end of gnunet-service-dht_clients.c */
Added: gnunet/src/dht/gnunet-service-wdht_clients.h
===================================================================
--- gnunet/src/dht/gnunet-service-wdht_clients.h
(rev 0)
+++ gnunet/src/dht/gnunet-service-wdht_clients.h 2015-04-27 11:12:21 UTC
(rev 35559)
@@ -0,0 +1,149 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2009, 2010, 2011 Christian Grothoff (and other contributing
authors)
+
+ GNUnet is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 3, or (at your
+ option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNUnet; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+/**
+ * @file dht/gnunet-service-xdht_clients.h
+ * @brief GNUnet DHT service's client management code
+ * @author Christian Grothoff
+ * @author Nathan Evans
+ */
+#ifndef GNUNET_SERVICE_DHT_CLIENT_H
+#define GNUNET_SERVICE_DHT_CLIENT_H
+
+#include "gnunet_util_lib.h"
+#include "gnunet_block_lib.h"
+
+/**
+ * Handle a reply we've received from another peer. If the reply
+ * matches any of our pending queries, forward it to the respective
+ * client(s).
+ *
+ * @param expiration when will the reply expire
+ * @param key the query this reply is for
+ * @param get_path_length number of peers in @a get_path
+ * @param get_path path the reply took on get
+ * @param put_path_length number of peers in @a put_path
+ * @param put_path path the reply took on put
+ * @param type type of the reply
+ * @param data_size number of bytes in @a data
+ * @param data application payload data
+ */
+void
+GDS_CLIENTS_handle_reply (struct GNUNET_TIME_Absolute expiration,
+ const struct GNUNET_HashCode *key,
+ unsigned int get_path_length,
+ const struct GNUNET_PeerIdentity *get_path,
+ unsigned int put_path_length,
+ const struct GNUNET_PeerIdentity *put_path,
+ enum GNUNET_BLOCK_Type type, size_t data_size,
+ const void *data);
+
+
+/**
+ * Check if some client is monitoring GET messages and notify
+ * them in that case.
+ *
+ * @param options Options, for instance RecordRoute, DemultiplexEverywhere.
+ * @param type The type of data in the request.
+ * @param hop_count Hop count so far.
+ * @param path_length number of entries in path (or 0 if not recorded).
+ * @param path peers on the GET path (or NULL if not recorded).
+ * @param desired_replication_level Desired replication level.
+ * @param key Key of the requested data.
+ */
+void
+GDS_CLIENTS_process_get (uint32_t options,
+ enum GNUNET_BLOCK_Type type,
+ uint32_t hop_count,
+ uint32_t desired_replication_level,
+ unsigned int path_length,
+ const struct GNUNET_PeerIdentity *path,
+ const struct GNUNET_HashCode *key);
+
+
+/**
+ * Check if some client is monitoring GET RESP messages and notify
+ * them in that case.
+ *
+ * @param type The type of data in the result.
+ * @param get_path Peers on GET path (or NULL if not recorded).
+ * @param get_path_length number of entries in @a get_path.
+ * @param put_path peers on the PUT path (or NULL if not recorded).
+ * @param put_path_length number of entries in @a get_path.
+ * @param exp Expiration time of the data.
+ * @param key Key of the @a data.
+ * @param data Pointer to the result data.
+ * @param size Number of bytes in @a data.
+ */
+void
+GDS_CLIENTS_process_get_resp (enum GNUNET_BLOCK_Type type,
+ const struct GNUNET_PeerIdentity *get_path,
+ unsigned int get_path_length,
+ const struct GNUNET_PeerIdentity *put_path,
+ unsigned int put_path_length,
+ struct GNUNET_TIME_Absolute exp,
+ const struct GNUNET_HashCode * key,
+ const void *data,
+ size_t size);
+
+
+/**
+ * Check if some client is monitoring PUT messages and notify
+ * them in that case.
+ *
+ * @param options Options, for instance RecordRoute, DemultiplexEverywhere.
+ * @param type The type of data in the request.
+ * @param hop_count Hop count so far.
+ * @param path_length number of entries in path (or 0 if not recorded).
+ * @param path peers on the PUT path (or NULL if not recorded).
+ * @param desired_replication_level Desired replication level.
+ * @param exp Expiration time of the data.
+ * @param key Key under which data is to be stored.
+ * @param data Pointer to the data carried.
+ * @param size Number of bytes in data.
+ */
+void
+GDS_CLIENTS_process_put (uint32_t options,
+ enum GNUNET_BLOCK_Type type,
+ uint32_t hop_count,
+ uint32_t desired_replication_level,
+ unsigned int path_length,
+ const struct GNUNET_PeerIdentity *path,
+ struct GNUNET_TIME_Absolute exp,
+ const struct GNUNET_HashCode * key,
+ const void *data,
+ size_t size);
+
+/**
+ * Initialize client subsystem.
+ *
+ * @param server the initialized server
+ */
+void
+GDS_CLIENTS_init (struct GNUNET_SERVER_Handle *server);
+
+
+/**
+ * Shutdown client subsystem.
+ */
+void
+GDS_CLIENTS_done (void);
+
+#endif
Added: gnunet/src/dht/gnunet-service-wdht_datacache.c
===================================================================
--- gnunet/src/dht/gnunet-service-wdht_datacache.c
(rev 0)
+++ gnunet/src/dht/gnunet-service-wdht_datacache.c 2015-04-27 11:12:21 UTC
(rev 35559)
@@ -0,0 +1,381 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2009, 2010, 2011 Christian Grothoff (and other contributing
authors)
+
+ GNUnet is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 3, or (at your
+ option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNUnet; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+/**
+ * @file dht/gnunet-service-dht_datacache.c
+ * @brief GNUnet DHT service's datacache integration
+ * @author Christian Grothoff
+ * @author Nathan Evans
+ */
+#include "platform.h"
+#include "gnunet_datacache_lib.h"
+#include "gnunet-service-wdht_clients.h"
+#include "gnunet-service-wdht_datacache.h"
+#include "gnunet-service-wdht_routing.h"
+#include "gnunet-service-wdht_neighbours.h"
+#include "gnunet-service-dht.h"
+
+#define LOG(kind,...) GNUNET_log_from (kind, "dht-dtcache",__VA_ARGS__)
+
+#define DEBUG(...) \
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, __VA_ARGS__)
+
+/**
+ * Handle to the datacache service (for inserting/retrieving data)
+ */
+static struct GNUNET_DATACACHE_Handle *datacache;
+
+
+/**
+ * Handle a datum we've received from another peer. Cache if
+ * possible.
+ *
+ * @param expiration when will the reply expire
+ * @param key the query this reply is for
+ * @param put_path_length number of peers in 'put_path'
+ * @param put_path path the reply took on put
+ * @param type type of the reply
+ * @param data_size number of bytes in 'data'
+ * @param data application payload data
+ */
+void
+GDS_DATACACHE_handle_put (struct GNUNET_TIME_Absolute expiration,
+ const struct GNUNET_HashCode * key,
+ unsigned int put_path_length,
+ const struct GNUNET_PeerIdentity *put_path,
+ enum GNUNET_BLOCK_Type type, size_t data_size,
+ const void *data)
+{
+ int r;
+
+ if (NULL == datacache)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+ _("%s request received, but have no datacache!\n"), "PUT");
+ return;
+ }
+ if (data_size >= GNUNET_SERVER_MAX_MESSAGE_SIZE)
+ {
+ GNUNET_break (0);
+ return;
+ }
+
+ /* Put size is actual data size plus struct overhead plus path length (if
any) */
+ GNUNET_STATISTICS_update (GDS_stats,
+ gettext_noop ("# ITEMS stored in datacache"), 1,
+ GNUNET_NO);
+
+ struct GNUNET_PeerIdentity peer = GDS_NEIGHBOURS_get_my_id();
+ DEBUG("DATACACHE_PUT KEY = %s, peer =
%s\n",GNUNET_h2s(key),GNUNET_i2s(&peer));
+ r = GNUNET_DATACACHE_put (datacache, key, data_size, data, type, expiration,
+ put_path_length, put_path);
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "DATACACHE PUT for key %s [%u] completed (%d) after %u hops\n",
+ GNUNET_h2s (key), data_size, r, put_path_length);
+}
+
+/**
+ * List of peers in the get path.
+ */
+struct GetPath
+{
+ /**
+ * Pointer to next item in the list
+ */
+ struct GetPath *next;
+
+ /**
+ * Pointer to previous item in the list
+ */
+ struct GetPath *prev;
+
+ /**
+ * An element in the get path.
+ */
+ struct GNUNET_PeerIdentity peer;
+};
+
+
+/**
+ * Context containing information about a GET request.
+ */
+struct GetRequestContext
+{
+ /**
+ * extended query (see gnunet_block_lib.h).
+ */
+ const void *xquery;
+
+ /**
+ * Bloomfilter to filter out duplicate replies (updated)
+ */
+ struct GNUNET_CONTAINER_BloomFilter **reply_bf;
+
+ /**
+ * The key this request was about
+ */
+ struct GNUNET_HashCode key;
+
+ /**
+ * Number of bytes in xquery.
+ */
+ size_t xquery_size;
+
+ /**
+ * Mutator value for the reply_bf, see gnunet_block_lib.h
+ */
+ uint32_t reply_bf_mutator;
+
+ /**
+ * Total number of peers in get path.
+ */
+ unsigned int get_path_length;
+
+ /**
+ * Return value to give back.
+ */
+ enum GNUNET_BLOCK_EvaluationResult eval;
+
+ /**
+ * Peeer which has the data for the key.
+ */
+ struct GNUNET_PeerIdentity source_peer;
+
+ /**
+ * Next hop to forward the get result to.
+ */
+ struct GNUNET_PeerIdentity next_hop;
+
+ /**
+ * Head of get path.
+ */
+ struct GetPath *head;
+
+ /**
+ * Tail of get path.
+ */
+ struct GetPath *tail;
+
+ /* get_path */
+};
+
+
+/**
+ * Iterator for local get request results,
+ *
+ * @param cls closure for iterator, a `struct GetRequestContext`
+ * @param key the key this data is stored under
+ * @param size the size of the data identified by key
+ * @param data the actual data
+ * @param type the type of the data
+ * @param exp when does this value expire?
+ * @param put_path_length number of peers in @a put_path
+ * @param put_path path the reply took on put
+ * @return #GNUNET_OK to continue iteration, anything else
+ * to stop iteration.
+ */
+static int
+datacache_get_iterator (void *cls,
+ const struct GNUNET_HashCode *key,
+ size_t size,
+ const char *data,
+ enum GNUNET_BLOCK_Type type,
+ struct GNUNET_TIME_Absolute exp,
+ unsigned int put_path_length,
+ const struct GNUNET_PeerIdentity *put_path)
+{
+ struct GetRequestContext *ctx = cls;
+ enum GNUNET_BLOCK_EvaluationResult eval;
+
+ eval =
+ GNUNET_BLOCK_evaluate (GDS_block_context,
+ type,
+ GNUNET_BLOCK_EO_NONE,
+ key,
+ ctx->reply_bf,
+ ctx->reply_bf_mutator,
+ ctx->xquery,
+ ctx->xquery_size,
+ data,
+ size);
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Found reply for query %s in datacache, evaluation result is %d\n",
+ GNUNET_h2s (key), (int) eval);
+ ctx->eval = eval;
+
+ switch (eval)
+ {
+ case GNUNET_BLOCK_EVALUATION_OK_MORE:
+ case GNUNET_BLOCK_EVALUATION_OK_LAST:
+ /* forward to local clients */
+ GNUNET_STATISTICS_update (GDS_stats,
+ gettext_noop
+ ("# Good RESULTS found in datacache"), 1,
+ GNUNET_NO);
+ struct GNUNET_PeerIdentity *get_path;
+ get_path = GNUNET_malloc (sizeof (struct GNUNET_PeerIdentity) *
+ ctx->get_path_length);
+ struct GetPath *iterator;
+ iterator = ctx->head;
+ int i = 0;
+ while (i < ctx->get_path_length)
+ {
+ get_path[i] = iterator->peer;
+ i++;
+ iterator = iterator->next;
+ }
+ GDS_NEIGHBOURS_send_get_result (key,type,
&(ctx->next_hop),&(ctx->source_peer),
+ put_path_length, put_path,
ctx->get_path_length,
+ get_path, exp, data, size );
+ GNUNET_free_non_null (get_path);
+
+ break;
+ case GNUNET_BLOCK_EVALUATION_OK_DUPLICATE:
+ GNUNET_STATISTICS_update (GDS_stats,
+ gettext_noop
+ ("# Duplicate RESULTS found in datacache"), 1,
+ GNUNET_NO);
+ break;
+ case GNUNET_BLOCK_EVALUATION_RESULT_INVALID:
+ GNUNET_STATISTICS_update (GDS_stats,
+ gettext_noop
+ ("# Invalid RESULTS found in datacache"), 1,
+ GNUNET_NO);
+ break;
+ case GNUNET_BLOCK_EVALUATION_RESULT_IRRELEVANT:
+ GNUNET_STATISTICS_update (GDS_stats,
+ gettext_noop
+ ("# Irrelevant RESULTS found in datacache"), 1,
+ GNUNET_NO);
+ break;
+ case GNUNET_BLOCK_EVALUATION_REQUEST_VALID:
+ GNUNET_break (0);
+ break;
+ case GNUNET_BLOCK_EVALUATION_REQUEST_INVALID:
+ GNUNET_break_op (0);
+ return GNUNET_SYSERR;
+ case GNUNET_BLOCK_EVALUATION_TYPE_NOT_SUPPORTED:
+ GNUNET_STATISTICS_update (GDS_stats,
+ gettext_noop
+ ("# Unsupported RESULTS found in datacache"), 1,
+ GNUNET_NO);
+ GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+ _("Unsupported block type (%u) in local response!\n"), type);
+ break;
+ }
+
+ return (eval == GNUNET_BLOCK_EVALUATION_OK_LAST) ? GNUNET_NO : GNUNET_OK;
+}
+
+
+/**
+ * Handle a GET request we've received from another peer.
+ *
+ * @param key the query
+ * @param type requested data type
+ * @param xquery extended query
+ * @param xquery_size number of bytes in xquery
+ * @param reply_bf where the reply bf is (to be) stored, possibly updated, can
be NULL
+ * @param reply_bf_mutator mutation value for reply_bf
+ * @return evaluation result for the local replies
+ * @get_path_length Total number of peers in get path
+ * @get_path Peers in get path.
+ */
+enum GNUNET_BLOCK_EvaluationResult
+GDS_DATACACHE_handle_get (const struct GNUNET_HashCode * key,
+ enum GNUNET_BLOCK_Type type, const void *xquery,
+ size_t xquery_size,
+ struct GNUNET_CONTAINER_BloomFilter **reply_bf,
+ uint32_t reply_bf_mutator,
+ uint32_t get_path_length,
+ struct GNUNET_PeerIdentity *get_path,
+ struct GNUNET_PeerIdentity *next_hop,
+ struct GNUNET_PeerIdentity *source_peer)
+{
+ struct GetRequestContext ctx;
+ unsigned int r;
+
+ if (datacache == NULL)
+ return GNUNET_BLOCK_EVALUATION_REQUEST_VALID;
+ GNUNET_STATISTICS_update (GDS_stats,
+ gettext_noop ("# GET requests given to datacache"),
+ 1, GNUNET_NO);
+ ctx.eval = GNUNET_BLOCK_EVALUATION_REQUEST_VALID;
+ ctx.key = *key;
+ ctx.xquery = xquery;
+ ctx.xquery_size = xquery_size;
+ ctx.reply_bf = reply_bf;
+ ctx.reply_bf_mutator = reply_bf_mutator;
+ ctx.get_path_length = get_path_length;
+
+ if (next_hop != NULL)
+ {
+ memcpy (&(ctx.next_hop), next_hop, sizeof (struct GNUNET_PeerIdentity));
+ }
+ unsigned int i = 0;
+
+ ctx.head = NULL;
+ ctx.tail = NULL;
+ if (get_path != NULL)
+ {
+ while (i < get_path_length)
+ {
+ struct GetPath *element;
+ element = GNUNET_new (struct GetPath);
+ element->next = NULL;
+ element->prev = NULL;
+ element->peer = get_path[i];
+ GNUNET_CONTAINER_DLL_insert_tail (ctx.head, ctx.tail, element);
+ i++;
+ }
+ }
+
+ r = GNUNET_DATACACHE_get (datacache, key, type, &datacache_get_iterator,
+ &ctx);
+ DEBUG ("DATACACHE_GET for key %s completed (%d). %u results
found.\n",GNUNET_h2s (key), ctx.eval, r);
+ return ctx.eval;
+}
+
+
+/**
+ * Initialize datacache subsystem.
+ */
+void
+GDS_DATACACHE_init ()
+{
+ datacache = GNUNET_DATACACHE_create (GDS_cfg, "dhtcache");
+}
+
+
+/**
+ * Shutdown datacache subsystem.
+ */
+void
+GDS_DATACACHE_done ()
+{
+ if (datacache != NULL)
+ {
+ GNUNET_DATACACHE_destroy (datacache);
+ datacache = NULL;
+ }
+}
+
+
+/* end of gnunet-service-dht_datacache.c */
Added: gnunet/src/dht/gnunet-service-wdht_datacache.h
===================================================================
--- gnunet/src/dht/gnunet-service-wdht_datacache.h
(rev 0)
+++ gnunet/src/dht/gnunet-service-wdht_datacache.h 2015-04-27 11:12:21 UTC
(rev 35559)
@@ -0,0 +1,90 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2009, 2010, 2011 Christian Grothoff (and other contributing
authors)
+
+ GNUnet is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 3, or (at your
+ option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNUnet; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+/**
+ * @file dht/gnunet-service-dht_datacache.h
+ * @brief GNUnet DHT service's datacache integration
+ * @author Christian Grothoff
+ * @author Nathan Evans
+ */
+#ifndef GNUNET_SERVICE_DHT_DATACACHE_H
+#define GNUNET_SERVICE_DHT_DATACACHE_H
+
+#include "gnunet_util_lib.h"
+#include "gnunet_block_lib.h"
+
+/**
+ * Handle a datum we've received from another peer. Cache if
+ * possible.
+ *
+ * @param expiration when will the reply expire
+ * @param key the query this reply is for
+ * @param put_path_length number of peers in 'put_path'
+ * @param put_path path the reply took on put
+ * @param type type of the reply
+ * @param data_size number of bytes in 'data'
+ * @param data application payload data
+ */
+void
+GDS_DATACACHE_handle_put (struct GNUNET_TIME_Absolute expiration,
+ const struct GNUNET_HashCode * key,
+ unsigned int put_path_length,
+ const struct GNUNET_PeerIdentity *put_path,
+ enum GNUNET_BLOCK_Type type, size_t data_size,
+ const void *data);
+
+
+/**
+ * Handle a GET request we've received from another peer.
+ *
+ * @param key the query
+ * @param type requested data type
+ * @param xquery extended query
+ * @param xquery_size number of bytes in xquery
+ * @param reply_bf where the reply bf is (to be) stored, possibly updated!,
can be NULL
+ * @param reply_bf_mutator mutation value for reply_bf
+ * @return evaluation result for the local replies
+ */
+enum GNUNET_BLOCK_EvaluationResult
+GDS_DATACACHE_handle_get (const struct GNUNET_HashCode * key,
+ enum GNUNET_BLOCK_Type type, const void *xquery,
+ size_t xquery_size,
+ struct GNUNET_CONTAINER_BloomFilter **reply_bf,
+ uint32_t reply_bf_mutator,
+ uint32_t get_path_length,
+ struct GNUNET_PeerIdentity *get_path,
+ struct GNUNET_PeerIdentity *next_hop,
+ struct GNUNET_PeerIdentity *source_peer);
+
+
+/**
+ * Initialize datacache subsystem.
+ */
+void
+GDS_DATACACHE_init (void);
+
+
+/**
+ * Shutdown datacache subsystem.
+ */
+void
+GDS_DATACACHE_done (void);
+
+#endif
Added: gnunet/src/dht/gnunet-service-wdht_hello.c
===================================================================
--- gnunet/src/dht/gnunet-service-wdht_hello.c (rev 0)
+++ gnunet/src/dht/gnunet-service-wdht_hello.c 2015-04-27 11:12:21 UTC (rev
35559)
@@ -0,0 +1,137 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2011 Christian Grothoff (and other contributing authors)
+
+ GNUnet is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 3, or (at your
+ option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNUnet; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+/**
+ * @file dht/gnunet-service-xdht_hello.c
+ * @brief GNUnet DHT integration with peerinfo
+ * @author Christian Grothoff
+ *
+ * TODO:
+ * - consider adding mechanism to remove expired HELLOs
+ */
+#include "platform.h"
+#include "gnunet-service-wdht.h"
+#include "gnunet-service-wdht_hello.h"
+#include "gnunet_peerinfo_service.h"
+
+
+/**
+ * Handle for peerinfo notifications.
+ */
+static struct GNUNET_PEERINFO_NotifyContext *pnc;
+
+/**
+ * Hash map of peers to HELLOs.
+ */
+static struct GNUNET_CONTAINER_MultiPeerMap *peer_to_hello;
+
+
+/**
+ * Obtain a peer's HELLO if available
+ *
+ * @param peer peer to look for a HELLO from
+ * @return HELLO for the given peer
+ */
+const struct GNUNET_HELLO_Message *
+GDS_HELLO_get (const struct GNUNET_PeerIdentity *peer)
+{
+ if (NULL == peer_to_hello)
+ return NULL;
+ return GNUNET_CONTAINER_multipeermap_get (peer_to_hello, peer);
+}
+
+
+/**
+ * Function called for each HELLO known to PEERINFO.
+ *
+ * @param cls closure
+ * @param peer id of the peer, NULL for last call
+ * @param hello hello message for the peer (can be NULL)
+ * @param err_msg error message (not used)
+ */
+static void
+process_hello (void *cls, const struct GNUNET_PeerIdentity *peer,
+ const struct GNUNET_HELLO_Message *hello, const char *err_msg)
+{
+ struct GNUNET_TIME_Absolute ex;
+ struct GNUNET_HELLO_Message *hm;
+
+ if (hello == NULL)
+ return;
+ ex = GNUNET_HELLO_get_last_expiration (hello);
+ if (0 == GNUNET_TIME_absolute_get_remaining (ex).rel_value_us)
+ return;
+ GNUNET_STATISTICS_update (GDS_stats,
+ gettext_noop ("# HELLOs obtained from peerinfo"),
1,
+ GNUNET_NO);
+ hm = GNUNET_CONTAINER_multipeermap_get (peer_to_hello, peer);
+ GNUNET_free_non_null (hm);
+ hm = GNUNET_malloc (GNUNET_HELLO_size (hello));
+ memcpy (hm, hello, GNUNET_HELLO_size (hello));
+ GNUNET_assert (GNUNET_SYSERR !=
+ GNUNET_CONTAINER_multipeermap_put (peer_to_hello,
+ peer, hm,
+
GNUNET_CONTAINER_MULTIHASHMAPOPTION_REPLACE));
+}
+
+
+/**
+ * Initialize HELLO subsystem.
+ */
+void
+GDS_HELLO_init ()
+{
+ pnc = GNUNET_PEERINFO_notify (GDS_cfg, GNUNET_NO, &process_hello, NULL);
+ peer_to_hello = GNUNET_CONTAINER_multipeermap_create (256, GNUNET_NO);
+}
+
+
+/**
+ * Free memory occopied by the HELLO.
+ */
+static int
+free_hello (void *cls,
+ const struct GNUNET_PeerIdentity *key,
+ void *hello)
+{
+ GNUNET_free (hello);
+ return GNUNET_OK;
+}
+
+
+/**
+ * Shutdown HELLO subsystem.
+ */
+void
+GDS_HELLO_done ()
+{
+ if (NULL != pnc)
+ {
+ GNUNET_PEERINFO_notify_cancel (pnc);
+ pnc = NULL;
+ }
+ if (NULL != peer_to_hello)
+ {
+ GNUNET_CONTAINER_multipeermap_iterate (peer_to_hello, &free_hello, NULL);
+ GNUNET_CONTAINER_multipeermap_destroy (peer_to_hello);
+ }
+}
+
+/* end of gnunet-service-dht_hello.c */
Added: gnunet/src/dht/gnunet-service-wdht_hello.h
===================================================================
--- gnunet/src/dht/gnunet-service-wdht_hello.h (rev 0)
+++ gnunet/src/dht/gnunet-service-wdht_hello.h 2015-04-27 11:12:21 UTC (rev
35559)
@@ -0,0 +1,55 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2011 Christian Grothoff (and other contributing authors)
+
+ GNUnet is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 3, or (at your
+ option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNUnet; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+/**
+ * @file dht/gnunet-service-xdht_hello.h
+ * @brief GNUnet DHT integration with peerinfo
+ * @author Christian Grothoff
+ */
+#ifndef GNUNET_SERVICE_XDHT_HELLO_H
+#define GNUNET_SERVICE_XDHT_HELLO_H
+
+#include "gnunet_util_lib.h"
+#include "gnunet_hello_lib.h"
+
+/**
+ * Obtain a peer's HELLO if available
+ *
+ * @param peer peer to look for a HELLO from
+ * @return HELLO for the given peer
+ */
+const struct GNUNET_HELLO_Message *
+GDS_HELLO_get (const struct GNUNET_PeerIdentity *peer);
+
+
+/**
+ * Initialize HELLO subsystem.
+ */
+void
+GDS_HELLO_init (void);
+
+
+/**
+ * Shutdown HELLO subsystem.
+ */
+void
+GDS_HELLO_done (void);
+
+#endif
Added: gnunet/src/dht/gnunet-service-wdht_neighbours.c
===================================================================
--- gnunet/src/dht/gnunet-service-wdht_neighbours.c
(rev 0)
+++ gnunet/src/dht/gnunet-service-wdht_neighbours.c 2015-04-27 11:12:21 UTC
(rev 35559)
@@ -0,0 +1,6290 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2009-2014 Christian Grothoff (and other contributing
authors)
+
+ GNUnet is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 3, or (at your
+ option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNUnet; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+/**
+ * @file dht/gnunet-service-xdht_neighbours.c
+ * @brief GNUnet DHT service's finger and friend table management code
+ * @author Supriti Singh
+ */
+
+#include "platform.h"
+#include "gnunet_util_lib.h"
+#include "gnunet_block_lib.h"
+#include "gnunet_hello_lib.h"
+#include "gnunet_constants.h"
+#include "gnunet_protocols.h"
+#include "gnunet_ats_service.h"
+#include "gnunet_core_service.h"
+#include "gnunet_datacache_lib.h"
+#include "gnunet_transport_service.h"
+#include "gnunet_dht_service.h"
+#include "gnunet_statistics_service.h"
+#include "gnunet-service-xdht.h"
+#include "gnunet-service-wdht_clients.h"
+#include "gnunet-service-wdht_datacache.h"
+#include "gnunet-service-wdht_neighbours.h"
+#include "gnunet-service-wdht_routing.h"
+#include <fenv.h>
+#include "dht.h"
+
+/**
+ * TODO:
+ * 1. In X-Vine paper, there is no policy defined for replicating the data to
+ * recover in case of peer failure. We can do it in Chord way. In R5N, the key
+ * is hashed and then data is stored according to the key value generated after
+ * hashing.
+ */
+
+#define DEBUG(...) \
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, __VA_ARGS__)
+
+/**
+ * Maximum possible fingers (including predecessor) of a peer
+ */
+#define MAX_FINGERS 65
+
+/**
+ * Maximum allowed number of pending messages per friend peer.
+ */
+#define MAXIMUM_PENDING_PER_FRIEND 64
+
+/**
+ * How long to wait before sending another find finger trail request
+ */
+#define DHT_FIND_FINGER_TRAIL_INTERVAL GNUNET_TIME_relative_multiply
(GNUNET_TIME_UNIT_SECONDS, 2)
+
+/**
+ * How long to wait before sending another verify successor message.
+ */
+#define DHT_SEND_VERIFY_SUCCESSOR_INTERVAL GNUNET_TIME_relative_multiply
(GNUNET_TIME_UNIT_SECONDS, 2)
+
+/**
+ * How long to wait before sending another verify successor message.
+ */
+#define DHT_SEND_VERIFY_SUCCESSOR_RETRY_INTERVAL GNUNET_TIME_relative_multiply
(GNUNET_TIME_UNIT_SECONDS, 30)
+
+/**
+ * How long to wait before retrying notify successor.
+ */
+#define DHT_SEND_NOTIFY_SUCCESSOR_RETRY_INTERVAL GNUNET_TIME_relative_multiply
(GNUNET_TIME_UNIT_SECONDS, 30)
+
+/**
+ * How long at most to wait for transmission of a request to a friend ?
+ */
+#define PENDING_MESSAGE_TIMEOUT GNUNET_TIME_relative_multiply
(GNUNET_TIME_UNIT_MINUTES, 2)
+
+/**
+ * Duration for which I may remain congested.
+ * Note: Its a static value. In future, a peer may do some analysis and
calculate
+ * congestion_timeout based on 'some' parameters.
+ */
+#define CONGESTION_TIMEOUT GNUNET_TIME_relative_multiply
(GNUNET_TIME_UNIT_MINUTES, 2)
+
+/**
+ * In case we don't hear back from the current successor, then we can start
+ * verify successor.
+ */
+#define WAIT_NOTIFY_CONFIRMATION GNUNET_TIME_relative_multiply
(GNUNET_TIME_UNIT_MILLISECONDS, 200)
+
+/**
+ * Maximum number of trails allowed to go through a friend.
+ */
+#define TRAILS_THROUGH_FRIEND_THRESHOLD 64
+
+/**
+ * Maximum number of trails stored per finger.
+ */
+#define MAXIMUM_TRAILS_PER_FINGER 4
+
+/**
+ * Finger map index for predecessor entry in finger table.
+ */
+#define PREDECESSOR_FINGER_ID 64
+
+/**
+ * FIXME: Its use only at 3 places check if you can remove it.
+ * To check if a finger is predecessor or not.
+ */
+enum GDS_NEIGHBOURS_finger_type
+{
+ GDS_FINGER_TYPE_PREDECESSOR = 1,
+ GDS_FINGER_TYPE_NON_PREDECESSOR = 0
+};
+
+GNUNET_NETWORK_STRUCT_BEGIN
+
+/**
+ * P2P PUT message
+ */
+struct PeerPutMessage
+{
+ /**
+ * Type: #GNUNET_MESSAGE_TYPE_XDHT_P2P_PUT
+ */
+ struct GNUNET_MessageHeader header;
+
+ /**
+ * Processing options
+ */
+ uint32_t options GNUNET_PACKED;
+
+ /**
+ * Content type.
+ */
+ uint32_t block_type GNUNET_PACKED;
+
+ /**
+ * Hop count
+ */
+ uint32_t hop_count GNUNET_PACKED;
+
+ /**
+ * Replication level for this message
+ * In the current implementation, this value is not used.
+ */
+ uint32_t desired_replication_level GNUNET_PACKED;
+
+ /**
+ * Length of the PUT path that follows (if tracked).
+ */
+ uint32_t put_path_length GNUNET_PACKED;
+
+ /**
+ * Best known destination (could be my friend or finger) which should
+ * get this message next.
+ */
+ struct GNUNET_PeerIdentity best_known_destination;
+
+ /**
+ * In case best_known_destination is a finger, then trail to reach
+ * to that finger. Else its default value is 0.
+ */
+ struct GNUNET_HashCode intermediate_trail_id;
+
+ /**
+ * When does the content expire?
+ */
+ struct GNUNET_TIME_AbsoluteNBO expiration_time;
+
+ /**
+ * The key to store the value under.
+ */
+ struct GNUNET_HashCode key GNUNET_PACKED;
+
+ /* put path (if tracked) */
+
+ /* Payload */
+
+};
+
+/**
+ * P2P GET message
+ */
+struct PeerGetMessage
+{
+ /**
+ * Type: #GNUNET_MESSAGE_TYPE_XDHT_P2P_GET
+ */
+ struct GNUNET_MessageHeader header;
+
+ /**
+ * Processing options
+ */
+ uint32_t options GNUNET_PACKED;
+
+ /**
+ * Desired content type.
+ */
+ uint32_t block_type GNUNET_PACKED;
+
+ /**
+ * Hop count
+ */
+ uint32_t hop_count GNUNET_PACKED;
+
+ /**
+ * Desired replication level for this request.
+ * In the current implementation, this value is not used.
+ */
+ uint32_t desired_replication_level GNUNET_PACKED;
+
+ /**
+ * Total number of peers in get path.
+ */
+ unsigned int get_path_length;
+
+ /**
+ * Best known destination (could be my friend or finger) which should
+ * get this message next.
+ */
+ struct GNUNET_PeerIdentity best_known_destination;
+
+ /**
+ * In case best_known_destination is a finger, then trail to reach
+ * to that finger. Else its default value is 0.
+ */
+ struct GNUNET_HashCode intermediate_trail_id;
+
+ /**
+ * The key we are looking for.
+ */
+ struct GNUNET_HashCode key;
+
+ /* Get path. */
+ /* struct GNUNET_PeerIdentity[]*/
+};
+
+/**
+ * P2P Result message
+ */
+struct PeerGetResultMessage
+{
+ /**
+ * Type: #GNUNET_MESSAGE_TYPE_XDHT_P2P_GET_RESULT
+ */
+ struct GNUNET_MessageHeader header;
+
+ /**
+ * The type for the data.
+ */
+ uint32_t type GNUNET_PACKED;
+
+ /**
+ * Number of peers recorded in the outgoing path from source to the
+ * stored location of this message.
+ */
+ uint32_t put_path_length GNUNET_PACKED;
+
+ /**
+ * Length of the GET path that follows (if tracked).
+ */
+ uint32_t get_path_length GNUNET_PACKED;
+
+ /**
+ * Peer which queried for get and should get the result.
+ */
+ struct GNUNET_PeerIdentity querying_peer;
+
+ /**
+ * When does the content expire?
+ */
+ struct GNUNET_TIME_Absolute expiration_time;
+
+ /**
+ * The key of the corresponding GET request.
+ */
+ struct GNUNET_HashCode key;
+
+ /* put path (if tracked) */
+
+ /* get path (if tracked) */
+
+ /* Payload */
+
+};
+
+/**
+ * P2P Trail setup message
+ */
+struct PeerTrailSetupMessage
+{
+ /**
+ * Type: #GNUNET_MESSAGE_TYPE_XDHT_P2P_TRAIL_SETUP
+ */
+ struct GNUNET_MessageHeader header;
+
+ /**
+ * Is source_peer trying to setup the trail to a predecessor or any finger.
+ */
+ uint32_t is_predecessor;
+
+ /**
+ * Peer closest to this value will be our finger.
+ */
+ uint64_t final_destination_finger_value;
+
+ /**
+ * Source peer which wants to setup the trail to one of its finger.
+ */
+ struct GNUNET_PeerIdentity source_peer;
+
+ /**
+ * Best known destination (could be my friend or finger) which should
+ * get this message next.
+ *
+ * FIXME: this could be removed if we include trail_source / trail_dest
+ * in the routing table. This way we save 32 bytes of bandwidth by using
+ * extra 8 bytes of memory (2 * sizeof (GNUNET_PEER_ID))
+ */
+ struct GNUNET_PeerIdentity best_known_destination;
+
+ /**
+ * In case best_known_destination is a finger, then trail id of trail to
+ * reach to this finger.
+ */
+ struct GNUNET_HashCode intermediate_trail_id;
+
+ /**
+ * Trail id for trail which we are trying to setup.
+ */
+ struct GNUNET_HashCode trail_id;
+
+ /* List of peers which are part of trail setup so far.
+ * Trail does NOT include source_peer and peer which will be closest to
+ * ultimate_destination_finger_value.
+ * struct GNUNET_PeerIdentity trail[]
+ */
+};
+
+/**
+ * P2P Trail Setup Result message
+ */
+struct PeerTrailSetupResultMessage
+{
+
+ /**
+ * Type: #GNUNET_MESSAGE_TYPE_XDHT_P2P_TRAIL_SETUP_RESULT
+ */
+ struct GNUNET_MessageHeader header;
+
+ /**
+ * Finger to which we have found the path.
+ */
+ struct GNUNET_PeerIdentity finger_identity;
+
+ /**
+ * Peer which started trail_setup to find trail to finger_identity
+ */
+ struct GNUNET_PeerIdentity querying_peer;
+
+ /**
+ * Is the trail setup to querying_peer's predecessor or finger?
+ */
+ uint32_t is_predecessor;
+
+ /**
+ * Value to which finger_identity is the closest peer.
+ */
+ uint64_t ulitmate_destination_finger_value;
+
+ /**
+ * Identifier of the trail from querying peer to finger_identity, NOT
+ * including both endpoints.
+ */
+ struct GNUNET_HashCode trail_id;
+
+ /* List of peers which are part of the trail from querying peer to
+ * finger_identity, NOT including both endpoints.
+ * struct GNUNET_PeerIdentity trail[]
+ */
+};
+
+/**
+ * P2P Verify Successor Message.
+ */
+struct PeerVerifySuccessorMessage
+{
+ /**
+ * Type: #GNUNET_MESSAGE_TYPE_XDHT_P2P_VERIFY_SUCCESSOR
+ */
+ struct GNUNET_MessageHeader header;
+
+ /**
+ * Peer which wants to verify its successor.
+ */
+ struct GNUNET_PeerIdentity source_peer;
+
+ /**
+ * Source Peer's current successor.
+ */
+ struct GNUNET_PeerIdentity successor;
+
+ /**
+ * Identifier of trail to reach from source_peer to successor.
+ */
+ struct GNUNET_HashCode trail_id;
+
+ /* List of the peers which are part of trail to reach from source_peer
+ * to successor, NOT including them
+ * struct GNUNET_PeerIdentity trail[]
+ */
+};
+
+/**
+ * P2P Verify Successor Result Message
+ */
+struct PeerVerifySuccessorResultMessage
+{
+ /**
+ * Type: #GNUNET_MESSAGE_TYPE_XDHT_P2P_VERIFY_SUCCESSOR_RESULT
+ */
+ struct GNUNET_MessageHeader header;
+
+ /**
+ * Peer which sent the request to verify its successor.
+ */
+ struct GNUNET_PeerIdentity querying_peer;
+
+ /**
+ * Successor to which PeerVerifySuccessorMessage was sent.
+ */
+ struct GNUNET_PeerIdentity current_successor;
+
+ /**
+ * Current Predecessor of source_successor. It can be same as querying peer
+ * or different. In case it is different then it can be querying_peer's
+ * probable successor.
+ */
+ struct GNUNET_PeerIdentity probable_successor;
+
+ /**
+ * Trail identifier of trail from querying_peer to current_successor.
+ */
+ struct GNUNET_HashCode trail_id;
+
+ /**
+ * Direction in which we are looking at the trail.
+ */
+ uint32_t trail_direction;
+
+ /* In case probable_successor != querying_peer, then trail to reach from
+ * querying_peer to probable_successor, NOT including end points.
+ * struct GNUNET_PeerIdentity trail[]
+ */
+};
+
+/**
+ * P2P Notify New Successor Message.
+ */
+struct PeerNotifyNewSuccessorMessage
+{
+ /**
+ * Type: #GNUNET_MESSAGE_TYPE_XDHT_P2P_NOTIFY_NEW_SUCCESSOR
+ */
+ struct GNUNET_MessageHeader header;
+
+ /**
+ * Peer which wants to notify its new successor.
+ */
+ struct GNUNET_PeerIdentity source_peer;
+
+ /**
+ * New successor of source_peer.
+ */
+ struct GNUNET_PeerIdentity new_successor;
+
+ /**
+ * Unique identifier of the trail from source_peer to new_successor,
+ * NOT including the endpoints.
+ */
+ struct GNUNET_HashCode trail_id;
+
+ /* List of peers in trail from source_peer to new_successor,
+ * NOT including the endpoints.
+ * struct GNUNET_PeerIdentity trail[]
+ */
+};
+
+/**
+ * P2P Notify Successor Confirmation message.
+ */
+struct PeerNotifyConfirmationMessage
+{
+ /**
+ * Type: #GNUNET_MESSAGE_TYPE_XDHT_P2P_TRAIL_TEARDOWN
+ */
+ struct GNUNET_MessageHeader header;
+
+ /**
+ * Unique identifier of the trail.
+ */
+ struct GNUNET_HashCode trail_id;
+
+ /**
+ * Direction of trail.
+ */
+ uint32_t trail_direction;
+};
+
+
+/**
+ * P2P Trail Tear Down message.
+ */
+struct PeerTrailTearDownMessage
+{
+ /**
+ * Type: #GNUNET_MESSAGE_TYPE_XDHT_P2P_TRAIL_TEARDOWN
+ */
+ struct GNUNET_MessageHeader header;
+
+ /**
+ * Unique identifier of the trail.
+ */
+ struct GNUNET_HashCode trail_id;
+
+ /**
+ * Direction of trail.
+ */
+ uint32_t trail_direction;
+};
+
+
+/**
+ * P2P Trail Rejection Message.
+ */
+struct PeerTrailRejectionMessage
+{
+ /**
+ * Type: #GNUNET_MESSAGE_TYPE_XDHT_P2P_TRAIL_SETUP_REJECTION
+ */
+ struct GNUNET_MessageHeader header;
+
+ /**
+ * Peer which wants to set up the trail.
+ */
+ struct GNUNET_PeerIdentity source_peer;
+
+ /**
+ * Peer which sent trail rejection message as it it congested.
+ */
+ struct GNUNET_PeerIdentity congested_peer;
+
+ /**
+ * Peer identity closest to this value will be finger of
+ * source_peer.
+ */
+ uint64_t ultimate_destination_finger_value;
+
+ /**
+ * Is source_peer trying to setup the trail to its predecessor or finger.
+ */
+ uint32_t is_predecessor;
+
+ /**
+ * Identifier for the trail that source peer is trying to setup.
+ */
+ struct GNUNET_HashCode trail_id;
+
+ /**
+ * Relative time for which congested_peer will remain congested.
+ */
+ struct GNUNET_TIME_Relative congestion_time;
+
+ /* Trail_list from source_peer to peer which sent the message for trail setup
+ * to congested peer. This trail does NOT include source_peer.
+ struct GNUNET_PeerIdnetity trail[]*/
+};
+
+/**
+ * P2P Add Trail Message.
+ */
+struct PeerAddTrailMessage
+{
+ /**
+ * Type: #GNUNET_MESSAGE_TYPE_XDHT_P2P_ADD_TRAIL
+ */
+ struct GNUNET_MessageHeader header;
+
+ /**
+ * Source of the routing trail.
+ */
+ struct GNUNET_PeerIdentity source_peer;
+
+ /**
+ * Destination of the routing trail.
+ */
+ struct GNUNET_PeerIdentity destination_peer;
+
+ /**
+ * Unique identifier of the trail from source_peer to destination_peer,
+ * NOT including the endpoints.
+ */
+ struct GNUNET_HashCode trail_id;
+
+ /* Trail from source peer to destination peer, NOT including them.
+ * struct GNUNET_PeerIdentity trail[]
+ */
+};
+
+
+GNUNET_NETWORK_STRUCT_END
+
+/**
+ * Linked list of messages to send to a particular other peer.
+ */
+struct P2PPendingMessage
+{
+ /**
+ * Pointer to next item in the list
+ */
+ struct P2PPendingMessage *next;
+
+ /**
+ * Pointer to previous item in the list
+ */
+ struct P2PPendingMessage *prev;
+
+ /**
+ * Message importance level. FIXME: used? useful?
+ */
+ unsigned int importance;
+
+ /**
+ * When does this message time out?
+ */
+ struct GNUNET_TIME_Absolute timeout;
+
+ /**
+ * Actual message to be sent, allocated at the end of the struct:
+ * // msg = (cast) &pm[1];
+ * // memcpy (&pm[1], data, len);
+ */
+ const struct GNUNET_MessageHeader *msg;
+
+};
+
+/**
+ * Entry in friend_peermap.
+ */
+struct FriendInfo
+{
+ /**
+ * Friend Identity
+ */
+ struct GNUNET_PeerIdentity id;
+
+ /**
+ * Number of trails for which this friend is the first hop or if the friend
+ * is finger.
+ */
+ unsigned int trails_count;
+
+ /**
+ * Count of outstanding messages for this friend.
+ */
+ unsigned int pending_count;
+
+ /**
+ * In case not 0, then amount of time for which this friend is congested.
+ */
+ struct GNUNET_TIME_Absolute congestion_timestamp;
+
+
+ // TODO : Change name of head and tail to pending_messages_list_head and so.
+ /**
+ * Head of pending messages to be sent to this friend.
+ */
+ struct P2PPendingMessage *head;
+
+ /**
+ * Tail of pending messages to be sent to this friend.
+ */
+ struct P2PPendingMessage *tail;
+
+ /**
+ * Core handle for sending messages to this friend.
+ */
+ struct GNUNET_CORE_TransmitHandle *th;
+
+};
+
+/**
+ * An individual element of the trail to reach to a finger.
+ */
+struct Trail_Element
+{
+ /**
+ * Pointer to next item in the list
+ */
+ struct Trail_Element *next;
+
+ /**
+ * Pointer to prev item in the list
+ */
+ struct Trail_Element *prev;
+
+ /**
+ * An element in this trail.
+ */
+ struct GNUNET_PeerIdentity peer;
+};
+
+/**
+ * Information about an individual trail.
+ */
+struct Trail
+{
+ /**
+ * Head of trail.
+ */
+ struct Trail_Element *trail_head;
+
+ /**
+ * Tail of trail.
+ */
+ struct Trail_Element *trail_tail;
+
+ /**
+ * Unique identifier of this trail.
+ */
+ struct GNUNET_HashCode trail_id;
+
+ /**
+ * Length of trail pointed
+ */
+ unsigned int trail_length;
+
+ /**
+ * Is there a valid trail entry.
+ */
+ unsigned int is_present;
+};
+
+/**
+ * An entry in finger_table
+ */
+struct FingerInfo
+{
+ /**
+ * Finger identity.
+ */
+ struct GNUNET_PeerIdentity finger_identity;
+
+ /**
+ * In case not 0, this amount is time to wait for notify successor message.
+ * Used ONLY for successor. NOT for any other finger.
+ */
+ struct GNUNET_TIME_Absolute wait_notify_confirmation;
+
+ /**
+ * Is any finger stored at this finger index.
+ */
+ unsigned int is_present;
+
+ /**
+ * Index in finger peer map
+ */
+ uint32_t finger_table_index;
+
+ /**
+ * Number of trails setup so far for this finger.
+ * Should not cross MAXIMUM_TRAILS_PER_FINGER.
+ */
+ uint32_t trails_count;
+
+ /**
+ * Array of trails to reach to this finger.
+ */
+ struct Trail trail_list[MAXIMUM_TRAILS_PER_FINGER];
+};
+
+
+/**
+ * Stores information about the peer which is closest to
destination_finger_value.
+ * 'closest' can be either successor or predecessor depending on is_predecessor
+ * flag.
+ */
+struct Closest_Peer
+{
+ /**
+ * Destination finger value.
+ */
+ uint64_t destination_finger_value;
+
+ /**
+ * Is finger_value a predecessor or any other finger.
+ */
+ unsigned int is_predecessor;
+
+ /**
+ * Trail id to reach to peer.
+ * In case peer is my identity or friend, it is set to 0.
+ */
+ struct GNUNET_HashCode trail_id;
+
+ /**
+ * Next destination. In case of friend and my_identity , it is same as
next_hop
+ * In case of finger it is finger identity.
+ */
+ struct GNUNET_PeerIdentity best_known_destination;
+
+ /**
+ * In case best_known_destination is a finger, then first friend in the trail
+ * to reach to it. In other case, same as best_known_destination.
+ */
+ struct GNUNET_PeerIdentity next_hop;
+
+ /**
+ * In case finger is the next hop, it contains a valid finger table index
+ * at which the finger is stored. Else, It contains 65, which is out of range
+ * of finger table index.
+ */
+ unsigned int finger_table_index;
+};
+
+/**
+ * Context for send_verify_successor_task.
+ */
+struct VerifySuccessorContext
+{
+ /**
+ * Number of times this has been scheduled.
+ */
+ unsigned int num_retries_scheduled;
+};
+
+/**
+ * Task that sends FIND FINGER TRAIL requests. This task is started when we
have
+ * get our first friend.
+ */
+static struct GNUNET_SCHEDULER_Task * find_finger_trail_task;
+
+/**
+ * Task that sends verify successor message. This task is started when we get
+ * our successor for the first time.
+ */
+static struct GNUNET_SCHEDULER_Task * send_verify_successor_task;
+
+/**
+ * Task that sends verify successor message. This task is started when we get
+ * our successor for the first time.
+ */
+static struct GNUNET_SCHEDULER_Task * send_verify_successor_retry_task;
+
+/**
+ * Task that sends verify successor message. This task is started when we get
+ * our successor for the first time.
+ */
+static struct GNUNET_SCHEDULER_Task * send_notify_new_successor_retry_task;
+
+/**
+ * Identity of this peer.
+ */
+static struct GNUNET_PeerIdentity my_identity;
+
+/**
+ * Peer map of all the friends of a peer
+ */
+static struct GNUNET_CONTAINER_MultiPeerMap *friend_peermap;
+
+/**
+ * Array of all the fingers.
+ */
+static struct FingerInfo finger_table [MAX_FINGERS];
+
+/**
+ * Handle to CORE.
+ */
+static struct GNUNET_CORE_Handle *core_api;
+
+/**
+ * Handle for the statistics service.
+ */
+//extern struct GNUNET_STATISTICS_Handle *GDS_stats;
+
+/**
+ * The current finger index that we have want to find trail to. We start the
+ * search with value = 0, i.e. successor and then go to PREDCESSOR_FINGER_ID
+ * and decrement it. For any index 63 <= index < 0, if finger is same as
successor,
+ * we reset this index to 0.
+ */
+static unsigned int current_search_finger_index;
+
+/**
+ * Time duration to schedule find finger trail task.
+ */
+static struct GNUNET_TIME_Relative find_finger_trail_task_next_send_time;
+
+/**
+ * Time duration to schedule verify successor task.
+ */
+static struct GNUNET_TIME_Relative verify_successor_next_send_time;
+
+/**
+ * Time duration to send verify successor again, if result was not received in
time.
+ */
+static struct GNUNET_TIME_Relative verify_successor_retry_time;
+
+/**
+ * Time duration to retry send_notify_successor.
+ */
+static struct GNUNET_TIME_Relative notify_successor_retry_time;
+
+/**
+ * Are we waiting for confirmation from our new successor that it got the
+ * message
+ */
+//static unsigned int waiting_for_notify_confirmation;
+
+/* Below variables are used only for testing, and statistics collection. */
+/**
+ * Should we store our topology predecessor and successor IDs into statistics?
+ */
+unsigned int track_topology;
+
+/**
+ * Should I be a malicious peer and drop the PUT/GET packets?
+ * if 0 then NOT malicious.
+ */
+unsigned int act_malicious;
+
+/**
+ * Count of fingers found. Ideally we should have O(logn) fingers for a
+ * stable network.
+ */
+static unsigned int total_fingers_found;
+
+/**
+ * Number of times we found the same successor.
+ */
+static unsigned int successor_times;
+
+/**
+ * Number of rounds for which we should search for finger.
+ */
+static unsigned int fingers_round_count;
+/**
+ * Called when core is ready to send a message we asked for
+ * out to the destination.
+ *
+ * @param cls the 'struct FriendInfo' of the target friend
+ * @param size number of bytes available in buf
+ * @param buf where the callee should write the message
+ * @return number of bytes written to buf
+ */
+static size_t
+core_transmit_notify (void *cls, size_t size, void *buf)
+{
+ struct FriendInfo *peer = cls;
+ char *cbuf = buf;
+ struct P2PPendingMessage *pending;
+ size_t off;
+ size_t msize;
+
+ peer->th = NULL;
+ while ( (NULL != (pending = peer->head)) &&
+ (0 == GNUNET_TIME_absolute_get_remaining
(pending->timeout).rel_value_us) )
+ {
+ GNUNET_STATISTICS_update (GDS_stats,
+ gettext_noop
+ ("# Messages dropped (CORE timeout)"),
+ 1,
+ GNUNET_NO);
+ peer->pending_count--;
+ GNUNET_CONTAINER_DLL_remove (peer->head,
+ peer->tail,
+ pending);
+ GNUNET_free (pending);
+ }
+ if (NULL == pending)
+ {
+ /* no messages pending */
+ return 0;
+ }
+ if (NULL == buf)
+ {
+ peer->th =
+ GNUNET_CORE_notify_transmit_ready (core_api, GNUNET_NO,
+ GNUNET_CORE_PRIO_BEST_EFFORT,
+ GNUNET_TIME_absolute_get_remaining
+ (pending->timeout), &peer->id,
+ ntohs (pending->msg->size),
+ &core_transmit_notify, peer);
+ GNUNET_break (NULL != peer->th);
+ return 0;
+ }
+ off = 0;
+ while ((NULL != (pending = peer->head)) &&
+ (size - off >= (msize = ntohs (pending->msg->size))))
+ {
+ GNUNET_STATISTICS_update (GDS_stats,
+ gettext_noop
+ ("# Bytes transmitted to other peers"),
+ msize,
+ GNUNET_NO);
+ memcpy (&cbuf[off], pending->msg, msize);
+ off += msize;
+ peer->pending_count--;
+ GNUNET_CONTAINER_DLL_remove (peer->head, peer->tail, pending);
+ GNUNET_free (pending);
+ }
+ if (peer->head != NULL)
+ {
+ peer->th =
+ GNUNET_CORE_notify_transmit_ready (core_api, GNUNET_NO,
+ GNUNET_CORE_PRIO_BEST_EFFORT,
+ GNUNET_TIME_absolute_get_remaining
+ (pending->timeout), &peer->id,
msize,
+ &core_transmit_notify, peer);
+ GNUNET_break (NULL != peer->th);
+ }
+ return off;
+}
+
+
+/**
+ * Transmit all messages in the friend's message queue.
+ *
+ * @param peer message queue to process
+ */
+static void
+process_friend_queue (struct FriendInfo *peer)
+{
+ struct P2PPendingMessage *pending;
+
+ if (NULL == (pending = peer->head))
+ {
+ return;
+ }
+ if (NULL != peer->th)
+ {
+ return;
+ }
+
+ peer->th =
+ GNUNET_CORE_notify_transmit_ready (core_api, GNUNET_NO,
+ pending->importance,
+ GNUNET_TIME_absolute_get_remaining
+ (pending->timeout), &peer->id,
+ ntohs (pending->msg->size),
+ &core_transmit_notify, peer);
+ GNUNET_break (NULL != peer->th);
+}
+
+
+#if ENABLE_MALICIOUS
+/**
+ * Set the ENABLE_MALICIOUS value to malicious.
+ * @param malicious
+ */
+int
+GDS_NEIGHBOURS_act_malicious (unsigned int malicious)
+{
+ act_malicious = malicious;
+ return GNUNET_OK;
+}
+#endif
+
+/**
+ * Construct a trail setup message and forward it to target_friend
+ * @param source_peer Peer which wants to setup the trail
+ * @param ultimate_destination_finger_value Peer identity closest to this value
+ * will be finger to @a source_peer
+ * @param best_known_destination Best known destination (could be finger or
friend)
+ * which should get this message. In case it is
+ * friend, then it is same as target_friend
+ * @param target_friend Friend to which message is forwarded now.
+ * @param trail_length Total number of peers in trail setup so far.
+ * @param trail_peer_list Trail setup so far
+ * @param is_predecessor Is @a source_peer looking for trail to a predecessor
or not.
+ * @param trail_id Unique identifier for the trail we are trying to setup.
+ * @param intermediate_trail_id Trail id of intermediate trail to reach to
+ * best_known_destination when its a finger. If
not
+ * used then set to 0.
+ */
+void
+GDS_NEIGHBOURS_send_trail_setup (struct GNUNET_PeerIdentity source_peer,
+ uint64_t ultimate_destination_finger_value,
+ struct GNUNET_PeerIdentity
best_known_destination,
+ struct FriendInfo *target_friend,
+ unsigned int trail_length,
+ const struct GNUNET_PeerIdentity
*trail_peer_list,
+ unsigned int is_predecessor,
+ struct GNUNET_HashCode trail_id,
+ struct GNUNET_HashCode intermediate_trail_id)
+{
+ struct P2PPendingMessage *pending;
+ struct PeerTrailSetupMessage *tsm;
+ struct GNUNET_PeerIdentity *peer_list;
+ size_t msize;
+
+ msize = sizeof (struct PeerTrailSetupMessage) +
+ (trail_length * sizeof (struct GNUNET_PeerIdentity));
+
+ if (msize >= GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE)
+ {
+ GNUNET_break (0);
+ return;
+ }
+
+ if (target_friend->pending_count >= MAXIMUM_PENDING_PER_FRIEND)
+ {
+ GNUNET_STATISTICS_update (GDS_stats, gettext_noop ("# P2P messages dropped
due to full queue"),
+ 1, GNUNET_NO);
+ }
+ pending = GNUNET_malloc (sizeof (struct P2PPendingMessage) + msize);
+ pending->timeout = GNUNET_TIME_relative_to_absolute
(PENDING_MESSAGE_TIMEOUT);
+ tsm = (struct PeerTrailSetupMessage *) &pending[1];
+ pending->msg = &(tsm->header);
+ tsm->header.size = htons (msize);
+ tsm->header.type = htons (GNUNET_MESSAGE_TYPE_XDHT_P2P_TRAIL_SETUP);
+ tsm->final_destination_finger_value = GNUNET_htonll
(ultimate_destination_finger_value);
+ tsm->source_peer = source_peer;
+ tsm->best_known_destination = best_known_destination;
+ tsm->is_predecessor = htonl (is_predecessor);
+ tsm->trail_id = trail_id;
+ tsm->intermediate_trail_id = intermediate_trail_id;
+
+ if (trail_length > 0)
+ {
+ peer_list = (struct GNUNET_PeerIdentity *) &tsm[1];
+ memcpy (peer_list, trail_peer_list, trail_length * sizeof(struct
GNUNET_PeerIdentity));
+ }
+
+ GNUNET_CONTAINER_DLL_insert_tail (target_friend->head, target_friend->tail,
pending);
+ target_friend->pending_count++;
+ process_friend_queue (target_friend);
+}
+
+
+/**
+ * Construct a trail setup result message and forward it to target friend.
+ * @param querying_peer Peer which sent the trail setup request and should get
+ * the result back.
+ * @param Finger Peer to which the trail has been setup to.
+ * @param target_friend Friend to which this message should be forwarded.
+ * @param trail_length Numbers of peers in the trail.
+ * @param trail_peer_list Peers which are part of the trail from
+ * querying_peer to Finger, NOT including them.
+ * @param is_predecessor Is @a Finger predecessor to @a querying_peer ?
+ * @param ultimate_destination_finger_value Value to which @a finger is the
closest
+ * peer.
+ * @param trail_id Unique identifier of the trail.
+ */
+void
+GDS_NEIGHBOURS_send_trail_setup_result (struct GNUNET_PeerIdentity
querying_peer,
+ struct GNUNET_PeerIdentity finger,
+ struct FriendInfo *target_friend,
+ unsigned int trail_length,
+ const struct GNUNET_PeerIdentity
*trail_peer_list,
+ unsigned int is_predecessor,
+ uint64_t
ultimate_destination_finger_value,
+ struct GNUNET_HashCode trail_id)
+{
+ struct P2PPendingMessage *pending;
+ struct PeerTrailSetupResultMessage *tsrm;
+ struct GNUNET_PeerIdentity *peer_list;
+ size_t msize;
+
+ msize = sizeof (struct PeerTrailSetupResultMessage) +
+ (trail_length * sizeof (struct GNUNET_PeerIdentity));
+
+ if (msize >= GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE)
+ {
+ GNUNET_break (0);
+ return;
+ }
+
+ if (target_friend->pending_count >= MAXIMUM_PENDING_PER_FRIEND)
+ {
+ GNUNET_STATISTICS_update (GDS_stats,
+ gettext_noop ("# P2P messages dropped due to
full queue"),
+ 1, GNUNET_NO);
+ }
+
+ pending = GNUNET_malloc (sizeof (struct P2PPendingMessage) + msize);
+ pending->importance = 0;
+ pending->timeout = GNUNET_TIME_relative_to_absolute
(PENDING_MESSAGE_TIMEOUT);
+ tsrm = (struct PeerTrailSetupResultMessage *) &pending[1];
+ pending->msg = &tsrm->header;
+ tsrm->header.size = htons (msize);
+ tsrm->header.type = htons (GNUNET_MESSAGE_TYPE_XDHT_P2P_TRAIL_SETUP_RESULT);
+ tsrm->querying_peer = querying_peer;
+ tsrm->finger_identity = finger;
+ tsrm->is_predecessor = htonl (is_predecessor);
+ tsrm->trail_id = trail_id;
+ tsrm->ulitmate_destination_finger_value =
+ GNUNET_htonll (ultimate_destination_finger_value);
+ peer_list = (struct GNUNET_PeerIdentity *) &tsrm[1];
+ memcpy (peer_list, trail_peer_list, trail_length * sizeof (struct
GNUNET_PeerIdentity));
+
+ /* Send the message to chosen friend. */
+ GNUNET_CONTAINER_DLL_insert_tail (target_friend->head, target_friend->tail,
pending);
+ target_friend->pending_count++;
+ process_friend_queue (target_friend);
+}
+
+/**
+ * Send notify successor confirmation message.
+ * @param trail_id Unique Identifier of the trail.
+ * @param trail_direction Destination to Source.
+ * @param target_friend Friend to get this message next.
+ */
+void
+GDS_NEIGHBOURS_send_notify_succcessor_confirmation (struct GNUNET_HashCode
trail_id,
+ unsigned int
trail_direction,
+ struct FriendInfo
*target_friend)
+{
+ struct PeerNotifyConfirmationMessage *ncm;
+ struct P2PPendingMessage *pending;
+ size_t msize;
+
+ msize = sizeof (struct PeerNotifyConfirmationMessage);
+ if (msize >= GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE)
+ {
+ GNUNET_break (0);
+ return;
+ }
+
+ if (target_friend->pending_count >= MAXIMUM_PENDING_PER_FRIEND)
+ {
+ GNUNET_STATISTICS_update (GDS_stats, gettext_noop ("# P2P messages dropped
due to full queue"),
+ 1, GNUNET_NO);
+ }
+
+ pending = GNUNET_malloc (sizeof (struct P2PPendingMessage) + msize);
+ pending->importance = 0; /* FIXME */
+ pending->timeout = GNUNET_TIME_relative_to_absolute
(PENDING_MESSAGE_TIMEOUT);
+ ncm = (struct PeerNotifyConfirmationMessage *) &pending[1];
+ pending->msg = &ncm->header;
+ ncm->header.size = htons (msize);
+ ncm->header.type = htons
(GNUNET_MESSAGE_TYPE_XDHT_P2P_NOTIFY_SUCCESSOR_CONFIRMATION);
+ ncm->trail_id = trail_id;
+ ncm->trail_direction = htonl (trail_direction);
+
+ /* Send the message to chosen friend. */
+ GNUNET_CONTAINER_DLL_insert_tail (target_friend->head, target_friend->tail,
pending);
+ target_friend->pending_count++;
+ process_friend_queue (target_friend);
+}
+
+
+/**
+ * Send trail rejection message to target friend
+ * @param source_peer Peer which is trying to setup the trail.
+ * @param ultimate_destination_finger_value Peer closest to this value will be
+ * @a source_peer's finger
+ * @param congested_peer Peer which sent this message as it is congested.
+ * @param is_predecessor Is source_peer looking for trail to a predecessor or
not.
+ * @param trail_peer_list Trails seen so far in trail setup before getting
rejected
+ * by congested_peer. This does NOT include @a
source_peer
+ * and congested_peer.
+ * @param trail_length Total number of peers in trail_peer_list, NOT including
+ * @a source_peer and @a congested_peer
+ * @param trail_id Unique identifier of this trail.
+ * @param congestion_timeout Duration given by congested peer as an estimate of
+ * how long it may remain congested.
+ */
+void
+GDS_NEIGHBOURS_send_trail_rejection (struct GNUNET_PeerIdentity source_peer,
+ uint64_t
ultimate_destination_finger_value,
+ struct GNUNET_PeerIdentity congested_peer,
+ unsigned int is_predecessor,
+ const struct GNUNET_PeerIdentity
*trail_peer_list,
+ unsigned int trail_length,
+ struct GNUNET_HashCode trail_id,
+ struct FriendInfo *target_friend,
+ const struct GNUNET_TIME_Relative
congestion_timeout)
+{
+ struct PeerTrailRejectionMessage *trm;
+ struct P2PPendingMessage *pending;
+ struct GNUNET_PeerIdentity *peer_list;
+ size_t msize;
+
+ msize = sizeof (struct PeerTrailRejectionMessage) +
+ (trail_length * sizeof (struct GNUNET_PeerIdentity));
+
+ if (msize >= GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE)
+ {
+ GNUNET_break (0);
+ return;
+ }
+
+ if (target_friend->pending_count >= MAXIMUM_PENDING_PER_FRIEND)
+ {
+ GNUNET_STATISTICS_update (GDS_stats, gettext_noop ("# P2P messages dropped
due to full queue"),
+ 1, GNUNET_NO);
+ }
+
+ pending = GNUNET_malloc (sizeof (struct P2PPendingMessage) + msize);
+ pending->importance = 0;
+ pending->timeout = GNUNET_TIME_relative_to_absolute
(PENDING_MESSAGE_TIMEOUT);
+ trm = (struct PeerTrailRejectionMessage *)&pending[1];
+ pending->msg = &trm->header;
+ trm->header.size = htons (msize);
+ trm->header.type = htons
(GNUNET_MESSAGE_TYPE_XDHT_P2P_TRAIL_SETUP_REJECTION);
+ trm->source_peer = source_peer;
+ trm->congested_peer = congested_peer;
+ trm->congestion_time = congestion_timeout;
+ trm->is_predecessor = htonl (is_predecessor);
+ trm->trail_id = trail_id;
+ trm->ultimate_destination_finger_value =
+ GNUNET_htonll (ultimate_destination_finger_value);
+
+ peer_list = (struct GNUNET_PeerIdentity *) &trm[1];
+ if (trail_length > 0)
+ {
+ memcpy (peer_list, trail_peer_list, trail_length * sizeof (struct
GNUNET_PeerIdentity));
+ }
+
+ /* Send the message to chosen friend. */
+ GNUNET_CONTAINER_DLL_insert_tail (target_friend->head, target_friend->tail,
pending);
+ target_friend->pending_count++;
+ process_friend_queue (target_friend);
+}
+
+
+/**
+ * Construct a verify successor message and forward it to target_friend.
+ * @param source_peer Peer which wants to verify its successor.
+ * @param successor Peer which is @a source_peer's current successor.
+ * @param trail_id Unique Identifier of trail from @a source_peer to @a
successor,
+ * NOT including them.
+ * @param trail List of peers which are part of trail to reach from @a
source_peer
+ * to @a successor, NOT including them.
+ * @param trail_length Total number of peers in @a trail.
+ * @param target_friend Next friend to get this message.
+ */
+void
+GDS_NEIGHBOURS_send_verify_successor_message (struct GNUNET_PeerIdentity
source_peer,
+ struct GNUNET_PeerIdentity
successor,
+ struct GNUNET_HashCode trail_id,
+ struct GNUNET_PeerIdentity
*trail,
+ unsigned int trail_length,
+ struct FriendInfo *target_friend)
+{
+ struct PeerVerifySuccessorMessage *vsm;
+ struct P2PPendingMessage *pending;
+ struct GNUNET_PeerIdentity *peer_list;
+ size_t msize;
+
+ msize = sizeof (struct PeerVerifySuccessorMessage) +
+ (trail_length * sizeof (struct GNUNET_PeerIdentity));
+
+ if (msize >= GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE)
+ {
+ GNUNET_break (0);
+ return;
+ }
+
+ if (target_friend->pending_count >= MAXIMUM_PENDING_PER_FRIEND)
+ {
+ GNUNET_STATISTICS_update (GDS_stats, gettext_noop ("# P2P messages dropped
due to full queue"),
+ 1, GNUNET_NO);
+ }
+
+ pending = GNUNET_malloc (sizeof (struct P2PPendingMessage) + msize);
+ pending->importance = 0; /* FIXME */
+ pending->timeout = GNUNET_TIME_relative_to_absolute
(PENDING_MESSAGE_TIMEOUT);
+ vsm = (struct PeerVerifySuccessorMessage *) &pending[1];
+ pending->msg = &vsm->header;
+ vsm->header.size = htons (msize);
+ vsm->header.type = htons (GNUNET_MESSAGE_TYPE_XDHT_P2P_VERIFY_SUCCESSOR);
+ vsm->source_peer = source_peer;
+ vsm->successor = successor;
+ vsm->trail_id = trail_id;
+ peer_list = (struct GNUNET_PeerIdentity *) &vsm[1];
+ memcpy (peer_list, trail, trail_length * sizeof (struct
GNUNET_PeerIdentity));
+
+ /* Send the message to chosen friend. */
+ GNUNET_CONTAINER_DLL_insert_tail (target_friend->head, target_friend->tail,
pending);
+ target_friend->pending_count++;
+ process_friend_queue (target_friend);
+}
+
+
+/**
+ * FIXME: In every function we pass target friend except for this one.
+ * so, either change everything or this one. also, should se just store
+ * the pointer to friend in routing table rather than gnunet_peeridentity.
+ * if yes then we should keep friend info in.h andmake lot of changes.
+ * Construct a trail teardown message and forward it to target friend.
+ *
+ * @param trail_id Unique identifier of the trail.
+ * @param trail_direction Direction of trail.
+ * @param target_friend Friend to get this message.
+ */
+void
+GDS_NEIGHBOURS_send_trail_teardown (const struct GNUNET_HashCode *trail_id,
+ unsigned int trail_direction,
+ const struct GNUNET_PeerIdentity *peer)
+{
+ struct PeerTrailTearDownMessage *ttdm;
+ struct P2PPendingMessage *pending;
+ struct FriendInfo *target_friend;
+ size_t msize;
+
+ msize = sizeof (struct PeerTrailTearDownMessage);
+ if (msize >= GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE)
+ {
+ GNUNET_break (0);
+ return;
+ }
+
+ if (NULL == (target_friend =
+ GNUNET_CONTAINER_multipeermap_get (friend_peermap, peer)))
+ {
+ /* FIXME: In what case friend can be null. ?*/
+ GNUNET_break (0);
+ return;
+ }
+
+ if (target_friend->pending_count >= MAXIMUM_PENDING_PER_FRIEND)
+ {
+ GNUNET_STATISTICS_update (GDS_stats, gettext_noop ("# P2P messages dropped
due to full queue"),
+ 1, GNUNET_NO);
+ }
+
+ pending = GNUNET_malloc (sizeof (struct P2PPendingMessage) + msize);
+ pending->importance = 0; /* FIXME */
+ pending->timeout = GNUNET_TIME_relative_to_absolute
(PENDING_MESSAGE_TIMEOUT);
+ ttdm = (struct PeerTrailTearDownMessage *) &pending[1];
+ pending->msg = &ttdm->header;
+ ttdm->header.size = htons (msize);
+ ttdm->header.type = htons (GNUNET_MESSAGE_TYPE_XDHT_P2P_TRAIL_TEARDOWN);
+ ttdm->trail_id = *trail_id;
+ ttdm->trail_direction = htonl (trail_direction);
+
+ /* Send the message to chosen friend. */
+ GNUNET_CONTAINER_DLL_insert_tail (target_friend->head, target_friend->tail,
pending);
+ target_friend->pending_count++;
+ process_friend_queue (target_friend);
+}
+
+
+/**
+ * Construct a verify successor result message and send it to target_friend
+ * @param querying_peer Peer which sent the verify successor message.
+ * @param source_successor Current_successor of @a querying_peer.
+ * @param current_predecessor Current predecessor of @a successor. Could be
same
+ * or different from @a querying_peer.
+ * @param trail_id Unique identifier of the trail from @a querying_peer to
+ * @a successor, NOT including them.
+ * @param trail List of peers which are part of trail from @a querying_peer to
+ * @a successor, NOT including them.
+ * @param trail_length Total number of peers in @a trail
+ * @param trail_direction Direction in which we are sending the message. In
this
+ * case we are sending result from @a successor to @a
querying_peer.
+ * @param target_friend Next friend to get this message.
+ */
+void
+GDS_NEIGHBOURS_send_verify_successor_result (struct GNUNET_PeerIdentity
querying_peer,
+ struct GNUNET_PeerIdentity
current_successor,
+ struct GNUNET_PeerIdentity
probable_successor,
+ struct GNUNET_HashCode trail_id,
+ const struct GNUNET_PeerIdentity
*trail,
+ unsigned int trail_length,
+ enum GDS_ROUTING_trail_direction
trail_direction,
+ struct FriendInfo *target_friend)
+{
+ struct PeerVerifySuccessorResultMessage *vsmr;
+ struct P2PPendingMessage *pending;
+ struct GNUNET_PeerIdentity *peer_list;
+ size_t msize;
+
+ msize = sizeof (struct PeerVerifySuccessorResultMessage) +
+ (trail_length * sizeof(struct GNUNET_PeerIdentity));
+
+ if (msize >= GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE)
+ {
+ GNUNET_break (0);
+ return;
+ }
+
+ if (target_friend->pending_count >= MAXIMUM_PENDING_PER_FRIEND)
+ {
+ GNUNET_STATISTICS_update (GDS_stats, gettext_noop ("# P2P messages dropped
due to full queue"),
+ 1, GNUNET_NO);
+ }
+
+ pending = GNUNET_malloc (sizeof (struct P2PPendingMessage) + msize);
+ pending->importance = 0; /* FIXME */
+ pending->timeout = GNUNET_TIME_relative_to_absolute
(PENDING_MESSAGE_TIMEOUT);
+ vsmr = (struct PeerVerifySuccessorResultMessage *) &pending[1];
+ pending->msg = &vsmr->header;
+ vsmr->header.size = htons (msize);
+ vsmr->header.type = htons
(GNUNET_MESSAGE_TYPE_XDHT_P2P_VERIFY_SUCCESSOR_RESULT);
+ vsmr->querying_peer = querying_peer;
+ vsmr->current_successor = current_successor;
+ vsmr->probable_successor = probable_successor;
+ vsmr->trail_direction = htonl (trail_direction);
+ vsmr->trail_id = trail_id;
+ peer_list = (struct GNUNET_PeerIdentity *) &vsmr[1];
+ memcpy (peer_list, trail, trail_length * sizeof (struct
GNUNET_PeerIdentity));
+
+ /* Send the message to chosen friend. */
+ GNUNET_CONTAINER_DLL_insert_tail (target_friend->head, target_friend->tail,
pending);
+ target_friend->pending_count++;
+ process_friend_queue (target_friend);
+}
+
+
+/**
+ * Construct a notify new successor message and send it to target_friend
+ * @param source_peer Peer which wants to notify to its new successor that it
+ * could be its predecessor.
+ * @param successor New successor of @a source_peer
+ * @param successor_trail List of peers in Trail to reach from
+ * @a source_peer to @a new_successor, NOT including
+ * the endpoints.
+ * @param successor_trail_length Total number of peers in @a
new_successor_trail.
+ * @param successor_trail_id Unique identifier of @a new_successor_trail.
+ * @param target_friend Next friend to get this message.
+ */
+void
+GDS_NEIGHBOURS_send_notify_new_successor (struct GNUNET_PeerIdentity
source_peer,
+ struct GNUNET_PeerIdentity successor,
+ const struct GNUNET_PeerIdentity
*successor_trail,
+ unsigned int successor_trail_length,
+ struct GNUNET_HashCode
succesor_trail_id,
+ struct FriendInfo *target_friend)
+{
+ struct PeerNotifyNewSuccessorMessage *nsm;
+ struct P2PPendingMessage *pending;
+ struct GNUNET_PeerIdentity *peer_list;
+ size_t msize;
+
+ msize = sizeof (struct PeerNotifyNewSuccessorMessage) +
+ (successor_trail_length * sizeof(struct GNUNET_PeerIdentity));
+
+ if (msize >= GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE)
+ {
+ GNUNET_break (0);
+ return;
+ }
+
+ if (target_friend->pending_count >= MAXIMUM_PENDING_PER_FRIEND)
+ {
+ GNUNET_STATISTICS_update (GDS_stats, gettext_noop ("# P2P messages dropped
due to full queue"),
+ 1, GNUNET_NO);
+ }
+
+ pending = GNUNET_malloc (sizeof (struct P2PPendingMessage) + msize);
+ pending->importance = 0; /* FIXME */
+ pending->timeout = GNUNET_TIME_relative_to_absolute
(PENDING_MESSAGE_TIMEOUT);
+ nsm = (struct PeerNotifyNewSuccessorMessage *) &pending[1];
+ pending->msg = &nsm->header;
+ nsm->header.size = htons (msize);
+ nsm->header.type = htons (GNUNET_MESSAGE_TYPE_XDHT_P2P_NOTIFY_NEW_SUCCESSOR);
+ nsm->new_successor = successor;
+ nsm->source_peer = source_peer;
+ nsm->trail_id = succesor_trail_id;
+ peer_list = (struct GNUNET_PeerIdentity *) &nsm[1];
+ memcpy (peer_list, successor_trail,
+ successor_trail_length * sizeof (struct GNUNET_PeerIdentity));
+
+ /* Send the message to chosen friend. */
+ GNUNET_CONTAINER_DLL_insert_tail (target_friend->head, target_friend->tail,
pending);
+ target_friend->pending_count++;
+ process_friend_queue (target_friend);
+}
+
+
+/**
+ * Construct an add_trail message and send it to target_friend
+ * @param source_peer Source of the trail.
+ * @param destination_peer Destination of the trail.
+ * @param trail_id Unique identifier of the trail from
+ * @a source_peer to @a destination_peer, NOT including the
endpoints.
+ * @param trail List of peers in Trail from @a source_peer to @a
destination_peer,
+ * NOT including the endpoints.
+ * @param trail_length Total number of peers in @a trail.
+ * @param target_friend Next friend to get this message.
+ */
+void
+GDS_NEIGHBOURS_send_add_trail (struct GNUNET_PeerIdentity source_peer,
+ struct GNUNET_PeerIdentity destination_peer,
+ struct GNUNET_HashCode trail_id,
+ const struct GNUNET_PeerIdentity *trail,
+ unsigned int trail_length,
+ struct FriendInfo *target_friend)
+{
+ struct PeerAddTrailMessage *adm;
+ struct GNUNET_PeerIdentity *peer_list;
+ struct P2PPendingMessage *pending;
+ size_t msize;
+
+ msize = sizeof (struct PeerAddTrailMessage) +
+ (trail_length * sizeof(struct GNUNET_PeerIdentity));
+
+ if (msize >= GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE)
+ {
+ GNUNET_break (0);
+ return;
+ }
+
+ if (target_friend->pending_count >= MAXIMUM_PENDING_PER_FRIEND)
+ {
+ GNUNET_STATISTICS_update (GDS_stats, gettext_noop ("# P2P messages dropped
due to full queue"),
+ 1, GNUNET_NO);
+ }
+
+ pending = GNUNET_malloc (sizeof (struct P2PPendingMessage) + msize);
+ pending->importance = 0; /* FIXME */
+ pending->timeout = GNUNET_TIME_relative_to_absolute
(PENDING_MESSAGE_TIMEOUT);
+ adm = (struct PeerAddTrailMessage *) &pending[1];
+ pending->msg = &adm->header;
+ adm->header.size = htons (msize);
+ adm->header.type = htons (GNUNET_MESSAGE_TYPE_XDHT_P2P_ADD_TRAIL);
+ adm->source_peer = source_peer;
+ adm->destination_peer = destination_peer;
+ adm->trail_id = trail_id;
+ peer_list = (struct GNUNET_PeerIdentity *)&adm[1];
+ memcpy (peer_list, trail, sizeof (struct GNUNET_PeerIdentity) *
trail_length);
+
+ /* Send the message to chosen friend. */
+ GNUNET_CONTAINER_DLL_insert_tail (target_friend->head, target_friend->tail,
pending);
+ target_friend->pending_count++;
+ process_friend_queue (target_friend);
+
+}
+
+
+/**
+ * Search my location in trail. In case I am present more than once in the
+ * trail (can happen during trail setup), then return my lowest index.
+ * @param trail List of peers
+ * @return my_index if found
+ * trail_length + 1 if an entry is present twice, It is an error.
+ * -1 if no entry found.
+ */
+static int
+search_my_index (const struct GNUNET_PeerIdentity *trail,
+ int trail_length)
+{
+ int i;
+ int index_seen = trail_length + 1;
+ int flag = 0;
+
+ for (i = 0; i < trail_length; i++)
+ {
+ if (0 == GNUNET_CRYPTO_cmp_peer_identity (&my_identity, &trail[i]))
+ {
+ flag = 1;
+ if(index_seen == (trail_length + 1))
+ index_seen = i;
+ else
+ {
+ DEBUG("Entry is present twice in trail. Its not allowed\n");
+ }
+ break;
+ }
+ }
+
+ if (1 == flag)
+ return index_seen;
+ else
+ return -1;
+}
+
+
+/**
+ * Check if the friend is congested or have reached maximum number of trails
+ * it can be part of of.
+ * @param friend Friend to be checked.
+ * @return #GNUNET_NO if friend is not congested or have not crossed threshold.
+ * #GNUNET_YES if friend is either congested or have crossed threshold
+ */
+static int
+is_friend_congested (struct FriendInfo *friend)
+{
+ if (( friend->trails_count < TRAILS_THROUGH_FRIEND_THRESHOLD) &&
+ ((0 == GNUNET_TIME_absolute_get_remaining
+ (friend->congestion_timestamp).rel_value_us)))
+ return GNUNET_NO;
+ else
+ return GNUNET_YES;
+}
+
+
+/**
+ * Select closest finger to value.
+ * @param peer1 First peer
+ * @param peer2 Second peer
+ * @param value Value to be compare
+ * @return Closest peer
+ */
+static struct GNUNET_PeerIdentity
+select_closest_finger (const struct GNUNET_PeerIdentity *peer1,
+ const struct GNUNET_PeerIdentity *peer2,
+ uint64_t value)
+{
+ uint64_t peer1_value;
+ uint64_t peer2_value;
+
+ memcpy (&peer1_value, peer1, sizeof (uint64_t));
+ memcpy (&peer2_value, peer2, sizeof (uint64_t));
+ peer1_value = GNUNET_ntohll (peer1_value);
+ peer2_value = GNUNET_ntohll (peer2_value);
+
+ if (peer1_value == value)
+ {
+ return *peer1;
+ }
+
+ if (peer2_value == value)
+ {
+ return *peer2;
+ }
+
+ if (value < peer1_value && peer1_value < peer2_value)
+ {
+ return *peer1;
+ }
+ else if (value < peer2_value && peer2_value < peer1_value)
+ {
+ return *peer2;
+ }
+ else if (peer1_value < value && value < peer2_value)
+ {
+ return *peer2;
+ }
+ else if (peer2_value < value && value < peer1_value)
+ {
+ return *peer1;
+ }
+ else if (peer1_value < peer2_value && peer2_value < value)
+ {
+ return *peer1;
+ }
+ else // if (peer2_value < peer1_value && peer1_value < value)
+ {
+ return *peer2;
+ }
+}
+
+
+/**
+ * Select closest predecessor to value.
+ * @param peer1 First peer
+ * @param peer2 Second peer
+ * @param value Value to be compare
+ * @return Peer which precedes value in the network.
+ */
+static struct GNUNET_PeerIdentity
+select_closest_predecessor (const struct GNUNET_PeerIdentity *peer1,
+ const struct GNUNET_PeerIdentity *peer2,
+ uint64_t value)
+{
+ uint64_t peer1_value;
+ uint64_t peer2_value;
+
+ memcpy (&peer1_value, peer1, sizeof (uint64_t));
+ memcpy (&peer2_value, peer2, sizeof (uint64_t));
+ peer1_value = GNUNET_ntohll (peer1_value);
+ peer2_value = GNUNET_ntohll (peer2_value);
+
+ if (peer1_value == value)
+ {
+ return *peer1;
+ }
+
+ if (peer2_value == value)
+ {
+ return *peer2;
+ }
+
+ if (value < peer1_value && peer1_value < peer2_value)
+ {
+ return *peer2;
+ }
+ else if (value < peer2_value && peer2_value < peer1_value)
+ {
+ return *peer1;
+ }
+ else if (peer1_value < value && value < peer2_value)
+ {
+ return *peer1;
+ }
+ else if (peer2_value < value && value < peer1_value)
+ {
+ return *peer2;
+ }
+ else if (peer1_value < peer2_value && peer2_value < value)
+ {
+ return *peer2;
+ }
+ else // if (peer2_value < peer1_value && peer1_value < value)
+ {
+ return *peer1;
+ }
+}
+
+#if 0
+/**
+ *
+ *
+ */
+void
+test_print_trail (struct GNUNET_PeerIdentity *trail,
+ unsigned int trail_length)
+{
+ struct GNUNET_PeerIdentity print_peer;
+ int i;
+
+ FPRINTF (stderr,_("\nSUPU %s, %s, %d,trail_length = %d"),
+ __FILE__, __func__,__LINE__,trail_length);
+ for (i =0 ; i< trail_length; i++)
+ {
+ print_peer = trail[i];
+ FPRINTF (stderr,_("\nSUPU %s, %s, %d,trail[%d]=%s"),
+ __FILE__, __func__,__LINE__,i,GNUNET_i2s(&print_peer));
+ }
+}
+#endif
+
+#if 0
+/**
+ * This is a test function to print all the entries of friend table.
+ */
+static void
+test_friend_peermap_print ()
+{
+ struct FriendInfo *friend;
+ struct GNUNET_CONTAINER_MultiPeerMapIterator *friend_iter;
+ struct GNUNET_PeerIdentity print_peer;
+ struct GNUNET_PeerIdentity key_ret;
+ int i;
+
+ print_peer = my_identity;
+ FPRINTF (stderr,_("\nSUPU************ FRIEND_PEERMAP of
%s"),GNUNET_i2s(&print_peer));
+ friend_iter = GNUNET_CONTAINER_multipeermap_iterator_create (friend_peermap);
+
+ for (i = 0; i < GNUNET_CONTAINER_multipeermap_size (friend_peermap); i++)
+ {
+ if(GNUNET_YES == GNUNET_CONTAINER_multipeermap_iterator_next (friend_iter,
+ &key_ret,
+ (const void
**)&friend))
+ {
+ memcpy (&print_peer, &key_ret, sizeof (struct GNUNET_PeerIdentity));
+ FPRINTF (stderr,_("\nSUPU %s, %s, %d, friend = %s, friend->trails_count
= %d"),
+ __FILE__, __func__,__LINE__, GNUNET_i2s(&print_peer),
friend->trails_count);
+ }
+ }
+}
+#endif
+
+#if 0
+/**
+ * This is a test function, to print all the entries of finger table.
+ */
+static void
+test_finger_table_print()
+{
+ struct FingerInfo *finger;
+ struct GNUNET_PeerIdentity print_peer;
+ //struct Trail *trail;
+ int i;
+ //int j;
+ //int k;
+ print_peer = my_identity;
+ FPRINTF (stderr,_("\nSUPU************ FINGER_TABLE of
%s"),GNUNET_i2s(&print_peer));
+ for (i = 0; i < MAX_FINGERS; i++)
+ {
+ finger = &finger_table[i];
+
+ if (GNUNET_NO == finger->is_present)
+ continue;
+
+ print_peer = finger->finger_identity;
+ FPRINTF (stderr,_("\nSUPU %s, %s, %d, finger_table[%d] = %s, trails_count
= %d"),
+ __FILE__, __func__,__LINE__,i,GNUNET_i2s (&print_peer),
finger->trails_count);
+
+#if 0
+ for (j = 0; j < finger->trails_count; j++)
+ {
+ trail = &finger->trail_list[j];
+ FPRINTF (stderr,_("\nSUPU %s, %s, %d, trail_id[%d]=%s"),__FILE__,
__func__,__LINE__,j, GNUNET_h2s(&trail->trail_id));
+ struct Trail_Element *element;
+ element = trail->trail_head;
+ for (k = 0; k < trail->trail_length; k++)
+ {
+ print_peer = element->peer;
+ FPRINTF (stderr,_("\nSUPU %s, %s, %d,trail[%d] = %s "),__FILE__,
__func__,__LINE__,k, GNUNET_i2s(&print_peer));
+ element = element->next;
+ }
+ }
+ #endif
+ }
+}
+#endif
+
+/**
+ * Select the closest peer among two peers (which should not be same)
+ * with respect to value and finger_table_index
+ * NOTE: peer1 != peer2
+ * @param peer1 First peer
+ * @param peer2 Second peer
+ * @param value Value relative to which we find the closest
+ * @param is_predecessor Is value a predecessor or any other finger.
+ * @return Closest peer among two peers.
+ */
+static struct GNUNET_PeerIdentity
+select_closest_peer (const struct GNUNET_PeerIdentity *peer1,
+ const struct GNUNET_PeerIdentity *peer2,
+ uint64_t value,
+ unsigned int is_predecessor)
+{
+ /* This check is here to ensure that calling function never sends
+ same peer value in peer1 and peer2. Remove it later. */
+ GNUNET_assert(0 != GNUNET_CRYPTO_cmp_peer_identity (peer1, peer2));
+ if (1 == is_predecessor)
+ return select_closest_predecessor (peer1, peer2, value);
+
+ // TODO: Change name to something like select_closest_successor!!
+ return select_closest_finger (peer1, peer2, value);
+}
+
+
+/**
+ * Iterate over the list of all the trails of a finger. In case the first
+ * friend to reach the finger has reached trail threshold or is congested,
+ * then don't select it. In case there multiple available good trails to reach
+ * to Finger, choose the one with shortest trail length.
+ * Note: We use length as parameter. But we can use any other suitable
parameter
+ * also.
+ * @param finger Finger Finger whose trail we have to select.
+ * @return Trail Selected Trail.
+ */
+static struct Trail *
+select_finger_trail (struct FingerInfo *finger)
+{
+ struct FriendInfo *friend;
+ struct Trail *current_finger_trail;
+ struct Trail *best_trail = NULL;
+ unsigned int i;
+
+ GNUNET_assert (finger->trails_count > 0);
+ for (i = 0; i < finger->trails_count; i++)
+ {
+ current_finger_trail = &finger->trail_list[i];
+
+ /* No trail stored at this index. */
+ if (GNUNET_NO == current_finger_trail->is_present)
+ continue;
+
+ GNUNET_assert (NULL !=
+ (friend =
+ GNUNET_CONTAINER_multipeermap_get (friend_peermap,
+
¤t_finger_trail->trail_head->peer)));
+
+ /* First friend to reach trail is not free. */
+ if (GNUNET_YES == is_friend_congested (friend))
+ continue;
+
+ if (NULL == best_trail ||
+ best_trail->trail_length > current_finger_trail->trail_length)
+ {
+ best_trail = current_finger_trail;
+ }
+ }
+
+ return best_trail;
+}
+
+
+/**
+ * Compare FINGER entry with current successor. If finger's first friend of all
+ * its trail is not congested and has not crossed trail threshold, then check
+ * if finger peer identity is closer to final_destination_finger_value than
+ * current_successor. If yes then update current_successor.
+ * @param current_successor[in/out]
+ * @return
+ */
+static void
+compare_finger_and_current_closest_peer (struct Closest_Peer
*current_closest_peer)
+{
+ struct FingerInfo *finger;
+ struct GNUNET_PeerIdentity closest_peer;
+ struct Trail *finger_trail;
+ int i;
+
+ /* Iterate over finger table. */
+ for (i = 0; i < MAX_FINGERS; i++)
+ {
+ finger = &finger_table[i];
+
+ if (GNUNET_NO == finger->is_present)
+ continue;
+
+ if (0 == GNUNET_CRYPTO_cmp_peer_identity (&finger->finger_identity,
+
¤t_closest_peer->best_known_destination))
+ continue;
+
+ /* If I am my own finger, then ignore this finger. */
+ if (0 == GNUNET_CRYPTO_cmp_peer_identity (&finger->finger_identity,
+ &my_identity))
+ continue;
+
+ /* If finger is a friend, we have already checked it in previous function.
*/
+ if (NULL != (GNUNET_CONTAINER_multipeermap_get (friend_peermap,
+ &finger->finger_identity)))
+ {
+ continue;
+ }
+
+ closest_peer = select_closest_peer (&finger->finger_identity,
+
¤t_closest_peer->best_known_destination,
+
current_closest_peer->destination_finger_value,
+ current_closest_peer->is_predecessor);
+
+ if (0 == GNUNET_CRYPTO_cmp_peer_identity(&finger->finger_identity,
&closest_peer))
+ {
+ /* Choose one of the trail to reach to finger. */
+ finger_trail = select_finger_trail (finger);
+
+ /* In case no trail found, ignore this finger. */
+ if (NULL == finger_trail)
+ continue;
+
+ current_closest_peer->best_known_destination = closest_peer;
+ current_closest_peer->next_hop = finger_trail->trail_head->peer;
+ current_closest_peer->trail_id = finger_trail->trail_id;
+ current_closest_peer->finger_table_index = i;
+ }
+ continue;
+ }
+}
+
+
+/**
+ * Compare friend entry with current successor.
+ * If friend identity and current_successor is same, then do nothing.
+ * If friend is not congested and has not crossed trail threshold, then check
+ * if friend peer identity is closer to final_destination_finger_value than
+ * current_successor. If yes then update current_successor.
+ * @param cls closure
+ * @param key current public key
+ * @param value struct Closest_Peer
+ * @return #GNUNET_YES if we should continue to iterate,
+ * #GNUNET_NO if not.
+ */
+static int
+compare_friend_and_current_closest_peer (void *cls,
+ const struct GNUNET_PeerIdentity *key,
+ void *value)
+{
+ struct FriendInfo *friend = value;
+ struct Closest_Peer *current_closest_peer = cls;
+ struct GNUNET_PeerIdentity closest_peer;
+
+ /* Friend is either congested or has crossed threshold. */
+ if (GNUNET_YES == is_friend_congested (friend))
+ return GNUNET_YES;
+
+ /* If current_closest_peer and friend identity are same, then do nothing.*/
+ if (0 == GNUNET_CRYPTO_cmp_peer_identity (&friend->id,
+
¤t_closest_peer->best_known_destination))
+ {
+ GNUNET_break (0);
+ return GNUNET_YES;
+ }
+
+ closest_peer = select_closest_peer (&friend->id,
+
¤t_closest_peer->best_known_destination,
+
current_closest_peer->destination_finger_value,
+ current_closest_peer->is_predecessor);
+
+ /* Is friend the closest successor? */
+ if (0 == GNUNET_CRYPTO_cmp_peer_identity(&friend->id, &closest_peer))
+ {
+ current_closest_peer->best_known_destination = friend->id;
+ current_closest_peer->next_hop = friend->id;
+ }
+
+ return GNUNET_YES;
+}
+
+
+/**
+ * Initialize current_successor to my_identity.
+ * @param my_identity My peer identity
+ * @return Updated closest_peer
+ */
+static struct Closest_Peer
+init_closest_peer (struct GNUNET_PeerIdentity my_identity,
+ uint64_t destination_finger_value,
+ unsigned int is_predecessor)
+{
+ struct Closest_Peer current_closest_peer;
+
+ memset (¤t_closest_peer.trail_id, 0, sizeof(struct GNUNET_HashCode));
+ current_closest_peer.destination_finger_value = destination_finger_value;
+ current_closest_peer.is_predecessor = is_predecessor;
+ current_closest_peer.next_hop = my_identity;
+ current_closest_peer.best_known_destination = my_identity;
+ current_closest_peer.finger_table_index = 65; //65 is a for non valid finger
table index.
+ return current_closest_peer;
+}
+
+
+/**
+ * Find locally best known peer, among your own identity, friend and finger
list,
+ * which is closest to given destination_finger_value.
+ *
+ * NOTE: In case a friend is also a finger, then it is always chosen as friend
+ * not a finger.
+ * @param destination_finger_value Peer closest to this value will be the next
destination.
+ * @param is_predecessor Are we looking for predecessor or finger?
+ * @return Closest_Peer that contains all the relevant field to reach to
+ * @a destination_finger_value
+ */
+static struct Closest_Peer
+find_local_best_known_next_hop (uint64_t destination_finger_value,
+ unsigned int is_predecessor)
+{
+ struct Closest_Peer current_closest_peer;
+
+ /* Initialize current_successor to my_identity. */
+ current_closest_peer = init_closest_peer (my_identity,
+ destination_finger_value,
+ is_predecessor);
+
+ /* Compare each friend entry with current_successor and update
current_successor
+ * with friend if its closest. */
+ GNUNET_assert
+ (GNUNET_SYSERR !=
+ GNUNET_CONTAINER_multipeermap_iterate (friend_peermap,
+
&compare_friend_and_current_closest_peer,
+ ¤t_closest_peer));
+
+ /* Compare each finger entry with current_successor and update
current_successor
+ * with finger if its closest. */
+ compare_finger_and_current_closest_peer (¤t_closest_peer);
+ return current_closest_peer;
+}
+
+
+/**
+ * Construct a Put message and send it to target_peer.
+ * @param key Key for the content
+ * @param block_type Type of the block
+ * @param options Routing options
+ * @param desired_replication_level Desired replication count
+ * @param best_known_dest Peer to which this message should reach eventually,
+ * as it is best known destination to me.
+ * @param intermediate_trail_id Trail id in case
+ * @param target_peer Peer to which this message will be forwarded.
+ * @param hop_count Number of hops traversed so far.
+ * @param put_path_length Total number of peers in @a put_path
+ * @param put_path Number of peers traversed so far
+ * @param expiration_time When does the content expire
+ * @param data Content to store
+ * @param data_size Size of content @a data in bytes
+ */
+void
+GDS_NEIGHBOURS_send_put (const struct GNUNET_HashCode *key,
+ enum GNUNET_BLOCK_Type block_type,
+ enum GNUNET_DHT_RouteOption options,
+ uint32_t desired_replication_level,
+ struct GNUNET_PeerIdentity
best_known_dest,
+ struct GNUNET_HashCode
intermediate_trail_id,
+ struct GNUNET_PeerIdentity
*target_peer,
+ uint32_t hop_count,
+ uint32_t put_path_length,
+ struct GNUNET_PeerIdentity *put_path,
+ struct GNUNET_TIME_Absolute expiration_time,
+ const void *data, size_t data_size)
+{
+ struct PeerPutMessage *ppm;
+ struct P2PPendingMessage *pending;
+ struct FriendInfo *target_friend;
+ struct GNUNET_PeerIdentity *pp;
+ size_t msize;
+
+ msize = put_path_length * sizeof (struct GNUNET_PeerIdentity) + data_size +
+ sizeof (struct PeerPutMessage);
+ if (msize >= GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE)
+ {
+ put_path_length = 0;
+ msize = data_size + sizeof (struct PeerPutMessage);
+ }
+
+ if (msize >= GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE)
+ {
+ DEBUG("msize = %lu\n",msize);
+ GNUNET_break (0);
+ return;
+ }
+
+ GNUNET_assert (NULL !=
+ (target_friend =
+ GNUNET_CONTAINER_multipeermap_get (friend_peermap,
target_peer)));
+ pending = GNUNET_malloc (sizeof (struct P2PPendingMessage) + msize);
+ pending->timeout = expiration_time;
+ ppm = (struct PeerPutMessage *) &pending[1];
+ pending->msg = &ppm->header;
+ ppm->header.size = htons (msize);
+ ppm->header.type = htons (GNUNET_MESSAGE_TYPE_XDHT_P2P_PUT);
+ ppm->options = htonl (options);
+ ppm->block_type = htonl (block_type);
+ ppm->hop_count = htonl (hop_count + 1);
+ ppm->desired_replication_level = htonl (desired_replication_level);
+ ppm->expiration_time = GNUNET_TIME_absolute_hton (expiration_time);
+ ppm->best_known_destination = best_known_dest;
+ ppm->intermediate_trail_id = intermediate_trail_id;
+ ppm->key = *key;
+ pp = (struct GNUNET_PeerIdentity *) &ppm[1];
+ ppm->put_path_length = htonl (put_path_length);
+ if(put_path_length > 0)
+ {
+ memcpy (pp, put_path,
+ sizeof (struct GNUNET_PeerIdentity) * put_path_length);
+ }
+ memcpy (&pp[put_path_length], data, data_size);
+ GNUNET_assert (NULL != target_friend);
+ GNUNET_CONTAINER_DLL_insert_tail (target_friend->head, target_friend->tail,
pending);
+ target_friend->pending_count++;
+ process_friend_queue (target_friend);
+}
+
+
+/**
+ * Handle the put request from the client.
+ * @param key Key for the content
+ * @param block_type Type of the block
+ * @param options Routing options
+ * @param desired_replication_level Desired replication count
+ * @param expiration_time When does the content expire
+ * @param data Content to store
+ * @param data_size Size of content @a data in bytes
+ */
+void
+GDS_NEIGHBOURS_handle_put (const struct GNUNET_HashCode *key,
+ enum GNUNET_BLOCK_Type block_type,
+ enum GNUNET_DHT_RouteOption options,
+ uint32_t desired_replication_level,
+ struct GNUNET_TIME_Absolute expiration_time,
+ const void *data, size_t data_size)
+{
+ struct GNUNET_PeerIdentity best_known_dest;
+ struct GNUNET_HashCode intermediate_trail_id;
+ struct GNUNET_PeerIdentity next_hop;
+ uint64_t key_value;
+ struct Closest_Peer successor;
+
+ memcpy (&key_value, key, sizeof (uint64_t));
+ key_value = GNUNET_ntohll (key_value);
+ successor = find_local_best_known_next_hop (key_value,
+ GDS_FINGER_TYPE_NON_PREDECESSOR);
+ best_known_dest = successor.best_known_destination;
+ next_hop = successor.next_hop;
+ intermediate_trail_id = successor.trail_id;
+
+ if (0 == GNUNET_CRYPTO_cmp_peer_identity (&best_known_dest, &my_identity))
+ {
+ DEBUG("\n PUT_REQUEST_SUCCESSFUL for key = %s",GNUNET_h2s(key));
+ /* I am the destination. */
+ GDS_DATACACHE_handle_put (expiration_time, key, 0, NULL,
+ block_type,data_size,data);
+ GDS_CLIENTS_process_put (options, block_type, 0,
+ ntohl (desired_replication_level),
+ 1, &my_identity, expiration_time, //FIXME:
GNUNETnthoh something on expiration time.
+ key, data, data_size);
+ return;
+ }
+ /* In case we are sending the request to a finger, then send across all of
its
+ trail.*/
+#if ENABLE_MALICIOUS
+ if (0 != GNUNET_CRYPTO_cmp_peer_identity (&successor.best_known_destination,
+ &successor.next_hop))
+ {
+ struct FingerInfo *next_hop_finger;
+ unsigned int i;
+
+ next_hop_finger = &finger_table[successor.finger_table_index];
+ for (i = 0; i < next_hop_finger->trails_count; i++)
+ {
+ if (GNUNET_YES == next_hop_finger->trail_list[i].is_present)
+ {
+ if(0 == next_hop_finger->trail_list[i].trail_length)
+ {
+ GDS_NEIGHBOURS_send_put (key, block_type, options,
desired_replication_level,
+ best_known_dest, intermediate_trail_id,
&next_hop,
+ 0, 1, &my_identity, expiration_time,
+ data, data_size);
+ return;
+ }
+ next_hop = next_hop_finger->trail_list[i].trail_head->peer;
+ GDS_NEIGHBOURS_send_put (key, block_type, options,
desired_replication_level,
+ best_known_dest,
+ next_hop_finger->trail_list[i].trail_id,
+ &next_hop, 0, 1, &my_identity,
+ expiration_time,
+ data, data_size);
+ }
+ }
+ return;
+ }
+#endif
+ GDS_NEIGHBOURS_send_put (key, block_type, options, desired_replication_level,
+ best_known_dest, intermediate_trail_id, &next_hop,
+ 0, 1, &my_identity, expiration_time,
+ data, data_size);
+}
+
+/**
+ * Construct a Get message and send it to target_peer.
+ * @param key Key for the content
+ * @param block_type Type of the block
+ * @param options Routing options
+ * @param desired_replication_level Desired replication count
+ * @param best_known_dest Peer which should get this message. Same as target
peer
+ * if best_known_dest is a friend else its a finger.
+ * @param intermediate_trail_id Trail id to reach to @a best_known_dest
+ * in case it is a finger else set to 0.
+ * @param target_peer Peer to which this message will be forwarded.
+ * @param hop_count Number of hops traversed so far.
+ * @param data Content to store
+ * @param data_size Size of content @a data in bytes
+ * @param get_path_length Total number of peers in @a get_path
+ * @param get_path Number of peers traversed so far
+ */
+void
+GDS_NEIGHBOURS_send_get (const struct GNUNET_HashCode *key,
+ enum GNUNET_BLOCK_Type block_type,
+ enum GNUNET_DHT_RouteOption options,
+ uint32_t desired_replication_level,
+ struct GNUNET_PeerIdentity best_known_dest,
+ struct GNUNET_HashCode intermediate_trail_id,
+ struct GNUNET_PeerIdentity *target_peer,
+ uint32_t hop_count,
+ uint32_t get_path_length,
+ struct GNUNET_PeerIdentity *get_path)
+{
+ struct PeerGetMessage *pgm;
+ struct P2PPendingMessage *pending;
+ struct FriendInfo *target_friend;
+ struct GNUNET_PeerIdentity *gp;
+ size_t msize;
+
+ msize = sizeof (struct PeerGetMessage) +
+ (get_path_length * sizeof (struct GNUNET_PeerIdentity));
+
+ if (msize >= GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE)
+ {
+ GNUNET_break (0);
+ return;
+ }
+ GNUNET_assert (NULL !=
+ (target_friend =
+ GNUNET_CONTAINER_multipeermap_get (friend_peermap,
target_peer)));
+
+ pending = GNUNET_malloc (sizeof (struct P2PPendingMessage) + msize);
+ pending->timeout = GNUNET_TIME_relative_to_absolute
(PENDING_MESSAGE_TIMEOUT);
+ pending->importance = 0; /* FIXME */
+ pgm = (struct PeerGetMessage *) &pending[1];
+ pending->msg = &pgm->header;
+ pgm->header.size = htons (msize);
+ pgm->header.type = htons (GNUNET_MESSAGE_TYPE_XDHT_P2P_GET);
+ pgm->get_path_length = htonl (get_path_length);
+ pgm->best_known_destination = best_known_dest;
+ pgm->key = *key;
+ pgm->intermediate_trail_id = intermediate_trail_id;
+ pgm->hop_count = htonl (hop_count + 1);
+ pgm->get_path_length = htonl (get_path_length);
+ gp = (struct GNUNET_PeerIdentity *) &pgm[1];
+ memcpy (gp, get_path,
+ sizeof (struct GNUNET_PeerIdentity) * get_path_length);
+ GNUNET_CONTAINER_DLL_insert_tail (target_friend->head, target_friend->tail,
pending);
+ target_friend->pending_count++;
+ process_friend_queue (target_friend);
+}
+
+
+/**
+ * Handle the get request from the client file. If I am destination do
+ * datacache put and return. Else find the target friend and forward message
+ * to it.
+ * @param key Key for the content
+ * @param block_type Type of the block
+ * @param options Routing options
+ * @param desired_replication_level Desired replication count
+ */
+void
+GDS_NEIGHBOURS_handle_get(const struct GNUNET_HashCode *key,
+ enum GNUNET_BLOCK_Type block_type,
+ enum GNUNET_DHT_RouteOption options,
+ uint32_t desired_replication_level)
+{
+ struct Closest_Peer successor;
+ struct GNUNET_PeerIdentity best_known_dest;
+ struct GNUNET_HashCode intermediate_trail_id;
+ uint64_t key_value;
+
+ memcpy (&key_value, key, sizeof (uint64_t));
+ key_value = GNUNET_ntohll (key_value);
+
+ successor = find_local_best_known_next_hop (key_value,
+ GDS_FINGER_TYPE_NON_PREDECESSOR);
+
+ best_known_dest = successor.best_known_destination;
+ intermediate_trail_id = successor.trail_id;
+
+ /* I am the destination. I have the data. */
+ if (0 == GNUNET_CRYPTO_cmp_peer_identity (&my_identity,
+ &best_known_dest))
+ {
+ GDS_DATACACHE_handle_get (key,block_type, NULL, 0,
+ NULL, 0, 1, &my_identity, NULL,&my_identity);
+ return;
+ }
+
+#if ENABLE_MALICIOUS
+ struct GNUNET_PeerIdentity next_hop;
+ if (0 != GNUNET_CRYPTO_cmp_peer_identity (&successor.best_known_destination,
+ &successor.next_hop))
+ {
+ struct FingerInfo *next_hop_finger;
+ unsigned int i;
+
+ next_hop_finger = &finger_table[successor.finger_table_index];
+ for (i = 0; i < next_hop_finger->trails_count; i++)
+ {
+ if (GNUNET_YES == next_hop_finger->trail_list[i].is_present)
+ {
+ if(0 == next_hop_finger->trail_list[i].trail_length)
+ {
+ GDS_NEIGHBOURS_send_get (key, block_type, options,
+ desired_replication_level,
+ best_known_dest,intermediate_trail_id,
+ &successor.next_hop,
+ 0, 1, &my_identity);
+ return;
+ }
+ next_hop = next_hop_finger->trail_list[i].trail_head->peer;
+ GDS_NEIGHBOURS_send_get (key, block_type, options,
desired_replication_level,
+ best_known_dest,
+ next_hop_finger->trail_list[i].trail_id,
+ &next_hop, 0, 1, &my_identity);
+ }
+ }
+ return;
+ }
+#endif
+ GDS_NEIGHBOURS_send_get (key, block_type, options, desired_replication_level,
+ best_known_dest,intermediate_trail_id,
&successor.next_hop,
+ 0, 1, &my_identity);
+}
+
+
+/**
+ * Send the get result to requesting client.
+ *
+ * @param key Key of the requested data.
+ * @param type Block type
+ * @param target_peer Next peer to forward the message to.
+ * @param source_peer Peer which has the data for the key.
+ * @param put_path_length Number of peers in @a put_path
+ * @param put_path Path taken to put the data at its stored location.
+ * @param get_path_length Number of peers in @a get_path
+ * @param get_path Path taken to reach to the location of the key.
+ * @param expiration When will this result expire?
+ * @param data Payload to store
+ * @param data_size Size of the @a data
+ */
+void
+GDS_NEIGHBOURS_send_get_result (const struct GNUNET_HashCode *key,
+ enum GNUNET_BLOCK_Type type,
+ const struct GNUNET_PeerIdentity *target_peer,
+ const struct GNUNET_PeerIdentity *source_peer,
+ unsigned int put_path_length,
+ const struct GNUNET_PeerIdentity *put_path,
+ unsigned int get_path_length,
+ const struct GNUNET_PeerIdentity *get_path,
+ struct GNUNET_TIME_Absolute expiration,
+ const void *data, size_t data_size)
+{
+ struct PeerGetResultMessage *get_result;
+ struct GNUNET_PeerIdentity *paths;
+ struct P2PPendingMessage *pending;
+ struct FriendInfo *target_friend;
+ int current_path_index;
+ size_t msize;
+
+ msize = (put_path_length + get_path_length )* sizeof (struct
GNUNET_PeerIdentity) +
+ data_size +
+ sizeof (struct PeerGetResultMessage);
+
+ if (msize >= GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE)
+ {
+ put_path_length = 0;
+ msize = msize - put_path_length * sizeof (struct GNUNET_PeerIdentity);
+ }
+
+ if (msize >= GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE)
+ {
+ GNUNET_break(0);
+ return;
+ }
+ current_path_index = 0;
+ if(get_path_length > 0)
+ {
+ current_path_index = search_my_index(get_path, get_path_length);
+ if (-1 == current_path_index)
+ {
+ GNUNET_break (0);
+ return;
+ }
+ if ((get_path_length + 1) == current_path_index)
+ {
+ DEBUG ("Peer found twice in get path. Not allowed \n");
+ GNUNET_break (0);
+ return;
+ }
+ }
+ if (0 == current_path_index)
+ {
+ DEBUG ("GET_RESULT TO CLIENT KEY = %s, Peer =
%s",GNUNET_h2s(key),GNUNET_i2s(&my_identity));
+ GDS_CLIENTS_handle_reply (expiration, key, get_path_length,
+ get_path, put_path_length,
+ put_path, type, data_size, data);
+ return;
+ }
+
+ pending = GNUNET_malloc (sizeof (struct P2PPendingMessage) + msize);
+ pending->timeout = GNUNET_TIME_relative_to_absolute
(PENDING_MESSAGE_TIMEOUT);
+ pending->importance = 0;
+ get_result = (struct PeerGetResultMessage *)&pending[1];
+ pending->msg = &get_result->header;
+ get_result->header.size = htons (msize);
+ get_result->header.type = htons (GNUNET_MESSAGE_TYPE_XDHT_P2P_GET_RESULT);
+ get_result->key = *key;
+ get_result->querying_peer = *source_peer;
+ get_result->expiration_time = expiration;
+ get_result->get_path_length = htonl (get_path_length);
+ get_result->put_path_length = htonl (put_path_length);
+ paths = (struct GNUNET_PeerIdentity *)&get_result[1];
+ memcpy (paths, put_path,
+ put_path_length * sizeof (struct GNUNET_PeerIdentity));
+ memcpy (&paths[put_path_length], get_path,
+ get_path_length * sizeof (struct GNUNET_PeerIdentity));
+ memcpy (&paths[put_path_length + get_path_length], data, data_size);
+
+ GNUNET_assert (NULL !=
+ (target_friend =
+ GNUNET_CONTAINER_multipeermap_get (friend_peermap,
+
&get_path[current_path_index - 1])));
+ GNUNET_CONTAINER_DLL_insert_tail (target_friend->head, target_friend->tail,
pending);
+ target_friend->pending_count++;
+ process_friend_queue (target_friend);
+}
+
+
+/**
+ * Randomly choose one of your friends (which is not congested and have not
crossed
+ * trail threshold) from the friend_peermap
+ * @return Friend Randomly chosen friend.
+ * NULL in case friend peermap is empty, or all the friends are either
+ * congested or have crossed trail threshold.
+ */
+static struct FriendInfo *
+select_random_friend ()
+{
+ unsigned int current_size;
+ uint32_t index;
+ unsigned int j = 0;
+ struct GNUNET_CONTAINER_MultiPeerMapIterator *iter;
+ struct GNUNET_PeerIdentity key_ret;
+ struct FriendInfo *friend;
+
+ current_size = GNUNET_CONTAINER_multipeermap_size (friend_peermap);
+
+ /* No friends.*/
+ if (0 == current_size)
+ return NULL;
+
+ index = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK, current_size);
+ iter = GNUNET_CONTAINER_multipeermap_iterator_create (friend_peermap);
+
+ /* Iterate till you don't reach to index. */
+ for (j = 0; j < index ; j++)
+ GNUNET_assert (GNUNET_YES ==
+ GNUNET_CONTAINER_multipeermap_iterator_next (iter, NULL,
NULL));
+
+ do
+ {
+ /* Reset the index in friend peermap to 0 as we reached to the end. */
+ if (j == current_size)
+ {
+ j = 0;
+ GNUNET_CONTAINER_multipeermap_iterator_destroy (iter);
+ iter = GNUNET_CONTAINER_multipeermap_iterator_create (friend_peermap);
+
+ }
+
+ /* Get the friend stored at the index, j*/
+ GNUNET_assert (GNUNET_YES ==
+ GNUNET_CONTAINER_multipeermap_iterator_next (iter,
+ &key_ret,
+ (const void
**)&friend));
+
+ /* This friend is not congested and has not crossed trail threshold. */
+ if ((friend->trails_count < TRAILS_THROUGH_FRIEND_THRESHOLD) &&
+ (0 == GNUNET_TIME_absolute_get_remaining
(friend->congestion_timestamp).rel_value_us))
+ {
+ break;
+ }
+ friend = NULL;
+ j++;
+ } while (j != index);
+
+ GNUNET_CONTAINER_multipeermap_iterator_destroy (iter);
+ return friend;
+}
+
+
+/**
+ * Compute 64 bit value of finger_identity corresponding to a finger index
using
+ * chord formula.
+ * For all fingers, n.finger[i] = n + pow (2,i),
+ * For predecessor, n.finger[PREDECESSOR_FINGER_ID] = n - 1, where
+ * n = my_identity, i = finger_index, n.finger[i] = 64 bit finger value
+ * @param finger_index Index corresponding to which we calculate 64 bit value.
+ * @return 64 bit value.
+ */
+static uint64_t
+compute_finger_identity_value (unsigned int finger_index)
+{
+ uint64_t my_id64;
+
+ memcpy (&my_id64, &my_identity, sizeof (uint64_t));
+ my_id64 = GNUNET_ntohll (my_id64);
+
+ /* Are we looking for immediate predecessor? */
+ if (PREDECESSOR_FINGER_ID == finger_index)
+ return (my_id64 - 1);
+ else
+ {
+ uint64_t add = (uint64_t)1 << finger_index;
+ return (my_id64 + add);
+ }
+}
+
+
+/*
+ * Choose a random friend. Calculate the next finger identity to search,from
+ * current_search_finger_index. Start looking for the trail to reach to
+ * finger identity through this random friend.
+ *
+ * @param cls closure for this task
+ * @param tc the context under which the task is running
+ */
+static void
+send_find_finger_trail_message (void *cls,
+ const struct GNUNET_SCHEDULER_TaskContext *tc)
+{
+ struct FriendInfo *target_friend;
+ struct GNUNET_HashCode trail_id;
+ struct GNUNET_HashCode intermediate_trail_id;
+ unsigned int is_predecessor = 0;
+ uint64_t finger_id_value;
+
+ /* Schedule another send_find_finger_trail_message task. After one round of
+ * finger search, this time is exponentially backoff. */
+ find_finger_trail_task_next_send_time.rel_value_us =
+ find_finger_trail_task_next_send_time.rel_value_us +
+ GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK,
+ DHT_FIND_FINGER_TRAIL_INTERVAL.rel_value_us);
+ find_finger_trail_task =
+ GNUNET_SCHEDULER_add_delayed (find_finger_trail_task_next_send_time,
+ &send_find_finger_trail_message,
+ NULL);
+
+ /* No space in my routing table. (Source and destination peers also store
entries
+ * in their routing table). */
+ if (GNUNET_YES == GDS_ROUTING_threshold_reached())
+ return;
+
+ target_friend = select_random_friend ();
+ if (NULL == target_friend)
+ {
+ return;
+ }
+
+ finger_id_value = compute_finger_identity_value
(current_search_finger_index);
+ if (PREDECESSOR_FINGER_ID == current_search_finger_index)
+ is_predecessor = 1;
+
+ /* Generate a unique trail id for trail we are trying to setup. */
+ GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_STRONG,
+ &trail_id, sizeof (trail_id));
+ memset(&intermediate_trail_id, 0, sizeof (struct GNUNET_HashCode));
+ GDS_NEIGHBOURS_send_trail_setup (my_identity, finger_id_value,
+ target_friend->id, target_friend, 0, NULL,
+ is_predecessor, trail_id,
+ intermediate_trail_id);
+}
+
+
+/**
+ * In case there are already maximum number of possible trails to reach to a
+ * finger, then check if the new trail's length is lesser than any of the
+ * existing trails.
+ * If yes then replace that old trail by new trail.
+ *
+ * Note: Here we are taking length as a parameter to choose the best possible
+ * trail, but there could be other parameters also like:
+ * 1. duration of existence of a trail - older the better.
+ * 2. if the new trail is completely disjoint than the
+ * other trails, then may be choosing it is better.
+ *
+ * @param finger Finger
+ * @param new_finger_trail List of peers to reach from me to @a finger, NOT
+ * including the endpoints.
+ * @param new_finger_trail_length Total number of peers in @a new_finger_trail
+ * @param new_finger_trail_id Unique identifier of @a new_finger_trail.
+ */
+static void
+select_and_replace_trail (struct FingerInfo *finger,
+ const struct GNUNET_PeerIdentity *new_trail,
+ unsigned int new_trail_length,
+ struct GNUNET_HashCode new_trail_id)
+{
+ struct Trail *current_trail;
+ unsigned int largest_trail_length;
+ unsigned int largest_trail_index;
+ struct Trail_Element *trail_element;
+ struct GNUNET_PeerIdentity *next_hop;
+ unsigned int i;
+
+ largest_trail_length = new_trail_length;
+ largest_trail_index = MAXIMUM_TRAILS_PER_FINGER + 1;
+
+ GNUNET_assert (MAXIMUM_TRAILS_PER_FINGER == finger->trails_count);
+
+ for (i = 0; i < finger->trails_count; i++)
+ {
+ current_trail = &finger->trail_list[i];
+ GNUNET_assert (GNUNET_YES == current_trail->is_present);
+ if (current_trail->trail_length > largest_trail_length)
+ {
+ largest_trail_length = current_trail->trail_length;
+ largest_trail_index = i;
+ }
+ }
+
+ /* New trail is not better than existing ones. Send trail teardown. */
+ if (largest_trail_index == (MAXIMUM_TRAILS_PER_FINGER + 1))
+ {
+ next_hop = GDS_ROUTING_get_next_hop (new_trail_id,
GDS_ROUTING_SRC_TO_DEST);
+ GDS_ROUTING_remove_trail (new_trail_id);
+ GDS_NEIGHBOURS_send_trail_teardown (&new_trail_id,
+ GDS_ROUTING_SRC_TO_DEST,
+ next_hop);
+ return;
+ }
+
+ /* Send trail teardown message across the replaced trail. */
+ struct Trail *replace_trail = &finger->trail_list[largest_trail_index];
+ next_hop = GDS_ROUTING_get_next_hop (replace_trail->trail_id,
GDS_ROUTING_SRC_TO_DEST);
+ GNUNET_assert (GNUNET_YES == GDS_ROUTING_remove_trail
(replace_trail->trail_id));
+ GDS_NEIGHBOURS_send_trail_teardown (&replace_trail->trail_id,
+ GDS_ROUTING_SRC_TO_DEST,
+ next_hop);
+
+ /* Free the trail. */
+ while (NULL != (trail_element = replace_trail->trail_head))
+ {
+ GNUNET_CONTAINER_DLL_remove (replace_trail->trail_head,
+ replace_trail->trail_tail, trail_element);
+ GNUNET_free_non_null (trail_element);
+ }
+
+ /* Add new trial at that location. */
+ replace_trail->is_present = GNUNET_YES;
+ replace_trail->trail_length = new_trail_length;
+ replace_trail->trail_id = new_trail_id;
+
+ for (i = 0; i < new_trail_length; i++)
+ {
+ struct Trail_Element *element = GNUNET_new (struct Trail_Element);
+ element->peer = new_trail[i];
+
+ GNUNET_CONTAINER_DLL_insert_tail (replace_trail->trail_head,
+ replace_trail->trail_tail,
+ element);
+ }
+ /* FIXME: URGENT Are we adding the trail back to the list. */
+}
+
+
+/**
+ * Check if the new trail to reach to finger is unique or do we already have
+ * such a trail present for finger.
+ * @param existing_finger Finger identity
+ * @param new_trail New trail to reach @a existing_finger
+ * @param trail_length Total number of peers in new_trail.
+ * @return #GNUNET_YES if the new trail is unique
+ * #GNUNET_NO if same trail is already present.
+ */
+static int
+is_new_trail_unique (struct FingerInfo *existing_finger,
+ const struct GNUNET_PeerIdentity *new_trail,
+ unsigned int trail_length)
+{
+ struct Trail *current_trail;
+ struct Trail_Element *trail_element;
+ int i;
+ int j;
+
+ GNUNET_assert (existing_finger->trails_count > 0);
+
+ /* Iterate over list of trails. */
+ for (i = 0; i < existing_finger->trails_count; i++)
+ {
+ current_trail = &(existing_finger->trail_list[i]);
+ if(GNUNET_NO == current_trail->is_present)
+ continue;
+
+ /* New trail and existing trail length are not same. */
+ if (current_trail->trail_length != trail_length)
+ {
+ return GNUNET_YES;
+ }
+
+ trail_element = current_trail->trail_head;
+ for (j = 0; j < current_trail->trail_length; j++)
+ {
+ if (0 != GNUNET_CRYPTO_cmp_peer_identity (&new_trail[j],
+ &trail_element->peer))
+ {
+ return GNUNET_YES;
+ }
+ trail_element = trail_element->next;
+ }
+ }
+ return GNUNET_NO;
+}
+
+/**
+ * FIXME; In case of multiple trails, we may have a case where a trail from in
+ * between has been removed, then we should try to find a free slot , not
simply
+ * add a trail at then end of the list.
+ * Add a new trail at a free slot in trail array of existing finger.
+ * @param existing_finger Finger
+ * @param new_finger_trail New trail from me to finger, NOT including endpoints
+ * @param new_finger_trail_length Total number of peers in @a new_finger_trail
+ * @param new_finger_trail_id Unique identifier of the trail.
+ */
+static void
+add_new_trail (struct FingerInfo *existing_finger,
+ const struct GNUNET_PeerIdentity *new_trail,
+ unsigned int new_trail_length,
+ struct GNUNET_HashCode new_trail_id)
+{
+ struct FriendInfo *friend;
+ struct Trail *trail;
+ unsigned int i;
+ int free_slot = -1;
+
+ if (GNUNET_NO == is_new_trail_unique (existing_finger, new_trail,
+ new_trail_length))
+ return;
+
+ for (i = 0; i < existing_finger->trails_count; i++)
+ {
+ if (GNUNET_NO == existing_finger->trail_list[i].is_present)
+ {
+ free_slot = i;
+ break;
+ }
+ }
+
+ if (-1 == free_slot)
+ free_slot = i;
+
+ trail = &existing_finger->trail_list[free_slot];
+ GNUNET_assert (GNUNET_NO == trail->is_present);
+ trail->trail_id = new_trail_id;
+ trail->trail_length = new_trail_length;
+ existing_finger->trails_count++;
+ trail->is_present = GNUNET_YES;
+ if (0 == new_trail_length)
+ {
+ friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap,
+
&existing_finger->finger_identity);
+ }
+ else
+ {
+ friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap,
+ &new_trail[0]);
+ }
+ GNUNET_assert (NULL != friend);
+ friend->trails_count++;
+ for (i = 0; i < new_trail_length; i++)
+ {
+ struct Trail_Element *element;
+
+ element = GNUNET_new (struct Trail_Element);
+ element->peer = new_trail[i];
+ GNUNET_CONTAINER_DLL_insert_tail (trail->trail_head,
+ trail->trail_tail,
+ element);
+ }
+
+ existing_finger->trail_list[free_slot].trail_head = trail->trail_head;
+ existing_finger->trail_list[free_slot].trail_tail = trail->trail_tail;
+ existing_finger->trail_list[free_slot].trail_length = new_trail_length;
+ existing_finger->trail_list[free_slot].trail_id = new_trail_id;
+ existing_finger->trail_list[free_slot].is_present = GNUNET_YES;
+}
+
+
+#if 0
+/**
+ * FIXME; In case of multiple trails, we may have a case where a trail from in
+ * between has been removed, then we should try to find a free slot , not
simply
+ * add a trail at then end of the list.
+ * Add a new trail at a free slot in trail array of existing finger.
+ * @param existing_finger Finger
+ * @param new_finger_trail New trail from me to finger, NOT including endpoints
+ * @param new_finger_trail_length Total number of peers in @a new_finger_trail
+ * @param new_finger_trail_id Unique identifier of the trail.
+ */
+static void
+add_new_trail (struct FingerInfo *existing_finger,
+ const struct GNUNET_PeerIdentity *new_trail,
+ unsigned int new_trail_length,
+ struct GNUNET_HashCode new_trail_id)
+{
+ struct Trail *trail;
+ struct FriendInfo *first_friend;
+ int i;
+ int index;
+
+ if (GNUNET_NO == is_new_trail_unique (existing_finger, new_trail,
+ new_trail_length))
+ return;
+
+ index = existing_finger->trails_count;
+ trail = &existing_finger->trail_list[index];
+ GNUNET_assert (GNUNET_NO == trail->is_present);
+ trail->trail_id = new_trail_id;
+ trail->trail_length = new_trail_length;
+ existing_finger->trails_count++;
+ trail->is_present = GNUNET_YES;
+
+ GNUNET_assert (NULL == (GNUNET_CONTAINER_multipeermap_get (friend_peermap,
+
&existing_finger->finger_identity)));
+ /* If finger is a friend then we never call this function. */
+ GNUNET_assert (new_trail_length > 0);
+
+ first_friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap,
+ &new_trail[0]);
+ first_friend->trails_count++;
+
+ for (i = 0; i < new_trail_length; i++)
+ {
+ struct Trail_Element *element;
+
+ element = GNUNET_new (struct Trail_Element);
+ element->peer = new_trail[i];
+ GNUNET_CONTAINER_DLL_insert_tail (trail->trail_head,
+ trail->trail_tail,
+ element);
+ }
+ /* Do we need to add trail head and trail tail in the trail list itearator.*/
+ existing_finger->trail_list[index].trail_head = trail->trail_head;
+ existing_finger->trail_list[index].trail_tail = trail->trail_tail;
+ existing_finger->trail_list[index].trail_length = new_trail_length;
+ existing_finger->trail_list[index].trail_id = new_trail_id;
+ existing_finger->trail_list[index].is_present = GNUNET_YES;
+}
+#endif
+
+/**
+ * Get the next hop to send trail teardown message from routing table and
+ * then delete the entry from routing table. Send trail teardown message for a
+ * specific trail of a finger.
+ * @param finger Finger whose trail is to be removed.
+ * @param trail List of peers in trail from me to a finger, NOT including
+ * endpoints.
+ */
+static void
+send_trail_teardown (struct FingerInfo *finger,
+ struct Trail *trail)
+{
+ struct FriendInfo *friend;
+ struct GNUNET_PeerIdentity *next_hop;
+
+ next_hop = GDS_ROUTING_get_next_hop (trail->trail_id,
+ GDS_ROUTING_SRC_TO_DEST);
+ if (NULL == next_hop)
+ {
+// DEBUG(" NO ENTRY FOUND IN %s ROUTING TABLE for trail id %s,
line=%d,traillength = %d",
+// GNUNET_i2s(&my_identity), GNUNET_h2s(&trail->trail_id),
__LINE__,trail->trail_length);
+ return;
+ }
+ GNUNET_assert (0 != GNUNET_CRYPTO_cmp_peer_identity
(&finger->finger_identity,
+ &my_identity));
+
+ GNUNET_assert(GNUNET_YES == trail->is_present);
+ if (trail->trail_length > 0)
+ {
+ friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap,
+ &trail->trail_head->peer);
+ }
+ else
+ {
+ friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap,
+ &finger->finger_identity);
+ }
+
+ if(NULL == friend)
+ {
+ DEBUG ("\n LINE NO: = %d, Friend not found for trail id %s of peer %s
trail length = %d",
+ __LINE__,GNUNET_h2s(&trail->trail_id),
GNUNET_i2s(&my_identity),trail->trail_length);
+ return;
+ }
+ if (0 != GNUNET_CRYPTO_cmp_peer_identity (next_hop, &friend->id)
+ && (0 == trail->trail_length))
+ {
+ DEBUG ("\n LINE NO: = %d, Friend not found for trail id %s of peer %s
trail length = %d",
+ __LINE__,GNUNET_h2s(&trail->trail_id),
GNUNET_i2s(&my_identity),trail->trail_length);
+ return;
+ }
+ GNUNET_assert (GNUNET_YES == GDS_ROUTING_remove_trail (trail->trail_id));
+ friend->trails_count--;
+ GDS_NEIGHBOURS_send_trail_teardown (&trail->trail_id,
+ GDS_ROUTING_SRC_TO_DEST,
+ &friend->id);
+}
+
+
+/**
+ * Send trail teardown message across all the trails to reach to finger.
+ * @param finger Finger whose all the trail should be freed.
+ */
+static void
+send_all_finger_trails_teardown (struct FingerInfo *finger)
+{
+ unsigned int i;
+
+ for (i = 0; i < finger->trails_count; i++)
+ {
+ struct Trail *trail;
+
+ trail = &finger->trail_list[i];
+ if (GNUNET_YES == trail->is_present)
+ {
+ send_trail_teardown (finger, trail);
+ trail->is_present = GNUNET_NO;
+ }
+ }
+}
+
+
+/**
+ * Free a specific trail
+ * @param trail List of peers to be freed.
+ */
+static void
+free_trail (struct Trail *trail)
+{
+ struct Trail_Element *trail_element;
+
+ while (NULL != (trail_element = trail->trail_head))
+ {
+ GNUNET_CONTAINER_DLL_remove (trail->trail_head,
+ trail->trail_tail,
+ trail_element);
+ GNUNET_free_non_null (trail_element);
+ }
+ trail->trail_head = NULL;
+ trail->trail_tail = NULL;
+}
+
+
+/**
+ * Free finger and its trail.
+ * @param finger Finger to be freed.
+ * @param finger_table_index Index at which finger is stored.
+ */
+static void
+free_finger (struct FingerInfo *finger, unsigned int finger_table_index)
+{
+ struct Trail *trail;
+ unsigned int i;
+ for (i = 0; i < finger->trails_count; i++)
+ {
+ trail = &finger->trail_list[i];
+ if (GNUNET_NO == trail->is_present)
+ continue;
+
+ if (trail->trail_length > 0)
+ free_trail (trail);
+ trail->is_present = GNUNET_NO;
+ }
+
+ finger->is_present = GNUNET_NO;
+ memset ((void *)&finger_table[finger_table_index], 0, sizeof
(finger_table[finger_table_index]));
+}
+
+
+/**
+ * Add a new entry in finger table at finger_table_index.
+ * In case I am my own finger, then we don't have a trail. In case of a friend,
+ * we have a trail with unique id and '0' trail length.
+ * In case a finger is a friend, then increment the trails count of the friend.
+ * @param finger_identity Peer Identity of new finger
+ * @param finger_trail Trail to reach from me to finger (excluding both end
points).
+ * @param finger_trail_length Total number of peers in @a finger_trail.
+ * @param trail_id Unique identifier of the trail.
+ * @param finger_table_index Index in finger table.
+ */
+static void
+add_new_finger (struct GNUNET_PeerIdentity finger_identity,
+ const struct GNUNET_PeerIdentity *finger_trail,
+ unsigned int finger_trail_length,
+ struct GNUNET_HashCode trail_id,
+ unsigned int finger_table_index)
+{
+ struct FingerInfo *new_entry;
+ struct FriendInfo *first_trail_hop;
+ struct Trail *trail;
+ unsigned int i;
+
+ new_entry = GNUNET_new (struct FingerInfo);
+ new_entry->finger_identity = finger_identity;
+ new_entry->finger_table_index = finger_table_index;
+ new_entry->is_present = GNUNET_YES;
+
+ /* If the new entry is my own identity. */
+ if (0 == GNUNET_CRYPTO_cmp_peer_identity (&my_identity,
+ &finger_identity))
+ {
+ new_entry->trails_count = 0;
+ finger_table[finger_table_index] = *new_entry;
+ GNUNET_free (new_entry);
+ return;
+ }
+
+ /* Finger is a friend. */
+ if (0 == finger_trail_length)
+ {
+ new_entry->trail_list[0].trail_id = trail_id;
+ new_entry->trails_count = 1;
+ new_entry->trail_list[0].is_present = GNUNET_YES;
+ new_entry->trail_list[0].trail_length = 0;
+ new_entry->trail_list[0].trail_head = NULL;
+ new_entry->trail_list[0].trail_tail = NULL;
+ finger_table[finger_table_index] = *new_entry;
+ GNUNET_assert (NULL !=
+ (first_trail_hop =
+ GNUNET_CONTAINER_multipeermap_get (friend_peermap,
+ &finger_identity)));
+
+ first_trail_hop->trails_count++;
+ GNUNET_free (new_entry);
+ return;
+ }
+
+ GNUNET_assert (NULL !=
+ (first_trail_hop =
+ GNUNET_CONTAINER_multipeermap_get (friend_peermap,
+ &finger_trail[0])));
+ new_entry->trails_count = 1;
+ first_trail_hop->trails_count++;
+ /* Copy the finger trail into trail. */
+ trail = &new_entry->trail_list[0];
+ for(i = 0; i < finger_trail_length; i++)
+ {
+ struct Trail_Element *element = GNUNET_new (struct Trail_Element);
+
+ element->next = NULL;
+ element->prev = NULL;
+ element->peer = finger_trail[i];
+ GNUNET_CONTAINER_DLL_insert_tail (trail->trail_head,
+ trail->trail_tail,
+ element);
+ }
+
+ /* Add trail to trail list. */
+ trail->trail_length = finger_trail_length;
+ trail->trail_id = trail_id;
+ trail->is_present = GNUNET_YES;
+ finger_table[finger_table_index] = *new_entry;
+ GNUNET_free (new_entry);
+}
+
+
+/**
+ * Periodic task to verify current successor. There can be multiple trails to
reach
+ * to successor, choose the shortest one and send verify successor message
+ * across that trail.
+ * @param cls closure for this task
+ * @param tc the context under which the task is running
+ */
+static void
+send_verify_successor_message (void *cls,
+ const struct GNUNET_SCHEDULER_TaskContext *tc)
+{
+ struct FriendInfo *target_friend;
+ struct GNUNET_HashCode trail_id;
+ struct Trail *trail;
+ struct Trail_Element *element;
+ unsigned int trail_length;
+ unsigned int i = 0;
+ struct FingerInfo *successor;
+
+ successor = &finger_table[0];
+
+ /* This task will be scheduled when the result for Verify Successor is
received. */
+ send_verify_successor_task = NULL;
+
+ /* When verify successor is being called for first time *for current context*
+ * cls will be NULL. If send_verify_successor_retry_task is not NO_TASK, we
+ * must cancel the retry task scheduled for verify_successor of previous
+ * context.
+ */
+ if (NULL == cls)
+ {
+ /* FIXME: Here we are scheduling a new verify successor task, as we
+ got a new successor. But a send verify successor task may be in progress.
+ 1. We need to be sure that this is indeed a new successor. As this
function
+ is called even if we add a new trail to reach t old successor.
+ 2. Assuming the new successor is different, then verify successor message
+ * to old successor may be following stages.
+ * --> Waiting for verify successor result. Don't wait anymore. there is
+ * no trail to reach from old successor to me, hence, routing
+ * lookup will fail.
+ * --> Waiting for notify confirmation. again don't wait for it. notify
+ * confirmation will not succeded.
+ */
+ if (send_verify_successor_retry_task != NULL)
+ {
+ /* FIXME: Are we scheduling retry task as soon as we send verify message.
+ If yes then here before making this task, first check if the message
+ is for the same peer again. */
+ struct VerifySuccessorContext *old_ctx =
+ GNUNET_SCHEDULER_cancel(send_verify_successor_retry_task);
+ /* old_ctx must not be NULL, as the retry task had been scheduled */
+ GNUNET_assert(NULL != old_ctx);
+ GNUNET_free(old_ctx);
+ /* FIXME: Why don't we reset the task to NO_TASK here? */
+ }
+
+ struct VerifySuccessorContext *ctx;
+ ctx = GNUNET_new(struct VerifySuccessorContext);
+
+ ctx->num_retries_scheduled++;
+ send_verify_successor_retry_task =
+ GNUNET_SCHEDULER_add_delayed (verify_successor_retry_time,
+ &send_verify_successor_message,
+ ctx);
+ }
+ else
+ {
+ /* This is a retry attempt for verify_successor for a previous context */
+ struct VerifySuccessorContext *ctx;
+
+ ctx = cls;
+ ctx->num_retries_scheduled++;
+ send_verify_successor_retry_task =
+ GNUNET_SCHEDULER_add_delayed (verify_successor_retry_time,
+ &send_verify_successor_message,
+ ctx);
+ }
+
+ /* Among all the trails to reach to successor, select first one which is
present.*/
+ for (i = 0; i < successor->trails_count; i++)
+ {
+ trail = &successor->trail_list[i];
+ if(GNUNET_YES == trail->is_present)
+ break;
+ }
+
+ /* No valid trail found to reach to successor. */
+ if (i == successor->trails_count)
+ return;
+
+ GNUNET_assert(0 != GNUNET_CRYPTO_cmp_peer_identity (&my_identity,
+
&successor->finger_identity));
+ /* Trail stored at this index. */
+ GNUNET_assert (GNUNET_YES == trail->is_present);
+ trail_id = trail->trail_id;
+ if (NULL == GDS_ROUTING_get_next_hop(trail_id,GDS_ROUTING_SRC_TO_DEST))
+ {
+ DEBUG(" NO ENTRY FOUND IN %s ROUTING TABLE for trail id %s, line",
+ GNUNET_i2s(&my_identity), GNUNET_h2s(&trail->trail_id), __LINE__);
+ GNUNET_break(0);
+ return;
+ }
+ trail_length = trail->trail_length;
+ if (trail_length > 0)
+ {
+ /* Copy the trail into peer list. */
+ struct GNUNET_PeerIdentity peer_list[trail_length];
+ element = trail->trail_head;
+ for(i = 0; i < trail_length; i++)
+ {
+ peer_list[i] = element->peer;
+ element = element->next;
+ }
+ GNUNET_assert (NULL != (target_friend =
+ GNUNET_CONTAINER_multipeermap_get (friend_peermap,
+
&peer_list[0])));
+ GDS_NEIGHBOURS_send_verify_successor_message (my_identity,
+ successor->finger_identity,
+ trail_id, peer_list,
trail_length,
+ target_friend);
+ }
+ else
+ {
+ GNUNET_assert (NULL != (target_friend =
+ GNUNET_CONTAINER_multipeermap_get (friend_peermap,
+
&successor->finger_identity)));
+ GDS_NEIGHBOURS_send_verify_successor_message (my_identity,
+ successor->finger_identity,
+ trail_id, NULL, 0,
+ target_friend);
+ }
+}
+
+
+/**
+ * FIXME: should this be a periodic task, incrementing the search finger index?
+ * Update the current search finger index.
+ * @a finger_identity
+ * @a finger_table_index
+ */
+static void
+update_current_search_finger_index (unsigned int finger_table_index)
+{
+ struct FingerInfo *successor;
+
+ /* FIXME correct this: only move current index periodically */
+ if (finger_table_index != current_search_finger_index)
+ return;
+
+ successor = &finger_table[0];
+ GNUNET_assert (GNUNET_YES == successor->is_present);
+
+ /* We were looking for immediate successor. */
+ if (0 == current_search_finger_index)
+ {
+ current_search_finger_index = PREDECESSOR_FINGER_ID;
+ if (0 != GNUNET_CRYPTO_cmp_peer_identity (&my_identity,
&successor->finger_identity))
+ {
+ if (NULL == send_verify_successor_task)
+ {
+ send_verify_successor_task =
+ GNUNET_SCHEDULER_add_now (&send_verify_successor_message,
NULL);
+ }
+ }
+ return;
+ }
+
+ current_search_finger_index = current_search_finger_index - 1;
+ return;
+}
+
+
+/**
+ * Get the least significant bit set in val.
+ *
+ * @param val Value
+ * @return Position of first bit set, 65 in case of error.
+ */
+static unsigned int
+find_set_bit (uint64_t val)
+{
+ uint64_t i;
+ unsigned int pos;
+
+ i = 1;
+ pos = 0;
+
+ while (!(i & val))
+ {
+ i = i << 1;
+ pos++;
+ if (pos > 63)
+ {
+ GNUNET_break (0);
+ return 65;
+ }
+ }
+
+ if (val/i != 1)
+ return 65; /* Some other bit was set to 1 as well. */
+
+ return pos;
+}
+
+
+/**
+ * Calculate finger_table_index from initial 64 bit finger identity value that
+ * we send in trail setup message.
+ * @param ultimate_destination_finger_value Value that we calculated from our
+ * identity and finger_table_index.
+ * @param is_predecessor Is the entry for predecessor or not?
+ * @return finger_table_index Value between 0 <= finger_table_index <= 64
+ * finger_table_index > PREDECESSOR_FINGER_ID, if error occurs.
+ */
+static unsigned int
+get_finger_table_index (uint64_t ultimate_destination_finger_value,
+ unsigned int is_predecessor)
+{
+ uint64_t my_id64;
+ uint64_t diff;
+ unsigned int finger_table_index;
+
+ memcpy (&my_id64, &my_identity, sizeof (uint64_t));
+ my_id64 = GNUNET_ntohll (my_id64);
+
+ /* Is this a predecessor finger? */
+ if (1 == is_predecessor)
+ {
+ diff = my_id64 - ultimate_destination_finger_value;
+ if (1 == diff)
+ finger_table_index = PREDECESSOR_FINGER_ID;
+ else
+ finger_table_index = PREDECESSOR_FINGER_ID + 1; //error value
+
+ }
+ else
+ {
+ diff = ultimate_destination_finger_value - my_id64;
+ finger_table_index = find_set_bit (diff);
+ }
+ return finger_table_index;
+}
+
+
+/**
+ * Remove finger and its associated data structures from finger table.
+ * @param existing_finger Finger to be removed which is in finger table.
+ * @param finger_table_index Index in finger table where @a existing_finger
+ * is stored.
+ */
+static void
+remove_existing_finger (struct FingerInfo *existing_finger,
+ unsigned int finger_table_index)
+{
+ GNUNET_assert (GNUNET_YES == existing_finger->is_present);
+
+ /* If I am my own finger, then we have no trails. */
+ if (0 == GNUNET_CRYPTO_cmp_peer_identity (&existing_finger->finger_identity,
+ &my_identity))
+ {
+ existing_finger->is_present = GNUNET_NO;
+ memset ((void *)&finger_table[finger_table_index], 0,
+ sizeof (finger_table[finger_table_index]));
+ return;
+ }
+
+ /* For all other fingers, send trail teardown across all the trails to reach
+ finger, and free the finger. */
+ send_all_finger_trails_teardown (existing_finger);
+ free_finger (existing_finger, finger_table_index);
+}
+
+
+/**
+ * Check if there is already an entry in finger_table at finger_table_index.
+ * We get the finger_table_index from 64bit finger value we got from the
network.
+ * -- If yes, then select the closest finger.
+ * -- If new and existing finger are same, then check if you can store more
+ * trails.
+ * -- If yes then add trail, else keep the best trails to reach to the
+ * finger.
+ * -- If the new finger is closest, remove the existing entry, send trail
+ * teardown message across all the trails to reach the existing entry.
+ * Add the new finger.
+ * -- If new and existing finger are different, and existing finger is closest
+ * then do nothing.
+ * -- Update current_search_finger_index.
+ * @param finger_identity Peer Identity of new finger
+ * @param finger_trail Trail to reach the new finger
+ * @param finger_trail_length Total number of peers in @a new_finger_trail.
+ * @param is_predecessor Is this entry for predecessor in finger_table?
+ * @param finger_value 64 bit value of finger identity that we got from
network.
+ * @param finger_trail_id Unique identifier of @finger_trail.
+ */
+static void
+finger_table_add (struct GNUNET_PeerIdentity finger_identity,
+ const struct GNUNET_PeerIdentity *finger_trail,
+ unsigned int finger_trail_length,
+ unsigned int is_predecessor,
+ uint64_t finger_value,
+ struct GNUNET_HashCode finger_trail_id)
+{
+ struct FingerInfo *existing_finger;
+ struct GNUNET_PeerIdentity closest_peer;
+ struct FingerInfo *successor;
+ unsigned int finger_table_index;
+
+ /* Get the finger_table_index corresponding to finger_value we got from
network.*/
+ finger_table_index = get_finger_table_index (finger_value, is_predecessor);
+
+ /* Invalid finger_table_index. */
+ if ((finger_table_index > PREDECESSOR_FINGER_ID))
+ {
+ GNUNET_break_op (0);
+ return;
+ }
+
+ /* Check if new entry is same as successor. */
+ if ((0 != finger_table_index) &&
+ (PREDECESSOR_FINGER_ID != finger_table_index))
+ {
+ successor = &finger_table[0];
+ if (GNUNET_NO == successor->is_present)
+ {
+ GNUNET_break (0); //ASSERTION FAILS HERE. FIXME
+ return;
+ }
+ if (0 == GNUNET_CRYPTO_cmp_peer_identity (&finger_identity,
+ &successor->finger_identity))
+ {
+ if (0 == fingers_round_count)
+ {
+ find_finger_trail_task_next_send_time =
+ GNUNET_TIME_STD_BACKOFF(find_finger_trail_task_next_send_time);
+ }
+ else
+ fingers_round_count--;
+ current_search_finger_index = 0;
+ GNUNET_STATISTICS_update (GDS_stats,
+ gettext_noop
+ ("# FINGERS_COUNT"), (int64_t)
total_fingers_found,
+ GNUNET_NO);
+ total_fingers_found = 0;
+ return;
+ }
+
+ struct FingerInfo prev_finger;
+ prev_finger = finger_table[finger_table_index - 1];
+ if (0 == GNUNET_CRYPTO_cmp_peer_identity (&finger_identity,
+ &prev_finger.finger_identity))
+ {
+ current_search_finger_index--;
+ return;
+ }
+ }
+
+ total_fingers_found++;
+ existing_finger = &finger_table[finger_table_index];
+
+ /* No entry present in finger_table for given finger map index. */
+ if (GNUNET_NO == existing_finger->is_present)
+ {
+ /* Shorten the trail if possible. */
+ add_new_finger (finger_identity, finger_trail,
+ finger_trail_length,
+ finger_trail_id, finger_table_index);
+ update_current_search_finger_index (finger_table_index);
+ return;
+ }
+
+ /* If existing entry and finger identity are not same. */
+ if (0 != GNUNET_CRYPTO_cmp_peer_identity
(&(existing_finger->finger_identity),
+ &finger_identity))
+ {
+ closest_peer = select_closest_peer (&existing_finger->finger_identity,
+ &finger_identity,
+ finger_value,
+ is_predecessor);
+
+ /* If the new finger is the closest peer. */
+ if (0 == GNUNET_CRYPTO_cmp_peer_identity (&finger_identity, &closest_peer))
+ {
+ remove_existing_finger (existing_finger, finger_table_index);
+ add_new_finger (finger_identity, finger_trail, finger_trail_length,
+ finger_trail_id, finger_table_index);
+ }
+ else
+ {
+ /* Existing finger is the closest one. We need to send trail teardown
+ across the trail setup in routing table of all the peers. */
+ if (0 != GNUNET_CRYPTO_cmp_peer_identity (&finger_identity,
&my_identity))
+ {
+ if (finger_trail_length > 0)
+ GDS_NEIGHBOURS_send_trail_teardown (&finger_trail_id,
+ GDS_ROUTING_SRC_TO_DEST,
+ &finger_trail[0]);
+ else
+ GDS_NEIGHBOURS_send_trail_teardown (&finger_trail_id,
+ GDS_ROUTING_SRC_TO_DEST,
+ &finger_identity);
+ }
+ }
+ }
+ else
+ {
+ /* If both new and existing entry are same as my_identity, then do
nothing. */
+ if (0 == GNUNET_CRYPTO_cmp_peer_identity
(&(existing_finger->finger_identity),
+ &my_identity))
+ {
+ return;
+ }
+
+ /* If there is space to store more trails. */
+ if (existing_finger->trails_count < MAXIMUM_TRAILS_PER_FINGER)
+ add_new_trail (existing_finger, finger_trail,
+ finger_trail_length, finger_trail_id);
+ else
+ select_and_replace_trail (existing_finger, finger_trail,
+ finger_trail_length, finger_trail_id);
+ }
+ update_current_search_finger_index (finger_table_index);
+ return;
+}
+
+
+/**
+ * Core handler for P2P put messages.
+ * @param cls closure
+ * @param peer sender of the request
+ * @param message message
+ * @return #GNUNET_OK to keep the connection open,
+ * #GNUNET_SYSERR to close it (signal serious error)
+ */
+static int
+handle_dht_p2p_put (void *cls, const struct GNUNET_PeerIdentity *peer,
+ const struct GNUNET_MessageHeader *message)
+{
+ struct PeerPutMessage *put;
+ struct GNUNET_PeerIdentity *put_path;
+ struct GNUNET_PeerIdentity current_best_known_dest;
+ struct GNUNET_PeerIdentity best_known_dest;
+ struct GNUNET_HashCode received_intermediate_trail_id;
+ struct GNUNET_HashCode intermediate_trail_id;
+ struct GNUNET_PeerIdentity next_hop;
+ struct GNUNET_PeerIdentity *next_routing_hop;
+ enum GNUNET_DHT_RouteOption options;
+ struct GNUNET_HashCode test_key;
+ void *payload;
+ size_t msize;
+ uint32_t putlen;
+ uint32_t hop_count;
+ size_t payload_size;
+ uint64_t key_value;
+
+ msize = ntohs (message->size);
+ if (msize < sizeof (struct PeerPutMessage))
+ {
+ GNUNET_break_op (0);
+ return GNUNET_OK;
+ }
+
+ put = (struct PeerPutMessage *) message;
+ putlen = ntohl (put->put_path_length);
+ if ((msize <
+ sizeof (struct PeerPutMessage) +
+ putlen * sizeof (struct GNUNET_PeerIdentity)) ||
+ (putlen >
+ GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE / sizeof (struct
GNUNET_PeerIdentity)))
+ {
+ GNUNET_break_op (0);
+ return GNUNET_OK;
+ }
+#if ENABLE_MALICIOUS
+ if(1 == act_malicious)
+ {
+ DEBUG("\n I AM MALICIOUS PUT_REQUEST_DROPPED for key =
%ss",GNUNET_h2s(&put->key));
+ return GNUNET_OK;
+ }
+#endif
+ GNUNET_STATISTICS_update (GDS_stats,
+ gettext_noop
+ ("# Bytes received from other peers"), (int64_t)
msize,
+ GNUNET_NO);
+
+ current_best_known_dest = put->best_known_destination;
+ put_path = (struct GNUNET_PeerIdentity *) &put[1];
+ payload = &put_path[putlen];
+ options = ntohl (put->options);
+ received_intermediate_trail_id = put->intermediate_trail_id;
+ hop_count = ntohl(put->hop_count);
+ payload_size = msize - (sizeof (struct PeerPutMessage) +
+ putlen * sizeof (struct GNUNET_PeerIdentity));
+ hop_count++;
+ switch (GNUNET_BLOCK_get_key (GDS_block_context, ntohl (put->block_type),
+ payload, payload_size, &test_key))
+ {
+ case GNUNET_YES:
+ if (0 != memcmp (&test_key, &put->key, sizeof (struct GNUNET_HashCode)))
+ {
+ char *put_s = GNUNET_strdup (GNUNET_h2s_full (&put->key));
+ GNUNET_break_op (0);
+ GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+ "PUT with key `%s' for block with key %s\n",
+ put_s, GNUNET_h2s_full (&test_key));
+ GNUNET_free (put_s);
+ return GNUNET_OK;
+ }
+ break;
+ case GNUNET_NO:
+ GNUNET_break_op (0);
+ return GNUNET_OK;
+ case GNUNET_SYSERR:
+ /* cannot verify, good luck */
+ break;
+ }
+
+ if (ntohl (put->block_type) == GNUNET_BLOCK_TYPE_REGEX) /* FIXME: do for
all tpyes */
+ {
+ switch (GNUNET_BLOCK_evaluate (GDS_block_context,
+ ntohl (put->block_type),
+ GNUNET_BLOCK_EO_NONE,
+ NULL, /* query */
+ NULL, 0, /* bloom filer */
+ NULL, 0, /* xquery */
+ payload, payload_size))
+ {
+ case GNUNET_BLOCK_EVALUATION_OK_MORE:
+ case GNUNET_BLOCK_EVALUATION_OK_LAST:
+ break;
+
+ case GNUNET_BLOCK_EVALUATION_OK_DUPLICATE:
+ case GNUNET_BLOCK_EVALUATION_RESULT_INVALID:
+ case GNUNET_BLOCK_EVALUATION_RESULT_IRRELEVANT:
+ case GNUNET_BLOCK_EVALUATION_REQUEST_VALID:
+ case GNUNET_BLOCK_EVALUATION_REQUEST_INVALID:
+ case GNUNET_BLOCK_EVALUATION_TYPE_NOT_SUPPORTED:
+ default:
+ GNUNET_break_op (0);
+ return GNUNET_OK;
+ }
+ }
+
+ /* Check if you are already a part of put path. */
+ unsigned int i;
+ for (i = 0; i < putlen; i++)
+ {
+ if(0 == GNUNET_CRYPTO_cmp_peer_identity (&my_identity, &put_path[i]))
+ {
+ putlen = i;
+ break;
+ }
+ }
+
+ /* Add yourself to the list. */
+ struct GNUNET_PeerIdentity pp[putlen + 1];
+ //if (0 != (options & GNUNET_DHT_RO_RECORD_ROUTE))
+ if (1)
+ {
+ memcpy (pp, put_path, putlen * sizeof (struct GNUNET_PeerIdentity));
+ pp[putlen] = my_identity;
+ putlen++;
+ }
+ else
+ putlen = 0;
+
+ memcpy (&key_value, &(put->key), sizeof (uint64_t));
+ struct Closest_Peer successor;
+ key_value = GNUNET_ntohll (key_value);
+ successor = find_local_best_known_next_hop (key_value,
+ GDS_FINGER_TYPE_NON_PREDECESSOR);
+ next_hop = successor.next_hop;
+ intermediate_trail_id = successor.trail_id;
+ best_known_dest = successor.best_known_destination;
+
+ if (0 != (GNUNET_CRYPTO_cmp_peer_identity (¤t_best_known_dest,
&my_identity)))
+ {
+ next_routing_hop = GDS_ROUTING_get_next_hop
(received_intermediate_trail_id,
+ GDS_ROUTING_SRC_TO_DEST);
+ if (NULL != next_routing_hop)
+ {
+ next_hop = *next_routing_hop;
+ intermediate_trail_id = received_intermediate_trail_id;
+ best_known_dest = current_best_known_dest;
+ }
+ }
+
+ GDS_CLIENTS_process_put (options,
+ ntohl (put->block_type),
+ hop_count,
+ ntohl (put->desired_replication_level),
+ putlen, pp,
+ GNUNET_TIME_absolute_ntoh (put->expiration_time),
+ &put->key,
+ payload,
+ payload_size);
+
+ /* I am the final destination */
+ if (0 == GNUNET_CRYPTO_cmp_peer_identity (&my_identity, &best_known_dest))
+ {
+ DEBUG("\n PUT_REQUEST_SUCCESSFUL for key = %s",GNUNET_h2s(&put->key));
+ GDS_DATACACHE_handle_put (GNUNET_TIME_absolute_ntoh (put->expiration_time),
+ &(put->key),putlen, pp, ntohl (put->block_type),
+ payload_size, payload);
+ }
+ else
+ {
+#if ENABLE_MALICIOUS
+ if (0 != GNUNET_CRYPTO_cmp_peer_identity (&successor.best_known_destination,
+ &successor.next_hop))
+ {
+ struct FingerInfo *next_hop_finger;
+ unsigned int i;
+
+ next_hop_finger = &finger_table[successor.finger_table_index];
+ for (i = 0; i < next_hop_finger->trails_count; i++)
+ {
+ if (GNUNET_YES == next_hop_finger->trail_list[i].is_present)
+ {
+ if(0 == next_hop_finger->trail_list[i].trail_length)
+ {
+ GDS_NEIGHBOURS_send_put (&put->key,
+ ntohl (put->block_type),ntohl (put->options),
+ ntohl (put->desired_replication_level),
+ best_known_dest, intermediate_trail_id,
&next_hop,
+ hop_count, putlen, pp,
+ GNUNET_TIME_absolute_ntoh
(put->expiration_time),
+ payload, payload_size);
+ return GNUNET_OK;
+ }
+ next_hop = next_hop_finger->trail_list[i].trail_head->peer;
+ GDS_NEIGHBOURS_send_put (&put->key,
+ ntohl (put->block_type),ntohl (put->options),
+ ntohl (put->desired_replication_level),
+ best_known_dest,
+ next_hop_finger->trail_list[i].trail_id,
+ &next_hop, hop_count, putlen, pp,
+ GNUNET_TIME_absolute_ntoh
(put->expiration_time),
+ payload, payload_size);
+ }
+ }
+ return GNUNET_OK;
+ }
+#endif
+ GDS_NEIGHBOURS_send_put (&put->key,
+ ntohl (put->block_type),ntohl (put->options),
+ ntohl (put->desired_replication_level),
+ best_known_dest, intermediate_trail_id, &next_hop,
+ hop_count, putlen, pp,
+ GNUNET_TIME_absolute_ntoh (put->expiration_time),
+ payload, payload_size);
+ }
+ return GNUNET_OK;
+}
+
+
+/**
+ * FIXME: Check for loop in the request. If you already are part of get path,
+ * then you need to reset the get path length.
+ * Core handler for p2p get requests.
+ *
+ * @param cls closure
+ * @param peer sender of the request
+ * @param message message
+ * @return #GNUNET_OK to keep the connection open,
+ * #GNUNET_SYSERR to close it (signal serious error)
+ */
+static int
+handle_dht_p2p_get (void *cls, const struct GNUNET_PeerIdentity *peer,
+ const struct GNUNET_MessageHeader *message)
+{
+ const struct PeerGetMessage *get;
+ const struct GNUNET_PeerIdentity *get_path;
+ struct GNUNET_PeerIdentity best_known_dest;
+ struct GNUNET_PeerIdentity current_best_known_dest;
+ struct GNUNET_HashCode intermediate_trail_id;
+ struct GNUNET_HashCode received_intermediate_trail_id;
+ struct Closest_Peer successor;
+ struct GNUNET_PeerIdentity next_hop;
+ struct GNUNET_PeerIdentity *next_routing_hop;
+ uint32_t get_length;
+ uint64_t key_value;
+ uint32_t hop_count;
+ size_t msize;
+
+ msize = ntohs (message->size);
+ if (msize < sizeof (struct PeerGetMessage))
+ {
+ GNUNET_break_op (0);
+ return GNUNET_YES;
+ }
+
+ get = (const struct PeerGetMessage *)message;
+ get_length = ntohl (get->get_path_length);
+ if ((msize <
+ sizeof (struct PeerGetMessage) +
+ get_length * sizeof (struct GNUNET_PeerIdentity)) ||
+ (get_length >
+ GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE / sizeof (struct
GNUNET_PeerIdentity)))
+ {
+ GNUNET_break_op (0);
+ return GNUNET_YES;
+ }
+
+#if ENABLE_MALICIOUS
+ if(1 == act_malicious)
+ {
+ DEBUG("I am malicious,GET_REQUEST_DROPPED for key = %s.
\n",GNUNET_h2s(&get->key));
+ return GNUNET_OK;
+ }
+#endif
+ current_best_known_dest = get->best_known_destination;
+ received_intermediate_trail_id = get->intermediate_trail_id;
+ get_path = (const struct GNUNET_PeerIdentity *)&get[1];
+ hop_count = get->hop_count;
+ hop_count++;
+
+
+ GNUNET_STATISTICS_update (GDS_stats,
+ gettext_noop
+ ("# Bytes received from other peers"), msize,
+ GNUNET_NO);
+
+ memcpy (&key_value, &(get->key), sizeof (uint64_t));
+ key_value = GNUNET_ntohll (key_value);
+
+ /* Check if you are already a part of get path. */
+ unsigned int i;
+ for (i = 0; i < get_length; i++)
+ {
+ if (0 == GNUNET_CRYPTO_cmp_peer_identity (&my_identity, &get_path[i]))
+ {
+ get_length = i;
+ break;
+ }
+ }
+
+ /* Add yourself in the get path. */
+ struct GNUNET_PeerIdentity gp[get_length + 1];
+ memcpy (gp, get_path, get_length * sizeof (struct GNUNET_PeerIdentity));
+ gp[get_length] = my_identity;
+ get_length = get_length + 1;
+ GDS_CLIENTS_process_get (get->options, get->block_type, hop_count,
+ get->desired_replication_level,
get->get_path_length,
+ gp, &get->key);
+
+
+ successor = find_local_best_known_next_hop (key_value,
+
GDS_FINGER_TYPE_NON_PREDECESSOR);
+ next_hop = successor.next_hop;
+ best_known_dest = successor.best_known_destination;
+ intermediate_trail_id = successor.trail_id;
+ /* I am not the final destination. I am part of trail to reach final dest. */
+ if (0 != (GNUNET_CRYPTO_cmp_peer_identity (¤t_best_known_dest,
&my_identity)))
+ {
+ next_routing_hop = GDS_ROUTING_get_next_hop
(received_intermediate_trail_id,
+ GDS_ROUTING_SRC_TO_DEST);
+ if (NULL != next_routing_hop)
+ {
+ next_hop = *next_routing_hop;
+ best_known_dest = current_best_known_dest;
+ intermediate_trail_id = received_intermediate_trail_id;
+ }
+ }
+
+ /* I am the final destination. */
+ if (0 == GNUNET_CRYPTO_cmp_peer_identity(&my_identity, &best_known_dest))
+ {
+ if (1 == get_length)
+ {
+ DEBUG("\n GET_REQUEST DONE for key = %s",GNUNET_h2s(&get->key));
+ GDS_DATACACHE_handle_get (&(get->key),(get->block_type), NULL, 0,
+ NULL, 0, 1, &my_identity, NULL,&my_identity);
+ }
+ else
+ {
+ GDS_DATACACHE_handle_get (&(get->key),(get->block_type), NULL, 0, NULL,
0,
+ get_length, gp, &gp[get_length - 2],
+ &my_identity);
+ }
+ }
+ else
+ {
+
+#if ENABLE_MALICIOUS
+ if (0 != GNUNET_CRYPTO_cmp_peer_identity (&successor.best_known_destination,
+ &successor.next_hop))
+ {
+ struct FingerInfo *next_hop_finger;
+ unsigned int i;
+
+ next_hop_finger = &finger_table[successor.finger_table_index];
+ for (i = 0; i < next_hop_finger->trails_count; i++)
+ {
+ if(0 == next_hop_finger->trail_list[i].trail_length)
+ {
+ GDS_NEIGHBOURS_send_get (&(get->key), get->block_type, get->options,
+ get->desired_replication_level,
best_known_dest,
+ intermediate_trail_id, &next_hop, hop_count,
+ get_length, gp);
+ return GNUNET_OK;
+ }
+ if (GNUNET_YES == next_hop_finger->trail_list[i].is_present)
+ {
+ next_hop = next_hop_finger->trail_list[i].trail_head->peer;
+ GDS_NEIGHBOURS_send_get (&(get->key), get->block_type, get->options,
+ get->desired_replication_level,
best_known_dest,
+ next_hop_finger->trail_list[i].trail_id,
+ &next_hop, hop_count,
+ get_length, gp);
+ }
+ }
+ return GNUNET_OK;
+ }
+#endif
+ GDS_NEIGHBOURS_send_get (&(get->key), get->block_type, get->options,
+ get->desired_replication_level, best_known_dest,
+ intermediate_trail_id, &next_hop, hop_count,
+ get_length, gp);
+ }
+ return GNUNET_YES;
+}
+
+
+/**
+ * Core handler for get result
+ * @param cls closure
+ * @param peer sender of the request
+ * @param message message
+ * @return #GNUNET_OK to keep the connection open,
+ * #GNUNET_SYSERR to close it (signal serious error)
+ */
+static int
+handle_dht_p2p_get_result (void *cls, const struct GNUNET_PeerIdentity *peer,
+ const struct GNUNET_MessageHeader *message)
+{
+ const struct PeerGetResultMessage *get_result;
+ const struct GNUNET_PeerIdentity *get_path;
+ const struct GNUNET_PeerIdentity *put_path;
+ const void *payload;
+ size_t payload_size;
+ size_t msize;
+ unsigned int getlen;
+ unsigned int putlen;
+ int current_path_index;
+
+ msize = ntohs (message->size);
+ if (msize < sizeof (struct PeerGetResultMessage))
+ {
+ GNUNET_break_op (0);
+ return GNUNET_YES;
+ }
+
+ get_result = (const struct PeerGetResultMessage *)message;
+ getlen = ntohl (get_result->get_path_length);
+ putlen = ntohl (get_result->put_path_length);
+
+ if ((msize <
+ sizeof (struct PeerGetResultMessage) +
+ getlen * sizeof (struct GNUNET_PeerIdentity) +
+ putlen * sizeof (struct GNUNET_PeerIdentity)) ||
+ (getlen >
+ GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE / sizeof (struct
GNUNET_PeerIdentity) ||
+ (putlen >
+ GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE / sizeof (struct
GNUNET_PeerIdentity))))
+ {
+ GNUNET_break_op (0);
+ return GNUNET_YES;
+ }
+ DEBUG("GET_RESULT FOR DATA_SIZE = %lu\n",msize);
+ GNUNET_STATISTICS_update (GDS_stats,
+ gettext_noop
+ ("# Bytes received from other peers"), msize,
+ GNUNET_NO);
+
+ put_path = (const struct GNUNET_PeerIdentity *) &get_result[1];
+ get_path = &put_path[putlen];
+ payload = (const void *) &get_path[getlen];
+ payload_size = msize - (sizeof (struct PeerGetResultMessage) +
+ (getlen + putlen) * sizeof (struct
GNUNET_PeerIdentity));
+
+ if (0 == (GNUNET_CRYPTO_cmp_peer_identity (&my_identity, &(get_path[0]))))
+ {
+ GDS_CLIENTS_handle_reply (get_result->expiration_time, &(get_result->key),
+ getlen, get_path, putlen,
+ put_path, get_result->type, payload_size,
payload);
+ return GNUNET_YES;
+ }
+ else
+ {
+ current_path_index = search_my_index (get_path, getlen);
+ if (-1 == current_path_index )
+ {
+ DEBUG ("No entry found in get path.\n");
+ GNUNET_break (0);
+ return GNUNET_SYSERR;
+ }
+ if((getlen + 1) == current_path_index)
+ {
+ DEBUG("Present twice in get path. Not allowed. \n");
+ GNUNET_break (0);
+ return GNUNET_SYSERR;
+ }
+ GDS_NEIGHBOURS_send_get_result (&(get_result->key), get_result->type,
+ &get_path[current_path_index - 1],
+ &(get_result->querying_peer), putlen,
put_path,
+ getlen, get_path,
get_result->expiration_time,
+ payload, payload_size);
+ return GNUNET_YES;
+ }
+ return GNUNET_SYSERR;
+}
+
+
+/**
+ * Find the next hop to pass trail setup message. First find the local best
known
+ * hop from your own identity, friends and finger. If you were part of trail,
+ * then get the next hop from routing table. Compare next_hop from routing
table
+ * and local best known hop, and return the closest one to
final_dest_finger_val
+ * @param final_dest_finger_val 64 bit value of finger identity
+ * @param intermediate_trail_id If you are part of trail to reach to some other
+ * finger, then it is the trail id to reach to
+ * that finger, else set to 0.
+ * @param is_predecessor Are we looking for closest successor or predecessor.
+ * @param source Source of trail setup message.
+ * @param current_dest In case you are part of trail, then finger to which
+ * we should forward the message. Else my own identity
+ * @return Closest Peer for @a final_dest_finger_val
+ */
+static struct Closest_Peer
+get_local_best_known_next_hop (uint64_t final_dest_finger_val,
+ struct GNUNET_HashCode intermediate_trail_id,
+ unsigned int is_predecessor,
+ struct GNUNET_PeerIdentity source,
+ struct GNUNET_PeerIdentity *current_dest)
+{
+ struct Closest_Peer peer;
+
+ peer = find_local_best_known_next_hop (final_dest_finger_val,
is_predecessor);
+
+ /* Am I just a part of a trail towards a finger (current_destination)? */
+ if (0 != GNUNET_CRYPTO_cmp_peer_identity (&my_identity, current_dest) &&
+ 0 != GNUNET_CRYPTO_cmp_peer_identity (&peer.best_known_destination,
+ current_dest))
+ {
+ struct GNUNET_PeerIdentity closest_peer;
+
+ /* Select best successor among one found locally and current_destination
+ * that we got from network.*/
+ closest_peer = select_closest_peer (&peer.best_known_destination,
+ current_dest,
+ final_dest_finger_val,
+ is_predecessor);
+
+ /* Is current dest (end point of the trail of which I am a part)
closest_peer? */
+ if (0 == GNUNET_CRYPTO_cmp_peer_identity (current_dest, &closest_peer))
+ {
+ struct GNUNET_PeerIdentity *next_hop;
+
+ next_hop = GDS_ROUTING_get_next_hop (intermediate_trail_id,
+ GDS_ROUTING_SRC_TO_DEST);
+ /* next_hop NULL is a valid case. This intermediate trail id is set by
+ some other finger, and while this trail setup is in progress, that other
+ peer might have found a better trail ,and send trail teardown message
+ across the network. In case we got the trail teardown message first,
+ then next_hop will be NULL. A possible solution could be to keep track
+ * of all removed trail id, and be sure that there is no other reason .
*/
+ if(NULL != next_hop)
+ {
+ peer.next_hop = *next_hop;
+ peer.best_known_destination = *current_dest;
+ peer.trail_id = intermediate_trail_id;
+ }
+ }
+ }
+ return peer;
+}
+
+
+/*
+ * Core handle for PeerTrailSetupMessage.
+ * @param cls closure
+ * @param message message
+ * @param peer peer identity this notification is about
+ * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
+ */
+static int
+handle_dht_p2p_trail_setup (void *cls, const struct GNUNET_PeerIdentity *peer,
+ const struct GNUNET_MessageHeader *message)
+{
+ const struct PeerTrailSetupMessage *trail_setup;
+ const struct GNUNET_PeerIdentity *trail_peer_list;
+ struct GNUNET_PeerIdentity current_dest;
+ struct FriendInfo *target_friend;
+ struct GNUNET_PeerIdentity source;
+ struct GNUNET_HashCode intermediate_trail_id;
+ struct GNUNET_HashCode trail_id;
+ unsigned int is_predecessor;
+ uint32_t trail_length;
+ uint64_t final_dest_finger_val;
+ int i;
+ size_t msize;
+
+ msize = ntohs (message->size);
+ if (msize < sizeof (struct PeerTrailSetupMessage))
+ {
+ GNUNET_break_op (0);
+ return GNUNET_SYSERR;
+ }
+
+ trail_setup = (const struct PeerTrailSetupMessage *) message;
+ if ((msize - sizeof (struct PeerTrailSetupMessage)) %
+ sizeof (struct GNUNET_PeerIdentity) != 0)
+ {
+ GNUNET_break_op (0);
+ return GNUNET_OK;
+ }
+ trail_length = (msize - sizeof (struct PeerTrailSetupMessage))/
+ sizeof (struct GNUNET_PeerIdentity);
+
+ GNUNET_STATISTICS_update (GDS_stats,
+ gettext_noop
+ ("# Bytes received from other peers"), msize,
+ GNUNET_NO);
+
+ trail_peer_list = (const struct GNUNET_PeerIdentity *)&trail_setup[1];
+ current_dest = trail_setup->best_known_destination;
+ trail_id = trail_setup->trail_id;
+ final_dest_finger_val =
+ GNUNET_ntohll (trail_setup->final_destination_finger_value);
+ source = trail_setup->source_peer;
+ is_predecessor = ntohl (trail_setup->is_predecessor);
+ intermediate_trail_id = trail_setup->intermediate_trail_id;
+
+ /* Did the friend insert its ID in the trail list? */
+ if (trail_length > 0 &&
+ 0 != memcmp (&trail_peer_list[trail_length-1], peer, sizeof (struct
GNUNET_PeerIdentity)))
+ {
+ GNUNET_break_op (0);
+ return GNUNET_SYSERR;
+ }
+
+ /* If I was the source and got the message back, then set trail length to
0.*/
+ if (0 == GNUNET_CRYPTO_cmp_peer_identity(&my_identity, &source))
+ {
+ trail_length = 0;
+ }
+
+ /* Check if you are present in the trail seen so far? */
+ for (i = 0; i < trail_length ; i++)
+ {
+ if(0 == GNUNET_CRYPTO_cmp_peer_identity(&trail_peer_list[i],&my_identity))
+ {
+ /* We will add ourself later in code, if NOT destination. */
+ trail_length = i;
+ break;
+ }
+ }
+
+ /* Is my routing table full? */
+ if (GNUNET_YES == GDS_ROUTING_threshold_reached())
+ {
+ if (trail_length > 0)
+ target_friend =
+ GNUNET_CONTAINER_multipeermap_get (friend_peermap,
+
&trail_peer_list[trail_length - 1]);
+ else
+ target_friend =
+ GNUNET_CONTAINER_multipeermap_get (friend_peermap,
+ &source);
+ if(NULL == target_friend)
+ {
+ DEBUG ("\n friend not found");
+ GNUNET_break(0);
+ return GNUNET_OK;
+ }
+ GDS_NEIGHBOURS_send_trail_rejection (source, final_dest_finger_val,
+ my_identity, is_predecessor,
+ trail_peer_list, trail_length,
+ trail_id, target_friend,
+ CONGESTION_TIMEOUT);
+ return GNUNET_OK;
+ }
+
+ /* Get the next hop to forward the trail setup request. */
+ struct Closest_Peer next_peer =
+ get_local_best_known_next_hop (final_dest_finger_val,
+ intermediate_trail_id,
+ is_predecessor,
+ source,
+ ¤t_dest);
+
+ /* Am I the final destination? */
+ if (0 == (GNUNET_CRYPTO_cmp_peer_identity (&next_peer.best_known_destination,
+ &my_identity)))
+ {
+ if(0 == GNUNET_CRYPTO_cmp_peer_identity (&source, &my_identity))
+ {
+ finger_table_add (my_identity, NULL, 0, is_predecessor,
+ final_dest_finger_val, trail_id);
+ return GNUNET_OK;
+ }
+
+ if (trail_length > 0)
+ target_friend =
+ GNUNET_CONTAINER_multipeermap_get (friend_peermap,
+
&trail_peer_list[trail_length-1]);
+ else
+ target_friend =
+ GNUNET_CONTAINER_multipeermap_get (friend_peermap, &source);
+ if (NULL == target_friend)
+ {
+ GNUNET_break_op (0);
+ return GNUNET_SYSERR;
+ }
+ GDS_ROUTING_add (trail_id, target_friend->id, my_identity);
+ GDS_NEIGHBOURS_send_trail_setup_result (source,
+ my_identity,
+ target_friend, trail_length,
+ trail_peer_list,
+ is_predecessor,
+ final_dest_finger_val,trail_id);
+ }
+ else /* I'm not the final destination. */
+ {
+ target_friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap,
+ &next_peer.next_hop);
+ if(NULL == target_friend)
+ {
+ DEBUG ("\n target friend not found for peer = %s",
GNUNET_i2s(&next_peer.next_hop));
+ GNUNET_break (0);
+ return GNUNET_OK;
+ }
+ if (0 != GNUNET_CRYPTO_cmp_peer_identity(&my_identity, &source))
+ {
+ /* Add yourself to list of peers. */
+ struct GNUNET_PeerIdentity peer_list[trail_length + 1];
+
+ memcpy (peer_list, trail_peer_list,
+ trail_length * sizeof (struct GNUNET_PeerIdentity));
+ peer_list[trail_length] = my_identity;
+ GDS_NEIGHBOURS_send_trail_setup (source,
+ final_dest_finger_val,
+ next_peer.best_known_destination,
+ target_friend, trail_length + 1,
peer_list,
+ is_predecessor, trail_id,
+ next_peer.trail_id);
+ }
+ else
+ GDS_NEIGHBOURS_send_trail_setup (source,
+ final_dest_finger_val,
+ next_peer.best_known_destination,
+ target_friend, 0, NULL,
+ is_predecessor, trail_id,
+ next_peer.trail_id);
+ }
+ return GNUNET_OK;
+}
+
+
+/**
+ * Core handle for p2p trail setup result messages.
+ * @param closure
+ * @param message message
+ * @param peer sender of this message.
+ * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
+ */
+static int
+handle_dht_p2p_trail_setup_result(void *cls, const struct GNUNET_PeerIdentity
*peer,
+ const struct GNUNET_MessageHeader *message)
+{
+ const struct PeerTrailSetupResultMessage *trail_result;
+ const struct GNUNET_PeerIdentity *trail_peer_list;
+ struct GNUNET_PeerIdentity next_hop;
+ struct FriendInfo *target_friend;
+ struct GNUNET_PeerIdentity querying_peer;
+ struct GNUNET_PeerIdentity finger_identity;
+ uint32_t trail_length;
+ uint64_t ulitmate_destination_finger_value;
+ uint32_t is_predecessor;
+ struct GNUNET_HashCode trail_id;
+ int my_index;
+ size_t msize;
+
+ msize = ntohs (message->size);
+ if (msize < sizeof (struct PeerTrailSetupResultMessage))
+ {
+ GNUNET_break_op (0);
+ return GNUNET_YES;
+ }
+
+ trail_result = (const struct PeerTrailSetupResultMessage *) message;
+ if ((msize - sizeof (struct PeerTrailSetupResultMessage)) %
+ sizeof (struct GNUNET_PeerIdentity) != 0)
+ {
+ GNUNET_break_op (0);
+ return GNUNET_OK;
+ }
+ trail_length = (msize - sizeof (struct PeerTrailSetupResultMessage))/
+ sizeof (struct GNUNET_PeerIdentity);
+
+ GNUNET_STATISTICS_update (GDS_stats,
+ gettext_noop
+ ("# Bytes received from other peers"), msize,
+ GNUNET_NO);
+
+ is_predecessor = ntohl (trail_result->is_predecessor);
+ querying_peer = trail_result->querying_peer;
+ finger_identity = trail_result->finger_identity;
+ trail_id = trail_result->trail_id;
+ trail_peer_list = (const struct GNUNET_PeerIdentity *) &trail_result[1];
+ ulitmate_destination_finger_value =
+ GNUNET_ntohll (trail_result->ulitmate_destination_finger_value);
+
+ /* Am I the one who initiated the query? */
+ if (0 == (GNUNET_CRYPTO_cmp_peer_identity (&querying_peer, &my_identity)))
+ {
+ /* Check that you got the message from the correct peer. */
+ if (trail_length > 0)
+ {
+ GNUNET_assert(0 == GNUNET_CRYPTO_cmp_peer_identity (&trail_peer_list[0],
+ peer));
+ }
+ else
+ {
+ GNUNET_assert(0 == GNUNET_CRYPTO_cmp_peer_identity (&finger_identity,
+ peer));
+ }
+ GDS_ROUTING_add (trail_id, my_identity, *peer);
+ finger_table_add (finger_identity, trail_peer_list, trail_length,
+ is_predecessor, ulitmate_destination_finger_value,
trail_id);
+ return GNUNET_YES;
+ }
+
+ /* Get my location in the trail. */
+ my_index = search_my_index (trail_peer_list, trail_length);
+ if (-1 == my_index)
+ {
+ DEBUG ("Not found in trail\n");
+ GNUNET_break_op(0);
+ return GNUNET_SYSERR;
+ }
+ //TODO; return -2.
+ if ((trail_length + 1) == my_index)
+ {
+ DEBUG ("Found twice in trail.\n");
+ GNUNET_break_op(0);
+ return GNUNET_SYSERR;
+ }
+
+ //TODO; Refactor code here and above to check if sender peer is correct
+ if (my_index == 0)
+ {
+ if(trail_length > 1)
+ GNUNET_assert(0 == GNUNET_CRYPTO_cmp_peer_identity (&trail_peer_list[1],
+ peer));
+ else
+ GNUNET_assert(0 == GNUNET_CRYPTO_cmp_peer_identity (&finger_identity,
+ peer));
+ next_hop = trail_result->querying_peer;
+ }
+ else
+ {
+ if(my_index == trail_length - 1)
+ {
+ GNUNET_assert(0 ==
+ GNUNET_CRYPTO_cmp_peer_identity (&finger_identity,
+ peer));
+ }
+ else
+ GNUNET_assert(0 ==
+ GNUNET_CRYPTO_cmp_peer_identity (&trail_peer_list[my_index
+ 1],
+ peer));
+ next_hop = trail_peer_list[my_index - 1];
+ }
+
+ target_friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap,
&next_hop);
+ if (NULL == target_friend)
+ {
+ GNUNET_break_op (0);
+ return GNUNET_SYSERR;
+ }
+ GDS_ROUTING_add (trail_id, next_hop, *peer);
+ GDS_NEIGHBOURS_send_trail_setup_result (querying_peer, finger_identity,
+ target_friend, trail_length,
trail_peer_list,
+ is_predecessor,
+ ulitmate_destination_finger_value,
+ trail_id);
+ return GNUNET_OK;
+}
+
+
+/**
+ * Invert the trail.
+ * @param trail Trail to be inverted
+ * @param trail_length Total number of peers in the trail.
+ * @return Updated trail
+ */
+static struct GNUNET_PeerIdentity *
+invert_trail (const struct GNUNET_PeerIdentity *trail,
+ unsigned int trail_length)
+{
+ int i;
+ int j;
+ struct GNUNET_PeerIdentity *inverted_trail;
+
+ inverted_trail = GNUNET_malloc (sizeof(struct GNUNET_PeerIdentity) *
+ trail_length);
+ i = 0;
+ j = trail_length - 1;
+ while (i < trail_length)
+ {
+ inverted_trail[i] = trail[j];
+ i++;
+ j--;
+ }
+
+ GNUNET_assert(NULL != GNUNET_CONTAINER_multipeermap_get(friend_peermap,
+ &inverted_trail[0]));
+ return inverted_trail;
+}
+
+
+/**
+ * Return the shortest trail among all the trails to reach to finger from me.
+ * @param finger Finger
+ * @param shortest_trail_length[out] Trail length of shortest trail from me
+ * to @a finger
+ * @return Shortest trail.
+ */
+static struct GNUNET_PeerIdentity *
+get_shortest_trail (struct FingerInfo *finger,
+ unsigned int *trail_length)
+{
+ struct Trail *trail;
+ unsigned int flag = 0;
+ unsigned int shortest_trail_index = 0;
+ int shortest_trail_length = -1;
+ struct Trail_Element *trail_element;
+ struct GNUNET_PeerIdentity *trail_list;
+ unsigned int i;
+
+ /* Get the shortest trail to reach to current successor. */
+ for (i = 0; i < finger->trails_count; i++)
+ {
+ trail = &finger->trail_list[i];
+
+ if (0 == flag)
+ {
+ shortest_trail_index = i;
+ shortest_trail_length = trail->trail_length;
+ flag = 1;
+ continue;
+ }
+
+ if (shortest_trail_length > trail->trail_length)
+ {
+ shortest_trail_index = i;
+ shortest_trail_length = trail->trail_length;
+ }
+ continue;
+ }
+
+ /* Copy the shortest trail and return. */
+ trail = &finger->trail_list[shortest_trail_index];
+ trail_element = trail->trail_head;
+
+ trail_list = GNUNET_malloc (sizeof(struct GNUNET_PeerIdentity)*
+ shortest_trail_length);
+
+ for(i = 0; i < shortest_trail_length; i++,trail_element =
trail_element->next)
+ {
+ trail_list[i] = trail_element->peer;
+ }
+
+ GNUNET_assert(shortest_trail_length != -1);
+
+ *trail_length = shortest_trail_length;
+ return trail_list;
+}
+
+
+/**
+ * Check if trail_1 and trail_2 have any common element. If yes then join
+ * them at common element. trail_1 always preceeds trail_2 in joined trail.
+ * @param trail_1 Trail from source to me, NOT including endpoints.
+ * @param trail_1_len Total number of peers @a trail_1
+ * @param trail_2 Trail from me to current predecessor, NOT including
endpoints.
+ * @param trail_2_len Total number of peers @a trail_2
+ * @param joined_trail_len Total number of peers in combined trail of trail_1
+ * trail_2.
+ * @return Joined trail.
+ */
+static struct GNUNET_PeerIdentity *
+check_for_duplicate_entries (const struct GNUNET_PeerIdentity *trail_1,
+ unsigned int trail_1_len,
+ struct GNUNET_PeerIdentity *trail_2,
+ unsigned int trail_2_len,
+ unsigned int *joined_trail_len)
+{
+ struct GNUNET_PeerIdentity *joined_trail;
+ unsigned int i;
+ unsigned int j;
+ unsigned int k;
+
+ for (i = 0; i < trail_1_len; i++)
+ {
+ for (j = 0; j < trail_2_len; j++)
+ {
+ if(0 != GNUNET_CRYPTO_cmp_peer_identity (&trail_1[i],&trail_2[j]))
+ continue;
+
+ *joined_trail_len = i + (trail_2_len - j);
+ joined_trail = GNUNET_malloc (*joined_trail_len *
+ sizeof(struct GNUNET_PeerIdentity));
+
+
+ /* Copy all the elements from 0 to i into joined_trail. */
+ for(k = 0; k < ( i+1); k++)
+ {
+ joined_trail[k] = trail_1[k];
+ }
+
+ /* Increment j as entry stored is same as entry stored at i*/
+ j = j+1;
+
+ /* Copy all the elements from j to trail_2_len-1 to joined trail.*/
+ while(k <= (*joined_trail_len - 1))
+ {
+ joined_trail[k] = trail_2[j];
+ j++;
+ k++;
+ }
+
+ return joined_trail;
+ }
+ }
+
+ /* Here you should join the trails. */
+ *joined_trail_len = trail_1_len + trail_2_len + 1;
+ joined_trail = GNUNET_malloc (*joined_trail_len *
+ sizeof(struct GNUNET_PeerIdentity));
+
+
+ for(i = 0; i < trail_1_len;i++)
+ {
+ joined_trail[i] = trail_1[i];
+ }
+
+ joined_trail[i] = my_identity;
+ i++;
+
+ for (j = 0; i < *joined_trail_len; i++,j++)
+ {
+ joined_trail[i] = trail_2[j];
+ }
+
+ return joined_trail;
+}
+
+
+/**
+ * Return the trail from source to my current predecessor. Check if source
+ * is already part of the this trail, if yes then return the shorten trail.
+ * @param current_trail Trail from source to me, NOT including the endpoints.
+ * @param current_trail_length Number of peers in @a current_trail.
+ * @param trail_src_to_curr_pred_length[out] Number of peers in trail from
+ * source to my predecessor, NOT
including
+ * the endpoints.
+ * @return Trail from source to my predecessor.
+ */
+static struct GNUNET_PeerIdentity *
+get_trail_src_to_curr_pred (struct GNUNET_PeerIdentity source_peer,
+ const struct GNUNET_PeerIdentity *trail_src_to_me,
+ unsigned int trail_src_to_me_len,
+ unsigned int *trail_src_to_curr_pred_length)
+{
+ struct GNUNET_PeerIdentity *trail_me_to_curr_pred;
+ struct GNUNET_PeerIdentity *trail_src_to_curr_pred;
+ unsigned int trail_me_to_curr_pred_length;
+ struct FingerInfo *current_predecessor;
+ int i;
+ unsigned int j;
+ unsigned int len;
+
+ current_predecessor = &finger_table[PREDECESSOR_FINGER_ID];
+
+ /* Check if trail_src_to_me contains current_predecessor. */
+ for (i = 0; i < trail_src_to_me_len; i++)
+ {
+ if (0 != GNUNET_CRYPTO_cmp_peer_identity(&trail_src_to_me[i],
+
¤t_predecessor->finger_identity))
+ continue;
+
+
+ *trail_src_to_curr_pred_length = i;
+
+ if(0 == i)
+ return NULL;
+
+ trail_src_to_curr_pred = GNUNET_malloc (*trail_src_to_curr_pred_length *
+ sizeof(struct
GNUNET_PeerIdentity));
+ for (j = 0; j < i; j++)
+ trail_src_to_curr_pred[j] = trail_src_to_me[j];
+ return trail_src_to_curr_pred;
+ }
+
+
+ trail_me_to_curr_pred = get_shortest_trail (current_predecessor,
+ &trail_me_to_curr_pred_length);
+
+ /* Check if trail contains the source_peer. */
+ for (i = trail_me_to_curr_pred_length - 1; i >= 0; i--)
+ {
+ if (0 != GNUNET_CRYPTO_cmp_peer_identity (&source_peer,
+ &trail_me_to_curr_pred[i]))
+ continue;
+
+ /* Source is NOT part of trail. */
+ i++;
+
+ /* Source is the last element in the trail to reach to my pred.
+ Source is direct friend of the pred. */
+ if (trail_me_to_curr_pred_length == i)
+ {
+ *trail_src_to_curr_pred_length = 0;
+ GNUNET_free_non_null (trail_me_to_curr_pred);
+ return NULL;
+ }
+
+ *trail_src_to_curr_pred_length = trail_me_to_curr_pred_length - i;
+ trail_src_to_curr_pred = GNUNET_malloc (sizeof (struct
GNUNET_PeerIdentity)*
+ *trail_src_to_curr_pred_length);
+
+ for (j = 0; j < *trail_src_to_curr_pred_length; i++,j++)
+ trail_src_to_curr_pred[j] = trail_me_to_curr_pred[i];
+ GNUNET_free_non_null (trail_me_to_curr_pred);
+ return trail_src_to_curr_pred;
+ }
+
+ trail_src_to_curr_pred = check_for_duplicate_entries (trail_src_to_me,
+ trail_src_to_me_len,
+ trail_me_to_curr_pred,
+
trail_me_to_curr_pred_length,
+ &len);
+ *trail_src_to_curr_pred_length = len;
+ GNUNET_free_non_null(trail_me_to_curr_pred);
+ return trail_src_to_curr_pred;
+}
+
+
+/**
+ * Add finger as your predecessor. To add, first generate a new trail id,
invert
+ * the trail to get the trail from me to finger, add an entry in your routing
+ * table, send add trail message to peers which are part of trail from me to
+ * finger and add finger in finger table.
+ * @param finger
+ * @param trail
+ * @param trail_length
+ */
+static void
+update_predecessor (struct GNUNET_PeerIdentity finger,
+ struct GNUNET_PeerIdentity *trail,
+ unsigned int trail_length)
+{
+ struct GNUNET_HashCode trail_to_new_predecessor_id;
+ struct GNUNET_PeerIdentity *trail_to_new_predecessor;
+ struct FriendInfo *target_friend;
+
+ /* Generate trail id for trail from me to new predecessor = finger. */
+ GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_STRONG,
+ &trail_to_new_predecessor_id,
+ sizeof (trail_to_new_predecessor_id));
+
+ if (0 == trail_length)
+ {
+ trail_to_new_predecessor = NULL;
+ GDS_ROUTING_add (trail_to_new_predecessor_id, my_identity, finger);
+ target_friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap,
&finger);
+ if (NULL == target_friend)
+ {
+ GNUNET_break (0);
+ return;
+ }
+ }
+ else
+ {
+ /* Invert the trail to get the trail from me to finger, NOT including the
+ endpoints.*/
+ GNUNET_assert(NULL != GNUNET_CONTAINER_multipeermap_get(friend_peermap,
+
&trail[trail_length-1]));
+ trail_to_new_predecessor = invert_trail (trail, trail_length);
+
+ /* Add an entry in your routing table. */
+ GDS_ROUTING_add (trail_to_new_predecessor_id,
+ my_identity,
+ trail_to_new_predecessor[0]);
+
+ GNUNET_assert (NULL != (target_friend =
+ GNUNET_CONTAINER_multipeermap_get (friend_peermap,
+
&trail_to_new_predecessor[0])));
+ }
+
+ /* Add entry in routing table of all peers that are part of trail from me
+ to finger, including finger. */
+ GDS_NEIGHBOURS_send_add_trail (my_identity,
+ finger,
+ trail_to_new_predecessor_id,
+ trail_to_new_predecessor,
+ trail_length,
+ target_friend);
+
+ add_new_finger (finger, trail_to_new_predecessor, trail_length,
+ trail_to_new_predecessor_id, PREDECESSOR_FINGER_ID);
+ GNUNET_free_non_null(trail_to_new_predecessor);
+}
+
+
+/*
+ * Check if you already have a predecessor. If not then add finger as your
+ * predecessor. If you have predecessor, then compare two peer identites.
+ * If finger is correct predecessor, then remove the old entry, add finger in
+ * finger table and send add_trail message to add the trail in the routing
+ * table of all peers which are part of trail to reach from me to finger.
+ * @param finger New peer which may be our predecessor.
+ * @param trail List of peers to reach from @finger to me.
+ * @param trail_length Total number of peer in @a trail.
+ */
+static void
+compare_and_update_predecessor (struct GNUNET_PeerIdentity finger,
+ struct GNUNET_PeerIdentity *trail,
+ unsigned int trail_length)
+{
+ struct FingerInfo *current_predecessor;
+ struct GNUNET_PeerIdentity closest_peer;
+ uint64_t predecessor_value;
+ unsigned int is_predecessor = 1;
+
+ current_predecessor = &finger_table[PREDECESSOR_FINGER_ID];
+ GNUNET_assert (0 != GNUNET_CRYPTO_cmp_peer_identity (&finger, &my_identity));
+
+ /* No predecessor. Add finger as your predecessor. */
+ if (GNUNET_NO == current_predecessor->is_present)
+ {
+ update_predecessor (finger, trail, trail_length);
+ return;
+ }
+
+ if (0 == GNUNET_CRYPTO_cmp_peer_identity
(¤t_predecessor->finger_identity,
+ &finger))
+ {
+ return;
+ }
+
+ predecessor_value = compute_finger_identity_value (PREDECESSOR_FINGER_ID);
+ closest_peer = select_closest_peer (&finger,
+ ¤t_predecessor->finger_identity,
+ predecessor_value, is_predecessor);
+
+ /* Finger is the closest predecessor. Remove the existing one and add the new
+ one. */
+ if (0 == GNUNET_CRYPTO_cmp_peer_identity(&closest_peer, &finger))
+ {
+ remove_existing_finger (current_predecessor, PREDECESSOR_FINGER_ID);
+ update_predecessor (finger, trail, trail_length);
+ return;
+ }
+ return;
+}
+
+
+/*
+ * Core handle for p2p verify successor messages.
+ * @param cls closure
+ * @param message message
+ * @param peer peer identity this notification is about
+ * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
+ */
+static int
+handle_dht_p2p_verify_successor(void *cls,
+ const struct GNUNET_PeerIdentity *peer,
+ const struct GNUNET_MessageHeader *message)
+{
+ const struct PeerVerifySuccessorMessage *vsm;
+ struct GNUNET_HashCode trail_id;
+ struct GNUNET_PeerIdentity successor;
+ struct GNUNET_PeerIdentity source_peer;
+ struct GNUNET_PeerIdentity *trail;
+ struct GNUNET_PeerIdentity *next_hop;
+ struct FingerInfo current_predecessor;
+ struct FriendInfo *target_friend;
+ unsigned int trail_src_to_curr_pred_len = 0;
+ struct GNUNET_PeerIdentity *trail_src_to_curr_pred;
+ unsigned int trail_length;
+ size_t msize;
+
+ msize = ntohs (message->size);
+
+ if (msize < sizeof (struct PeerVerifySuccessorMessage))
+ {
+ GNUNET_break_op (0);
+ return GNUNET_YES;
+ }
+
+ vsm = (const struct PeerVerifySuccessorMessage *) message;
+ trail_length = (msize - sizeof (struct PeerVerifySuccessorMessage))/
+ sizeof (struct GNUNET_PeerIdentity);
+ if ((msize - sizeof (struct PeerVerifySuccessorMessage)) %
+ sizeof (struct GNUNET_PeerIdentity) != 0)
+ {
+ GNUNET_break_op (0);
+ return GNUNET_OK;
+ }
+
+ GNUNET_STATISTICS_update (GDS_stats,
+ gettext_noop
+ ("# Bytes received from other peers"), msize,
+ GNUNET_NO);
+
+ trail_id = vsm->trail_id;
+ source_peer = vsm->source_peer;
+ successor = vsm->successor;
+ trail = (struct GNUNET_PeerIdentity *)&vsm[1];
+
+ /* I am NOT the successor of source_peer. Pass the message to next_hop on
+ * the trail. */
+ if(0 != (GNUNET_CRYPTO_cmp_peer_identity (&successor, &my_identity)))
+ {
+ next_hop = GDS_ROUTING_get_next_hop (trail_id, GDS_ROUTING_SRC_TO_DEST);
+ if (NULL == next_hop)
+ {
+ return GNUNET_OK;
+ }
+
+ target_friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap,
next_hop);
+
+ if(NULL == target_friend)
+ {
+ GNUNET_break_op(0);
+ return GNUNET_OK;
+ }
+ GDS_NEIGHBOURS_send_verify_successor_message (source_peer, successor,
+ trail_id, trail,
trail_length,
+ target_friend);
+ return GNUNET_OK;
+ }
+
+ /* I am the destination of this message. */
+
+ /* Check if the source_peer could be our predecessor and if yes then update
+ * it. */
+ compare_and_update_predecessor (source_peer, trail, trail_length);
+ current_predecessor = finger_table[PREDECESSOR_FINGER_ID];
+
+ /* Is source of this message NOT my predecessor. */
+ if (0 != (GNUNET_CRYPTO_cmp_peer_identity
(¤t_predecessor.finger_identity,
+ &source_peer)))
+ {
+ trail_src_to_curr_pred =
+ get_trail_src_to_curr_pred (source_peer,
+ trail,
+ trail_length,
+ &trail_src_to_curr_pred_len);
+ }
+ else
+ {
+ trail_src_to_curr_pred_len = trail_length;
+ unsigned int i;
+
+ trail_src_to_curr_pred =
+ GNUNET_malloc (sizeof(struct GNUNET_PeerIdentity)
+ *trail_src_to_curr_pred_len);
+ for(i = 0; i < trail_src_to_curr_pred_len; i++)
+ {
+ trail_src_to_curr_pred[i] = trail[i];
+ }
+ }
+
+ GNUNET_assert (NULL !=
+ (target_friend =
+ GNUNET_CONTAINER_multipeermap_get (friend_peermap, peer)));
+ GDS_NEIGHBOURS_send_verify_successor_result (source_peer, my_identity,
+
current_predecessor.finger_identity,
+ trail_id,
trail_src_to_curr_pred,
+ trail_src_to_curr_pred_len,
+ GDS_ROUTING_DEST_TO_SRC,
+ target_friend);
+ GNUNET_free_non_null(trail_src_to_curr_pred);
+ return GNUNET_OK;
+}
+
+
+/**
+ * If the trail from me to my probable successor contains a friend not
+ * at index 0, then we can shorten the trail.
+ * @param probable_successor Peer which is our probable successor
+ * @param trail_me_to_probable_successor Peers in path from me to my probable
+ * successor, NOT including the
endpoints.
+ * @param trail_me_to_probable_successor_len Total number of peers in
+ * @a trail_me_to_probable_succesor.
+ * @return Updated trail, if any friend found.
+ * Else the trail_me_to_probable_successor.
+ */
+struct GNUNET_PeerIdentity *
+check_trail_me_to_probable_succ (struct GNUNET_PeerIdentity probable_successor,
+ const struct GNUNET_PeerIdentity
*trail_me_to_probable_successor,
+ unsigned int
trail_me_to_probable_successor_len,
+ unsigned int *trail_to_new_successor_length)
+{
+ unsigned int i;
+ unsigned int j;
+ struct GNUNET_PeerIdentity *trail_to_new_successor;
+
+ /* Probable successor is a friend */
+ if (NULL != GNUNET_CONTAINER_multipeermap_get (friend_peermap,
+ &probable_successor))
+ {
+ trail_to_new_successor = NULL;
+ *trail_to_new_successor_length = 0;
+ return trail_to_new_successor;
+ }
+
+ /* Is there any friend of yours in this trail. */
+ if(trail_me_to_probable_successor_len > 1)
+ {
+ for (i = trail_me_to_probable_successor_len - 1; i > 0; i--)
+ {
+ if (NULL == GNUNET_CONTAINER_multipeermap_get (friend_peermap,
+
&trail_me_to_probable_successor[i]))
+ continue;
+
+ *trail_to_new_successor_length = (trail_me_to_probable_successor_len -
i);
+ trail_to_new_successor = GNUNET_malloc (sizeof(struct
GNUNET_PeerIdentity)*
+
*trail_to_new_successor_length);
+
+
+ for(j = 0; j < *trail_to_new_successor_length; i++,j++)
+ {
+ trail_to_new_successor[j] = trail_me_to_probable_successor[i];
+ }
+
+ return trail_to_new_successor;
+ }
+ }
+
+ *trail_to_new_successor_length = trail_me_to_probable_successor_len;
+ return (struct GNUNET_PeerIdentity*)trail_me_to_probable_successor;
+}
+
+// TODO: Move up
+struct SendNotifyContext
+{
+ struct GNUNET_PeerIdentity source_peer;
+ struct GNUNET_PeerIdentity successor;
+ struct GNUNET_PeerIdentity *successor_trail;
+ unsigned int successor_trail_length;
+ struct GNUNET_HashCode succesor_trail_id;
+ struct FriendInfo *target_friend;
+ unsigned int num_retries_scheduled;
+};
+
+void
+send_notify_new_successor (void *cls,
+ const struct GNUNET_SCHEDULER_TaskContext
+ * tc);
+
+/**
+ * Check if the peer which sent us verify successor result message is still
ours
+ * successor or not. If not, then compare existing successor and probable
successor.
+ * In case probable successor is the correct successor, remove the existing
+ * successor. Add probable successor as new successor. Send notify new
successor
+ * message to new successor.
+ * @param curr_succ Peer to which we sent the verify successor message. It may
+ * or may not be our real current successor, as we may have few iterations of
+ * find finger trail task.
+ * @param probable_successor Peer which should be our successor accroding to @a
+ * curr_succ
+ * @param trail List of peers to reach from me to @a probable successor, NOT
including
+ * endpoints.
+ * @param trail_length Total number of peers in @a trail.
+ */
+static void
+compare_and_update_successor (struct GNUNET_PeerIdentity curr_succ,
+ struct GNUNET_PeerIdentity probable_successor,
+ const struct GNUNET_PeerIdentity *trail,
+ unsigned int trail_length)
+{
+ struct FingerInfo *current_successor;
+ struct GNUNET_PeerIdentity closest_peer;
+ struct GNUNET_HashCode trail_id;
+ struct GNUNET_PeerIdentity *trail_me_to_probable_succ;
+ struct FriendInfo *target_friend;
+ unsigned int trail_me_to_probable_succ_len;
+ unsigned int is_predecessor = 0;
+ uint64_t successor_value;
+
+ current_successor = &finger_table[0];
+ successor_value = compute_finger_identity_value(0);
+
+ /* If probable successor is same as current_successor, do nothing. */
+ if(0 == GNUNET_CRYPTO_cmp_peer_identity (&probable_successor,
+
¤t_successor->finger_identity))
+ {
+ if ((NULL != GDS_stats))
+ {
+ char *my_id_str;
+ uint64_t succ;
+ char *key;
+ uint64_t my_id;
+ memcpy (&my_id, &my_identity, sizeof(uint64_t));
+ my_id_str = GNUNET_strdup (GNUNET_i2s_full (&my_identity));
+ memcpy(&succ, ¤t_successor->finger_identity, sizeof(uint64_t));
+ succ = GNUNET_ntohll(succ);
+ GNUNET_asprintf (&key, "XDHT:%s:", my_id_str);
+ GNUNET_free (my_id_str);
+
+ GNUNET_STATISTICS_set (GDS_stats, key, succ, 0);
+ GNUNET_free (key);
+ }
+ if (send_verify_successor_task == NULL)
+ send_verify_successor_task =
+ GNUNET_SCHEDULER_add_delayed(verify_successor_next_send_time,
+ &send_verify_successor_message,
+ NULL);
+ return;
+ }
+ closest_peer = select_closest_peer (&probable_successor,
+ ¤t_successor->finger_identity,
+ successor_value, is_predecessor);
+
+ /* If the current_successor in the finger table is closest, then do nothing.
*/
+ if (0 == GNUNET_CRYPTO_cmp_peer_identity (&closest_peer ,
+
¤t_successor->finger_identity))
+ {
+ //FIXME: Is this a good place to return the stats.
+ if ((NULL != GDS_stats))
+ {
+ char *my_id_str;
+ uint64_t succ;
+ char *key;
+
+ my_id_str = GNUNET_strdup (GNUNET_i2s_full (&my_identity));
+ memcpy(&succ, ¤t_successor->finger_identity, sizeof(uint64_t));
+ GNUNET_asprintf (&key, "XDHT:%s:", my_id_str);
+ GNUNET_free (my_id_str);
+ GNUNET_STATISTICS_set (GDS_stats, key, succ, 0);
+ GNUNET_free (key);
+ }
+
+ if(0 == successor_times)
+ {
+// successor_times = 3;
+ verify_successor_next_send_time =
+ GNUNET_TIME_STD_BACKOFF (verify_successor_next_send_time);
+ }
+ else
+ successor_times--;
+
+
+ if (send_verify_successor_task == NULL)
+ send_verify_successor_task =
+ GNUNET_SCHEDULER_add_delayed(verify_successor_next_send_time,
+ &send_verify_successor_message,
+ NULL);
+ return;
+ }
+
+ /* Probable successor is the closest peer.*/
+ if(trail_length > 0)
+ {
+ GNUNET_assert(NULL != GNUNET_CONTAINER_multipeermap_get(friend_peermap,
+ &trail[0]));
+ }
+ else
+ {
+ GNUNET_assert(NULL != GNUNET_CONTAINER_multipeermap_get(friend_peermap,
+
&probable_successor));
+ }
+
+ trail_me_to_probable_succ_len = 0;
+ trail_me_to_probable_succ =
+ check_trail_me_to_probable_succ (probable_successor,
+ trail, trail_length,
+ &trail_me_to_probable_succ_len);
+
+ /* Remove the existing successor. */
+ remove_existing_finger (current_successor, 0);
+ /* Generate a new trail id to reach to your new successor. */
+ GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_STRONG,
+ &trail_id, sizeof (trail_id));
+
+ if (trail_me_to_probable_succ_len > 0)
+ {
+ GDS_ROUTING_add (trail_id, my_identity, trail_me_to_probable_succ[0]);
+ GNUNET_assert (NULL !=
+ (target_friend =
+ GNUNET_CONTAINER_multipeermap_get (friend_peermap,
+
&trail_me_to_probable_succ[0])));
+ }
+ else
+ {
+ GDS_ROUTING_add (trail_id, my_identity, probable_successor);
+ GNUNET_assert (NULL !=
+ (target_friend =
+ GNUNET_CONTAINER_multipeermap_get (friend_peermap,
+ &probable_successor)));
+ }
+
+ add_new_finger (probable_successor, trail_me_to_probable_succ,
+ trail_me_to_probable_succ_len, trail_id, 0);
+
+ struct SendNotifyContext *notify_ctx;
+
+ notify_ctx = GNUNET_new(struct SendNotifyContext);
+
+ notify_ctx->source_peer = my_identity;
+ notify_ctx->successor = probable_successor;
+ notify_ctx->successor_trail =
+ GNUNET_malloc(sizeof(struct GNUNET_PeerIdentity) *
trail_me_to_probable_succ_len);
+ memcpy(notify_ctx->successor_trail, trail_me_to_probable_succ,
+ sizeof(struct GNUNET_PeerIdentity) * trail_me_to_probable_succ_len);
+ notify_ctx->successor_trail_length = trail_me_to_probable_succ_len;
+ notify_ctx->succesor_trail_id = trail_id;
+ notify_ctx->target_friend = target_friend;
+ notify_ctx->num_retries_scheduled = 0;
+ GNUNET_free_non_null (trail_me_to_probable_succ);
+
+ // TODO: Check if we should verify before schedule if already scheduled.
+ GNUNET_SCHEDULER_add_now(&send_notify_new_successor, (void*)notify_ctx);
+}
+
+
+
+void
+send_notify_new_successor (void *cls,
+ const struct GNUNET_SCHEDULER_TaskContext
+ * tc)
+{
+ struct SendNotifyContext *ctx = (struct SendNotifyContext *) cls;
+
+ GDS_NEIGHBOURS_send_notify_new_successor (ctx->source_peer,
+ ctx->successor,
+ ctx->successor_trail,
+ ctx->successor_trail_length,
+ ctx->succesor_trail_id,
+ ctx->target_friend);
+
+ if (0 == ctx->num_retries_scheduled &&
+ send_notify_new_successor_retry_task != NULL)
+ {
+ // Result from previous notify successos hasn't arrived, so the retry task
+ // hasn't been cancelled! Already a new notify successor must be called.
+ // We will cancel the retry request.
+ struct SendNotifyContext *old_notify_ctx;
+ old_notify_ctx =
GNUNET_SCHEDULER_cancel(send_notify_new_successor_retry_task);
+ GNUNET_free (old_notify_ctx->successor_trail);
+ GNUNET_free (old_notify_ctx);
+ send_notify_new_successor_retry_task = NULL;
+ }
+
+ ctx->num_retries_scheduled++;
+ send_notify_new_successor_retry_task =
GNUNET_SCHEDULER_add_delayed(notify_successor_retry_time,
+
&send_notify_new_successor,
+ cls);
+}
+
+/*
+ * Core handle for p2p verify successor result messages.
+ * @param cls closure
+ * @param message message
+ * @param peer peer identity this notification is about
+ * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
+ */
+static int
+handle_dht_p2p_verify_successor_result(void *cls,
+ const struct GNUNET_PeerIdentity *peer,
+ const struct GNUNET_MessageHeader
*message)
+{
+ const struct PeerVerifySuccessorResultMessage *vsrm;
+ enum GDS_ROUTING_trail_direction trail_direction;
+ struct GNUNET_PeerIdentity querying_peer;
+ struct GNUNET_HashCode trail_id;
+ struct GNUNET_PeerIdentity *next_hop;
+ struct FriendInfo *target_friend;
+ struct GNUNET_PeerIdentity probable_successor;
+ struct GNUNET_PeerIdentity current_successor;
+ const struct GNUNET_PeerIdentity *trail;
+ unsigned int trail_length;
+ size_t msize;
+
+ msize = ntohs (message->size);
+ if (msize < sizeof (struct PeerVerifySuccessorResultMessage))
+ {
+ GNUNET_break_op (0);
+ return GNUNET_YES;
+ }
+
+ vsrm = (const struct PeerVerifySuccessorResultMessage *) message;
+ if ((msize - sizeof (struct PeerVerifySuccessorResultMessage)) %
+ sizeof (struct GNUNET_PeerIdentity) != 0)
+ {
+ GNUNET_break_op (0);
+ return GNUNET_OK;
+ }
+ trail_length = (msize - sizeof (struct PeerVerifySuccessorResultMessage))/
+ sizeof (struct GNUNET_PeerIdentity);
+
+ GNUNET_STATISTICS_update (GDS_stats,
+ gettext_noop
+ ("# Bytes received from other peers"), msize,
+ GNUNET_NO);
+
+ trail = (const struct GNUNET_PeerIdentity *) &vsrm[1];
+ querying_peer = vsrm->querying_peer;
+ trail_direction = ntohl (vsrm->trail_direction);
+ trail_id = vsrm->trail_id;
+ probable_successor = vsrm->probable_successor;
+ current_successor = vsrm->current_successor;
+
+ /* I am the querying_peer. */
+ if(0 == (GNUNET_CRYPTO_cmp_peer_identity (&querying_peer, &my_identity)))
+ {
+ /* Cancel Retry Task */
+ if (NULL != send_verify_successor_retry_task)
+ {
+ struct VerifySuccessorContext *ctx;
+ ctx = GNUNET_SCHEDULER_cancel(send_verify_successor_retry_task);
+ GNUNET_free(ctx);
+ send_verify_successor_retry_task = NULL;
+ }
+ compare_and_update_successor (current_successor,
+ probable_successor, trail, trail_length);
+ return GNUNET_OK;
+ }
+
+ /*If you are not the querying peer then pass on the message */
+ if(NULL == (next_hop =
+ GDS_ROUTING_get_next_hop (trail_id, trail_direction)))
+ {
+ /* Here it may happen that source peer has found a new successor, and
removed
+ the trail, Hence no entry found in the routing table. Fail silently.*/
+ DEBUG(" NO ENTRY FOUND IN %s ROUTING TABLE for trail id %s, line",
+ GNUNET_i2s(&my_identity), GNUNET_h2s(&trail_id), __LINE__);
+ GNUNET_break_op(0);
+ return GNUNET_OK;
+ }
+ if (NULL == (target_friend =
+ GNUNET_CONTAINER_multipeermap_get (friend_peermap, next_hop)))
+ {
+ GNUNET_break_op(0);
+ return GNUNET_OK;
+ }
+ GDS_NEIGHBOURS_send_verify_successor_result (querying_peer,
+ vsrm->current_successor,
+ probable_successor, trail_id,
+ trail,
+ trail_length,
+ trail_direction, target_friend);
+ return GNUNET_OK;
+}
+
+
+/*
+ * Core handle for p2p notify new successor messages.
+ * @param cls closure
+ * @param message message
+ * @param peer peer identity this notification is about
+ * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
+ */
+static int
+handle_dht_p2p_notify_new_successor(void *cls,
+ const struct GNUNET_PeerIdentity *peer,
+ const struct GNUNET_MessageHeader *message)
+{
+ const struct PeerNotifyNewSuccessorMessage *nsm;
+ struct GNUNET_PeerIdentity *trail;
+ struct GNUNET_PeerIdentity source;
+ struct GNUNET_PeerIdentity new_successor;
+ struct GNUNET_HashCode trail_id;
+ struct GNUNET_PeerIdentity next_hop;
+ struct FriendInfo *target_friend;
+ int my_index;
+ size_t msize;
+ uint32_t trail_length;
+
+ msize = ntohs (message->size);
+ if (msize < sizeof (struct PeerNotifyNewSuccessorMessage))
+ {
+ GNUNET_break_op (0);
+ return GNUNET_YES;
+ }
+ nsm = (const struct PeerNotifyNewSuccessorMessage *) message;
+ if ((msize - sizeof (struct PeerNotifyNewSuccessorMessage)) %
+ sizeof (struct GNUNET_PeerIdentity) != 0)
+ {
+ GNUNET_break_op (0);
+ return GNUNET_OK;
+ }
+ trail_length = (msize - sizeof (struct PeerNotifyNewSuccessorMessage))/
+ sizeof (struct GNUNET_PeerIdentity);
+ GNUNET_STATISTICS_update (GDS_stats,
+ gettext_noop
+ ("# Bytes received from other peers"), msize,
+ GNUNET_NO);
+
+ trail = (struct GNUNET_PeerIdentity *) &nsm[1];
+ source = nsm->source_peer;
+ new_successor = nsm->new_successor;
+ trail_id = nsm->trail_id;
+
+ /* I am the new_successor to source_peer. */
+ if ( 0 == GNUNET_CRYPTO_cmp_peer_identity (&my_identity, &new_successor))
+ {
+ if(trail_length > 0)
+ GNUNET_assert(0 == GNUNET_CRYPTO_cmp_peer_identity(&trail[trail_length -
1],
+ peer));
+ else
+ GNUNET_assert(0 == GNUNET_CRYPTO_cmp_peer_identity(&source, peer));
+
+ compare_and_update_predecessor (source, trail, trail_length);
+ target_friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap, peer);
+ GNUNET_assert (NULL != target_friend);
+ GDS_NEIGHBOURS_send_notify_succcessor_confirmation (trail_id,
+
GDS_ROUTING_DEST_TO_SRC,
+ target_friend);
+ return GNUNET_OK;
+ }
+
+ GNUNET_assert(trail_length > 0);
+ /* I am part of trail to reach to successor. */
+ my_index = search_my_index (trail, trail_length);
+ if (-1 == my_index)
+ {
+ DEBUG ("No entry found in trail\n");
+ GNUNET_break_op (0);
+ return GNUNET_SYSERR;
+ }
+ if((trail_length + 1) == my_index)
+ {
+ DEBUG ("Found twice in trail.\n");
+ GNUNET_break_op (0);
+ return GNUNET_SYSERR;
+ }
+ if ((trail_length-1) == my_index)
+ next_hop = new_successor;
+ else
+ next_hop = trail[my_index + 1];
+
+ GDS_ROUTING_add(trail_id, *peer, next_hop);
+ target_friend =
+ GNUNET_CONTAINER_multipeermap_get (friend_peermap, &next_hop);
+ if (NULL == target_friend)
+ {
+ GNUNET_break(0);
+ return GNUNET_OK;
+ }
+ GDS_NEIGHBOURS_send_notify_new_successor (source, new_successor, trail,
+ trail_length,
+ trail_id, target_friend);
+ return GNUNET_OK;
+
+}
+
+
+/**
+ * Core handler for P2P notify successor message
+ * @param cls closure
+ * @param message message
+ * @param peer peer identity this notification is about
+ * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
+ */
+static int
+handle_dht_p2p_notify_succ_confirmation (void *cls,
+ const struct GNUNET_PeerIdentity
*peer,
+ const struct GNUNET_MessageHeader
*message)
+{
+ const struct PeerNotifyConfirmationMessage *notify_confirmation;
+ enum GDS_ROUTING_trail_direction trail_direction;
+ struct GNUNET_HashCode trail_id;
+ struct FriendInfo *target_friend;
+ struct GNUNET_PeerIdentity *next_hop;
+ size_t msize;
+
+ msize = ntohs (message->size);
+
+ if (msize != sizeof (struct PeerNotifyConfirmationMessage))
+ {
+ GNUNET_break_op (0);
+ return GNUNET_OK;
+ }
+ GNUNET_STATISTICS_update (GDS_stats,
+ gettext_noop
+ ("# Bytes received from other peers"), msize,
+ GNUNET_NO);
+
+ notify_confirmation = (const struct PeerNotifyConfirmationMessage *) message;
+ trail_direction = ntohl (notify_confirmation->trail_direction);
+ trail_id = notify_confirmation->trail_id;
+
+ next_hop = GDS_ROUTING_get_next_hop (trail_id, trail_direction);
+ if (NULL == next_hop)
+ {
+ /* The source of notify new successor, might have found even a better
+ successor. In that case it send a trail teardown message, and hence,
+ the next hop is NULL. */
+ //Fixme: Add some print to confirm the above theory.
+ return GNUNET_OK;
+ }
+
+ /* I peer which sent the notify successor message to the successor. */
+ if (0 == GNUNET_CRYPTO_cmp_peer_identity (next_hop, &my_identity))
+ {
+ /*
+ * Schedule another round of verify sucessor with your current successor
+ * which may or may not be source of this message. This message is used
+ * only to ensure that we have a path setup to reach to our successor.
+ */
+
+ // TODO: cancel schedule of notify_successor_retry_task
+ if (send_notify_new_successor_retry_task != NULL)
+ {
+ struct SendNotifyContext *notify_ctx;
+ notify_ctx =
GNUNET_SCHEDULER_cancel(send_notify_new_successor_retry_task);
+ GNUNET_free (notify_ctx->successor_trail);
+ GNUNET_free (notify_ctx);
+ send_notify_new_successor_retry_task = NULL;
+ }
+ if (send_verify_successor_task == NULL)
+ {
+ verify_successor_next_send_time.rel_value_us =
+ DHT_SEND_VERIFY_SUCCESSOR_INTERVAL.rel_value_us +
+ GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK,
+
DHT_SEND_VERIFY_SUCCESSOR_INTERVAL.rel_value_us);
+ send_verify_successor_task =
+ GNUNET_SCHEDULER_add_delayed(verify_successor_next_send_time,
+ &send_verify_successor_message,
+ NULL);
+ }
+ }
+ else
+ {
+ target_friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap,
next_hop);
+ if (NULL == target_friend)
+ {
+ DEBUG ("\n friend not found, line number = %d",__LINE__);
+ return GNUNET_SYSERR;
+ }
+ GDS_NEIGHBOURS_send_notify_succcessor_confirmation (trail_id,
+
GDS_ROUTING_DEST_TO_SRC,
+ target_friend);
+ }
+ return GNUNET_OK;
+}
+
+
+/**
+ * Core handler for P2P trail rejection message
+ * @param cls closure
+ * @param message message
+ * @param peer peer identity this notification is about
+ * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
+ */
+static int
+handle_dht_p2p_trail_setup_rejection (void *cls,
+ const struct GNUNET_PeerIdentity *peer,
+ const struct GNUNET_MessageHeader
*message)
+{
+ const struct PeerTrailRejectionMessage *trail_rejection;
+ unsigned int trail_length;
+ const struct GNUNET_PeerIdentity *trail_peer_list;
+ struct FriendInfo *target_friend;
+ struct GNUNET_TIME_Relative congestion_timeout;
+ struct GNUNET_HashCode trail_id;
+ struct GNUNET_PeerIdentity next_peer;
+ struct GNUNET_PeerIdentity source;
+ uint64_t ultimate_destination_finger_value;
+ unsigned int is_predecessor;
+ size_t msize;
+
+ msize = ntohs (message->size);
+ if (msize < sizeof (struct PeerTrailRejectionMessage))
+ {
+ GNUNET_break_op (0);
+ return GNUNET_YES;
+ }
+ trail_rejection = (const struct PeerTrailRejectionMessage *) message;
+ if ((msize - sizeof (struct PeerTrailRejectionMessage)) %
+ sizeof (struct GNUNET_PeerIdentity) != 0)
+ {
+ GNUNET_break_op (0);
+ return GNUNET_OK;
+ }
+ trail_length = (msize - sizeof (struct PeerTrailRejectionMessage))/
+ sizeof (struct GNUNET_PeerIdentity);
+ GNUNET_STATISTICS_update (GDS_stats,
+ gettext_noop
+ ("# Bytes received from other peers"), msize,
+ GNUNET_NO);
+
+ trail_peer_list = (const struct GNUNET_PeerIdentity *)&trail_rejection[1];
+ is_predecessor = ntohl (trail_rejection->is_predecessor);
+ congestion_timeout = trail_rejection->congestion_time;
+ source = trail_rejection->source_peer;
+ trail_id = trail_rejection->trail_id;
+ ultimate_destination_finger_value =
+ GNUNET_ntohll (trail_rejection->ultimate_destination_finger_value);
+ /* First set the congestion time of the friend that sent you this message. */
+ target_friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap, peer);
+ if (NULL == target_friend)
+ {
+ DEBUG ("\nLINE = %d ,No friend found.",__LINE__);
+ GNUNET_break(0);
+ return GNUNET_OK;
+ }
+ target_friend->congestion_timestamp =
+ GNUNET_TIME_absolute_add (GNUNET_TIME_absolute_get(),
+ congestion_timeout);
+
+ /* I am the source peer which wants to setup the trail. Do nothing.
+ * send_find_finger_trail_task is scheduled periodically.*/
+ if(0 == (GNUNET_CRYPTO_cmp_peer_identity (&my_identity, &source)))
+ return GNUNET_OK;
+
+ /* If I am congested then pass this message to peer before me in trail. */
+ if(GNUNET_YES == GDS_ROUTING_threshold_reached())
+ {
+ /* First remove yourself from the trail. */
+ unsigned int new_trail_length = trail_length - 1;
+ struct GNUNET_PeerIdentity trail[new_trail_length];
+
+ memcpy (trail, trail_peer_list, new_trail_length * sizeof(struct
GNUNET_PeerIdentity));
+ if (0 == trail_length)
+ next_peer = source;
+ else
+ next_peer = trail[new_trail_length-1];
+
+ target_friend =
+ GNUNET_CONTAINER_multipeermap_get (friend_peermap,
&next_peer);
+ if (NULL == target_friend)
+ {
+ DEBUG ("\nLINE = %d ,No friend found.",__LINE__);
+ GNUNET_break(0);
+ return GNUNET_OK;
+ }
+ GDS_NEIGHBOURS_send_trail_rejection (source,
+ ultimate_destination_finger_value,
+ my_identity, is_predecessor,
+ trail, new_trail_length, trail_id,
+ target_friend, CONGESTION_TIMEOUT);
+ return GNUNET_OK;
+ }
+
+ struct Closest_Peer successor;
+ successor = find_local_best_known_next_hop
(ultimate_destination_finger_value, is_predecessor);
+
+ /* Am I the final destination? */
+ if (0 == (GNUNET_CRYPTO_cmp_peer_identity (&successor.best_known_destination,
+ &my_identity)))
+ {
+ /*Here you are already part of trail. Copy the trail removing yourself. */
+ unsigned int new_trail_length = trail_length - 1;
+ struct GNUNET_PeerIdentity trail[new_trail_length];
+
+ memcpy (trail, trail_peer_list, new_trail_length * sizeof(struct
GNUNET_PeerIdentity));
+
+ if (0 == new_trail_length)
+ next_peer = source;
+ else
+ {
+ next_peer = trail[new_trail_length-1];
+ }
+ target_friend =
+ GNUNET_CONTAINER_multipeermap_get (friend_peermap,
&next_peer);
+
+ if (NULL == target_friend)
+ {
+ DEBUG ("\nLINE = %d ,No friend found.",__LINE__);
+ GNUNET_break(0);
+ return GNUNET_OK;
+ }
+ GDS_NEIGHBOURS_send_trail_setup_result (source,
+ my_identity,
+ target_friend, new_trail_length,
+ trail,
+ is_predecessor,
+ ultimate_destination_finger_value,
+ trail_id);
+ }
+ else
+ {
+ /* Here I was already part of trail. So no need to add. */
+ target_friend =
+ GNUNET_CONTAINER_multipeermap_get (friend_peermap,
+ &successor.next_hop);
+ if (NULL == target_friend)
+ {
+ DEBUG ("\nLINE = %d ,No friend found.",__LINE__);
+ GNUNET_break(0);
+ return GNUNET_OK;
+ }
+
+ GDS_NEIGHBOURS_send_trail_setup (source,
+ ultimate_destination_finger_value,
+ successor.best_known_destination,
+ target_friend, trail_length,
trail_peer_list,
+ is_predecessor, trail_id,
+ successor.trail_id);
+ }
+ return GNUNET_OK;
+}
+
+
+/**
+ * Core handler for trail teardown message.
+ * @param cls closure
+ * @param message message
+ * @param peer sender of this messsage.
+ * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
+ */
+static int
+handle_dht_p2p_trail_teardown (void *cls, const struct GNUNET_PeerIdentity
*peer,
+ const struct GNUNET_MessageHeader *message)
+{
+ const struct PeerTrailTearDownMessage *trail_teardown;
+ enum GDS_ROUTING_trail_direction trail_direction;
+ struct GNUNET_HashCode trail_id;
+ struct GNUNET_PeerIdentity *next_hop;
+ size_t msize;
+
+ msize = ntohs (message->size);
+
+ /* Here we pass only the trail id. */
+ if (msize != sizeof (struct PeerTrailTearDownMessage))
+ {
+ GNUNET_break_op (0);
+ return GNUNET_OK;
+ }
+
+ GNUNET_STATISTICS_update (GDS_stats,
+ gettext_noop
+ ("# Bytes received from other peers"), msize,
+ GNUNET_NO);
+
+ trail_teardown = (const struct PeerTrailTearDownMessage *) message;
+ trail_direction = ntohl (trail_teardown->trail_direction);
+ trail_id = trail_teardown->trail_id;
+
+ /* Check if peer is the real peer from which we should get this message.*/
+ /* Get the prev_hop for this trail by getting the next hop in opposite
direction. */
+#if 0
+ GNUNET_assert (NULL != (prev_hop =
+ GDS_ROUTING_get_next_hop (trail_id, !trail_direction)));
+ if (0 != GNUNET_CRYPTO_cmp_peer_identity (prev_hop, peer))
+ {
+ GNUNET_break (0);
+ return GNUNET_SYSERR;
+ }
+#endif
+
+ next_hop = GDS_ROUTING_get_next_hop (trail_id, trail_direction);
+ if (NULL == next_hop)
+ {
+ DEBUG(" NO ENTRY FOUND IN %s ROUTING TABLE for trail id %s, line",
+ GNUNET_i2s(&my_identity), GNUNET_h2s(&trail_id), __LINE__);
+ GNUNET_break (0);
+ return GNUNET_SYSERR;
+ }
+
+ /* I am the next hop, which means I am the final destination. */
+ if (0 == GNUNET_CRYPTO_cmp_peer_identity (next_hop, &my_identity))
+ {
+ GNUNET_assert (GNUNET_YES == GDS_ROUTING_remove_trail (trail_id));
+ return GNUNET_OK;
+ }
+ else
+ {
+ /* If not final destination, then send a trail teardown message to next
hop.*/
+ GNUNET_assert (NULL != GNUNET_CONTAINER_multipeermap_get (friend_peermap,
next_hop));
+ GNUNET_assert (GNUNET_YES == GDS_ROUTING_remove_trail (trail_id));
+ GDS_NEIGHBOURS_send_trail_teardown (&trail_id, trail_direction, next_hop);
+ }
+
+ return GNUNET_OK;
+}
+
+
+/**
+ * Core handle for p2p add trail message.
+ * @param cls closure
+ * @param message message
+ * @param peer peer identity this notification is about
+ * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
+ */
+static int
+handle_dht_p2p_add_trail (void *cls, const struct GNUNET_PeerIdentity *peer,
+ const struct GNUNET_MessageHeader *message)
+{
+ const struct PeerAddTrailMessage *add_trail;
+ const struct GNUNET_PeerIdentity *trail;
+ struct GNUNET_HashCode trail_id;
+ struct GNUNET_PeerIdentity destination_peer;
+ struct GNUNET_PeerIdentity source_peer;
+ struct GNUNET_PeerIdentity next_hop;
+ unsigned int trail_length;
+ unsigned int my_index;
+ size_t msize;
+
+ msize = ntohs (message->size);
+ /* In this message we pass the whole trail from source to destination as we
+ * are adding that trail.*/
+ //FIXME: failed when run with 1000 pears. check why.
+ if (msize < sizeof (struct PeerAddTrailMessage))
+ {
+ GNUNET_break_op (0);
+ return GNUNET_OK;
+ }
+
+ add_trail = (const struct PeerAddTrailMessage *) message;
+ trail_length = (msize - sizeof (struct PeerAddTrailMessage))/
+ sizeof (struct GNUNET_PeerIdentity);
+ if ((msize - sizeof (struct PeerAddTrailMessage)) %
+ sizeof (struct GNUNET_PeerIdentity) != 0)
+ {
+ GNUNET_break_op (0);
+ return GNUNET_OK;
+ }
+
+ GNUNET_STATISTICS_update (GDS_stats,
+ gettext_noop
+ ("# Bytes received from other peers"), msize,
+ GNUNET_NO);
+
+ trail = (const struct GNUNET_PeerIdentity *)&add_trail[1];
+ destination_peer = add_trail->destination_peer;
+ source_peer = add_trail->source_peer;
+ trail_id = add_trail->trail_id;
+
+ /* I am not the destination of the trail. */
+ if (0 != GNUNET_CRYPTO_cmp_peer_identity (&my_identity, &destination_peer))
+ {
+ struct FriendInfo *target_friend;
+
+ /* Get my location in the trail. */
+ my_index = search_my_index (trail, trail_length);
+ if (-1 == my_index)
+ {
+ GNUNET_break_op (0);
+ return GNUNET_SYSERR;
+ }
+ if((trail_length + 1) == my_index)
+ {
+ DEBUG ("Found twice in trail.\n");
+ GNUNET_break_op (0);
+ return GNUNET_SYSERR;
+ }
+ if ((trail_length - 1) == my_index)
+ {
+ next_hop = destination_peer;
+ }
+ else
+ {
+ next_hop = trail[my_index + 1];
+ }
+ /* Add in your routing table. */
+ GNUNET_assert (GNUNET_OK == GDS_ROUTING_add (trail_id, *peer, next_hop));
+ //GNUNET_assert (GNUNET_OK == GDS_ROUTING_add (trail_id, next_hop, *peer));
+ GNUNET_assert (NULL !=
+ (target_friend =
+ GNUNET_CONTAINER_multipeermap_get (friend_peermap,
&next_hop)));
+ GDS_NEIGHBOURS_send_add_trail (source_peer, destination_peer, trail_id,
+ trail, trail_length, target_friend);
+ return GNUNET_OK;
+ }
+ /* I am the destination. Add an entry in routing table. */
+ GNUNET_assert (GNUNET_OK == GDS_ROUTING_add (trail_id, *peer, my_identity));
+ return GNUNET_OK;
+}
+
+
+/**
+ * Free the finger trail in which the first friend to reach to a finger is
+ * disconnected_friend. Also remove entry from routing table for that
particular
+ * trail id.
+ * @param disconnected_friend PeerIdentity of friend which got disconnected
+ * @param remove_finger Finger whose trail we need to check if it has
+ * disconnected_friend as the first hop.
+ * @return Total number of trails in which disconnected_friend was the first
+ * hop.
+ */
+static int
+remove_matching_trails (const struct GNUNET_PeerIdentity *disconnected_friend,
+ struct FingerInfo *finger)
+{
+ struct GNUNET_PeerIdentity *next_hop;
+ struct FriendInfo *remove_friend;
+ struct Trail *current_trail;
+ unsigned int matching_trails_count = 0;
+ int i;
+
+ /* Iterate over all the trails of finger. */
+ for (i = 0; i < finger->trails_count; i++)
+ {
+ current_trail = &finger->trail_list[i];
+ if (GNUNET_NO == current_trail->is_present)
+ continue;
+
+ /* First friend to reach to finger is disconnected_peer. */
+ if (0 == GNUNET_CRYPTO_cmp_peer_identity (¤t_trail->trail_head->peer,
+ disconnected_friend))
+ {
+ remove_friend =
+ GNUNET_CONTAINER_multipeermap_get (friend_peermap,
+ disconnected_friend);
+ GNUNET_assert (NULL != remove_friend);
+ next_hop = GDS_ROUTING_get_next_hop (current_trail->trail_id,
+ GDS_ROUTING_SRC_TO_DEST);
+
+ /* Here it may happen that as all the peers got disconnected, the entry
in
+ routing table for that particular trail has been removed, because the
+ previously disconnected peer was either a next hop or prev hop of that
+ peer. */
+ if (NULL != next_hop)
+ {
+ GNUNET_assert (0 == (GNUNET_CRYPTO_cmp_peer_identity
(disconnected_friend,
+ next_hop)));
+ GNUNET_assert (GNUNET_YES == GDS_ROUTING_remove_trail
(current_trail->trail_id));
+ }
+ matching_trails_count++;
+ free_trail (current_trail);
+ current_trail->is_present = GNUNET_NO;
+ }
+ }
+ return matching_trails_count;
+}
+
+
+/**
+ * Iterate over finger_table entries.
+ * 0. Ignore finger which is my_identity or if no valid entry present at
+ * that finger index.
+ * 1. If disconnected_friend is a finger, then remove the routing entry from
+ your own table. Free the trail.
+ * 2. Check if disconnected_friend is the first friend in the trail to reach
to a finger.
+ * 2.1 Remove all the trails and entry from routing table in which
disconnected
+ * friend is the first friend in the trail. If disconnected_friend is the
+ * first friend in all the trails to reach finger, then remove the
finger.
+ * @param disconnected_friend Peer identity of friend which got disconnected.
+ */
+static void
+remove_matching_fingers (const struct GNUNET_PeerIdentity *disconnected_peer)
+{
+ struct FingerInfo *current_finger;
+ int removed_trails_count;
+ int i;
+
+ /* Iterate over finger table entries. */
+ for (i = 0; i < MAX_FINGERS; i++)
+ {
+ current_finger = &finger_table[i];
+
+ /* No finger stored at this trail index or I am the finger. */
+ if ((GNUNET_NO == current_finger->is_present) ||
+ (0 == GNUNET_CRYPTO_cmp_peer_identity
(¤t_finger->finger_identity,
+ &my_identity)))
+ continue;
+
+ /* Is disconnected_peer a finger? */
+ if (0 == GNUNET_CRYPTO_cmp_peer_identity (disconnected_peer,
+
¤t_finger->finger_identity))
+ {
+ remove_existing_finger (current_finger, i);
+ }
+
+ /* If finger is a friend but not disconnected_friend, then continue. */
+ if (NULL != GNUNET_CONTAINER_multipeermap_get (friend_peermap,
+
¤t_finger->finger_identity))
+ continue;
+
+ /* Iterate over the list of trails to reach remove_finger. Check if
+ * disconnected_friend is the first friend in any of the trail. */
+ removed_trails_count = remove_matching_trails (disconnected_peer,
+ current_finger);
+ current_finger->trails_count =
+ current_finger->trails_count - removed_trails_count;
+ if (0 == current_finger->trails_count)
+ {
+ current_finger->is_present = GNUNET_NO;
+ memset ((void *)&finger_table[i], 0, sizeof (finger_table[i]));
+ }
+ }
+}
+
+
+/**
+ * Method called whenever a peer disconnects.
+ *
+ * @param cls closure
+ * @param peer peer identity this notification is about
+ */
+static void
+handle_core_disconnect (void *cls,
+ const struct GNUNET_PeerIdentity
*peer)
+{
+ struct FriendInfo *remove_friend;
+ struct P2PPendingMessage *pos;
+ unsigned int discarded;
+
+ /* If disconnected to own identity, then return. */
+ if (0 == memcmp (&my_identity, peer, sizeof (struct GNUNET_PeerIdentity)))
+ return;
+
+ if(NULL == (remove_friend =
+ GNUNET_CONTAINER_multipeermap_get (friend_peermap, peer)))
+ {
+ DEBUG("\n friend already disconnected.");
+ return;
+ }
+
+ remove_matching_fingers (peer);
+ GNUNET_assert (GNUNET_SYSERR != GDS_ROUTING_remove_trail_by_peer (peer));
+ GNUNET_assert (GNUNET_YES ==
+ GNUNET_CONTAINER_multipeermap_remove (friend_peermap,
+ peer,
+ remove_friend));
+
+ /* Remove all the messages queued in pending list of this peer is
discarded.*/
+ if (remove_friend->th != NULL)
+ {
+ GNUNET_CORE_notify_transmit_ready_cancel(remove_friend->th);
+ remove_friend->th = NULL;
+ }
+
+ discarded = 0;
+ while (NULL != (pos = remove_friend->head))
+ {
+ GNUNET_CONTAINER_DLL_remove (remove_friend->head, remove_friend->tail,
pos);
+ discarded++;
+ GNUNET_free (pos);
+ }
+
+ GNUNET_STATISTICS_update (GDS_stats,
+ gettext_noop
+ ("# Queued messages discarded (peer
disconnected)"),
+ discarded, GNUNET_NO);
+ //GNUNET_free (remove_friend);
+
+ if (0 != GNUNET_CONTAINER_multipeermap_size (friend_peermap))
+ return;
+
+ if (NULL != find_finger_trail_task)
+ {
+ GNUNET_SCHEDULER_cancel (find_finger_trail_task);
+ find_finger_trail_task = NULL;
+ }
+ else
+ GNUNET_break (0);
+}
+
+
+/**
+ * Method called whenever a peer connects.
+ *
+ * @param cls closure
+ * @param peer_identity peer identity this notification is about
+ */
+static void
+handle_core_connect (void *cls, const struct GNUNET_PeerIdentity
*peer_identity)
+{
+ struct FriendInfo *friend;
+
+ /* Check for connect to self message */
+ if (0 == memcmp (&my_identity, peer_identity, sizeof (struct
GNUNET_PeerIdentity)))
+ return;
+
+ /* If peer already exists in our friend_peermap, then exit. */
+ if (GNUNET_YES == GNUNET_CONTAINER_multipeermap_contains (friend_peermap,
+ peer_identity))
+ {
+ GNUNET_break (0);
+ return;
+ }
+
+ friend = GNUNET_new (struct FriendInfo);
+ friend->id = *peer_identity;
+
+ GNUNET_assert (GNUNET_OK ==
+ GNUNET_CONTAINER_multipeermap_put (friend_peermap,
+ peer_identity, friend,
+
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY));
+
+ /* FIXME: now we are not making a distinction between fingers which are
friends
+ * also.But later, we should add a congestion timestamp on the friend, so
that it is
+ * selected after some time out. This is to ensure that both peers have added
+ * each other as their friend. */
+ /* Got a first connection, good time to start with FIND FINGER TRAIL
requests...*/
+ if (NULL == find_finger_trail_task)
+ {
+ find_finger_trail_task = GNUNET_SCHEDULER_add_now
(&send_find_finger_trail_message, NULL);
+ }
+}
+
+
+/**
+ * To be called on core init/fail.
+ *
+ * @param cls service closure
+ * @param identity the public identity of this peer
+ */
+static void
+core_init (void *cls,
+ const struct GNUNET_PeerIdentity *identity)
+{
+ my_identity = *identity;
+}
+
+
+/**
+ * Initialize finger table entries.
+ */
+static void
+finger_table_init ()
+{
+ memset (&finger_table, 0, sizeof (finger_table));
+}
+
+
+/**
+ * Initialize neighbours subsystem.
+ * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
+ */
+int
+GDS_NEIGHBOURS_init (void)
+{
+ static struct GNUNET_CORE_MessageHandler core_handlers[] = {
+ {&handle_dht_p2p_put, GNUNET_MESSAGE_TYPE_XDHT_P2P_PUT, 0},
+ {&handle_dht_p2p_get, GNUNET_MESSAGE_TYPE_XDHT_P2P_GET, 0},
+ {&handle_dht_p2p_get_result, GNUNET_MESSAGE_TYPE_XDHT_P2P_GET_RESULT, 0},
+ {&handle_dht_p2p_trail_setup, GNUNET_MESSAGE_TYPE_XDHT_P2P_TRAIL_SETUP, 0},
+ {&handle_dht_p2p_trail_setup_result,
GNUNET_MESSAGE_TYPE_XDHT_P2P_TRAIL_SETUP_RESULT, 0},
+ {&handle_dht_p2p_verify_successor,
GNUNET_MESSAGE_TYPE_XDHT_P2P_VERIFY_SUCCESSOR, 0},
+ {&handle_dht_p2p_verify_successor_result,
GNUNET_MESSAGE_TYPE_XDHT_P2P_VERIFY_SUCCESSOR_RESULT, 0},
+ {&handle_dht_p2p_notify_new_successor,
GNUNET_MESSAGE_TYPE_XDHT_P2P_NOTIFY_NEW_SUCCESSOR, 0},
+ {&handle_dht_p2p_trail_setup_rejection,
GNUNET_MESSAGE_TYPE_XDHT_P2P_TRAIL_SETUP_REJECTION, 0},
+ {&handle_dht_p2p_trail_teardown,
GNUNET_MESSAGE_TYPE_XDHT_P2P_TRAIL_TEARDOWN,
+ sizeof (struct PeerTrailTearDownMessage)},
+ {&handle_dht_p2p_add_trail, GNUNET_MESSAGE_TYPE_XDHT_P2P_ADD_TRAIL, 0},
+ {&handle_dht_p2p_notify_succ_confirmation,
GNUNET_MESSAGE_TYPE_XDHT_P2P_NOTIFY_SUCCESSOR_CONFIRMATION,
+ sizeof (struct
PeerNotifyConfirmationMessage)},
+ {NULL, 0, 0}
+ };
+
+#if ENABLE_MALICIOUS
+ act_malicious = 0;
+#endif
+
+ core_api =
+ GNUNET_CORE_connect (GDS_cfg, NULL, &core_init, &handle_core_connect,
+ &handle_core_disconnect, NULL, GNUNET_NO, NULL,
+ GNUNET_NO, core_handlers);
+
+ if (NULL == core_api)
+ return GNUNET_SYSERR;
+
+ //TODO: check size of this peer map?
+ friend_peermap = GNUNET_CONTAINER_multipeermap_create (256, GNUNET_NO);
+ finger_table_init ();
+ successor_times = 10;
+ fingers_round_count = 5;
+ find_finger_trail_task_next_send_time.rel_value_us =
+ DHT_FIND_FINGER_TRAIL_INTERVAL.rel_value_us +
+ GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK,
+ DHT_FIND_FINGER_TRAIL_INTERVAL.rel_value_us);
+
+ verify_successor_next_send_time.rel_value_us =
+ DHT_SEND_VERIFY_SUCCESSOR_INTERVAL.rel_value_us +
+ GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK,
+
DHT_SEND_VERIFY_SUCCESSOR_INTERVAL.rel_value_us);
+
+ verify_successor_retry_time.rel_value_us =
+ DHT_SEND_VERIFY_SUCCESSOR_RETRY_INTERVAL.rel_value_us +
+ GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK,
+
DHT_SEND_VERIFY_SUCCESSOR_RETRY_INTERVAL.rel_value_us);
+
+ notify_successor_retry_time.rel_value_us =
+ DHT_SEND_NOTIFY_SUCCESSOR_RETRY_INTERVAL.rel_value_us +
+ GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK,
+
DHT_SEND_NOTIFY_SUCCESSOR_RETRY_INTERVAL.rel_value_us);
+
+
+ return GNUNET_OK;
+}
+
+
+/**
+ * Free the memory held up by trails of a finger.
+ */
+static void
+delete_finger_table_entries()
+{
+ unsigned int i;
+ unsigned int j;
+
+ for(i = 0; i < MAX_FINGERS; i++)
+ {
+ if(GNUNET_YES == finger_table[i].is_present)
+ {
+ for(j = 0; j < finger_table[i].trails_count; j++)
+ free_trail(&finger_table[i].trail_list[j]);
+ }
+ }
+}
+
+
+/**
+ * Shutdown neighbours subsystem.
+ */
+void
+GDS_NEIGHBOURS_done (void)
+{
+ if (NULL == core_api)
+ return;
+
+ GNUNET_CORE_disconnect (core_api);
+ core_api = NULL;
+
+ delete_finger_table_entries();
+ GNUNET_assert (0 == GNUNET_CONTAINER_multipeermap_size (friend_peermap));
+ GNUNET_CONTAINER_multipeermap_destroy (friend_peermap);
+ friend_peermap = NULL;
+
+ if (NULL != find_finger_trail_task)
+ {
+ GNUNET_SCHEDULER_cancel (find_finger_trail_task);
+ find_finger_trail_task = NULL;
+ }
+
+ if (NULL != send_verify_successor_task)
+ {
+ GNUNET_SCHEDULER_cancel (send_verify_successor_task);
+ send_verify_successor_task = NULL;
+ }
+
+ if (NULL != send_verify_successor_retry_task)
+ {
+ struct VerifySuccessorContext *ctx;
+ ctx = GNUNET_SCHEDULER_cancel (send_verify_successor_retry_task);
+ GNUNET_free(ctx);
+ send_verify_successor_retry_task = NULL;
+ }
+
+ if (send_notify_new_successor_retry_task != NULL)
+ {
+ struct SendNotifyContext *notify_ctx;
+ notify_ctx = GNUNET_SCHEDULER_cancel(send_notify_new_successor_retry_task);
+ GNUNET_free (notify_ctx->successor_trail);
+ GNUNET_free (notify_ctx);
+ send_notify_new_successor_retry_task = NULL;
+ }
+}
+
+
+/**
+ * Get my identity
+ *
+ * @return my identity
+ */
+struct GNUNET_PeerIdentity
+GDS_NEIGHBOURS_get_my_id (void)
+{
+ return my_identity;
+}
+
+/* end of gnunet-service-xdht_neighbours.c */
Added: gnunet/src/dht/gnunet-service-wdht_neighbours.h
===================================================================
--- gnunet/src/dht/gnunet-service-wdht_neighbours.h
(rev 0)
+++ gnunet/src/dht/gnunet-service-wdht_neighbours.h 2015-04-27 11:12:21 UTC
(rev 35559)
@@ -0,0 +1,146 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2009, 2010, 2011 Christian Grothoff (and other contributing
authors)
+
+ GNUnet is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 3, or (at your
+ option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNUnet; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+/**
+ * @file dht/gnunet-service-xdht_neighbours.h
+ * @brief GNUnet DHT routing code
+ * @author Supriti Singh
+ */
+
+#ifndef GNUNET_SERVICE_XDHT_NEIGHBOURS_H
+#define GNUNET_SERVICE_XDHT_NEIGHBOURS_H
+
+#include "gnunet_util_lib.h"
+#include "gnunet_block_lib.h"
+#include "gnunet_dht_service.h"
+
+
+#if ENABLE_MALICIOUS
+/**
+ * Set the ENABLE_MALICIOUS value to malicious.
+ * @param malicious
+ */
+int
+GDS_NEIGHBOURS_act_malicious (unsigned int malicious);
+#endif
+
+/**
+ * Handle the put request from the client.
+ * @param key Key for the content
+ * @param block_type Type of the block
+ * @param options Routing options
+ * @param desired_replication_level Desired replication count
+ * @param expiration_time When does the content expire
+ * @param data Content to store
+ * @param data_size Size of content @a data in bytes
+ */
+void
+GDS_NEIGHBOURS_handle_put (const struct GNUNET_HashCode *key,
+ enum GNUNET_BLOCK_Type block_type,
+ enum GNUNET_DHT_RouteOption options,
+ uint32_t desired_replication_level,
+ struct GNUNET_TIME_Absolute expiration_time,
+ const void *data, size_t data_size);
+
+/**
+ * Handle the get request from the client file. If I am destination do
+ * datacache put and return. Else find the target friend and forward message
+ * to it.
+ * @param key Key for the content
+ * @param block_type Type of the block
+ * @param options Routing options
+ * @param desired_replication_level Desired replication count
+ */
+void
+GDS_NEIGHBOURS_handle_get(const struct GNUNET_HashCode *key,
+ enum GNUNET_BLOCK_Type block_type,
+ enum GNUNET_DHT_RouteOption options,
+ uint32_t desired_replication_level);
+
+/**
+ * Send the get result to requesting client.
+ * @param key Key of the requested data.
+ * @param type Block type
+ * @param target_peer Next peer to forward the message to.
+ * @param source_peer Peer which has the data for the key.
+ * @param put_path_length Number of peers in @a put_path
+ * @param put_path Path taken to put the data at its stored location.
+ * @param get_path_length Number of peers in @a get_path
+ * @param get_path Path taken to reach to the location of the key.
+ * @param expiration When will this result expire?
+ * @param data Payload to store
+ * @param data_size Size of the @a data
+ */
+void
+GDS_NEIGHBOURS_send_get_result (const struct GNUNET_HashCode *key,
+ enum GNUNET_BLOCK_Type type,
+ const struct GNUNET_PeerIdentity *target_peer,
+ const struct GNUNET_PeerIdentity *source_peer,
+ unsigned int put_path_length,
+ const struct GNUNET_PeerIdentity *put_path,
+ unsigned int get_path_length,
+ const struct GNUNET_PeerIdentity *get_path,
+ struct GNUNET_TIME_Absolute expiration,
+ const void *data, size_t data_size);
+
+/**
+ * Construct a trail teardown message and forward it to target friend.
+ * @param trail_id Unique identifier of the trail.
+ * @param trail_direction Direction of trail.
+ * @param target_friend Friend to get this message.
+ */
+void
+GDS_NEIGHBOURS_send_trail_teardown (const struct GNUNET_HashCode *trail_id,
+ unsigned int trail_direction,
+ const struct GNUNET_PeerIdentity *peer);
+
+/**
+ * Return friend corresponding to peer.
+ * @param peer
+ * @return Friend
+ */
+struct FriendInfo *
+GDS_NEIGHBOURS_get_friend (struct GNUNET_PeerIdentity peer);
+/**
+ * Initialize neighbours subsystem.
+ *
+ * @return #GNUNET_OK on success,
+ * #GNUNET_SYSERR on error
+ */
+int
+GDS_NEIGHBOURS_init (void);
+
+
+/**
+ * Shutdown neighbours subsystem.
+ */
+void
+GDS_NEIGHBOURS_done (void);
+
+
+/**
+ * Get my identity
+ *
+ * @return my identity
+ */
+struct GNUNET_PeerIdentity
+GDS_NEIGHBOURS_get_my_id (void);
+
+#endif
Added: gnunet/src/dht/gnunet-service-wdht_nse.c
===================================================================
--- gnunet/src/dht/gnunet-service-wdht_nse.c (rev 0)
+++ gnunet/src/dht/gnunet-service-wdht_nse.c 2015-04-27 11:12:21 UTC (rev
35559)
@@ -0,0 +1,116 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2009, 2010, 2011 Christian Grothoff (and other contributing
authors)
+
+ GNUnet is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 3, or (at your
+ option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNUnet; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+/**
+ * @file dht/gnunet-service-xdht_nse.c
+ * @brief GNUnet DHT integration with NSE
+ * @author Christian Grothoff
+ */
+#include "platform.h"
+#include "gnunet_nse_service.h"
+#include "gnunet-service-wdht.h"
+#include "gnunet-service-wdht_nse.h"
+
+/**
+ * log of the current network size estimate, used as the point where
+ * we switch between random and deterministic routing. Default
+ * value of 4.0 is used if NSE module is not available (i.e. not
+ * configured).
+ */
+static double log_of_network_size_estimate = 4.0;
+
+/**
+ * Network size estimation handle.
+ */
+static struct GNUNET_NSE_Handle *nse;
+
+
+/**
+ * Callback that is called when network size estimate is updated.
+ *
+ * @param cls closure
+ * @param timestamp time when the estimate was received from the server (or
created by the server)
+ * @param logestimate the log(Base 2) value of the current network size
estimate
+ * @param std_dev standard deviation for the estimate
+ *
+ */
+static void
+update_network_size_estimate (void *cls, struct GNUNET_TIME_Absolute timestamp,
+ double logestimate, double std_dev)
+{
+ GNUNET_STATISTICS_update (GDS_stats,
+ gettext_noop ("# Network size estimates received"),
+ 1, GNUNET_NO);
+ /* do not allow estimates < 0.5 */
+ log_of_network_size_estimate = GNUNET_MAX (0.5, logestimate);
+}
+
+
+/**
+ * Return the log of the current network size estimate.
+ *
+ * @return log of NSE
+ */
+double
+GDS_NSE_get ()
+{
+ return log_of_network_size_estimate;
+}
+
+
+/**
+ * Initialize NSE subsystem.
+ */
+void
+GDS_NSE_init ()
+{
+ unsigned long long hops;
+
+ if ( (GNUNET_YES ==
+ GNUNET_CONFIGURATION_have_value (GDS_cfg,
+ "dht",
+ "FORCE_NSE")) &&
+ (GNUNET_OK ==
+ GNUNET_CONFIGURATION_get_value_number (GDS_cfg,
+ "dht",
+ "FORCE_NSE",
+ &hops)) )
+ {
+ log_of_network_size_estimate = (double) hops;
+ return;
+ }
+ nse = GNUNET_NSE_connect (GDS_cfg, &update_network_size_estimate, NULL);
+}
+
+
+/**
+ * Shutdown NSE subsystem.
+ */
+void
+GDS_NSE_done ()
+{
+ if (NULL != nse)
+ {
+ GNUNET_NSE_disconnect (nse);
+ nse = NULL;
+ }
+}
+
+/* end of gnunet-service-dht_nse.c */
Added: gnunet/src/dht/gnunet-service-wdht_nse.h
===================================================================
--- gnunet/src/dht/gnunet-service-wdht_nse.h (rev 0)
+++ gnunet/src/dht/gnunet-service-wdht_nse.h 2015-04-27 11:12:21 UTC (rev
35559)
@@ -0,0 +1,52 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2011 Christian Grothoff (and other contributing authors)
+
+ GNUnet is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 3, or (at your
+ option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNUnet; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+/**
+ * @file dht/gnunet-service-xdht_nse.h
+ * @brief GNUnet DHT integration with NSE
+ * @author Christian Grothoff
+ */
+#ifndef GNUNET_SERVICE_XDHT_NSE_H
+#define GNUNET_SERVICE_XDHT_NSE_H
+
+
+/**
+ * Return the log of the current network size estimate.
+ *
+ * @return log of NSE
+ */
+double
+GDS_NSE_get (void);
+
+
+/**
+ * Initialize NSE subsystem.
+ */
+void
+GDS_NSE_init (void);
+
+
+/**
+ * Shutdown NSE subsystem.
+ */
+void
+GDS_NSE_done (void);
+
+#endif
Added: gnunet/src/dht/gnunet-service-wdht_routing.c
===================================================================
--- gnunet/src/dht/gnunet-service-wdht_routing.c
(rev 0)
+++ gnunet/src/dht/gnunet-service-wdht_routing.c 2015-04-27 11:12:21 UTC
(rev 35559)
@@ -0,0 +1,363 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2011 - 2014 Christian Grothoff (and other contributing
authors)
+
+ GNUnet is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 3, or (at your
+ option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNUnet; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+/**
+ * @file dht/gnunet-service-xdht_routing.c
+ * @brief GNUnet DHT tracking of requests for routing replies
+ * @author Supriti Singh
+ */
+#include "platform.h"
+#include "gnunet-service-wdht_neighbours.h"
+#include "gnunet-service-wdht_routing.h"
+#include "gnunet-service-wdht.h"
+
+
+/**
+ * FIXME: Check if its better to store pointer to friend rather than storing
+ * peer identity next_hop or prev_hop.
+ * keep entries in destnation and source peer also. so when we send the trail
+ * teardown message then we don't know the source but if source gets the
message
+ * then it shold remove that trail id from its finger table. But how does
+ * source know what is the desination finger ? It will whenevr contact a trail
+ * will do a lookup in routing table and if no trail id present the remove
+ * that trail of the finger and if only one trail then remove the finger.
+ * because of this use case of trail teardown I think trail compression
+ * and trail teardown should not be merged.
+ * 2. store a pointer to friendInfo in place o peer identity.
+ */
+/**
+ * Maximum number of entries in routing table.
+ */
+#define ROUTING_TABLE_THRESHOLD 80000
+
+/**
+ * FIXME: Store friend pointer instead of peer identifier.
+ * Routing table entry .
+ */
+struct RoutingTrail
+{
+ /**
+ * Global Unique identifier of the trail.
+ */
+ struct GNUNET_HashCode trail_id;
+
+ /**
+ * The peer to which this request should be passed to.
+ */
+ struct GNUNET_PeerIdentity next_hop;
+
+ /**
+ * Peer just before next hop in the trail.
+ */
+ struct GNUNET_PeerIdentity prev_hop;
+};
+
+/**
+ * Routing table of the peer
+ */
+static struct GNUNET_CONTAINER_MultiHashMap *routing_table;
+
+/**
+ * Update the prev. hop of the trail. Call made by trail compression where
+ * if you are the first friend now in the trail then you need to update
+ * your prev. hop.
+ * @param trail_id
+ * @return #GNUNET_OK success
+ * #GNUNET_SYSERR in case no matching entry found in routing table.
+ */
+int
+GDS_ROUTING_update_trail_prev_hop (const struct GNUNET_HashCode trail_id,
+ struct GNUNET_PeerIdentity prev_hop)
+{
+ struct RoutingTrail *trail;
+
+ trail = GNUNET_CONTAINER_multihashmap_get (routing_table, &trail_id);
+
+ if (NULL == trail)
+ return GNUNET_SYSERR;
+
+ trail->prev_hop = prev_hop;
+ return GNUNET_OK;
+}
+
+/**
+ * Update the next hop of the trail. Call made by trail compression where
+ * if you are source of the trail and now you have a new first friend, then
+ * you should update the trail.
+ * @param trail_id
+ * @return #GNUNET_OK success
+ * #GNUNET_SYSERR in case no matching entry found in routing table.
+ */
+int
+GDS_ROUTING_update_trail_next_hop (const struct GNUNET_HashCode trail_id,
+ struct GNUNET_PeerIdentity next_hop)
+{
+ struct RoutingTrail *trail;
+
+ trail = GNUNET_CONTAINER_multihashmap_get (routing_table, &trail_id);
+
+ if (NULL == trail)
+
+ return GNUNET_SYSERR;
+
+ trail->next_hop = next_hop;
+ return GNUNET_OK;
+}
+
+/**
+ * Get the next hop for trail corresponding to trail_id
+ * @param trail_id Trail id to be searched.
+ * @return Next_hop if found
+ * NULL If next hop not found.
+ */
+struct GNUNET_PeerIdentity *
+GDS_ROUTING_get_next_hop (const struct GNUNET_HashCode trail_id,
+ enum GDS_ROUTING_trail_direction trail_direction)
+{
+ struct RoutingTrail *trail;
+
+ trail = GNUNET_CONTAINER_multihashmap_get (routing_table, &trail_id);
+ if (NULL == trail)
+ {
+ /* If a friend got disconnected and we removed all the entry from the
+ routing table, then trail will be deleted and my identity will not know
+ and when it tries to reach to that finger it fails. thats why
+ assertion always fails in*/
+ return NULL;
+ }
+ switch (trail_direction)
+ {
+ case GDS_ROUTING_SRC_TO_DEST:
+ return &(trail->next_hop);
+ case GDS_ROUTING_DEST_TO_SRC:
+ return &(trail->prev_hop);
+ }
+ return NULL;
+}
+
+
+/**
+ * Remove trail with trail_id
+ * @param trail_id Trail id to be removed
+ * @return #GNUNET_YES success
+ * #GNUNET_NO if entry not found.
+ */
+int
+GDS_ROUTING_remove_trail (const struct GNUNET_HashCode remove_trail_id)
+{
+ struct RoutingTrail *remove_entry;
+
+ remove_entry = GNUNET_CONTAINER_multihashmap_get (routing_table,
&remove_trail_id);
+ if (NULL == remove_entry)
+ return GNUNET_NO;
+
+ if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_remove (routing_table,
+ &remove_trail_id,
+ remove_entry))
+ {
+ GNUNET_free (remove_entry);
+ return GNUNET_YES;
+ }
+
+ return GNUNET_NO;
+}
+
+
+/**
+ * Iterate over routing table and remove entries with value as part of any
trail.
+ *
+ * @param cls closure
+ * @param key current public key
+ * @param value value in the hash map
+ * @return #GNUNET_YES if we should continue to iterate,
+ * #GNUNET_NO if not.
+ */
+static int remove_matching_trails (void *cls,
+ const struct GNUNET_HashCode *key,
+ void *value)
+{
+ struct RoutingTrail *remove_trail = value;
+ struct GNUNET_PeerIdentity *disconnected_peer = cls;
+ struct GNUNET_HashCode trail_id = *key;
+ struct GNUNET_PeerIdentity my_identity;
+
+ /* If disconnected_peer is next_hop, then send a trail teardown message
through
+ * prev_hop in direction from destination to source. */
+ if (0 == GNUNET_CRYPTO_cmp_peer_identity (&remove_trail->next_hop,
+ disconnected_peer))
+ {
+ my_identity = GDS_NEIGHBOURS_get_my_id ();
+ if (0 != GNUNET_CRYPTO_cmp_peer_identity (&my_identity,
+ &remove_trail->prev_hop))
+ {
+ GDS_NEIGHBOURS_send_trail_teardown (&trail_id,
+ GDS_ROUTING_DEST_TO_SRC,
+ &remove_trail->prev_hop);
+ }
+ }
+
+ /* If disconnected_peer is prev_hop, then send a trail teardown through
+ * next_hop in direction from Source to Destination. */
+ if (0 == GNUNET_CRYPTO_cmp_peer_identity (&remove_trail->prev_hop,
+ disconnected_peer))
+ {
+ my_identity = GDS_NEIGHBOURS_get_my_id ();
+
+ if (0 != GNUNET_CRYPTO_cmp_peer_identity (&my_identity,
+ &remove_trail->next_hop))
+ {
+ GDS_NEIGHBOURS_send_trail_teardown (&trail_id,
+ GDS_ROUTING_SRC_TO_DEST,
+ &remove_trail->next_hop);
+ }
+ }
+
+ GNUNET_assert (GNUNET_YES ==
+ GNUNET_CONTAINER_multihashmap_remove (routing_table,
+ &trail_id,
+ remove_trail));
+ GNUNET_free (remove_trail);
+ return GNUNET_YES;
+}
+
+#if 0
+/**
+ * TEST FUNCTION
+ * Remove after using.
+ */
+void
+GDS_ROUTING_test_print (void)
+{
+ struct GNUNET_CONTAINER_MultiHashMapIterator *iter;
+ struct RoutingTrail *trail;
+ struct GNUNET_PeerIdentity print_peer;
+ struct GNUNET_HashCode key_ret;
+ int i;
+
+ struct GNUNET_PeerIdentity my_identity = GDS_NEIGHBOURS_get_my_id();
+ print_peer = my_identity;
+ FPRINTF (stderr,_("\nSUPU ***PRINTING ROUTING TABLE ***** of
=%s"),GNUNET_i2s(&print_peer));
+ iter =GNUNET_CONTAINER_multihashmap_iterator_create (routing_table);
+ for (i = 0; i < GNUNET_CONTAINER_multihashmap_size(routing_table); i++)
+ {
+ if(GNUNET_YES == GNUNET_CONTAINER_multihashmap_iterator_next (iter,
+ &key_ret,
+ (const void
**)&trail))
+ {
+ FPRINTF (stderr,_("\nSUPU %s, %s, %d, trail->trail_id = %s"),
+ __FILE__, __func__,__LINE__, GNUNET_h2s(&trail->trail_id));
+ memcpy (&print_peer, &trail->next_hop, sizeof (struct
GNUNET_PeerIdentity));
+ FPRINTF (stderr,_("\nSUPU %s, %s, %d, trail->next_hop = %s"),
+ __FILE__, __func__,__LINE__, GNUNET_i2s(&print_peer));
+ memcpy (&print_peer, &trail->prev_hop, sizeof (struct
GNUNET_PeerIdentity));
+ FPRINTF (stderr,_("\nSUPU %s, %s, %d, trail->prev_hop = %s"),
+ __FILE__, __func__,__LINE__, GNUNET_i2s(&print_peer));
+ }
+ }
+}
+#endif
+
+/**
+ * Remove every trail where peer is either next_hop or prev_hop. Also send a
+ * trail teardown message in direction of hop which is not disconnected.
+ * @param peer Peer identity. Trail containing this peer should be removed.
+ */
+int
+GDS_ROUTING_remove_trail_by_peer (const struct GNUNET_PeerIdentity *peer)
+{
+ int ret;
+
+
+ /* No entries in my routing table. */
+ if (0 == GNUNET_CONTAINER_multihashmap_size(routing_table))
+ return GNUNET_YES;
+
+ ret = GNUNET_CONTAINER_multihashmap_iterate (routing_table,
+ &remove_matching_trails,
+ (void *)peer);
+ return ret;
+}
+
+
+/**
+ * Add a new entry in routing table
+ * @param new_trail_id
+ * @param prev_hop
+ * @param next_hop
+ * @return #GNUNET_OK success
+ * #GNUNET_SYSERR in case new_trail_id already exists in the network
+ * but with different prev_hop/next_hop
+ */
+int
+GDS_ROUTING_add (struct GNUNET_HashCode new_trail_id,
+ struct GNUNET_PeerIdentity prev_hop,
+ struct GNUNET_PeerIdentity next_hop)
+{
+ struct RoutingTrail *new_entry;
+
+ new_entry = GNUNET_new (struct RoutingTrail);
+ new_entry->trail_id = new_trail_id;
+ new_entry->next_hop = next_hop;
+ new_entry->prev_hop = prev_hop;
+
+
+ return GNUNET_CONTAINER_multihashmap_put (routing_table,
+ &new_trail_id, new_entry,
+
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY);
+
+}
+
+
+/**
+ * Check if the size of routing table has crossed ROUTING_TABLE_THRESHOLD.
+ * It means that I don't have any more space in my routing table and I can not
+ * be part of any more trails till there is free space in my routing table.
+ * @return #GNUNET_YES, if threshold crossed else #GNUNET_NO.
+ */
+int
+GDS_ROUTING_threshold_reached (void)
+{
+ return (GNUNET_CONTAINER_multihashmap_size(routing_table) >
+ ROUTING_TABLE_THRESHOLD) ? GNUNET_YES:GNUNET_NO;
+}
+
+
+/**
+ * Initialize routing subsystem.
+ */
+void
+GDS_ROUTING_init (void)
+{
+ routing_table = GNUNET_CONTAINER_multihashmap_create
(ROUTING_TABLE_THRESHOLD * 4 / 3,
+ GNUNET_NO);
+}
+
+
+/**
+ * Shutdown routing subsystem.
+ */
+void
+GDS_ROUTING_done (void)
+{
+ GNUNET_assert (0 == GNUNET_CONTAINER_multihashmap_size (routing_table));
+ GNUNET_CONTAINER_multihashmap_destroy (routing_table);
+}
+
+/* end of gnunet-service-xdht_routing.c */
Added: gnunet/src/dht/gnunet-service-wdht_routing.h
===================================================================
--- gnunet/src/dht/gnunet-service-wdht_routing.h
(rev 0)
+++ gnunet/src/dht/gnunet-service-wdht_routing.h 2015-04-27 11:12:21 UTC
(rev 35559)
@@ -0,0 +1,138 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2011 - 2014 Christian Grothoff (and other contributing
authors)
+
+ GNUnet is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 3, or (at your
+ option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNUnet; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+/**
+ * @file dht/gnunet-service-xdht_routing.h
+ * @brief GNUnet DHT tracking of requests for routing replies
+ * @author Christian Grothoff
+ */
+#ifndef GNUNET_SERVICE_XDHT_ROUTING_H
+#define GNUNET_SERVICE_XDHT_ROUTING_H
+
+#include "gnunet_util_lib.h"
+#include "gnunet_block_lib.h"
+#include "gnunet_dht_service.h"
+
+/**
+ * To understand the direction in which trial should be read.
+ */
+enum GDS_ROUTING_trail_direction
+{
+ GDS_ROUTING_SRC_TO_DEST,
+ GDS_ROUTING_DEST_TO_SRC
+};
+
+
+/**
+ * Update the prev. hop of the trail. Call made by trail teardown where
+ * if you are the first friend now in the trail then you need to update
+ * your prev. hop.
+ * @param trail_id
+ * @return #GNUNET_OK success
+ * #GNUNET_SYSERR in case no matching entry found in routing table.
+ */
+int
+GDS_ROUTING_update_trail_prev_hop (struct GNUNET_HashCode trail_id,
+ struct GNUNET_PeerIdentity prev_hop);
+
+
+/**
+ * Update the next hop of the trail. Call made by trail compression where
+ * if you are source of the trail and now you have a new first friend, then
+ * you should update the trail.
+ * @param trail_id
+ * @return #GNUNET_OK success
+ * #GNUNET_SYSERR in case no matching entry found in routing table.
+ */
+int
+GDS_ROUTING_update_trail_next_hop (const struct GNUNET_HashCode trail_id,
+ struct GNUNET_PeerIdentity next_hop);
+
+/**
+ * Get the next hop for trail corresponding to trail_id
+ * @param trail_id Trail id to be searched.
+ * @return Next_hop if found
+ * NULL If next hop not found.
+ */
+struct GNUNET_PeerIdentity *
+GDS_ROUTING_get_next_hop (struct GNUNET_HashCode trail_id,
+ enum GDS_ROUTING_trail_direction trail_direction);
+
+
+/**
+ * Remove every trail where peer is either next_hop or prev_hop
+ * @param peer Peer to be searched.
+ */
+int
+GDS_ROUTING_remove_trail_by_peer (const struct GNUNET_PeerIdentity *peer);
+/**
+ * Remove trail with trail_id
+ * @param trail_id Trail id to be removed
+ * @return #GNUNET_YES success
+ * #GNUNET_NO if entry not found.
+ */
+int
+GDS_ROUTING_remove_trail (struct GNUNET_HashCode remove_trail_id);
+
+
+/**
+ * Add a new entry in routing table
+ * @param new_trail_id
+ * @param prev_hop
+ * @param next_hop
+ * @return #GNUNET_OK success
+ * #GNUNET_SYSERR in case new_trail_id already exists in the network
+ * but with different prev_hop/next_hop
+ */
+int
+GDS_ROUTING_add (struct GNUNET_HashCode new_trail_id,
+ struct GNUNET_PeerIdentity prev_hop,
+ struct GNUNET_PeerIdentity next_hop);
+
+
+/**
+ * Check if the size of routing table has crossed threshold.
+ * @return #GNUNET_YES, if threshold crossed
+ * #GNUNET_NO, if size is within threshold
+ */
+int
+GDS_ROUTING_threshold_reached (void);
+
+#if 0
+/**
+ * Test function. Remove afterwards.
+ */
+void
+GDS_ROUTING_test_print (void);
+#endif
+
+/**
+ * Initialize routing subsystem.
+ */
+void
+GDS_ROUTING_init (void);
+
+/**
+ * Shutdown routing subsystem.
+ */
+void
+GDS_ROUTING_done (void);
+
+#endif
\ No newline at end of file
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r35559 - in gnunet: po src/dht,
gnunet <=