From 0bff5a1b397f3f2c4f18a92b0828b2d6ab9bf74f Mon Sep 17 00:00:00 2001 From: Arthur Dewarumez Date: Mon, 27 Apr 2015 11:12:21 +0000 Subject: Adding files for whanau. --- po/POTFILES.in | 95 +- po/de.po | 402 +- po/es.po | 405 +- po/fr.po | 4838 +++++++++++++---------- po/sv.po | 401 +- po/vi.po | 401 +- po/zh_CN.po | 394 +- src/dht/Makefile.am | 24 +- src/dht/gnunet-service-wdht.c | 220 ++ src/dht/gnunet-service-wdht.h | 60 + src/dht/gnunet-service-wdht_clients.c | 1449 +++++++ src/dht/gnunet-service-wdht_clients.h | 149 + src/dht/gnunet-service-wdht_datacache.c | 381 ++ src/dht/gnunet-service-wdht_datacache.h | 90 + src/dht/gnunet-service-wdht_hello.c | 137 + src/dht/gnunet-service-wdht_hello.h | 55 + src/dht/gnunet-service-wdht_neighbours.c | 6290 ++++++++++++++++++++++++++++++ src/dht/gnunet-service-wdht_neighbours.h | 146 + src/dht/gnunet-service-wdht_nse.c | 116 + src/dht/gnunet-service-wdht_nse.h | 52 + src/dht/gnunet-service-wdht_routing.c | 363 ++ src/dht/gnunet-service-wdht_routing.h | 138 + 22 files changed, 13655 insertions(+), 2951 deletions(-) create mode 100644 src/dht/gnunet-service-wdht.c create mode 100644 src/dht/gnunet-service-wdht.h create mode 100644 src/dht/gnunet-service-wdht_clients.c create mode 100644 src/dht/gnunet-service-wdht_clients.h create mode 100644 src/dht/gnunet-service-wdht_datacache.c create mode 100644 src/dht/gnunet-service-wdht_datacache.h create mode 100644 src/dht/gnunet-service-wdht_hello.c create mode 100644 src/dht/gnunet-service-wdht_hello.h create mode 100644 src/dht/gnunet-service-wdht_neighbours.c create mode 100644 src/dht/gnunet-service-wdht_neighbours.h create mode 100644 src/dht/gnunet-service-wdht_nse.c create mode 100644 src/dht/gnunet-service-wdht_nse.h create mode 100644 src/dht/gnunet-service-wdht_routing.c create mode 100644 src/dht/gnunet-service-wdht_routing.h diff --git a/po/POTFILES.in b/po/POTFILES.in index a5d340942..a36c57f33 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -3,21 +3,13 @@ src/arm/arm_monitor_api.c 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.c src/ats/gnunet-service-ats_addresses.c +src/ats/gnunet-service-ats.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/gnunet-service-ats_scheduling.c 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_common.c src/cadet/cadet_path.c src/cadet/cadet_test_lib.c src/cadet/cadet_tunnel_tree.c -src/cadet/gnunet-cadet-profiler.c src/cadet/gnunet-cadet.c +src/cadet/gnunet-cadet-profiler.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-consensus-profiler.c src/consensus/gnunet-service-consensus.c src/conversation/conversation_api.c src/conversation/conversation_api_call.c -src/conversation/gnunet-conversation-test.c src/conversation/gnunet-conversation.c -src/conversation/gnunet-helper-audio-playback-gst.c +src/conversation/gnunet-conversation-test.c src/conversation/gnunet-helper-audio-playback.c -src/conversation/gnunet-helper-audio-record-gst.c +src/conversation/gnunet-helper-audio-playback-gst.c src/conversation/gnunet-helper-audio-record.c +src/conversation/gnunet-helper-audio-record-gst.c src/conversation/gnunet-service-conversation.c src/conversation/microphone.c src/conversation/plugin_gnsrecord_conversation.c @@ -89,6 +89,7 @@ src/dht/dht_api.c 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_hello.c 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/gnunet-service-dv.c src/dv/plugin_transport_dv.c src/env/env.c src/exit/gnunet-daemon-exit.c -src/exit/gnunet-helper-exit-windows.c src/exit/gnunet-helper-exit.c +src/exit/gnunet-helper-exit-windows.c src/fragmentation/defragmentation.c src/fragmentation/fragmentation.c src/fs/fs_api.c @@ -146,8 +146,8 @@ src/fs/gnunet-auto-share.c src/fs/gnunet-daemon-fsprofiler.c src/fs/gnunet-directory.c src/fs/gnunet-download.c -src/fs/gnunet-fs-profiler.c src/fs/gnunet-fs.c +src/fs/gnunet-fs-profiler.c src/fs/gnunet-helper-fs-publish.c src/fs/gnunet-publish.c src/fs/gnunet-search.c @@ -166,10 +166,10 @@ src/fs/plugin_block_fs.c 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/nss/nss_gns_query.c 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/gnunet-service-namecache.c src/namecache/namecache_api.c src/namecache/plugin_namecache_postgres.c src/namecache/plugin_namecache_sqlite.c -src/namestore/gnunet-namestore-fcfsd.c src/namestore/gnunet-namestore.c +src/namestore/gnunet-namestore-fcfsd.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/nat/gnunet-helper-nat-client-windows.c +src/namestore/plugin_rest_namestore.c src/nat/gnunet-helper-nat-client.c -src/nat/gnunet-helper-nat-server-windows.c +src/nat/gnunet-helper-nat-client-windows.c src/nat/gnunet-helper-nat-server.c +src/nat/gnunet-helper-nat-server-windows.c src/nat/gnunet-nat-server.c -src/nat/nat.c src/nat/nat_auto.c +src/nat/nat.c src/nat/nat_mini.c src/nat/nat_test.c -src/nse/gnunet-nse-profiler.c src/nse/gnunet-nse.c +src/nse/gnunet-nse-profiler.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-secretsharing-profiler.c src/secretsharing/gnunet-service-secretsharing.c src/secretsharing/secretsharing_api.c src/secretsharing/secretsharing_common.c -src/sensor/gnunet-sensor-profiler.c +src/sensordashboard/gnunet-sensordashboard.c +src/sensordashboard/gnunet-service-sensordashboard.c src/sensor/gnunet-sensor.c -src/sensor/gnunet-service-sensor.c +src/sensor/gnunet-sensor-profiler.c src/sensor/gnunet-service-sensor_analysis.c +src/sensor/gnunet-service-sensor.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/plugin_sensor_model_gaussian.c 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-latency-logger.c 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.c src/testbed/gnunet-service-testbed_barriers.c +src/testbed/gnunet-service-testbed.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-profiler.c -src/testbed/gnunet_mpi_test.c src/testbed/gnunet_testbed_mpi_spawn.c -src/testbed/testbed_api.c +src/testbed/gnunet-testbed-profiler.c src/testbed/testbed_api_barriers.c +src/testbed/testbed_api.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_test.c src/testbed/testbed_api_testbed.c +src/testbed/testbed_api_test.c src/testbed/testbed_api_topology.c src/testbed/testbed_api_underlay.c src/testbed/testbed_logger_api.c @@ -342,39 +343,39 @@ src/testing/testing.c src/topology/friends.c src/topology/gnunet-daemon-topology.c src/transport/gnunet-helper-transport-bluetooth.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-helper-transport-wlan-dummy.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.c src/transport/plugin_transport_udp_broadcasting.c +src/transport/plugin_transport_udp.c src/transport/plugin_transport_unix.c src/transport/plugin_transport_wlan.c -src/transport/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/connection.c src/util/container_bloomfilter.c src/util/container_heap.c src/util/container_meta_data.c -src/util/container_multihashmap.c src/util/container_multihashmap32.c +src/util/container_multihashmap.c src/util/container_multipeermap.c src/util/crypto_crc.c src/util/crypto_ecc.c @@ -405,8 +406,8 @@ src/util/crypto_symmetric.c src/util/disk.c src/util/getopt.c src/util/getopt_helpers.c -src/util/gnunet-config-diff.c src/util/gnunet-config.c +src/util/gnunet-config-diff.c src/util/gnunet-ecc.c src/util/gnunet-helper-w32-console.c src/util/gnunet-resolver.c @@ -437,8 +438,8 @@ src/util/time.c src/util/w32cat.c src/util/win.c src/util/winproc.c -src/vpn/gnunet-helper-vpn-windows.c src/vpn/gnunet-helper-vpn.c +src/vpn/gnunet-helper-vpn-windows.c src/vpn/gnunet-service-vpn.c src/vpn/gnunet-vpn.c src/vpn/vpn_api.c diff --git a/po/de.po b/po/de.po index 3fd2ac2b4..a756e1ab9 100644 --- a/po/de.po +++ b/po/de.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: gnunet 0.10.1\n" "Report-Msgid-Bugs-To: gnunet-developers@mail.gnu.org\n" -"POT-Creation-Date: 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 \n" "Language-Team: German \n" @@ -496,16 +496,16 @@ msgstr "" 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 @@ msgid "Quota for network `%11s' (in/out): %10s / %10s\n" 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 @@ msgstr "# Bytes entschlüsselt" 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 @@ msgstr "Ungültige `%s' Nachricht von Knoten `%s' empfangen.\n" 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 @@ msgid "# updates to my type map" 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 @@ msgid "# items stored" 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 @@ msgstr "" #: 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 @@ msgstr "" #: 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 @@ msgstr "" 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 -msgid "Rebuilding bloomfilter. Please be patient.\n" +#: 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:1419 -msgid "Plugin does not support get_keys function. Please fix!\n" +#: src/datastore/gnunet-service-datastore.c:1450 +msgid "Rebuilding bloomfilter. Please be patient.\n" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1422 -msgid "Bloomfilter construction complete.\n" +#: 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: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 @@ msgstr "`%s' schlug bei %s:%d mit dem Fehler %s fehl\n" 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 @@ msgstr "" 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 @@ msgstr "Muss eine Zahl sein" 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 @@ msgstr "Datei wurde als `%s' gespeichert.\n" 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 @@ msgstr "# Sitzungsschlüssel abgelehnt" 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 @@ msgstr "" 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 @@ msgid "Ego for `%s' not found, cannot perform lookup.\n" 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 @@ msgstr "SQLite Datenbank konnte nicht initialisiert werden: %s.\n" 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 @@ msgstr "" 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 @@ msgstr "Fehler beim Speichern der Konfigurationsdatei `%s':" msgid "Unable to parse BOX record string `%s'\n" msgstr "Fehler beim Speichern der Konfigurationsdatei `%s':" +#: src/gns/plugin_rest_gns.c: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 @@ msgstr "Fehler beim Speichern der Konfigurationsdatei `%s':" msgid "Failed to create directory `%s' for storing egos\n" msgstr "Dateiformat fehlerhaft (kein GNUnet Verzeichnis?)\n" +#: src/identity/plugin_rest_identity.c: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 @@ msgstr "" 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 @@ msgid "Adding record failed: %s\n" 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 @@ 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 "" @@ -5130,6 +5163,7 @@ msgstr "" #: 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 @@ msgid "add" 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 @@ msgstr "Ungültiger Parameter: `%s'\n" 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 @@ msgid "Invalid nick `%s'\n" 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 @@ msgstr "" 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 @@ msgid "Measure quality and performance of the NSE service." 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 @@ msgstr "" 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 @@ msgid "# revocation set unions completed" 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 @@ msgid "Found %u addresses to report to NAT service\n" 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgid "" "%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 @@ msgid "libgcrypt has not the expected version (version %s is required).\n" 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 @@ msgstr "%s: Option »-W %s« erlaubt kein Argument\n" 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 @@ msgstr "" "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 @@ msgstr "" 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" @@ -9451,10 +9511,6 @@ msgstr "`%s' schlug bei Datei `%s' fehl. Ort: %s:%d. Fehler: %s\n" #~ "Invalid message received from client, session information incorrect!\n" #~ 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" diff --git a/po/es.po b/po/es.po index 1580615c4..207147b5f 100644 --- a/po/es.po +++ b/po/es.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: gnunet 0.9.5a\n" "Report-Msgid-Bugs-To: gnunet-developers@mail.gnu.org\n" -"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 \n" "Language-Team: Spanish \n" @@ -535,16 +535,16 @@ msgstr "" 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 @@ msgid "Quota for network `%11s' (in/out): %10s / %10s\n" 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 @@ msgstr "# bytes de «payload» descifrados" 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 @@ msgstr "Mensaje no soportado del tipo %u (%u bytes) recibido del par «%s»\n" 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 @@ msgid "# updates to my type map" 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 @@ msgid "# items stored" 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 @@ msgstr "Caché de datos Postgres ejecutándose\n" #: 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 @@ msgstr "Espacio insuficiente para satisfacer la petición" #: 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 @@ msgstr "# reservado" 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 @@ msgstr "" "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 @@ msgstr "«%s» falló en %s:%u con el error: %s" 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 @@ msgstr "" "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 @@ msgstr "establece registros de clase AAAA" 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 @@ msgstr "" 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 @@ msgid "Got result with unknown block type `%d', ignoring" 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 @@ msgstr "# conexiones de clientes «stream» rechazadas" 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 @@ msgstr "" 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 @@ msgid "Ego for `%s' not found, cannot perform lookup.\n" 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 @@ msgstr "No se pudo importar el certificado %s\n" 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 @@ msgstr "" 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 @@ msgstr "No se pudo procesar la cadena de registro VPN «%s»\n" msgid "Unable to parse BOX record string `%s'\n" msgstr "No se pudo procesar la cadena de registro VPN «%s»\n" +#: src/gns/plugin_rest_gns.c: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 @@ msgstr "Se produjo un fallo al borrar el fichero de configuración %s\n" msgid "Failed to create directory `%s' for storing egos\n" msgstr "Se produjo un fallo al leer el directorio «%s»\n" +#: src/identity/plugin_rest_identity.c: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 @@ msgstr "\tRegistro corrupto o no soportado del tipo %u\n" 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 @@ msgid "Adding record failed: %s\n" 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 @@ 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 "" @@ -5284,6 +5318,7 @@ msgstr "No se han proporcionado opciones\n" #: 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 @@ msgid "add" 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 @@ msgstr "Formato de tiempo no válido «%s»\n" 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 @@ msgid "Invalid nick `%s'\n" 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 @@ msgstr "Se produjo un fallo al crear el espacio de nombres «%s»\n" 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 @@ msgid "Measure quality and performance of the NSE service." 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 @@ msgstr "Analizador de rendimiento para la biblioteca de expresiones regulares" 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 @@ msgid "# revocation set unions completed" 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 @@ msgid "Found %u addresses to report to NAT service\n" 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 @@ msgstr "" "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 @@ msgstr "" "UDP no pudo transmitir el mensaje a «%s»: La red parece caída, por favor, " "compruebe su configuración de red\n" -#: src/transport/plugin_transport_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 @@ msgstr "" "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 @@ msgstr "" 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 @@ msgstr "" "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 @@ msgstr "" "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 @@ msgstr "" "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 @@ msgstr "La verificación de la firma RSA fallo en %s:%d: %s\n" 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 @@ msgstr "%s: la opción «-W %s» no permite un parámetro\n" 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 @@ msgstr "" "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 @@ msgstr "«%s» falló para el puerto %d (%s).\n" 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 @@ msgstr "Violación externa del protocolo detectada en %s:%d.\n" msgid "`%s' failed on file `%s' at %s:%d with error: %s\n" msgstr "«%s» falló en el fichero «%s» en %s:%d con el error: %s\n" +#~ 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" @@ -9934,10 +9999,6 @@ msgstr "«%s» falló en el fichero «%s» en %s:%d con el error: %s\n" #~ msgid "New incoming channel from peer %s.\n" #~ 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" diff --git a/po/fr.po b/po/fr.po index 5c5ede8d6..5b2e3dd1a 100644 --- a/po/fr.po +++ b/po/fr.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: gnunet 0.10.1\n" "Report-Msgid-Bugs-To: gnunet-developers@mail.gnu.org\n" -"POT-Creation-Date: 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 \n" "Language-Team: French \n" @@ -21,7 +21,8 @@ msgid "Client was disconnected from arm service, trying to reconnect.\n" 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 @@ msgstr "" 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" -msgstr "" - -#: src/arm/gnunet-service-arm.c:1511 -#, c-format -msgid "Default service `%s' not configured correctly!\n" -msgstr "" - -#: src/arm/gnunet-service-arm.c:1524 -msgid "No default services configured, GNUnet will not really start right now.\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:2778 src/ats/gnunet-ats-solver-eval.c:2819 #, c-format -msgid "Received %s message\n" +msgid "" +"Could not load quota for network `%s': `%s', assigning default bandwidth " +"%llu\n" msgstr "" -#: src/ats/ats_api_performance.c:511 +#: src/ats/gnunet-ats-solver-eval.c:2796 #, c-format -msgid "Received last message for %s \n" +msgid "" +"No outbound quota configured for network `%s', assigning default bandwidth " +"%llu\n" 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 +#: src/ats/gnunet-ats-solver-eval.c:2837 #, c-format -msgid "Could not load quota for network `%s': `%s', assigning default bandwidth %llu\n" +msgid "" +"No outbound quota configure for network `%s', assigning default bandwidth " +"%llu\n" 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" -msgstr "" +#: 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: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: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:2239 -#: src/ats/gnunet-service-ats_addresses.c:2031 -#, c-format -msgid "Inbound quota configured for network `%s' is %llu\n" +#: src/ats/gnunet-ats-solver-eval.c:3296 +msgid "be verbose" msgstr "" -#: src/ats/gnunet-ats-solver-eval.c:2246 -#: src/ats/gnunet-service-ats_addresses.c:2039 -#, c-format -msgid "No outbound quota configure for network `%s', assigning default bandwidth %llu\n" -msgstr "" +#: src/ats/gnunet-ats-solver-eval.c:3299 +msgid "print logging" +msgstr "afficher le journal" -#: 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:3302 +msgid "save logging to disk" +msgstr "" -#: 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" +#: src/ats/gnunet-ats-solver-eval.c:3305 +msgid "disable normalization" msgstr "" -#: src/ats/gnunet-ats-solver-eval.c:2680 -msgid "print logging" -msgstr "afficher le journal" +#: src/ats/gnunet-service-ats_plugins.c:304 +#, c-format +msgid "" +"Could not load %s quota for network `%s': `%s', assigning default bandwidth " +"%llu\n" +msgstr "" -#: src/ats/gnunet-service-ats_addresses.c:2217 +#: src/ats/gnunet-service-ats_plugins.c:314 #, c-format -msgid "Initializing solver `%s '`%s'\n" +msgid "%s quota configured for network `%s' is %llu\n" msgstr "" -#: src/ats/gnunet-service-ats_addresses.c:2220 +#: src/ats/gnunet-service-ats_plugins.c:359 #, c-format -msgid "Failed to initialize solver `%s'!\n" +msgid "" +"No %s-quota configured for network `%s', assigning default bandwidth %llu\n" msgstr "" -#: src/ats/gnunet-service-ats_addresses.c:2243 -msgid "Failed to initialize solver!\n" +#: src/ats/gnunet-service-ats_plugins.c:451 +#, c-format +msgid "Failed to initialize solver `%s'!\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:2475 +msgid "" +"MLP solver is not optimizing for anything, changing to feasibility check\n" msgstr "" -#: src/ats/plugin_ats_mlp.c:2122 +#: 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 @@ msgstr "" 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 stat_results for %u addresses\n" +msgstr "" + +#: src/ats-tool/gnunet-ats.c:366 #, c-format -msgid "ATS returned results for %u addresses\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:373 +msgid "active " msgstr "" -#: src/ats-tool/gnunet-ats.c:232 +#: src/ats-tool/gnunet-ats.c:373 +msgid "inactive " +msgstr "" + +#: src/ats-tool/gnunet-ats.c:483 #, c-format -msgid "Peer `%s' plugin `%s', address `%s', `%s' bw out: %u Bytes/s, bw in %u Bytes/s, %s\n" +msgid "Removed address of peer `%s' with plugin `%s'\n" msgstr "" -#: src/ats-tool/gnunet-ats.c:413 +#: 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 @@ msgid "how many peers receive one value?" 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 @@ msgid "delay until consensus starts" 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 @@ msgstr "" #, 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 @@ msgstr "" 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 @@ msgstr "ogg_stream_init() échoué.\n" 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 @@ msgstr "" 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: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:211 src/peerinfo-tool/gnunet-peerinfo.c:694 +#: 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 @@ msgid "# items stored" 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 @@ msgstr "" 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 @@ msgstr "" #: 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 @@ msgstr "" 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 @@ msgid "Cannot use the same configuration for source and destination\n" 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 must have been inaccurate (%lld < %lld). Recomputing it.\n" +msgstr "" + +#: src/datastore/gnunet-service-datastore.c:1269 #, c-format -msgid "Datastore payload inaccurate (%lld < %lld). Trying to fix.\n" +msgid "New payload: %lld\n" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1281 +#: 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" -msgstr "" - -#: src/datastore/gnunet-service-datastore.c:1616 -msgid "Plugin does not support get_keys function. Please fix!\n" +#: src/datastore/plugin_datastore_heap.c:826 +msgid "Heap database running\n" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1619 -msgid "Bloomfilter construction complete.\n" +#: src/datastore/plugin_datastore_mysql.c:309 +#: src/datastore/plugin_datastore_sqlite.c:499 +msgid "Data too large" msgstr "" -#: src/datastore/plugin_datastore_heap.c:820 -msgid "Heap database running\n" +#: src/datastore/plugin_datastore_mysql.c:328 +msgid "MySQL statement run failure" 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 @@ msgstr "" #: 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 @@ msgid "use DHT's demultiplex everywhere option" 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr "" 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,115 +2232,200 @@ msgstr "" 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 "Block not of type %u\n" +msgid "" +"\n" +"SUPU************ FRIEND_PEERMAP of %s" msgstr "" -#: src/dht/plugin_block_dht.c:145 -msgid "Size mismatch for block\n" +#: 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/plugin_block_dht.c:155 +#: src/dht/gnunet-service-xdht_neighbours.c:1888 #, c-format -msgid "Block of type %u is malformed\n" +msgid "" +"\n" +"SUPU************ FINGER_TABLE of %s" msgstr "" -#: src/dns/dnsparser.c:257 +#: src/dht/gnunet-service-xdht_neighbours.c:1897 #, c-format -msgid "Failed to convert DNS IDNA name `%s' to UTF-8: %s\n" +msgid "" +"\n" +"SUPU %s, %s, %d, finger_table[%d] = %s, trails_count = %d" msgstr "" -#: src/dns/dnsparser.c:856 +#: src/dht/gnunet-service-xdht_neighbours.c:1904 #, c-format -msgid "Failed to convert UTF-8 name `%s' to DNS IDNA format: %s\n" +msgid "" +"\n" +"SUPU %s, %s, %d, trail_id[%d]=%s" msgstr "" -#: src/dns/dnsstub.c:175 +#: src/dht/gnunet-service-xdht_neighbours.c:1910 #, c-format -msgid "Could not bind to any port: %s\n" +msgid "" +"\n" +"SUPU %s, %s, %d,trail[%d] = %s " msgstr "" -#: src/dns/dnsstub.c:295 src/dns/dnsstub.c:383 -#, c-format -msgid "Failed to send DNS request to %s\n" +#: src/dht/gnunet-service-xdht_neighbours.c:3559 +msgid "# FINGERS_COUNT" msgstr "" -#: src/dns/dnsstub.c:299 +#: 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 "Sent DNS request to %s\n" +msgid "" +"\n" +"SUPU ***PRINTING ROUTING TABLE ***** of =%s" msgstr "" -#: src/dns/dnsstub.c:368 +#: src/dht/gnunet-service-xdht_routing.c:264 #, c-format -msgid "Configured DNS exit `%s' is not working / valid.\n" +msgid "" +"\n" +"SUPU %s, %s, %d, trail->trail_id = %s" msgstr "" -#: src/dns/dnsstub.c:440 +#: src/dht/gnunet-service-xdht_routing.c:267 #, c-format -msgid "Received DNS response that is too small (%u bytes)" +msgid "" +"\n" +"SUPU %s, %s, %d, trail->next_hop = %s" msgstr "" -#: src/dns/gnunet-dns-monitor.c:355 -msgid "only monitor DNS queries" +#: src/dht/gnunet-service-xdht_routing.c:270 +#, c-format +msgid "" +"\n" +"SUPU %s, %s, %d, trail->prev_hop = %s" msgstr "" -#: src/dns/gnunet-dns-monitor.c:358 -msgid "only monitor DNS replies" +#: src/dht/plugin_block_dht.c:142 +#, c-format +msgid "Block not of type %u\n" msgstr "" -#: src/dns/gnunet-dns-monitor.c:369 -msgid "Monitor DNS queries." +#: src/dht/plugin_block_dht.c:149 +msgid "Size mismatch for block\n" +msgstr "" + +#: src/dht/plugin_block_dht.c:159 +#, c-format +msgid "Block of type %u is malformed\n" +msgstr "" + +#: 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:818 +#, c-format +msgid "Failed to convert UTF-8 name `%s' to DNS IDNA format: %s\n" +msgstr "" + +#: src/dns/dnsstub.c:175 +#, c-format +msgid "Could not bind to any port: %s\n" +msgstr "" + +#: src/dns/dnsstub.c:295 src/dns/dnsstub.c:383 +#, c-format +msgid "Failed to send DNS request to %s\n" +msgstr "" + +#: src/dns/dnsstub.c:299 +#, c-format +msgid "Sent DNS request to %s\n" +msgstr "" + +#: src/dns/dnsstub.c:368 +#, c-format +msgid "Configured DNS exit `%s' is not working / valid.\n" +msgstr "" + +#: src/dns/dnsstub.c:440 +#, c-format +msgid "Received DNS response that is too small (%u bytes)" +msgstr "" + +#: src/dns/gnunet-dns-monitor.c:352 +msgid "only monitor DNS queries" +msgstr "" + +#: src/dns/gnunet-dns-monitor.c:355 +msgid "only monitor DNS replies" +msgstr "" + +#: src/dns/gnunet-dns-monitor.c:366 +msgid "Monitor DNS queries." msgstr "" #: src/dns/gnunet-dns-redirector.c:236 @@ -2143,50 +2440,50 @@ msgstr "" 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 @@ msgid "Got duplicate service records for `%s:%u'\n" 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 @@ msgid "# TCP packets sent via TUN" 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 @@ msgid "# TCP requests dropped (no such service)" 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 @@ msgid "# ICMP packets sent via TUN" 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 @@ msgid "# UDP packets sent via TUN" 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 @@ msgid "# UDP requests dropped (no such service)" 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 @@ msgid "MAGIC mismatch. This is not a GNUnet directory.\n" 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 @@ msgstr "" #: 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 @@ msgstr "" #: 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 @@ msgstr "" 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 @@ msgstr "" 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:417 +msgid "Malformed CHK URI (wrong syntax)" +msgstr "" + +#: src/fs/fs_uri.c:432 +msgid "Malformed CHK URI (failed to decode CHK)" +msgstr "" + +#: src/fs/fs_uri.c:511 +msgid "LOC URI malformed (wrong syntax)" msgstr "" -#: src/fs/fs_uri.c:419 src/fs/fs_uri.c:434 -msgid "Malformed CHK URI" +#: src/fs/fs_uri.c:526 +msgid "LOC URI malformed (no CHK)" msgstr "" -#: src/fs/fs_uri.c:512 src/fs/fs_uri.c:580 -msgid "SKS URI malformed" +#: src/fs/fs_uri.c:536 +msgid "LOC URI malformed (missing LOC)" msgstr "" -#: src/fs/fs_uri.c:527 src/fs/fs_uri.c:537 -msgid "LOC URI malformed" +#: src/fs/fs_uri.c:544 +msgid "LOC URI malformed (wrong syntax for public key)" msgstr "" -#: src/fs/fs_uri.c:545 src/fs/fs_uri.c:553 +#: 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:643 +msgid "Unrecognized URI type" msgstr "" -#: src/fs/fs_uri.c:1050 src/fs/fs_uri.c:1077 +#: 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 @@ msgstr "" #: 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgid "download a GNUnet directory recursively" 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr "" #: 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr "" 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,435 +4239,502 @@ msgstr "" 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: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:308 +#: 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 -msgid "Learning is enabled on this peer\n" +#: 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/hostlist-client.c:1483 -msgid "Learning is not enabled on this peer\n" +#: src/hostlist/gnunet-daemon-hostlist_client.c:1617 +msgid "Learning is enabled on this peer\n" msgstr "" -#: src/hostlist/hostlist-client.c:1495 -#, c-format -msgid "Since learning is not enabled on this peer, hostlist file `%s' was removed\n" +#: src/hostlist/gnunet-daemon-hostlist_client.c:1630 +msgid "Learning is not enabled on this peer\n" msgstr "" -#: src/hostlist/hostlist-client.c:1499 +#: src/hostlist/gnunet-daemon-hostlist_client.c:1641 #, c-format -msgid "Hostlist file `%s' could not be removed\n" +msgid "" +"Since learning is not enabled on this peer, hostlist file `%s' was 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 IPv4 address! Ignoring BINDTOIPV4.\n" +msgstr "" + +#: src/hostlist/gnunet-daemon-hostlist_server.c:853 #, c-format -msgid "`%s' is not a valid IP address! Ignoring BINDTOIP.\n" +msgid "`%s' is not a valid IPv6 address! Ignoring BINDTOIPV6.\n" msgstr "" -#: src/hostlist/hostlist-server.c:673 +#: 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 @@ msgid "display all egos" 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 @@ msgid "run in monitor mode egos" 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,51 +4826,8 @@ msgstr "" msgid "Failed to create directory `%s' for storing egos\n" msgstr "" -#: src/mesh/gnunet-mesh.c:357 -#, c-format -msgid "Invalid target `%s'\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" +#: src/identity/plugin_rest_identity.c:803 +msgid "Identity REST API initialized\n" msgstr "" #: src/mysql/mysql.c:174 @@ -4565,9 +4855,9 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgid "Adding record failed: %s\n" 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 @@ msgstr "" 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 @@ msgstr "" 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.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_mini.c:366 +#: 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.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_test.c:351 +#: 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgid "# DNS requests intercepted" 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 @@ msgid "%s service is lacking key configuration settings (%s). Exiting.\n" 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 @@ msgstr "" 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 @@ msgid "Public key `%s' malformed\n" 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 @@ msgid "use NAME for the name of the revocation file" 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 @@ msgstr "" 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:259 +msgid "Need elements to compute the scalarproduct, got none.\n" msgstr "" -#: src/scalarproduct/gnunet-scalarproduct.c:251 +#: src/scalarproduct/gnunet-scalarproduct.c:281 #, c-format -msgid "Tried to set initiator mode, as peer ID was given. However, `%s' is not a valid peer identifier.\n" +msgid "Malformed input, could not parse `%s'\n" msgstr "" -#: src/scalarproduct/gnunet-scalarproduct.c:278 -#: src/scalarproduct/gnunet-scalarproduct.c:314 +#: src/scalarproduct/gnunet-scalarproduct.c:299 #, c-format -msgid "Could not convert `%s' to int32_t.\n" +msgid "Could not convert `%s' to int64_t.\n" +msgstr "" + +#: src/scalarproduct/gnunet-scalarproduct.c:326 +#, c-format +msgid "Failed to initiate computation, were all keys unique?\n" +msgstr "" + +#: 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: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:356 +msgid "Transaction ID shared with peer." +msgstr "" + +#: src/scalarproduct/gnunet-scalarproduct.c:365 +msgid "Calculate the Vectorproduct with a GNUnet peer." +msgstr "" + +#: 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/scalarproduct_api.c:296 +msgid "Keys given to SCALARPRODUCT not unique!\n" +msgstr "" + +#: src/secretsharing/gnunet-secretsharing-profiler.c:613 +msgid "dkg start delay" msgstr "" -#: src/scalarproduct/gnunet-scalarproduct.c:286 -msgid "Need elements to compute the vectorproduct, got none.\n" +#: src/secretsharing/gnunet-secretsharing-profiler.c:616 +msgid "dkg timeout" msgstr "" -#: src/scalarproduct/gnunet-scalarproduct.c:346 +#: src/secretsharing/gnunet-secretsharing-profiler.c:619 +msgid "threshold" +msgstr "" + +#: src/secretsharing/gnunet-secretsharing-profiler.c:622 +msgid "also profile decryption" +msgstr "" + +#: src/sensordashboard/gnunet-service-sensordashboard.c:353 #, c-format -msgid "Could not convert `%s' to integer.\n" +msgid "Error trying to send a message to peer `%s'.\n" msgstr "" -#: src/scalarproduct/gnunet-scalarproduct.c:407 -msgid "A comma separated list of elements to compare as vector with our remote peer." +#: src/sensor/gnunet-sensor.c:162 +msgid "Retrieve information about all defined sensors" msgstr "" -#: src/scalarproduct/gnunet-scalarproduct.c:410 -msgid "A comma separated mask to select which elements should actually be compared." +#: src/sensor/gnunet-sensor.c:165 +msgid "Retrieve information about a single sensor" 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." +#: src/sensor/gnunet-sensor.c:168 +msgid "Force an anomaly on a sensor, use only for testing" msgstr "" -#: src/scalarproduct/gnunet-scalarproduct.c:416 -msgid "Transaction ID shared with peer." +#: src/sensor/gnunet-sensor.c:175 +msgid "sensor" msgstr "" -#: src/scalarproduct/gnunet-scalarproduct.c:425 -msgid "Calculate the Vectorproduct with a GNUnet peer." +#: src/sensor/gnunet-sensor-profiler.c:729 +msgid "Invalid or missing number of peers. Set at least 2 peers.\n" +msgstr "" + +#: src/sensor/gnunet-sensor-profiler.c:736 +msgid "Missing or invalid topology file.\n" +msgstr "" + +#: src/sensor/gnunet-sensor-profiler.c:782 +msgid "Number of peers to run" +msgstr "" + +#: src/sensor/gnunet-sensor-profiler.c:784 +msgid "Path to topology file" +msgstr "" + +#: src/sensor/gnunet-sensor-profiler.c:787 +msgid "Change the interval of running sensors to given value" msgstr "" -#: src/scalarproduct/gnunet-service-scalarproduct.c:541 +#: 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 "Client (%p) disconnected from us.\n" +msgid "Could not load analysis model `%s'.\n" msgstr "" -#: src/scalarproduct/gnunet-service-scalarproduct.c:613 -#: src/scalarproduct/gnunet-service-scalarproduct.c:702 +#: 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 "Could not send message to client (%p)!\n" +msgid "Received an invalid value for sensor `%s': %s\n" msgstr "" -#: src/scalarproduct/gnunet-service-scalarproduct.c:619 +#: src/sensor/gnunet-service-sensor_monitoring.c:347 #, c-format -msgid "Sending session-end notification to client (%p) for session %s\n" +msgid "Sensor `%s': External process should not be a path, disabling sensor.\n" +msgstr "" + +#: src/sensor/gnunet-service-sensor_monitoring.c:370 +#, c-format +msgid "" +"Sensor `%s' process `%s' problem: binary doesn't exist or not executable\n" msgstr "" -#: src/scalarproduct/gnunet-service-scalarproduct.c:712 +#: src/sensor/gnunet-service-sensor_monitoring.c:418 #, c-format -msgid "Sent result to client (%p), this session (%s) has ended!\n" +msgid "Sensor `%s' execution task already set, this should not happen\n" 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/sensor/gnunet-service-sensor_reporting.c:828 +msgid "Double creation of proof-of-work, this should not happen.\n" msgstr "" -#: src/scalarproduct/gnunet-service-scalarproduct.c:1028 -#, c-format -msgid "Failed to communicate with `%s', scalar product calculation aborted.\n" +#: src/sensor/gnunet-service-sensor_reporting.c:834 +msgid "Failed to create pow and signature block.\n" msgstr "" -#: src/scalarproduct/gnunet-service-scalarproduct.c:1099 -#: src/scalarproduct/gnunet-service-scalarproduct.c:1208 -msgid "Transmitting service request.\n" +#: src/sensor/gnunet-service-sensor_reporting.c:1046 +#, c-format +msgid "PEERSTORE error: %s.\n" msgstr "" -#: src/scalarproduct/gnunet-service-scalarproduct.c:1108 -msgid "Could not send service-request multipart message to channel!\n" +#: 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/scalarproduct/gnunet-service-scalarproduct.c:1147 -#, c-format -msgid "Successfully created new channel to peer (%s)!\n" +#: src/sensor/gnunet-service-sensor_reporting.c:1158 +msgid "Peer identity received from CORE init doesn't match ours.\n" msgstr "" -#: src/scalarproduct/gnunet-service-scalarproduct.c:1217 -msgid "Could not send message to channel!\n" +#: src/sensor/gnunet-service-sensor_reporting.c:1398 +msgid "Failed to connect to peerstore service.\n" msgstr "" -#: src/scalarproduct/gnunet-service-scalarproduct.c:1274 -msgid "Too short message received from client!\n" +#: 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/scalarproduct/gnunet-service-scalarproduct.c:1287 -msgid "Invalid message received from client, session information incorrect!\n" +#: src/sensor/gnunet-service-sensor_reporting.c:1426 +msgid "Failed to load my private key.\n" msgstr "" -#: src/scalarproduct/gnunet-service-scalarproduct.c:1298 +#: src/sensor/gnunet-service-sensor_update.c:327 #, c-format -msgid "Duplicate session information received, cannot create new session with key `%s'\n" +msgid "Error trying to send a message to update point `%s'.\n" msgstr "" -#: src/scalarproduct/gnunet-service-scalarproduct.c:1318 +#: src/sensor/gnunet-service-sensor_update.c:418 #, c-format -msgid "Got client-request-session with key %s, preparing channel to remote service.\n" +msgid "Failed to connect to update point `%s'.\n" msgstr "" -#: src/scalarproduct/gnunet-service-scalarproduct.c:1354 -#, c-format -msgid "Creating new channel for session with key %s.\n" +#: src/sensor/plugin_sensor_model_gaussian.c:203 +msgid "Missing `TRAINING_WINDOW' value in configuration.\n" msgstr "" -#: src/scalarproduct/gnunet-service-scalarproduct.c:1399 -#, c-format -msgid "Got client-responder-session with key %s and a matching service-request-session set, processing.\n" +#: src/sensor/plugin_sensor_model_gaussian.c:221 +msgid "Missing `CONFIDENCE_INTERVAL' value in configuration.\n" msgstr "" -#: src/scalarproduct/gnunet-service-scalarproduct.c:1409 -#, c-format -msgid "Got client-responder-session with key %s but NO matching service-request-session set, queuing element for later use.\n" +#: src/sensor/plugin_sensor_model_gaussian.c:229 +msgid "Missing `WEIGHT_INC' value in configuration.\n" msgstr "" -#: src/scalarproduct/gnunet-service-scalarproduct.c:1439 -#, c-format -msgid "New incoming channel from peer %s.\n" +#: src/sensor/sensor_api.c:296 +msgid "Iterate request canceled due to disconnection.\n" msgstr "" -#: src/scalarproduct/gnunet-service-scalarproduct.c:1471 -#, c-format -msgid "Peer disconnected, terminating session %s with peer (%s)\n" +#: src/sensor/sensor_api.c:307 +msgid "Force anomaly request canceled due to disconnection.\n" msgstr "" -#: src/scalarproduct/gnunet-service-scalarproduct.c:1672 -#: src/scalarproduct/gnunet-service-scalarproduct.c:1814 -#, c-format -msgid "Got session with key %s and a matching element set, processing.\n" +#: src/sensor/sensor_api.c:374 +msgid "Timeout transmitting iteration request to `SENSOR' service." msgstr "" -#: src/scalarproduct/gnunet-service-scalarproduct.c:1681 -#: src/scalarproduct/gnunet-service-scalarproduct.c:1821 -#, c-format -msgid "Got session with key %s without a matching element set, queueing.\n" +#: src/sensor/sensor_util_lib.c:107 +msgid "Error reading sensor version\n" msgstr "" -#: src/scalarproduct/gnunet-service-scalarproduct.c:1771 -#, c-format -msgid "Got message with duplicate session key (`%s'), ignoring service request.\n" +#: src/sensor/sensor_util_lib.c:116 +msgid "Invalid sensor version number, format should be major.minor\n" msgstr "" -#: src/scalarproduct/gnunet-service-scalarproduct.c:2014 -msgid "Shutting down, initiating cleanup.\n" +#: src/sensor/sensor_util_lib.c:131 +msgid "Error reading sensor category\n" msgstr "" -#: src/scalarproduct/gnunet-service-scalarproduct.c:2100 -msgid "Connect to MESH failed\n" +#: src/sensor/sensor_util_lib.c:164 +msgid "Error reading sensor run interval\n" msgstr "" -#: src/scalarproduct/gnunet-service-scalarproduct.c:2104 -msgid "Mesh initialized\n" +#: src/sensor/sensor_util_lib.c:191 +msgid "Error reading sensor source\n" msgstr "" -#: src/scalarproduct/scalarproduct_api.c:246 -msgid "# SUC responder result messages received" +#: src/sensor/sensor_util_lib.c:206 +msgid "Error reading sensor gnunet-statistics source information\n" msgstr "" -#: src/scalarproduct/scalarproduct_api.c:300 -msgid "# bytes sent to scalarproduct" +#: src/sensor/sensor_util_lib.c:218 +msgid "Error reading sensor process name\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_util_lib.c:233 +msgid "Error reading sensor expected datatype\n" 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:241 +msgid "Invalid expected datatype, gnunet-statistics returns uint64 values\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:299 +#, c-format +msgid "Failed to access sensor file: %s\n" msgstr "" -#: src/secretsharing/gnunet-secretsharing-profiler.c:538 -msgid "dkg start delay" +#: src/sensor/sensor_util_lib.c:308 +#, c-format +msgid "Failed to load sensor definition: %s\n" msgstr "" -#: src/secretsharing/gnunet-secretsharing-profiler.c:541 -msgid "dkg timeout" +#: src/sensor/sensor_util_lib.c:370 +#, c-format +msgid "Sensor `%s' already exists with same or newer version\n" msgstr "" -#: src/secretsharing/gnunet-secretsharing-profiler.c:544 -msgid "threshold" +#: src/sensor/sensor_util_lib.c:387 +#, c-format +msgid "Error adding new sensor `%s' to global hashmap.\n" msgstr "" -#: src/secretsharing/gnunet-secretsharing-profiler.c:547 -msgid "also profile decryption" +#: src/sensor/sensor_util_lib.c:412 +#, c-format +msgid "Error loading sensor from file: %s\n" msgstr "" -#: src/set/gnunet-service-set.c:1431 -msgid "Could not connect to mesh service\n" +#: src/set/gnunet-service-set.c:1531 +msgid "Could not connect to cadet service\n" msgstr "" -#: src/set/gnunet-set-ibf-profiler.c:221 +#: 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 @@ msgid "Could not save some persistent statistics\n" 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 \n" @@ -5917,30 +6511,34 @@ msgid "" "\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 @@ msgstr "" 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 @@ msgstr "" #: 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 @@ msgid "extract hostkey file from pre-computed hostkey list" 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 @@ msgstr "" #: 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,457 +6806,481 @@ msgstr "" 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:1550 +msgid "# KEEPALIVE_RESPONSEs discarded (not connected)" +msgstr "" + +#: src/transport/gnunet-service-transport_neighbours.c:1559 +msgid "# KEEPALIVE_RESPONSEs discarded (not expected)" +msgstr "" + +#: src/transport/gnunet-service-transport_neighbours.c:1567 +msgid "# KEEPALIVE_RESPONSEs discarded (address changed)" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:1440 -msgid "# KEEPALIVE_RESPONSE messages discarded (not expected)" +#: src/transport/gnunet-service-transport_neighbours.c:1576 +msgid "# KEEPALIVE_RESPONSEs discarded (no nonce)" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:1448 -msgid "# KEEPALIVE_RESPONSE messages discarded (address changed)" +#: src/transport/gnunet-service-transport_neighbours.c:1581 +msgid "# KEEPALIVE_RESPONSEs discarded (bad nonce)" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:1456 -msgid "# KEEPALIVE_RESPONSE messages discarded (wrong nonce)" +#: src/transport/gnunet-service-transport_neighbours.c:1587 +msgid "# KEEPALIVE_RESPONSEs received (OK)" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:1534 +#: 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)" -msgstr "" - -#: src/transport/gnunet-service-transport_neighbours.c:3107 -msgid "# CONNECT_ACK messages received" +#: src/transport/gnunet-service-transport_neighbours.c:3212 +msgid "# SYN_ACK messages received" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:3115 -msgid "# unexpected CONNECT_ACK messages (no peer)" +#: src/transport/gnunet-service-transport_neighbours.c:3220 +msgid "# unexpected SYN_ACK messages (no peer)" 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:3238 +#: src/transport/gnunet-service-transport_neighbours.c:3262 +msgid "# unexpected SYN_ACK messages (not ready)" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:3176 -msgid "# unexpected CONNECT_ACK messages (waiting on ATS)" +#: src/transport/gnunet-service-transport_neighbours.c:3274 +msgid "# unexpected SYN_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:493 +msgid "# address records discarded (timeout)" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:616 -msgid "# PING without HELLO messages sent" +#: src/transport/gnunet-service-transport_validation.c:541 +msgid "# address records discarded (blacklist)" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:722 +#: 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" -msgstr "" - -#: src/transport/gnunet-service-transport_validation.c:1103 -#, c-format -msgid "Received a PING message with validation bug from `%s'\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:1157 +#: src/transport/gnunet-service-transport_validation.c:1191 #, 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" -msgstr "" - -#: src/transport/gnunet-service-transport_validation.c:1500 -#, c-format -msgid "Adding `%s' without addresses for peer `%s'\n" +#: src/transport/gnunet-service-transport_validation.c:1478 +msgid "# validations succeeded" msgstr "" -#: src/transport/gnunet-transport.c:367 +#: src/transport/gnunet-transport.c:580 #, 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" @@ -6661,329 +7289,420 @@ msgid "" "\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/gnunet-transport-profiler.c:254 +#, c-format +msgid "%u;%u;%llu;%llu;%.2f;%.2f" +msgstr "" + +#: src/transport/gnunet-transport-profiler.c:263 +#, c-format +msgid ";%llu;%.2f" +msgstr "" + +#: src/transport/gnunet-transport-profiler.c:280 +msgid "\n" +msgstr "" + +#: src/transport/gnunet-transport-profiler.c:332 +msgid "." msgstr "" -#: src/transport/plugin_transport_bluetooth.c:640 -msgid "# Bluetooth messages defragmented" +#: 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: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:400 +#, c-format +msgid "Connected to different peer `%s'\n" msgstr "" -#: src/transport/plugin_transport_bluetooth.c:837 -msgid "# Bluetooth message fragments sent" +#: src/transport/gnunet-transport-profiler.c:483 +#, c-format +msgid "Retrying to connect to `%s'\n" msgstr "" -#: src/transport/plugin_transport_bluetooth.c:861 -msgid "# Bluetooth messages pending (with fragmentation)" +#: src/transport/gnunet-transport-profiler.c:508 +#, c-format +msgid "Denying connection to `%s'\n" 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:537 +msgid "Message size too big!\n" msgstr "" -#: src/transport/plugin_transport_bluetooth.c:1307 -msgid "# HELLO messages received via Bluetooth" +#: src/transport/gnunet-transport-profiler.c:543 +msgid "No peer identity given\n" msgstr "" -#: src/transport/plugin_transport_bluetooth.c:1331 -msgid "# fragments received via Bluetooth" +#: 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:1341 -msgid "# ACKs received 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:1401 -msgid "# Bluetooth DATA messages discarded due to CRC32 error" +#: src/transport/gnunet-transport-profiler.c:569 +msgid "No operation given\n" msgstr "" -#: src/transport/plugin_transport_bluetooth.c:1512 -msgid "# DATA messages received via Bluetooth" +#: src/transport/gnunet-transport-profiler.c:623 +msgid "send data to peer" msgstr "" -#: src/transport/plugin_transport_bluetooth.c:1547 -msgid "# Bluetooth DATA messages processed" +#: src/transport/gnunet-transport-profiler.c:626 +msgid "receive data from peer" msgstr "" -#: src/transport/plugin_transport_bluetooth.c:1610 -msgid "# HELLO beacons sent via Bluetooth" +#: src/transport/gnunet-transport-profiler.c:629 +msgid "iterations" msgstr "" -#: src/transport/plugin_transport_bluetooth.c:1723 -msgid "Bluetooth address with invalid size encountered\n" +#: 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_bluetooth.c:1923 -#, c-format -msgid "Helper binary `%s' not SUID, cannot run bluetooth transport\n" +#: 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:1622 +#: 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 @@ msgstr "" 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" -msgstr "" - -#: src/transport/plugin_transport_udp_broadcasting.c:210 -msgid "# IPv4 broadcast 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:603 -msgid "Disabling HELLO broadcasting due to friend-to-friend only configuration!\n" +#: 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: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: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:2602 +#: 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:3664 +msgid "must be valid IPv6 address" msgstr "" -#: src/transport/plugin_transport_udp.c:3168 -msgid "Failed to create network sockets, plugin failed\n" +#: src/transport/plugin_transport_udp.c:3730 +msgid "Failed to create UDP network sockets\n" msgstr "" -#: src/transport/plugin_transport_unix.c:1321 +#: 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" -msgstr "" - -#: src/transport/plugin_transport_wlan.c:639 -msgid "# WLAN messages defragmented" +#: src/transport/plugin_transport_wlan.c:742 +msgid "# ACKs sent" 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:762 +msgid "# Messages defragmented" msgstr "" -#: src/transport/plugin_transport_wlan.c:876 -msgid "# WLAN message fragments sent" +#: src/transport/plugin_transport_wlan.c:803 +#: src/transport/plugin_transport_wlan.c:890 +msgid "# Sessions allocated" msgstr "" -#: src/transport/plugin_transport_wlan.c:900 -msgid "# WLAN messages pending (with fragmentation)" +#: src/transport/plugin_transport_wlan.c:1011 +msgid "# message fragments sent" 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:1040 +msgid "# messages pending (with fragmentation)" msgstr "" -#: src/transport/plugin_transport_wlan.c:1302 -msgid "# HELLO messages received via WLAN" +#: 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:1326 -msgid "# fragments received via WLAN" +#: src/transport/plugin_transport_wlan.c:1528 +msgid "# ACKs received" msgstr "" -#: src/transport/plugin_transport_wlan.c:1336 -msgid "# ACKs 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:1396 -msgid "# WLAN DATA messages discarded due to CRC32 error" +#: src/transport/plugin_transport_wlan.c:1703 +msgid "# HELLO beacons sent" msgstr "" -#: src/transport/plugin_transport_wlan.c:1518 -msgid "# DATA messages received via WLAN" +#: src/transport/plugin_transport_wlan.c:1820 +msgid "# DATA messages received" msgstr "" -#: src/transport/plugin_transport_wlan.c:1553 -msgid "# WLAN DATA messages processed" +#: src/transport/plugin_transport_wlan.c:1854 +msgid "# DATA messages processed" msgstr "" -#: src/transport/plugin_transport_wlan.c:1616 -msgid "# HELLO beacons sent via WLAN" -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/plugin_transport_wlan.c:2243 #, c-format msgid "Helper binary `%s' not SUID, cannot run WLAN transport\n" msgstr "" -#: src/transport/transport_api.c:739 +#: src/transport/plugin_transport_wlan.c:2265 +msgid "# sessions allocated" +msgstr "" + +#: src/transport/transport_api.c:812 #, 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr "" 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,74 +8523,66 @@ msgstr "" 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 -#, c-format -msgid "Attempt to cancel dead task %llu!\n" -msgstr "" - -#: src/util/server.c:484 +#: src/util/server.c:483 #, c-format msgid "`%s' failed for port %d (%s).\n" msgstr "" @@ -7854,9 +8597,11 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgid "# Active channels" 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 @@ msgid "Received packet of unknown protocol %d from TUN (dropping it)\n" 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 @@ msgstr "" 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 @@ msgstr "" 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 "" diff --git a/po/sv.po b/po/sv.po index 8bd8b6e16..d67fec321 100644 --- a/po/sv.po +++ b/po/sv.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: GNUnet 0.7.0b\n" "Report-Msgid-Bugs-To: gnunet-developers@mail.gnu.org\n" -"POT-Creation-Date: 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 \n" "Language-Team: Swedish \n" @@ -497,16 +497,16 @@ msgstr "" 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 @@ msgid "Quota for network `%11s' (in/out): %10s / %10s\n" 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 @@ msgstr "# byte dekrypterade" 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 @@ msgstr "" 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 @@ msgid "# updates to my type map" 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 @@ msgid "# items stored" 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 @@ msgstr "" #: 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 @@ msgstr "" #: 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 @@ msgstr "" 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 -msgid "Rebuilding bloomfilter. Please be patient.\n" +#: 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:1419 -msgid "Plugin does not support get_keys function. Please fix!\n" +#: src/datastore/gnunet-service-datastore.c:1450 +msgid "Rebuilding bloomfilter. Please be patient.\n" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1422 -msgid "Bloomfilter construction complete.\n" +#: 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: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 @@ msgstr "\"%s\" misslyckades vid %s:%d med fel: %s\n" 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr "Fil \"%s\" har URI: %s\n" 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 @@ msgstr "Nätverksanslutning" 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 @@ msgstr "" 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 @@ msgid "Ego for `%s' not found, cannot perform lookup.\n" 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 @@ msgstr "Kunde inte spara konfigurationsfil \"%s\":" 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 @@ msgstr "" 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 @@ msgstr "Misslyckades att läsa kompislista från \"%s\"\n" msgid "Unable to parse BOX record string `%s'\n" msgstr "Misslyckades att läsa kompislista från \"%s\"\n" +#: src/gns/plugin_rest_gns.c: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 @@ msgstr "Kunde inte spara konfigurationsfil \"%s\":" msgid "Failed to create directory `%s' for storing egos\n" msgstr "Misslyckades att läsa kompislista från \"%s\"\n" +#: src/identity/plugin_rest_identity.c: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 @@ msgstr "" 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 @@ msgstr "" "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 @@ msgstr "" "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 @@ 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 "" @@ -5169,6 +5203,7 @@ msgstr "" #: 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 @@ msgid "add" 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 @@ msgstr "Ogiltigt format för IP: \"%s\"\n" 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 @@ msgid "Invalid nick `%s'\n" 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 @@ msgstr "Misslyckades att läsa kompislista från \"%s\"\n" 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 @@ msgid "Measure quality and performance of the NSE service." 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 @@ msgstr "" 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 @@ msgid "# revocation set unions completed" 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 @@ msgid "Found %u addresses to report to NAT service\n" 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 @@ msgstr "" 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 @@ msgstr "Konfigurationsfil \"%s\" hittades inte. Kör \"gnunet-setup -d\"!\n" 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 @@ msgid "" "%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 @@ msgstr "\"%s\" misslyckades vid %s:%d med fel: \"%s\".\n" 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 @@ msgstr "%s: flagga \"-W %s\" tillåter inte ett argument\n" 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 @@ msgstr "" "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 @@ msgstr "\"%s\" misslyckades för enhet %s: %u\n" 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" @@ -9626,10 +9687,6 @@ msgstr "\"%s\" misslyckades för fil \"%s\" vid %s:%d med fel: %s\n" #~ msgid "New incoming channel from peer %s.\n" #~ 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." diff --git a/po/vi.po b/po/vi.po index e78436ba2..a706c1e1d 100644 --- a/po/vi.po +++ b/po/vi.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: gnunet 0.8.0a\n" "Report-Msgid-Bugs-To: gnunet-developers@mail.gnu.org\n" -"POT-Creation-Date: 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 \n" "Language-Team: Vietnamese \n" @@ -503,17 +503,17 @@ msgstr "" 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 @@ msgid "Quota for network `%11s' (in/out): %10s / %10s\n" 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 @@ msgstr "# các byte đã giải mã" 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 @@ msgstr "" 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 @@ msgid "# updates to my type map" 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 @@ msgid "# items stored" 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 @@ msgstr "" #: 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 @@ msgstr "" #: 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 @@ msgstr "" 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 -msgid "Rebuilding bloomfilter. Please be patient.\n" +#: 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:1419 -msgid "Plugin does not support get_keys function. Please fix!\n" +#: src/datastore/gnunet-service-datastore.c:1450 +msgid "Rebuilding bloomfilter. Please be patient.\n" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1422 -msgid "Bloomfilter construction complete.\n" +#: 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: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 @@ msgstr "« %s » bị lỗi tại %s:%d với lỗi: %s" 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr "Tập tin « %s » có URI: %s\n" 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 @@ msgstr "# các kết nối dht" 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 @@ msgstr "" 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 @@ msgid "Ego for `%s' not found, cannot perform lookup.\n" 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 @@ msgstr "Không thể lưu tập tin cấu hình « %s »:" 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 @@ msgstr "" 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 @@ msgstr "Lỗi đọc danh sách bạn bè từ « %s »\n" msgid "Unable to parse BOX record string `%s'\n" msgstr "Lỗi đọc danh sách bạn bè từ « %s »\n" +#: src/gns/plugin_rest_gns.c: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 @@ msgstr "Không thể lưu tập tin cấu hình « %s »:" msgid "Failed to create directory `%s' for storing egos\n" msgstr "Lỗi đọc danh sách bạn bè từ « %s »\n" +#: src/identity/plugin_rest_identity.c: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 @@ msgstr "" 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 @@ msgid "Adding record failed: %s\n" 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 @@ 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 "" @@ -5224,6 +5258,7 @@ msgstr "chưa đưa ra tên" #: 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 @@ msgid "add" 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 @@ msgstr "Địa chỉ IP định dạng sai: %s\n" 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 @@ msgid "Invalid nick `%s'\n" 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 @@ msgstr "Lỗi cập nhật dữ liệu cho mô-đun « %s »\n" 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 @@ msgid "Measure quality and performance of the NSE service." 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 @@ msgstr "" 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 @@ msgid "# revocation set unions completed" 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 @@ msgid "Found %u addresses to report to NAT service\n" 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr "" "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 @@ msgid "" "%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 @@ msgstr "Lỗi thẩm tra chữ ký RSA tại %s:%d: %s\n" 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 @@ msgid "Use %s to get a list of options.\n" 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 @@ msgstr "" "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 @@ msgstr "« %s » thất bại cho ổ đĩa « %s »: %u\n" 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" @@ -9693,10 +9754,6 @@ msgstr "« %s » thất bại ở tập tin « %s » tại %s:%d với lỗi: %s #~ msgid "New incoming channel from peer %s.\n" #~ 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" diff --git a/po/zh_CN.po b/po/zh_CN.po index a3871b09c..91203f264 100644 --- a/po/zh_CN.po +++ b/po/zh_CN.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: gnunet-0.8.1\n" "Report-Msgid-Bugs-To: gnunet-developers@mail.gnu.org\n" -"POT-Creation-Date: 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 \n" "Language-Team: Chinese (simplified) \n" @@ -496,16 +496,16 @@ msgstr "" 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 @@ msgid "Quota for network `%11s' (in/out): %10s / %10s\n" 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgid "# updates to my type map" 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 @@ msgid "# items stored" 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 @@ msgstr "" #: 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 @@ msgstr "" #: 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 @@ msgstr "" 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 -msgid "Rebuilding bloomfilter. Please be patient.\n" +#: 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:1419 -msgid "Plugin does not support get_keys function. Please fix!\n" +#: src/datastore/gnunet-service-datastore.c:1450 +msgid "Rebuilding bloomfilter. Please be patient.\n" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1422 -msgid "Bloomfilter construction complete.\n" +#: 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: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 @@ msgstr "“%s”于 %s:%d 处失败,错误为:%s\n" 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr "运行 %s失败:%s %d\n" 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 @@ msgstr "" "\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 @@ msgstr "" 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 @@ msgid "Ego for `%s' not found, cannot perform lookup.\n" 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 @@ msgstr "无法保存配置文件“%s”:" 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 @@ msgstr "" 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 @@ msgstr "解析配置文件“%s”失败\n" 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 @@ msgstr "解析配置文件“%s”失败\n" 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 @@ msgstr "" 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 @@ msgid "Adding record failed: %s\n" 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 @@ 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 "" @@ -5002,6 +5034,7 @@ msgstr "" #: 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 @@ msgid "add" 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 @@ msgstr "IP 格式无效:“%s”\n" 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 @@ msgid "Invalid nick `%s'\n" 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 @@ msgstr "发送消息失败。\n" 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 @@ msgid "Measure quality and performance of the NSE service." 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 @@ msgstr "" 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 @@ msgid "# revocation set unions completed" 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 @@ msgid "Found %u addresses to report to NAT service\n" 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 @@ msgstr "" 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 @@ msgstr "配置不满足配置规范文件“%s”的约束!\n" 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 @@ msgid "" "%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 @@ msgstr "对驱动器“%2$s”的“%1$s”操作失败:%3$u\n" 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 @@ msgstr "%s:选项“-W %s” 不允许有参数\n" 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 @@ msgstr "对驱动器“%2$s”的“%1$s”操作失败:%3$u\n" 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 "无法确定用户界面定义文件。" diff --git a/src/dht/Makefile.am b/src/dht/Makefile.am index 835e1dc2a..0dca26901 100644 --- a/src/dht/Makefile.am +++ b/src/dht/Makefile.am @@ -48,7 +48,8 @@ libgnunet_plugin_block_dht_la_LDFLAGS = \ libexec_PROGRAMS = \ gnunet-service-dht \ - gnunet-service-dht-xvine + gnunet-service-dht-xvine\ + gnunet-service-dht-whanau noinst_PROGRAMS = \ gnunet-dht-monitor \ @@ -98,7 +99,26 @@ gnunet_service_dht_xvine_LDADD = \ $(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 diff --git a/src/dht/gnunet-service-wdht.c b/src/dht/gnunet-service-wdht.c new file mode 100644 index 000000000..13e60acf4 --- /dev/null +++ b/src/dht/gnunet-service-wdht.c @@ -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 */ diff --git a/src/dht/gnunet-service-wdht.h b/src/dht/gnunet-service-wdht.h new file mode 100644 index 000000000..2eee3a429 --- /dev/null +++ b/src/dht/gnunet-service-wdht.h @@ -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 diff --git a/src/dht/gnunet-service-wdht_clients.c b/src/dht/gnunet-service-wdht_clients.c new file mode 100644 index 000000000..2e4d4ef0a --- /dev/null +++ b/src/dht/gnunet-service-wdht_clients.c @@ -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 */ diff --git a/src/dht/gnunet-service-wdht_clients.h b/src/dht/gnunet-service-wdht_clients.h new file mode 100644 index 000000000..f1781332c --- /dev/null +++ b/src/dht/gnunet-service-wdht_clients.h @@ -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 diff --git a/src/dht/gnunet-service-wdht_datacache.c b/src/dht/gnunet-service-wdht_datacache.c new file mode 100644 index 000000000..571342f36 --- /dev/null +++ b/src/dht/gnunet-service-wdht_datacache.c @@ -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 */ diff --git a/src/dht/gnunet-service-wdht_datacache.h b/src/dht/gnunet-service-wdht_datacache.h new file mode 100644 index 000000000..a8f37fa63 --- /dev/null +++ b/src/dht/gnunet-service-wdht_datacache.h @@ -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 diff --git a/src/dht/gnunet-service-wdht_hello.c b/src/dht/gnunet-service-wdht_hello.c new file mode 100644 index 000000000..c5e6c7999 --- /dev/null +++ b/src/dht/gnunet-service-wdht_hello.c @@ -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 */ diff --git a/src/dht/gnunet-service-wdht_hello.h b/src/dht/gnunet-service-wdht_hello.h new file mode 100644 index 000000000..e7376e7b0 --- /dev/null +++ b/src/dht/gnunet-service-wdht_hello.h @@ -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 diff --git a/src/dht/gnunet-service-wdht_neighbours.c b/src/dht/gnunet-service-wdht_neighbours.c new file mode 100644 index 000000000..c91b78a69 --- /dev/null +++ b/src/dht/gnunet-service-wdht_neighbours.c @@ -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 +#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 */ diff --git a/src/dht/gnunet-service-wdht_neighbours.h b/src/dht/gnunet-service-wdht_neighbours.h new file mode 100644 index 000000000..edb241a6c --- /dev/null +++ b/src/dht/gnunet-service-wdht_neighbours.h @@ -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 diff --git a/src/dht/gnunet-service-wdht_nse.c b/src/dht/gnunet-service-wdht_nse.c new file mode 100644 index 000000000..4cce88f6e --- /dev/null +++ b/src/dht/gnunet-service-wdht_nse.c @@ -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 */ diff --git a/src/dht/gnunet-service-wdht_nse.h b/src/dht/gnunet-service-wdht_nse.h new file mode 100644 index 000000000..86ce9d68e --- /dev/null +++ b/src/dht/gnunet-service-wdht_nse.h @@ -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 diff --git a/src/dht/gnunet-service-wdht_routing.c b/src/dht/gnunet-service-wdht_routing.c new file mode 100644 index 000000000..986eb11ac --- /dev/null +++ b/src/dht/gnunet-service-wdht_routing.c @@ -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 */ diff --git a/src/dht/gnunet-service-wdht_routing.h b/src/dht/gnunet-service-wdht_routing.h new file mode 100644 index 000000000..5292ec2ce --- /dev/null +++ b/src/dht/gnunet-service-wdht_routing.h @@ -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 -- cgit v1.2.3