[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[gnunet] 01/02: adding the messenger service and its client-side library
From: |
gnunet |
Subject: |
[gnunet] 01/02: adding the messenger service and its client-side library |
Date: |
Thu, 12 Nov 2020 17:30:56 +0100 |
This is an automated email from the git hooks/post-receive script.
thejackimonster pushed a commit to branch master
in repository gnunet.
commit 8bf864c25bda97c1448b709a76a168834753ff86
Author: TheJackiMonster <thejackimonster@gmail.com>
AuthorDate: Thu Oct 1 21:13:43 2020 +0200
adding the messenger service and its client-side library
Signed-off-by: TheJackiMonster <thejackimonster@gmail.com>
---
.buildbot/firefly-x86_64-amdepyc_test_tng.sh | 2 +-
README.1st | 1 +
bin/rename.sh | 2 +-
configure.ac | 14 +-
pkgconfig/gnunetmessenger.pc.in | 12 +
po/LINGUAS | 2 +-
po/POTFILES.in | 26 +-
po/de.po | 1005 ++-
po/es.po | 1030 ++-
po/fr.po | 993 ++-
po/it.po | 940 ++-
po/sr.po | 8292 ++++++++++++++++++++
po/sv.po | 1007 ++-
po/vi.po | 1017 ++-
po/zh_CN.po | 1005 ++-
src/Makefile.am | 7 +-
src/ats-tests/ats-testing-log.c | 4 +-
src/cadet/gnunet-service-cadet_channel.c | 10 +-
src/cadet/gnunet-service-cadet_core.c | 4 +-
src/cadet/gnunet-service-cadet_dht.c | 4 +-
src/cadet/gnunet-service-cadet_tunnels.c | 2 +-
src/consensus/consensus_api.c | 2 +-
src/conversation/Makefile.am | 1 +
src/conversation/conversation.h | 10 +-
src/conversation/conversation_api.c | 4 +-
src/conversation/gnunet-conversation.c | 6 +-
src/conversation/gnunet-service-conversation.c | 15 +-
src/conversation/test_conversation_api.c | 8 +-
src/conversation/test_conversation_api_reject.c | 8 +-
src/conversation/test_conversation_api_twocalls.c | 8 +-
src/datacache/plugin_datacache_postgres.c | 9 +-
src/datastore/datastore_api.c | 8 +-
src/datastore/plugin_datastore_postgres.c | 14 +-
src/dht/gnunet-service-dht_clients.c | 6 +-
src/dht/gnunet-service-dht_datacache.c | 4 +-
src/dht/gnunet-service-dht_neighbours.c | 4 +-
src/dht/plugin_block_dht.c | 2 +-
src/dns/gnunet-dns-monitor.c | 2 +-
src/fragmentation/fragmentation.c | 2 +-
src/fs/fs_download.c | 2 +-
src/fs/gnunet-daemon-fsprofiler.c | 4 +-
src/fs/gnunet-publish.c | 18 +-
src/gns/Makefile.am | 5 +
src/gns/gns.h | 2 +-
src/gns/gns_api.c | 4 +-
src/gns/gns_tld_api.c | 21 +-
src/gns/gnunet-gns-import.c | 9 +-
src/gns/gnunet-service-gns.c | 6 +-
src/gns/gnunet-service-gns.h | 3 +-
src/gns/gnunet-service-gns_interceptor.c | 2 +-
src/gns/gnunet-service-gns_resolver.c | 71 +-
src/gns/gnunet-service-gns_resolver.h | 2 +-
src/gns/plugin_block_gns.c | 15 +-
src/gns/plugin_gnsrecord_gns.c | 33 +-
src/gns/plugin_rest_gns.c | 3 +-
src/gns/test_gns_dht_lookup.sh | 1 +
src/gnsrecord/Makefile.am | 21 +-
src/gnsrecord/gnsrecord_crypto.c | 315 +-
src/gnsrecord/gnsrecord_misc.c | 151 +-
src/gnsrecord/gnunet-gnsrecord-tvg.c | 49 +-
src/{json => gnsrecord}/json_gnsrecord.c | 114 +-
src/gnsrecord/perf_gnsrecord_crypto.c | 5 +-
src/gnsrecord/plugin_gnsrecord_dns.c | 2 +-
src/gnsrecord/test_gnsrecord_crypto.c | 11 +-
src/identity/gnunet-identity.c | 45 +-
src/identity/gnunet-service-identity.c | 77 +-
src/identity/identity.h | 81 +-
src/identity/identity_api.c | 391 +-
src/identity/identity_api_lookup.c | 4 +-
src/identity/plugin_rest_identity.c | 23 +-
src/identity/test_identity.c | 8 +-
src/identity/test_identity_defaults.c | 8 +-
src/include/Makefile.am | 1 +
src/include/gnunet_buffer_lib.h | 3 +-
src/include/gnunet_common.h | 15 +-
src/include/gnunet_conversation_service.h | 2 +-
src/include/gnunet_crypto_lib.h | 6 +-
src/include/gnunet_gns_service.h | 5 +-
src/include/gnunet_gnsrecord_json_lib.h | 73 +
src/include/gnunet_gnsrecord_lib.h | 125 +-
src/include/gnunet_identity_service.h | 422 +-
src/include/gnunet_json_lib.h | 27 +-
src/include/gnunet_messenger_service.h | 436 +
src/include/gnunet_namestore_plugin.h | 12 +-
src/include/gnunet_namestore_service.h | 15 +-
src/include/gnunet_pq_lib.h | 55 +-
src/include/gnunet_protocols.h | 43 +-
src/include/gnunet_reclaim_service.h | 33 +-
src/include/gnunet_revocation_service.h | 34 +-
src/include/gnunet_uri_lib.h | 8 +-
src/json/Makefile.am | 7 +-
src/json/json.c | 14 +-
src/json/json_generator.c | 108 -
src/messenger/.gitignore | 4 +
src/messenger/Makefile.am | 131 +
src/messenger/gnunet-messenger.c | 306 +
src/messenger/gnunet-service-messenger.c | 306 +
src/messenger/gnunet-service-messenger.h | 121 +
src/messenger/gnunet-service-messenger_basement.c | 58 +
src/messenger/gnunet-service-messenger_basement.h | 66 +
src/messenger/gnunet-service-messenger_contact.c | 96 +
src/messenger/gnunet-service-messenger_contact.h | 112 +
src/messenger/gnunet-service-messenger_handle.c | 503 ++
src/messenger/gnunet-service-messenger_handle.h | 216 +
.../gnunet-service-messenger_list_handles.c | 95 +
.../gnunet-service-messenger_list_handles.h | 96 +
.../gnunet-service-messenger_list_messages.c | 76 +
.../gnunet-service-messenger_list_messages.h | 81 +
.../gnunet-service-messenger_message_handle.c | 130 +
.../gnunet-service-messenger_message_handle.h | 128 +
.../gnunet-service-messenger_message_kind.c | 192 +
.../gnunet-service-messenger_message_kind.h | 160 +
.../gnunet-service-messenger_message_recv.c | 204 +
.../gnunet-service-messenger_message_recv.h | 159 +
.../gnunet-service-messenger_message_send.c | 118 +
.../gnunet-service-messenger_message_send.h | 155 +
.../gnunet-service-messenger_message_store.c | 282 +
.../gnunet-service-messenger_message_store.h | 120 +
src/messenger/gnunet-service-messenger_room.c | 1051 +++
src/messenger/gnunet-service-messenger_room.h | 378 +
src/messenger/gnunet-service-messenger_service.c | 516 ++
src/messenger/gnunet-service-messenger_service.h | 259 +
src/messenger/gnunet-service-messenger_tunnel.c | 300 +
src/messenger/gnunet-service-messenger_tunnel.h | 155 +
src/messenger/gnunet-service-messenger_util.c | 64 +
src/messenger/gnunet-service-messenger_util.h | 53 +
src/messenger/messenger.conf.in | 13 +
src/messenger/messenger_api.c | 568 ++
src/messenger/messenger_api_contact.c | 78 +
src/messenger/messenger_api_contact.h | 93 +
src/messenger/messenger_api_ego.h | 38 +
src/messenger/messenger_api_handle.c | 213 +
src/messenger/messenger_api_handle.h | 174 +
src/messenger/messenger_api_list_tunnels.c | 112 +
src/messenger/messenger_api_list_tunnels.h | 112 +
src/messenger/messenger_api_message.c | 602 ++
src/messenger/messenger_api_message.h | 190 +
src/messenger/messenger_api_room.c | 189 +
src/messenger/messenger_api_room.h | 95 +
src/messenger/test_messenger.c | 187 +
src/messenger/test_messenger_anonymous.c | 179 +
src/messenger/test_messenger_comm0.c | 252 +
src/my/my_query_helper.c | 8 +-
src/namecache/Makefile.am | 9 +
src/namecache/gnunet-namecache.c | 4 +-
src/namecache/gnunet-service-namecache.c | 47 +-
src/namecache/namecache.h | 4 +-
src/namecache/namecache_api.c | 23 +-
src/namecache/plugin_namecache_flat.c | 16 +-
src/namecache/plugin_namecache_postgres.c | 30 +-
src/namecache/plugin_namecache_sqlite.c | 16 +-
src/namecache/test_namecache_api_cache_block.c | 20 +-
src/namestore/Makefile.am | 11 +-
src/namestore/gnunet-namestore-fcfsd.c | 49 +-
src/namestore/gnunet-namestore.c | 45 +-
src/namestore/gnunet-service-namestore.c | 34 +-
src/namestore/gnunet-zoneimport.c | 4 +-
src/namestore/namestore.h | 18 +-
src/namestore/namestore_api.c | 14 +-
src/namestore/namestore_api_monitor.c | 4 +-
src/namestore/perf_namestore_api_zone_iteration.c | 7 +-
src/namestore/plugin_namestore_flat.c | 37 +-
src/namestore/plugin_namestore_postgres.c | 35 +-
src/namestore/plugin_namestore_sqlite.c | 28 +-
src/namestore/plugin_rest_namestore.c | 30 +-
src/namestore/test_namestore_api_lookup_nick.c | 11 +-
src/namestore/test_namestore_api_lookup_private.c | 11 +-
src/namestore/test_namestore_api_lookup_public.c | 17 +-
src/namestore/test_namestore_api_lookup_shadow.c | 17 +-
.../test_namestore_api_lookup_shadow_filter.c | 17 +-
src/namestore/test_namestore_api_monitoring.c | 12 +-
.../test_namestore_api_monitoring_existing.c | 12 +-
src/namestore/test_namestore_api_remove.c | 11 +-
...test_namestore_api_remove_not_existing_record.c | 9 +-
src/namestore/test_namestore_api_store.c | 9 +-
src/namestore/test_namestore_api_store_update.c | 13 +-
src/namestore/test_namestore_api_zone_iteration.c | 39 +-
.../test_namestore_api_zone_iteration_nick.c | 14 +-
...st_namestore_api_zone_iteration_specific_zone.c | 14 +-
.../test_namestore_api_zone_iteration_stop.c | 39 +-
src/namestore/test_namestore_api_zone_to_name.c | 18 +-
src/namestore/test_plugin_namestore.c | 6 +-
src/namestore/test_plugin_rest_namestore.sh | 21 +-
src/nse/gnunet-nse-profiler.c | 2 +-
src/peerinfo-tool/gnunet-peerinfo.c | 4 +-
src/peerinfo-tool/plugin_rest_peerinfo.c | 4 +-
src/pq/pq.c | 45 +-
src/pq/pq_eval.c | 6 +-
src/pq/pq_query_helper.c | 126 +-
src/pq/pq_result_helper.c | 101 +-
src/pq/test_pq.c | 17 +-
src/pt/test_gns_vpn.c | 2 +-
src/reclaim/Makefile.am | 1 +
src/reclaim/gnunet-reclaim.c | 14 +-
src/reclaim/gnunet-service-reclaim.c | 26 +-
src/reclaim/gnunet-service-reclaim_tickets.c | 36 +-
src/reclaim/gnunet-service-reclaim_tickets.h | 12 +-
src/reclaim/oidc_helper.c | 73 +-
src/reclaim/oidc_helper.h | 10 +-
src/reclaim/plugin_rest_openid_connect.c | 57 +-
src/reclaim/plugin_rest_reclaim.c | 44 +-
src/reclaim/reclaim.h | 26 +-
src/reclaim/reclaim_api.c | 30 +-
src/reclaim/test_reclaim_attribute.c | 2 -
src/regex/regex_block_lib.c | 8 +-
src/regex/regex_internal_dht.c | 9 +-
src/regex/regex_test_graph.c | 9 +-
src/revocation/Makefile.am | 3 +
src/revocation/gnunet-revocation-tvg.c | 43 +-
src/revocation/gnunet-revocation.c | 71 +-
src/revocation/gnunet-service-revocation.c | 75 +-
src/revocation/plugin_block_revocation.c | 23 +-
src/revocation/revocation.h | 11 +-
src/revocation/revocation_api.c | 182 +-
src/revocation/test_revocation.c | 20 +-
src/set/gnunet-service-set_union.c | 18 +-
src/set/set_api.c | 3 +-
src/setu/gnunet-service-setu.c | 20 +-
src/statistics/statistics_api.c | 2 +-
src/testbed-logger/gnunet-service-testbed-logger.c | 2 +-
src/testbed/gnunet-service-testbed_cpustatus.c | 2 +-
src/testbed/test_testbed_api_template.conf | 2 +-
src/testbed/testbed_api.c | 2 +-
src/testbed/testbed_api_topology.c | 6 +-
src/transport/gnunet-communicator-udp.c | 494 +-
src/transport/gnunet-service-transport.c | 2 +
src/transport/plugin_transport_http_client.c | 15 +-
src/transport/plugin_transport_http_common.c | 2 +-
src/transport/plugin_transport_http_server.c | 24 +-
src/transport/plugin_transport_tcp.c | 12 +-
src/transport/plugin_transport_udp.c | 15 +-
src/transport/plugin_transport_unix.c | 4 +-
src/transport/tcp_connection_legacy.c | 16 +-
src/transport/tcp_service_legacy.c | 2 +-
src/transport/test_communicator_basic.c | 206 +-
src/transport/transport-testing2.c | 7 +
src/util/bio.c | 4 +-
src/util/client.c | 2 +-
src/util/configuration_loader.c | 15 +-
src/util/os_installation.c | 2 +
src/util/program.c | 25 +-
src/util/service.c | 4 +-
src/util/strings.c | 25 +-
src/zonemaster/Makefile.am | 3 +-
src/zonemaster/gnunet-service-zonemaster-monitor.c | 8 +-
src/zonemaster/gnunet-service-zonemaster.c | 8 +-
246 files changed, 25668 insertions(+), 5387 deletions(-)
diff --git a/.buildbot/firefly-x86_64-amdepyc_test_tng.sh
b/.buildbot/firefly-x86_64-amdepyc_test_tng.sh
index 30339d7c3..162363b5a 100755
--- a/.buildbot/firefly-x86_64-amdepyc_test_tng.sh
+++ b/.buildbot/firefly-x86_64-amdepyc_test_tng.sh
@@ -3,6 +3,6 @@
# echo "Skipped"
pushd src/transport
-make check TESTS='test_communicator_basic-tcp test_communicator_rekey-tcp
test_communicator_basic-unix test_communicator_basic-udp'
+make check TESTS='test_communicator_basic-tcp test_communicator_rekey-tcp
test_communicator_basic-unix test_communicator_basic-udp
test_communicator_backchannel-udp'
pkill --signal 9 -U buildbot gnunet
popd
diff --git a/README.1st b/README.1st
index 3d000a23f..c25992351 100644
--- a/README.1st
+++ b/README.1st
@@ -253,4 +253,5 @@ We reserve judgement (due to lack of data) on:
* credential
* abe
* rest
+* messenger
diff --git a/bin/rename.sh b/bin/rename.sh
index bf3c767c5..eec77e277 100755
--- a/bin/rename.sh
+++ b/bin/rename.sh
@@ -1,6 +1,6 @@
#!/bin/sh
# This script is in the public domain.
-for n in `find * -name "*.c"` `find * -name "*.h"` `find * -name "*.am"` `find
* -name "*.conf"` `find * -name "*.conf.in"`
+for n in `find * -name "*.c"` `find * -name "*.h"` `find * -name "*.am"` `find
* -name "*.conf"` `find * -name "*.conf.in"`
do
cat $n | sed -e "s/$1/$2/g" > $n.new
mv $n.new $n || echo "Move failed: $n.new to $n"
diff --git a/configure.ac b/configure.ac
index 3cf7e6cb6..a9594a56c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1335,7 +1335,7 @@ CPPFLAGS=$SAVE_CPPFLAGS
# test for postgres:
postgres=false
-AX_LIB_POSTGRESQL([9.5],
+AX_LIB_POSTGRESQL([12.0],
[CPPFLAGS="$CPPFLAGS $POSTGRESQL_CPPFLAGS"
AC_CHECK_HEADERS([libpq-fe.h],
postgres=true)
@@ -1817,6 +1817,16 @@ AC_MSG_RESULT($use_gcov)
AM_CONDITIONAL([USE_COVERAGE], [test "x$use_gcov" = "xyes"])
+# Temporarily disable a specific piece of code until TNG is out.
+AC_ARG_ENABLE([transport-timing-diagnostic],
+ [AS_HELP_STRING([--enable-transport-timing-diagnostic],
+ [enable logging of transport (not TNG) sending
times])],
+ [enable_ttd=yes],
+ [enable_ttd=no])
+AS_IF([test "x$enable_ttd" = "xyes"],
+ [AC_DEFINE([ENABLE_TTD], [1], [Define if transport (not TNG) should warn
about sending times.])])
+
+
# version info
# TODO: git blame says this predates our switch to git.
# git-svn should be adjusted to simply git, or
@@ -1965,6 +1975,8 @@ src/zonemaster/zonemaster.conf
src/rest/Makefile
src/abe/Makefile
src/reclaim/Makefile
+src/messenger/Makefile
+src/messenger/messenger.conf
pkgconfig/Makefile
pkgconfig/gnunetarm.pc
pkgconfig/gnunetats.pc
diff --git a/pkgconfig/gnunetmessenger.pc.in b/pkgconfig/gnunetmessenger.pc.in
new file mode 100644
index 000000000..465663d0c
--- /dev/null
+++ b/pkgconfig/gnunetmessenger.pc.in
@@ -0,0 +1,12 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: GNUnet MESSENGER
+Description: Instant messaging based on the CADET subsystem
+URL: https://gnunet.org
+Version: @VERSION@
+Requires:
+Libs: -L${libdir} -lgnunetmessenger_common -lgnunetmessenger
+Cflags: -I${includedir}
diff --git a/po/LINGUAS b/po/LINGUAS
index 0c3dbe3fa..5882d3d7e 100644
--- a/po/LINGUAS
+++ b/po/LINGUAS
@@ -1,2 +1,2 @@
# set of available languages
-vi de sv es zh_CN fr it
+vi de sv es zh_CN fr it sr
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 36d948d93..00bdd7cbc 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -185,6 +185,7 @@ src/gnsrecord/gnsrecord_crypto.c
src/gnsrecord/gnsrecord_misc.c
src/gnsrecord/gnsrecord_serialization.c
src/gnsrecord/gnunet-gnsrecord-tvg.c
+src/gnsrecord/json_gnsrecord.c
src/gnsrecord/plugin_gnsrecord_dns.c
src/hello/address.c
src/hello/gnunet-hello.c
@@ -201,9 +202,30 @@ src/identity/identity_api_suffix_lookup.c
src/identity/plugin_rest_identity.c
src/json/json.c
src/json/json_generator.c
-src/json/json_gnsrecord.c
src/json/json_helper.c
src/json/json_mhd.c
+src/messenger/gnunet-messenger.c
+src/messenger/gnunet-service-messenger.c
+src/messenger/gnunet-service-messenger_basement.c
+src/messenger/gnunet-service-messenger_contact.c
+src/messenger/gnunet-service-messenger_handle.c
+src/messenger/gnunet-service-messenger_list_handles.c
+src/messenger/gnunet-service-messenger_list_messages.c
+src/messenger/gnunet-service-messenger_message_handle.c
+src/messenger/gnunet-service-messenger_message_kind.c
+src/messenger/gnunet-service-messenger_message_recv.c
+src/messenger/gnunet-service-messenger_message_send.c
+src/messenger/gnunet-service-messenger_message_store.c
+src/messenger/gnunet-service-messenger_room.c
+src/messenger/gnunet-service-messenger_service.c
+src/messenger/gnunet-service-messenger_tunnel.c
+src/messenger/gnunet-service-messenger_util.c
+src/messenger/messenger_api.c
+src/messenger/messenger_api_contact.c
+src/messenger/messenger_api_handle.c
+src/messenger/messenger_api_list_tunnels.c
+src/messenger/messenger_api_message.c
+src/messenger/messenger_api_room.c
src/my/my.c
src/my/my_query_helper.c
src/my/my_result_helper.c
@@ -523,5 +545,7 @@ src/vpn/vpn_api.c
src/zonemaster/gnunet-service-zonemaster.c
src/zonemaster/gnunet-service-zonemaster-monitor.c
src/fs/fs_api.h
+src/include/gnunet_identity_service.h
+src/include/gnunet_messenger_service.h
src/testbed/testbed_api.h
src/testbed/testbed_api_operations.h
diff --git a/po/de.po b/po/de.po
index b352a977e..f02b44dfe 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: 2020-09-06 10:07+0200\n"
+"POT-Creation-Date: 2020-10-13 16:12+0200\n"
"PO-Revision-Date: 2015-03-08 16:16+0100\n"
"Last-Translator: Mario Blättermann <mario.blaettermann@gmail.com>\n"
"Language-Team: German <translation-team-de@lists.sourceforge.net>\n"
@@ -32,8 +32,8 @@ msgid "Issuer public key `%s' is not well-formed\n"
msgstr ""
#: src/abd/gnunet-abd.c:560 src/abd/gnunet-service-abd.c:1747
-#: src/namestore/gnunet-namestore.c:1001
#: src/namestore/gnunet-namestore-fcfsd.c:1154
+#: src/namestore/gnunet-namestore.c:1001
#, fuzzy, c-format
msgid "Failed to connect to namestore\n"
msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n"
@@ -499,81 +499,14 @@ msgstr ""
msgid "Initiating shutdown as requested by client.\n"
msgstr ""
-#: src/ats/gnunet-ats-solver-eval.c:2992 src/ats/gnunet-ats-solver-eval.c:3044
-#, c-format
-msgid ""
-"Could not load quota for network `%s': `%s', assigning default bandwidth "
-"%llu\n"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3011
-#, c-format
-msgid ""
-"No outbound quota configured for network `%s', assigning default bandwidth "
-"%llu\n"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3063
-#, c-format
-msgid ""
-"No outbound quota configure for network `%s', assigning default bandwidth "
-"%llu\n"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3552 src/ats-tests/gnunet-solver-eval.c:997
-msgid "solver to use"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3557
-#: src/ats-tests/gnunet-solver-eval.c:1003
-#: src/ats-tests/gnunet-solver-eval.c:1008
-msgid "experiment to use"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3564
-msgid "print logging"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3569
-msgid "save logging to disk"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3574
-msgid "disable normalization"
-msgstr ""
-
-#: src/ats/gnunet-service-ats_plugins.c:326
-#, c-format
-msgid ""
-"Could not load %s quota for network `%s': `%s', assigning default bandwidth "
-"%llu\n"
-msgstr ""
-
-#: src/ats/gnunet-service-ats_plugins.c:336
-#, c-format
-msgid "%s quota configured for network `%s' is %llu\n"
-msgstr ""
-
-#: src/ats/gnunet-service-ats_plugins.c:382
-#, c-format
-msgid ""
-"No %s-quota configured for network `%s', assigning default bandwidth %llu\n"
-msgstr ""
-
-#: src/ats/gnunet-service-ats_plugins.c:474
-#, fuzzy, c-format
-msgid "Failed to initialize solver `%s'!\n"
-msgstr "SQLite Datenbank konnte nicht initialisiert werden.\n"
-
-#: src/ats/plugin_ats_proportional.c:1142
-#, fuzzy, c-format
-msgid "Invalid %s configuration %f \n"
-msgstr "Konfiguration konnte nicht aus %s geladen werden\n"
+#: src/ats-tests/ats-testing-log.c:896
+msgid "Stop logging\n"
+msgstr "Protokollierung stoppen\n"
-#: src/ats/plugin_ats_proportional.c:1165
+#: src/ats-tests/ats-testing-log.c:952
#, fuzzy, c-format
-msgid "Invalid %s configuration %f\n"
-msgstr " gconfig\tGTK Konfiguration\n"
+msgid "Start logging `%s'\n"
+msgstr "Collection `%s' begonnen.\n"
#: src/ats-tests/ats-testing.c:420
#, c-format
@@ -585,15 +518,6 @@ msgstr ""
msgid "Failed to connect master peer [%u] with slave [%u]\n"
msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n"
-#: src/ats-tests/ats-testing-log.c:896
-msgid "Stop logging\n"
-msgstr "Protokollierung stoppen\n"
-
-#: src/ats-tests/ats-testing-log.c:952
-#, fuzzy, c-format
-msgid "Start logging `%s'\n"
-msgstr "Collection `%s' begonnen.\n"
-
#: src/ats-tests/gnunet-ats-sim.c:92
#, c-format
msgid ""
@@ -601,6 +525,16 @@ msgid ""
"= %u KiB/s\n"
msgstr ""
+#: src/ats-tests/gnunet-solver-eval.c:997 src/ats/gnunet-ats-solver-eval.c:3552
+msgid "solver to use"
+msgstr ""
+
+#: src/ats-tests/gnunet-solver-eval.c:1003
+#: src/ats-tests/gnunet-solver-eval.c:1008
+#: src/ats/gnunet-ats-solver-eval.c:3557
+msgid "experiment to use"
+msgstr ""
+
#: src/ats-tool/gnunet-ats.c:299
#, c-format
msgid "%u address resolutions had a timeout\n"
@@ -718,6 +652,72 @@ msgstr ""
msgid "Print information about ATS state"
msgstr "Informationen über andere GNUnet Knoten ausgeben."
+#: src/ats/gnunet-ats-solver-eval.c:2992 src/ats/gnunet-ats-solver-eval.c:3044
+#, c-format
+msgid ""
+"Could not load quota for network `%s': `%s', assigning default bandwidth "
+"%llu\n"
+msgstr ""
+
+#: src/ats/gnunet-ats-solver-eval.c:3011
+#, c-format
+msgid ""
+"No outbound quota configured for network `%s', assigning default bandwidth "
+"%llu\n"
+msgstr ""
+
+#: src/ats/gnunet-ats-solver-eval.c:3063
+#, c-format
+msgid ""
+"No outbound quota configure for network `%s', assigning default bandwidth "
+"%llu\n"
+msgstr ""
+
+#: src/ats/gnunet-ats-solver-eval.c:3564
+msgid "print logging"
+msgstr ""
+
+#: src/ats/gnunet-ats-solver-eval.c:3569
+msgid "save logging to disk"
+msgstr ""
+
+#: src/ats/gnunet-ats-solver-eval.c:3574
+msgid "disable normalization"
+msgstr ""
+
+#: src/ats/gnunet-service-ats_plugins.c:326
+#, c-format
+msgid ""
+"Could not load %s quota for network `%s': `%s', assigning default bandwidth "
+"%llu\n"
+msgstr ""
+
+#: src/ats/gnunet-service-ats_plugins.c:336
+#, c-format
+msgid "%s quota configured for network `%s' is %llu\n"
+msgstr ""
+
+#: src/ats/gnunet-service-ats_plugins.c:382
+#, c-format
+msgid ""
+"No %s-quota configured for network `%s', assigning default bandwidth %llu\n"
+msgstr ""
+
+#: src/ats/gnunet-service-ats_plugins.c:474
+#, fuzzy, c-format
+msgid "Failed to initialize solver `%s'!\n"
+msgstr "SQLite Datenbank konnte nicht initialisiert werden.\n"
+
+#: src/ats/plugin_ats_proportional.c:1142
+#, fuzzy, c-format
+msgid "Invalid %s configuration %f \n"
+msgstr "Konfiguration konnte nicht aus %s geladen werden\n"
+
+#: src/ats/plugin_ats_proportional.c:1165
+#, fuzzy, c-format
+msgid "Invalid %s configuration %f\n"
+msgstr " gconfig\tGTK Konfiguration\n"
+
#: src/auction/gnunet-auction-create.c:163
msgid "description of the item to be sold"
msgstr ""
@@ -854,6 +854,28 @@ msgstr "Ausführlicherer Modus (empfangene Werte ausgeben)"
msgid "Connection to conversation service lost, trying to reconnect\n"
msgstr ""
+#: src/conversation/gnunet-conversation-test.c:120
+#, c-format
+msgid ""
+"\n"
+"End of transmission. Have a GNU day.\n"
+msgstr ""
+
+#: src/conversation/gnunet-conversation-test.c:146
+#, c-format
+msgid ""
+"\n"
+"We are now playing your recording back. If you can hear it, your audio "
+"settings are working..."
+msgstr ""
+
+#: src/conversation/gnunet-conversation-test.c:218
+#, c-format
+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.c:264
#, c-format
msgid "Incoming call from `%s'. Please /accept %u or /cancel %u the call.\n"
@@ -1113,30 +1135,8 @@ msgstr ""
msgid "Enables having a conversation with other GNUnet users."
msgstr ""
-#: src/conversation/gnunet-conversation-test.c:120
-#, c-format
-msgid ""
-"\n"
-"End of transmission. Have a GNU day.\n"
-msgstr ""
-
-#: src/conversation/gnunet-conversation-test.c:146
-#, c-format
-msgid ""
-"\n"
-"We are now playing your recording back. If you can hear it, your audio "
-"settings are working..."
-msgstr ""
-
-#: src/conversation/gnunet-conversation-test.c:218
-#, c-format
-msgid ""
-"We will now be recording you for %s. After that time, the recording will be "
-"played back to you..."
-msgstr ""
-
-#: src/conversation/gnunet_gst.c:664
#: src/conversation/gnunet-helper-audio-playback-gst.c:363
+#: src/conversation/gnunet_gst.c:664
#, c-format
msgid "Read error from STDIN: %d %s\n"
msgstr "Fehler beim Lesen aus STDIN: %d %s\n"
@@ -1942,17 +1942,17 @@ msgstr "`%s' an `%s' schlug fehl bei %s:%d mit dem
Fehler: %s\n"
msgid "Mysql database running\n"
msgstr "MySQL-Datenbank läuft\n"
-#: src/datastore/plugin_datastore_postgres.c:278
-#: src/datastore/plugin_datastore_postgres.c:891
+#: src/datastore/plugin_datastore_postgres.c:284
+#: src/datastore/plugin_datastore_postgres.c:897
msgid "Postgress exec failure"
msgstr ""
-#: src/datastore/plugin_datastore_postgres.c:852
+#: src/datastore/plugin_datastore_postgres.c:858
#, fuzzy
msgid "Failed to drop table from database.\n"
msgstr "Fehler beim Binden an UDP Port %d.\n"
-#: src/datastore/plugin_datastore_postgres.c:950
+#: src/datastore/plugin_datastore_postgres.c:956
msgid "Postgres database running\n"
msgstr "PostgreSQL-Datenbank läuft\n"
@@ -2059,89 +2059,42 @@ msgstr ""
msgid "Prints all packets that go through the DHT."
msgstr ""
-#: src/dht/gnunet_dht_profiler.c:922 src/testbed/gnunet-testbed-profiler.c:255
-#, c-format
-msgid "Exiting as the number of peers is %u\n"
+#: src/dht/gnunet-dht-put.c:133
+msgid "Must provide KEY and DATA for DHT put!\n"
msgstr ""
-#: src/dht/gnunet_dht_profiler.c:955 src/rps/gnunet-rps-profiler.c:3194
-#, fuzzy
-msgid "number of peers to start"
-msgstr "Anzahl an Durchläufen"
+#: src/dht/gnunet-dht-put.c:140
+#, fuzzy, c-format
+msgid "Could not connect to DHT service!\n"
+msgstr "Verbindung zum %s-Dienst ist fehlgeschlagen!\n"
-#: src/dht/gnunet_dht_profiler.c:961
-msgid "number of PUTs to perform per peer"
+#: src/dht/gnunet-dht-put.c:151
+#, c-format
+msgid "Issuing put request for `%s' with data `%s'!\n"
msgstr ""
-#: src/dht/gnunet_dht_profiler.c:967 src/nse/gnunet-nse-profiler.c:872
-#: src/testbed/gnunet-testbed-profiler.c:305
-msgid "name of the file with the login information for the testbed"
+#: src/dht/gnunet-dht-put.c:187
+msgid "the data to insert under the key"
msgstr ""
-#: src/dht/gnunet_dht_profiler.c:973
-msgid "delay between rounds for collecting statistics (default: 30 sec)"
+#: src/dht/gnunet-dht-put.c:193
+msgid "how long to store this entry in the dht (in seconds)"
msgstr ""
-#: src/dht/gnunet_dht_profiler.c:979
-msgid "delay to start doing PUTs (default: 1 sec)"
+#: src/dht/gnunet-dht-put.c:208
+msgid "how many replicas to create"
msgstr ""
-#: src/dht/gnunet_dht_profiler.c:985
-msgid "delay to start doing GETs (default: 5 min)"
+#: src/dht/gnunet-dht-put.c:212
+msgid "use DHT's record route option"
msgstr ""
-#: src/dht/gnunet_dht_profiler.c:990
-msgid "replication degree for DHT PUTs"
+#: src/dht/gnunet-dht-put.c:217
+msgid "the type to insert data as"
msgstr ""
-#: src/dht/gnunet_dht_profiler.c:996
-msgid "chance that a peer is selected at random for PUTs"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1002
-msgid "timeout for DHT PUT and GET requests (default: 1 min)"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1023
-msgid "Measure quality and performance of the DHT service."
-msgstr ""
-
-#: src/dht/gnunet-dht-put.c:133
-msgid "Must provide KEY and DATA for DHT put!\n"
-msgstr ""
-
-#: src/dht/gnunet-dht-put.c:140
-#, fuzzy, c-format
-msgid "Could not connect to DHT service!\n"
-msgstr "Verbindung zum %s-Dienst ist fehlgeschlagen!\n"
-
-#: src/dht/gnunet-dht-put.c:151
-#, c-format
-msgid "Issuing put request for `%s' with data `%s'!\n"
-msgstr ""
-
-#: src/dht/gnunet-dht-put.c:187
-msgid "the data to insert under the key"
-msgstr ""
-
-#: src/dht/gnunet-dht-put.c:193
-msgid "how long to store this entry in the dht (in seconds)"
-msgstr ""
-
-#: src/dht/gnunet-dht-put.c:208
-msgid "how many replicas to create"
-msgstr ""
-
-#: src/dht/gnunet-dht-put.c:212
-msgid "use DHT's record route option"
-msgstr ""
-
-#: src/dht/gnunet-dht-put.c:217
-msgid "the type to insert data as"
-msgstr ""
-
-#: src/dht/gnunet-dht-put.c:232
-msgid "Issue a PUT request to the GNUnet DHT insert DATA under KEY."
+#: src/dht/gnunet-dht-put.c:232
+msgid "Issue a PUT request to the GNUnet DHT insert DATA under KEY."
msgstr ""
#: src/dht/gnunet-service-dht_clients.c:367
@@ -2370,6 +2323,53 @@ msgstr ""
msgid "# DHT requests combined"
msgstr "# dht Anfragen weitergeleitet"
+#: src/dht/gnunet_dht_profiler.c:922 src/testbed/gnunet-testbed-profiler.c:255
+#, c-format
+msgid "Exiting as the number of peers is %u\n"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:955 src/rps/gnunet-rps-profiler.c:3194
+#, fuzzy
+msgid "number of peers to start"
+msgstr "Anzahl an Durchläufen"
+
+#: src/dht/gnunet_dht_profiler.c:961
+msgid "number of PUTs to perform per peer"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:967 src/nse/gnunet-nse-profiler.c:872
+#: src/testbed/gnunet-testbed-profiler.c:305
+msgid "name of the file with the login information for the testbed"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:973
+msgid "delay between rounds for collecting statistics (default: 30 sec)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:979
+msgid "delay to start doing PUTs (default: 1 sec)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:985
+msgid "delay to start doing GETs (default: 5 min)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:990
+msgid "replication degree for DHT PUTs"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:996
+msgid "chance that a peer is selected at random for PUTs"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1002
+msgid "timeout for DHT PUT and GET requests (default: 1 min)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1023
+msgid "Measure quality and performance of the DHT service."
+msgstr ""
+
#: src/dht/plugin_block_dht.c:189
#, fuzzy, c-format
msgid "Block not of type %u\n"
@@ -3319,15 +3319,6 @@ msgid ""
"chk/...)"
msgstr ""
-#: src/fs/gnunet-fs.c:128
-msgid "print a list of all indexed files"
-msgstr ""
-
-#: src/fs/gnunet-fs.c:141
-#, fuzzy
-msgid "Special file-sharing operations"
-msgstr "Alle Optionen anzeigen"
-
#: src/fs/gnunet-fs-profiler.c:211
msgid "run the experiment with COUNT peers"
msgstr ""
@@ -3344,6 +3335,15 @@ msgstr ""
msgid "run a testbed to measure file-sharing performance"
msgstr ""
+#: src/fs/gnunet-fs.c:128
+msgid "print a list of all indexed files"
+msgstr ""
+
+#: src/fs/gnunet-fs.c:141
+#, fuzzy
+msgid "Special file-sharing operations"
+msgstr "Alle Optionen anzeigen"
+
#: src/fs/gnunet-publish.c:219 src/fs/gnunet-publish.c:234
#, c-format
msgid "Publishing `%s' at %llu/%llu (%s remaining)\n"
@@ -4042,52 +4042,6 @@ msgstr ""
msgid "look for GNS2DNS records instead of ANY"
msgstr ""
-#: src/gns/gnunet-gns.c:257
-#, fuzzy, c-format
-msgid "`%s' is not a valid DNS domain name\n"
-msgstr "»%s« ist keine gültige IP-Adresse.\n"
-
-#: src/gns/gnunet-gns.c:267 src/util/dnsparser.c:254
-#, c-format
-msgid "Failed to convert DNS IDNA name `%s' to UTF-8: %s\n"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:281
-msgid "Cannot resolve using GNS: GNUnet peer not running\n"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:305
-#, c-format
-msgid "Invalid typename specified, assuming `ANY'\n"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:340
-msgid "Lookup a record for the given name"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:346
-#, fuzzy
-msgid "Specify the type of the record to lookup"
-msgstr "Die Priorität des Inhalts angeben"
-
-#: src/gns/gnunet-gns.c:352
-#, fuzzy
-msgid "Specify a timeout for the lookup"
-msgstr "Die Priorität des Inhalts angeben"
-
-#: src/gns/gnunet-gns.c:356
-msgid "No unneeded output"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:361
-msgid "DNS Compatibility: Name is passed in IDNA instead of UTF-8"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:375
-#, fuzzy
-msgid "GNUnet GNS resolver tool"
-msgstr "GNUnet Netzwerk Topologie tracen."
-
#: src/gns/gnunet-gns-import.c:486
msgid "This program will import some GNS authorities into your GNS namestore."
msgstr ""
@@ -4208,6 +4162,52 @@ msgstr ""
msgid "GNUnet GNS proxy"
msgstr ""
+#: src/gns/gnunet-gns.c:257
+#, fuzzy, c-format
+msgid "`%s' is not a valid DNS domain name\n"
+msgstr "»%s« ist keine gültige IP-Adresse.\n"
+
+#: src/gns/gnunet-gns.c:267 src/util/dnsparser.c:254
+#, c-format
+msgid "Failed to convert DNS IDNA name `%s' to UTF-8: %s\n"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:281
+msgid "Cannot resolve using GNS: GNUnet peer not running\n"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:305
+#, c-format
+msgid "Invalid typename specified, assuming `ANY'\n"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:340
+msgid "Lookup a record for the given name"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:346
+#, fuzzy
+msgid "Specify the type of the record to lookup"
+msgstr "Die Priorität des Inhalts angeben"
+
+#: src/gns/gnunet-gns.c:352
+#, fuzzy
+msgid "Specify a timeout for the lookup"
+msgstr "Die Priorität des Inhalts angeben"
+
+#: src/gns/gnunet-gns.c:356
+msgid "No unneeded output"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:361
+msgid "DNS Compatibility: Name is passed in IDNA instead of UTF-8"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:375
+#, fuzzy
+msgid "GNUnet GNS resolver tool"
+msgstr "GNUnet Netzwerk Topologie tracen."
+
#: src/gns/gnunet-service-gns.c:505
#, fuzzy
msgid "Properly base32-encoded public key required"
@@ -4219,8 +4219,8 @@ msgid "Failed to connect to the namecache!\n"
msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n"
#: src/gns/gnunet-service-gns.c:560
-#: src/zonemaster/gnunet-service-zonemaster.c:887
#: src/zonemaster/gnunet-service-zonemaster-monitor.c:444
+#: src/zonemaster/gnunet-service-zonemaster.c:887
#, fuzzy
msgid "Could not connect to DHT!\n"
msgstr "Verbindung zu gnunetd konnte nicht hergestellt werden.\n"
@@ -4722,7 +4722,7 @@ msgid "# hostlist advertisements send"
msgstr "# Bekanntmachungen von anderen übertragen"
#: src/hostlist/gnunet-daemon-hostlist_server.c:674
-#: src/transport/gnunet-service-transport.c:2659
+#: src/transport/gnunet-service-transport.c:2661
#, fuzzy
msgid "Could not access PEERINFO service. Exiting.\n"
msgstr "Auf die Namespace Informationen konnte nicht zugegriffen werden.\n"
@@ -4975,6 +4975,70 @@ msgstr "Sqlite-Datenbank läuft\n"
msgid "Failed to setup database at `%s'\n"
msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n"
+#: src/namestore/gnunet-namestore-fcfsd.c:552
+#, fuzzy, c-format
+msgid "Unsupported form value `%s'\n"
+msgstr "Kommando `%s' wird nicht unterstützt. Vorgang wird abgebrochen.\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:579
+#, fuzzy, c-format
+msgid "Failed to create record for domain `%s': %s\n"
+msgstr "Fehler beim Lesen der Freunde-Liste von `%s'\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:600
+msgid "Error when mapping zone to name\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:632
+#, c-format
+msgid "Found existing name `%s' for the given key\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:694
+#, c-format
+msgid "Found %u existing records for domain `%s'\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:784
+#, fuzzy, c-format
+msgid "Failed to create page for `%s'\n"
+msgstr "Fehler beim Aktualisieren der Daten des Moduls `%s'\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:803
+#, fuzzy, c-format
+msgid "Failed to setup post processor for `%s'\n"
+msgstr "Fehler beim Aktualisieren der Daten des Moduls `%s'\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:840
+msgid "Domain name must not contain `.'\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:849
+msgid "Domain name must not contain `+'\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1084
+msgid "No ego configured for `fcfsd` subsystem\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1115
+#, fuzzy
+msgid "Failed to start HTTP server\n"
+msgstr "Fehler beim Senden einer `%s' Anfrage an den SMTP Server.\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1163
+#, fuzzy
+msgid "Failed to connect to identity\n"
+msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1190
+msgid "name of the zone that is to be managed by FCFSD"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1210
+msgid "GNU Name System First Come First Serve name registration service"
+msgstr ""
+
#: src/namestore/gnunet-namestore.c:334
#, c-format
msgid "Adding record failed: %s\n"
@@ -5201,70 +5265,6 @@ msgstr ""
msgid "name of the ego controlling the zone"
msgstr ""
-#: src/namestore/gnunet-namestore-fcfsd.c:552
-#, fuzzy, c-format
-msgid "Unsupported form value `%s'\n"
-msgstr "Kommando `%s' wird nicht unterstützt. Vorgang wird abgebrochen.\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:579
-#, fuzzy, c-format
-msgid "Failed to create record for domain `%s': %s\n"
-msgstr "Fehler beim Lesen der Freunde-Liste von `%s'\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:600
-msgid "Error when mapping zone to name\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:632
-#, c-format
-msgid "Found existing name `%s' for the given key\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:694
-#, c-format
-msgid "Found %u existing records for domain `%s'\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:784
-#, fuzzy, c-format
-msgid "Failed to create page for `%s'\n"
-msgstr "Fehler beim Aktualisieren der Daten des Moduls `%s'\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:803
-#, fuzzy, c-format
-msgid "Failed to setup post processor for `%s'\n"
-msgstr "Fehler beim Aktualisieren der Daten des Moduls `%s'\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:840
-msgid "Domain name must not contain `.'\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:849
-msgid "Domain name must not contain `+'\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1084
-msgid "No ego configured for `fcfsd` subsystem\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1115
-#, fuzzy
-msgid "Failed to start HTTP server\n"
-msgstr "Fehler beim Senden einer `%s' Anfrage an den SMTP Server.\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1163
-#, fuzzy
-msgid "Failed to connect to identity\n"
-msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1190
-msgid "name of the zone that is to be managed by FCFSD"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1210
-msgid "GNU Name System First Come First Serve name registration service"
-msgstr ""
-
#: src/namestore/gnunet-service-namestore.c:866
#, c-format
msgid "Failed to replicate block in namecache: %s\n"
@@ -5587,10 +5587,6 @@ msgstr "Kommando `%s' wurde nicht gefunden!\n"
msgid "`upnpc' command not found\n"
msgstr "Kommando `%s' wurde nicht gefunden!\n"
-#: src/nse/gnunet-nse.c:124
-msgid "Show network size estimates from NSE service."
-msgstr ""
-
#: src/nse/gnunet-nse-profiler.c:857
msgid "limit to the number of connections to NSE services, 0 for none"
msgstr ""
@@ -5612,70 +5608,17 @@ msgid "delay between rounds"
msgstr ""
#: src/nse/gnunet-nse-profiler.c:912
-msgid "Measure quality and performance of the NSE service."
-msgstr ""
-
-#: src/nse/gnunet-service-nse.c:1443
-#: src/revocation/gnunet-service-revocation.c:834 src/util/gnunet-scrypt.c:257
-msgid "Value is too large.\n"
-msgstr ""
-
-#: src/peerinfo/gnunet-service-peerinfo.c:175
-#, fuzzy, c-format
-msgid "Removing expired address of transport `%s'\n"
-msgstr "Verfügbare(r) Transport(e): %s\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:306
-#, fuzzy, c-format
-msgid "Failed to parse HELLO in file `%s': %s\n"
-msgstr "Datei wurde als `%s' gespeichert.\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:323
-#: src/peerinfo/gnunet-service-peerinfo.c:348
-#, fuzzy, c-format
-msgid "Failed to parse HELLO in file `%s'\n"
-msgstr "Datei wurde als `%s' gespeichert.\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:426
-msgid "# peers known"
-msgstr ""
-
-#: src/peerinfo/gnunet-service-peerinfo.c:468
-#, c-format
-msgid ""
-"File `%s' in directory `%s' does not match naming convention. Removed.\n"
-msgstr ""
-"Die Datei »%s« im Verzeichnis »%s« entspricht nicht der Namenskonvention. "
-"Die Datei wurde entfernt.\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:624
-#, fuzzy, c-format
-msgid "Scanning directory `%s'\n"
-msgstr "==> Verzeichnis `%s':\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:631
-#, fuzzy, c-format
-msgid "Still no peers found in `%s'!\n"
-msgstr "Dienst `%s' konnte nicht ordentlich entladen werden!\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:1024
-#, fuzzy, c-format
-msgid "Cleaning up directory `%s'\n"
-msgstr "==> Verzeichnis `%s':\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:1319
-#, c-format
-msgid "Importing HELLOs from `%s'\n"
+msgid "Measure quality and performance of the NSE service."
msgstr ""
-#: src/peerinfo/gnunet-service-peerinfo.c:1332
-msgid "Skipping import of included HELLOs\n"
+#: src/nse/gnunet-nse.c:124
+msgid "Show network size estimates from NSE service."
msgstr ""
-#: src/peerinfo/peerinfo_api.c:217
-#, fuzzy
-msgid "Failed to receive response from `PEERINFO' service."
-msgstr "Fehler beim Empfangen der Antwort von gnunetd auf die `%s' Nachricht\n"
+#: src/nse/gnunet-service-nse.c:1443
+#: src/revocation/gnunet-service-revocation.c:834 src/util/gnunet-scrypt.c:257
+msgid "Value is too large.\n"
+msgstr ""
#: src/peerinfo-tool/gnunet-peerinfo.c:237
#, fuzzy, c-format
@@ -5773,6 +5716,63 @@ msgstr "Anwendung `%s' konnte nicht initialisiert
werden.\n"
msgid "Peerinfo REST API initialized\n"
msgstr " Verbindung fehlgeschlagen\n"
+#: src/peerinfo/gnunet-service-peerinfo.c:175
+#, fuzzy, c-format
+msgid "Removing expired address of transport `%s'\n"
+msgstr "Verfügbare(r) Transport(e): %s\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:306
+#, fuzzy, c-format
+msgid "Failed to parse HELLO in file `%s': %s\n"
+msgstr "Datei wurde als `%s' gespeichert.\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:323
+#: src/peerinfo/gnunet-service-peerinfo.c:348
+#, fuzzy, c-format
+msgid "Failed to parse HELLO in file `%s'\n"
+msgstr "Datei wurde als `%s' gespeichert.\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:426
+msgid "# peers known"
+msgstr ""
+
+#: src/peerinfo/gnunet-service-peerinfo.c:468
+#, c-format
+msgid ""
+"File `%s' in directory `%s' does not match naming convention. Removed.\n"
+msgstr ""
+"Die Datei »%s« im Verzeichnis »%s« entspricht nicht der Namenskonvention. "
+"Die Datei wurde entfernt.\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:624
+#, fuzzy, c-format
+msgid "Scanning directory `%s'\n"
+msgstr "==> Verzeichnis `%s':\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:631
+#, fuzzy, c-format
+msgid "Still no peers found in `%s'!\n"
+msgstr "Dienst `%s' konnte nicht ordentlich entladen werden!\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:1024
+#, fuzzy, c-format
+msgid "Cleaning up directory `%s'\n"
+msgstr "==> Verzeichnis `%s':\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:1319
+#, c-format
+msgid "Importing HELLOs from `%s'\n"
+msgstr ""
+
+#: src/peerinfo/gnunet-service-peerinfo.c:1332
+msgid "Skipping import of included HELLOs\n"
+msgstr ""
+
+#: src/peerinfo/peerinfo_api.c:217
+#, fuzzy
+msgid "Failed to receive response from `PEERINFO' service."
+msgstr "Fehler beim Empfangen der Antwort von gnunetd auf die `%s' Nachricht\n"
+
#: src/peerstore/gnunet-peerstore.c:92
msgid "peerstore"
msgstr ""
@@ -6231,18 +6231,6 @@ msgstr ""
msgid "Could not open revocation database file!"
msgstr "Knoten `%s' konnte nicht in der Routing Tabelle gefunden werden!\n"
-#: src/rps/gnunet-rps.c:270
-msgid "Seed a PeerID"
-msgstr ""
-
-#: src/rps/gnunet-rps.c:275
-msgid "Get updates of view (0 for infinite updates)"
-msgstr ""
-
-#: src/rps/gnunet-rps.c:279
-msgid "Get peers from biased stream"
-msgstr ""
-
#: src/rps/gnunet-rps-profiler.c:3200
msgid "duration of the profiling"
msgstr ""
@@ -6260,6 +6248,18 @@ msgstr "Anzahl an Durchläufen"
msgid "Measure quality and performance of the RPS service."
msgstr ""
+#: src/rps/gnunet-rps.c:270
+msgid "Seed a PeerID"
+msgstr ""
+
+#: src/rps/gnunet-rps.c:275
+msgid "Get updates of view (0 for infinite updates)"
+msgstr ""
+
+#: src/rps/gnunet-rps.c:279
+msgid "Get peers from biased stream"
+msgstr ""
+
#: src/scalarproduct/gnunet-scalarproduct.c:229
#, fuzzy
msgid "You must specify at least one message ID to check!\n"
@@ -6315,10 +6315,10 @@ msgstr ""
msgid "Calculate the Vectorproduct with a GNUnet peer."
msgstr ""
-#: src/scalarproduct/gnunet-service-scalarproduct_alice.c:1358
-#: src/scalarproduct/gnunet-service-scalarproduct_bob.c:1355
#: src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c:1118
#: src/scalarproduct/gnunet-service-scalarproduct-ecc_bob.c:1063
+#: src/scalarproduct/gnunet-service-scalarproduct_alice.c:1358
+#: src/scalarproduct/gnunet-service-scalarproduct_bob.c:1355
#, fuzzy
msgid "Connect to CADET failed\n"
msgstr " Verbindung fehlgeschlagen\n"
@@ -6673,6 +6673,17 @@ msgstr ""
msgid "%.s Unknown result code."
msgstr ""
+#: src/testbed/gnunet-testbed-profiler.c:290
+msgid "tolerate COUNT number of continious timeout failures"
+msgstr ""
+
+#: src/testbed/gnunet-testbed-profiler.c:295
+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/gnunet_testbed_mpi_spawn.c:119
#, fuzzy
msgid "Waiting for child to exit.\n"
@@ -6685,17 +6696,6 @@ msgstr ""
msgid "Spawning process `%s'\n"
msgstr "Ungültige Antwort auf `%s'.\n"
-#: src/testbed/gnunet-testbed-profiler.c:290
-msgid "tolerate COUNT number of continious timeout failures"
-msgstr ""
-
-#: src/testbed/gnunet-testbed-profiler.c:295
-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.c:399
#, fuzzy, c-format
msgid "Adding host %u failed with error: %s\n"
@@ -6988,18 +6988,18 @@ msgstr "# HELLO-Meldungen empfangen"
msgid "GNUnet topology control"
msgstr ""
-#: src/transport/gnunet-communicator-tcp.c:3189
-#: src/transport/gnunet-communicator-udp.c:2826
+#: src/transport/gnunet-communicator-tcp.c:3221
+#: src/transport/gnunet-communicator-udp.c:2995
#: src/transport/gnunet-service-tng.c:10014
-#: src/transport/gnunet-service-transport.c:2624
+#: src/transport/gnunet-service-transport.c:2626
msgid "Transport service is lacking key configuration settings. Exiting.\n"
msgstr ""
-#: src/transport/gnunet-communicator-tcp.c:3494
+#: src/transport/gnunet-communicator-tcp.c:3553
msgid "GNUnet TCP communicator"
msgstr ""
-#: src/transport/gnunet-communicator-udp.c:2898
+#: src/transport/gnunet-communicator-udp.c:3067
msgid "GNUnet UDP communicator"
msgstr ""
@@ -7024,50 +7024,50 @@ msgstr "Pfad zu »%s« kann nicht erstellt werden\n"
msgid "GNUnet UNIX domain socket communicator"
msgstr ""
-#: src/transport/gnunet-service-transport_ats.c:137
-msgid "# Addresses given to ATS"
-msgstr ""
-
#: src/transport/gnunet-service-transport.c:445
msgid "# messages dropped due to slow client"
msgstr ""
-#: src/transport/gnunet-service-transport.c:794
+#: src/transport/gnunet-service-transport.c:796
msgid "# bytes payload dropped (other peer was not connected)"
msgstr ""
-#: src/transport/gnunet-service-transport.c:1477
+#: src/transport/gnunet-service-transport.c:1479
msgid "# bytes payload discarded due to not connected peer"
msgstr ""
-#: src/transport/gnunet-service-transport.c:1622
+#: src/transport/gnunet-service-transport.c:1624
msgid "# bytes total received"
msgstr "# Bytes insgesamt empfangen"
-#: src/transport/gnunet-service-transport.c:1712
+#: src/transport/gnunet-service-transport.c:1714
msgid "# bytes payload received"
msgstr "# Bytes Nutzdaten empfangen"
-#: src/transport/gnunet-service-transport.c:2016
-#: src/transport/gnunet-service-transport.c:2450
+#: src/transport/gnunet-service-transport.c:2018
+#: src/transport/gnunet-service-transport.c:2452
msgid "# disconnects due to blacklist"
msgstr ""
-#: src/transport/gnunet-service-transport.c:2454
+#: src/transport/gnunet-service-transport.c:2456
#, fuzzy, c-format
msgid "Disallowing connection to peer `%s' on transport %s\n"
msgstr "Anwendung `%s' konnte nicht initialisiert werden.\n"
-#: src/transport/gnunet-service-transport.c:2549
+#: src/transport/gnunet-service-transport.c:2551
#, c-format
msgid "Adding blacklisting entry for peer `%s'\n"
msgstr ""
-#: src/transport/gnunet-service-transport.c:2558
+#: src/transport/gnunet-service-transport.c:2560
#, c-format
msgid "Adding blacklisting entry for peer `%s':`%s'\n"
msgstr ""
+#: src/transport/gnunet-service-transport_ats.c:137
+msgid "# Addresses given to ATS"
+msgstr ""
+
#: src/transport/gnunet-service-transport_hello.c:195
msgid "# refreshed my HELLO"
msgstr ""
@@ -7393,6 +7393,43 @@ msgstr ""
msgid "# HELLOs given to peerinfo"
msgstr ""
+#: src/transport/gnunet-transport-profiler.c:220
+#, c-format
+msgid "%llu B in %llu ms == %.2f KB/s!\n"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:577
+msgid "send data to peer"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:581
+#, fuzzy
+msgid "receive data from peer"
+msgstr "# Bytes des Typs %d empfangen"
+
+#: src/transport/gnunet-transport-profiler.c:586
+msgid "iterations"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:591
+#, fuzzy
+msgid "number of messages to send"
+msgstr "Anzahl an Durchläufen"
+
+#: src/transport/gnunet-transport-profiler.c:596
+msgid "message size to use"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:601
+#: src/transport/gnunet-transport.c:1404
+msgid "peer identity"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:614
+#: src/transport/gnunet-transport.c:1426
+msgid "Direct access to transport service."
+msgstr "Direkter Zugriff auf den Transportdienst"
+
#: src/transport/gnunet-transport.c:406
#, c-format
msgid "Transmitted %llu bytes/s (%llu bytes in %s)\n"
@@ -7525,11 +7562,6 @@ msgstr ""
msgid "do not resolve hostnames"
msgstr "Keine Rechnernamen auflösen"
-#: src/transport/gnunet-transport.c:1404
-#: src/transport/gnunet-transport-profiler.c:601
-msgid "peer identity"
-msgstr ""
-
#: src/transport/gnunet-transport.c:1408
msgid "monitor plugin sessions"
msgstr ""
@@ -7538,38 +7570,6 @@ msgstr ""
msgid "send data for benchmarking to the other peer (until CTRL-C)"
msgstr ""
-#: src/transport/gnunet-transport.c:1426
-#: src/transport/gnunet-transport-profiler.c:614
-msgid "Direct access to transport service."
-msgstr "Direkter Zugriff auf den Transportdienst"
-
-#: src/transport/gnunet-transport-profiler.c:220
-#, c-format
-msgid "%llu B in %llu ms == %.2f KB/s!\n"
-msgstr ""
-
-#: src/transport/gnunet-transport-profiler.c:577
-msgid "send data to peer"
-msgstr ""
-
-#: src/transport/gnunet-transport-profiler.c:581
-#, fuzzy
-msgid "receive data from peer"
-msgstr "# Bytes des Typs %d empfangen"
-
-#: src/transport/gnunet-transport-profiler.c:586
-msgid "iterations"
-msgstr ""
-
-#: src/transport/gnunet-transport-profiler.c:591
-#, fuzzy
-msgid "number of messages to send"
-msgstr "Anzahl an Durchläufen"
-
-#: src/transport/gnunet-transport-profiler.c:596
-msgid "message size to use"
-msgstr ""
-
#: src/transport/plugin_transport_http_client.c:1489
#: src/transport/plugin_transport_http_server.c:2331
#: src/transport/plugin_transport_http_server.c:3562
@@ -7842,21 +7842,6 @@ msgstr ""
msgid "TCP transport advertises itself as being on port %llu\n"
msgstr ""
-#: src/transport/plugin_transport_udp_broadcasting.c:169
-#, fuzzy
-msgid "# Multicast HELLO beacons received via UDP"
-msgstr "# Bytes empfangen über TCP"
-
-#: src/transport/plugin_transport_udp_broadcasting.c:553
-msgid ""
-"Disabling HELLO broadcasting due to friend-to-friend only configuration!\n"
-msgstr ""
-
-#: src/transport/plugin_transport_udp_broadcasting.c:571
-#, fuzzy, c-format
-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:3169
#, c-format
msgid ""
@@ -7904,6 +7889,21 @@ msgstr "»%s« ist keine gültige IP-Adresse.\n"
msgid "Failed to create UDP network sockets\n"
msgstr "UDP-Sockets können nicht geöffnet werden\n"
+#: src/transport/plugin_transport_udp_broadcasting.c:169
+#, fuzzy
+msgid "# Multicast HELLO beacons received via UDP"
+msgstr "# Bytes empfangen über TCP"
+
+#: src/transport/plugin_transport_udp_broadcasting.c:553
+msgid ""
+"Disabling HELLO broadcasting due to friend-to-friend only configuration!\n"
+msgstr ""
+
+#: src/transport/plugin_transport_udp_broadcasting.c:571
+#, fuzzy, c-format
+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_unix.c:1396
#, fuzzy, c-format
msgid "Cannot bind to `%s'\n"
@@ -8085,7 +8085,7 @@ msgid "do daemonize (detach from terminal)"
msgstr ""
#: src/transport/tcp_service_legacy.c:1397
-#: src/transport/transport-testing2.c:1116 src/util/service.c:2072
+#: src/transport/transport-testing2.c:983 src/util/service.c:2072
#: src/util/service.c:2084
#, fuzzy, c-format
msgid "Malformed configuration file `%s', exit ...\n"
@@ -8757,19 +8757,19 @@ msgid ""
"Fatal internal logic error, process hangs in `%s' (abort with CTRL-C)!\n"
msgstr ""
-#: src/util/os_installation.c:409
+#: src/util/os_installation.c:411
#, c-format
msgid ""
"Could not determine installation path for %s. Set `%s' environment "
"variable.\n"
msgstr ""
-#: src/util/os_installation.c:792
+#: src/util/os_installation.c:794
#, fuzzy, c-format
msgid "Could not find binary `%s' in PATH!\n"
msgstr "Knoten `%s' konnte nicht in der Routing Tabelle gefunden werden!\n"
-#: src/util/os_installation.c:825
+#: src/util/os_installation.c:827
#, c-format
msgid "Binary `%s' exists, but is not SUID\n"
msgstr ""
@@ -8795,17 +8795,17 @@ msgstr "`%s' fehlgeschlagen für die Bibliothek `%s'.
Ort: %s:%d. Fehler: %s\n"
msgid "Could not determine plugin installation path.\n"
msgstr "Öffentliche IP-Adresse konnte nicht ermittelt werden.\n"
-#: src/util/program.c:262
+#: src/util/program.c:267
#, fuzzy, c-format
msgid "Unreadable or malformed configuration file `%s', exit ...\n"
msgstr "Konfigurationsdatei `%s' wurde erzeugt.\n"
-#: src/util/program.c:279
+#: src/util/program.c:284
#, fuzzy, c-format
msgid "Unreadable or malformed default configuration file `%s', exit ...\n"
msgstr "Konfigurationsdatei `%s' wurde erzeugt.\n"
-#: src/util/program.c:294
+#: src/util/program.c:299
#, fuzzy
msgid "Unreadable or malformed configuration, exit ...\n"
msgstr "GNUnet Konfiguration"
@@ -8873,10 +8873,6 @@ msgstr ""
msgid "Attempting to proxy service `%s' to invalid port %d or hostname.\n"
msgstr ""
-#: src/util/strings.c:179
-msgid "b"
-msgstr "b"
-
#: src/util/strings.c:503
#, c-format
msgid "Character sets requested were `%s'->`%s'\n"
@@ -8886,46 +8882,6 @@ msgstr ""
msgid "Failed to expand `$HOME': environment variable `HOME' not set"
msgstr ""
-#: src/util/strings.c:706
-msgid "µs"
-msgstr "µs"
-
-#: src/util/strings.c:710
-msgid "forever"
-msgstr ""
-
-#: src/util/strings.c:712
-msgid "0 ms"
-msgstr "0 ms"
-
-#: src/util/strings.c:716
-msgid "ms"
-msgstr "ms"
-
-#: src/util/strings.c:720
-msgid "s"
-msgstr "s"
-
-#: src/util/strings.c:724
-msgid "m"
-msgstr "m"
-
-#: src/util/strings.c:728
-msgid "h"
-msgstr "h"
-
-#: src/util/strings.c:734
-msgid "day"
-msgstr "Tag"
-
-#: src/util/strings.c:736
-msgid "days"
-msgstr "Tage"
-
-#: src/util/strings.c:764
-msgid "end of time"
-msgstr ""
-
#: src/util/strings.c:1240
msgid "IPv6 address did not start with `['\n"
msgstr "IPv6-Adresse beginnt nicht mit »[«\n"
@@ -9172,12 +9128,39 @@ msgstr "Dienst wird über UDP angeboten"
msgid "Setup tunnels via VPN."
msgstr "Tunnel über VPN einrichten."
-#: src/zonemaster/gnunet-service-zonemaster.c:849
#: src/zonemaster/gnunet-service-zonemaster-monitor.c:420
+#: src/zonemaster/gnunet-service-zonemaster.c:849
#, fuzzy
msgid "Failed to connect to the namestore!\n"
msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n"
+#~ msgid "b"
+#~ msgstr "b"
+
+#~ msgid "µs"
+#~ msgstr "µs"
+
+#~ msgid "0 ms"
+#~ msgstr "0 ms"
+
+#~ msgid "ms"
+#~ msgstr "ms"
+
+#~ msgid "s"
+#~ msgstr "s"
+
+#~ msgid "m"
+#~ msgstr "m"
+
+#~ msgid "h"
+#~ msgstr "h"
+
+#~ msgid "day"
+#~ msgstr "Tag"
+
+#~ msgid "days"
+#~ msgstr "Tage"
+
#, fuzzy, c-format
#~ msgid "Could not acquire lock on file `%s': %s...\n"
#~ msgstr "PID konnte nicht in Datei `%s' geschrieben werden: %s.\n"
diff --git a/po/es.po b/po/es.po
index 646ae9c81..f9a15c50b 100644
--- a/po/es.po
+++ b/po/es.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gnunet 0.9.5a\n"
"Report-Msgid-Bugs-To: gnunet-developers@mail.gnu.org\n"
-"POT-Creation-Date: 2020-09-06 10:07+0200\n"
+"POT-Creation-Date: 2020-10-13 16:12+0200\n"
"PO-Revision-Date: 2013-02-23 17:50+0100\n"
"Last-Translator: Miguel Ángel Arruga Vivas <rosen644835@gmail.com>\n"
"Language-Team: Spanish <es@li.org>\n"
@@ -29,8 +29,8 @@ msgid "Issuer public key `%s' is not well-formed\n"
msgstr "El bloque del tipo %u está mal formado\n"
#: src/abd/gnunet-abd.c:560 src/abd/gnunet-service-abd.c:1747
-#: src/namestore/gnunet-namestore.c:1001
#: src/namestore/gnunet-namestore-fcfsd.c:1154
+#: src/namestore/gnunet-namestore.c:1001
#, c-format
msgid "Failed to connect to namestore\n"
msgstr "Se produjo un fallo al conectar con el almacén de nombres\n"
@@ -525,94 +525,14 @@ msgstr "El servicio «%s» finalizó con estado %s/%d, se
reiniciará en %llu ms
msgid "Initiating shutdown as requested by client.\n"
msgstr "Iniciando apagado bajo petición del cliente.\n"
-#: src/ats/gnunet-ats-solver-eval.c:2992 src/ats/gnunet-ats-solver-eval.c:3044
-#, c-format
-msgid ""
-"Could not load quota for network `%s': `%s', assigning default bandwidth "
-"%llu\n"
-msgstr ""
-"No se pudieron cargar las cuotas para la red «%s»: «%s», asignando el ancho "
-"de banda predeterminado %llu\n"
-
-#: src/ats/gnunet-ats-solver-eval.c:3011
-#, c-format
-msgid ""
-"No outbound quota configured for network `%s', assigning default bandwidth "
-"%llu\n"
-msgstr ""
-"No hay configurada una cuota de salida para la red «%s», asignando el ancho "
-"de banda predeterminado %llu\n"
-
-#: src/ats/gnunet-ats-solver-eval.c:3063
-#, c-format
-msgid ""
-"No outbound quota configure for network `%s', assigning default bandwidth "
-"%llu\n"
-msgstr ""
-"No hay configurada una cuota de salida para la red «%s», asignando el ancho "
-"de banda predeterminado %llu\n"
-
-#: src/ats/gnunet-ats-solver-eval.c:3552 src/ats-tests/gnunet-solver-eval.c:997
-#, fuzzy
-msgid "solver to use"
-msgstr "valor a establecer"
-
-#: src/ats/gnunet-ats-solver-eval.c:3557
-#: src/ats-tests/gnunet-solver-eval.c:1003
-#: src/ats-tests/gnunet-solver-eval.c:1008
-msgid "experiment to use"
-msgstr "experimento para usar"
-
-#: src/ats/gnunet-ats-solver-eval.c:3564
-#, fuzzy
-msgid "print logging"
-msgstr "Iniciando descarga «%s».\n"
-
-#: src/ats/gnunet-ats-solver-eval.c:3569
-msgid "save logging to disk"
-msgstr "guarda protocolo al fichero en disco"
-
-#: src/ats/gnunet-ats-solver-eval.c:3574
-msgid "disable normalization"
-msgstr "deshabilita normalización"
-
-#: src/ats/gnunet-service-ats_plugins.c:326
-#, fuzzy, c-format
-msgid ""
-"Could not load %s quota for network `%s': `%s', assigning default bandwidth "
-"%llu\n"
-msgstr ""
-"No se pudieron cargar las cuotas para la red «%s»: «%s», asignando el ancho "
-"de banda predeterminado %llu\n"
-
-# Miguel: "Inbound" lo he traducido como entrada en todo el texto.
-#: src/ats/gnunet-service-ats_plugins.c:336
-#, fuzzy, c-format
-msgid "%s quota configured for network `%s' is %llu\n"
-msgstr "La cuota de entrada configurada para la red «%s» es %llu\n"
-
-#: src/ats/gnunet-service-ats_plugins.c:382
-#, fuzzy, c-format
-msgid ""
-"No %s-quota configured for network `%s', assigning default bandwidth %llu\n"
+#: src/ats-tests/ats-testing-log.c:896
+msgid "Stop logging\n"
msgstr ""
-"No hay configurada una cuota de salida para la red «%s», asignando el ancho "
-"de banda predeterminado %llu\n"
-
-#: src/ats/gnunet-service-ats_plugins.c:474
-#, fuzzy, c-format
-msgid "Failed to initialize solver `%s'!\n"
-msgstr "¡No se puede inicializar el resolvedor!\n"
-#: src/ats/plugin_ats_proportional.c:1142
-#, fuzzy, c-format
-msgid "Invalid %s configuration %f \n"
-msgstr "Se produjo un fallo al cargar la configuración de %s\n"
-
-#: src/ats/plugin_ats_proportional.c:1165
+#: src/ats-tests/ats-testing-log.c:952
#, fuzzy, c-format
-msgid "Invalid %s configuration %f\n"
-msgstr "Se produjo un fallo al cargar la configuración de %s\n"
+msgid "Start logging `%s'\n"
+msgstr "Iniciando descarga «%s».\n"
#: src/ats-tests/ats-testing.c:420
#, c-format
@@ -624,15 +544,6 @@ msgstr ""
msgid "Failed to connect master peer [%u] with slave [%u]\n"
msgstr "Fallo al conectar a gnunetd.\n"
-#: src/ats-tests/ats-testing-log.c:896
-msgid "Stop logging\n"
-msgstr ""
-
-#: src/ats-tests/ats-testing-log.c:952
-#, fuzzy, c-format
-msgid "Start logging `%s'\n"
-msgstr "Iniciando descarga «%s».\n"
-
#: src/ats-tests/gnunet-ats-sim.c:92
#, c-format
msgid ""
@@ -640,6 +551,17 @@ msgid ""
"= %u KiB/s\n"
msgstr ""
+#: src/ats-tests/gnunet-solver-eval.c:997 src/ats/gnunet-ats-solver-eval.c:3552
+#, fuzzy
+msgid "solver to use"
+msgstr "valor a establecer"
+
+#: src/ats-tests/gnunet-solver-eval.c:1003
+#: src/ats-tests/gnunet-solver-eval.c:1008
+#: src/ats/gnunet-ats-solver-eval.c:3557
+msgid "experiment to use"
+msgstr "experimento para usar"
+
# Miguel: ¿Como podría traducir "resolutions" y "resolve"?
# Son difíciles de no calcar, puesto que no conozco como expresar
# el concepto de obtener una dirección a partir de un nombre
@@ -774,6 +696,84 @@ msgstr "salida prolija (incluye las propiedades de
direcciones del ATS)"
msgid "Print information about ATS state"
msgstr "Imprime información acerca del estado del ATS"
+#: src/ats/gnunet-ats-solver-eval.c:2992 src/ats/gnunet-ats-solver-eval.c:3044
+#, c-format
+msgid ""
+"Could not load quota for network `%s': `%s', assigning default bandwidth "
+"%llu\n"
+msgstr ""
+"No se pudieron cargar las cuotas para la red «%s»: «%s», asignando el ancho "
+"de banda predeterminado %llu\n"
+
+#: src/ats/gnunet-ats-solver-eval.c:3011
+#, c-format
+msgid ""
+"No outbound quota configured for network `%s', assigning default bandwidth "
+"%llu\n"
+msgstr ""
+"No hay configurada una cuota de salida para la red «%s», asignando el ancho "
+"de banda predeterminado %llu\n"
+
+#: src/ats/gnunet-ats-solver-eval.c:3063
+#, c-format
+msgid ""
+"No outbound quota configure for network `%s', assigning default bandwidth "
+"%llu\n"
+msgstr ""
+"No hay configurada una cuota de salida para la red «%s», asignando el ancho "
+"de banda predeterminado %llu\n"
+
+#: src/ats/gnunet-ats-solver-eval.c:3564
+#, fuzzy
+msgid "print logging"
+msgstr "Iniciando descarga «%s».\n"
+
+#: src/ats/gnunet-ats-solver-eval.c:3569
+msgid "save logging to disk"
+msgstr "guarda protocolo al fichero en disco"
+
+#: src/ats/gnunet-ats-solver-eval.c:3574
+msgid "disable normalization"
+msgstr "deshabilita normalización"
+
+#: src/ats/gnunet-service-ats_plugins.c:326
+#, fuzzy, c-format
+msgid ""
+"Could not load %s quota for network `%s': `%s', assigning default bandwidth "
+"%llu\n"
+msgstr ""
+"No se pudieron cargar las cuotas para la red «%s»: «%s», asignando el ancho "
+"de banda predeterminado %llu\n"
+
+# Miguel: "Inbound" lo he traducido como entrada en todo el texto.
+#: src/ats/gnunet-service-ats_plugins.c:336
+#, fuzzy, c-format
+msgid "%s quota configured for network `%s' is %llu\n"
+msgstr "La cuota de entrada configurada para la red «%s» es %llu\n"
+
+#: src/ats/gnunet-service-ats_plugins.c:382
+#, fuzzy, c-format
+msgid ""
+"No %s-quota configured for network `%s', assigning default bandwidth %llu\n"
+msgstr ""
+"No hay configurada una cuota de salida para la red «%s», asignando el ancho "
+"de banda predeterminado %llu\n"
+
+#: src/ats/gnunet-service-ats_plugins.c:474
+#, fuzzy, c-format
+msgid "Failed to initialize solver `%s'!\n"
+msgstr "¡No se puede inicializar el resolvedor!\n"
+
+#: src/ats/plugin_ats_proportional.c:1142
+#, fuzzy, c-format
+msgid "Invalid %s configuration %f \n"
+msgstr "Se produjo un fallo al cargar la configuración de %s\n"
+
+#: src/ats/plugin_ats_proportional.c:1165
+#, fuzzy, c-format
+msgid "Invalid %s configuration %f\n"
+msgstr "Se produjo un fallo al cargar la configuración de %s\n"
+
#: src/auction/gnunet-auction-create.c:163
msgid "description of the item to be sold"
msgstr "descripción del elemento que está por vender"
@@ -916,6 +916,28 @@ msgid "Connection to conversation service lost, trying to
reconnect\n"
msgstr ""
"El cliente se desconectó del servicio principal, tratando de reconectar.\n"
+#: src/conversation/gnunet-conversation-test.c:120
+#, c-format
+msgid ""
+"\n"
+"End of transmission. Have a GNU day.\n"
+msgstr ""
+
+#: src/conversation/gnunet-conversation-test.c:146
+#, c-format
+msgid ""
+"\n"
+"We are now playing your recording back. If you can hear it, your audio "
+"settings are working..."
+msgstr ""
+
+#: src/conversation/gnunet-conversation-test.c:218
+#, c-format
+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.c:264
#, c-format
msgid "Incoming call from `%s'. Please /accept %u or /cancel %u the call.\n"
@@ -1176,30 +1198,8 @@ msgstr ""
msgid "Enables having a conversation with other GNUnet users."
msgstr ""
-#: src/conversation/gnunet-conversation-test.c:120
-#, c-format
-msgid ""
-"\n"
-"End of transmission. Have a GNU day.\n"
-msgstr ""
-
-#: src/conversation/gnunet-conversation-test.c:146
-#, c-format
-msgid ""
-"\n"
-"We are now playing your recording back. If you can hear it, your audio "
-"settings are working..."
-msgstr ""
-
-#: src/conversation/gnunet-conversation-test.c:218
-#, c-format
-msgid ""
-"We will now be recording you for %s. After that time, the recording will be "
-"played back to you..."
-msgstr ""
-
-#: src/conversation/gnunet_gst.c:664
#: src/conversation/gnunet-helper-audio-playback-gst.c:363
+#: src/conversation/gnunet_gst.c:664
#, c-format
msgid "Read error from STDIN: %d %s\n"
msgstr ""
@@ -2019,16 +2019,16 @@ msgstr "«%s» para «%s» falló en %s: %d con error: %s\n"
msgid "Mysql database running\n"
msgstr "Base de datos Mysql ejecutándose\n"
-#: src/datastore/plugin_datastore_postgres.c:278
-#: src/datastore/plugin_datastore_postgres.c:891
+#: src/datastore/plugin_datastore_postgres.c:284
+#: src/datastore/plugin_datastore_postgres.c:897
msgid "Postgress exec failure"
msgstr ""
-#: src/datastore/plugin_datastore_postgres.c:852
+#: src/datastore/plugin_datastore_postgres.c:858
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:950
+#: src/datastore/plugin_datastore_postgres.c:956
msgid "Postgres database running\n"
msgstr "Base de datos Postgres ejecutándose\n"
@@ -2146,68 +2146,19 @@ msgstr "ser prolijo (imprime información de progreso)"
msgid "Prints all packets that go through the DHT."
msgstr "Imprime todos los paquetes que pasan por la DHT."
-#: src/dht/gnunet_dht_profiler.c:922 src/testbed/gnunet-testbed-profiler.c:255
-#, fuzzy, c-format
-msgid "Exiting as the number of peers is %u\n"
-msgstr "El número máximo de conexiones es %u\n"
+#: src/dht/gnunet-dht-put.c:133
+msgid "Must provide KEY and DATA for DHT put!\n"
+msgstr "¡Se deben proveer «KEY» y «DATA» para una subida a la DHT!\n"
-#: src/dht/gnunet_dht_profiler.c:955 src/rps/gnunet-rps-profiler.c:3194
-msgid "number of peers to start"
-msgstr "número de pares para empezar"
+#: src/dht/gnunet-dht-put.c:140
+#, fuzzy, c-format
+msgid "Could not connect to DHT service!\n"
+msgstr "¡No se pudo conectar al servicio %s!\n"
-#: src/dht/gnunet_dht_profiler.c:961
-msgid "number of PUTs to perform per peer"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:967 src/nse/gnunet-nse-profiler.c:872
-#: src/testbed/gnunet-testbed-profiler.c:305
-msgid "name of the file with the login information for the testbed"
-msgstr ""
-"nombre del fichero con la información de acceso usada para la batería de "
-"pruebas"
-
-#: src/dht/gnunet_dht_profiler.c:973
-msgid "delay between rounds for collecting statistics (default: 30 sec)"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:979
-msgid "delay to start doing PUTs (default: 1 sec)"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:985
-msgid "delay to start doing GETs (default: 5 min)"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:990
-msgid "replication degree for DHT PUTs"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:996
-msgid "chance that a peer is selected at random for PUTs"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1002
-msgid "timeout for DHT PUT and GET requests (default: 1 min)"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1023
-#, fuzzy
-msgid "Measure quality and performance of the DHT service."
-msgstr "Medir la calidad y rendimiento del servicio NSE."
-
-#: src/dht/gnunet-dht-put.c:133
-msgid "Must provide KEY and DATA for DHT put!\n"
-msgstr "¡Se deben proveer «KEY» y «DATA» para una subida a la DHT!\n"
-
-#: src/dht/gnunet-dht-put.c:140
-#, fuzzy, c-format
-msgid "Could not connect to DHT service!\n"
-msgstr "¡No se pudo conectar al servicio %s!\n"
-
-#: src/dht/gnunet-dht-put.c:151
-#, c-format
-msgid "Issuing put request for `%s' with data `%s'!\n"
-msgstr "¡Iniciando petición de subida para «%s» con datos «%s»!\n"
+#: src/dht/gnunet-dht-put.c:151
+#, c-format
+msgid "Issuing put request for `%s' with data `%s'!\n"
+msgstr "¡Iniciando petición de subida para «%s» con datos «%s»!\n"
#: src/dht/gnunet-dht-put.c:187
msgid "the data to insert under the key"
@@ -2459,6 +2410,55 @@ msgstr "# Entradas añadidas a la tabla de encaminamiento"
msgid "# DHT requests combined"
msgstr "# Peticiones a la DHT combinadas"
+#: src/dht/gnunet_dht_profiler.c:922 src/testbed/gnunet-testbed-profiler.c:255
+#, fuzzy, c-format
+msgid "Exiting as the number of peers is %u\n"
+msgstr "El número máximo de conexiones es %u\n"
+
+#: src/dht/gnunet_dht_profiler.c:955 src/rps/gnunet-rps-profiler.c:3194
+msgid "number of peers to start"
+msgstr "número de pares para empezar"
+
+#: src/dht/gnunet_dht_profiler.c:961
+msgid "number of PUTs to perform per peer"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:967 src/nse/gnunet-nse-profiler.c:872
+#: src/testbed/gnunet-testbed-profiler.c:305
+msgid "name of the file with the login information for the testbed"
+msgstr ""
+"nombre del fichero con la información de acceso usada para la batería de "
+"pruebas"
+
+#: src/dht/gnunet_dht_profiler.c:973
+msgid "delay between rounds for collecting statistics (default: 30 sec)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:979
+msgid "delay to start doing PUTs (default: 1 sec)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:985
+msgid "delay to start doing GETs (default: 5 min)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:990
+msgid "replication degree for DHT PUTs"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:996
+msgid "chance that a peer is selected at random for PUTs"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1002
+msgid "timeout for DHT PUT and GET requests (default: 1 min)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1023
+#, fuzzy
+msgid "Measure quality and performance of the DHT service."
+msgstr "Medir la calidad y rendimiento del servicio NSE."
+
#: src/dht/plugin_block_dht.c:189
#, c-format
msgid "Block not of type %u\n"
@@ -3442,14 +3442,6 @@ msgstr ""
"Descargar ficheros de GNUnet usando una URI GNUnet CHK o LOC (gnunet://fs/"
"chk/...)"
-#: src/fs/gnunet-fs.c:128
-msgid "print a list of all indexed files"
-msgstr "imprimir una lista de todos los ficheros indexados"
-
-#: src/fs/gnunet-fs.c:141
-msgid "Special file-sharing operations"
-msgstr "Operaciones especiales de compartición de ficheros"
-
#: src/fs/gnunet-fs-profiler.c:211
msgid "run the experiment with COUNT peers"
msgstr "ejecuta el experimento con «COUNT» pares"
@@ -3470,6 +3462,14 @@ msgstr ""
"ejecuta una batería de pruebas para medir el rendimiento de la compartición "
"de ficheros"
+#: src/fs/gnunet-fs.c:128
+msgid "print a list of all indexed files"
+msgstr "imprimir una lista de todos los ficheros indexados"
+
+#: src/fs/gnunet-fs.c:141
+msgid "Special file-sharing operations"
+msgstr "Operaciones especiales de compartición de ficheros"
+
#: src/fs/gnunet-publish.c:219 src/fs/gnunet-publish.c:234
#, c-format
msgid "Publishing `%s' at %llu/%llu (%s remaining)\n"
@@ -4168,53 +4168,6 @@ msgstr "¿cuánto tiempo se debe ejecutar? 0 = para
siempre"
msgid "look for GNS2DNS records instead of ANY"
msgstr ""
-#: src/gns/gnunet-gns.c:257
-#, fuzzy, c-format
-msgid "`%s' is not a valid DNS domain name\n"
-msgstr "«%s» no es una dirección IP válida.\n"
-
-#: src/gns/gnunet-gns.c:267 src/util/dnsparser.c:254
-#, c-format
-msgid "Failed to convert DNS IDNA name `%s' to UTF-8: %s\n"
-msgstr ""
-"Se produjo un fallo al convertir el nombre en formato DNS IDNA «%s» a UTF-8: "
-"%s\n"
-
-#: src/gns/gnunet-gns.c:281
-msgid "Cannot resolve using GNS: GNUnet peer not running\n"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:305
-#, c-format
-msgid "Invalid typename specified, assuming `ANY'\n"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:340
-msgid "Lookup a record for the given name"
-msgstr "Buscar el registro para el nombre dado"
-
-#: src/gns/gnunet-gns.c:346
-msgid "Specify the type of the record to lookup"
-msgstr "Especificar el tipo del registro a buscar"
-
-#: src/gns/gnunet-gns.c:352
-#, fuzzy
-msgid "Specify a timeout for the lookup"
-msgstr "Especificar el tipo del registro a buscar"
-
-#: src/gns/gnunet-gns.c:356
-msgid "No unneeded output"
-msgstr "Sin salida innecesaria"
-
-#: src/gns/gnunet-gns.c:361
-msgid "DNS Compatibility: Name is passed in IDNA instead of UTF-8"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:375
-#, fuzzy
-msgid "GNUnet GNS resolver tool"
-msgstr "Herramienta de acceso GNUnet GNS"
-
#: src/gns/gnunet-gns-import.c:486
msgid "This program will import some GNS authorities into your GNS namestore."
msgstr ""
@@ -4335,6 +4288,53 @@ msgstr ""
msgid "GNUnet GNS proxy"
msgstr "Proxy GNUnet GNS"
+#: src/gns/gnunet-gns.c:257
+#, fuzzy, c-format
+msgid "`%s' is not a valid DNS domain name\n"
+msgstr "«%s» no es una dirección IP válida.\n"
+
+#: src/gns/gnunet-gns.c:267 src/util/dnsparser.c:254
+#, c-format
+msgid "Failed to convert DNS IDNA name `%s' to UTF-8: %s\n"
+msgstr ""
+"Se produjo un fallo al convertir el nombre en formato DNS IDNA «%s» a UTF-8: "
+"%s\n"
+
+#: src/gns/gnunet-gns.c:281
+msgid "Cannot resolve using GNS: GNUnet peer not running\n"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:305
+#, c-format
+msgid "Invalid typename specified, assuming `ANY'\n"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:340
+msgid "Lookup a record for the given name"
+msgstr "Buscar el registro para el nombre dado"
+
+#: src/gns/gnunet-gns.c:346
+msgid "Specify the type of the record to lookup"
+msgstr "Especificar el tipo del registro a buscar"
+
+#: src/gns/gnunet-gns.c:352
+#, fuzzy
+msgid "Specify a timeout for the lookup"
+msgstr "Especificar el tipo del registro a buscar"
+
+#: src/gns/gnunet-gns.c:356
+msgid "No unneeded output"
+msgstr "Sin salida innecesaria"
+
+#: src/gns/gnunet-gns.c:361
+msgid "DNS Compatibility: Name is passed in IDNA instead of UTF-8"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:375
+#, fuzzy
+msgid "GNUnet GNS resolver tool"
+msgstr "Herramienta de acceso GNUnet GNS"
+
#: src/gns/gnunet-service-gns.c:505
#, fuzzy
msgid "Properly base32-encoded public key required"
@@ -4346,8 +4346,8 @@ msgid "Failed to connect to the namecache!\n"
msgstr "¡Se produjo un fallo al conectar con el almacén de nombres!\n"
#: src/gns/gnunet-service-gns.c:560
-#: src/zonemaster/gnunet-service-zonemaster.c:887
#: src/zonemaster/gnunet-service-zonemaster-monitor.c:444
+#: src/zonemaster/gnunet-service-zonemaster.c:887
msgid "Could not connect to DHT!\n"
msgstr "¡No se pudo conectar a la DHT!\n"
@@ -4877,7 +4877,7 @@ msgid "# hostlist advertisements send"
msgstr "# anuncios de listas de máquinas enviados"
#: src/hostlist/gnunet-daemon-hostlist_server.c:674
-#: src/transport/gnunet-service-transport.c:2659
+#: src/transport/gnunet-service-transport.c:2661
msgid "Could not access PEERINFO service. Exiting.\n"
msgstr ""
"No se pudo acceder al servicio de información de pares (PEERINFO). "
@@ -5143,6 +5143,71 @@ msgstr "Base de datos sqlite ejecutándose\n"
msgid "Failed to setup database at `%s'\n"
msgstr "Se produjo un fallo al inciar «%s» en «%s»\n"
+# form??
+#: src/namestore/gnunet-namestore-fcfsd.c:552
+#, c-format
+msgid "Unsupported form value `%s'\n"
+msgstr "Forma de valor no soportada «%s»\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:579
+#, c-format
+msgid "Failed to create record for domain `%s': %s\n"
+msgstr "Se produjo un fallo al crear un registro para el dominio «%s»: %s\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:600
+msgid "Error when mapping zone to name\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:632
+#, c-format
+msgid "Found existing name `%s' for the given key\n"
+msgstr "Encontrado nombre «%s» para la clave dada\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:694
+#, c-format
+msgid "Found %u existing records for domain `%s'\n"
+msgstr "Encontrados %u registros para el dominio «%s»\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:784
+#, c-format
+msgid "Failed to create page for `%s'\n"
+msgstr "Se produjo un fallo al crear la página para «%s»\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:803
+#, c-format
+msgid "Failed to setup post processor for `%s'\n"
+msgstr "Se produjo un fallo al configurar el post-procesador para «%s»\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:840
+msgid "Domain name must not contain `.'\n"
+msgstr "El nombre de dominio no puede contener «.»\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:849
+msgid "Domain name must not contain `+'\n"
+msgstr "El nombre de dominio no puede contener «+»\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1084
+msgid "No ego configured for `fcfsd` subsystem\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1115
+msgid "Failed to start HTTP server\n"
+msgstr "Se produjo un fallo al iniciar el servidor HTTP\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1163
+#, fuzzy
+msgid "Failed to connect to identity\n"
+msgstr "Se produjo un fallo al conectar con GNS\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1190
+msgid "name of the zone that is to be managed by FCFSD"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1210
+#, fuzzy
+msgid "GNU Name System First Come First Serve name registration service"
+msgstr "Servicio de registro GNUnet GNS primero en llegar, primero en servirse"
+
#: src/namestore/gnunet-namestore.c:334
#, c-format
msgid "Adding record failed: %s\n"
@@ -5375,71 +5440,6 @@ msgstr ""
msgid "name of the ego controlling the zone"
msgstr "nombre de la sección a la que acceder"
-# form??
-#: src/namestore/gnunet-namestore-fcfsd.c:552
-#, c-format
-msgid "Unsupported form value `%s'\n"
-msgstr "Forma de valor no soportada «%s»\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:579
-#, c-format
-msgid "Failed to create record for domain `%s': %s\n"
-msgstr "Se produjo un fallo al crear un registro para el dominio «%s»: %s\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:600
-msgid "Error when mapping zone to name\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:632
-#, c-format
-msgid "Found existing name `%s' for the given key\n"
-msgstr "Encontrado nombre «%s» para la clave dada\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:694
-#, c-format
-msgid "Found %u existing records for domain `%s'\n"
-msgstr "Encontrados %u registros para el dominio «%s»\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:784
-#, c-format
-msgid "Failed to create page for `%s'\n"
-msgstr "Se produjo un fallo al crear la página para «%s»\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:803
-#, c-format
-msgid "Failed to setup post processor for `%s'\n"
-msgstr "Se produjo un fallo al configurar el post-procesador para «%s»\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:840
-msgid "Domain name must not contain `.'\n"
-msgstr "El nombre de dominio no puede contener «.»\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:849
-msgid "Domain name must not contain `+'\n"
-msgstr "El nombre de dominio no puede contener «+»\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1084
-msgid "No ego configured for `fcfsd` subsystem\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1115
-msgid "Failed to start HTTP server\n"
-msgstr "Se produjo un fallo al iniciar el servidor HTTP\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1163
-#, fuzzy
-msgid "Failed to connect to identity\n"
-msgstr "Se produjo un fallo al conectar con GNS\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1190
-msgid "name of the zone that is to be managed by FCFSD"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1210
-#, fuzzy
-msgid "GNU Name System First Come First Serve name registration service"
-msgstr "Servicio de registro GNUnet GNS primero en llegar, primero en servirse"
-
#: src/namestore/gnunet-service-namestore.c:866
#, fuzzy, c-format
msgid "Failed to replicate block in namecache: %s\n"
@@ -5773,11 +5773,6 @@ msgstr "comando «external-ip» no encontrado\n"
msgid "`upnpc' command not found\n"
msgstr "comando «upnpc» no encontrado\n"
-#: src/nse/gnunet-nse.c:124
-#, fuzzy
-msgid "Show network size estimates from NSE service."
-msgstr "# Estimaciones del tamaño de red recibidas"
-
#: src/nse/gnunet-nse-profiler.c:857
msgid "limit to the number of connections to NSE services, 0 for none"
msgstr "límite al número de conexiones a servicios NSE, 0 para ilimitadas"
@@ -5803,69 +5798,15 @@ msgstr "retraso entre rondas"
msgid "Measure quality and performance of the NSE service."
msgstr "Medir la calidad y rendimiento del servicio NSE."
-#: src/nse/gnunet-service-nse.c:1443
-#: src/revocation/gnunet-service-revocation.c:834 src/util/gnunet-scrypt.c:257
-msgid "Value is too large.\n"
-msgstr ""
-
-#: src/peerinfo/gnunet-service-peerinfo.c:175
-#, c-format
-msgid "Removing expired address of transport `%s'\n"
-msgstr "Eliminando dirección de transporte «%s»\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:306
-#, fuzzy, c-format
-msgid "Failed to parse HELLO in file `%s': %s\n"
-msgstr "Se produjo un fallo al procesar «HELLO» en el fichero «%s»\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:323
-#: src/peerinfo/gnunet-service-peerinfo.c:348
-#, fuzzy, c-format
-msgid "Failed to parse HELLO in file `%s'\n"
-msgstr "Se produjo un fallo al procesar «HELLO» en el fichero «%s»\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:426
-msgid "# peers known"
-msgstr "# pares conocidos"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:468
-#, c-format
-msgid ""
-"File `%s' in directory `%s' does not match naming convention. Removed.\n"
-msgstr ""
-"El fichero «%s» en el directorio «%s» no sigue la convención de nombres. "
-"Eliminado.\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:624
-#, fuzzy, c-format
-msgid "Scanning directory `%s'\n"
-msgstr "Escaneando directorio «%s».\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:631
-#, c-format
-msgid "Still no peers found in `%s'!\n"
-msgstr "¡Aún no se han encontrado pares en «%s»!\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:1024
-#, fuzzy, c-format
-msgid "Cleaning up directory `%s'\n"
-msgstr "Escaneando directorio «%s».\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:1319
-#, c-format
-msgid "Importing HELLOs from `%s'\n"
-msgstr "Importando HELLO de «%s»\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:1332
-msgid "Skipping import of included HELLOs\n"
-msgstr ""
-
-# Miguel: "Failed to receive" también aquí está traducido como
-# "no se obtuvo respuesta" por claridad.
-#: src/peerinfo/peerinfo_api.c:217
-msgid "Failed to receive response from `PEERINFO' service."
+#: src/nse/gnunet-nse.c:124
+#, fuzzy
+msgid "Show network size estimates from NSE service."
+msgstr "# Estimaciones del tamaño de red recibidas"
+
+#: src/nse/gnunet-service-nse.c:1443
+#: src/revocation/gnunet-service-revocation.c:834 src/util/gnunet-scrypt.c:257
+msgid "Value is too large.\n"
msgstr ""
-"No se obtuvo respuesta del servicio de información de pares (PEERINFO)."
#: src/peerinfo-tool/gnunet-peerinfo.c:237
#, fuzzy, c-format
@@ -5962,6 +5903,65 @@ msgstr "Se produjo un fallo al cargar el módulo del
transporte para «%s»\n"
msgid "Peerinfo REST API initialized\n"
msgstr "Conexión fallida\n"
+#: src/peerinfo/gnunet-service-peerinfo.c:175
+#, c-format
+msgid "Removing expired address of transport `%s'\n"
+msgstr "Eliminando dirección de transporte «%s»\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:306
+#, fuzzy, c-format
+msgid "Failed to parse HELLO in file `%s': %s\n"
+msgstr "Se produjo un fallo al procesar «HELLO» en el fichero «%s»\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:323
+#: src/peerinfo/gnunet-service-peerinfo.c:348
+#, fuzzy, c-format
+msgid "Failed to parse HELLO in file `%s'\n"
+msgstr "Se produjo un fallo al procesar «HELLO» en el fichero «%s»\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:426
+msgid "# peers known"
+msgstr "# pares conocidos"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:468
+#, c-format
+msgid ""
+"File `%s' in directory `%s' does not match naming convention. Removed.\n"
+msgstr ""
+"El fichero «%s» en el directorio «%s» no sigue la convención de nombres. "
+"Eliminado.\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:624
+#, fuzzy, c-format
+msgid "Scanning directory `%s'\n"
+msgstr "Escaneando directorio «%s».\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:631
+#, c-format
+msgid "Still no peers found in `%s'!\n"
+msgstr "¡Aún no se han encontrado pares en «%s»!\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:1024
+#, fuzzy, c-format
+msgid "Cleaning up directory `%s'\n"
+msgstr "Escaneando directorio «%s».\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:1319
+#, c-format
+msgid "Importing HELLOs from `%s'\n"
+msgstr "Importando HELLO de «%s»\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:1332
+msgid "Skipping import of included HELLOs\n"
+msgstr ""
+
+# Miguel: "Failed to receive" también aquí está traducido como
+# "no se obtuvo respuesta" por claridad.
+#: src/peerinfo/peerinfo_api.c:217
+msgid "Failed to receive response from `PEERINFO' service."
+msgstr ""
+"No se obtuvo respuesta del servicio de información de pares (PEERINFO)."
+
#: src/peerstore/gnunet-peerstore.c:92
msgid "peerstore"
msgstr ""
@@ -6433,18 +6433,6 @@ msgstr ""
msgid "Could not open revocation database file!"
msgstr "No se pudo conectar con el almacén de datos."
-#: src/rps/gnunet-rps.c:270
-msgid "Seed a PeerID"
-msgstr ""
-
-#: src/rps/gnunet-rps.c:275
-msgid "Get updates of view (0 for infinite updates)"
-msgstr ""
-
-#: src/rps/gnunet-rps.c:279
-msgid "Get peers from biased stream"
-msgstr ""
-
#: src/rps/gnunet-rps-profiler.c:3200
#, fuzzy
msgid "duration of the profiling"
@@ -6466,6 +6454,18 @@ msgstr "número de pares para empezar"
msgid "Measure quality and performance of the RPS service."
msgstr "Medir la calidad y rendimiento del servicio NSE."
+#: src/rps/gnunet-rps.c:270
+msgid "Seed a PeerID"
+msgstr ""
+
+#: src/rps/gnunet-rps.c:275
+msgid "Get updates of view (0 for infinite updates)"
+msgstr ""
+
+#: src/rps/gnunet-rps.c:279
+msgid "Get peers from biased stream"
+msgstr ""
+
#: src/scalarproduct/gnunet-scalarproduct.c:229
#, fuzzy
msgid "You must specify at least one message ID to check!\n"
@@ -6521,10 +6521,10 @@ msgstr ""
msgid "Calculate the Vectorproduct with a GNUnet peer."
msgstr ""
-#: src/scalarproduct/gnunet-service-scalarproduct_alice.c:1358
-#: src/scalarproduct/gnunet-service-scalarproduct_bob.c:1355
#: src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c:1118
#: src/scalarproduct/gnunet-service-scalarproduct-ecc_bob.c:1063
+#: src/scalarproduct/gnunet-service-scalarproduct_alice.c:1358
+#: src/scalarproduct/gnunet-service-scalarproduct_bob.c:1355
#, fuzzy
msgid "Connect to CADET failed\n"
msgstr "Conexión fallida (¿bug?)\n"
@@ -6884,16 +6884,6 @@ msgstr "Petición ignorada porque el ARM se está
apagando.\n"
msgid "%.s Unknown result code."
msgstr "Código de respuesta del ARM desconocido.\n"
-#: src/testbed/gnunet_testbed_mpi_spawn.c:119
-#, fuzzy
-msgid "Waiting for child to exit.\n"
-msgstr "Esperando a los pares para conectar (%u ciclos restantes)...\n"
-
-#: src/testbed/gnunet_testbed_mpi_spawn.c:242
-#, fuzzy, c-format
-msgid "Spawning process `%s'\n"
-msgstr "Iniciando el proceso auxiliar (HELPER) «%s»\n"
-
#: src/testbed/gnunet-testbed-profiler.c:290
msgid "tolerate COUNT number of continious timeout failures"
msgstr "tolerar un número «COUNT» de continuas expiraciones de plazo"
@@ -6905,6 +6895,16 @@ msgid ""
"signal is received"
msgstr ""
+#: src/testbed/gnunet_testbed_mpi_spawn.c:119
+#, fuzzy
+msgid "Waiting for child to exit.\n"
+msgstr "Esperando a los pares para conectar (%u ciclos restantes)...\n"
+
+#: src/testbed/gnunet_testbed_mpi_spawn.c:242
+#, fuzzy, c-format
+msgid "Spawning process `%s'\n"
+msgstr "Iniciando el proceso auxiliar (HELPER) «%s»\n"
+
#: src/testbed/testbed_api.c:399
#, c-format
msgid "Adding host %u failed with error: %s\n"
@@ -7225,22 +7225,22 @@ msgstr "# mensajes «HELLO» recibidos"
msgid "GNUnet topology control"
msgstr ""
-#: src/transport/gnunet-communicator-tcp.c:3189
-#: src/transport/gnunet-communicator-udp.c:2826
+#: src/transport/gnunet-communicator-tcp.c:3221
+#: src/transport/gnunet-communicator-udp.c:2995
#: src/transport/gnunet-service-tng.c:10014
-#: src/transport/gnunet-service-transport.c:2624
+#: src/transport/gnunet-service-transport.c:2626
#, fuzzy
msgid "Transport service is lacking key configuration settings. Exiting.\n"
msgstr ""
"El servicio de transporte carece de opciones de configuración de clave. "
"Saliendo.\n"
-#: src/transport/gnunet-communicator-tcp.c:3494
+#: src/transport/gnunet-communicator-tcp.c:3553
#, fuzzy
msgid "GNUnet TCP communicator"
msgstr "Configurador Gtk de GNUnet"
-#: src/transport/gnunet-communicator-udp.c:2898
+#: src/transport/gnunet-communicator-udp.c:3067
#, fuzzy
msgid "GNUnet UDP communicator"
msgstr "Configurador Gtk de GNUnet"
@@ -7267,51 +7267,51 @@ msgstr "Se produjo un fallo al crear la página para
«%s»\n"
msgid "GNUnet UNIX domain socket communicator"
msgstr ""
-#: src/transport/gnunet-service-transport_ats.c:137
-msgid "# Addresses given to ATS"
-msgstr ""
-
#: src/transport/gnunet-service-transport.c:445
msgid "# messages dropped due to slow client"
msgstr "# mensajes omitidos debido a un cliente lento"
-#: src/transport/gnunet-service-transport.c:794
+#: src/transport/gnunet-service-transport.c:796
msgid "# bytes payload dropped (other peer was not connected)"
msgstr "# bytes de «payload» omitidos (el otro par no estaba conectado)"
-#: src/transport/gnunet-service-transport.c:1477
+#: src/transport/gnunet-service-transport.c:1479
#, fuzzy
msgid "# bytes payload discarded due to not connected peer"
msgstr "# bytes de «payload» descartados debido a par no conectado"
-#: src/transport/gnunet-service-transport.c:1622
+#: src/transport/gnunet-service-transport.c:1624
msgid "# bytes total received"
msgstr "# total de bytes recibidos"
-#: src/transport/gnunet-service-transport.c:1712
+#: src/transport/gnunet-service-transport.c:1714
msgid "# bytes payload received"
msgstr "# bytes de «payload» recibidos"
-#: src/transport/gnunet-service-transport.c:2016
-#: src/transport/gnunet-service-transport.c:2450
+#: src/transport/gnunet-service-transport.c:2018
+#: src/transport/gnunet-service-transport.c:2452
msgid "# disconnects due to blacklist"
msgstr "# desconexiones debido a la lista negra"
-#: src/transport/gnunet-service-transport.c:2454
+#: src/transport/gnunet-service-transport.c:2456
#, fuzzy, c-format
msgid "Disallowing connection to peer `%s' on transport %s\n"
msgstr "Se produjo un fallo al cargar el módulo del transporte para «%s»\n"
-#: src/transport/gnunet-service-transport.c:2549
+#: src/transport/gnunet-service-transport.c:2551
#, fuzzy, c-format
msgid "Adding blacklisting entry for peer `%s'\n"
msgstr "Añadiendo «%s» sin direcciones para el par «%s»\n"
-#: src/transport/gnunet-service-transport.c:2558
+#: src/transport/gnunet-service-transport.c:2560
#, c-format
msgid "Adding blacklisting entry for peer `%s':`%s'\n"
msgstr ""
+#: src/transport/gnunet-service-transport_ats.c:137
+msgid "# Addresses given to ATS"
+msgstr ""
+
#: src/transport/gnunet-service-transport_hello.c:195
msgid "# refreshed my HELLO"
msgstr "# refrescos de mi «HELLO»"
@@ -7653,6 +7653,45 @@ msgstr "# revalidaciones de direcciones iniciadas"
msgid "# HELLOs given to peerinfo"
msgstr "# «HELLO» obtenidos de «peerinfo»"
+#: src/transport/gnunet-transport-profiler.c:220
+#, c-format
+msgid "%llu B in %llu ms == %.2f KB/s!\n"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:577
+msgid "send data to peer"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:581
+#, fuzzy
+msgid "receive data from peer"
+msgstr "# respuestas recibidas de otros pares"
+
+#: src/transport/gnunet-transport-profiler.c:586
+#, fuzzy
+msgid "iterations"
+msgstr "Otras configuraciones"
+
+#: src/transport/gnunet-transport-profiler.c:591
+#, fuzzy
+msgid "number of messages to send"
+msgstr "número de mensajes a usar por iteración"
+
+#: src/transport/gnunet-transport-profiler.c:596
+#, fuzzy
+msgid "message size to use"
+msgstr "tamaño del mensaje"
+
+#: src/transport/gnunet-transport-profiler.c:601
+#: src/transport/gnunet-transport.c:1404
+msgid "peer identity"
+msgstr "identidad del par"
+
+#: src/transport/gnunet-transport-profiler.c:614
+#: src/transport/gnunet-transport.c:1426
+msgid "Direct access to transport service."
+msgstr "Acceso directo al servicio de transporte."
+
#: src/transport/gnunet-transport.c:406
#, c-format
msgid "Transmitted %llu bytes/s (%llu bytes in %s)\n"
@@ -7797,11 +7836,6 @@ msgstr ""
msgid "do not resolve hostnames"
msgstr "no resolver nombres de máquinas"
-#: src/transport/gnunet-transport.c:1404
-#: src/transport/gnunet-transport-profiler.c:601
-msgid "peer identity"
-msgstr "identidad del par"
-
#: src/transport/gnunet-transport.c:1408
#, fuzzy
msgid "monitor plugin sessions"
@@ -7811,40 +7845,6 @@ msgstr "# sesiones wlan pendientes"
msgid "send data for benchmarking to the other peer (until CTRL-C)"
msgstr "enviar data para prueba a otro par (hasta CTRL-C)"
-#: src/transport/gnunet-transport.c:1426
-#: src/transport/gnunet-transport-profiler.c:614
-msgid "Direct access to transport service."
-msgstr "Acceso directo al servicio de transporte."
-
-#: src/transport/gnunet-transport-profiler.c:220
-#, c-format
-msgid "%llu B in %llu ms == %.2f KB/s!\n"
-msgstr ""
-
-#: src/transport/gnunet-transport-profiler.c:577
-msgid "send data to peer"
-msgstr ""
-
-#: src/transport/gnunet-transport-profiler.c:581
-#, fuzzy
-msgid "receive data from peer"
-msgstr "# respuestas recibidas de otros pares"
-
-#: src/transport/gnunet-transport-profiler.c:586
-#, fuzzy
-msgid "iterations"
-msgstr "Otras configuraciones"
-
-#: src/transport/gnunet-transport-profiler.c:591
-#, fuzzy
-msgid "number of messages to send"
-msgstr "número de mensajes a usar por iteración"
-
-#: src/transport/gnunet-transport-profiler.c:596
-#, fuzzy
-msgid "message size to use"
-msgstr "tamaño del mensaje"
-
#: src/transport/plugin_transport_http_client.c:1489
#: src/transport/plugin_transport_http_server.c:2331
#: src/transport/plugin_transport_http_server.c:3562
@@ -8129,23 +8129,6 @@ msgstr "Transporte TCP no escuchando en ningún puerto
(únicamente cliente)\n"
msgid "TCP transport advertises itself as being on port %llu\n"
msgstr "El transporte TCP anuncia que está en el puerto %llu\n"
-#: src/transport/plugin_transport_udp_broadcasting.c:169
-#, fuzzy
-msgid "# Multicast HELLO beacons received via UDP"
-msgstr "# beacons HELLO multicast IPv6 recibidos vía UDP"
-
-#: src/transport/plugin_transport_udp_broadcasting.c:553
-msgid ""
-"Disabling HELLO broadcasting due to friend-to-friend only configuration!\n"
-msgstr ""
-
-#: src/transport/plugin_transport_udp_broadcasting.c:571
-#, c-format
-msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n"
-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:3169
#, c-format
msgid ""
@@ -8200,6 +8183,23 @@ msgstr "«%s» no es una dirección IP válida.\n"
msgid "Failed to create UDP network sockets\n"
msgstr "Se produjo un fallo al crear una nueva firma"
+#: src/transport/plugin_transport_udp_broadcasting.c:169
+#, fuzzy
+msgid "# Multicast HELLO beacons received via UDP"
+msgstr "# beacons HELLO multicast IPv6 recibidos vía UDP"
+
+#: src/transport/plugin_transport_udp_broadcasting.c:553
+msgid ""
+"Disabling HELLO broadcasting due to friend-to-friend only configuration!\n"
+msgstr ""
+
+#: src/transport/plugin_transport_udp_broadcasting.c:571
+#, c-format
+msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n"
+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_unix.c:1396
#, fuzzy, c-format
msgid "Cannot bind to `%s'\n"
@@ -8390,7 +8390,7 @@ msgid "do daemonize (detach from terminal)"
msgstr "demonizar (desasociar del terminal)"
#: src/transport/tcp_service_legacy.c:1397
-#: src/transport/transport-testing2.c:1116 src/util/service.c:2072
+#: src/transport/transport-testing2.c:983 src/util/service.c:2072
#: src/util/service.c:2084
#, fuzzy, c-format
msgid "Malformed configuration file `%s', exit ...\n"
@@ -9072,7 +9072,7 @@ msgstr ""
"¡Error lógico interno fatal, el proceso está colgado en «%s» (abortar con "
"CTRL-C)!\n"
-#: src/util/os_installation.c:409
+#: src/util/os_installation.c:411
#, c-format
msgid ""
"Could not determine installation path for %s. Set `%s' environment "
@@ -9081,12 +9081,12 @@ msgstr ""
"No se pudo determinar la ruta de instalación de %s. Establezca la variable "
"de entorno «%s».\n"
-#: src/util/os_installation.c:792
+#: src/util/os_installation.c:794
#, c-format
msgid "Could not find binary `%s' in PATH!\n"
msgstr "¡No se pudo encontrar el programa llamado «%s» en PATH!\n"
-#: src/util/os_installation.c:825
+#: src/util/os_installation.c:827
#, c-format
msgid "Binary `%s' exists, but is not SUID\n"
msgstr ""
@@ -9110,17 +9110,17 @@ msgstr "Falló «%s» para la biblioteca «%s» con error:
%s\n"
msgid "Could not determine plugin installation path.\n"
msgstr "No se pudo determinar la ruta de instalación de los módulos.\n"
-#: src/util/program.c:262
+#: src/util/program.c:267
#, fuzzy, c-format
msgid "Unreadable or malformed configuration file `%s', exit ...\n"
msgstr "Se produjo un fallo al borrar el fichero de configuración %s\n"
-#: src/util/program.c:279
+#: src/util/program.c:284
#, fuzzy, c-format
msgid "Unreadable or malformed default configuration file `%s', exit ...\n"
msgstr "Se produjo un fallo al borrar el fichero de configuración %s\n"
-#: src/util/program.c:294
+#: src/util/program.c:299
#, fuzzy
msgid "Unreadable or malformed configuration, exit ...\n"
msgstr "Se produjo un fallo al borrar el fichero de configuración %s\n"
@@ -9194,10 +9194,6 @@ msgstr ""
msgid "Attempting to proxy service `%s' to invalid port %d or hostname.\n"
msgstr ""
-#: src/util/strings.c:179
-msgid "b"
-msgstr "b"
-
#: src/util/strings.c:503
#, c-format
msgid "Character sets requested were `%s'->`%s'\n"
@@ -9209,46 +9205,6 @@ msgstr ""
"Se produjo un fallo al expandir «$HOME»: variable de entorno «HOME» no "
"establecida"
-#: src/util/strings.c:706
-msgid "µs"
-msgstr ""
-
-#: src/util/strings.c:710
-msgid "forever"
-msgstr "para siempre"
-
-#: src/util/strings.c:712
-msgid "0 ms"
-msgstr "0 ms"
-
-#: src/util/strings.c:716
-msgid "ms"
-msgstr "ms"
-
-#: src/util/strings.c:720
-msgid "s"
-msgstr "s"
-
-#: src/util/strings.c:724
-msgid "m"
-msgstr "m"
-
-#: src/util/strings.c:728
-msgid "h"
-msgstr "h"
-
-#: src/util/strings.c:734
-msgid "day"
-msgstr "día"
-
-#: src/util/strings.c:736
-msgid "days"
-msgstr "días"
-
-#: src/util/strings.c:764
-msgid "end of time"
-msgstr "fin del plazo"
-
#: src/util/strings.c:1240
msgid "IPv6 address did not start with `['\n"
msgstr "La dirección IPv6 no empezaba con «[»\n"
@@ -9503,11 +9459,41 @@ msgstr "el servicio es ofrecido vía UDP"
msgid "Setup tunnels via VPN."
msgstr "Configurar túneles vía VPN."
-#: src/zonemaster/gnunet-service-zonemaster.c:849
#: src/zonemaster/gnunet-service-zonemaster-monitor.c:420
+#: src/zonemaster/gnunet-service-zonemaster.c:849
msgid "Failed to connect to the namestore!\n"
msgstr "¡Se produjo un fallo al conectar con el almacén de nombres!\n"
+#~ msgid "b"
+#~ msgstr "b"
+
+#~ msgid "forever"
+#~ msgstr "para siempre"
+
+#~ msgid "0 ms"
+#~ msgstr "0 ms"
+
+#~ msgid "ms"
+#~ msgstr "ms"
+
+#~ msgid "s"
+#~ msgstr "s"
+
+#~ msgid "m"
+#~ msgstr "m"
+
+#~ msgid "h"
+#~ msgstr "h"
+
+#~ msgid "day"
+#~ msgstr "día"
+
+#~ msgid "days"
+#~ msgstr "días"
+
+#~ msgid "end of time"
+#~ msgstr "fin del plazo"
+
#, c-format
#~ msgid "Metadata `%s' failed to deserialize"
#~ msgstr "Se produjo un fallo al deserializar los metadatos «%s»"
diff --git a/po/fr.po b/po/fr.po
index 1ffa44998..82b35c5cd 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: 2020-09-06 10:07+0200\n"
+"POT-Creation-Date: 2020-10-13 16:12+0200\n"
"PO-Revision-Date: 2015-12-24 01:20+0100\n"
"Last-Translator: Stéphane Aulery <lkppo@free.fr>\n"
"Language-Team: French <traduc@traduc.org>\n"
@@ -27,8 +27,8 @@ msgid "Issuer public key `%s' is not well-formed\n"
msgstr ""
#: src/abd/gnunet-abd.c:560 src/abd/gnunet-service-abd.c:1747
-#: src/namestore/gnunet-namestore.c:1001
#: src/namestore/gnunet-namestore-fcfsd.c:1154
+#: src/namestore/gnunet-namestore.c:1001
#, c-format
msgid "Failed to connect to namestore\n"
msgstr ""
@@ -491,81 +491,14 @@ msgstr ""
msgid "Initiating shutdown as requested by client.\n"
msgstr ""
-#: src/ats/gnunet-ats-solver-eval.c:2992 src/ats/gnunet-ats-solver-eval.c:3044
-#, c-format
-msgid ""
-"Could not load quota for network `%s': `%s', assigning default bandwidth "
-"%llu\n"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3011
-#, c-format
-msgid ""
-"No outbound quota configured for network `%s', assigning default bandwidth "
-"%llu\n"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3063
-#, c-format
-msgid ""
-"No outbound quota configure for network `%s', assigning default bandwidth "
-"%llu\n"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3552 src/ats-tests/gnunet-solver-eval.c:997
-msgid "solver to use"
-msgstr "solveur utilisé"
-
-#: src/ats/gnunet-ats-solver-eval.c:3557
-#: src/ats-tests/gnunet-solver-eval.c:1003
-#: src/ats-tests/gnunet-solver-eval.c:1008
-msgid "experiment to use"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3564
-msgid "print logging"
-msgstr "afficher le journal"
-
-#: src/ats/gnunet-ats-solver-eval.c:3569
-msgid "save logging to disk"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3574
-msgid "disable normalization"
-msgstr ""
-
-#: src/ats/gnunet-service-ats_plugins.c:326
-#, c-format
-msgid ""
-"Could not load %s quota for network `%s': `%s', assigning default bandwidth "
-"%llu\n"
-msgstr ""
-
-#: src/ats/gnunet-service-ats_plugins.c:336
-#, c-format
-msgid "%s quota configured for network `%s' is %llu\n"
-msgstr ""
-
-#: src/ats/gnunet-service-ats_plugins.c:382
-#, c-format
-msgid ""
-"No %s-quota configured for network `%s', assigning default bandwidth %llu\n"
-msgstr ""
+#: src/ats-tests/ats-testing-log.c:896
+msgid "Stop logging\n"
+msgstr "Arrêter la journalisation\n"
-#: src/ats/gnunet-service-ats_plugins.c:474
+#: src/ats-tests/ats-testing-log.c:952
#, c-format
-msgid "Failed to initialize solver `%s'!\n"
-msgstr ""
-
-#: src/ats/plugin_ats_proportional.c:1142
-#, fuzzy, c-format
-msgid "Invalid %s configuration %f \n"
-msgstr "fornat invalide : « %s »\n"
-
-#: src/ats/plugin_ats_proportional.c:1165
-#, fuzzy, c-format
-msgid "Invalid %s configuration %f\n"
-msgstr "fornat invalide : « %s »\n"
+msgid "Start logging `%s'\n"
+msgstr "Démarrer la journalisation « %s »\n"
#: src/ats-tests/ats-testing.c:420
#, c-format
@@ -577,15 +510,6 @@ msgstr ""
msgid "Failed to connect master peer [%u] with slave [%u]\n"
msgstr ""
-#: src/ats-tests/ats-testing-log.c:896
-msgid "Stop logging\n"
-msgstr "Arrêter la journalisation\n"
-
-#: src/ats-tests/ats-testing-log.c:952
-#, c-format
-msgid "Start logging `%s'\n"
-msgstr "Démarrer la journalisation « %s »\n"
-
#: src/ats-tests/gnunet-ats-sim.c:92
#, c-format
msgid ""
@@ -593,6 +517,16 @@ msgid ""
"= %u KiB/s\n"
msgstr ""
+#: src/ats-tests/gnunet-solver-eval.c:997 src/ats/gnunet-ats-solver-eval.c:3552
+msgid "solver to use"
+msgstr "solveur utilisé"
+
+#: src/ats-tests/gnunet-solver-eval.c:1003
+#: src/ats-tests/gnunet-solver-eval.c:1008
+#: src/ats/gnunet-ats-solver-eval.c:3557
+msgid "experiment to use"
+msgstr ""
+
#: src/ats-tool/gnunet-ats.c:299
#, c-format
msgid "%u address resolutions had a timeout\n"
@@ -708,6 +642,72 @@ msgstr ""
msgid "Print information about ATS state"
msgstr ""
+#: src/ats/gnunet-ats-solver-eval.c:2992 src/ats/gnunet-ats-solver-eval.c:3044
+#, c-format
+msgid ""
+"Could not load quota for network `%s': `%s', assigning default bandwidth "
+"%llu\n"
+msgstr ""
+
+#: src/ats/gnunet-ats-solver-eval.c:3011
+#, c-format
+msgid ""
+"No outbound quota configured for network `%s', assigning default bandwidth "
+"%llu\n"
+msgstr ""
+
+#: src/ats/gnunet-ats-solver-eval.c:3063
+#, c-format
+msgid ""
+"No outbound quota configure for network `%s', assigning default bandwidth "
+"%llu\n"
+msgstr ""
+
+#: src/ats/gnunet-ats-solver-eval.c:3564
+msgid "print logging"
+msgstr "afficher le journal"
+
+#: src/ats/gnunet-ats-solver-eval.c:3569
+msgid "save logging to disk"
+msgstr ""
+
+#: src/ats/gnunet-ats-solver-eval.c:3574
+msgid "disable normalization"
+msgstr ""
+
+#: src/ats/gnunet-service-ats_plugins.c:326
+#, c-format
+msgid ""
+"Could not load %s quota for network `%s': `%s', assigning default bandwidth "
+"%llu\n"
+msgstr ""
+
+#: src/ats/gnunet-service-ats_plugins.c:336
+#, c-format
+msgid "%s quota configured for network `%s' is %llu\n"
+msgstr ""
+
+#: src/ats/gnunet-service-ats_plugins.c:382
+#, c-format
+msgid ""
+"No %s-quota configured for network `%s', assigning default bandwidth %llu\n"
+msgstr ""
+
+#: src/ats/gnunet-service-ats_plugins.c:474
+#, c-format
+msgid "Failed to initialize solver `%s'!\n"
+msgstr ""
+
+#: src/ats/plugin_ats_proportional.c:1142
+#, fuzzy, c-format
+msgid "Invalid %s configuration %f \n"
+msgstr "fornat invalide : « %s »\n"
+
+#: src/ats/plugin_ats_proportional.c:1165
+#, fuzzy, c-format
+msgid "Invalid %s configuration %f\n"
+msgstr "fornat invalide : « %s »\n"
+
#: src/auction/gnunet-auction-create.c:163
msgid "description of the item to be sold"
msgstr ""
@@ -838,6 +838,28 @@ msgstr ""
msgid "Connection to conversation service lost, trying to reconnect\n"
msgstr ""
+#: src/conversation/gnunet-conversation-test.c:120
+#, c-format
+msgid ""
+"\n"
+"End of transmission. Have a GNU day.\n"
+msgstr ""
+
+#: src/conversation/gnunet-conversation-test.c:146
+#, c-format
+msgid ""
+"\n"
+"We are now playing your recording back. If you can hear it, your audio "
+"settings are working..."
+msgstr ""
+
+#: src/conversation/gnunet-conversation-test.c:218
+#, c-format
+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.c:264
#, c-format
msgid "Incoming call from `%s'. Please /accept %u or /cancel %u the call.\n"
@@ -1094,30 +1116,8 @@ msgstr ""
msgid "Enables having a conversation with other GNUnet users."
msgstr ""
-#: src/conversation/gnunet-conversation-test.c:120
-#, c-format
-msgid ""
-"\n"
-"End of transmission. Have a GNU day.\n"
-msgstr ""
-
-#: src/conversation/gnunet-conversation-test.c:146
-#, c-format
-msgid ""
-"\n"
-"We are now playing your recording back. If you can hear it, your audio "
-"settings are working..."
-msgstr ""
-
-#: src/conversation/gnunet-conversation-test.c:218
-#, c-format
-msgid ""
-"We will now be recording you for %s. After that time, the recording will be "
-"played back to you..."
-msgstr ""
-
-#: src/conversation/gnunet_gst.c:664
#: src/conversation/gnunet-helper-audio-playback-gst.c:363
+#: src/conversation/gnunet_gst.c:664
#, c-format
msgid "Read error from STDIN: %d %s\n"
msgstr ""
@@ -1880,16 +1880,16 @@ msgstr ""
msgid "Mysql database running\n"
msgstr ""
-#: src/datastore/plugin_datastore_postgres.c:278
-#: src/datastore/plugin_datastore_postgres.c:891
+#: src/datastore/plugin_datastore_postgres.c:284
+#: src/datastore/plugin_datastore_postgres.c:897
msgid "Postgress exec failure"
msgstr ""
-#: src/datastore/plugin_datastore_postgres.c:852
+#: src/datastore/plugin_datastore_postgres.c:858
msgid "Failed to drop table from database.\n"
msgstr ""
-#: src/datastore/plugin_datastore_postgres.c:950
+#: src/datastore/plugin_datastore_postgres.c:956
msgid "Postgres database running\n"
msgstr ""
@@ -2000,89 +2000,42 @@ msgstr ""
msgid "Prints all packets that go through the DHT."
msgstr ""
-#: src/dht/gnunet_dht_profiler.c:922 src/testbed/gnunet-testbed-profiler.c:255
-#, c-format
-msgid "Exiting as the number of peers is %u\n"
+#: src/dht/gnunet-dht-put.c:133
+msgid "Must provide KEY and DATA for DHT put!\n"
msgstr ""
-#: src/dht/gnunet_dht_profiler.c:955 src/rps/gnunet-rps-profiler.c:3194
-#, fuzzy
-msgid "number of peers to start"
-msgstr "nombre de valeurs"
+#: src/dht/gnunet-dht-put.c:140
+#, fuzzy, c-format
+msgid "Could not connect to DHT service!\n"
+msgstr "Impossible d’ouvrir « %s ».\n"
-#: src/dht/gnunet_dht_profiler.c:961
-msgid "number of PUTs to perform per peer"
+#: src/dht/gnunet-dht-put.c:151
+#, c-format
+msgid "Issuing put request for `%s' with data `%s'!\n"
msgstr ""
-#: src/dht/gnunet_dht_profiler.c:967 src/nse/gnunet-nse-profiler.c:872
-#: src/testbed/gnunet-testbed-profiler.c:305
-msgid "name of the file with the login information for the testbed"
+#: src/dht/gnunet-dht-put.c:187
+msgid "the data to insert under the key"
msgstr ""
-#: src/dht/gnunet_dht_profiler.c:973
-msgid "delay between rounds for collecting statistics (default: 30 sec)"
+#: src/dht/gnunet-dht-put.c:193
+msgid "how long to store this entry in the dht (in seconds)"
msgstr ""
-#: src/dht/gnunet_dht_profiler.c:979
-msgid "delay to start doing PUTs (default: 1 sec)"
+#: src/dht/gnunet-dht-put.c:208
+msgid "how many replicas to create"
msgstr ""
-#: src/dht/gnunet_dht_profiler.c:985
-msgid "delay to start doing GETs (default: 5 min)"
+#: src/dht/gnunet-dht-put.c:212
+msgid "use DHT's record route option"
msgstr ""
-#: src/dht/gnunet_dht_profiler.c:990
-msgid "replication degree for DHT PUTs"
+#: src/dht/gnunet-dht-put.c:217
+msgid "the type to insert data as"
msgstr ""
-#: src/dht/gnunet_dht_profiler.c:996
-msgid "chance that a peer is selected at random for PUTs"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1002
-msgid "timeout for DHT PUT and GET requests (default: 1 min)"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1023
-msgid "Measure quality and performance of the DHT service."
-msgstr ""
-
-#: src/dht/gnunet-dht-put.c:133
-msgid "Must provide KEY and DATA for DHT put!\n"
-msgstr ""
-
-#: src/dht/gnunet-dht-put.c:140
-#, fuzzy, c-format
-msgid "Could not connect to DHT service!\n"
-msgstr "Impossible d’ouvrir « %s ».\n"
-
-#: src/dht/gnunet-dht-put.c:151
-#, c-format
-msgid "Issuing put request for `%s' with data `%s'!\n"
-msgstr ""
-
-#: src/dht/gnunet-dht-put.c:187
-msgid "the data to insert under the key"
-msgstr ""
-
-#: src/dht/gnunet-dht-put.c:193
-msgid "how long to store this entry in the dht (in seconds)"
-msgstr ""
-
-#: src/dht/gnunet-dht-put.c:208
-msgid "how many replicas to create"
-msgstr ""
-
-#: src/dht/gnunet-dht-put.c:212
-msgid "use DHT's record route option"
-msgstr ""
-
-#: src/dht/gnunet-dht-put.c:217
-msgid "the type to insert data as"
-msgstr ""
-
-#: src/dht/gnunet-dht-put.c:232
-msgid "Issue a PUT request to the GNUnet DHT insert DATA under KEY."
+#: src/dht/gnunet-dht-put.c:232
+msgid "Issue a PUT request to the GNUnet DHT insert DATA under KEY."
msgstr ""
#: src/dht/gnunet-service-dht_clients.c:367
@@ -2292,6 +2245,53 @@ msgstr ""
msgid "# DHT requests combined"
msgstr ""
+#: src/dht/gnunet_dht_profiler.c:922 src/testbed/gnunet-testbed-profiler.c:255
+#, c-format
+msgid "Exiting as the number of peers is %u\n"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:955 src/rps/gnunet-rps-profiler.c:3194
+#, fuzzy
+msgid "number of peers to start"
+msgstr "nombre de valeurs"
+
+#: src/dht/gnunet_dht_profiler.c:961
+msgid "number of PUTs to perform per peer"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:967 src/nse/gnunet-nse-profiler.c:872
+#: src/testbed/gnunet-testbed-profiler.c:305
+msgid "name of the file with the login information for the testbed"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:973
+msgid "delay between rounds for collecting statistics (default: 30 sec)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:979
+msgid "delay to start doing PUTs (default: 1 sec)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:985
+msgid "delay to start doing GETs (default: 5 min)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:990
+msgid "replication degree for DHT PUTs"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:996
+msgid "chance that a peer is selected at random for PUTs"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1002
+msgid "timeout for DHT PUT and GET requests (default: 1 min)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1023
+msgid "Measure quality and performance of the DHT service."
+msgstr ""
+
#: src/dht/plugin_block_dht.c:189
#, c-format
msgid "Block not of type %u\n"
@@ -3191,14 +3191,6 @@ msgid ""
"chk/...)"
msgstr ""
-#: src/fs/gnunet-fs.c:128
-msgid "print a list of all indexed files"
-msgstr ""
-
-#: src/fs/gnunet-fs.c:141
-msgid "Special file-sharing operations"
-msgstr ""
-
#: src/fs/gnunet-fs-profiler.c:211
msgid "run the experiment with COUNT peers"
msgstr ""
@@ -3215,6 +3207,14 @@ msgstr ""
msgid "run a testbed to measure file-sharing performance"
msgstr ""
+#: src/fs/gnunet-fs.c:128
+msgid "print a list of all indexed files"
+msgstr ""
+
+#: src/fs/gnunet-fs.c:141
+msgid "Special file-sharing operations"
+msgstr ""
+
#: src/fs/gnunet-publish.c:219 src/fs/gnunet-publish.c:234
#, c-format
msgid "Publishing `%s' at %llu/%llu (%s remaining)\n"
@@ -3860,49 +3860,6 @@ msgstr ""
msgid "look for GNS2DNS records instead of ANY"
msgstr ""
-#: src/gns/gnunet-gns.c:257
-#, c-format
-msgid "`%s' is not a valid DNS domain name\n"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:267 src/util/dnsparser.c:254
-#, c-format
-msgid "Failed to convert DNS IDNA name `%s' to UTF-8: %s\n"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:281
-msgid "Cannot resolve using GNS: GNUnet peer not running\n"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:305
-#, c-format
-msgid "Invalid typename specified, assuming `ANY'\n"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:340
-msgid "Lookup a record for the given name"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:346
-msgid "Specify the type of the record to lookup"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:352
-msgid "Specify a timeout for the lookup"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:356
-msgid "No unneeded output"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:361
-msgid "DNS Compatibility: Name is passed in IDNA instead of UTF-8"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:375
-msgid "GNUnet GNS resolver tool"
-msgstr ""
-
#: src/gns/gnunet-gns-import.c:486
msgid "This program will import some GNS authorities into your GNS namestore."
msgstr ""
@@ -4022,6 +3979,49 @@ msgstr ""
msgid "GNUnet GNS proxy"
msgstr ""
+#: src/gns/gnunet-gns.c:257
+#, c-format
+msgid "`%s' is not a valid DNS domain name\n"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:267 src/util/dnsparser.c:254
+#, c-format
+msgid "Failed to convert DNS IDNA name `%s' to UTF-8: %s\n"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:281
+msgid "Cannot resolve using GNS: GNUnet peer not running\n"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:305
+#, c-format
+msgid "Invalid typename specified, assuming `ANY'\n"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:340
+msgid "Lookup a record for the given name"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:346
+msgid "Specify the type of the record to lookup"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:352
+msgid "Specify a timeout for the lookup"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:356
+msgid "No unneeded output"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:361
+msgid "DNS Compatibility: Name is passed in IDNA instead of UTF-8"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:375
+msgid "GNUnet GNS resolver tool"
+msgstr ""
+
#: src/gns/gnunet-service-gns.c:505
msgid "Properly base32-encoded public key required"
msgstr ""
@@ -4031,8 +4031,8 @@ msgid "Failed to connect to the namecache!\n"
msgstr ""
#: src/gns/gnunet-service-gns.c:560
-#: src/zonemaster/gnunet-service-zonemaster.c:887
#: src/zonemaster/gnunet-service-zonemaster-monitor.c:444
+#: src/zonemaster/gnunet-service-zonemaster.c:887
msgid "Could not connect to DHT!\n"
msgstr ""
@@ -4518,7 +4518,7 @@ msgid "# hostlist advertisements send"
msgstr ""
#: src/hostlist/gnunet-daemon-hostlist_server.c:674
-#: src/transport/gnunet-service-transport.c:2659
+#: src/transport/gnunet-service-transport.c:2661
msgid "Could not access PEERINFO service. Exiting.\n"
msgstr ""
@@ -4766,6 +4766,68 @@ msgstr ""
msgid "Failed to setup database at `%s'\n"
msgstr "Échec du démarrage de %s\n"
+#: src/namestore/gnunet-namestore-fcfsd.c:552
+#, c-format
+msgid "Unsupported form value `%s'\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:579
+#, c-format
+msgid "Failed to create record for domain `%s': %s\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:600
+msgid "Error when mapping zone to name\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:632
+#, c-format
+msgid "Found existing name `%s' for the given key\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:694
+#, c-format
+msgid "Found %u existing records for domain `%s'\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:784
+#, c-format
+msgid "Failed to create page for `%s'\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:803
+#, c-format
+msgid "Failed to setup post processor for `%s'\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:840
+msgid "Domain name must not contain `.'\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:849
+msgid "Domain name must not contain `+'\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1084
+msgid "No ego configured for `fcfsd` subsystem\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1115
+msgid "Failed to start HTTP server\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1163
+msgid "Failed to connect to identity\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1190
+msgid "name of the zone that is to be managed by FCFSD"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1210
+msgid "GNU Name System First Come First Serve name registration service"
+msgstr ""
+
#: src/namestore/gnunet-namestore.c:334
#, c-format
msgid "Adding record failed: %s\n"
@@ -4992,68 +5054,6 @@ msgstr ""
msgid "name of the ego controlling the zone"
msgstr ""
-#: src/namestore/gnunet-namestore-fcfsd.c:552
-#, c-format
-msgid "Unsupported form value `%s'\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:579
-#, c-format
-msgid "Failed to create record for domain `%s': %s\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:600
-msgid "Error when mapping zone to name\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:632
-#, c-format
-msgid "Found existing name `%s' for the given key\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:694
-#, c-format
-msgid "Found %u existing records for domain `%s'\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:784
-#, c-format
-msgid "Failed to create page for `%s'\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:803
-#, c-format
-msgid "Failed to setup post processor for `%s'\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:840
-msgid "Domain name must not contain `.'\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:849
-msgid "Domain name must not contain `+'\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1084
-msgid "No ego configured for `fcfsd` subsystem\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1115
-msgid "Failed to start HTTP server\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1163
-msgid "Failed to connect to identity\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1190
-msgid "name of the zone that is to be managed by FCFSD"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1210
-msgid "GNU Name System First Come First Serve name registration service"
-msgstr ""
-
#: src/namestore/gnunet-service-namestore.c:866
#, c-format
msgid "Failed to replicate block in namecache: %s\n"
@@ -5360,10 +5360,6 @@ msgstr ""
msgid "`upnpc' command not found\n"
msgstr ""
-#: src/nse/gnunet-nse.c:124
-msgid "Show network size estimates from NSE service."
-msgstr ""
-
#: src/nse/gnunet-nse-profiler.c:857
msgid "limit to the number of connections to NSE services, 0 for none"
msgstr ""
@@ -5376,75 +5372,25 @@ msgstr ""
msgid "name of the file for writing the main results"
msgstr ""
-#: src/nse/gnunet-nse-profiler.c:888
-msgid "Number of peers to run in each round, separated by commas"
-msgstr ""
-
-#: src/nse/gnunet-nse-profiler.c:900
-msgid "delay between rounds"
-msgstr ""
-
-#: src/nse/gnunet-nse-profiler.c:912
-msgid "Measure quality and performance of the NSE service."
-msgstr ""
-
-#: src/nse/gnunet-service-nse.c:1443
-#: src/revocation/gnunet-service-revocation.c:834 src/util/gnunet-scrypt.c:257
-msgid "Value is too large.\n"
-msgstr ""
-
-#: src/peerinfo/gnunet-service-peerinfo.c:175
-#, c-format
-msgid "Removing expired address of transport `%s'\n"
-msgstr ""
-
-#: src/peerinfo/gnunet-service-peerinfo.c:306
-#, c-format
-msgid "Failed to parse HELLO in file `%s': %s\n"
-msgstr ""
-
-#: src/peerinfo/gnunet-service-peerinfo.c:323
-#: src/peerinfo/gnunet-service-peerinfo.c:348
-#, c-format
-msgid "Failed to parse HELLO in file `%s'\n"
-msgstr ""
-
-#: src/peerinfo/gnunet-service-peerinfo.c:426
-msgid "# peers known"
-msgstr ""
-
-#: src/peerinfo/gnunet-service-peerinfo.c:468
-#, c-format
-msgid ""
-"File `%s' in directory `%s' does not match naming convention. Removed.\n"
-msgstr ""
-
-#: src/peerinfo/gnunet-service-peerinfo.c:624
-#, c-format
-msgid "Scanning directory `%s'\n"
-msgstr ""
-
-#: src/peerinfo/gnunet-service-peerinfo.c:631
-#, c-format
-msgid "Still no peers found in `%s'!\n"
+#: src/nse/gnunet-nse-profiler.c:888
+msgid "Number of peers to run in each round, separated by commas"
msgstr ""
-#: src/peerinfo/gnunet-service-peerinfo.c:1024
-#, c-format
-msgid "Cleaning up directory `%s'\n"
+#: src/nse/gnunet-nse-profiler.c:900
+msgid "delay between rounds"
msgstr ""
-#: src/peerinfo/gnunet-service-peerinfo.c:1319
-#, c-format
-msgid "Importing HELLOs from `%s'\n"
+#: src/nse/gnunet-nse-profiler.c:912
+msgid "Measure quality and performance of the NSE service."
msgstr ""
-#: src/peerinfo/gnunet-service-peerinfo.c:1332
-msgid "Skipping import of included HELLOs\n"
+#: src/nse/gnunet-nse.c:124
+msgid "Show network size estimates from NSE service."
msgstr ""
-#: src/peerinfo/peerinfo_api.c:217
-msgid "Failed to receive response from `PEERINFO' service."
+#: src/nse/gnunet-service-nse.c:1443
+#: src/revocation/gnunet-service-revocation.c:834 src/util/gnunet-scrypt.c:257
+msgid "Value is too large.\n"
msgstr ""
#: src/peerinfo-tool/gnunet-peerinfo.c:237
@@ -5541,6 +5487,60 @@ msgstr ""
msgid "Peerinfo REST API initialized\n"
msgstr ""
+#: src/peerinfo/gnunet-service-peerinfo.c:175
+#, c-format
+msgid "Removing expired address of transport `%s'\n"
+msgstr ""
+
+#: src/peerinfo/gnunet-service-peerinfo.c:306
+#, c-format
+msgid "Failed to parse HELLO in file `%s': %s\n"
+msgstr ""
+
+#: src/peerinfo/gnunet-service-peerinfo.c:323
+#: src/peerinfo/gnunet-service-peerinfo.c:348
+#, c-format
+msgid "Failed to parse HELLO in file `%s'\n"
+msgstr ""
+
+#: src/peerinfo/gnunet-service-peerinfo.c:426
+msgid "# peers known"
+msgstr ""
+
+#: src/peerinfo/gnunet-service-peerinfo.c:468
+#, c-format
+msgid ""
+"File `%s' in directory `%s' does not match naming convention. Removed.\n"
+msgstr ""
+
+#: src/peerinfo/gnunet-service-peerinfo.c:624
+#, c-format
+msgid "Scanning directory `%s'\n"
+msgstr ""
+
+#: src/peerinfo/gnunet-service-peerinfo.c:631
+#, c-format
+msgid "Still no peers found in `%s'!\n"
+msgstr ""
+
+#: src/peerinfo/gnunet-service-peerinfo.c:1024
+#, c-format
+msgid "Cleaning up directory `%s'\n"
+msgstr ""
+
+#: src/peerinfo/gnunet-service-peerinfo.c:1319
+#, c-format
+msgid "Importing HELLOs from `%s'\n"
+msgstr ""
+
+#: src/peerinfo/gnunet-service-peerinfo.c:1332
+msgid "Skipping import of included HELLOs\n"
+msgstr ""
+
+#: src/peerinfo/peerinfo_api.c:217
+msgid "Failed to receive response from `PEERINFO' service."
+msgstr ""
+
#: src/peerstore/gnunet-peerstore.c:92
msgid "peerstore"
msgstr ""
@@ -5980,18 +5980,6 @@ msgstr ""
msgid "Could not open revocation database file!"
msgstr ""
-#: src/rps/gnunet-rps.c:270
-msgid "Seed a PeerID"
-msgstr ""
-
-#: src/rps/gnunet-rps.c:275
-msgid "Get updates of view (0 for infinite updates)"
-msgstr ""
-
-#: src/rps/gnunet-rps.c:279
-msgid "Get peers from biased stream"
-msgstr ""
-
#: src/rps/gnunet-rps-profiler.c:3200
msgid "duration of the profiling"
msgstr ""
@@ -6009,6 +5997,18 @@ msgstr "nombre de valeurs"
msgid "Measure quality and performance of the RPS service."
msgstr ""
+#: src/rps/gnunet-rps.c:270
+msgid "Seed a PeerID"
+msgstr ""
+
+#: src/rps/gnunet-rps.c:275
+msgid "Get updates of view (0 for infinite updates)"
+msgstr ""
+
+#: src/rps/gnunet-rps.c:279
+msgid "Get peers from biased stream"
+msgstr ""
+
#: src/scalarproduct/gnunet-scalarproduct.c:229
msgid "You must specify at least one message ID to check!\n"
msgstr ""
@@ -6063,10 +6063,10 @@ msgstr ""
msgid "Calculate the Vectorproduct with a GNUnet peer."
msgstr ""
-#: src/scalarproduct/gnunet-service-scalarproduct_alice.c:1358
-#: src/scalarproduct/gnunet-service-scalarproduct_bob.c:1355
#: src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c:1118
#: src/scalarproduct/gnunet-service-scalarproduct-ecc_bob.c:1063
+#: src/scalarproduct/gnunet-service-scalarproduct_alice.c:1358
+#: src/scalarproduct/gnunet-service-scalarproduct_bob.c:1355
msgid "Connect to CADET failed\n"
msgstr ""
@@ -6415,15 +6415,6 @@ msgstr ""
msgid "%.s Unknown result code."
msgstr "%.s Code d'erreur inconnu"
-#: src/testbed/gnunet_testbed_mpi_spawn.c:119
-msgid "Waiting for child to exit.\n"
-msgstr ""
-
-#: src/testbed/gnunet_testbed_mpi_spawn.c:242
-#, c-format
-msgid "Spawning process `%s'\n"
-msgstr ""
-
#: src/testbed/gnunet-testbed-profiler.c:290
msgid "tolerate COUNT number of continious timeout failures"
msgstr ""
@@ -6435,6 +6426,15 @@ msgid ""
"signal is received"
msgstr ""
+#: src/testbed/gnunet_testbed_mpi_spawn.c:119
+msgid "Waiting for child to exit.\n"
+msgstr ""
+
+#: src/testbed/gnunet_testbed_mpi_spawn.c:242
+#, c-format
+msgid "Spawning process `%s'\n"
+msgstr ""
+
#: src/testbed/testbed_api.c:399
#, c-format
msgid "Adding host %u failed with error: %s\n"
@@ -6722,18 +6722,18 @@ msgstr ""
msgid "GNUnet topology control"
msgstr ""
-#: src/transport/gnunet-communicator-tcp.c:3189
-#: src/transport/gnunet-communicator-udp.c:2826
+#: src/transport/gnunet-communicator-tcp.c:3221
+#: src/transport/gnunet-communicator-udp.c:2995
#: src/transport/gnunet-service-tng.c:10014
-#: src/transport/gnunet-service-transport.c:2624
+#: src/transport/gnunet-service-transport.c:2626
msgid "Transport service is lacking key configuration settings. Exiting.\n"
msgstr ""
-#: src/transport/gnunet-communicator-tcp.c:3494
+#: src/transport/gnunet-communicator-tcp.c:3553
msgid "GNUnet TCP communicator"
msgstr ""
-#: src/transport/gnunet-communicator-udp.c:2898
+#: src/transport/gnunet-communicator-udp.c:3067
msgid "GNUnet UDP communicator"
msgstr ""
@@ -6756,50 +6756,50 @@ msgstr ""
msgid "GNUnet UNIX domain socket communicator"
msgstr ""
-#: src/transport/gnunet-service-transport_ats.c:137
-msgid "# Addresses given to ATS"
-msgstr ""
-
#: src/transport/gnunet-service-transport.c:445
msgid "# messages dropped due to slow client"
msgstr ""
-#: src/transport/gnunet-service-transport.c:794
+#: src/transport/gnunet-service-transport.c:796
msgid "# bytes payload dropped (other peer was not connected)"
msgstr ""
-#: src/transport/gnunet-service-transport.c:1477
+#: src/transport/gnunet-service-transport.c:1479
msgid "# bytes payload discarded due to not connected peer"
msgstr ""
-#: src/transport/gnunet-service-transport.c:1622
+#: src/transport/gnunet-service-transport.c:1624
msgid "# bytes total received"
msgstr ""
-#: src/transport/gnunet-service-transport.c:1712
+#: src/transport/gnunet-service-transport.c:1714
msgid "# bytes payload received"
msgstr ""
-#: src/transport/gnunet-service-transport.c:2016
-#: src/transport/gnunet-service-transport.c:2450
+#: src/transport/gnunet-service-transport.c:2018
+#: src/transport/gnunet-service-transport.c:2452
msgid "# disconnects due to blacklist"
msgstr ""
-#: src/transport/gnunet-service-transport.c:2454
+#: src/transport/gnunet-service-transport.c:2456
#, c-format
msgid "Disallowing connection to peer `%s' on transport %s\n"
msgstr ""
-#: src/transport/gnunet-service-transport.c:2549
+#: src/transport/gnunet-service-transport.c:2551
#, c-format
msgid "Adding blacklisting entry for peer `%s'\n"
msgstr ""
-#: src/transport/gnunet-service-transport.c:2558
+#: src/transport/gnunet-service-transport.c:2560
#, c-format
msgid "Adding blacklisting entry for peer `%s':`%s'\n"
msgstr ""
+#: src/transport/gnunet-service-transport_ats.c:137
+msgid "# Addresses given to ATS"
+msgstr ""
+
#: src/transport/gnunet-service-transport_hello.c:195
msgid "# refreshed my HELLO"
msgstr ""
@@ -7105,6 +7105,42 @@ msgstr ""
msgid "# HELLOs given to peerinfo"
msgstr ""
+#: src/transport/gnunet-transport-profiler.c:220
+#, c-format
+msgid "%llu B in %llu ms == %.2f KB/s!\n"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:577
+msgid "send data to peer"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:581
+msgid "receive data from peer"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:586
+msgid "iterations"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:591
+#, fuzzy
+msgid "number of messages to send"
+msgstr "nombre de valeurs"
+
+#: src/transport/gnunet-transport-profiler.c:596
+msgid "message size to use"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:601
+#: src/transport/gnunet-transport.c:1404
+msgid "peer identity"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:614
+#: src/transport/gnunet-transport.c:1426
+msgid "Direct access to transport service."
+msgstr ""
+
#: src/transport/gnunet-transport.c:406
#, c-format
msgid "Transmitted %llu bytes/s (%llu bytes in %s)\n"
@@ -7234,11 +7270,6 @@ msgstr ""
msgid "do not resolve hostnames"
msgstr ""
-#: src/transport/gnunet-transport.c:1404
-#: src/transport/gnunet-transport-profiler.c:601
-msgid "peer identity"
-msgstr ""
-
#: src/transport/gnunet-transport.c:1408
msgid "monitor plugin sessions"
msgstr ""
@@ -7247,37 +7278,6 @@ msgstr ""
msgid "send data for benchmarking to the other peer (until CTRL-C)"
msgstr ""
-#: src/transport/gnunet-transport.c:1426
-#: src/transport/gnunet-transport-profiler.c:614
-msgid "Direct access to transport service."
-msgstr ""
-
-#: src/transport/gnunet-transport-profiler.c:220
-#, c-format
-msgid "%llu B in %llu ms == %.2f KB/s!\n"
-msgstr ""
-
-#: src/transport/gnunet-transport-profiler.c:577
-msgid "send data to peer"
-msgstr ""
-
-#: src/transport/gnunet-transport-profiler.c:581
-msgid "receive data from peer"
-msgstr ""
-
-#: src/transport/gnunet-transport-profiler.c:586
-msgid "iterations"
-msgstr ""
-
-#: src/transport/gnunet-transport-profiler.c:591
-#, fuzzy
-msgid "number of messages to send"
-msgstr "nombre de valeurs"
-
-#: src/transport/gnunet-transport-profiler.c:596
-msgid "message size to use"
-msgstr ""
-
#: src/transport/plugin_transport_http_client.c:1489
#: src/transport/plugin_transport_http_server.c:2331
#: src/transport/plugin_transport_http_server.c:3562
@@ -7543,20 +7543,6 @@ msgstr ""
msgid "TCP transport advertises itself as being on port %llu\n"
msgstr ""
-#: src/transport/plugin_transport_udp_broadcasting.c:169
-msgid "# Multicast HELLO beacons received via UDP"
-msgstr ""
-
-#: src/transport/plugin_transport_udp_broadcasting.c:553
-msgid ""
-"Disabling HELLO broadcasting due to friend-to-friend only configuration!\n"
-msgstr ""
-
-#: src/transport/plugin_transport_udp_broadcasting.c:571
-#, c-format
-msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n"
-msgstr ""
-
#: src/transport/plugin_transport_udp.c:3169
#, c-format
msgid ""
@@ -7603,6 +7589,20 @@ msgstr "adresse invalide"
msgid "Failed to create UDP network sockets\n"
msgstr ""
+#: src/transport/plugin_transport_udp_broadcasting.c:169
+msgid "# Multicast HELLO beacons received via UDP"
+msgstr ""
+
+#: src/transport/plugin_transport_udp_broadcasting.c:553
+msgid ""
+"Disabling HELLO broadcasting due to friend-to-friend only configuration!\n"
+msgstr ""
+
+#: src/transport/plugin_transport_udp_broadcasting.c:571
+#, c-format
+msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n"
+msgstr ""
+
#: src/transport/plugin_transport_unix.c:1396
#, c-format
msgid "Cannot bind to `%s'\n"
@@ -7775,7 +7775,7 @@ msgid "do daemonize (detach from terminal)"
msgstr ""
#: src/transport/tcp_service_legacy.c:1397
-#: src/transport/transport-testing2.c:1116 src/util/service.c:2072
+#: src/transport/transport-testing2.c:983 src/util/service.c:2072
#: src/util/service.c:2084
#, c-format
msgid "Malformed configuration file `%s', exit ...\n"
@@ -8434,19 +8434,19 @@ msgid ""
"Fatal internal logic error, process hangs in `%s' (abort with CTRL-C)!\n"
msgstr ""
-#: src/util/os_installation.c:409
+#: src/util/os_installation.c:411
#, c-format
msgid ""
"Could not determine installation path for %s. Set `%s' environment "
"variable.\n"
msgstr ""
-#: src/util/os_installation.c:792
+#: src/util/os_installation.c:794
#, c-format
msgid "Could not find binary `%s' in PATH!\n"
msgstr ""
-#: src/util/os_installation.c:825
+#: src/util/os_installation.c:827
#, c-format
msgid "Binary `%s' exists, but is not SUID\n"
msgstr ""
@@ -8470,17 +8470,17 @@ msgstr ""
msgid "Could not determine plugin installation path.\n"
msgstr ""
-#: src/util/program.c:262
+#: src/util/program.c:267
#, fuzzy, c-format
msgid "Unreadable or malformed configuration file `%s', exit ...\n"
msgstr "fornat invalide : « %s »\n"
-#: src/util/program.c:279
+#: src/util/program.c:284
#, c-format
msgid "Unreadable or malformed default configuration file `%s', exit ...\n"
msgstr ""
-#: src/util/program.c:294
+#: src/util/program.c:299
#, fuzzy
msgid "Unreadable or malformed configuration, exit ...\n"
msgstr "fornat invalide : « %s »\n"
@@ -8545,10 +8545,6 @@ msgstr ""
msgid "Attempting to proxy service `%s' to invalid port %d or hostname.\n"
msgstr ""
-#: src/util/strings.c:179
-msgid "b"
-msgstr "o"
-
#: src/util/strings.c:503
#, c-format
msgid "Character sets requested were `%s'->`%s'\n"
@@ -8558,46 +8554,6 @@ msgstr ""
msgid "Failed to expand `$HOME': environment variable `HOME' not set"
msgstr ""
-#: src/util/strings.c:706
-msgid "µs"
-msgstr "µs"
-
-#: src/util/strings.c:710
-msgid "forever"
-msgstr "perpetuel"
-
-#: src/util/strings.c:712
-msgid "0 ms"
-msgstr "0 ms"
-
-#: src/util/strings.c:716
-msgid "ms"
-msgstr "ms"
-
-#: src/util/strings.c:720
-msgid "s"
-msgstr "s"
-
-#: src/util/strings.c:724
-msgid "m"
-msgstr "m"
-
-#: src/util/strings.c:728
-msgid "h"
-msgstr "h"
-
-#: src/util/strings.c:734
-msgid "day"
-msgstr "jour"
-
-#: src/util/strings.c:736
-msgid "days"
-msgstr "jours"
-
-#: src/util/strings.c:764
-msgid "end of time"
-msgstr "fin du temps"
-
#: src/util/strings.c:1240
msgid "IPv6 address did not start with `['\n"
msgstr ""
@@ -8834,11 +8790,44 @@ msgstr ""
msgid "Setup tunnels via VPN."
msgstr "Configurer des tunnels via VPN."
-#: src/zonemaster/gnunet-service-zonemaster.c:849
#: src/zonemaster/gnunet-service-zonemaster-monitor.c:420
+#: src/zonemaster/gnunet-service-zonemaster.c:849
msgid "Failed to connect to the namestore!\n"
msgstr ""
+#~ msgid "b"
+#~ msgstr "o"
+
+#~ msgid "µs"
+#~ msgstr "µs"
+
+#~ msgid "forever"
+#~ msgstr "perpetuel"
+
+#~ msgid "0 ms"
+#~ msgstr "0 ms"
+
+#~ msgid "ms"
+#~ msgstr "ms"
+
+#~ msgid "s"
+#~ msgstr "s"
+
+#~ msgid "m"
+#~ msgstr "m"
+
+#~ msgid "h"
+#~ msgstr "h"
+
+#~ msgid "day"
+#~ msgstr "jour"
+
+#~ msgid "days"
+#~ msgstr "jours"
+
+#~ msgid "end of time"
+#~ msgstr "fin du temps"
+
#, fuzzy
#~ msgid "Assertion failed at %s:%d. Aborting.\n"
#~ msgstr "opus_encode_float() échoué : %s. Annulation\n"
diff --git a/po/it.po b/po/it.po
index 278ad6e57..19a5cd85f 100644
--- a/po/it.po
+++ b/po/it.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gnunet 0.10.1\n"
"Report-Msgid-Bugs-To: gnunet-developers@mail.gnu.org\n"
-"POT-Creation-Date: 2020-09-06 10:07+0200\n"
+"POT-Creation-Date: 2020-10-13 16:12+0200\n"
"PO-Revision-Date: 2019-10-16 11:00+0200\n"
"Last-Translator: Sebastiano Pistore <sebastianopistore.info@protonmail.ch>\n"
"Language-Team: Italian <tp@lists.linux.it>\n"
@@ -31,8 +31,8 @@ msgid "Issuer public key `%s' is not well-formed\n"
msgstr ""
#: src/abd/gnunet-abd.c:560 src/abd/gnunet-service-abd.c:1747
-#: src/namestore/gnunet-namestore.c:1001
#: src/namestore/gnunet-namestore-fcfsd.c:1154
+#: src/namestore/gnunet-namestore.c:1001
#, c-format
msgid "Failed to connect to namestore\n"
msgstr ""
@@ -492,80 +492,13 @@ msgstr ""
msgid "Initiating shutdown as requested by client.\n"
msgstr ""
-#: src/ats/gnunet-ats-solver-eval.c:2992 src/ats/gnunet-ats-solver-eval.c:3044
-#, c-format
-msgid ""
-"Could not load quota for network `%s': `%s', assigning default bandwidth "
-"%llu\n"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3011
-#, c-format
-msgid ""
-"No outbound quota configured for network `%s', assigning default bandwidth "
-"%llu\n"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3063
-#, c-format
-msgid ""
-"No outbound quota configure for network `%s', assigning default bandwidth "
-"%llu\n"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3552 src/ats-tests/gnunet-solver-eval.c:997
-msgid "solver to use"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3557
-#: src/ats-tests/gnunet-solver-eval.c:1003
-#: src/ats-tests/gnunet-solver-eval.c:1008
-msgid "experiment to use"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3564
-msgid "print logging"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3569
-msgid "save logging to disk"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3574
-msgid "disable normalization"
-msgstr ""
-
-#: src/ats/gnunet-service-ats_plugins.c:326
-#, c-format
-msgid ""
-"Could not load %s quota for network `%s': `%s', assigning default bandwidth "
-"%llu\n"
-msgstr ""
-
-#: src/ats/gnunet-service-ats_plugins.c:336
-#, c-format
-msgid "%s quota configured for network `%s' is %llu\n"
-msgstr ""
-
-#: src/ats/gnunet-service-ats_plugins.c:382
-#, c-format
-msgid ""
-"No %s-quota configured for network `%s', assigning default bandwidth %llu\n"
-msgstr ""
-
-#: src/ats/gnunet-service-ats_plugins.c:474
-#, c-format
-msgid "Failed to initialize solver `%s'!\n"
-msgstr ""
-
-#: src/ats/plugin_ats_proportional.c:1142
-#, c-format
-msgid "Invalid %s configuration %f \n"
+#: src/ats-tests/ats-testing-log.c:896
+msgid "Stop logging\n"
msgstr ""
-#: src/ats/plugin_ats_proportional.c:1165
+#: src/ats-tests/ats-testing-log.c:952
#, c-format
-msgid "Invalid %s configuration %f\n"
+msgid "Start logging `%s'\n"
msgstr ""
#: src/ats-tests/ats-testing.c:420
@@ -578,15 +511,6 @@ msgstr ""
msgid "Failed to connect master peer [%u] with slave [%u]\n"
msgstr ""
-#: src/ats-tests/ats-testing-log.c:896
-msgid "Stop logging\n"
-msgstr ""
-
-#: src/ats-tests/ats-testing-log.c:952
-#, c-format
-msgid "Start logging `%s'\n"
-msgstr ""
-
#: src/ats-tests/gnunet-ats-sim.c:92
#, c-format
msgid ""
@@ -594,6 +518,16 @@ msgid ""
"= %u KiB/s\n"
msgstr ""
+#: src/ats-tests/gnunet-solver-eval.c:997 src/ats/gnunet-ats-solver-eval.c:3552
+msgid "solver to use"
+msgstr ""
+
+#: src/ats-tests/gnunet-solver-eval.c:1003
+#: src/ats-tests/gnunet-solver-eval.c:1008
+#: src/ats/gnunet-ats-solver-eval.c:3557
+msgid "experiment to use"
+msgstr ""
+
#: src/ats-tool/gnunet-ats.c:299
#, c-format
msgid "%u address resolutions had a timeout\n"
@@ -710,6 +644,72 @@ msgstr ""
msgid "Print information about ATS state"
msgstr ""
+#: src/ats/gnunet-ats-solver-eval.c:2992 src/ats/gnunet-ats-solver-eval.c:3044
+#, c-format
+msgid ""
+"Could not load quota for network `%s': `%s', assigning default bandwidth "
+"%llu\n"
+msgstr ""
+
+#: src/ats/gnunet-ats-solver-eval.c:3011
+#, c-format
+msgid ""
+"No outbound quota configured for network `%s', assigning default bandwidth "
+"%llu\n"
+msgstr ""
+
+#: src/ats/gnunet-ats-solver-eval.c:3063
+#, c-format
+msgid ""
+"No outbound quota configure for network `%s', assigning default bandwidth "
+"%llu\n"
+msgstr ""
+
+#: src/ats/gnunet-ats-solver-eval.c:3564
+msgid "print logging"
+msgstr ""
+
+#: src/ats/gnunet-ats-solver-eval.c:3569
+msgid "save logging to disk"
+msgstr ""
+
+#: src/ats/gnunet-ats-solver-eval.c:3574
+msgid "disable normalization"
+msgstr ""
+
+#: src/ats/gnunet-service-ats_plugins.c:326
+#, c-format
+msgid ""
+"Could not load %s quota for network `%s': `%s', assigning default bandwidth "
+"%llu\n"
+msgstr ""
+
+#: src/ats/gnunet-service-ats_plugins.c:336
+#, c-format
+msgid "%s quota configured for network `%s' is %llu\n"
+msgstr ""
+
+#: src/ats/gnunet-service-ats_plugins.c:382
+#, c-format
+msgid ""
+"No %s-quota configured for network `%s', assigning default bandwidth %llu\n"
+msgstr ""
+
+#: src/ats/gnunet-service-ats_plugins.c:474
+#, c-format
+msgid "Failed to initialize solver `%s'!\n"
+msgstr ""
+
+#: src/ats/plugin_ats_proportional.c:1142
+#, c-format
+msgid "Invalid %s configuration %f \n"
+msgstr ""
+
+#: src/ats/plugin_ats_proportional.c:1165
+#, c-format
+msgid "Invalid %s configuration %f\n"
+msgstr ""
+
#: src/auction/gnunet-auction-create.c:163
msgid "description of the item to be sold"
msgstr ""
@@ -840,6 +840,28 @@ msgstr ""
msgid "Connection to conversation service lost, trying to reconnect\n"
msgstr ""
+#: src/conversation/gnunet-conversation-test.c:120
+#, c-format
+msgid ""
+"\n"
+"End of transmission. Have a GNU day.\n"
+msgstr ""
+
+#: src/conversation/gnunet-conversation-test.c:146
+#, c-format
+msgid ""
+"\n"
+"We are now playing your recording back. If you can hear it, your audio "
+"settings are working..."
+msgstr ""
+
+#: src/conversation/gnunet-conversation-test.c:218
+#, c-format
+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.c:264
#, c-format
msgid "Incoming call from `%s'. Please /accept %u or /cancel %u the call.\n"
@@ -1096,30 +1118,8 @@ msgstr ""
msgid "Enables having a conversation with other GNUnet users."
msgstr ""
-#: src/conversation/gnunet-conversation-test.c:120
-#, c-format
-msgid ""
-"\n"
-"End of transmission. Have a GNU day.\n"
-msgstr ""
-
-#: src/conversation/gnunet-conversation-test.c:146
-#, c-format
-msgid ""
-"\n"
-"We are now playing your recording back. If you can hear it, your audio "
-"settings are working..."
-msgstr ""
-
-#: src/conversation/gnunet-conversation-test.c:218
-#, c-format
-msgid ""
-"We will now be recording you for %s. After that time, the recording will be "
-"played back to you..."
-msgstr ""
-
-#: src/conversation/gnunet_gst.c:664
#: src/conversation/gnunet-helper-audio-playback-gst.c:363
+#: src/conversation/gnunet_gst.c:664
#, c-format
msgid "Read error from STDIN: %d %s\n"
msgstr ""
@@ -1891,16 +1891,16 @@ msgstr ""
msgid "Mysql database running\n"
msgstr ""
-#: src/datastore/plugin_datastore_postgres.c:278
-#: src/datastore/plugin_datastore_postgres.c:891
+#: src/datastore/plugin_datastore_postgres.c:284
+#: src/datastore/plugin_datastore_postgres.c:897
msgid "Postgress exec failure"
msgstr ""
-#: src/datastore/plugin_datastore_postgres.c:852
+#: src/datastore/plugin_datastore_postgres.c:858
msgid "Failed to drop table from database.\n"
msgstr ""
-#: src/datastore/plugin_datastore_postgres.c:950
+#: src/datastore/plugin_datastore_postgres.c:956
msgid "Postgres database running\n"
msgstr ""
@@ -2007,52 +2007,6 @@ msgstr ""
msgid "Prints all packets that go through the DHT."
msgstr ""
-#: src/dht/gnunet_dht_profiler.c:922 src/testbed/gnunet-testbed-profiler.c:255
-#, c-format
-msgid "Exiting as the number of peers is %u\n"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:955 src/rps/gnunet-rps-profiler.c:3194
-msgid "number of peers to start"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:961
-msgid "number of PUTs to perform per peer"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:967 src/nse/gnunet-nse-profiler.c:872
-#: src/testbed/gnunet-testbed-profiler.c:305
-msgid "name of the file with the login information for the testbed"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:973
-msgid "delay between rounds for collecting statistics (default: 30 sec)"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:979
-msgid "delay to start doing PUTs (default: 1 sec)"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:985
-msgid "delay to start doing GETs (default: 5 min)"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:990
-msgid "replication degree for DHT PUTs"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:996
-msgid "chance that a peer is selected at random for PUTs"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1002
-msgid "timeout for DHT PUT and GET requests (default: 1 min)"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1023
-msgid "Measure quality and performance of the DHT service."
-msgstr ""
-
#: src/dht/gnunet-dht-put.c:133
msgid "Must provide KEY and DATA for DHT put!\n"
msgstr ""
@@ -2298,9 +2252,55 @@ msgstr ""
msgid "# DHT requests combined"
msgstr ""
-#: src/dht/plugin_block_dht.c:189
+#: src/dht/gnunet_dht_profiler.c:922 src/testbed/gnunet-testbed-profiler.c:255
#, c-format
-msgid "Block not of type %u\n"
+msgid "Exiting as the number of peers is %u\n"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:955 src/rps/gnunet-rps-profiler.c:3194
+msgid "number of peers to start"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:961
+msgid "number of PUTs to perform per peer"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:967 src/nse/gnunet-nse-profiler.c:872
+#: src/testbed/gnunet-testbed-profiler.c:305
+msgid "name of the file with the login information for the testbed"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:973
+msgid "delay between rounds for collecting statistics (default: 30 sec)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:979
+msgid "delay to start doing PUTs (default: 1 sec)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:985
+msgid "delay to start doing GETs (default: 5 min)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:990
+msgid "replication degree for DHT PUTs"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:996
+msgid "chance that a peer is selected at random for PUTs"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1002
+msgid "timeout for DHT PUT and GET requests (default: 1 min)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1023
+msgid "Measure quality and performance of the DHT service."
+msgstr ""
+
+#: src/dht/plugin_block_dht.c:189
+#, c-format
+msgid "Block not of type %u\n"
msgstr ""
#: src/dht/plugin_block_dht.c:198
@@ -3207,14 +3207,6 @@ msgid ""
"chk/...)"
msgstr ""
-#: src/fs/gnunet-fs.c:128
-msgid "print a list of all indexed files"
-msgstr ""
-
-#: src/fs/gnunet-fs.c:141
-msgid "Special file-sharing operations"
-msgstr ""
-
#: src/fs/gnunet-fs-profiler.c:211
msgid "run the experiment with COUNT peers"
msgstr ""
@@ -3231,6 +3223,14 @@ msgstr ""
msgid "run a testbed to measure file-sharing performance"
msgstr ""
+#: src/fs/gnunet-fs.c:128
+msgid "print a list of all indexed files"
+msgstr ""
+
+#: src/fs/gnunet-fs.c:141
+msgid "Special file-sharing operations"
+msgstr ""
+
#: src/fs/gnunet-publish.c:219 src/fs/gnunet-publish.c:234
#, c-format
msgid "Publishing `%s' at %llu/%llu (%s remaining)\n"
@@ -3885,49 +3885,6 @@ msgstr ""
msgid "look for GNS2DNS records instead of ANY"
msgstr ""
-#: src/gns/gnunet-gns.c:257
-#, fuzzy, c-format
-msgid "`%s' is not a valid DNS domain name\n"
-msgstr "`%s' non è un indirizzo IP valido.\n"
-
-#: src/gns/gnunet-gns.c:267 src/util/dnsparser.c:254
-#, c-format
-msgid "Failed to convert DNS IDNA name `%s' to UTF-8: %s\n"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:281
-msgid "Cannot resolve using GNS: GNUnet peer not running\n"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:305
-#, c-format
-msgid "Invalid typename specified, assuming `ANY'\n"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:340
-msgid "Lookup a record for the given name"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:346
-msgid "Specify the type of the record to lookup"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:352
-msgid "Specify a timeout for the lookup"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:356
-msgid "No unneeded output"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:361
-msgid "DNS Compatibility: Name is passed in IDNA instead of UTF-8"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:375
-msgid "GNUnet GNS resolver tool"
-msgstr ""
-
#: src/gns/gnunet-gns-import.c:486
msgid "This program will import some GNS authorities into your GNS namestore."
msgstr ""
@@ -4047,6 +4004,49 @@ msgstr ""
msgid "GNUnet GNS proxy"
msgstr ""
+#: src/gns/gnunet-gns.c:257
+#, fuzzy, c-format
+msgid "`%s' is not a valid DNS domain name\n"
+msgstr "`%s' non è un indirizzo IP valido.\n"
+
+#: src/gns/gnunet-gns.c:267 src/util/dnsparser.c:254
+#, c-format
+msgid "Failed to convert DNS IDNA name `%s' to UTF-8: %s\n"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:281
+msgid "Cannot resolve using GNS: GNUnet peer not running\n"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:305
+#, c-format
+msgid "Invalid typename specified, assuming `ANY'\n"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:340
+msgid "Lookup a record for the given name"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:346
+msgid "Specify the type of the record to lookup"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:352
+msgid "Specify a timeout for the lookup"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:356
+msgid "No unneeded output"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:361
+msgid "DNS Compatibility: Name is passed in IDNA instead of UTF-8"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:375
+msgid "GNUnet GNS resolver tool"
+msgstr ""
+
#: src/gns/gnunet-service-gns.c:505
#, fuzzy
msgid "Properly base32-encoded public key required"
@@ -4057,8 +4057,8 @@ msgid "Failed to connect to the namecache!\n"
msgstr ""
#: src/gns/gnunet-service-gns.c:560
-#: src/zonemaster/gnunet-service-zonemaster.c:887
#: src/zonemaster/gnunet-service-zonemaster-monitor.c:444
+#: src/zonemaster/gnunet-service-zonemaster.c:887
msgid "Could not connect to DHT!\n"
msgstr ""
@@ -4544,7 +4544,7 @@ msgid "# hostlist advertisements send"
msgstr ""
#: src/hostlist/gnunet-daemon-hostlist_server.c:674
-#: src/transport/gnunet-service-transport.c:2659
+#: src/transport/gnunet-service-transport.c:2661
msgid "Could not access PEERINFO service. Exiting.\n"
msgstr ""
@@ -4793,6 +4793,68 @@ msgstr ""
msgid "Failed to setup database at `%s'\n"
msgstr "Impossibile avviare il servizio ' %s'\n"
+#: src/namestore/gnunet-namestore-fcfsd.c:552
+#, c-format
+msgid "Unsupported form value `%s'\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:579
+#, c-format
+msgid "Failed to create record for domain `%s': %s\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:600
+msgid "Error when mapping zone to name\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:632
+#, c-format
+msgid "Found existing name `%s' for the given key\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:694
+#, c-format
+msgid "Found %u existing records for domain `%s'\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:784
+#, c-format
+msgid "Failed to create page for `%s'\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:803
+#, c-format
+msgid "Failed to setup post processor for `%s'\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:840
+msgid "Domain name must not contain `.'\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:849
+msgid "Domain name must not contain `+'\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1084
+msgid "No ego configured for `fcfsd` subsystem\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1115
+msgid "Failed to start HTTP server\n"
+msgstr "Impossibile avviare il server HTTP\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1163
+msgid "Failed to connect to identity\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1190
+msgid "name of the zone that is to be managed by FCFSD"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1210
+msgid "GNU Name System First Come First Serve name registration service"
+msgstr ""
+
#: src/namestore/gnunet-namestore.c:334
#, c-format
msgid "Adding record failed: %s\n"
@@ -5019,68 +5081,6 @@ msgstr ""
msgid "name of the ego controlling the zone"
msgstr ""
-#: src/namestore/gnunet-namestore-fcfsd.c:552
-#, c-format
-msgid "Unsupported form value `%s'\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:579
-#, c-format
-msgid "Failed to create record for domain `%s': %s\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:600
-msgid "Error when mapping zone to name\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:632
-#, c-format
-msgid "Found existing name `%s' for the given key\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:694
-#, c-format
-msgid "Found %u existing records for domain `%s'\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:784
-#, c-format
-msgid "Failed to create page for `%s'\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:803
-#, c-format
-msgid "Failed to setup post processor for `%s'\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:840
-msgid "Domain name must not contain `.'\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:849
-msgid "Domain name must not contain `+'\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1084
-msgid "No ego configured for `fcfsd` subsystem\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1115
-msgid "Failed to start HTTP server\n"
-msgstr "Impossibile avviare il server HTTP\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1163
-msgid "Failed to connect to identity\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1190
-msgid "name of the zone that is to be managed by FCFSD"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1210
-msgid "GNU Name System First Come First Serve name registration service"
-msgstr ""
-
#: src/namestore/gnunet-service-namestore.c:866
#, c-format
msgid "Failed to replicate block in namecache: %s\n"
@@ -5387,10 +5387,6 @@ msgstr ""
msgid "`upnpc' command not found\n"
msgstr ""
-#: src/nse/gnunet-nse.c:124
-msgid "Show network size estimates from NSE service."
-msgstr ""
-
#: src/nse/gnunet-nse-profiler.c:857
msgid "limit to the number of connections to NSE services, 0 for none"
msgstr ""
@@ -5403,75 +5399,25 @@ msgstr ""
msgid "name of the file for writing the main results"
msgstr ""
-#: src/nse/gnunet-nse-profiler.c:888
-msgid "Number of peers to run in each round, separated by commas"
-msgstr ""
-
-#: src/nse/gnunet-nse-profiler.c:900
-msgid "delay between rounds"
-msgstr ""
-
-#: src/nse/gnunet-nse-profiler.c:912
-msgid "Measure quality and performance of the NSE service."
-msgstr ""
-
-#: src/nse/gnunet-service-nse.c:1443
-#: src/revocation/gnunet-service-revocation.c:834 src/util/gnunet-scrypt.c:257
-msgid "Value is too large.\n"
-msgstr ""
-
-#: src/peerinfo/gnunet-service-peerinfo.c:175
-#, c-format
-msgid "Removing expired address of transport `%s'\n"
-msgstr ""
-
-#: src/peerinfo/gnunet-service-peerinfo.c:306
-#, c-format
-msgid "Failed to parse HELLO in file `%s': %s\n"
-msgstr ""
-
-#: src/peerinfo/gnunet-service-peerinfo.c:323
-#: src/peerinfo/gnunet-service-peerinfo.c:348
-#, c-format
-msgid "Failed to parse HELLO in file `%s'\n"
-msgstr ""
-
-#: src/peerinfo/gnunet-service-peerinfo.c:426
-msgid "# peers known"
-msgstr "# peer conosciuti"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:468
-#, c-format
-msgid ""
-"File `%s' in directory `%s' does not match naming convention. Removed.\n"
-msgstr ""
-
-#: src/peerinfo/gnunet-service-peerinfo.c:624
-#, c-format
-msgid "Scanning directory `%s'\n"
-msgstr ""
-
-#: src/peerinfo/gnunet-service-peerinfo.c:631
-#, c-format
-msgid "Still no peers found in `%s'!\n"
+#: src/nse/gnunet-nse-profiler.c:888
+msgid "Number of peers to run in each round, separated by commas"
msgstr ""
-#: src/peerinfo/gnunet-service-peerinfo.c:1024
-#, c-format
-msgid "Cleaning up directory `%s'\n"
+#: src/nse/gnunet-nse-profiler.c:900
+msgid "delay between rounds"
msgstr ""
-#: src/peerinfo/gnunet-service-peerinfo.c:1319
-#, c-format
-msgid "Importing HELLOs from `%s'\n"
+#: src/nse/gnunet-nse-profiler.c:912
+msgid "Measure quality and performance of the NSE service."
msgstr ""
-#: src/peerinfo/gnunet-service-peerinfo.c:1332
-msgid "Skipping import of included HELLOs\n"
+#: src/nse/gnunet-nse.c:124
+msgid "Show network size estimates from NSE service."
msgstr ""
-#: src/peerinfo/peerinfo_api.c:217
-msgid "Failed to receive response from `PEERINFO' service."
+#: src/nse/gnunet-service-nse.c:1443
+#: src/revocation/gnunet-service-revocation.c:834 src/util/gnunet-scrypt.c:257
+msgid "Value is too large.\n"
msgstr ""
#: src/peerinfo-tool/gnunet-peerinfo.c:237
@@ -5568,6 +5514,60 @@ msgstr ""
msgid "Peerinfo REST API initialized\n"
msgstr ""
+#: src/peerinfo/gnunet-service-peerinfo.c:175
+#, c-format
+msgid "Removing expired address of transport `%s'\n"
+msgstr ""
+
+#: src/peerinfo/gnunet-service-peerinfo.c:306
+#, c-format
+msgid "Failed to parse HELLO in file `%s': %s\n"
+msgstr ""
+
+#: src/peerinfo/gnunet-service-peerinfo.c:323
+#: src/peerinfo/gnunet-service-peerinfo.c:348
+#, c-format
+msgid "Failed to parse HELLO in file `%s'\n"
+msgstr ""
+
+#: src/peerinfo/gnunet-service-peerinfo.c:426
+msgid "# peers known"
+msgstr "# peer conosciuti"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:468
+#, c-format
+msgid ""
+"File `%s' in directory `%s' does not match naming convention. Removed.\n"
+msgstr ""
+
+#: src/peerinfo/gnunet-service-peerinfo.c:624
+#, c-format
+msgid "Scanning directory `%s'\n"
+msgstr ""
+
+#: src/peerinfo/gnunet-service-peerinfo.c:631
+#, c-format
+msgid "Still no peers found in `%s'!\n"
+msgstr ""
+
+#: src/peerinfo/gnunet-service-peerinfo.c:1024
+#, c-format
+msgid "Cleaning up directory `%s'\n"
+msgstr ""
+
+#: src/peerinfo/gnunet-service-peerinfo.c:1319
+#, c-format
+msgid "Importing HELLOs from `%s'\n"
+msgstr ""
+
+#: src/peerinfo/gnunet-service-peerinfo.c:1332
+msgid "Skipping import of included HELLOs\n"
+msgstr ""
+
+#: src/peerinfo/peerinfo_api.c:217
+msgid "Failed to receive response from `PEERINFO' service."
+msgstr ""
+
#: src/peerstore/gnunet-peerstore.c:92
msgid "peerstore"
msgstr ""
@@ -6007,18 +6007,6 @@ msgstr ""
msgid "Could not open revocation database file!"
msgstr ""
-#: src/rps/gnunet-rps.c:270
-msgid "Seed a PeerID"
-msgstr ""
-
-#: src/rps/gnunet-rps.c:275
-msgid "Get updates of view (0 for infinite updates)"
-msgstr ""
-
-#: src/rps/gnunet-rps.c:279
-msgid "Get peers from biased stream"
-msgstr ""
-
#: src/rps/gnunet-rps-profiler.c:3200
msgid "duration of the profiling"
msgstr ""
@@ -6035,6 +6023,18 @@ msgstr ""
msgid "Measure quality and performance of the RPS service."
msgstr ""
+#: src/rps/gnunet-rps.c:270
+msgid "Seed a PeerID"
+msgstr ""
+
+#: src/rps/gnunet-rps.c:275
+msgid "Get updates of view (0 for infinite updates)"
+msgstr ""
+
+#: src/rps/gnunet-rps.c:279
+msgid "Get peers from biased stream"
+msgstr ""
+
#: src/scalarproduct/gnunet-scalarproduct.c:229
msgid "You must specify at least one message ID to check!\n"
msgstr ""
@@ -6089,10 +6089,10 @@ msgstr ""
msgid "Calculate the Vectorproduct with a GNUnet peer."
msgstr ""
-#: src/scalarproduct/gnunet-service-scalarproduct_alice.c:1358
-#: src/scalarproduct/gnunet-service-scalarproduct_bob.c:1355
#: src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c:1118
#: src/scalarproduct/gnunet-service-scalarproduct-ecc_bob.c:1063
+#: src/scalarproduct/gnunet-service-scalarproduct_alice.c:1358
+#: src/scalarproduct/gnunet-service-scalarproduct_bob.c:1355
msgid "Connect to CADET failed\n"
msgstr ""
@@ -6442,15 +6442,6 @@ msgstr ""
msgid "%.s Unknown result code."
msgstr ""
-#: src/testbed/gnunet_testbed_mpi_spawn.c:119
-msgid "Waiting for child to exit.\n"
-msgstr ""
-
-#: src/testbed/gnunet_testbed_mpi_spawn.c:242
-#, c-format
-msgid "Spawning process `%s'\n"
-msgstr ""
-
#: src/testbed/gnunet-testbed-profiler.c:290
msgid "tolerate COUNT number of continious timeout failures"
msgstr ""
@@ -6462,6 +6453,15 @@ msgid ""
"signal is received"
msgstr ""
+#: src/testbed/gnunet_testbed_mpi_spawn.c:119
+msgid "Waiting for child to exit.\n"
+msgstr ""
+
+#: src/testbed/gnunet_testbed_mpi_spawn.c:242
+#, c-format
+msgid "Spawning process `%s'\n"
+msgstr ""
+
#: src/testbed/testbed_api.c:399
#, c-format
msgid "Adding host %u failed with error: %s\n"
@@ -6749,18 +6749,18 @@ msgstr ""
msgid "GNUnet topology control"
msgstr ""
-#: src/transport/gnunet-communicator-tcp.c:3189
-#: src/transport/gnunet-communicator-udp.c:2826
+#: src/transport/gnunet-communicator-tcp.c:3221
+#: src/transport/gnunet-communicator-udp.c:2995
#: src/transport/gnunet-service-tng.c:10014
-#: src/transport/gnunet-service-transport.c:2624
+#: src/transport/gnunet-service-transport.c:2626
msgid "Transport service is lacking key configuration settings. Exiting.\n"
msgstr ""
-#: src/transport/gnunet-communicator-tcp.c:3494
+#: src/transport/gnunet-communicator-tcp.c:3553
msgid "GNUnet TCP communicator"
msgstr ""
-#: src/transport/gnunet-communicator-udp.c:2898
+#: src/transport/gnunet-communicator-udp.c:3067
msgid "GNUnet UDP communicator"
msgstr ""
@@ -6783,50 +6783,50 @@ msgstr ""
msgid "GNUnet UNIX domain socket communicator"
msgstr ""
-#: src/transport/gnunet-service-transport_ats.c:137
-msgid "# Addresses given to ATS"
-msgstr ""
-
#: src/transport/gnunet-service-transport.c:445
msgid "# messages dropped due to slow client"
msgstr ""
-#: src/transport/gnunet-service-transport.c:794
+#: src/transport/gnunet-service-transport.c:796
msgid "# bytes payload dropped (other peer was not connected)"
msgstr ""
-#: src/transport/gnunet-service-transport.c:1477
+#: src/transport/gnunet-service-transport.c:1479
msgid "# bytes payload discarded due to not connected peer"
msgstr ""
-#: src/transport/gnunet-service-transport.c:1622
+#: src/transport/gnunet-service-transport.c:1624
msgid "# bytes total received"
msgstr ""
-#: src/transport/gnunet-service-transport.c:1712
+#: src/transport/gnunet-service-transport.c:1714
msgid "# bytes payload received"
msgstr ""
-#: src/transport/gnunet-service-transport.c:2016
-#: src/transport/gnunet-service-transport.c:2450
+#: src/transport/gnunet-service-transport.c:2018
+#: src/transport/gnunet-service-transport.c:2452
msgid "# disconnects due to blacklist"
msgstr ""
-#: src/transport/gnunet-service-transport.c:2454
+#: src/transport/gnunet-service-transport.c:2456
#, c-format
msgid "Disallowing connection to peer `%s' on transport %s\n"
msgstr ""
-#: src/transport/gnunet-service-transport.c:2549
+#: src/transport/gnunet-service-transport.c:2551
#, c-format
msgid "Adding blacklisting entry for peer `%s'\n"
msgstr ""
-#: src/transport/gnunet-service-transport.c:2558
+#: src/transport/gnunet-service-transport.c:2560
#, c-format
msgid "Adding blacklisting entry for peer `%s':`%s'\n"
msgstr ""
+#: src/transport/gnunet-service-transport_ats.c:137
+msgid "# Addresses given to ATS"
+msgstr ""
+
#: src/transport/gnunet-service-transport_hello.c:195
msgid "# refreshed my HELLO"
msgstr ""
@@ -7144,6 +7144,41 @@ msgstr ""
msgid "# HELLOs given to peerinfo"
msgstr ""
+#: src/transport/gnunet-transport-profiler.c:220
+#, c-format
+msgid "%llu B in %llu ms == %.2f KB/s!\n"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:577
+msgid "send data to peer"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:581
+msgid "receive data from peer"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:586
+msgid "iterations"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:591
+msgid "number of messages to send"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:596
+msgid "message size to use"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:601
+#: src/transport/gnunet-transport.c:1404
+msgid "peer identity"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:614
+#: src/transport/gnunet-transport.c:1426
+msgid "Direct access to transport service."
+msgstr ""
+
#: src/transport/gnunet-transport.c:406
#, c-format
msgid "Transmitted %llu bytes/s (%llu bytes in %s)\n"
@@ -7276,11 +7311,6 @@ msgstr ""
msgid "do not resolve hostnames"
msgstr ""
-#: src/transport/gnunet-transport.c:1404
-#: src/transport/gnunet-transport-profiler.c:601
-msgid "peer identity"
-msgstr ""
-
#: src/transport/gnunet-transport.c:1408
msgid "monitor plugin sessions"
msgstr ""
@@ -7289,36 +7319,6 @@ msgstr ""
msgid "send data for benchmarking to the other peer (until CTRL-C)"
msgstr ""
-#: src/transport/gnunet-transport.c:1426
-#: src/transport/gnunet-transport-profiler.c:614
-msgid "Direct access to transport service."
-msgstr ""
-
-#: src/transport/gnunet-transport-profiler.c:220
-#, c-format
-msgid "%llu B in %llu ms == %.2f KB/s!\n"
-msgstr ""
-
-#: src/transport/gnunet-transport-profiler.c:577
-msgid "send data to peer"
-msgstr ""
-
-#: src/transport/gnunet-transport-profiler.c:581
-msgid "receive data from peer"
-msgstr ""
-
-#: src/transport/gnunet-transport-profiler.c:586
-msgid "iterations"
-msgstr ""
-
-#: src/transport/gnunet-transport-profiler.c:591
-msgid "number of messages to send"
-msgstr ""
-
-#: src/transport/gnunet-transport-profiler.c:596
-msgid "message size to use"
-msgstr ""
-
#: src/transport/plugin_transport_http_client.c:1489
#: src/transport/plugin_transport_http_server.c:2331
#: src/transport/plugin_transport_http_server.c:3562
@@ -7585,21 +7585,6 @@ msgstr ""
msgid "TCP transport advertises itself as being on port %llu\n"
msgstr ""
-#: src/transport/plugin_transport_udp_broadcasting.c:169
-#, fuzzy
-msgid "# Multicast HELLO beacons received via UDP"
-msgstr "# messaggi PONG ricevuti"
-
-#: src/transport/plugin_transport_udp_broadcasting.c:553
-msgid ""
-"Disabling HELLO broadcasting due to friend-to-friend only configuration!\n"
-msgstr ""
-
-#: src/transport/plugin_transport_udp_broadcasting.c:571
-#, c-format
-msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n"
-msgstr ""
-
#: src/transport/plugin_transport_udp.c:3169
#, c-format
msgid ""
@@ -7646,6 +7631,21 @@ msgstr "deve essere un indirizzo IPv4 valido"
msgid "Failed to create UDP network sockets\n"
msgstr "Generazione statistiche fallita\n"
+#: src/transport/plugin_transport_udp_broadcasting.c:169
+#, fuzzy
+msgid "# Multicast HELLO beacons received via UDP"
+msgstr "# messaggi PONG ricevuti"
+
+#: src/transport/plugin_transport_udp_broadcasting.c:553
+msgid ""
+"Disabling HELLO broadcasting due to friend-to-friend only configuration!\n"
+msgstr ""
+
+#: src/transport/plugin_transport_udp_broadcasting.c:571
+#, c-format
+msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n"
+msgstr ""
+
#: src/transport/plugin_transport_unix.c:1396
#, fuzzy, c-format
msgid "Cannot bind to `%s'\n"
@@ -7824,7 +7824,7 @@ msgid "do daemonize (detach from terminal)"
msgstr ""
#: src/transport/tcp_service_legacy.c:1397
-#: src/transport/transport-testing2.c:1116 src/util/service.c:2072
+#: src/transport/transport-testing2.c:983 src/util/service.c:2072
#: src/util/service.c:2084
#, c-format
msgid "Malformed configuration file `%s', exit ...\n"
@@ -8482,19 +8482,19 @@ msgid ""
"Fatal internal logic error, process hangs in `%s' (abort with CTRL-C)!\n"
msgstr ""
-#: src/util/os_installation.c:409
+#: src/util/os_installation.c:411
#, c-format
msgid ""
"Could not determine installation path for %s. Set `%s' environment "
"variable.\n"
msgstr ""
-#: src/util/os_installation.c:792
+#: src/util/os_installation.c:794
#, c-format
msgid "Could not find binary `%s' in PATH!\n"
msgstr ""
-#: src/util/os_installation.c:825
+#: src/util/os_installation.c:827
#, c-format
msgid "Binary `%s' exists, but is not SUID\n"
msgstr ""
@@ -8518,17 +8518,17 @@ msgstr ""
msgid "Could not determine plugin installation path.\n"
msgstr ""
-#: src/util/program.c:262
+#: src/util/program.c:267
#, c-format
msgid "Unreadable or malformed configuration file `%s', exit ...\n"
msgstr ""
-#: src/util/program.c:279
+#: src/util/program.c:284
#, c-format
msgid "Unreadable or malformed default configuration file `%s', exit ...\n"
msgstr ""
-#: src/util/program.c:294
+#: src/util/program.c:299
msgid "Unreadable or malformed configuration, exit ...\n"
msgstr ""
@@ -8592,10 +8592,6 @@ msgstr ""
msgid "Attempting to proxy service `%s' to invalid port %d or hostname.\n"
msgstr ""
-#: src/util/strings.c:179
-msgid "b"
-msgstr ""
-
#: src/util/strings.c:503
#, c-format
msgid "Character sets requested were `%s'->`%s'\n"
@@ -8605,46 +8601,6 @@ msgstr ""
msgid "Failed to expand `$HOME': environment variable `HOME' not set"
msgstr ""
-#: src/util/strings.c:706
-msgid "µs"
-msgstr "µs"
-
-#: src/util/strings.c:710
-msgid "forever"
-msgstr "per sempre"
-
-#: src/util/strings.c:712
-msgid "0 ms"
-msgstr "0 ms"
-
-#: src/util/strings.c:716
-msgid "ms"
-msgstr "ms"
-
-#: src/util/strings.c:720
-msgid "s"
-msgstr "s"
-
-#: src/util/strings.c:724
-msgid "m"
-msgstr ""
-
-#: src/util/strings.c:728
-msgid "h"
-msgstr "o"
-
-#: src/util/strings.c:734
-msgid "day"
-msgstr "giorno"
-
-#: src/util/strings.c:736
-msgid "days"
-msgstr "giorni"
-
-#: src/util/strings.c:764
-msgid "end of time"
-msgstr ""
-
#: src/util/strings.c:1240
msgid "IPv6 address did not start with `['\n"
msgstr ""
@@ -8885,11 +8841,35 @@ msgstr ""
msgid "Setup tunnels via VPN."
msgstr ""
-#: src/zonemaster/gnunet-service-zonemaster.c:849
#: src/zonemaster/gnunet-service-zonemaster-monitor.c:420
+#: src/zonemaster/gnunet-service-zonemaster.c:849
msgid "Failed to connect to the namestore!\n"
msgstr ""
+#~ msgid "µs"
+#~ msgstr "µs"
+
+#~ msgid "forever"
+#~ msgstr "per sempre"
+
+#~ msgid "0 ms"
+#~ msgstr "0 ms"
+
+#~ msgid "ms"
+#~ msgstr "ms"
+
+#~ msgid "s"
+#~ msgstr "s"
+
+#~ msgid "h"
+#~ msgstr "o"
+
+#~ msgid "day"
+#~ msgstr "giorno"
+
+#~ msgid "days"
+#~ msgstr "giorni"
+
#~ msgid "Request timed out"
#~ msgstr "Richiesta scaduta"
diff --git a/po/sr.po b/po/sr.po
new file mode 100644
index 000000000..981dc1d8e
--- /dev/null
+++ b/po/sr.po
@@ -0,0 +1,8292 @@
+# Serbian translation for gnunet.
+# Copyright © 2020 Christian Grothoff
+# This file is distributed under the same license as the gnunet package.
+# Мирослав Николић <miroslavnikolic@rocketmail.com>, 2020.
+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"
+"PO-Revision-Date: 2020-10-23 18:39+0200\n"
+"Last-Translator: Мирослав Николић <miroslavnikolic@rocketmail.com>\n"
+"Language-Team: Serbian <(nothing)>\n"
+"Language: sr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 &&
n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+
+#: src/arm/arm_api.c:337
+msgid "Client was disconnected from arm service, trying to reconnect.\n"
+msgstr "Клијент је ископчан са аур услуге, покушавам поново да се повежем.\n"
+
+#: src/arm/arm_monitor_api.c:321
+msgid "Monitoring client was disconnected from arm service, trying to
reconnect.\n"
+msgstr "Клијент праћења је ископчан са аур услуге, покушавам поново да се
повежем.\n"
+
+#: src/arm/gnunet-arm.c:164
+#, c-format
+msgid "Failed to remove configuration file %s\n"
+msgstr "Нисам успео да уклоним датотеку подешавања „%s“\n"
+
+#: src/arm/gnunet-arm.c:170
+#, c-format
+msgid "Failed to remove servicehome directory %s\n"
+msgstr "Нисам успео да уклоним матични директоријум услуге „%s“\n"
+
+#: src/arm/gnunet-arm.c:216 src/testbed/gnunet-service-testbed_peers.c:1013
+msgid "Message was sent successfully"
+msgstr "Порука је успешно послата"
+
+#: src/arm/gnunet-arm.c:218
+msgid "Misconfiguration (can not connect to the ARM service)"
+msgstr "Лоше подешавање (не могу да се повежем на АУР услугу)"
+
+#: src/arm/gnunet-arm.c:220 src/testbed/gnunet-service-testbed_peers.c:1017
+msgid "We disconnected from ARM before we could send a request"
+msgstr "Прекинута је веза са АУР-ом пре него ли можемо послати захтев"
+
+#: src/arm/gnunet-arm.c:222 src/testbed/gnunet-service-testbed_peers.c:1019
+msgid "ARM API is busy"
+msgstr "АУР АПИ је заузет"
+
+#: src/arm/gnunet-arm.c:224
+msgid "Request does not fit into a message"
+msgstr "Захтев не стаје у поруку"
+
+#: src/arm/gnunet-arm.c:226 src/testbed/gnunet-service-testbed_peers.c:1023
+msgid "Request timed out"
+msgstr "Истекло је време захтева"
+
+#: src/arm/gnunet-arm.c:228 src/testbed/gnunet-service-testbed_peers.c:1025
+msgid "Unknown request status"
+msgstr "Стање захтева је непознато"
+
+#: src/arm/gnunet-arm.c:244 src/testbed/gnunet-service-testbed_peers.c:1041
+#, c-format
+msgid "%s is stopped"
+msgstr "„%s“ је заустављен"
+
+#: src/arm/gnunet-arm.c:246 src/testbed/gnunet-service-testbed_peers.c:1043
+#, c-format
+msgid "%s is starting"
+msgstr "„%s“ се покреће"
+
+#: src/arm/gnunet-arm.c:248 src/testbed/gnunet-service-testbed_peers.c:1045
+#, c-format
+msgid "%s is stopping"
+msgstr "„%s“ се зауставља"
+
+#: src/arm/gnunet-arm.c:250 src/testbed/gnunet-service-testbed_peers.c:1047
+#, c-format
+msgid "%s is starting already"
+msgstr "„%s“ се већ покреће"
+
+#: src/arm/gnunet-arm.c:252 src/testbed/gnunet-service-testbed_peers.c:1049
+#, c-format
+msgid "%s is stopping already"
+msgstr "„%s“ се већ зауставља"
+
+#: src/arm/gnunet-arm.c:254 src/testbed/gnunet-service-testbed_peers.c:1051
+#, c-format
+msgid "%s is started already"
+msgstr "„%s“ је већ покренут"
+
+#: src/arm/gnunet-arm.c:256 src/testbed/gnunet-service-testbed_peers.c:1053
+#, c-format
+msgid "%s is stopped already"
+msgstr "„%s“ је већ заустављен"
+
+#: src/arm/gnunet-arm.c:258 src/testbed/gnunet-service-testbed_peers.c:1055
+#, c-format
+msgid "%s service is not known to ARM"
+msgstr "„%s“ услуга није позната АУР-у"
+
+#: src/arm/gnunet-arm.c:260 src/testbed/gnunet-service-testbed_peers.c:1057
+#, c-format
+msgid "%s service failed to start"
+msgstr "„%s“ услуга није успела да се покрене"
+
+#: src/arm/gnunet-arm.c:262
+#, c-format
+msgid "%s service cannot be started because ARM is shutting down"
+msgstr "„%s“ услуга се не може покренути јер се АУР гаси"
+
+#: src/arm/gnunet-arm.c:264 src/testbed/gnunet-service-testbed_peers.c:1061
+#, c-format
+msgid "%.s Unknown result code."
+msgstr "%.s Непознат код резултата."
+
+#: src/arm/gnunet-arm.c:297
+msgid "Fatal error initializing ARM API.\n"
+msgstr "Кобна грешка покретања АУР АПИ-ја.\n"
+
+#: src/arm/gnunet-arm.c:326 src/arm/gnunet-arm.c:335
+#, c-format
+msgid "Failed to start the ARM service: %s\n"
+msgstr "Нисам успео да покренем АУР услугу: %s\n"
+
+#: src/arm/gnunet-arm.c:369
+#, c-format
+msgid "Failed to send a stop request to the ARM service: %s\n"
+msgstr "Нисам успео да пошаљем захтев за заустављање АУР услузи: %s\n"
+
+#: src/arm/gnunet-arm.c:379
+#, c-format
+msgid "Failed to stop the ARM service: %s\n"
+msgstr "Нисам успео да зауставим АУР услугу: %s\n"
+
+#: src/arm/gnunet-arm.c:421
+#, c-format
+msgid "Failed to send a request to start the `%s' service: %%s\n"
+msgstr "Нисам успео да пошаљем захтев за покретање „%s“ услузи: %%s\n"
+
+#: src/arm/gnunet-arm.c:431
+#, c-format
+msgid "Failed to start the `%s' service: %s\n"
+msgstr "Нисам успео да покренем „%s“ услугу: %s\n"
+
+#: src/arm/gnunet-arm.c:468
+#, c-format
+msgid "Failed to send a request to kill the `%s' service: %%s\n"
+msgstr "Нисам успео да пошаљем захтев за убијање „%s“ услуге: %%s\n"
+
+#: src/arm/gnunet-arm.c:479
+#, c-format
+msgid "Failed to kill the `%s' service: %s\n"
+msgstr "Нисам успео да убијем „%s“ услугу: %s\n"
+
+#: src/arm/gnunet-arm.c:517
+#, c-format
+msgid "Failed to request a list of services: %s\n"
+msgstr "Нисам успео да захтевам списак услуга: %s\n"
+
+#: src/arm/gnunet-arm.c:525
+msgid "Error communicating with ARM. ARM not running?\n"
+msgstr "Грешка у комуникацији са АУР-ом. Да ли је АУР покренут?\n"
+
+#: src/arm/gnunet-arm.c:530
+msgid "Running services:\n"
+msgstr "Покренуте услуге:\n"
+
+#: src/arm/gnunet-arm.c:612
+#, c-format
+msgid "Now only monitoring, press CTRL-C to stop.\n"
+msgstr "Сада пратим само, притисните КТРЛ-Ц да зауставите.\n"
+
+#: src/arm/gnunet-arm.c:643
+#, c-format
+msgid "Stopped %s.\n"
+msgstr "Заустављен%s.\n"
+
+#: src/arm/gnunet-arm.c:646
+#, c-format
+msgid "Starting %s...\n"
+msgstr "Покрећем %s...\n"
+
+#: src/arm/gnunet-arm.c:649
+#, c-format
+msgid "Stopping %s...\n"
+msgstr "Заустављам %s...\n"
+
+#: src/arm/gnunet-arm.c:660
+#, c-format
+msgid "Unknown status %u for service %s.\n"
+msgstr "Непознато стање %u за услугу „%s“.\n"
+
+#: src/arm/gnunet-arm.c:724
+msgid "stop all GNUnet services"
+msgstr "зауставља све ГНУнет услуге"
+
+#: src/arm/gnunet-arm.c:726
+msgid "start a particular service"
+msgstr "покреће нарочиту услугу"
+
+#: src/arm/gnunet-arm.c:728
+msgid "stop a particular service"
+msgstr "зауставља нарочиту услугу"
+
+#: src/arm/gnunet-arm.c:730
+msgid "start all GNUnet default services"
+msgstr "покреће све основне ГНУнет услуге"
+
+#: src/arm/gnunet-arm.c:733
+msgid "stop and start all GNUnet default services"
+msgstr "зауставља и покреће све основне ГНУнет услуге"
+
+#: src/arm/gnunet-arm.c:736
+msgid "delete config file and directory on exit"
+msgstr "брише датотеку подешавања и директоријум на изласку"
+
+#: src/arm/gnunet-arm.c:739
+msgid "monitor ARM activities"
+msgstr "прати активности АУР-а"
+
+#: src/arm/gnunet-arm.c:741
+msgid "don't print status messages"
+msgstr "не исписује поруке стања"
+
+#: src/arm/gnunet-arm.c:744
+msgid "timeout in MSECS milliseconds for completing current operation"
+msgstr "време истека у МСЕК милисекундама за завршавање текуће радње"
+
+#: src/arm/gnunet-arm.c:746
+msgid "list currently running services"
+msgstr "исписује тренутно покренуте услуге"
+
+#: src/arm/gnunet-arm.c:748
+msgid "don't let gnunet-service-arm inherit standard output"
+msgstr "не да да „gnunet-service-arm“ наследи стандардни излаз"
+
+#: src/arm/gnunet-arm.c:750
+msgid "don't let gnunet-service-arm inherit standard error"
+msgstr "не да да „gnunet-service-arm“ наследи стандардну грешку"
+
+#: src/arm/gnunet-arm.c:761
+msgid "Control services and the Automated Restart Manager (ARM)"
+msgstr "Контролне услуге и Аутоматизовани Управник Рестарта (АУР)"
+
+#: src/arm/gnunet-service-arm.c:266
+msgid "Could not send status result to client\n"
+msgstr "Не могу да пошаљем резултат стања клијенту\n"
+
+#: src/arm/gnunet-service-arm.c:302
+msgid "Could not send list result to client\n"
+msgstr "Не могу да пошаљем резултат списка клијенту\n"
+
+#: src/arm/gnunet-service-arm.c:529
+#, c-format
+msgid "Failed to start service `%s'\n"
+msgstr "Нисам успео да покренем услугу „%s“\n"
+
+#: src/arm/gnunet-service-arm.c:540
+#, c-format
+msgid "Starting service `%s'\n"
+msgstr "Покрећем услугу „%s“\n"
+
+#: src/arm/gnunet-service-arm.c:639
+#, c-format
+msgid "Unable to create socket for service `%s': %s\n"
+msgstr "Не могу да направим прикључницу за услугу „%s“: %s\n"
+
+#: src/arm/gnunet-service-arm.c:661
+#, c-format
+msgid "Unable to bind listening socket for service `%s' to address `%s': %s\n"
+msgstr "Не могу да увежем прикључницу ослушкивања за услугу „%s“ на адресу
„%s“: %s\n"
+
+#: src/arm/gnunet-service-arm.c:695
+#, c-format
+msgid "ARM now monitors connections to service `%s' at `%s'\n"
+msgstr "АУР сада надгледа везе ка услузи „%s“ на „%s“\n"
+
+#: src/arm/gnunet-service-arm.c:831
+#, c-format
+msgid "Preparing to stop `%s'\n"
+msgstr "Припремам се да зауставим „%s“\n"
+
+#: src/arm/gnunet-service-arm.c:1100
+#, c-format
+msgid "Restarting service `%s'.\n"
+msgstr "Поново покрећем услугу „%s“.\n"
+
+#: src/arm/gnunet-service-arm.c:1193
+msgid "exit"
+msgstr "излази"
+
+#: src/arm/gnunet-service-arm.c:1198
+msgid "signal"
+msgstr "сигнал"
+
+#: src/arm/gnunet-service-arm.c:1203
+msgid "unknown"
+msgstr "непознато"
+
+#: src/arm/gnunet-service-arm.c:1209
+#, c-format
+msgid "Service `%s' took %s to terminate\n"
+msgstr "Услуга „%s“ је узела %s да оконча\n"
+
+#: src/arm/gnunet-service-arm.c:1231
+#, c-format
+msgid "Service `%s' terminated normally, will restart at any time\n"
+msgstr "Услуга „%s“ је окончана нормално, поново ће се покренути у било које
време\n"
+
+#: src/arm/gnunet-service-arm.c:1246
+#, c-format
+msgid "Service `%s' terminated with status %s/%d, will restart in %s\n"
+msgstr "Услуга „%s“ је окончана са стањем %s/%d, поново ће се покренути за
%s\n"
+
+#: src/arm/gnunet-service-arm.c:1500
+#, c-format
+msgid "Starting default services `%s'\n"
+msgstr "Покрећем основне услуге „%s“\n"
+
+#: src/arm/gnunet-service-arm.c:1511
+#, c-format
+msgid "Default service `%s' not configured correctly!\n"
+msgstr "Основна услуга „%s“ није подешена исправно!\n"
+
+#: src/arm/gnunet-service-arm.c:1524
+msgid "No default services configured, GNUnet will not really start right
now.\n"
+msgstr "Основне услуге нису подешене, ГНУнет се неће баш сада покренути.\n"
+
+#: src/arm/mockup-service.c:41
+msgid "Initiating shutdown as requested by client.\n"
+msgstr "Започињем гашење као што је затражио клијент.\n"
+
+#: src/ats/ats_api_performance.c:468
+#, c-format
+msgid "Received %s message\n"
+msgstr "Примих %s поруку\n"
+
+#: src/ats/ats_api_performance.c:511
+#, c-format
+msgid "Received last message for %s \n"
+msgstr "Примих последњу поруку за %s \n"
+
+#: src/ats/gnunet-ats-solver-eval.c:2199 src/ats/gnunet-ats-solver-eval.c:2233
+#: src/ats/gnunet-service-ats_addresses.c:1980
+#: src/ats/gnunet-service-ats_addresses.c:2024
+#, c-format
+msgid "Could not load quota for network `%s': `%s', assigning default
bandwidth %llu\n"
+msgstr "Не могу да учитам квоту за мрежу „%s“: „%s“, додељујем основни
пропусни опсег %llu\n"
+
+#: 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 "Квота одлазности подешена за мрежу „%s“ је %llu\n"
+
+#: 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"
+msgstr "Нема подешене одлазне квоте за мрежу „%s“, додељујем основни пропусни
опсег %llu\n"
+
+#: 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"
+msgstr "Квота долазности подешена за мрежу „%s“ је %llu\n"
+
+#: 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 "Није подешена одлазна квота за мрежу „%s“, додељујем основни пропусни
опсег %llu\n"
+
+#: src/ats/gnunet-ats-solver-eval.c:2671
+#: src/ats-tests/gnunet-solver-eval.c:919
+msgid "solver to use"
+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"
+msgstr "експеримент за коришћење"
+
+#: src/ats/gnunet-ats-solver-eval.c:2680
+msgid "print logging"
+msgstr "исписује дневничење"
+
+#: src/ats/gnunet-service-ats_addresses.c:2217
+#, c-format
+msgid "Initializing solver `%s '`%s'\n"
+msgstr "Покрећем решавача „%s “„%s“\n"
+
+#: src/ats/gnunet-service-ats_addresses.c:2220
+#, c-format
+msgid "Failed to initialize solver `%s'!\n"
+msgstr "Нисам успео да покренем решавача „%s“!\n"
+
+#: src/ats/gnunet-service-ats_addresses.c:2243
+msgid "Failed to initialize solver!\n"
+msgstr "Нисам успео да покренем решавача!\n"
+
+#: src/ats/plugin_ats_mlp.c:892
+msgid "Problem size too large, cannot allocate memory!\n"
+msgstr "Величина проблема је превелика, не могу да доделим меморију!\n"
+
+#: src/ats/plugin_ats_mlp.c:1329
+#, c-format
+msgid "Adding address for peer `%s' multiple times\n"
+msgstr "Додајем адресу за парњака „%s“ више пута\n"
+
+#: src/ats/plugin_ats_mlp.c:1376
+#, c-format
+msgid "Updating address property `%s' for peer `%s' %p not added before\n"
+msgstr "Освежавам својство адресе „%s“ за парњака „%s“ %p који није додат
раније\n"
+
+#: src/ats/plugin_ats_mlp.c:2122
+#, c-format
+msgid "Adjusting inconsistent outbound quota configuration for network `%s',
is %llu must be at least %llu\n"
+msgstr "Поправљам недоследно подешавање одлазне квоте за мрежу „%s“, која је
%llu а мора бити најмање %llu\n"
+
+#: src/ats/plugin_ats_mlp.c:2131
+#, c-format
+msgid "Adjusting inconsistent inbound quota configuration for network `%s', is
%llu must be at least %llu\n"
+msgstr "Поправљам недоследно подешавање долазне квоте за мрежу „%s“, која је
%llu а мора бити најмање %llu\n"
+
+#: src/ats/plugin_ats_mlp.c:2142
+#, c-format
+msgid "Adjusting outbound quota configuration for network `%s'from %llu to
%.0f\n"
+msgstr "Поправљам недоследно подешавање одлазне квоте за мрежу „%s“ са %llu на
%.0f\n"
+
+#: src/ats/plugin_ats_mlp.c:2150
+#, c-format
+msgid "Adjusting inbound quota configuration for network `%s' from %llu to
%.0f\n"
+msgstr "Поправљам недоследно подешавање долазне квоте за мрежу „%s“ са %llu на
%.0f\n"
+
+#: src/ats/plugin_ats_mlp.c:2161
+#, c-format
+msgid "Using default quota configuration for network `%s' (in/out) %llu/%llu\n"
+msgstr "Користим основно подешавање квоте за мрежу „%s“ (улаз/излаз)
%llu/%llu\n"
+
+#: src/ats/plugin_ats_proportional.c:1511
+#, c-format
+msgid "Invalid network type `%u' `%s': Disconnect!\n"
+msgstr "Неисправна врста мреже „%u“ „%s“: Прекидам везу!\n"
+
+#: src/ats-tests/ats-testing.c:72
+msgid "Benchmarking done\n"
+msgstr "Оцењивање је готово\n"
+
+#: src/ats-tests/ats-testing.c:105
+#, c-format
+msgid "Failed to connect peer 0 and %u\n"
+msgstr "Нисам успео да повежем парњака 0 и %u\n"
+
+#: src/ats-tests/ats-testing.c:413
+#, c-format
+msgid "Connected master [%u] with slave [%u]\n"
+msgstr "Повезан је надређени [%u] са потчињеним [%u]\n"
+
+#: src/ats-tests/ats-testing.c:419
+#, c-format
+msgid "Failed to connect master peer [%u] with slave [%u]\n"
+msgstr "Нисам успео да повежем надређеног парњака [%u] са потчињеним [%u]\n"
+
+#: src/ats-tests/ats-testing.c:450
+msgid "Connecting peers on CORE level\n"
+msgstr "Повезујем парњаке на „CORE“ нивоу\n"
+
+#: src/ats-tests/ats-testing.c:461
+#, c-format
+msgid "Connecting master [%u] with slave [%u]\n"
+msgstr "Повезујем надређеног [%u] са потчињеним [%u]\n"
+
+#: src/ats-tests/ats-testing.c:470
+#, c-format
+msgid "Could not connect master [%u] and slave [%u]\n"
+msgstr "Не могу да повежем надређеног [%u] и потчињеног [%u]\n"
+
+#: src/ats-tests/ats-testing.c:490 src/ats-tests/ats-testing.c:671
+msgid "Initialization failed, shutdown\n"
+msgstr "Покретање није успело, гасим\n"
+
+#: src/ats-tests/ats-testing-log.c:842
+msgid "Stop logging\n"
+msgstr "Заустављам дневничење\n"
+
+#: src/ats-tests/ats-testing-log.c:893
+#, c-format
+msgid "Start logging `%s'\n"
+msgstr "Започињем дневничење „%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"
+msgstr "Надређени [%u]: послао: %u KiB за %u сек. = %u KiB/s, примио: %u KiB
за %u сек. = %u KiB/s\n"
+
+#: src/ats-tool/gnunet-ats.c:169
+#, c-format
+msgid "%u address resolutions had a timeout\n"
+msgstr "%u адресна разрешења имаху време истека\n"
+
+#: src/ats-tool/gnunet-ats.c:171
+#, c-format
+msgid "ATS returned results for %u addresses\n"
+msgstr "АТС је вратио резултате за %u адресе\n"
+
+#: src/ats-tool/gnunet-ats.c:232
+#, c-format
+msgid "Peer `%s' plugin `%s', address `%s', `%s' bw out: %u Bytes/s, bw in %u
Bytes/s, %s\n"
+msgstr "Парњак „%s“ прикључак „%s“, адреса „%s“, „%s“ излазни пропусни опсег:
%u Бајта/сек, улазни пропусни опсег %u Бајта/сек, %s\n"
+
+#: src/ats-tool/gnunet-ats.c:413
+#, c-format
+msgid "Quota for network `%11s' (in/out): %10s / %10s\n"
+msgstr "Квота за мрежу „%11s“ (улаз/излаз): %10s / %10s\n"
+
+#: 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
+#, c-format
+msgid "Service `%s' is not running\n"
+msgstr "Услуга „%s“ није покренута\n"
+
+#: src/ats-tool/gnunet-ats.c:445 src/transport/gnunet-transport.c:1255
+#, c-format
+msgid "Failed to parse peer identity `%s'\n"
+msgstr "Нисам успео да обрадим идентитет парњака „%s“\n"
+
+#: src/ats-tool/gnunet-ats.c:454
+#, c-format
+msgid "Please select one operation : %s or %s or %s or %s or %s\n"
+msgstr "Изаберите једну радњу : „%s“ или „%s“ или „%s“ или „%s“ или „%s“\n"
+
+#: 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
+msgid "Cannot connect to ATS service, exiting...\n"
+msgstr "Не могу да се повежем са АТС услугом, излазим...\n"
+
+#: src/ats-tool/gnunet-ats.c:478 src/ats-tool/gnunet-ats.c:495
+#, c-format
+msgid "Cannot issue request to ATS service, exiting...\n"
+msgstr "Не могу да издам захтев АТС услузи, одлазим...\n"
+
+#: src/ats-tool/gnunet-ats.c:515
+#, c-format
+msgid "No preference type given!\n"
+msgstr "Није дата врста својства!\n"
+
+#: src/ats-tool/gnunet-ats.c:520
+#, c-format
+msgid "No peer given!\n"
+msgstr "Није дат парњак!\n"
+
+#: src/ats-tool/gnunet-ats.c:536
+msgid "Valid type required\n"
+msgstr "Потребна је исправна врста\n"
+
+#: src/ats-tool/gnunet-ats.c:594
+msgid "get list of active addresses currently used"
+msgstr "добавља списак активних адреса које се тренутно користе"
+
+#: src/ats-tool/gnunet-ats.c:596
+msgid "get list of all active addresses"
+msgstr "добавља списак свих активних адреса"
+
+#: src/ats-tool/gnunet-ats.c:599
+msgid "do not resolve IP addresses to hostnames"
+msgstr "не решава ИП адресе за називе домаћине"
+
+#: src/ats-tool/gnunet-ats.c:601
+msgid "monitor mode"
+msgstr "режим праћења"
+
+#: src/ats-tool/gnunet-ats.c:603
+msgid "set preference for the given peer"
+msgstr "поставља својство за датог парњака"
+
+#: src/ats-tool/gnunet-ats.c:605
+msgid "print all configured quotas"
+msgstr "исписује све подешене квоте"
+
+#: src/ats-tool/gnunet-ats.c:607
+msgid "peer id"
+msgstr "иб парњака"
+
+#: src/ats-tool/gnunet-ats.c:610
+msgid "preference type to set: latency | bandwidth"
+msgstr "врста поставке за постављање: кашњење | пропусни опсег"
+
+#: src/ats-tool/gnunet-ats.c:612
+msgid "preference value"
+msgstr "вредност својства"
+
+#: src/ats-tool/gnunet-ats.c:615
+msgid "verbose output (include ATS address properties)"
+msgstr "опширан излаз (укључује својства АТС адресе)"
+
+#: src/ats-tool/gnunet-ats.c:622
+msgid "Print information about ATS state"
+msgstr "Исписује податке о АТС стању"
+
+#: src/consensus/gnunet-consensus-profiler.c:437
+#: src/secretsharing/gnunet-secretsharing-profiler.c:535
+msgid "number of peers in consensus"
+msgstr "број парњака у концензусу"
+
+#: src/consensus/gnunet-consensus-profiler.c:440
+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
+msgid "number of values"
+msgstr "број вредности"
+
+#: src/consensus/gnunet-consensus-profiler.c:446
+msgid "consensus timeout"
+msgstr "време истека концензуса"
+
+#: src/consensus/gnunet-consensus-profiler.c:449
+msgid "delay until consensus starts"
+msgstr "застој док не започне концензус"
+
+#: src/consensus/gnunet-consensus-profiler.c:452
+#: src/secretsharing/gnunet-secretsharing-profiler.c:550
+msgid "be more verbose (print received values)"
+msgstr "бива опширнији (исписује примљене вредности)"
+
+#: src/conversation/conversation_api.c:557
+#: src/conversation/conversation_api_call.c:470
+msgid "Connection to conversation service lost, trying to reconnect\n"
+msgstr "Веза са услугом конверзације је изгубљена, покушавам поново да се
повежем\n"
+
+#: src/conversation/gnunet-conversation.c:264
+#, c-format
+msgid "Incoming call from `%s'. Please /accept #%u or /cancel %u the call.\n"
+msgstr "Долазни позив од „%s“. /прихватите #%u или /откажите %u позив.\n"
+
+#: src/conversation/gnunet-conversation.c:286
+#, c-format
+msgid "Call from `%s' terminated\n"
+msgstr "Позив од „%s“ је окончан\n"
+
+#: src/conversation/gnunet-conversation.c:319
+#, c-format
+msgid "Call from `%s' suspended by other user\n"
+msgstr "Позив од „%s“ је обуставио други корисник\n"
+
+#: src/conversation/gnunet-conversation.c:324
+#, c-format
+msgid "Call from `%s' resumed by other user\n"
+msgstr "Позив од „%s“ је повратио други корисник\n"
+
+#: src/conversation/gnunet-conversation.c:342
+#, c-format
+msgid "Ego `%s' no longer available, phone is now down.\n"
+msgstr "Его „%s“ није више доступан, телефон је сада искључен.\n"
+
+#: src/conversation/gnunet-conversation.c:356
+msgid "Failed to setup phone (internal error)\n"
+msgstr "Нисам успео да подесим телефон (унутрашња грешка)\n"
+
+#: src/conversation/gnunet-conversation.c:368
+#, c-format
+msgid "Phone active on line %u. Type `/help' for a list of available
commands\n"
+msgstr "Телефон је активан на линији %u. Упишите „/help“ за списак доступних
наредби\n"
+
+#: src/conversation/gnunet-conversation.c:390
+#, c-format
+msgid "Resolved address of `%s'. Now ringing other party.\n"
+msgstr "Реших адресу за „%s“. Сада звоним на другој журци.\n"
+
+#: src/conversation/gnunet-conversation.c:397
+#, c-format
+msgid "Connection established to `%s'\n"
+msgstr "Веза је успостављена са „%s“\n"
+
+#: src/conversation/gnunet-conversation.c:404
+#, c-format
+msgid "Failed to resolve `%s'\n"
+msgstr "Нисам успео да решим „%s“\n"
+
+#: src/conversation/gnunet-conversation.c:411
+msgid "Call terminated\n"
+msgstr "Позив је окончан\n"
+
+#: src/conversation/gnunet-conversation.c:417
+#, c-format
+msgid "Connection to `%s' suspended (by other user)\n"
+msgstr "Веза са „%s“ је обустављена (други корисник)\n"
+
+#: src/conversation/gnunet-conversation.c:423
+#, c-format
+msgid "Connection to `%s' resumed (by other user)\n"
+msgstr "Веза са „%s“ је повраћена (други корисник)\n"
+
+#: src/conversation/gnunet-conversation.c:428
+msgid "Error with the call, restarting it\n"
+msgstr "Грешка са позивом, поново га покрећем\n"
+
+#: src/conversation/gnunet-conversation.c:495
+#, c-format
+msgid "Unknown command `%s'\n"
+msgstr "Непозната наредба „%s“\n"
+
+#: src/conversation/gnunet-conversation.c:511
+#: src/conversation/gnunet-conversation.c:525
+#, c-format
+msgid "Ego `%s' not available\n"
+msgstr "Его „%s“ није доступан\n"
+
+#: src/conversation/gnunet-conversation.c:518
+#: src/conversation/gnunet-conversation.c:575
+msgid "You are calling someone else already, hang up first!\n"
+msgstr "Већ позивате некога, спустите прво слушалицу!\n"
+
+#: src/conversation/gnunet-conversation.c:533
+#: src/conversation/gnunet-conversation.c:588
+#, c-format
+msgid "You are answering call from `%s', hang up or suspend that call first!\n"
+msgstr "Одговарате на позив од „%s“, спустите слушалицу или обуставите тај
позив!\n"
+
+#: src/conversation/gnunet-conversation.c:544
+msgid "Call recipient missing.\n"
+msgstr "Недостаје прималац позива.\n"
+
+#: src/conversation/gnunet-conversation.c:599
+msgid "There is no incoming call to accept here!\n"
+msgstr "Нема долазног позива овде за прихватање!\n"
+
+#: src/conversation/gnunet-conversation.c:616
+#, c-format
+msgid "There is no incoming call `%s' to accept right now!\n"
+msgstr "Нема долазног позива „%s“ за прихватање управо сада!\n"
+
+#: src/conversation/gnunet-conversation.c:647
+msgid "We currently do not have an address.\n"
+msgstr "Тренутно немамамо адресу.\n"
+
+#: src/conversation/gnunet-conversation.c:670
+#, c-format
+msgid "We are currently trying to locate the private key for the ego `%s'.\n"
+msgstr "Тренутно покушавамо да лоцирамо лични кључ за его „%s“.\n"
+
+#: src/conversation/gnunet-conversation.c:675
+#, c-format
+msgid "We are listening for incoming calls for ego `%s' on line %u.\n"
+msgstr "Ослушкујемо за долазним позивима за его „%s“ на линији %u.\n"
+
+#: src/conversation/gnunet-conversation.c:681
+#: src/conversation/gnunet-conversation.c:705
+#, c-format
+msgid "You are having a conversation with `%s'.\n"
+msgstr "Разговарате са „%s“.\n"
+
+#: src/conversation/gnunet-conversation.c:686
+msgid "We had an internal error setting up our phone line. You can still make
calls.\n"
+msgstr "Имали смо унутрашњу грешку подешавајући нашу телефонску линију. Још
увек можете обављати позиве.\n"
+
+#: src/conversation/gnunet-conversation.c:695
+#, c-format
+msgid "We are trying to find the network address to call `%s'.\n"
+msgstr "Покушавамо да нађемо мрежну адресу за позив „%s“.\n"
+
+#: src/conversation/gnunet-conversation.c:700
+#, c-format
+msgid "We are calling `%s', his phone should be ringing.\n"
+msgstr "Позивамо „%s“, његов телефон треба да звони.\n"
+
+#: src/conversation/gnunet-conversation.c:719
+msgid "Calls waiting:\n"
+msgstr "Чекање позива:\n"
+
+#: src/conversation/gnunet-conversation.c:725
+#, c-format
+msgid "#%u: `%s'\n"
+msgstr "#%u: „%s“\n"
+
+#: src/conversation/gnunet-conversation.c:753
+#: src/conversation/gnunet-conversation.c:768
+msgid "There is no call that could be suspended right now.\n"
+msgstr "Нема позива који би могао бити обустављен управо сада.\n"
+
+#: src/conversation/gnunet-conversation.c:801
+#: src/conversation/gnunet-conversation.c:817
+msgid "There is no call that could be resumed right now.\n"
+msgstr "Нема позива који би могао бити повраћен управо сада.\n"
+
+#: src/conversation/gnunet-conversation.c:824
+#, c-format
+msgid "Already talking with `%s', cannot resume a call right now.\n"
+msgstr "Већ разговарате са „%s“, не можете повратити позив управо сада.\n"
+
+#: src/conversation/gnunet-conversation.c:833
+msgid "There is no incoming call to resume here!\n"
+msgstr "Нема долазног позива овде за повраћај!\n"
+
+#: src/conversation/gnunet-conversation.c:850
+#, c-format
+msgid "There is no incoming call `%s' to resume right now!\n"
+msgstr "Нема долазног позива „%s“ за повраћај управо сада!\n"
+
+#: src/conversation/gnunet-conversation.c:885
+msgid "There is no call that could be cancelled right now.\n"
+msgstr "Нема позива који би могао бити отказан управо сада.\n"
+
+#: src/conversation/gnunet-conversation.c:893
+msgid "There is no incoming call to refuse here!\n"
+msgstr "Нема долазног позива овде за одбијање!\n"
+
+#: src/conversation/gnunet-conversation.c:910
+#, c-format
+msgid "There is no incoming call `%s' to refuse right now!\n"
+msgstr "Нема долазног позива „%s“ за одбијање управо сада!\n"
+
+#: src/conversation/gnunet-conversation.c:937
+msgid "Use `/address' to find out which address this phone should have in GNS"
+msgstr "Користите „/address“ да нађете коју адресу треба да има овај телефон у
ГНС-у"
+
+#: src/conversation/gnunet-conversation.c:939
+msgid "Use `/call USER.gnu' to call USER"
+msgstr "Користите „/call USER.gnu“ да позовете КОРИСНИКА"
+
+#: src/conversation/gnunet-conversation.c:941
+msgid "Use `/accept #NUM' to accept incoming call #NUM"
+msgstr "Користтие „/accept #NUM“ да прихватите долазни позив #БРОЈ"
+
+#: src/conversation/gnunet-conversation.c:943
+msgid "Use `/suspend' to suspend the active call"
+msgstr "Користите „/suspend“ да обуставитеактивни позив"
+
+#: 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."
+msgstr "Користите „/resume [#NUM]“ да наставите са позивом, #БРОЈ је потребан
за повраћај долазних позива, аргумент није потребан за повраћај тренутно
одлазног позива."
+
+#: src/conversation/gnunet-conversation.c:947
+msgid "Use `/cancel' to reject or terminate a call"
+msgstr "Користите „/cancel“ да одбаците или окончате позив"
+
+#: src/conversation/gnunet-conversation.c:949
+msgid "Use `/status' to print status information"
+msgstr "Користите „/status“ да испишете податке о стању"
+
+#: src/conversation/gnunet-conversation.c:951
+msgid "Use `/quit' to terminate gnunet-conversation"
+msgstr "Користите „/quit“ да окончате „gnunet-conversation“"
+
+#: src/conversation/gnunet-conversation.c:953
+msgid "Use `/help command' to get help for a specific command"
+msgstr "Користите „/help наредба“ да добијете помоћ за неку наредбу"
+
+#: src/conversation/gnunet-conversation.c:1151
+#, c-format
+msgid "Name of our ego changed to `%s'\n"
+msgstr "Назив нашег ега је промењен у „%s“\n"
+
+#: src/conversation/gnunet-conversation.c:1164
+#, c-format
+msgid "Our ego `%s' was deleted!\n"
+msgstr "Наш его „%s“ је обрисан!\n"
+
+#: src/conversation/gnunet-conversation.c:1199
+msgid "You must specify the NAME of an ego to use\n"
+msgstr "Морате навести НАЗИВ егоа за коришћење\n"
+
+#: src/conversation/gnunet-conversation.c:1223
+msgid "Failed to start gnunet-helper-w32-console\n"
+msgstr "Нисам успео да покренем „gnunet-helper-w32-console“\n"
+
+#: src/conversation/gnunet-conversation.c:1249
+msgid "sets the NAME of the ego to use for the phone (and name resolution)"
+msgstr "поставља НАЗИВ егоа за коришћење за телефон (и решавање назива)"
+
+#: src/conversation/gnunet-conversation.c:1252
+msgid "sets the LINE to use for the phone"
+msgstr "поставља РЕД за коришћење за телефон"
+
+#: src/conversation/gnunet-conversation.c:1276
+msgid "Enables having a conversation with other GNUnet users."
+msgstr "Укључује могућност конверзације са другим ГНУнет корисницима."
+
+#: src/conversation/gnunet-conversation-test.c:121
+#, c-format
+msgid ""
+"\n"
+"End of transmission. Have a GNU day.\n"
+msgstr ""
+"\n"
+"Крај преноса. Нека вам је ГНУ дан.\n"
+
+#: src/conversation/gnunet-conversation-test.c:149
+#, c-format
+msgid ""
+"\n"
+"We are now playing your recording back. If you can hear it, your audio
settings are working..."
+msgstr ""
+"\n"
+"Сада пуштамо ваш снимак. Ако можете да га чујете, ваша подешавања звука су
добра..."
+
+#: 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..."
+msgstr "Сада ћемо вас снимати за %s. Након тог времена, снимак ће вам бити
пуштен..."
+
+#: src/conversation/gnunet-conversation-test.c:248
+#: src/multicast/gnunet-multicast.c:70 src/revocation/gnunet-revocation.c:522
+#: src/template/gnunet-template.c:70
+msgid "help text"
+msgstr "текст помоћи"
+
+#: src/conversation/gnunet-helper-audio-playback.c:305
+#, c-format
+msgid "pa_stream_write() failed: %s\n"
+msgstr "Није успело „pa_stream_write()“: %s\n"
+
+#: src/conversation/gnunet-helper-audio-playback.c:587
+msgid "gnunet-helper-audio-playback - Got signal, exiting\n"
+msgstr "gnunet-helper-audio-playback – Добих сигнал, излазим\n"
+
+#: src/conversation/gnunet-helper-audio-playback.c:612
+#: src/conversation/gnunet-helper-audio-record.c:545
+msgid "Connection established.\n"
+msgstr "Веза је успостављена.\n"
+
+#: src/conversation/gnunet-helper-audio-playback.c:617
+#: src/conversation/gnunet-helper-audio-record.c:550
+#, c-format
+msgid "pa_stream_new() failed: %s\n"
+msgstr "Није успело „pa_stream_new()“: %s\n"
+
+#: src/conversation/gnunet-helper-audio-playback.c:631
+#, c-format
+msgid "pa_stream_connect_playback() failed: %s\n"
+msgstr "Није успело „pa_stream_connect_playback()“: %s\n"
+
+#: src/conversation/gnunet-helper-audio-playback.c:644
+#: src/conversation/gnunet-helper-audio-record.c:576
+#, c-format
+msgid "Connection failure: %s\n"
+msgstr "Неуспешно повезивање: %s\n"
+
+#: src/conversation/gnunet-helper-audio-playback.c:665
+#: src/conversation/gnunet-helper-audio-record.c:599
+msgid "Wrong Spec\n"
+msgstr "Погрешна спец\n"
+
+#: src/conversation/gnunet-helper-audio-playback.c:671
+#: src/conversation/gnunet-helper-audio-record.c:605
+msgid "pa_mainloop_new() failed.\n"
+msgstr "Није успело „pa_mainloop_new()“.\n"
+
+#: src/conversation/gnunet-helper-audio-playback.c:685
+#: src/conversation/gnunet-helper-audio-record.c:620
+msgid "pa_context_new() failed.\n"
+msgstr "Није успело „pa_context_new()“.\n"
+
+#: src/conversation/gnunet-helper-audio-playback.c:692
+#: src/conversation/gnunet-helper-audio-record.c:626
+#, c-format
+msgid "pa_context_connect() failed: %s\n"
+msgstr "Није успело „pa_context_connect()“: %s\n"
+
+#: src/conversation/gnunet-helper-audio-playback.c:698
+#: src/conversation/gnunet-helper-audio-record.c:632
+msgid "pa_mainloop_run() failed.\n"
+msgstr "Није успело „pa_mainloop_run()“.\n"
+
+#: src/conversation/gnunet-helper-audio-playback.c:768
+#, c-format
+msgid "Read error from STDIN: %s\n"
+msgstr "Грешка читања са СТНДУЛАЗА: %s\n"
+
+#: src/conversation/gnunet-helper-audio-playback-gst.c:325
+#, c-format
+msgid "Read error from STDIN: %d %s\n"
+msgstr "Грешка читања са СТНДУЛАЗА: %d %s\n"
+
+#: src/conversation/gnunet-helper-audio-record.c:344
+#, c-format
+msgid "opus_encode_float() failed: %s. Aborting\n"
+msgstr "Није успело „opus_encode_float()“: %s. Прекидам\n"
+
+#: src/conversation/gnunet-helper-audio-record.c:420
+#, c-format
+msgid "pa_stream_peek() failed: %s\n"
+msgstr "Није успело „pa_stream_peek()“: %s\n"
+
+#: src/conversation/gnunet-helper-audio-record.c:458
+msgid "Got signal, exiting.\n"
+msgstr "Добих сигнал, излазим.\n"
+
+#: src/conversation/gnunet-helper-audio-record.c:483
+msgid "Stream successfully created.\n"
+msgstr "Ток је успешно направљен.\n"
+
+#: src/conversation/gnunet-helper-audio-record.c:488
+#, c-format
+msgid "pa_stream_get_buffer_attr() failed: %s\n"
+msgstr "Није успело „pa_stream_get_buffer_attr()“: %s\n"
+
+#: src/conversation/gnunet-helper-audio-record.c:496
+#, c-format
+msgid "Buffer metrics: maxlength=%u, fragsize=%u\n"
+msgstr "Мере бафера: maxlength=%u, fragsize=%u\n"
+
+#: src/conversation/gnunet-helper-audio-record.c:500
+#, c-format
+msgid "Using sample spec '%s', channel map '%s'.\n"
+msgstr "Користим спецификацију узорка „%s“, мапа канала „%s“.\n"
+
+#: src/conversation/gnunet-helper-audio-record.c:507
+#, c-format
+msgid "Connected to device %s (%u, %ssuspended).\n"
+msgstr "Повезан са уређајем %s (%u, %sобустављено).\n"
+
+#: src/conversation/gnunet-helper-audio-record.c:516
+#, c-format
+msgid "Stream error: %s\n"
+msgstr "Грешка тока: %s\n"
+
+#: src/conversation/gnunet-helper-audio-record.c:563
+#, c-format
+msgid "pa_stream_connect_record() failed: %s\n"
+msgstr "Није успело „pa_stream_connect_record()“: %s\n"
+
+#: src/conversation/gnunet-helper-audio-record.c:676
+msgid "ogg_stream_init() failed.\n"
+msgstr "Није успело „ogg_stream_init()“.\n"
+
+#: src/conversation/gnunet-helper-audio-record.c:721
+#, c-format
+msgid "Failed to allocate %d bytes for second packet\n"
+msgstr "Нисам успео да доделим %d бајта за други пакет\n"
+
+#: src/conversation/gnunet-service-conversation.c:841
+msgid "Mesh audio channel not ready; audio data dropped\n"
+msgstr "Звучни канал меша није спреман; звучни подаци су одбачени\n"
+
+#: src/conversation/gnunet-service-conversation.c:932
+#, c-format
+msgid "No available phone for incoming call on line %u, sending HANG_UP
signal\n"
+msgstr "Нема доступних телефона за долазни позив на линији %u, шаљем сигнал
ПРЕКИД\n"
+
+#: src/conversation/gnunet-service-conversation.c:1338
+#, c-format
+msgid "Received incoming channel on port %u\n"
+msgstr "Примих долазни канал на прикључник %u\n"
+
+#: src/conversation/microphone.c:121
+msgid "Could not start record audio helper\n"
+msgstr "Не могу да покренем помоћника аудио снимања\n"
+
+#: src/conversation/plugin_gnsrecord_conversation.c:116
+#, c-format
+msgid "Unable to parse PHONE record `%s'\n"
+msgstr "Не могу да обрадим ТЕЛЕФОНСКИ снимак „%s“\n"
+
+#: src/conversation/speaker.c:75
+msgid "Could not start playback audio helper.\n"
+msgstr "Не могу да покренем помоћника аудио пуштања.\n"
+
+#: src/core/core_api.c:767
+msgid "Client was disconnected from core service, trying to reconnect.\n"
+msgstr "Клијент је ископчан са кључне услуге, покушавам поново да се
повежем.\n"
+
+#: src/core/gnunet-core.c:80
+#, c-format
+msgid "Peer `%s'\n"
+msgstr "Парњак „%s“\n"
+
+#: 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"
+msgstr "%24s: %-17s %4s (укупно повезивања: %u)\n"
+
+#: src/core/gnunet-core.c:112 src/transport/gnunet-transport.c:911
+msgid "Connected to"
+msgstr "Повезани сте са"
+
+#: src/core/gnunet-core.c:140 src/transport/gnunet-transport.c:931
+msgid "Disconnected from"
+msgstr "Прекинута је веза са"
+
+#: src/core/gnunet-core.c:211 src/peerinfo-tool/gnunet-peerinfo.c:694
+#, c-format
+msgid "Invalid command line argument `%s'\n"
+msgstr "Неисправан аргумент линије наредби „%s“\n"
+
+#: src/core/gnunet-core.c:233 src/transport/gnunet-transport.c:1486
+msgid "provide information about all current connections (continuously)"
+msgstr "обезбеђује податке о свим тренутним везама (непрекидно)"
+
+#: src/core/gnunet-core.c:244
+msgid "Print information about connected peers."
+msgstr "Исписује податке о повезаним парњацима."
+
+#: src/core/gnunet-service-core.c:105
+msgid "Core service is lacking HOSTKEY configuration setting. Exiting.\n"
+msgstr "Услузи језгра недостаје поставка подешавања КЉУЧА_ДОМАЋИНА.
Излазим.\n"
+
+#: src/core/gnunet-service-core.c:126
+#, c-format
+msgid "Core service of `%4s' ready.\n"
+msgstr "Кључна услуга „%4s“ је спремна.\n"
+
+#: src/core/gnunet-service-core_clients.c:370
+msgid "# send requests dropped (disconnected)"
+msgstr "# захтеви слања су одбачени (веза је прекинута)"
+
+#: src/core/gnunet-service-core_clients.c:480
+msgid "# messages discarded (session disconnected)"
+msgstr "# поруке су одбачене (сесија је ископчана)"
+
+#: src/core/gnunet-service-core_clients.c:526
+#, c-format
+msgid "# bytes of messages of type %u received"
+msgstr "# бајтови порука врсте %u су примљени"
+
+#: src/core/gnunet-service-core_kx.c:535
+msgid "# bytes encrypted"
+msgstr "# бајтова шифрованих"
+
+#: src/core/gnunet-service-core_kx.c:586
+msgid "# bytes decrypted"
+msgstr "# бајтова дешифрованих"
+
+#: src/core/gnunet-service-core_kx.c:673
+msgid "# key exchanges initiated"
+msgstr "# кључ измена је покренут"
+
+#: src/core/gnunet-service-core_kx.c:713
+msgid "# key exchanges stopped"
+msgstr "# кључ измена је заустављен"
+
+#: src/core/gnunet-service-core_kx.c:810
+msgid "# old ephemeral keys ignored"
+msgstr "# стари једнократни кључеви су занемарени"
+
+#: src/core/gnunet-service-core_kx.c:816
+msgid "# ephemeral keys received"
+msgstr "# једнократни кључеви су примљени"
+
+#: src/core/gnunet-service-core_kx.c:850
+#, 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"
+msgstr "Порука једнократног кључа од парњака „%s“ је одбачена јер њен опсег
исправности не одговара времену нашег система (%llu није у [%llu,%llu]).\n"
+
+#: src/core/gnunet-service-core_kx.c:861
+msgid "# EPHEMERAL_KEY messages received"
+msgstr "# поруке ЈЕДНОКРАТНОГ_КЉУЧА су примљене"
+
+#: src/core/gnunet-service-core_kx.c:951
+#: src/transport/gnunet-service-transport_validation.c:1016
+msgid "# PING messages received"
+msgstr "# ПИНГ поруке су примљене"
+
+#: src/core/gnunet-service-core_kx.c:959
+msgid "# PING messages dropped (out of order)"
+msgstr "# ПИНГ поруке су одбачене (ван поретка)"
+
+#: src/core/gnunet-service-core_kx.c:986
+#, c-format
+msgid "Received PING from `%s' for different identity: I am `%s', PONG
identity: `%s'\n"
+msgstr "Примих ПИНГ са „%s“ за другачији идентитет: Ја сам „%s“, ПОНГ
идентитет: „%s“\n"
+
+#: src/core/gnunet-service-core_kx.c:1003
+msgid "# PONG messages created"
+msgstr "# ПОНГ поруке су направљене"
+
+#: src/core/gnunet-service-core_kx.c:1029
+msgid "# sessions terminated by timeout"
+msgstr "# сесије су окончане временским истеком"
+
+#: src/core/gnunet-service-core_kx.c:1039
+msgid "# keepalive messages sent"
+msgstr "# поруке држања у животу су послате"
+
+#: src/core/gnunet-service-core_kx.c:1096
+#: src/transport/gnunet-service-transport_validation.c:1328
+msgid "# PONG messages received"
+msgstr "# ПОНГ поруке су примљене"
+
+#: src/core/gnunet-service-core_kx.c:1102
+msgid "# PONG messages dropped (connection down)"
+msgstr "# ПОНГ поруке су одбачене (веза је пала)"
+
+#: src/core/gnunet-service-core_kx.c:1107
+msgid "# PONG messages dropped (out of order)"
+msgstr "# ПОНГ поруке су одбачене (ван поретка)"
+
+#: src/core/gnunet-service-core_kx.c:1137
+msgid "# PONG messages decrypted"
+msgstr "# ПОНГ поруке су дешифроване"
+
+#: src/core/gnunet-service-core_kx.c:1171
+msgid "# session keys confirmed via PONG"
+msgstr "# кључеви сесије су потврђени путем ПОНГ-а"
+
+#: src/core/gnunet-service-core_kx.c:1181
+msgid "# timeouts prevented via PONG"
+msgstr "# временски истеци су спречени путем ПОНГ-а"
+
+#: src/core/gnunet-service-core_kx.c:1188
+msgid "# rekey operations confirmed via PONG"
+msgstr "# операције рекључа су потврђене путем ПОНГ-а"
+
+#: src/core/gnunet-service-core_kx.c:1328
+msgid "# DATA message dropped (out of order)"
+msgstr "# ПОДАТАКА порука је одбачена (ван поретка)"
+
+#: src/core/gnunet-service-core_kx.c:1335
+#, c-format
+msgid "Session to peer `%s' went down due to key expiration (should not
happen)\n"
+msgstr "Сесија за парњака „%s“ је пала услед истека кључа (није требало да се
деси)\n"
+
+#: src/core/gnunet-service-core_kx.c:1338
+msgid "# sessions terminated by key expiration"
+msgstr "# сесије су окончане истеком кључа"
+
+#: src/core/gnunet-service-core_kx.c:1383
+#: src/core/gnunet-service-core_kx.c:1408
+msgid "# bytes dropped (duplicates)"
+msgstr "# бајтови одбачени (удвострученост)"
+
+#: src/core/gnunet-service-core_kx.c:1395
+msgid "# bytes dropped (out of sequence)"
+msgstr "# бајтови одбачени (ван низа)"
+
+#: src/core/gnunet-service-core_kx.c:1437
+msgid "# bytes dropped (ancient message)"
+msgstr "# бајтови одбачени (стара порука)"
+
+#: src/core/gnunet-service-core_kx.c:1445
+msgid "# bytes of payload decrypted"
+msgstr "# бајтови утовара су дешифровани"
+
+#: src/core/gnunet-service-core_kx.c:1480
+msgid "# PAYLOAD dropped (out of order)"
+msgstr "# УТОВАР је одбачен (ван поретка)"
+
+#: src/core/gnunet-service-core_neighbours.c:168
+msgid "# sessions terminated by transport disconnect"
+msgstr "# окончане сесије прекидом преноса"
+
+#: src/core/gnunet-service-core_neighbours.c:184
+#: src/core/gnunet-service-core_neighbours.c:335
+msgid "# neighbour entries allocated"
+msgstr "# уноси суседа су додељени"
+
+#: src/core/gnunet-service-core_neighbours.c:252
+msgid "# encrypted bytes given to transport"
+msgstr "# шифровани бајтови су дати преносу"
+
+#: src/core/gnunet-service-core_neighbours.c:418
+#, c-format
+msgid "Unsupported message of type %u (%u bytes) received from peer `%s'\n"
+msgstr "Неподржана порука врсте %u (%u бајта) је примљена са парњака „%s“\n"
+
+#: 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
+msgid "# peers connected"
+msgstr "# парњаци су повезани"
+
+#: src/core/gnunet-service-core_sessions.c:255
+msgid "# type map refreshes sent"
+msgstr "# освежавања мапе врсте су послата"
+
+#: src/core/gnunet-service-core_sessions.c:426
+msgid "# messages discarded (expired prior to transmission)"
+msgstr "# поруке су одбачене (истекле су пре преноса)"
+
+#: src/core/gnunet-service-core_typemap.c:110
+#: src/core/gnunet-service-core_typemap.c:121
+msgid "# type maps received"
+msgstr "# мапе врсте су примљене"
+
+#: src/core/gnunet-service-core_typemap.c:151
+msgid "# updates to my type map"
+msgstr "# ажурирања за моју мапу врсте"
+
+#: src/datacache/datacache.c:115 src/datacache/datacache.c:266
+#: src/datastore/gnunet-service-datastore.c:838
+msgid "# bytes stored"
+msgstr "# бајтови су смештени"
+
+#: src/datacache/datacache.c:117 src/datacache/datacache.c:268
+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
+#, c-format
+msgid "No `%s' specified for `%s' in configuration!\n"
+msgstr "Није наведено „%s“ за „%s“ у подешавањима!\n"
+
+#: src/datacache/datacache.c:184
+#, c-format
+msgid "Loading `%s' datacache plugin\n"
+msgstr "Учитавам прикључак „%s“ оставе података\n"
+
+#: src/datacache/datacache.c:192
+#, c-format
+msgid "Failed to load datacache plugin for `%s'\n"
+msgstr "Нисам успео да учитам прикључак оставе података за „%s“\n"
+
+#: src/datacache/datacache.c:295
+msgid "# requests received"
+msgstr "# захтеви су примљени"
+
+#: src/datacache/datacache.c:304
+msgid "# requests filtered by bloom filter"
+msgstr "# захтеви су филтрирани блум филтером"
+
+#: src/datacache/plugin_datacache_heap.c:406
+msgid "Heap datacache running\n"
+msgstr "Остава података скупине ради\n"
+
+#: src/datacache/plugin_datacache_postgres.c:392
+msgid "Postgres datacache running\n"
+msgstr "Остава података Постгреса ради\n"
+
+#: 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_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
+#: src/namecache/plugin_namecache_postgres.c:52
+#: src/namecache/plugin_namecache_sqlite.c:52
+#: src/namestore/plugin_namestore_postgres.c:52
+#: src/namestore/plugin_namestore_sqlite.c:52
+#: 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
+#, c-format
+msgid "`%s' failed at %s:%d with error: %s\n"
+msgstr "„%s“ није успело на %s:%d са грешком: %s\n"
+
+#: src/datacache/plugin_datacache_sqlite.c:450
+msgid "Sqlite datacache running\n"
+msgstr "Остава података Скулајта ради\n"
+
+#: 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
+msgid "Tried to close sqlite without finalizing all prepared statements.\n"
+msgstr "Покушај да затворим скулајт без довршавања свих спремљених изјава.\n"
+
+#: src/datacache/plugin_datacache_sqlite.c:491
+#, c-format
+msgid "Failed to close statement %p: %d\n"
+msgstr "Нисам успео да затворим тврдњу „%p“: %d\n"
+
+#: src/datacache/plugin_datacache_template.c:125
+msgid "Template datacache running\n"
+msgstr "Остава података шаблона ради\n"
+
+#: src/datastore/datastore_api.c:310
+msgid "Failed to transmit request to drop database.\n"
+msgstr "Нисам успео да пренесем захтев бази података убацивања.\n"
+
+#: src/datastore/datastore_api.c:394
+msgid "# queue entry timeouts"
+msgstr "# истекла су времена уноса реда"
+
+#: src/datastore/datastore_api.c:443
+msgid "# queue overflows"
+msgstr "# прекорачења реда"
+
+#: src/datastore/datastore_api.c:471
+msgid "# queue entries created"
+msgstr "# уноси реда су створени"
+
+#: src/datastore/datastore_api.c:491
+msgid "# Requests dropped from datastore queue"
+msgstr "# Захтеви су одбачени из реда смештаја података"
+
+#: src/datastore/datastore_api.c:533
+msgid "# datastore connections (re)created"
+msgstr "# везе смештаја података су (поново) створене"
+
+#: src/datastore/datastore_api.c:616 src/scalarproduct/scalarproduct_api.c:279
+msgid "# transmission request failures"
+msgstr "# неуспеси захтева преноса"
+
+#: src/datastore/datastore_api.c:638
+msgid "# bytes sent to datastore"
+msgstr "# бајтови су послати смештају података"
+
+#: src/datastore/datastore_api.c:770
+msgid "Failed to receive status response from database."
+msgstr "Нисам успео да примим одговор стања из базе података."
+
+#: src/datastore/datastore_api.c:784
+msgid "Error reading response from datastore service"
+msgstr "Грешка читања одговора из услуге смештаја података"
+
+#: src/datastore/datastore_api.c:796 src/datastore/datastore_api.c:802
+msgid "Invalid error message received from datastore service"
+msgstr "Неисправна порука грешке је примљена из услуге смештаја података"
+
+#: src/datastore/datastore_api.c:806
+msgid "# status messages received"
+msgstr "# поруке стања су примљене"
+
+#: src/datastore/datastore_api.c:876
+msgid "# PUT requests executed"
+msgstr "# захтеви СТАВИ су извршени"
+
+#: src/datastore/datastore_api.c:944
+msgid "# RESERVE requests executed"
+msgstr "# захтеви РЕЗЕРВИШИ су извршени"
+
+#: src/datastore/datastore_api.c:1005
+msgid "# RELEASE RESERVE requests executed"
+msgstr "# захтеви ОТПУСТИ РЕЗЕРВИШИ су извршени"
+
+#: src/datastore/datastore_api.c:1065
+msgid "# UPDATE requests executed"
+msgstr "# захтеви ОСВЕЖИ су извршени"
+
+#: src/datastore/datastore_api.c:1129
+msgid "# REMOVE requests executed"
+msgstr "# захтеви УКЛОНИ су извршени"
+
+#: src/datastore/datastore_api.c:1174
+msgid "Failed to receive response from database.\n"
+msgstr "Нисам успео да примим одговор из базе података.\n"
+
+#: src/datastore/datastore_api.c:1233
+msgid "# Results received"
+msgstr "# Резултати су примљени"
+
+#: src/datastore/datastore_api.c:1300
+msgid "# GET REPLICATION requests executed"
+msgstr "# захтеви ДОБАВИ ПРЕСЛИКАНОСТ су изршени"
+
+#: src/datastore/datastore_api.c:1363
+msgid "# GET ZERO ANONYMITY requests executed"
+msgstr "# захтеви ДОБАВИ НУЛТУ АНОНИМНОСТ су извршени"
+
+#: src/datastore/datastore_api.c:1424
+msgid "# GET requests executed"
+msgstr "# захтеви ДОБАВИ су извршени"
+
+#: src/datastore/gnunet-datastore.c:114
+#, c-format
+msgid "Failed to store item: %s, aborting\n"
+msgstr "Нисам успео да сместим ставку: %s, прекидам\n"
+
+#: src/datastore/gnunet-datastore.c:200
+#, c-format
+msgid "Cannot use the same configuration for source and destination\n"
+msgstr "Не могу да користим исто подешавање за извор и одредиште\n"
+
+#: 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"
+msgstr "наводи подешавање за коришћење за приступ заменском смештају података;
стопиће тај смештај података у наш тренутни смештај података"
+
+#: src/datastore/gnunet-datastore.c:255
+msgid "Manipulate GNUnet datastore"
+msgstr "Манипулише ГНУнет смештајом података"
+
+#: src/datastore/gnunet-service-datastore.c:351
+msgid "# bytes expired"
+msgstr "# бајтови су истекли"
+
+#: src/datastore/gnunet-service-datastore.c:425
+msgid "# bytes purged (low-priority)"
+msgstr "# бајтови су избачени (ниска хитност)"
+
+#: src/datastore/gnunet-service-datastore.c:483
+#: src/gns/gnunet-gns-helper-service-w32.c:223
+msgid "Transmission to client failed!\n"
+msgstr "Пренос до клијента није успео!\n"
+
+#: src/datastore/gnunet-service-datastore.c:514
+#: src/gns/gnunet-gns-helper-service-w32.c:262
+msgid "Shutdown in progress, aborting transmission.\n"
+msgstr "Гашење је у току, прекидам пренос.\n"
+
+#: src/datastore/gnunet-service-datastore.c:630
+msgid "# results found"
+msgstr "# резултати су нађени"
+
+#: src/datastore/gnunet-service-datastore.c:673
+#, c-format
+msgid "Insufficient space (%llu bytes are available) to satisfy `%s' request
for %llu bytes\n"
+msgstr "Недовољно простора (доступних бајтова %llu) за задовољавање „%s“
захтева за %llu бајта\n"
+
+#: src/datastore/gnunet-service-datastore.c:684
+#, c-format
+msgid "The requested amount (%llu bytes) is larger than the cache size (%llu
bytes)\n"
+msgstr "Захтевана количина (%llu бајта) је већа од величине оставе (%llu
бајта)\n"
+
+#: src/datastore/gnunet-service-datastore.c:688
+msgid "Insufficient space to satisfy request and requested amount is larger
than cache size"
+msgstr "Недовољно простора за задовољавање захтева а захтевана количина је
већа од величине оставе"
+
+#: src/datastore/gnunet-service-datastore.c:694
+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
+msgid "# reserved"
+msgstr "# је резервисано"
+
+#: src/datastore/gnunet-service-datastore.c:764
+msgid "Could not find matching reservation"
+msgstr "Не могу да нађем одговарајућу резервацију"
+
+#: src/datastore/gnunet-service-datastore.c:850
+#, c-format
+msgid "Need %llu bytes more space (%llu allowed, using %llu)\n"
+msgstr "Потребна су још %llu бајта простора (%llu је дозвољено, користим
%llu)\n"
+
+#: src/datastore/gnunet-service-datastore.c:1010
+msgid "# GET requests received"
+msgstr "# захтеви ДОБАВИ су примљени"
+
+#: src/datastore/gnunet-service-datastore.c:1022
+msgid "# requests filtered by bloomfilter"
+msgstr "# захтеви су филтрирани блумфилтером"
+
+#: src/datastore/gnunet-service-datastore.c:1050
+msgid "# UPDATE requests received"
+msgstr "# захтеви ОСВЕЖИ су примљени"
+
+#: src/datastore/gnunet-service-datastore.c:1080
+msgid "# GET REPLICATION requests received"
+msgstr "# захтеви ДОБАВИ ПРЕСЛИКАНОСТ су примљени"
+
+#: src/datastore/gnunet-service-datastore.c:1113
+msgid "# GET ZERO ANONYMITY requests received"
+msgstr "# захтеви ДОБАВИ НУЛТУ АНОНИМНОСТ су примљени"
+
+#: src/datastore/gnunet-service-datastore.c:1138
+msgid "Content not found"
+msgstr "Нисам нашао садржај"
+
+#: src/datastore/gnunet-service-datastore.c:1146
+msgid "# bytes removed (explicit request)"
+msgstr "# бајта је уклоњено (изричити захтев)"
+
+#: src/datastore/gnunet-service-datastore.c:1178
+msgid "# REMOVE requests received"
+msgstr "# захтеви УКЛОНИ су уклоњени"
+
+#: src/datastore/gnunet-service-datastore.c:1220
+#, c-format
+msgid "Datastore payload inaccurate (%lld < %lld). Trying to fix.\n"
+msgstr "Утовар смештаја података није тачан (%lld < %lld). Покушавам да
поправим.\n"
+
+#: src/datastore/gnunet-service-datastore.c:1281
+#, c-format
+msgid "Loading `%s' datastore plugin\n"
+msgstr "Учитавам прикључак „%s“ смештаја података\n"
+
+#: src/datastore/gnunet-service-datastore.c:1290
+#, c-format
+msgid "Failed to load datastore plugin for `%s'\n"
+msgstr "Нисам успео да учитам прикључак смештаја података за „%s“\n"
+
+#: src/datastore/gnunet-service-datastore.c:1492
+#, c-format
+msgid "# bytes used in file-sharing datastore `%s'"
+msgstr "# бајтови су коришћени у смештају података дељења датотека „%s“"
+
+#: src/datastore/gnunet-service-datastore.c:1503
+msgid "# quota"
+msgstr "# квота"
+
+#: src/datastore/gnunet-service-datastore.c:1505
+msgid "# cache size"
+msgstr "# величина кеша"
+
+#: src/datastore/gnunet-service-datastore.c:1518
+#, c-format
+msgid "Could not use specified filename `%s' for bloomfilter.\n"
+msgstr "Не могу да користим наведени назив датотеке „%s“ за блумфилтер.\n"
+
+#: src/datastore/gnunet-service-datastore.c:1536
+#: src/datastore/gnunet-service-datastore.c:1552
+#, c-format
+msgid "Failed to remove bogus bloomfilter file `%s'\n"
+msgstr "Нисам успео да уклоним лажну датотеку блумфилтера „%s“\n"
+
+#: src/datastore/gnunet-service-datastore.c:1582
+msgid "Failed to initialize bloomfilter.\n"
+msgstr "Нисам успео да покренем блумфилтер.\n"
+
+#: src/datastore/gnunet-service-datastore.c:1611
+msgid "Rebuilding bloomfilter. Please be patient.\n"
+msgstr "Поново градим блумфилтер. Будите стрпљиви.\n"
+
+#: src/datastore/gnunet-service-datastore.c:1616
+msgid "Plugin does not support get_keys function. Please fix!\n"
+msgstr "Прикључак не подржава функцију „get_keys“. Поправите то!\n"
+
+#: src/datastore/gnunet-service-datastore.c:1619
+msgid "Bloomfilter construction complete.\n"
+msgstr "Изградња блумфилтера је завршена.\n"
+
+#: src/datastore/plugin_datastore_heap.c:820
+msgid "Heap database running\n"
+msgstr "База података скупине ради\n"
+
+#: src/datastore/plugin_datastore_mysql.c:783
+#, c-format
+msgid "Failed to prepare statement `%s'\n"
+msgstr "Нисам успео да припремим стање „%s“\n"
+
+#: src/datastore/plugin_datastore_mysql.c:791
+#, c-format
+msgid "`%s' for `%s' failed at %s:%d with error: %s\n"
+msgstr "„%s“ за „%s“ није успело на %s:%d са грешком: %s\n"
+
+#: src/datastore/plugin_datastore_mysql.c:1022
+msgid "Mysql database running\n"
+msgstr "База података Мајскула ради\n"
+
+#: src/datastore/plugin_datastore_postgres.c:824
+msgid "Failed to drop table from database.\n"
+msgstr "Нисам успео да избацим табелу из базе података.\n"
+
+#: src/datastore/plugin_datastore_postgres.c:860
+#: src/namecache/plugin_namecache_postgres.c:414
+#: src/namestore/plugin_namestore_postgres.c:569
+msgid "Postgres database running\n"
+msgstr "База података Постгреса ради\n"
+
+#: src/datastore/plugin_datastore_sqlite.c:57
+#: src/testbed/generate-underlay-topology.c:50
+#: src/testbed/gnunet-daemon-latency-logger.c:55
+#: src/testbed/gnunet-daemon-testbed-underlay.c:58
+#, c-format
+msgid "`%s' failed at %s:%u with error: %s"
+msgstr "„%s“ није успело на %s:%u са грешком: %s"
+
+#: 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
+#, c-format
+msgid "Unable to initialize SQLite: %s.\n"
+msgstr "Не могу да покренем СКуЛајт: %s.\n"
+
+#: src/datastore/plugin_datastore_sqlite.c:663
+msgid "Invalid data in database. Trying to fix (by deletion).\n"
+msgstr "Неисправан податак у бази података. Покушавам да поправим
(брисањем).\n"
+
+#: src/datastore/plugin_datastore_sqlite.c:1156
+msgid "sqlite version to old to determine size, assuming zero\n"
+msgstr "скулајт издање је престаро за одређивање величине, подразумевам нулу\n"
+
+#: src/datastore/plugin_datastore_sqlite.c:1175
+#, c-format
+msgid "Using sqlite page utilization to estimate payload (%llu pages of size
%llu bytes)\n"
+msgstr "Користим страницу коришћења скулајта да проценим утовар (%llu странице
величине %llu бајта)\n"
+
+#: src/datastore/plugin_datastore_sqlite.c:1215
+#: src/namecache/plugin_namecache_sqlite.c:583
+#: src/namestore/plugin_namestore_sqlite.c:719
+msgid "Sqlite database running\n"
+msgstr "База података Скулајта ради\n"
+
+#: src/datastore/plugin_datastore_template.c:257
+msgid "Template database running\n"
+msgstr "База података шаблона ради\n"
+
+#: src/dht/dht_api.c:376
+msgid "Failed to connect to the DHT service!\n"
+msgstr "Нисам успео да се повежем са „DHT“ услугом!\n"
+
+#: src/dht/gnunet-dht-get.c:133
+#, c-format
+msgid ""
+"Result %d, type %d:\n"
+"%.*s\n"
+msgstr ""
+"Резултат %d, врста %d:\n"
+"%.*s\n"
+
+#: src/dht/gnunet-dht-get.c:159
+msgid "Must provide key for DHT GET!\n"
+msgstr "Морате доставити кључ за ДХТ ДОБАВИ!\n"
+
+#: src/dht/gnunet-dht-get.c:165 src/dht/gnunet-dht-monitor.c:225
+msgid "Failed to connect to DHT service!\n"
+msgstr "Нисам успео да се повежем са „DHT“ услугом!\n"
+
+#: src/dht/gnunet-dht-get.c:173
+msgid "Issueing DHT GET with key"
+msgstr "Издајем ДХТ ДОБАВИ са кључем"
+
+#: src/dht/gnunet-dht-get.c:189 src/dht/gnunet-dht-monitor.c:262
+#: src/dht/gnunet-dht-put.c:198
+msgid "the query key"
+msgstr "кључ упита"
+
+#: src/dht/gnunet-dht-get.c:192
+msgid "how many parallel requests (replicas) to create"
+msgstr "колико паралелних захтева (реплика) да направи"
+
+#: src/dht/gnunet-dht-get.c:195 src/dht/gnunet-dht-monitor.c:265
+msgid "the type of data to look for"
+msgstr "врста података за тражење"
+
+#: src/dht/gnunet-dht-get.c:198 src/dht/gnunet-dht-put.c:210
+msgid "how long to execute this query before giving up?"
+msgstr "колико дуго да извршава овај упит пре одустајања?"
+
+#: src/dht/gnunet-dht-get.c:201 src/dht/gnunet-dht-put.c:201
+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/fs/gnunet-search.c:301 src/fs/gnunet-unindex.c:168
+#: src/nse/gnunet-nse-profiler.c:873
+msgid "be verbose (print progress information)"
+msgstr "бива опширан (исписује податке напредовања)"
+
+#: src/dht/gnunet-dht-get.c:225
+msgid "Issue a GET request to the GNUnet DHT, prints results."
+msgstr "Издаје ДОБАВИ захтев ГНУнет ДХТ-у, исписује резултате."
+
+#: src/dht/gnunet-dht-monitor.c:268
+msgid "how long should the monitor command run"
+msgstr "колико дуго треба да ради наредба праћења"
+
+#: src/dht/gnunet-dht-monitor.c:293
+msgid "Prints all packets that go through the DHT."
+msgstr "Исписује све пакете који иду кроз „DHT“."
+
+#: src/dht/gnunet-dht-put.c:118
+msgid "PUT request sent with key"
+msgstr "СТАВИ захтев је послат са кључем"
+
+#: src/dht/gnunet-dht-put.c:121
+msgid "Timeout sending PUT request!\n"
+msgstr "Истекло је време слања СТАВИ захтева!\n"
+
+#: src/dht/gnunet-dht-put.c:124
+msgid "PUT request not confirmed!\n"
+msgstr "Захтев СТАВИ није потврђен!\n"
+
+#: src/dht/gnunet-dht-put.c:153
+msgid "Must provide KEY and DATA for DHT put!\n"
+msgstr "Морате доставити КЉУЧ и ПОДАЦИ за ДХТ стављање!\n"
+
+#: src/dht/gnunet-dht-put.c:160
+#, c-format
+msgid "Could not connect to %s service!\n"
+msgstr "Не могу да се повежем са „%s“ услугом!\n"
+
+#: src/dht/gnunet-dht-put.c:176
+#, c-format
+msgid "Issuing put request for `%s' with data `%s'!\n"
+msgstr "Издајем захтев стављања за „%s“ са подацима „%s“!\n"
+
+#: src/dht/gnunet-dht-put.c:192
+msgid "the data to insert under the key"
+msgstr "подаци за уметање под кључем"
+
+#: src/dht/gnunet-dht-put.c:195
+msgid "how long to store this entry in the dht (in seconds)"
+msgstr "колико ће дуго да држи овај унос у дхт-у (у секундама)"
+
+#: src/dht/gnunet-dht-put.c:204
+msgid "how many replicas to create"
+msgstr "број реплика за стварање"
+
+#: src/dht/gnunet-dht-put.c:207
+msgid "the type to insert data as"
+msgstr "врста за уметање података"
+
+#: src/dht/gnunet-dht-put.c:236
+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
+msgid "Failed to connect to transport service!\n"
+msgstr "Нисам успео да се повежем са услугом преноса!\n"
+
+#: src/dht/gnunet-service-dht_clients.c:417
+#: src/dht/gnunet-service-xdht_clients.c:838
+msgid "# GET requests from clients injected"
+msgstr "# захтеви ДОБАВИ од клијената су убризгани"
+
+#: src/dht/gnunet-service-dht_clients.c:513
+#: src/dht/gnunet-service-xdht_clients.c:927
+msgid "# PUT requests received from clients"
+msgstr "# захтеви СТАВИ су примљени од клијената"
+
+#: src/dht/gnunet-service-dht_clients.c:597
+#: src/dht/gnunet-service-xdht_clients.c:1013
+msgid "# GET requests received from clients"
+msgstr "# захтеви ДОБАВИ су примљени од клијената"
+
+#: src/dht/gnunet-service-dht_clients.c:798
+#: src/dht/gnunet-service-xdht_clients.c:1214
+msgid "# GET STOP requests received from clients"
+msgstr "# захтеви ДОБАВИ СТОП су примљени од клијената"
+
+#: src/dht/gnunet-service-dht_clients.c:1039
+#: src/dht/gnunet-service-xdht_clients.c:498
+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
+msgid "# Duplicate REPLIES to CLIENT request dropped"
+msgstr "# Двоструки захтев ОДГОВОРИ КЛИЈЕНТУ је одбачен"
+
+#: src/dht/gnunet-service-dht_clients.c:1089
+#: src/dht/gnunet-service-xdht_clients.c:548
+#, c-format
+msgid "Unsupported block type (%u) in request!\n"
+msgstr "Неподржана врста блока (%u) у захтеву!\n"
+
+#: src/dht/gnunet-service-dht_clients.c:1112
+#: src/dht/gnunet-service-xdht_clients.c:571
+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
+msgid "# REPLIES ignored for CLIENTS (no match)"
+msgstr "# ОДГОВОРИ су занемарени за КЛИЈЕНТЕ (нема поклапања)"
+
+#: src/dht/gnunet-service-dht_clients.c:1176
+#: src/dht/gnunet-service-xdht_clients.c:635
+msgid "Could not pass reply to client, message too big!\n"
+msgstr "Не могу да проследим одговор клијенту, порука је превелика!\n"
+
+#: src/dht/gnunet-service-dht_datacache.c:68
+#: src/dht/gnunet-service-xdht_datacache.c:68
+#, c-format
+msgid "%s request received, but have no datacache!\n"
+msgstr "„%s“ захтев је примљен, али нема оставу података!\n"
+
+#: src/dht/gnunet-service-dht_datacache.c:78
+#: src/dht/gnunet-service-xdht_datacache.c:78
+msgid "# ITEMS stored in datacache"
+msgstr "# СТАВКЕ су смештене у оставу података"
+
+#: src/dht/gnunet-service-dht_datacache.c:165
+#: src/dht/gnunet-service-xdht_datacache.c:165
+msgid "# Good RESULTS found in datacache"
+msgstr "# Добри РЕЗУЛТАТИ су нађени у остави података"
+
+#: src/dht/gnunet-service-dht_datacache.c:176
+#: src/dht/gnunet-service-xdht_datacache.c:176
+msgid "# Duplicate RESULTS found in datacache"
+msgstr "# Двоструки РЕЗУЛТАТИ су нађени у остави података"
+
+#: src/dht/gnunet-service-dht_datacache.c:182
+#: src/dht/gnunet-service-xdht_datacache.c:182
+msgid "# Invalid RESULTS found in datacache"
+msgstr "# Неисправни РЕЗУЛТАТИ су нађени у остави података"
+
+#: src/dht/gnunet-service-dht_datacache.c:188
+#: src/dht/gnunet-service-xdht_datacache.c:188
+msgid "# Irrelevant RESULTS found in datacache"
+msgstr "# Неважни РЕЗУЛТАТИ су нађени у остави података"
+
+#: src/dht/gnunet-service-dht_datacache.c:200
+#: src/dht/gnunet-service-xdht_datacache.c:200
+msgid "# Unsupported RESULTS found in datacache"
+msgstr "# Неподржани РЕЗУЛТАТИ су нађени у остави података"
+
+#: src/dht/gnunet-service-dht_datacache.c:203
+#: src/dht/gnunet-service-xdht_datacache.c:203
+#, c-format
+msgid "Unsupported block type (%u) in local response!\n"
+msgstr "Неподржана врста блока (%u) у локалном одговору!\n"
+
+#: src/dht/gnunet-service-dht_datacache.c:234
+#: src/dht/gnunet-service-xdht_datacache.c:234
+msgid "# GET requests given to datacache"
+msgstr "# ДОБАВИ захтеви су дати остави података"
+
+#: src/dht/gnunet-service-dht_hello.c:84
+#: src/dht/gnunet-service-xdht_hello.c:82
+msgid "# HELLOs obtained from peerinfo"
+msgstr "# „HELLO“-и су добијени из података парњака"
+
+#: src/dht/gnunet-service-dht_neighbours.c:516
+msgid "# Preference updates given to core"
+msgstr "# Ажурирања поставки су дата језгру"
+
+#: src/dht/gnunet-service-dht_neighbours.c:610
+msgid "# FIND PEER messages initiated"
+msgstr "# НАЂИ ПАРЊАКА поруке су покренуте"
+
+#: src/dht/gnunet-service-dht_neighbours.c:764
+msgid "# Queued messages discarded (peer disconnected)"
+msgstr "# Поруке из реда су одбачене (парњак је ископчан)"
+
+#: src/dht/gnunet-service-dht_neighbours.c:819
+#: src/dht/gnunet-service-xdht_neighbours.c:703
+msgid "# Bytes transmitted to other peers"
+msgstr "# Бајтови су пренесени другим парњацима"
+
+#: src/dht/gnunet-service-dht_neighbours.c:857
+#: src/dht/gnunet-service-xdht_neighbours.c:742
+msgid "# Bytes of bandwidth requested from core"
+msgstr "# Бајтови пропусног опсега које захтева језгро"
+
+#: src/dht/gnunet-service-dht_neighbours.c:889
+msgid "# requests TTL-dropped"
+msgstr "# захтеви ТТЛ су одбачени"
+
+#: src/dht/gnunet-service-dht_neighbours.c:1093
+#: src/dht/gnunet-service-dht_neighbours.c:1130
+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
+msgid "# Peer selection failed"
+msgstr "# Бирање парњака није успело"
+
+#: src/dht/gnunet-service-dht_neighbours.c:1287
+msgid "# PUT requests routed"
+msgstr "# захтеви СТАВИ су рутирани"
+
+#: src/dht/gnunet-service-dht_neighbours.c:1316
+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
+msgid "# P2P messages dropped due to full queue"
+msgstr "# П2П поруке су одбачене због пуног реда"
+
+#: src/dht/gnunet-service-dht_neighbours.c:1405
+msgid "# GET requests routed"
+msgstr "# захтеви ДОБАВИ су рутирани"
+
+#: src/dht/gnunet-service-dht_neighbours.c:1432
+msgid "# GET messages queued for transmission"
+msgstr "# ДОБАВИ поруке су у реду за пренос"
+
+#: src/dht/gnunet-service-dht_neighbours.c:1550
+msgid "# RESULT messages queued for transmission"
+msgstr "# РЕЗУЛТАТ поруке су у реду за пренос"
+
+#: src/dht/gnunet-service-dht_neighbours.c:1636
+msgid "# P2P PUT requests received"
+msgstr "# захтеви П2П СТАВИ су примљени"
+
+#: src/dht/gnunet-service-dht_neighbours.c:1639
+msgid "# P2P PUT bytes received"
+msgstr "# бајтови П2П СТАВИ су примљени"
+
+#: src/dht/gnunet-service-dht_neighbours.c:1803
+msgid "# FIND PEER requests ignored due to Bloomfilter"
+msgstr "# захтеви НАЂИ ПАРЊАКА су занемарени због Блумфилтера"
+
+#: src/dht/gnunet-service-dht_neighbours.c:1811
+msgid "# FIND PEER requests ignored due to lack of HELLO"
+msgstr "# захтеви НАЂИ ПАРЊАКА су занемарени због недостатка „HELLO“-а"
+
+#: src/dht/gnunet-service-dht_neighbours.c:1904
+msgid "# P2P GET requests received"
+msgstr "# захтеви П2П ДОБАВИ су примљени"
+
+#: src/dht/gnunet-service-dht_neighbours.c:1907
+msgid "# P2P GET bytes received"
+msgstr "# бајтови П2П ДОБАВИ су примљени"
+
+#: src/dht/gnunet-service-dht_neighbours.c:1961
+msgid "# P2P FIND PEER requests processed"
+msgstr "# захтеви П2П НАЂИ ПАРЊАКА су обрађени"
+
+#: src/dht/gnunet-service-dht_neighbours.c:1975
+msgid "# P2P GET requests ONLY routed"
+msgstr "# захтеви П2П ДОБАВИ су САМО рутирани"
+
+#: src/dht/gnunet-service-dht_neighbours.c:2052
+msgid "# P2P RESULTS received"
+msgstr "# П2П РЕЗУЛТАТИ су примљени"
+
+#: src/dht/gnunet-service-dht_neighbours.c:2055
+msgid "# P2P RESULT bytes received"
+msgstr "# бајтови П2П РЕЗУЛТАТ су примљени"
+
+#: src/dht/gnunet-service-dht_nse.c:59 src/dht/gnunet-service-xdht_nse.c:59
+msgid "# Network size estimates received"
+msgstr "# Процене величине мреже су примљене"
+
+#: src/dht/gnunet-service-dht_routing.c:211
+msgid "# Good REPLIES matched against routing table"
+msgstr "# Добри ОДГОВОРИ су поклопљени наспрам табеле рутирања"
+
+#: src/dht/gnunet-service-dht_routing.c:220
+msgid "# Duplicate REPLIES matched against routing table"
+msgstr "# Двоструки ОДГОВОРИ су поклопљени наспрам табеле рутирања"
+
+#: src/dht/gnunet-service-dht_routing.c:226
+msgid "# Invalid REPLIES matched against routing table"
+msgstr "# Неисправни ОДГОВОРИ су поклопљени наспрам табеле рутирања"
+
+#: src/dht/gnunet-service-dht_routing.c:232
+msgid "# Irrelevant REPLIES matched against routing table"
+msgstr "# Неважни ОДГОВОРИ су поклопљени наспрам табеле рутирања"
+
+#: src/dht/gnunet-service-dht_routing.c:244
+msgid "# Unsupported REPLIES matched against routing table"
+msgstr "# Неподржани ОДГОВОРИ су поклопљени наспрам табеле рутирања"
+
+#: src/dht/gnunet-service-dht_routing.c:317
+msgid "# Entries removed from routing table"
+msgstr "# Уноси су уклоњени из табеле рутирања"
+
+#: src/dht/gnunet-service-dht_routing.c:399
+msgid "# Entries added to routing table"
+msgstr "# Уноси су додати у табелу рутирања"
+
+#: src/dht/gnunet-service-dht_routing.c:417
+msgid "# DHT requests combined"
+msgstr "# ДХТ захтеви су комбиновани"
+
+#: src/dht/gnunet-service-xdht_neighbours.c:1398
+#, c-format
+msgid ""
+"\n"
+"SUPU %s, %s, %d,my_identity = %s"
+msgstr ""
+"\n"
+"SUPU %s, %s, %d,my_identity = %s"
+
+#: 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
+#, c-format
+msgid ""
+"\n"
+"SUPU %s, %s, %d"
+msgstr ""
+"\n"
+"SUPU %s, %s, %d"
+
+#: src/dht/plugin_block_dht.c:138
+#, c-format
+msgid "Block not of type %u\n"
+msgstr "Блок није врсте %u\n"
+
+#: src/dht/plugin_block_dht.c:145
+msgid "Size mismatch for block\n"
+msgstr "Величин не одговара за блок\n"
+
+#: src/dht/plugin_block_dht.c:155
+#, c-format
+msgid "Block of type %u is malformed\n"
+msgstr "Блок врсте %u је лош\n"
+
+#: src/dns/dnsparser.c:257
+#, c-format
+msgid "Failed to convert DNS IDNA name `%s' to UTF-8: %s\n"
+msgstr "Нисам успео да претворим ДНС ИДНА „%s“ у УТФ-8: %s\n"
+
+#: src/dns/dnsparser.c:856
+#, c-format
+msgid "Failed to convert UTF-8 name `%s' to DNS IDNA format: %s\n"
+msgstr "Нисам успео да претворим УТФ-8 назив „%s“ у ДНС ИДНА формат: %s\n"
+
+#: src/dns/dnsstub.c:175
+#, c-format
+msgid "Could not bind to any port: %s\n"
+msgstr "Не могу да се вежем ни за један прикључник: %s\n"
+
+#: src/dns/dnsstub.c:295 src/dns/dnsstub.c:383
+#, c-format
+msgid "Failed to send DNS request to %s\n"
+msgstr "Нисам успео да пошаљем ДНС захтев за %s\n"
+
+#: src/dns/dnsstub.c:299
+#, c-format
+msgid "Sent DNS request to %s\n"
+msgstr "Послао сам ДНС захтев за %s\n"
+
+#: src/dns/dnsstub.c:368
+#, c-format
+msgid "Configured DNS exit `%s' is not working / valid.\n"
+msgstr "Подешени ДНС излаз „%s“ не ради / није исправан.\n"
+
+#: src/dns/dnsstub.c:440
+#, c-format
+msgid "Received DNS response that is too small (%u bytes)"
+msgstr "Примих ДНС одговор који је премали (%u бајта)"
+
+#: src/dns/gnunet-dns-monitor.c:355
+msgid "only monitor DNS queries"
+msgstr "само надгледа ДНС упите"
+
+#: src/dns/gnunet-dns-monitor.c:358
+msgid "only monitor DNS replies"
+msgstr "само надгледа ДНС одговоре"
+
+#: src/dns/gnunet-dns-monitor.c:369
+msgid "Monitor DNS queries."
+msgstr "Надгледа ДНС упите."
+
+#: src/dns/gnunet-dns-redirector.c:236
+msgid "set A records"
+msgstr "поставља A записе"
+
+#: src/dns/gnunet-dns-redirector.c:239
+msgid "set AAAA records"
+msgstr "поставља AAAA записе"
+
+#: src/dns/gnunet-dns-redirector.c:251
+msgid "Change DNS replies to point elsewhere."
+msgstr "Мења ДНС одговоре да показују негде другде."
+
+#: src/dns/gnunet-service-dns.c:456
+msgid "# DNS requests answered via TUN interface"
+msgstr "# на ДНС захтеве је одговорено путем ТУН сучеља"
+
+#: src/dns/gnunet-service-dns.c:603
+msgid "# DNS exit failed (failed to open socket)"
+msgstr "# ДНС излаз није успео (нисам успео да отворим прикључницу)"
+
+#: src/dns/gnunet-service-dns.c:714
+msgid "# External DNS response discarded (no matching request)"
+msgstr "# Спољни ДНС одговор је одбачен (нема одговарајућег захтева)"
+
+#: src/dns/gnunet-service-dns.c:792
+msgid "# Client response discarded (no matching request)"
+msgstr "# Одговор клијента је одбачен (нема одговарајућег захтева)"
+
+#: src/dns/gnunet-service-dns.c:907
+msgid "Received malformed IPv4-UDP packet on TUN interface.\n"
+msgstr "Примих лош ИПв4-УДП пакет на ТУН сучељу.\n"
+
+#: src/dns/gnunet-service-dns.c:923
+msgid "Received malformed IPv6-UDP packet on TUN interface.\n"
+msgstr "Примих лош ИПв6-УДП пакет на ТУН сучељу.\n"
+
+#: src/dns/gnunet-service-dns.c:932
+#, c-format
+msgid "Got non-IP packet with %u bytes and protocol %u from TUN\n"
+msgstr "Добих не-ИП пакет са %u бајта и протокол %u са ТУН-а\n"
+
+#: src/dns/gnunet-service-dns.c:942
+msgid "# Non-DNS UDP packet received via TUN interface"
+msgstr "# Не-ДНС УДП пакет је примљен путем ТУН сучеља"
+
+#: src/dns/gnunet-service-dns.c:1009
+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"
+msgstr "„%s“ мора бити инсталиран СУИБ, одбијам да радим\n"
+
+#: src/dns/gnunet-service-dns.c:1069 src/exit/gnunet-daemon-exit.c:3571
+msgid "need a valid IPv4 or IPv6 address\n"
+msgstr "потребна је исправна ИПв4 или ИПв6 адреса\n"
+
+#: src/dv/gnunet-dv.c:169
+msgid "verbose output"
+msgstr "опширан излаз"
+
+#: src/dv/gnunet-dv.c:178
+msgid "Print information about DV state"
+msgstr "Исписује податке о ДВ стању"
+
+#: src/exit/gnunet-daemon-exit.c:802
+#, c-format
+msgid "Got duplicate service records for `%s:%u'\n"
+msgstr "Добих двоструке записе услуге за `%s:%u'\n"
+
+#: src/exit/gnunet-daemon-exit.c:853
+msgid "# Bytes transmitted via mesh channels"
+msgstr "# Бајтови су пренесени путем меш канала"
+
+#: src/exit/gnunet-daemon-exit.c:970 src/exit/gnunet-daemon-exit.c:2397
+#: src/exit/gnunet-daemon-exit.c:2654 src/vpn/gnunet-service-vpn.c:1407
+#: src/vpn/gnunet-service-vpn.c:1797 src/vpn/gnunet-service-vpn.c:1960
+msgid "# ICMPv4 packets dropped (type not allowed)"
+msgstr "# ICMPv4 пакети су одбачени (врста није дозвољена)"
+
+#: src/exit/gnunet-daemon-exit.c:1007 src/exit/gnunet-daemon-exit.c:2456
+#: src/exit/gnunet-daemon-exit.c:2713 src/vpn/gnunet-service-vpn.c:1463
+#: src/vpn/gnunet-service-vpn.c:1856 src/vpn/gnunet-service-vpn.c:1993
+msgid "# ICMPv6 packets dropped (type not allowed)"
+msgstr "# ICMPv6 пакети су одбачени (врста није дозвољена)"
+
+#: src/exit/gnunet-daemon-exit.c:1047
+msgid "# ICMP packets dropped (not allowed)"
+msgstr "# ICMP пакет је одбачен (није дозвољен)"
+
+#: src/exit/gnunet-daemon-exit.c:1054
+msgid "ICMP Packet dropped, have no matching connection information\n"
+msgstr "ICMP Пакет је одбачен, нема одговарајуће податке о вези\n"
+
+#: src/exit/gnunet-daemon-exit.c:1130
+msgid "UDP Packet dropped, have no matching connection information\n"
+msgstr "UDP Пакет је одбачен, нема одговарајуће податке о вези\n"
+
+#: src/exit/gnunet-daemon-exit.c:1204
+msgid "TCP Packet dropped, have no matching connection information\n"
+msgstr "TCP Пакет је одбачен, нема одговарајуће податке о вези\n"
+
+#: src/exit/gnunet-daemon-exit.c:1256
+msgid "# Packets received from TUN"
+msgstr "# Пакети су примљени од TUN-а"
+
+#: src/exit/gnunet-daemon-exit.c:1270
+msgid "# Bytes received from TUN"
+msgstr "# Бајтови су примљени од TUN-а"
+
+#: src/exit/gnunet-daemon-exit.c:1296
+msgid "IPv4 packet options received. Ignored.\n"
+msgstr "Опције IPv4 пакета су примљене. Занемарено.\n"
+
+#: src/exit/gnunet-daemon-exit.c:1323
+#, c-format
+msgid "IPv4 packet with unsupported next header %u received. Ignored.\n"
+msgstr "IPv4 пакет са неподржаним следећим заглављем %u је примљен.
Занемарено.\n"
+
+#: src/exit/gnunet-daemon-exit.c:1369
+#, c-format
+msgid "IPv6 packet with unsupported next header %d received. Ignored.\n"
+msgstr "IPv6 пакет са неподржаним следећим заглављем %d је примљен.
Занемарено.\n"
+
+#: src/exit/gnunet-daemon-exit.c:1377
+#, c-format
+msgid "Packet from unknown protocol %u received. Ignored.\n"
+msgstr "Пакет са непознатог протокола %u је примљен. Занемарено.\n"
+
+#: src/exit/gnunet-daemon-exit.c:1759
+msgid "# TCP packets sent via TUN"
+msgstr "# ТЦП пакети су послати путем ТУН-а"
+
+#: src/exit/gnunet-daemon-exit.c:1872
+msgid "# TCP service creation requests received via mesh"
+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"
+msgstr "# Бајтови су примљени од МЕША"
+
+#: src/exit/gnunet-daemon-exit.c:1909 src/exit/gnunet-daemon-exit.c:2990
+#, c-format
+msgid "No service %s found for %s on port %d!\n"
+msgstr "Ниједна услуга %s није нађена %s на прикључнику %d!\n"
+
+#: src/exit/gnunet-daemon-exit.c:1914
+msgid "# TCP requests dropped (no such service)"
+msgstr "# TCP захтеви су одбачени (нема такве услуге)"
+
+#: src/exit/gnunet-daemon-exit.c:1971
+msgid "# TCP IP-exit creation requests received via mesh"
+msgstr "# Захтеви стварања ТЦП ИП-излаза су примљени путем меша"
+
+#: src/exit/gnunet-daemon-exit.c:2076
+msgid "# TCP data requests received via mesh"
+msgstr "# Захтеви ТЦП података су примљени путем меша"
+
+#: src/exit/gnunet-daemon-exit.c:2090
+msgid "# TCP DATA requests dropped (no session)"
+msgstr "# TCP DATA захтеви су одбачени (нема сесије)"
+
+#: src/exit/gnunet-daemon-exit.c:2150
+msgid "# ICMP packets sent via TUN"
+msgstr "# ICMP пакети су послати путем TUN-а"
+
+#: src/exit/gnunet-daemon-exit.c:2324
+msgid "# ICMP IP-exit requests received via mesh"
+msgstr "# Захтеви ИЦМП ИП-излаза су примљени путем меша"
+
+#: src/exit/gnunet-daemon-exit.c:2573
+msgid "# ICMP service requests received via mesh"
+msgstr "# Захтеви ИЦМП услуге су примљени путем меша"
+
+#: src/exit/gnunet-daemon-exit.c:2639 src/vpn/gnunet-service-vpn.c:1397
+#: src/vpn/gnunet-service-vpn.c:1954
+msgid "# ICMPv4 packets dropped (impossible PT to v6)"
+msgstr "# ICMPv4 пакети су одбачени (немогуће PT за v6)"
+
+#: src/exit/gnunet-daemon-exit.c:2698 src/vpn/gnunet-service-vpn.c:1433
+#: src/vpn/gnunet-service-vpn.c:1445 src/vpn/gnunet-service-vpn.c:1844
+msgid "# ICMPv6 packets dropped (impossible PT to v4)"
+msgstr "# ICMPv6 пакети су одбачени (немогуће PT за v4)"
+
+#: src/exit/gnunet-daemon-exit.c:2748
+msgid "# UDP packets sent via TUN"
+msgstr "# UDP пакети су послати путем TUN-а"
+
+#: src/exit/gnunet-daemon-exit.c:2862
+msgid "# UDP IP-exit requests received via mesh"
+msgstr "# Захтеви УДП ИП-излаза су примљени путем меша"
+
+#: src/exit/gnunet-daemon-exit.c:2969
+msgid "# UDP service requests received via mesh"
+msgstr "# Захтеви УДП услуге су примљени путем меша"
+
+#: src/exit/gnunet-daemon-exit.c:2995
+msgid "# UDP requests dropped (no such service)"
+msgstr "# UDP захтеви су одбачени (нема такве услуге)"
+
+#: src/exit/gnunet-daemon-exit.c:3031
+msgid "# Inbound MESH channels created"
+msgstr "# Долазни МЕШ канали су створени"
+
+#: src/exit/gnunet-daemon-exit.c:3235 src/exit/gnunet-daemon-exit.c:3245
+#, c-format
+msgid "Option `%s' for domain `%s' is not formatted correctly!\n"
+msgstr "Опција „%s“ за домен „%s“ није форматирана исправна!\n"
+
+#: src/exit/gnunet-daemon-exit.c:3259 src/exit/gnunet-daemon-exit.c:3267
+#, c-format
+msgid "`%s' is not a valid port number (for domain `%s')!"
+msgstr "„%s“ није исправан број прикључника (за домен „%s“)!"
+
+#: src/exit/gnunet-daemon-exit.c:3300
+#, c-format
+msgid "No addresses found for hostname `%s' of service `%s'!\n"
+msgstr "Није нађена ниједна адрееса за назив домаћина „%s“ услуге „%s“!\n"
+
+#: src/exit/gnunet-daemon-exit.c:3314 src/exit/gnunet-daemon-exit.c:3326
+#, c-format
+msgid "Service `%s' configured for IPv4, but IPv4 is disabled!\n"
+msgstr "Услуга „%s“ је подешена за IPv4, али IPv4 је искључено!\n"
+
+#: src/exit/gnunet-daemon-exit.c:3337
+#, c-format
+msgid "No IP addresses found for hostname `%s' of service `%s'!\n"
+msgstr "Није нађена ниједна ИП адрееса за назив домаћина „%s“ услуге „%s“!\n"
+
+#: 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"
+msgstr "Овај систем не подржава IPv4, искључиће IPv4 функције упркос томе што
су укључене у подешавањима\n"
+
+#: 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"
+msgstr "Овај систем не подржава IPv6, искључиће IPv6 функције упркос томе што
су укључене у подешавањима\n"
+
+#: src/exit/gnunet-daemon-exit.c:3542
+msgid "Cannot enable IPv4 exit but disable IPv4 on TUN interface, will use
ENABLE_IPv4=YES\n"
+msgstr "Не могу да укључим ИПв4 излаз али искључујем ИПв4 на ТУН сучељу,
користићу „ENABLE_IPv4=ДА“\n"
+
+#: src/exit/gnunet-daemon-exit.c:3548
+msgid "Cannot enable IPv6 exit but disable IPv6 on TUN interface, will use
ENABLE_IPv6=YES\n"
+msgstr "Не могу да укључим ИПв6 излаз али искључујем ИПв6 на ТУН сучељу,
користићу „ENABLE_IPv6=ДА“\n"
+
+#: src/exit/gnunet-daemon-exit.c:3554 src/exit/gnunet-daemon-exit.c:3717
+#: src/pt/gnunet-daemon-pt.c:1247
+msgid "No useful service enabled. Exiting.\n"
+msgstr "Ниједна корисна услуга није укључена. Излазим.\n"
+
+#: src/exit/gnunet-daemon-exit.c:3664
+msgid "Must be a number"
+msgstr "Мора бити број"
+
+#: src/exit/gnunet-daemon-exit.c:3813
+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 "Демон експериментисања се гаси ...\n"
+
+#: src/experimentation/gnunet-daemon-experimentation.c:77
+msgid "Experimentation daemon starting ...\n"
+msgstr "Демон експериментисања се покреће ...\n"
+
+#: src/experimentation/gnunet-daemon-experimentation.c:83
+msgid "Failed to create statistics!\n"
+msgstr "Нисам успео да направим статистику!\n"
+
+#: 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 "Експеримент „%s“: Потпис експеримента је неисправан\n"
+
+#: 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 "Додајем експеримент „%s“ који ради из „%s“ у „%s“ сваке %llu сек. за
%llu сек. \n"
+
+#: src/experimentation/gnunet-daemon-experimentation_experiments.c:303
+#, c-format
+msgid "Experiment `%s': Issuer missing\n"
+msgstr "Експеримент „%s“: Недостаје издавач\n"
+
+#: src/experimentation/gnunet-daemon-experimentation_experiments.c:312
+#, c-format
+msgid "Experiment `%s': Issuer invalid\n"
+msgstr "Експеримент „%s“: Неисправан издавач\n"
+
+#: src/experimentation/gnunet-daemon-experimentation_experiments.c:320
+#, c-format
+msgid "Experiment `%s': Issuer not accepted!\n"
+msgstr "Експеримент „%s“: Издавач није прихваћен!\n"
+
+#: src/experimentation/gnunet-daemon-experimentation_experiments.c:330
+#, c-format
+msgid "Experiment `%s': Version missing or invalid \n"
+msgstr "Експеримент „%s“: Недостаје издање или је неисправно \n"
+
+#: src/experimentation/gnunet-daemon-experimentation_experiments.c:339
+#, c-format
+msgid "Experiment `%s': Required capabilities missing \n"
+msgstr "Експеримент „%s“: Захтеване могућности недостају \n"
+
+#: src/experimentation/gnunet-daemon-experimentation_experiments.c:345
+#, c-format
+msgid "Experiment `%s': Required capabilities invalid \n"
+msgstr "Експеримент „%s“: Захтеване могућности су неисправне \n"
+
+#: src/experimentation/gnunet-daemon-experimentation_experiments.c:390
+#, c-format
+msgid "Failed to parse file `%s'\n"
+msgstr "Нисам успео да обрадим датотеку „%s“\n"
+
+#: 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 "Нису подешени исправни издавачи експеримента! Поставите вредност на
јавне кључеве издавача! Излазим.\n"
+
+#: src/experimentation/gnunet-daemon-experimentation_experiments.c:435
+msgid "Invalid value for public key\n"
+msgstr "Неисправна вредност за јавни кључ\n"
+
+#: src/experimentation/gnunet-daemon-experimentation_experiments.c:473
+#, c-format
+msgid "Cannot read experiments file `%s'\n"
+msgstr "Не могу да прочитам датотеку експеримената „%s“\n"
+
+#: src/experimentation/gnunet-daemon-experimentation_nodes.c:221
+#, c-format
+msgid "Cannot send message to peer `%s' for experiment `%s'\n"
+msgstr "Не могу да пошаљем поруку парњаку „%s“ за екперимент „%s“\n"
+
+#: src/experimentation/gnunet-daemon-experimentation_nodes.c:309
+#, c-format
+msgid "Sending experimentation request to peer %s\n"
+msgstr "Шаљем захтев експериментисања парњаку %s\n"
+
+#: src/experimentation/gnunet-daemon-experimentation_nodes.c:453
+#, c-format
+msgid "Added peer `%s' as active node\n"
+msgstr "Додат је парњак „%s“ као активан чвор\n"
+
+#: src/experimentation/gnunet-daemon-experimentation_nodes.c:891
+#, c-format
+msgid "Connected to peer %s\n"
+msgstr "Повезан са парњаком „%s“\n"
+
+#: src/experimentation/gnunet-daemon-experimentation_nodes.c:921
+#, c-format
+msgid "Disconnected from peer %s\n"
+msgstr "Прекинута је веза са парњаком „%s“\n"
+
+#: src/experimentation/gnunet-daemon-experimentation_nodes.c:1104
+msgid "Failed to connect to CORE service!\n"
+msgstr "Нисам успео да се повежем са ЈЕЗГРЕНОМ услугом!\n"
+
+#: src/experimentation/gnunet-daemon-experimentation_scheduler.c:108
+#, c-format
+msgid "Peer `%s' did not respond to request for experiment `%s'\n"
+msgstr "Парњак „%s“ није одговорио на захтев за експериментом „%s“\n"
+
+#: src/experimentation/gnunet-daemon-experimentation_scheduler.c:143
+#, c-format
+msgid "Starting inbound experiment `%s' with peer `%s'\n"
+msgstr "Покрећем експеримент долазности „%s“ са парњаком „%s“\n"
+
+#: src/experimentation/gnunet-daemon-experimentation_scheduler.c:276
+#, c-format
+msgid "Starting outbound experiment `%s' with peer `%s'\n"
+msgstr "Покрећем експеримент одлазности „%s“ са парњаком „%s“\n"
+
+#: src/experimentation/gnunet-daemon-experimentation_scheduler.c:294
+#, c-format
+msgid "Received %s message from peer %s for experiment `%s'\n"
+msgstr "Примих %s поруку са парњака %s за експеримент „%s“\n"
+
+#: src/fragmentation/defragmentation.c:270
+msgid "# acknowledgements sent for fragment"
+msgstr "# потврде су послате за делић"
+
+#: src/fragmentation/defragmentation.c:456
+msgid "# fragments received"
+msgstr "# делићи су примљени"
+
+#: src/fragmentation/defragmentation.c:521
+msgid "# duplicate fragments received"
+msgstr "# двоструки делићи су примљени"
+
+#: src/fragmentation/defragmentation.c:534
+msgid "# messages defragmented"
+msgstr "# делићи порука су уједињени"
+
+#: src/fragmentation/fragmentation.c:208
+msgid "# fragments transmitted"
+msgstr "# делићи су пренесени"
+
+#: src/fragmentation/fragmentation.c:211
+msgid "# fragments retransmitted"
+msgstr "# делићи су поново пренесени"
+
+#: src/fragmentation/fragmentation.c:237
+msgid "# fragments wrap arounds"
+msgstr "# делићи се преламају около"
+
+#: src/fragmentation/fragmentation.c:281
+msgid "# messages fragmented"
+msgstr "# поруке су расцепкане"
+
+#: src/fragmentation/fragmentation.c:284
+msgid "# total size of fragmented messages"
+msgstr "# укупна величина расцепканих порука"
+
+#: src/fragmentation/fragmentation.c:405
+msgid "# fragment acknowledgements received"
+msgstr "# потврде делића су примљене"
+
+#: src/fragmentation/fragmentation.c:411
+msgid "# bits removed from fragmentation ACKs"
+msgstr "# битови су уклоњени из АЦК-ова расцепканости"
+
+#: src/fragmentation/fragmentation.c:435
+msgid "# fragmentation transmissions completed"
+msgstr "# преноси расцепканости су завршени"
+
+#: src/fs/fs_api.c:465
+#, c-format
+msgid "Could not open file `%s': %s"
+msgstr "Не могу да отворим датотеку „%s“: %s"
+
+#: src/fs/fs_api.c:474
+#, c-format
+msgid "Could not read file `%s': %s"
+msgstr "Не могу да читам датотеку „%s“: %s"
+
+#: src/fs/fs_api.c:480
+#, c-format
+msgid "Short read reading from file `%s'!"
+msgstr "Кратко читање читајући из датотеке „%s“!"
+
+#: src/fs/fs_api.c:1066
+#, c-format
+msgid "Failed to resume publishing information `%s': %s\n"
+msgstr "Нисам успео да наставим са подацима објављивања „%s“: %s\n"
+
+#: src/fs/fs_api.c:1571
+#, c-format
+msgid "Failure while resuming publishing operation `%s': %s\n"
+msgstr "Неуспех приликом настављања са радњом објављивања „%s“: %s\n"
+
+#: src/fs/fs_api.c:1585
+#, c-format
+msgid "Failed to resume publishing operation `%s': %s\n"
+msgstr "Нисам успео да наставим са радњом објављивања „%s“: %s\n"
+
+#: src/fs/fs_api.c:2242
+#, c-format
+msgid "Failure while resuming unindexing operation `%s': %s\n"
+msgstr "Неуспех приликом настављања са радњом поништавања индексирања „%s“:
%s\n"
+
+#: src/fs/fs_api.c:2252
+#, c-format
+msgid "Failed to resume unindexing operation `%s': %s\n"
+msgstr "Нисам успео да наставим са радњом поништавања индексирања „%s“: %s\n"
+
+#: src/fs/fs_api.c:2378 src/fs/fs_api.c:2619
+#, c-format
+msgid "Failed to resume sub-download `%s': %s\n"
+msgstr "Нисам успео да наставим са садржаним преузимањем „%s“: %s\n"
+
+#: src/fs/fs_api.c:2395
+#, c-format
+msgid "Failed to resume sub-search `%s': %s\n"
+msgstr "Нисам успео да наставим са садржаном претрагом „%s“: %s\n"
+
+#: src/fs/fs_api.c:2409 src/fs/fs_api.c:2428 src/fs/fs_api.c:2911
+#, c-format
+msgid "Failure while resuming search operation `%s': %s\n"
+msgstr "Неуспех приликом настављања са радњом претраге „%s“: %s\n"
+
+#: src/fs/fs_api.c:2610
+#, c-format
+msgid "Failed to resume sub-download `%s': could not open file `%s'\n"
+msgstr "Нисам успео да наставим са садржаним преузимањем „%s“: не могу да
отворим датотеку „%s“\n"
+
+#: src/fs/fs_api.c:2855
+msgid "Could not resume running search, will resume as paused search\n"
+msgstr "Не могу да наставим са покренутом претрагом, наставићу као са
паузираном претрагом\n"
+
+#: src/fs/fs_api.c:2949
+#, c-format
+msgid "Failure while resuming download operation `%s': %s\n"
+msgstr "Неуспех приликом настављања са радњом преузимања „%s“: %s\n"
+
+#: src/fs/fs_directory.c:208
+msgid "MAGIC mismatch. This is not a GNUnet directory.\n"
+msgstr "МАГИЈА не одговара. Ово није директоријум ГНУнет-а.\n"
+
+#: src/fs/fs_download.c:322
+msgid "Recursive downloads of directories larger than 4 GB are not supported
on 32-bit systems\n"
+msgstr "Дубинска преузимања директоријума већих од 4 GB нису подржана на
32-битним системима\n"
+
+#: src/fs/fs_download.c:342
+msgid "Directory too large for system address space\n"
+msgstr "Директоријум је превелик за простор адресу система\n"
+
+#: src/fs/fs_download.c:523 src/fs/fs_download.c:535
+#, c-format
+msgid "Failed to open file `%s' for writing"
+msgstr "Нисам успео да отворим датотеку „%s“ за писање"
+
+#: src/fs/fs_download.c:905
+#, c-format
+msgid "Failed to create directory for recursive download of `%s'\n"
+msgstr "Нисам успео да направим директоријум за дубинско преузимање „%s“\n"
+
+#: 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)"
+msgstr "Унутрашња грешка или лажна путања преузимања (очекивах %u бајта на
дубини %u и померају %llu/%llu, добих %u бајта)"
+
+#: src/fs/fs_download.c:1013
+msgid "internal error decrypting content"
+msgstr "унутрашња грешка дешифровања садржаја"
+
+#: src/fs/fs_download.c:1036
+#, c-format
+msgid "Download failed: could not open file `%s': %s"
+msgstr "Преузимање није успело: не могу да отворим датотеку „%s“: %s"
+
+#: src/fs/fs_download.c:1046
+#, c-format
+msgid "Failed to seek to offset %llu in file `%s': %s"
+msgstr "Нисам успео да пређем на померај %llu у датотеци „%s“: %s"
+
+#: src/fs/fs_download.c:1055
+#, c-format
+msgid "Failed to write block of %u bytes at offset %llu in file `%s': %s"
+msgstr "Нисам успео да запишем блок од %u бајта на померају %llu у датотеци
„%s“: %s"
+
+#: src/fs/fs_download.c:1153
+msgid "internal error decoding tree"
+msgstr "унутрашња грешка декодирања стабла"
+
+#: src/fs/fs_download.c:1944
+msgid "Invalid URI"
+msgstr "Неисправан УРИ"
+
+#: src/fs/fs_getopt.c:192
+#, c-format
+msgid "Unknown metadata type in metadata option `%s'. Using metadata type
`unknown' instead.\n"
+msgstr "Непозната врста метаподатака у опцији метаподатака „%s“. Користим
уместо тога користим врсту метаподатака `unknown'.\n"
+
+#: src/fs/fs_list_indexed.c:90
+#, c-format
+msgid "Failed to receive response for `%s' request from `%s' service.\n"
+msgstr "Нисам успео да примим одговор за „%s“ захтев од „%s“ услуге.\n"
+
+#: src/fs/fs_list_indexed.c:113
+#, c-format
+msgid "Failed to receive valid response for `%s' request from `%s' service.\n"
+msgstr "Нисам успео да примим исправан одговор за „%s“ захтев од „%s“
услуге.\n"
+
+#: src/fs/fs_list_indexed.c:151
+#, c-format
+msgid "Failed to not connect to `%s' service.\n"
+msgstr "Нисам успео да се не повежем са „%s“ услугом.\n"
+
+#: src/fs/fs_misc.c:126
+#, c-format
+msgid "Did not find mime type `%s' in extension list.\n"
+msgstr "Нисам успео да нађем миме врсту „%s“ на списку проширења.\n"
+
+#: src/fs/fs_namespace.c:207
+#, c-format
+msgid "Failed to open `%s' for writing: %s\n"
+msgstr "Нисам успео да отворим „%s“ ради уписа: %s\n"
+
+#: src/fs/fs_namespace.c:229
+#, c-format
+msgid "Failed to write `%s': %s\n"
+msgstr "Нисам успео да пишем „%s“: %s\n"
+
+#: src/fs/fs_namespace.c:320
+#, c-format
+msgid "Failed to read `%s': %s\n"
+msgstr "Нисам успео да прочитам „%s“: %s\n"
+
+#: src/fs/fs_namespace.c:466
+msgid "Failed to connect to datastore."
+msgstr "Нисам успео да се повежем са смештајем података."
+
+#: src/fs/fs_publish.c:125 src/fs/fs_publish.c:415
+#, c-format
+msgid "Publishing failed: %s"
+msgstr "Објављивање није успело: %s"
+
+#: 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
+#, c-format
+msgid "Can not index file `%s': %s. Will try to insert instead.\n"
+msgstr "Не могу да индексирам датотеку „%s“: %s. Покушаћу да је уметнем.\n"
+
+#: src/fs/fs_publish.c:669
+msgid "timeout on index-start request to `fs' service"
+msgstr "истекло је време на захтев почетка индекса за „fs“ услугу"
+
+#: src/fs/fs_publish.c:681
+msgid "unknown error"
+msgstr "непозната грешка"
+
+#: src/fs/fs_publish.c:725
+msgid "failed to compute hash"
+msgstr "нисам успео да прорачунам хеш"
+
+#: src/fs/fs_publish.c:745
+msgid "filename too long"
+msgstr "назив датотеке је предуг"
+
+#: src/fs/fs_publish.c:770
+msgid "could not connect to `fs' service"
+msgstr "не могу да се повежем са „fs“ услугом"
+
+#: src/fs/fs_publish.c:793
+#, c-format
+msgid "Failed to get file identifiers for `%s'\n"
+msgstr "Нисам успео да добавим одреднике датотеке за „%s“\n"
+
+#: src/fs/fs_publish.c:862
+#, c-format
+msgid "Recursive upload failed at `%s': %s"
+msgstr "Дубински утовар није успео на „%s“: %s"
+
+#: src/fs/fs_publish.c:868
+#, c-format
+msgid "Recursive upload failed: %s"
+msgstr "Дубински утовар није успео: %s"
+
+#: src/fs/fs_publish.c:915
+msgid "needs to be an actual file"
+msgstr "треба да буде актуелна датотека"
+
+#: src/fs/fs_publish.c:1151
+#, c-format
+msgid "Insufficient space for publishing: %s"
+msgstr "Недовољно простора за објављивање: %s"
+
+#: src/fs/fs_publish.c:1243
+#, c-format
+msgid "Reserving space for %u entries and %llu bytes for publication\n"
+msgstr "Резервишем простор за %u уноса и %llu бајта за објављивање\n"
+
+#: src/fs/fs_publish_ksk.c:219
+msgid "Could not connect to datastore."
+msgstr "Не могу да се повежем са смештајем података."
+
+#: src/fs/fs_publish_ublock.c:219
+msgid "Internal error."
+msgstr "Унутрашња грешка."
+
+#: src/fs/fs_search.c:813
+#, c-format
+msgid "Failed to parse URI `%s': %s\n"
+msgstr "Нисам успео да обрадим УРИ „%s“: %s\n"
+
+#: src/fs/fs_search.c:872
+#, c-format
+msgid "Got result with unknown block type `%d', ignoring"
+msgstr "Добих резултат са непознатом врстом блока „%d“, занемарујем"
+
+#: src/fs/fs_unindex.c:59
+msgid "Failed to find given position in file"
+msgstr "Нисам успео да нађем дати положај у датотеци"
+
+#: src/fs/fs_unindex.c:64
+msgid "Failed to read file"
+msgstr "Нисам успео да прочитам датотеку"
+
+#: src/fs/fs_unindex.c:234
+msgid "Unexpected time for a response from `fs' service."
+msgstr "Неочекивано време за одговор са „fs“ услуге."
+
+#: src/fs/fs_unindex.c:242
+msgid "Timeout waiting for `fs' service."
+msgstr "Истекло је време чекања на „fs“ услугу."
+
+#: src/fs/fs_unindex.c:250
+msgid "Invalid response from `fs' service."
+msgstr "Неисправан одговор са „fs“ услуге."
+
+#: src/fs/fs_unindex.c:291
+msgid "Failed to connect to FS service for unindexing."
+msgstr "Нисам успео да се повежем на ФС услугу зарад поништавања индексирања."
+
+#: src/fs/fs_unindex.c:347 src/fs/fs_unindex.c:359
+msgid "Failed to get KSKs from directory scan."
+msgstr "Нисам успео да добавим KSKs из скенирања директоријума."
+
+#: src/fs/fs_unindex.c:355
+#, c-format
+msgid "Internal error scanning `%s'.\n"
+msgstr "Унутрашња грешка скенирања „%s“.\n"
+
+#: src/fs/fs_unindex.c:414
+#, c-format
+msgid "Failed to remove UBlock: %s\n"
+msgstr "Нисам успео да уклоним „UBlock“: %s\n"
+
+#: src/fs/fs_unindex.c:562 src/fs/fs_unindex.c:626
+msgid "Failed to connect to `datastore' service."
+msgstr "Нисам успео да се повежем са „datastore“ услугом."
+
+#: src/fs/fs_unindex.c:639
+msgid "Failed to open file for unindexing."
+msgstr "Нисам успео да отворим датотеку за поништавање индексирања."
+
+#: src/fs/fs_unindex.c:673
+msgid "Failed to compute hash of file."
+msgstr "Нисам успео да израчунам хеш датотеке."
+
+#: src/fs/fs_uri.c:222
+#, no-c-format
+msgid "`%' must be followed by HEX number"
+msgstr "„%“ мора бити праћено HEX бројем"
+
+#: src/fs/fs_uri.c:281
+msgid "Malformed KSK URI (must not begin or end with `+')"
+msgstr "Лоша KSK УРИ (не сме почињати или завршавати се са знаком +)"
+
+#: src/fs/fs_uri.c:299
+msgid "`++' not allowed in KSK URI"
+msgstr "++ није дозвољено у KSK УРИ-ју"
+
+#: src/fs/fs_uri.c:306
+msgid "Quotes not balanced in KSK URI"
+msgstr "Квоте нису уравнотежене у КСК путањи"
+
+#: src/fs/fs_uri.c:376
+msgid "Malformed SKS URI"
+msgstr "Лоша SKS УРИ"
+
+#: src/fs/fs_uri.c:419 src/fs/fs_uri.c:434
+msgid "Malformed CHK URI"
+msgstr "Лоша CHK УРИ"
+
+#: src/fs/fs_uri.c:512 src/fs/fs_uri.c:580
+msgid "SKS URI malformed"
+msgstr "SKS УРИ је лоше"
+
+#: src/fs/fs_uri.c:527 src/fs/fs_uri.c:537
+msgid "LOC URI malformed"
+msgstr "LOC УРИ је лоше"
+
+#: src/fs/fs_uri.c:545 src/fs/fs_uri.c:553
+msgid "LOC URI malformed (could not decode public key)"
+msgstr "LOC УРИ је лоше (не могу да декодирам јавни кључ)"
+
+#: src/fs/fs_uri.c:559
+msgid "SKS URI malformed (could not find signature)"
+msgstr "SKS УРИ је лоше (не могу да нашем потпис)"
+
+#: src/fs/fs_uri.c:565 src/fs/fs_uri.c:574
+msgid "SKS URI malformed (could not decode signature)"
+msgstr "SKS УРИ је лоше (не могу да декодирам потпис)"
+
+#: src/fs/fs_uri.c:586
+msgid "SKS URI malformed (could not parse expiration time)"
+msgstr "SKS УРИ је лоше (не могу да обрадим време истека)"
+
+#: src/fs/fs_uri.c:598
+msgid "SKS URI malformed (signature failed validation)"
+msgstr "SKS УРИ је лоше (потврђивање потписа није успело)"
+
+#: src/fs/fs_uri.c:636
+msgid "Unrecognized URI type"
+msgstr "Непозната УРИ врста"
+
+#: src/fs/fs_uri.c:860
+msgid "Lacking key configuration settings.\n"
+msgstr "Недостају поставке подешавања кључа.\n"
+
+#: src/fs/fs_uri.c:866
+#, c-format
+msgid "Could not access hostkey file `%s'.\n"
+msgstr "Не могу да приступим датотеци кључа домаћина „%s“.\n"
+
+#: src/fs/fs_uri.c:1050 src/fs/fs_uri.c:1077
+msgid "No keywords specified!\n"
+msgstr "Нису наведене речи кључа!\n"
+
+#: src/fs/fs_uri.c:1083
+msgid "Number of double-quotes not balanced!\n"
+msgstr "Број двоструких квота које нису уравнотежене!\n"
+
+#: src/fs/gnunet-auto-share.c:236
+#, c-format
+msgid "Failed to load state: %s\n"
+msgstr "Нисам успео да учитам стање: %s\n"
+
+#: src/fs/gnunet-auto-share.c:289 src/fs/gnunet-auto-share.c:299
+#: src/fs/gnunet-auto-share.c:309
+#, c-format
+msgid "Failed to save state to file %s\n"
+msgstr "Нисам успео да сачувам стање у датотеку „%s“\n"
+
+#: src/fs/gnunet-auto-share.c:401
+#, c-format
+msgid "Publication of `%s' done\n"
+msgstr "Објављивање „%s“ је готово\n"
+
+#: src/fs/gnunet-auto-share.c:488
+#, c-format
+msgid "Publishing `%s'\n"
+msgstr "Објављујем „%s“\n"
+
+#: src/fs/gnunet-auto-share.c:497
+#, c-format
+msgid "Failed to run `%s'\n"
+msgstr "Нисам успео да покренем „%s“\n"
+
+#: src/fs/gnunet-auto-share.c:686
+#, c-format
+msgid "You must specify one and only one directory name for automatic
publication.\n"
+msgstr "Морате навести један и само један назив директоријума за самостално
објављивање.\n"
+
+#: src/fs/gnunet-auto-share.c:737 src/fs/gnunet-publish.c:824
+msgid "set the desired LEVEL of sender-anonymity"
+msgstr "поставља жељени НИВО анонимности пошиљаоца"
+
+#: src/fs/gnunet-auto-share.c:741 src/fs/gnunet-publish.c:828
+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
+msgid "do not use libextractor to add keywords or metadata"
+msgstr "не користи „libextractor“ за додавање кључних речи или метаподатака"
+
+#: src/fs/gnunet-auto-share.c:747 src/fs/gnunet-publish.c:855
+msgid "specify the priority of the content"
+msgstr "наводи приоритет садржаја"
+
+#: src/fs/gnunet-auto-share.c:750 src/fs/gnunet-publish.c:862
+msgid "set the desired replication LEVEL"
+msgstr "поставља жељени НИВО одоговарања"
+
+#: src/fs/gnunet-auto-share.c:770
+msgid "Automatically publish files from a directory on GNUnet"
+msgstr "Самостално објављује датотеке из директоријума на ГНУнет-у"
+
+#: src/fs/gnunet-daemon-fsprofiler.c:660
+msgid "Daemon to use file-sharing to measure its performance."
+msgstr "Демон за коришћење дељења датотеке за мерење њене учинковитости."
+
+#: src/fs/gnunet-directory.c:49
+#, c-format
+msgid "\t<original file embedded in %u bytes of meta data>\n"
+msgstr "\t<изворна датотека угнеждена у %u бајта метаподатака>\n"
+
+#: src/fs/gnunet-directory.c:94
+#, c-format
+msgid "Directory `%s' meta data:\n"
+msgstr "Метаподаци директоријума „%s“:\n"
+
+#: src/fs/gnunet-directory.c:97
+#, c-format
+msgid "Directory `%s' contents:\n"
+msgstr "Садржај директоријума „%s“:\n"
+
+#: src/fs/gnunet-directory.c:132
+msgid "You must specify a filename to inspect.\n"
+msgstr "Морате навести назив датотеке за преглед.\n"
+
+#: src/fs/gnunet-directory.c:145
+#, c-format
+msgid "Failed to read directory `%s'\n"
+msgstr "Нисам успео да прочитам директоријум „%s“\n"
+
+#: src/fs/gnunet-directory.c:154
+#, c-format
+msgid "`%s' is not a GNUnet directory\n"
+msgstr "„%s“ није ГНУнет директоријум\n"
+
+#: src/fs/gnunet-directory.c:183
+msgid "Display contents of a GNUnet directory"
+msgstr "Приказује садржај ГНУнет директоријума"
+
+#: src/fs/gnunet-download.c:137
+#, c-format
+msgid "Starting download `%s'.\n"
+msgstr "Покрећем преузимање „%s“.\n"
+
+#: src/fs/gnunet-download.c:147
+msgid "<unknown time>"
+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"
+msgstr "Преузимам „%s“ при %llu/%llu (преостаје %s, %s/сек). Блоку је требало
%s за преузимање\n"
+
+#: src/fs/gnunet-download.c:179
+#, c-format
+msgid "Error downloading: %s.\n"
+msgstr "Грешка преузимања: %s.\n"
+
+#: src/fs/gnunet-download.c:194
+#, c-format
+msgid "Downloading `%s' done (%s/s).\n"
+msgstr "Преузимање „%s“ је готово (%s/сек).\n"
+
+#: src/fs/gnunet-download.c:209 src/fs/gnunet-publish.c:286
+#: src/fs/gnunet-search.c:200 src/fs/gnunet-unindex.c:108
+#, c-format
+msgid "Unexpected status: %d\n"
+msgstr "Неочекивано стање: %d\n"
+
+#: src/fs/gnunet-download.c:234
+msgid "You need to specify a URI argument.\n"
+msgstr "Треба да наведете УРИ аргумент.\n"
+
+#: src/fs/gnunet-download.c:240 src/fs/gnunet-publish.c:665
+#, c-format
+msgid "Failed to parse URI: %s\n"
+msgstr "Нисам успео да обрадим УРИ: %s\n"
+
+#: src/fs/gnunet-download.c:247
+msgid "Only CHK or LOC URIs supported.\n"
+msgstr "Подржани су само CHK или LOC УРИ.\n"
+
+#: src/fs/gnunet-download.c:254
+msgid "Target filename must be specified.\n"
+msgstr "Назив циљне датотеке мора бити наведен.\n"
+
+#: src/fs/gnunet-download.c:268 src/fs/gnunet-publish.c:797
+#: src/fs/gnunet-search.c:250 src/fs/gnunet-unindex.c:140
+#, c-format
+msgid "Could not initialize `%s' subsystem.\n"
+msgstr "Не могу да покренем „%s“ субсистем.\n"
+
+#: src/fs/gnunet-download.c:305 src/fs/gnunet-search.c:289
+msgid "set the desired LEVEL of receiver-anonymity"
+msgstr "поставља жељени НИВО анонимности примаоца"
+
+#: src/fs/gnunet-download.c:308
+msgid "delete incomplete downloads (when aborted with CTRL-C)"
+msgstr "брише недовршена преузимања (када се прекине са КТРЛ-Ц)"
+
+#: src/fs/gnunet-download.c:311 src/fs/gnunet-search.c:292
+msgid "only search the local peer (no P2P network search)"
+msgstr "тражи само локалног парњака (без претраге П2П мреже)"
+
+#: src/fs/gnunet-download.c:314
+msgid "write the file to FILENAME"
+msgstr "уписује датотеку у НАЗИВ_ДАТОТЕКЕ"
+
+#: src/fs/gnunet-download.c:318
+msgid "set the maximum number of parallel downloads that is allowed"
+msgstr "поставља највећи број паралелних преузимања који је дозвољен"
+
+#: src/fs/gnunet-download.c:322
+msgid "set the maximum number of parallel requests for blocks that is allowed"
+msgstr "поставља највећи број паралелних захтева за блокове који је дозвољен"
+
+#: src/fs/gnunet-download.c:325
+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/...)"
+msgstr "Преузима датотеке са ГНУнет-а користећи ГНУнет CHK или LOC УРИ
(gnunet://fs/chk/...)"
+
+#: src/fs/gnunet-fs.c:117
+msgid "print a list of all indexed files"
+msgstr "исписује списак свих индексираних датотека"
+
+#: src/fs/gnunet-fs.c:127
+msgid "Special file-sharing operations"
+msgstr "Посебне радње дељења датотека"
+
+#: src/fs/gnunet-fs-profiler.c:193
+msgid "run the experiment with COUNT peers"
+msgstr "одрађује експеримент са БРОЈ парњака"
+
+#: src/fs/gnunet-fs-profiler.c:196
+msgid "specifies name of a file with the HOSTS the testbed should use"
+msgstr "наводи назив датотеке са ДОМАЋИНИМА коју пробно место треба да користи"
+
+#: src/fs/gnunet-fs-profiler.c:199
+msgid "automatically terminate experiment after DELAY"
+msgstr "самостално окончава експеримент након ЗАСТОЈА"
+
+#: src/fs/gnunet-fs-profiler.c:208
+msgid "run a testbed to measure file-sharing performance"
+msgstr "покреће пробно место за мерење учинковитости дељења датотека"
+
+#: src/fs/gnunet-publish.c:231 src/fs/gnunet-publish.c:243
+#, c-format
+msgid "Publishing `%s' at %llu/%llu (%s remaining)\n"
+msgstr "Објављујем „%s“ при %llu/%llu (преостаје %s)\n"
+
+#: src/fs/gnunet-publish.c:250
+#, c-format
+msgid "Error publishing: %s.\n"
+msgstr "Грешка објављивања: %s.\n"
+
+#: src/fs/gnunet-publish.c:260
+#, c-format
+msgid "Publishing `%s' done.\n"
+msgstr "Објављивање „%s“ је готово.\n"
+
+#: src/fs/gnunet-publish.c:264
+#, c-format
+msgid "URI is `%s'.\n"
+msgstr "УРИ је „%s“.\n"
+
+#: src/fs/gnunet-publish.c:283
+msgid "Cleanup after abort complete.\n"
+msgstr "Чисти након обављеног прекидања.\n"
+
+#: src/fs/gnunet-publish.c:401
+#, c-format
+msgid "Meta data for file `%s' (%s)\n"
+msgstr "Мета подаци за датотеку „%s“ (%s)\n"
+
+#: src/fs/gnunet-publish.c:403
+#, c-format
+msgid "Keywords for file `%s' (%s)\n"
+msgstr "Кључне речи за датотеку „%s“ (%s)\n"
+
+#: src/fs/gnunet-publish.c:542
+msgid "Could not publish\n"
+msgstr "Не могу да објавим\n"
+
+#: src/fs/gnunet-publish.c:565
+msgid "Could not start publishing.\n"
+msgstr "Не могу да покренем објављивање.\n"
+
+#: src/fs/gnunet-publish.c:598
+#, c-format
+msgid "Scanning directory `%s'.\n"
+msgstr "Скенирам директоријум „%s“.\n"
+
+#: src/fs/gnunet-publish.c:600
+#, c-format
+msgid "Scanning file `%s'.\n"
+msgstr "Скенирам датотеку „%s“.\n"
+
+#: src/fs/gnunet-publish.c:605
+#, c-format
+msgid "There was trouble processing file `%s', skipping it.\n"
+msgstr "Било је проблема обраде датотеке „%s“, прескачем је.\n"
+
+#: src/fs/gnunet-publish.c:610
+msgid "Preprocessing complete.\n"
+msgstr "Предодбрада је завршена.\n"
+
+#: src/fs/gnunet-publish.c:614
+#, c-format
+msgid "Extracting meta data from file `%s' complete.\n"
+msgstr "Извлачење мета података из датотеке „%s“ је завршено.\n"
+
+#: src/fs/gnunet-publish.c:618
+msgid "Meta data extraction has finished.\n"
+msgstr "Извлачење мета података је завршено.\n"
+
+#: src/fs/gnunet-publish.c:625
+msgid "Internal error scanning directory.\n"
+msgstr "Унутрашња грешка скенирања директоријума.\n"
+
+#: src/fs/gnunet-publish.c:656
+#, c-format
+msgid "Selected pseudonym `%s' unknown\n"
+msgstr "Изабрани псеудоним „%s“ је непознат\n"
+
+#: src/fs/gnunet-publish.c:682
+#, c-format
+msgid "Failed to access `%s': %s\n"
+msgstr "Нисам успео да приступим „%s“: %s\n"
+
+#: src/fs/gnunet-publish.c:695
+msgid "Failed to start meta directory scanner. Is gnunet-helper-publish-fs
installed?\n"
+msgstr "Нисам успео да покренем скенер мета директоријума. Да ли је
инсталиран „gnunet-helper-publish-fs“?\n"
+
+#: src/fs/gnunet-publish.c:747
+#, c-format
+msgid "Cannot extract metadata from a URI!\n"
+msgstr "Не могу да извучем метаподатке из УРИ-ја!\n"
+
+#: src/fs/gnunet-publish.c:754
+#, c-format
+msgid "You must specify one and only one filename for insertion.\n"
+msgstr "Морате навести један и само један назив датотеке за уметање.\n"
+
+#: src/fs/gnunet-publish.c:760
+#, c-format
+msgid "You must NOT specify an URI and a filename.\n"
+msgstr "НЕ можете навести УРИ и назив датотеке.\n"
+
+#: src/fs/gnunet-publish.c:768 src/vpn/gnunet-vpn.c:209
+#, c-format
+msgid "Option `%s' is required when using option `%s'.\n"
+msgstr "Опција „%s“ се захтева приликом коришћења опције „%s“.\n"
+
+#: 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
+#, c-format
+msgid "Option `%s' makes no sense without option `%s'.\n"
+msgstr "Опција „%s“ нема смисла без опције „%s“.\n"
+
+#: src/fs/gnunet-publish.c:835
+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)"
+msgstr "додаје додатну кључну реч за датотеку највишег нивоа или директоријум
(ова опција се може навести више пута)"
+
+#: src/fs/gnunet-publish.c:843
+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)"
+msgstr "не индексира, обавља пуно уметање (смешта читаву датотеку у шифрованом
облику у ГНУнет базу података)"
+
+#: src/fs/gnunet-publish.c:851
+msgid "specify ID of an updated version to be published in the future (for
namespace insertions only)"
+msgstr "наводи ИБ ажурираног издања које ће бити објављено у будућности (само
за уметања називног простора)"
+
+#: src/fs/gnunet-publish.c:859
+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)"
+msgstr "само опонаша процес али не чини никакво актуелно објављивање (корисно
за прорачун УРИ-ја)"
+
+#: src/fs/gnunet-publish.c:869
+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)"
+msgstr "УРИ који ће бити објављен (може се користити уместо прослеђивања
датотеке за додавање кључних речи датотеци са одговарајућим УРИ-јем)"
+
+#: src/fs/gnunet-publish.c:889
+msgid "Publish a file or directory on GNUnet"
+msgstr "Објављује датотеку или директоријум на ГНУнет-у"
+
+#: src/fs/gnunet-search.c:114
+#, c-format
+msgid "Failed to write directory with search results to `%s'\n"
+msgstr "Нисам успео да пишем директоријум са резултатима претраге за „%s“\n"
+
+#: src/fs/gnunet-search.c:191
+#, c-format
+msgid "Error searching: %s.\n"
+msgstr "Грешка претраге: %s.\n"
+
+#: src/fs/gnunet-search.c:240
+msgid "Could not create keyword URI from arguments.\n"
+msgstr "Не могу да створим УРИ кључне речи из аргумената.\n"
+
+#: src/fs/gnunet-search.c:264
+msgid "Could not start searching.\n"
+msgstr "Не могу да покренем претрагу.\n"
+
+#: src/fs/gnunet-search.c:295
+msgid "write search results to file starting with PREFIX"
+msgstr "пише резултате претраге у датотеку која почиње са ПРЕФИКСОМ"
+
+#: src/fs/gnunet-search.c:298
+msgid "automatically terminate search after DELAY"
+msgstr "самостално окончава претрагу након ЗАСТОЈА"
+
+#: src/fs/gnunet-search.c:305
+msgid "automatically terminate search after VALUE results are found"
+msgstr "самостално окончава претрагу након што су пронађени резултати ВРЕДНОСТ"
+
+#: src/fs/gnunet-search.c:316
+msgid "Search GNUnet for files that were published on GNUnet"
+msgstr "Претражује ГНУнет за датотекама које су објављене на ГНУнет-у"
+
+#: src/fs/gnunet-service-fs.c:271
+msgid "# running average P2P latency (ms)"
+msgstr "# радно просечно П2П кашњење (ms)"
+
+#: src/fs/gnunet-service-fs.c:326 src/fs/gnunet-service-fs.c:539
+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
+#, c-format
+msgid "Failed to connect to `%s' service.\n"
+msgstr "Нисам успео да се повежем са „%s“ услугом.\n"
+
+#: src/fs/gnunet-service-fs_cp.c:682
+msgid "# migration stop messages received"
+msgstr "# поруке заустављања миграције су примљене"
+
+#: src/fs/gnunet-service-fs_cp.c:686
+#, c-format
+msgid "Migration of content to peer `%s' blocked for %s\n"
+msgstr "Премештање садржаја за парњака „%s“ је блокирано за %s\n"
+
+#: src/fs/gnunet-service-fs_cp.c:721
+msgid "# replies transmitted to other peers"
+msgstr "# одговори су пренесени другим парњацима"
+
+#: src/fs/gnunet-service-fs_cp.c:727
+msgid "# replies dropped"
+msgstr "# одговори су одбачени"
+
+#: src/fs/gnunet-service-fs_cp.c:752 src/fs/gnunet-service-fs_cp.c:1301
+msgid "# P2P searches active"
+msgstr "# П2П претраге су активне"
+
+#: src/fs/gnunet-service-fs_cp.c:845
+msgid "# artificial delays introduced (ms)"
+msgstr "# вештачка кашњења су уведена (ms)"
+
+#: src/fs/gnunet-service-fs_cp.c:898
+msgid "# replies dropped due to type mismatch"
+msgstr "# одговори су одбачени услед непоклапања врсте"
+
+#: src/fs/gnunet-service-fs_cp.c:906
+msgid "# replies received for other peers"
+msgstr "# одговори су примљени за друге парњаке"
+
+#: src/fs/gnunet-service-fs_cp.c:920
+msgid "# replies dropped due to insufficient cover traffic"
+msgstr "# одговори су одбачени услед недовољног покривног саобраћаја"
+
+#: src/fs/gnunet-service-fs_cp.c:958
+msgid "# P2P searches destroyed due to ultimate reply"
+msgstr "# П2П претраге су уништене због крајњег одговора"
+
+#: src/fs/gnunet-service-fs_cp.c:1026
+msgid "# requests done for free (low load)"
+msgstr "# захтева је готово за џабе (слабо учитавање)"
+
+#: src/fs/gnunet-service-fs_cp.c:1051
+msgid "# request dropped, priority insufficient"
+msgstr "# захтева је одбачено, недовољно хитности"
+
+#: src/fs/gnunet-service-fs_cp.c:1061
+msgid "# requests done for a price (normal load)"
+msgstr "# захтева је готово за цену (нормално учитавање)"
+
+#: src/fs/gnunet-service-fs_cp.c:1139
+msgid "# GET requests received (from other peers)"
+msgstr "# „GET“ захтеви су примљени (од других парњака)"
+
+#: src/fs/gnunet-service-fs_cp.c:1173
+msgid "# requests dropped due to initiator not being connected"
+msgstr "# захтеви су одбачени јер покретач није повезан"
+
+#: src/fs/gnunet-service-fs_cp.c:1195
+msgid "# requests dropped due to missing reverse route"
+msgstr "# захтеви су одбачени јер недостаје повратна рута"
+
+#: src/fs/gnunet-service-fs_cp.c:1246
+msgid "# requests dropped due TTL underflow"
+msgstr "# захтеви су одбачени услед ниског ТТЛ тока"
+
+#: src/fs/gnunet-service-fs_cp.c:1270
+msgid "# requests dropped due to higher-TTL request"
+msgstr "# захтеви су одбачени услед вишег-ТТЛ захтева"
+
+#: src/fs/gnunet-service-fs_cp.c:1299
+msgid "# P2P query messages received and processed"
+msgstr "# поруке П2П упита су примљене и обрађене"
+
+#: src/fs/gnunet-service-fs_cp.c:1670
+msgid "# migration stop messages sent"
+msgstr "# поруке зауставља миграције су послате"
+
+#: src/fs/gnunet-service-fs_indexing.c:130
+#: src/fs/gnunet-service-fs_indexing.c:181
+#, c-format
+msgid "Could not open `%s'.\n"
+msgstr "Не могу да отворим „%s“.\n"
+
+#: src/fs/gnunet-service-fs_indexing.c:142
+#, c-format
+msgid "Error writing `%s'.\n"
+msgstr "Грешка писања „%s“.\n"
+
+#: 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"
+msgstr "Примљени захтев индексирања за датотеку „%s“ је већ индексиран „%s“.
Ипак одобравам.\n"
+
+#: src/fs/gnunet-service-fs_indexing.c:275
+#, c-format
+msgid "Hash mismatch trying to index file `%s' which has hash `%s'\n"
+msgstr "Неодговарајући хеш приликом покушаја индексирања датотеке „%s“ која
има хеш „%s“\n"
+
+#: src/fs/gnunet-service-fs_indexing.c:477
+#, c-format
+msgid "Failed to delete bogus block: %s\n"
+msgstr "Нисам успео да обришем лажни блок: %s\n"
+
+#: src/fs/gnunet-service-fs_indexing.c:542
+msgid "# index blocks removed: original file inaccessible"
+msgstr "# блокови индекси су уклоњени: изворна датотека је неприступачна"
+
+#: src/fs/gnunet-service-fs_indexing.c:557
+#, c-format
+msgid "Could not access indexed file `%s' (%s) at offset %llu: %s\n"
+msgstr "Не могу да приступим индексираној датотеци „%s“ (%s) на померају %llu:
%s\n"
+
+#: src/fs/gnunet-service-fs_indexing.c:559
+msgid "not indexed"
+msgstr "није индексирано"
+
+#: src/fs/gnunet-service-fs_indexing.c:574
+#, c-format
+msgid "Indexed file `%s' changed at offset %llu\n"
+msgstr "Индексирана датотека „%s“ је измењена на померају %llu\n"
+
+#: src/fs/gnunet-service-fs_lc.c:202 src/fs/gnunet-service-fs_lc.c:368
+msgid "# client searches active"
+msgstr "# претраге клијента су активне"
+
+#: src/fs/gnunet-service-fs_lc.c:256
+msgid "# replies received for local clients"
+msgstr "# одговори су примљени за локалне клијенте"
+
+#: src/fs/gnunet-service-fs_lc.c:327
+msgid "# client searches received"
+msgstr "# претраге клијента су примљене"
+
+#: src/fs/gnunet-service-fs_lc.c:362
+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 "# просечан застој поновног преноса (ms)"
+
+#: src/fs/gnunet-service-fs_pe.c:400
+msgid "# transmission failed (core has no bandwidth)"
+msgstr "# пренос није успео (језгро нема пропусни опсег)"
+
+#: src/fs/gnunet-service-fs_pe.c:433
+msgid "# query messages sent to other peers"
+msgstr "# поруке упита су послате другим парњацима"
+
+#: src/fs/gnunet-service-fs_pe.c:484
+msgid "# delay heap timeout (ms)"
+msgstr "# истекло је време застоја скупине (ms)"
+
+#: src/fs/gnunet-service-fs_pe.c:492
+msgid "# query plans executed"
+msgstr "# план упита је извршен"
+
+#: src/fs/gnunet-service-fs_pe.c:552
+msgid "# requests merged"
+msgstr "# захтеви су стопљени"
+
+#: src/fs/gnunet-service-fs_pe.c:560
+msgid "# requests refreshed"
+msgstr "# захтеви су освежени"
+
+#: src/fs/gnunet-service-fs_pe.c:616 src/fs/gnunet-service-fs_pe.c:700
+#: src/fs/gnunet-service-fs_pe.c:771
+msgid "# query plan entries"
+msgstr "# пропитује обичне уносе"
+
+#: src/fs/gnunet-service-fs_pr.c:311
+msgid "# Pending requests created"
+msgstr "# Захтеви на чекању су створени"
+
+#: src/fs/gnunet-service-fs_pr.c:394 src/fs/gnunet-service-fs_pr.c:645
+msgid "# Pending requests active"
+msgstr "# Захтеви на чекању су активни"
+
+#: src/fs/gnunet-service-fs_pr.c:814
+msgid "# replies received and matched"
+msgstr "# одговори су примљени и подударени"
+
+#: src/fs/gnunet-service-fs_pr.c:844
+msgid "# duplicate replies discarded (bloomfilter)"
+msgstr "# двоструки одговори су одбачени (bloomfilter)"
+
+#: src/fs/gnunet-service-fs_pr.c:853
+msgid "# irrelevant replies discarded"
+msgstr "# небитни одговори су одбачени"
+
+#: src/fs/gnunet-service-fs_pr.c:867
+#, c-format
+msgid "Unsupported block type %u\n"
+msgstr "Неподржана врста блока %u\n"
+
+#: src/fs/gnunet-service-fs_pr.c:880
+msgid "# results found locally"
+msgstr "# резултати су пронађени локално"
+
+#: src/fs/gnunet-service-fs_pr.c:1001
+msgid "# Datastore `PUT' failures"
+msgstr "# Неуспеси „СТАВИ“ смештаја података"
+
+#: src/fs/gnunet-service-fs_pr.c:1029
+msgid "# storage requests dropped due to high load"
+msgstr "# захтеви смештаја су одбачени услед високог утовара"
+
+#: src/fs/gnunet-service-fs_pr.c:1064
+msgid "# Replies received from DHT"
+msgstr "# Одговори су примљени од DHT-а"
+
+#: src/fs/gnunet-service-fs_pr.c:1192
+msgid "# Replies received from MESH"
+msgstr "# Одговори су примљени од MESH-а"
+
+#: src/fs/gnunet-service-fs_pr.c:1244
+#, c-format
+msgid "Datastore lookup already took %s!\n"
+msgstr "Претрага смештаја података је већ узела „%s“!\n"
+
+#: src/fs/gnunet-service-fs_pr.c:1264
+#, c-format
+msgid "On-demand lookup already took %s!\n"
+msgstr "Претрага на-захтев је већ узела „%s“!\n"
+
+#: src/fs/gnunet-service-fs_pr.c:1311
+msgid "# Datastore lookups concluded (no results)"
+msgstr "# Претраге смештаја података су закључене (нема резултата)"
+
+#: src/fs/gnunet-service-fs_pr.c:1326
+msgid "# Datastore lookups concluded (seen all)"
+msgstr "# Претраге смештаја података су закључене (видех све)"
+
+#: src/fs/gnunet-service-fs_pr.c:1335
+msgid "# Datastore lookups aborted (more than MAX_RESULTS)"
+msgstr "# Претраге смештаја података су прекинуте (више од „MAX_RESULTS“)"
+
+#: src/fs/gnunet-service-fs_pr.c:1350
+msgid "# requested DBLOCK or IBLOCK not found"
+msgstr "# захтевани DBLOCK или IBLOCK нису нађени"
+
+#: src/fs/gnunet-service-fs_pr.c:1364
+msgid "# on-demand blocks matched requests"
+msgstr "# блокови на-захтев одговарају захтевима"
+
+#: src/fs/gnunet-service-fs_pr.c:1377
+msgid "# on-demand lookups performed successfully"
+msgstr "# претраге на-захтев су обављене успешно"
+
+#: src/fs/gnunet-service-fs_pr.c:1382
+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
+msgid "# Datastore lookups concluded (error queueing)"
+msgstr "# Претраге смештаја података су закључене (грешка стављања у ред)"
+
+#: src/fs/gnunet-service-fs_pr.c:1467
+msgid "# Datastore lookups concluded (found last result)"
+msgstr "# Претраге смештаја података су закључене (нађох последњи резултат)"
+
+#: src/fs/gnunet-service-fs_pr.c:1478
+msgid "# Datastore lookups concluded (load too high)"
+msgstr "# Претраге смештаја података су закључене (утовар је превелик)"
+
+#: src/fs/gnunet-service-fs_pr.c:1566
+msgid "# Datastore lookups initiated"
+msgstr "# Претраге смештаја података су покренуте"
+
+#: src/fs/gnunet-service-fs_pr.c:1651
+msgid "# GAP PUT messages received"
+msgstr "# поруке ЈАЗ СТАВИ су примљене"
+
+#: src/fs/gnunet-service-fs_push.c:631
+msgid "time required, content pushing disabled"
+msgstr "време је затражено, гурање садржаја је искључено"
+
+#: src/fs/gnunet-unindex.c:89
+#, c-format
+msgid "Unindexing at %llu/%llu (%s remaining)\n"
+msgstr "Поништавам индексирање при %llu/%llu (преостаје %s)\n"
+
+#: src/fs/gnunet-unindex.c:95
+#, c-format
+msgid "Error unindexing: %s.\n"
+msgstr "Грешка поништавања индексирања: %s.\n"
+
+#: src/fs/gnunet-unindex.c:100
+msgid "Unindexing done.\n"
+msgstr "Поништавање индексирања је готово.\n"
+
+#: src/fs/gnunet-unindex.c:130
+#, c-format
+msgid "You must specify one and only one filename for unindexing.\n"
+msgstr "Морате навести један и само један назив датотеке за поништавање
индексирања.\n"
+
+#: src/fs/gnunet-unindex.c:147
+msgid "Could not start unindex operation.\n"
+msgstr "Не могу да започнем радњу поништавања индексирања.\n"
+
+#: src/fs/gnunet-unindex.c:179
+msgid "Unindex a file that was previously indexed with gnunet-publish."
+msgstr "Поништава индексирање датотеке која је претходно била индексирана са
„gnunet-publish“."
+
+#: src/gns/gns_api.c:393
+msgid "Failed to deserialize lookup reply from GNS service!\n"
+msgstr "Нисам успео да десеријализујем одговор претраге са ГНС услуге!\n"
+
+#: src/gns/gnunet-bcd.c:123
+#, c-format
+msgid "Refusing `%s' request to HTTP server\n"
+msgstr "Одбијам „%s“ захтев за ХТТП сервер\n"
+
+#: src/gns/gnunet-bcd.c:355 src/hostlist/hostlist-server.c:567
+#, c-format
+msgid "Invalid port number %llu. Exiting.\n"
+msgstr "Неисправан број прикључника %llu. Излазим.\n"
+
+#: src/gns/gnunet-bcd.c:360
+#, c-format
+msgid "Businesscard HTTP server starts on %llu\n"
+msgstr "ХТТП сервер пословне картице почиње на %llu\n"
+
+#: src/gns/gnunet-bcd.c:374
+#, c-format
+msgid "Could not start businesscard HTTP server on port %u\n"
+msgstr "Не могу да покренем ХТТП сервер пословне картице на прикључнику %u\n"
+
+#: src/gns/gnunet-bcd.c:519
+msgid "Run HTTP serve on port PORT (default is 8888)"
+msgstr "Покрећем ХТТП сервер на прикључнику ПРИКЉУЧНИК (основно је 8888)"
+
+#: src/gns/gnunet-bcd.c:531
+msgid "GNUnet HTTP server to create business cards"
+msgstr "ГНУнет ХТТП сервер за стварање бизнис картица"
+
+#: src/gns/gnunet-dns2gns.c:228
+msgid "Failed to pack DNS response into UDP packet!\n"
+msgstr "Нисам успео да упакујем ДНС одговор у УДП пакет!\n"
+
+#: src/gns/gnunet-dns2gns.c:400
+#, c-format
+msgid "Cannot parse DNS request from %s\n"
+msgstr "Не могу да обрадим ДНС захтев од „%s“\n"
+
+#: src/gns/gnunet-dns2gns.c:416
+#, c-format
+msgid "Received malformed DNS request from %s\n"
+msgstr "Примих лош ДНС захтев од „%s“\n"
+
+#: src/gns/gnunet-dns2gns.c:424
+#, c-format
+msgid "Received unsupported DNS request from %s\n"
+msgstr "Примих неподржан ДНС захтев од „%s“\n"
+
+#: src/gns/gnunet-dns2gns.c:701
+msgid "No ego configured for `dns2gns` subsystem\n"
+msgstr "Није подешен его за „dns2gns“ подсистем\n"
+
+#: src/gns/gnunet-dns2gns.c:727
+msgid "No DNS server specified!\n"
+msgstr "Није наведен ДНС сервер!\n"
+
+#: src/gns/gnunet-dns2gns.c:749
+msgid "No valid GNS zone specified!\n"
+msgstr "Није наведена исправна ГНС зона!\n"
+
+#: src/gns/gnunet-dns2gns.c:770
+msgid "IP of recursive DNS resolver to use (required)"
+msgstr "ИП дубинског ДНС решавача за коришћење (потребно)"
+
+#: src/gns/gnunet-dns2gns.c:773
+msgid "Authoritative FCFS suffix to use (optional); default: fcfs.zkey.eu"
+msgstr "Ауторитативни ФЦФС суфикс за коришћење (изборно); основно:
fcfs.zkey.eu"
+
+#: src/gns/gnunet-dns2gns.c:776
+msgid "Authoritative DNS suffix to use (optional); default: zkey.eu"
+msgstr "Ауторитативни ДНС суфикс за коришћење (изборно); основно: zkey.eu"
+
+#: src/gns/gnunet-dns2gns.c:779
+msgid "UDP port to listen on for inbound DNS requests; default: 53"
+msgstr "УДП прикључник на коме ће ослушкивати за долазним ДНС захтевима;
основно: 53"
+
+#: src/gns/gnunet-dns2gns.c:782
+msgid "Public key of the GNS zone to use (overrides default)"
+msgstr "Јавни кључ ГНС зоне за коришћење (преписује основно)"
+
+#: src/gns/gnunet-dns2gns.c:795
+msgid "GNUnet DNS-to-GNS proxy (a DNS server)"
+msgstr "Посредник ДНС-до-ГНС ГНУнет-а (ДНС сервер)"
+
+#: src/gns/gnunet-gns.c:227
+#, c-format
+msgid "Please specify name to lookup!\n"
+msgstr "Наведите назив за тражење!\n"
+
+#: src/gns/gnunet-gns.c:308
+#, c-format
+msgid "Ego for `%s' not found, cannot perform lookup.\n"
+msgstr "Нисам нашао его за „%s“, не могу да обавим претрагу.\n"
+
+#: src/gns/gnunet-gns.c:347 src/gns/gnunet-gns-helper-service-w32.c:798
+#, c-format
+msgid "Ego for `gns-master' not found, cannot perform lookup. Did you run
gnunet-gns-import.sh?\n"
+msgstr "Нисам нашао его за „gns-master“, не могу да обавим претрагу. Да ли
сте покренули „gnunet-gns-import.sh“?\n"
+
+#: src/gns/gnunet-gns.c:386 src/gns/gnunet-gns-helper-service-w32.c:828
+#, c-format
+msgid "Failed to connect to GNS\n"
+msgstr "Нисам успео да се повежем са ГНС-ом\n"
+
+#: src/gns/gnunet-gns.c:399
+#, c-format
+msgid "Public key `%s' is not well-formed\n"
+msgstr "Јавни кључ „%s“ није добро оформљен\n"
+
+#: src/gns/gnunet-gns.c:449
+msgid "Lookup a record for the given name"
+msgstr "Претражује запис за датим називом"
+
+#: src/gns/gnunet-gns.c:452
+msgid "Specify the type of the record to lookup"
+msgstr "Наводи врсту записа за претраживање"
+
+#: src/gns/gnunet-gns.c:455
+msgid "Specify timeout for the lookup"
+msgstr "Наводи време истека за претраживање"
+
+#: src/gns/gnunet-gns.c:458
+msgid "No unneeded output"
+msgstr "Нема непотребног излаза"
+
+#: src/gns/gnunet-gns.c:461
+msgid "Specify the public key of the zone to lookup the record in"
+msgstr "Наводи јавни кључ зоне у којој ће се тражити запис"
+
+#: src/gns/gnunet-gns.c:464
+msgid "Specify the name of the ego of the zone to lookup the record in"
+msgstr "Наводи назив егоа зоне у којој ће се тражити запис"
+
+#: src/gns/gnunet-gns.c:478
+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"
+msgstr "Нисам нашао „gns-short“. То и није баш кобно, али ћу се ја претварати
да јесте и одбићу да обавим претраживање. Да ли сте покренули
„gnunet-gns-import.sh“?\n"
+
+#: src/gns/gnunet-gns-helper-service-w32.c:838
+#, c-format
+msgid "Failed to connect to identity service\n"
+msgstr "Нисам успео да се повежем са услугом идентитета\n"
+
+#: src/gns/gnunet-gns-import.c:479
+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
+#, c-format
+msgid "%s failed at %s:%d: `%s'\n"
+msgstr "„%s“ није успело на %s:%d: „%s“\n"
+
+#: src/gns/gnunet-gns-proxy.c:833
+#, c-format
+msgid "Unsupported CURL SSL backend %d\n"
+msgstr "Неподржан CURL SSL позадинац %d\n"
+
+#: src/gns/gnunet-gns-proxy.c:856
+#, c-format
+msgid "Failed to fetch CN from cert: %s\n"
+msgstr "Нисам успео да довучем ЦН из уверења: %s\n"
+
+#: src/gns/gnunet-gns-proxy.c:879
+#, c-format
+msgid "Failed to initialize DANE: %s\n"
+msgstr "Нисам успео да покренем ДАНЕ: %s\n"
+
+#: src/gns/gnunet-gns-proxy.c:892
+#, c-format
+msgid "Failed to parse DANE record: %s\n"
+msgstr "Нисам успео да обрадим ДАНЕ запис: %s\n"
+
+#: src/gns/gnunet-gns-proxy.c:907
+#, c-format
+msgid "Failed to verify TLS connection using DANE: %s\n"
+msgstr "Нисам успео да потврдим ТЛС везу користећи ДАНЕ: %s\n"
+
+#: src/gns/gnunet-gns-proxy.c:917
+#, c-format
+msgid "Failed DANE verification failed with GnuTLS verify status code: %u\n"
+msgstr "Неуспела ДАНЕ провера није успела са кодом стања ГнуТЛС провере: %u\n"
+
+#: src/gns/gnunet-gns-proxy.c:941
+#, c-format
+msgid "SSL certificate subject name (%s) does not match `%s'\n"
+msgstr "Назив субјекта ССЛ уверења (%s) не одговара „%s“\n"
+
+#: src/gns/gnunet-gns-proxy.c:1086
+#, c-format
+msgid "Cookie domain `%s' supplied by server is invalid\n"
+msgstr "Домен колачића „%s“ које је доставио сервер је неисправан\n"
+
+#: src/gns/gnunet-gns-proxy.c:1602
+#, c-format
+msgid "Unsupported HTTP method `%s'\n"
+msgstr "Неподржан ХТТП метод „%s“\n"
+
+#: src/gns/gnunet-gns-proxy.c:1973
+#, c-format
+msgid "Unable to import private key from file `%s'\n"
+msgstr "Не могу да увезем приватни кључ из датотеке „%s“\n"
+
+#: src/gns/gnunet-gns-proxy.c:2003
+#, c-format
+msgid "Unable to import certificate %s\n"
+msgstr "Не могу да увезем уверење „%s“\n"
+
+#: src/gns/gnunet-gns-proxy.c:2177
+#, c-format
+msgid "Failed to start HTTPS server for `%s'\n"
+msgstr "Нисам успео да покренем ХТТПС сервер за „%s“\n"
+
+#: src/gns/gnunet-gns-proxy.c:2196
+msgid "Failed to pass client to MHD\n"
+msgstr "Нисам успео да проследим клијента МХД-у\n"
+
+#: src/gns/gnunet-gns-proxy.c:2504
+#, c-format
+msgid "Unsupported socks version %d\n"
+msgstr "Неподржано издање прикључнице %d\n"
+
+#: src/gns/gnunet-gns-proxy.c:2533
+#, c-format
+msgid "Unsupported socks command %d\n"
+msgstr "Неподржана наредба прикључнице %d\n"
+
+#: src/gns/gnunet-gns-proxy.c:2551 src/gns/gnunet-gns-proxy.c:2580
+msgid "SSL connection to plain IPv4 address requested\n"
+msgstr "ССЛ веза за обичну ИПв4 адресу је захтевана\n"
+
+#: src/gns/gnunet-gns-proxy.c:2631
+#, c-format
+msgid "Unsupported socks address type %d\n"
+msgstr "Неподржана врста адресе прикључнице %d\n"
+
+#: src/gns/gnunet-gns-proxy.c:2970
+msgid "No ego configured for `shorten-zone`\n"
+msgstr "Его није подешен за „shorten-zone“\n"
+
+#: src/gns/gnunet-gns-proxy.c:3010
+#, c-format
+msgid "No ego configured for `%s`\n"
+msgstr "Није подешен его за `%s`\n"
+
+#: src/gns/gnunet-gns-proxy.c:3072
+#, c-format
+msgid "Failed to load SSL/TLS key and certificate from `%s'\n"
+msgstr "Нисам успео да учитам ССЛ/ТЛС кључ и уверење из „%s“\n"
+
+#: src/gns/gnunet-gns-proxy.c:3113
+msgid "listen on specified port (default: 7777)"
+msgstr "ослушкиван на наведеном прикључнику (основно: 7777)"
+
+#: src/gns/gnunet-gns-proxy.c:3116
+msgid "pem file to use as CA"
+msgstr "пем датотека за коришћење као издавач уверења"
+
+#: src/gns/gnunet-gns-proxy.c:3135
+msgid "GNUnet GNS proxy"
+msgstr "ГНУнет ГНС посредник"
+
+#: src/gns/gnunet-service-gns.c:862
+msgid "Failed to connect to the namestore!\n"
+msgstr "Нисам успео да се повежем са смештајем назива!\n"
+
+#: src/gns/gnunet-service-gns.c:870
+msgid "Failed to connect to the namecache!\n"
+msgstr "Нисам успео да се повежем са оставом назива!\n"
+
+#: src/gns/gnunet-service-gns.c:903
+msgid "Could not connect to DHT!\n"
+msgstr "Не могу да се повежем на ДХТ!\n"
+
+#: src/gns/gnunet-service-gns.c:919
+msgid "valid public key required"
+msgstr "исправан јавни кључ се захтева"
+
+#: src/gns/gnunet-service-gns_interceptor.c:263
+msgid "Error converting GNS response to DNS response!\n"
+msgstr "Грешка претварања ГНС одговора у ДНС одговор!\n"
+
+#: src/gns/gnunet-service-gns_interceptor.c:369
+msgid "Failed to connect to the DNS service!\n"
+msgstr "Нисам успео да се повежем са ДНС услугом!\n"
+
+#: src/gns/gnunet-service-gns_resolver.c:816
+msgid "Failed to parse DNS response\n"
+msgstr "Нисам успео да обрадим ДНС одговор\n"
+
+#: src/gns/gnunet-service-gns_resolver.c:958
+#, c-format
+msgid "Skipping record of unsupported type %d\n"
+msgstr "Прескачем запис неподржане врсте %d\n"
+
+#: src/gns/gnunet-service-gns_resolver.c:1317
+#, c-format
+msgid "GNS lookup resulted in DNS name that is too long (`%s')\n"
+msgstr "ГНС претраживање је резултирало ДНС називом који је предуг („%s“)\n"
+
+#: src/gns/gnunet-service-gns_resolver.c:1817
+msgid "GNS lookup recursion failed (no delegation record found)\n"
+msgstr "Дубачење ГНС претраге није успело (нисам нашао запис изасланства)\n"
+
+#: src/gns/gnunet-service-gns_resolver.c:1841
+#, c-format
+msgid "Failed to cache GNS resolution: %s\n"
+msgstr "Нисам успео да сместим у оставу ГНС резолуцију: %s\n"
+
+#: src/gns/gnunet-service-gns_resolver.c:2123
+#, c-format
+msgid "Zone %s was revoked, resolution fails\n"
+msgstr "Зона %s је опозвана, резолуција није успела\n"
+
+#: src/gns/gnunet-service-gns_resolver.c:2272
+#, c-format
+msgid "Hostname `%s' is not well-formed, resolution fails\n"
+msgstr "Назив домаћина „%s“ није лепо оформљен, резолуција није успела\n"
+
+#: src/gns/plugin_gnsrecord_gns.c:151
+#, c-format
+msgid "Unable to parse PKEY record `%s'\n"
+msgstr "Не могу да обрадим „PKEY“ запис „%s“\n"
+
+#: src/gns/plugin_gnsrecord_gns.c:180
+#, c-format
+msgid "Unable to parse GNS2DNS record `%s'\n"
+msgstr "Не могу да обрадим „GNS2DNS“ запис „%s“\n"
+
+#: src/gns/plugin_gnsrecord_gns.c:201
+#, c-format
+msgid "Failed to serialize GNS2DNS record with value `%s'\n"
+msgstr "Нисам успео да серијализујем ГНС2ДНС запис са вредношћу „%s“\n"
+
+#: src/gns/plugin_gnsrecord_gns.c:217
+#, c-format
+msgid "Unable to parse VPN record string `%s'\n"
+msgstr "Не могу да обрадим ниску ВПН записа „%s“\n"
+
+#: src/gnsrecord/plugin_gnsrecord_dns.c:293
+#, c-format
+msgid "Unable to parse IPv4 address `%s'\n"
+msgstr "Не могу да обрадим ИПв4 адресу „%s“\n"
+
+#: src/gnsrecord/plugin_gnsrecord_dns.c:314
+#, c-format
+msgid "Failed to serialize NS record with value `%s'\n"
+msgstr "Нисам успео да серијализујем НС запис са вредношћу „%s“\n"
+
+#: src/gnsrecord/plugin_gnsrecord_dns.c:336
+#, c-format
+msgid "Failed to serialize CNAME record with value `%s'\n"
+msgstr "Нисам успео да серијализујем ЦНАЗИВ запис са вредношћу „%s“\n"
+
+#: src/gnsrecord/plugin_gnsrecord_dns.c:420
+#, c-format
+msgid "Failed to serialize CERT record with %u bytes\n"
+msgstr "Нисам успео да серијализујем УВЕР запис са %u бајта\n"
+
+#: src/gnsrecord/plugin_gnsrecord_dns.c:452
+#, c-format
+msgid "Unable to parse SOA record `%s'\n"
+msgstr "Не могу да обрадим „SOA“ запис „%s“\n"
+
+#: src/gnsrecord/plugin_gnsrecord_dns.c:471
+#, c-format
+msgid "Failed to serialize SOA record with mname `%s' and rname `%s'\n"
+msgstr "Нисам успео да серијализујем СОА запис са називом „%s“ и р-називом
„%s“\n"
+
+#: src/gnsrecord/plugin_gnsrecord_dns.c:494
+#, c-format
+msgid "Failed to serialize PTR record with value `%s'\n"
+msgstr "Нисам успео да серијализујем ПТР запис са вредношћу „%s“\n"
+
+#: src/gnsrecord/plugin_gnsrecord_dns.c:514
+#, c-format
+msgid "Unable to parse MX record `%s'\n"
+msgstr "Не могу да обрадим „MX“ запис „%s“\n"
+
+#: src/gnsrecord/plugin_gnsrecord_dns.c:529
+#, c-format
+msgid "Failed to serialize MX record with hostname `%s'\n"
+msgstr "Нисам успео да серијализујем МИкс запис са називом домаћина „%s“\n"
+
+#: src/gnsrecord/plugin_gnsrecord_dns.c:549
+#, c-format
+msgid "Unable to parse IPv6 address `%s'\n"
+msgstr "Не могу да обрадим ИПв6 адресу „%s“\n"
+
+#: src/gnsrecord/plugin_gnsrecord_dns.c:567
+#, c-format
+msgid "Unable to parse TLSA record string `%s'\n"
+msgstr "Не могу да обрадим ниску ТЛСА записа „%s“\n"
+
+#: src/hello/gnunet-hello.c:123
+msgid "Call with name of HELLO file to modify.\n"
+msgstr "Позив са називом датотеке „HELLO“ за мењање.\n"
+
+#: src/hello/gnunet-hello.c:129
+#, c-format
+msgid "Error accessing file `%s': %s\n"
+msgstr "Грешка приступа датотеци „%s“: %s\n"
+
+#: src/hello/gnunet-hello.c:137
+#, c-format
+msgid "File `%s' is too big to be a HELLO\n"
+msgstr "Датотека „%s“ је превелика да би била „HELLO“\n"
+
+#: src/hello/gnunet-hello.c:144
+#, c-format
+msgid "File `%s' is too small to be a HELLO\n"
+msgstr "Датотека „%s“ је премала да би била „HELLO“\n"
+
+#: src/hello/gnunet-hello.c:154 src/hello/gnunet-hello.c:183
+#, c-format
+msgid "Error opening file `%s': %s\n"
+msgstr "Грешка отварања датотеке „%s“: %s\n"
+
+#: src/hello/gnunet-hello.c:170
+#, c-format
+msgid "Did not find well-formed HELLO in file `%s'\n"
+msgstr "Нисам нашао лепо формирано „HELLO“ у датотеци „%s“\n"
+
+#: src/hello/gnunet-hello.c:195
+#, c-format
+msgid "Error writing HELLO to file `%s': %s\n"
+msgstr "Грешка писања „HELLO“-а у датотеку „%s“: %s\n"
+
+#: src/hello/gnunet-hello.c:203
+#, c-format
+msgid "Modified %u addresses \n"
+msgstr "Измењених адреса — %u \n"
+
+#: src/hello/hello.c:944
+msgid "Failed to parse HELLO message: missing expiration time\n"
+msgstr "Нисам успео да обрадим „HELLO“ поруку: недостаје време истека\n"
+
+#: src/hello/hello.c:953
+msgid "Failed to parse HELLO message: invalid expiration time\n"
+msgstr "Нисам успео да обрадим „HELLO“ поруку: неисправно време истека\n"
+
+#: src/hello/hello.c:963
+msgid "Failed to parse HELLO message: malformed\n"
+msgstr "Нисам успео да обрадим „HELLO“ поруку: лоша\n"
+
+#: src/hello/hello.c:973
+msgid "Failed to parse HELLO message: missing transport plugin\n"
+msgstr "Нисам успео да обрадим „HELLO“ поруку: недостаје прикључак преноса\n"
+
+#: src/hello/hello.c:990
+#, c-format
+msgid "Plugin `%s' not found\n"
+msgstr "Нисам нашао прикључак „%s“\n"
+
+#: src/hello/hello.c:999
+#, c-format
+msgid "Plugin `%s' does not support URIs yet\n"
+msgstr "Прикључак „%s“ још не подржава УРИ-је\n"
+
+#: src/hello/hello.c:1018
+#, c-format
+msgid "Failed to parse `%s' as an address for plugin `%s'\n"
+msgstr "Нисам успео да обрадим „%s“ као адресу за прикључак „%s“\n"
+
+#: 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"
+msgstr "Ниједна од функција за демона списка домаћина није укључена. Немам
разлога да радим било шта!\n"
+
+#: src/hostlist/gnunet-daemon-hostlist.c:308
+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)"
+msgstr "почетно подизање помоћу спискова домаћина (врло се препоручује да увек
користите ову опцију)"
+
+#: src/hostlist/gnunet-daemon-hostlist.c:316
+msgid "enable learning about hostlist servers from other peers"
+msgstr "укључује учење о серверима списка домаћина са других парњака"
+
+#: src/hostlist/gnunet-daemon-hostlist.c:320
+msgid "provide a hostlist server"
+msgstr "обезбеђује сервер списка домаћина"
+
+#: src/hostlist/gnunet-daemon-hostlist.c:335
+msgid "GNUnet hostlist server and client"
+msgstr "Сервер и клијент списка домаћина ГНУнет-а"
+
+#: src/hostlist/hostlist-client.c:288
+msgid "# bytes downloaded from hostlist servers"
+msgstr "# бајтови су преузети са сервера списка домаћина"
+
+#: src/hostlist/hostlist-client.c:309 src/hostlist/hostlist-client.c:339
+msgid "# invalid HELLOs downloaded from hostlist servers"
+msgstr "# неисправни „HELLO“-и су преузети са сервера списка домаћина"
+
+#: src/hostlist/hostlist-client.c:312 src/hostlist/hostlist-client.c:342
+#, c-format
+msgid "Invalid `%s' message received from hostlist at `%s'\n"
+msgstr "Неисправна „%s“ порука је примљена са списка домаћина на „%s“\n"
+
+#: src/hostlist/hostlist-client.c:330
+msgid "# valid HELLOs downloaded from hostlist servers"
+msgstr "# исправни „HELLO“-и су преузети са сервера списка домаћина"
+
+#: src/hostlist/hostlist-client.c:592 src/hostlist/hostlist-client.c:1333
+msgid "# advertised hostlist URIs"
+msgstr "# рекламиране путање списка домаћина"
+
+#: src/hostlist/hostlist-client.c:622
+#, c-format
+msgid "# advertised URI `%s' downloaded"
+msgstr "# рекламирана путања „%s“ је преузета"
+
+#: src/hostlist/hostlist-client.c:664
+#, c-format
+msgid "Advertised hostlist with URI `%s' could not be downloaded. Advertised
URI gets dismissed.\n"
+msgstr "Рекламирани списак домаћина са путањом „%s“ се не може преузети.
Рекламирана путања је одбачена.\n"
+
+#: src/hostlist/hostlist-client.c:802
+#, c-format
+msgid "Timeout trying to download hostlist from `%s'\n"
+msgstr "Време је истекло у покушају преузимања списка домаћина са „%s“\n"
+
+#: src/hostlist/hostlist-client.c:816
+#, c-format
+msgid "Download limit of %u bytes exceeded, stopping download\n"
+msgstr "Ограничење преузимања од %u бајта је премашено, заустављам
преузимање\n"
+
+#: src/hostlist/hostlist-client.c:836
+#, c-format
+msgid "Download of hostlist from `%s' failed: `%s'\n"
+msgstr "Преузимање списка доамаћина са „%s“ није успело: „%s“\n"
+
+#: src/hostlist/hostlist-client.c:842
+#, c-format
+msgid "Download of hostlist `%s' completed.\n"
+msgstr "Преузимање списка домаћина „%s“ је завршено.\n"
+
+#: src/hostlist/hostlist-client.c:850
+#, c-format
+msgid "Adding successfully tested hostlist `%s' datastore.\n"
+msgstr "Додаје успешно тестирани смештај података „%s“ списка домаћина.\n"
+
+#: src/hostlist/hostlist-client.c:903
+#, c-format
+msgid "Bootstrapping using hostlist at `%s'.\n"
+msgstr "Вршим почетно подизање помоћу списка домаћина на „%s“.\n"
+
+#: src/hostlist/hostlist-client.c:911
+msgid "# hostlist downloads initiated"
+msgstr "# преузимања списка домаћина су започета"
+
+#: src/hostlist/hostlist-client.c:1040 src/hostlist/hostlist-client.c:1506
+msgid "# milliseconds between hostlist downloads"
+msgstr "# милисекунди између преузимања списка домаћина"
+
+#: src/hostlist/hostlist-client.c:1049
+#, c-format
+msgid "Have %u/%u connections. Will consider downloading hostlist in %s\n"
+msgstr "Имам %u/%u везе. Размотрићу преузимање списка домаћина за %s\n"
+
+#: src/hostlist/hostlist-client.c:1109 src/hostlist/hostlist-client.c:1125
+msgid "# active connections"
+msgstr "# активних веза"
+
+#: src/hostlist/hostlist-client.c:1280
+#, c-format
+msgid "Loading saved hostlist entries from file `%s' \n"
+msgstr "Учитавам сачуване уносе списка домаћина из датотеке „%s“ \n"
+
+#: src/hostlist/hostlist-client.c:1285
+#, c-format
+msgid "Hostlist file `%s' does not exist\n"
+msgstr "Датотека списка домаћина „%s“ не постоји\n"
+
+#: src/hostlist/hostlist-client.c:1296
+#, c-format
+msgid "Could not open file `%s' for reading to load hostlists: %s\n"
+msgstr "Не могу да отворим датотеку „%s“ за читање да утоварим спискове
домаћина: %s\n"
+
+#: src/hostlist/hostlist-client.c:1329
+#, c-format
+msgid "%u hostlist URIs loaded from file\n"
+msgstr "УРИ-и %u списка домаћина су учитани из датотеке\n"
+
+#: src/hostlist/hostlist-client.c:1331
+msgid "# hostlist URIs read from file"
+msgstr "# УРИ-и списка домаћина су учитани из датотеке"
+
+#: src/hostlist/hostlist-client.c:1376
+#, c-format
+msgid "Could not open file `%s' for writing to save hostlists: %s\n"
+msgstr "Не могу да отворим датотеку „%s“ за писање да сачувам спискове
домаћина: %s\n"
+
+#: src/hostlist/hostlist-client.c:1381
+#, c-format
+msgid "Writing %u hostlist URIs to `%s'\n"
+msgstr "Уписујем УРИ-је %u списка домаћина у „%s“\n"
+
+#: src/hostlist/hostlist-client.c:1405 src/hostlist/hostlist-client.c:1422
+#, c-format
+msgid "Error writing hostlist URIs to file `%s'\n"
+msgstr "Грешка писања УРИ-а списка домаћина у датотеку „%s“\n"
+
+#: src/hostlist/hostlist-client.c:1417
+msgid "# hostlist URIs written to file"
+msgstr "# УРИ-и списка домаћина су записани у датотеку"
+
+#: src/hostlist/hostlist-client.c:1471
+msgid "Learning is enabled on this peer\n"
+msgstr "Учење је укључено на овом парњаку\n"
+
+#: src/hostlist/hostlist-client.c:1483
+msgid "Learning is not enabled on this peer\n"
+msgstr "Учење није укључено на овом парњаку\n"
+
+#: src/hostlist/hostlist-client.c:1495
+#, c-format
+msgid "Since learning is not enabled on this peer, hostlist file `%s' was
removed\n"
+msgstr "Како учење није укључено на овом парњаку, датотека списка домаћина
„%s“ је уклоњена\n"
+
+#: src/hostlist/hostlist-client.c:1499
+#, c-format
+msgid "Hostlist file `%s' could not be removed\n"
+msgstr "Датотека списка домаћина „%s“ не може бити уклоњена\n"
+
+#: src/hostlist/hostlist-server.c:137
+msgid "bytes in hostlist"
+msgstr "бајтова у списку домаћина"
+
+#: src/hostlist/hostlist-server.c:161
+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
+#, c-format
+msgid "Error in communication with PEERINFO service: %s\n"
+msgstr "Грешка у комуникацији са услугом ПОДАЦИ_ПАРЊАКА: %s\n"
+
+#: src/hostlist/hostlist-server.c:210
+msgid "HELLOs without addresses encountered (ignored)"
+msgstr "наиђох на „HELLO“-е без адреса (занемарено)"
+
+#: src/hostlist/hostlist-server.c:224
+msgid "bytes not included in hostlist (size limit)"
+msgstr "бајтови нису укључени на списак домаћина (ограничење величине)"
+
+#: src/hostlist/hostlist-server.c:268
+#, c-format
+msgid "Refusing `%s' request to hostlist server\n"
+msgstr "Одбијам „%s“ захтев за сервер списка домаћина\n"
+
+#: src/hostlist/hostlist-server.c:271
+msgid "hostlist requests refused (not HTTP GET)"
+msgstr "захтеви списка домаћина су одбијени (нису „HTTP GET“)"
+
+#: src/hostlist/hostlist-server.c:284
+#, c-format
+msgid "Refusing `%s' request with %llu bytes of upload data\n"
+msgstr "Одбијам „%s“ захтев са %llu бајта података утовара\n"
+
+#: src/hostlist/hostlist-server.c:288
+msgid "hostlist requests refused (upload data)"
+msgstr "захтеви списка домаћина су одбијени (подаци утовара)"
+
+#: src/hostlist/hostlist-server.c:296
+msgid "Could not handle hostlist request since I do not have a response yet\n"
+msgstr "Не могу да радим са захтевом списка домаћина јер још немам одговор\n"
+
+#: src/hostlist/hostlist-server.c:299
+msgid "hostlist requests refused (not ready)"
+msgstr "захтеви списка домаћина су одбијени (нису спремни)"
+
+#: src/hostlist/hostlist-server.c:303
+msgid "Received request for our hostlist\n"
+msgstr "Примих захтев за наш списак домаћина\n"
+
+#: src/hostlist/hostlist-server.c:304
+msgid "hostlist requests processed"
+msgstr "захтеви списка домаћина су обрађени"
+
+#: src/hostlist/hostlist-server.c:346
+msgid "# hostlist advertisements send"
+msgstr "# рекламе списка домаћина су послате"
+
+#: src/hostlist/hostlist-server.c:390
+msgid "Advertisement message could not be queued by core\n"
+msgstr "Поруку оглашавања језгро не може да стави у ред\n"
+
+#: src/hostlist/hostlist-server.c:557 src/peerinfo-tool/gnunet-peerinfo.c:639
+#: src/transport/gnunet-service-transport.c:1114
+msgid "Could not access PEERINFO service. Exiting.\n"
+msgstr "Не могу да приступим услузи ИНФО_ПАРЊАКА. Излазим.\n"
+
+#: src/hostlist/hostlist-server.c:576
+#, c-format
+msgid "Hostlist service starts on %s:%llu\n"
+msgstr "Услуга списка домаћина почиње на %s:%llu\n"
+
+#: src/hostlist/hostlist-server.c:590
+#, c-format
+msgid "Address to obtain hostlist: `%s'\n"
+msgstr "Адреса за добијање списка домаћина: „%s“\n"
+
+#: src/hostlist/hostlist-server.c:630
+#, c-format
+msgid "`%s' is not a valid IP address! Ignoring BINDTOIP.\n"
+msgstr "„%s“ није исправна ИП адреса! Занемарујем „BINDTOIP“.\n"
+
+#: src/hostlist/hostlist-server.c:673
+#, c-format
+msgid "Could not start hostlist HTTP server on port %u\n"
+msgstr "Не могу да покренем ХТТП сервер списка домаћина на прикључнику %u\n"
+
+#: src/identity/gnunet-identity.c:165
+#, c-format
+msgid "Failed to create ego: %s\n"
+msgstr "Нисам успео да направим его: %s\n"
+
+#: src/identity/gnunet-identity.c:184
+#, c-format
+msgid "Failed to set default ego: %s\n"
+msgstr "Нисам успео да поставим основни его: %s\n"
+
+#: src/identity/gnunet-identity.c:327
+msgid "create ego NAME"
+msgstr "ствара НАЗИВ ега"
+
+#: src/identity/gnunet-identity.c:330
+msgid "delete ego NAME "
+msgstr "брише НАЗИВ ега "
+
+#
+# File: util/dialtest.c++, line: 134
+#: src/identity/gnunet-identity.c:333
+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)"
+msgstr "поставља основни идентитет на ЕГО за подсистем ПОДСИСТЕМ (користите
заједно са -s)"
+
+#: src/identity/gnunet-identity.c:339
+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)"
+msgstr "поставља основни идентитет на ЕГО за подсистем ПОДСИСТЕМ (користите
заједно са -e)"
+
+#: src/identity/gnunet-identity.c:351
+msgid "Maintain egos"
+msgstr "Одржава егое"
+
+#: src/identity/gnunet-service-identity.c:338
+msgid "no default known"
+msgstr "основнст није позната"
+
+#: src/identity/gnunet-service-identity.c:362
+msgid "default configured, but ego unknown (internal error)"
+msgstr "основни је подешен, али его није познат (унутрашња грешка)"
+
+#: src/identity/gnunet-service-identity.c:439
+#: src/identity/gnunet-service-identity.c:670
+#: src/identity/gnunet-service-identity.c:778
+#, c-format
+msgid "Failed to write subsystem default identifier map to `%s'.\n"
+msgstr "Нисам успео да запишем основну мапу одредника подсистема у „%s“.\n"
+
+#: src/identity/gnunet-service-identity.c:446
+msgid "Unknown ego specified for service (internal error)"
+msgstr "Непознат его је наведен за услугу (унутрашња грешка)"
+
+#: src/identity/gnunet-service-identity.c:516
+msgid "identifier already in use for another ego"
+msgstr "одредник се већ користи за други его"
+
+#: src/identity/gnunet-service-identity.c:647
+msgid "target name already exists"
+msgstr "назив мете већ постоји"
+
+#: src/identity/gnunet-service-identity.c:686
+#: src/identity/gnunet-service-identity.c:795
+msgid "no matching ego found"
+msgstr "нисам нашао одговарајући его"
+
+#: src/identity/gnunet-service-identity.c:829
+#, c-format
+msgid "Failed to parse ego information in `%s'\n"
+msgstr "Нисам успео да обрадим податке егоа у „%s“\n"
+
+#: src/identity/gnunet-service-identity.c:902
+#, c-format
+msgid "Failed to parse subsystem identity configuration file `%s'\n"
+msgstr "Нисам успео да обрадим датотеку подешавања идентитета субсистема
„%s“\n"
+
+#: src/identity/gnunet-service-identity.c:914
+#, c-format
+msgid "Failed to create directory `%s' for storing egos\n"
+msgstr "Нисам успео да направим директоријум „%s“ за смештајне егое\n"
+
+#: src/mesh/gnunet-mesh.c:357
+#, c-format
+msgid "Invalid target `%s'\n"
+msgstr "Неисправна мета „%s“\n"
+
+#: src/mesh/gnunet-mesh.c:607
+#, c-format
+msgid "Invalid peer ID `%s'\n"
+msgstr "Неисправан ИБ парњака „%s“\n"
+
+#: src/mesh/gnunet-mesh.c:650
+#, c-format
+msgid "Invalid tunnel owner `%s'\n"
+msgstr "Неисправан власник тунела „%s“\n"
+
+#: src/mesh/gnunet-mesh.c:716
+msgid "You must NOT give a TARGETwhen using 'request all' options\n"
+msgstr "НЕ можете дати МЕТУ када користите опције „request all“\n"
+
+#: 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 "прикључник за ослушкивање (основно; 0)"
+
+#: src/mesh/gnunet-mesh.c:819 src/mesh/gnunet-mesh.c:822
+msgid "provide information about all peers"
+msgstr "обезбеђује податке о свим парњацима"
+
+#: src/mesh/gnunet-mesh.c:825
+msgid "provide information about a particular tunnel"
+msgstr "обезбеђује податке о нарочитом тунелу"
+
+#: src/mesh/gnunet-mesh.c:828
+msgid "provide information about all tunnels"
+msgstr "обезбеђује податке о свим тунелима"
+
+#: src/mesh/gnunet-service-mesh_peer.c:390
+msgid "Wrong CORE service\n"
+msgstr "Погрешна ЈЕЗГРЕНА услуга\n"
+
+#: src/mysql/mysql.c:174
+#, c-format
+msgid "Trying to use file `%s' for MySQL configuration.\n"
+msgstr "Покушавам да користим датотеку „%s“ за МајСКуЛ подешавање.\n"
+
+#: src/mysql/mysql.c:181
+#, c-format
+msgid "Could not access file `%s': %s\n"
+msgstr "Не могу да приступим датотеци „%s“: %s\n"
+
+#: src/namecache/gnunet-namecache.c:109
+#, c-format
+msgid "No records found for `%s'"
+msgstr "Нисам нашао записе за „%s“"
+
+#: src/namecache/gnunet-namecache.c:124 src/namestore/gnunet-namestore.c:397
+#, c-format
+msgid "\tCorrupt or unsupported record of type %u\n"
+msgstr "\tОштећен или неподржан запис врсте %u\n"
+
+#: src/namecache/gnunet-namecache.c:185
+#, c-format
+msgid "You must specify which zone should be accessed\n"
+msgstr "Морате навести којој зони се треба приступити\n"
+
+#: src/namecache/gnunet-namecache.c:195 src/namestore/gnunet-namestore.c:695
+#, c-format
+msgid "Invalid public key for reverse lookup `%s'\n"
+msgstr "Неисправан јавни кључ за обратну претрагу „%s“\n"
+
+#: src/namecache/gnunet-namecache.c:203
+#, c-format
+msgid "You must specify a name\n"
+msgstr "Морате навести назив\n"
+
+#: src/namecache/gnunet-namecache.c:234 src/namestore/gnunet-namestore.c:931
+msgid "name of the record to add/delete/display"
+msgstr "назив записа за додавање/брисање/приказ"
+
+#: src/namecache/gnunet-namecache.c:237
+msgid "spezifies the public key of the zone to look in"
+msgstr "наводи јавни кључ зоне за претраживање"
+
+#: src/namecache/gnunet-namecache.c:248 src/namestore/gnunet-namestore.c:963
+msgid "GNUnet zone manipulation tool"
+msgstr "Алат манипуслисања ГНУнет зоном"
+
+#: src/namecache/namecache_api.c:276
+msgid "Namecache failed to cache block"
+msgstr "Остава назива није успела да смести у оставу блок"
+
+#: src/namecache/plugin_namecache_postgres.c:89
+#: src/namestore/plugin_namestore_postgres.c:96
+msgid "Failed to create indices\n"
+msgstr "Нисам успео да направим индексе\n"
+
+#: src/namestore/gnunet-namestore.c:303
+#, c-format
+msgid "Adding record failed: %s\n"
+msgstr "Додавање записа није успело: %s\n"
+
+#: src/namestore/gnunet-namestore.c:332
+#, c-format
+msgid "Deleting record failed, record does not exist%s%s\n"
+msgstr "Брисање записа није успело, запис не постоји%s%s\n"
+
+#: src/namestore/gnunet-namestore.c:339
+#, c-format
+msgid "Deleting record failed%s%s\n"
+msgstr "Брисање записа није успело%s%s\n"
+
+#: src/namestore/gnunet-namestore.c:558
+#, c-format
+msgid "No options given\n"
+msgstr "Нису дате опције\n"
+
+#: src/namestore/gnunet-namestore.c:569
+#: src/namestore/gnunet-namestore-fcfsd.c:970
+msgid "Failed to connect to namestore\n"
+msgstr "Нисам успео да се повежем са смештајем назива\n"
+
+#: 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
+#, c-format
+msgid "Missing option `%s' for operation `%s'\n"
+msgstr "Недостаје опција „%s“ за радњу „%s“\n"
+
+#: src/namestore/gnunet-namestore.c:578 src/namestore/gnunet-namestore.c:587
+#: src/namestore/gnunet-namestore.c:604 src/namestore/gnunet-namestore.c:626
+msgid "add"
+msgstr "додај"
+
+#: src/namestore/gnunet-namestore.c:595
+#, c-format
+msgid "Unsupported type `%s'\n"
+msgstr "Неподржана врста „%s“\n"
+
+#: src/namestore/gnunet-namestore.c:615
+#, c-format
+msgid "Value `%s' invalid for record type `%s'\n"
+msgstr "Вредност „%s“ је неисправна за врсту записа „%s“\n"
+
+#: src/namestore/gnunet-namestore.c:651
+#, c-format
+msgid "Invalid time format `%s'\n"
+msgstr "Неисправан формат времена „%s“\n"
+
+#: src/namestore/gnunet-namestore.c:666
+msgid "del"
+msgstr "обриши"
+
+#: src/namestore/gnunet-namestore.c:715
+#: src/peerinfo-tool/gnunet-peerinfo.c:723
+#, c-format
+msgid "Invalid URI `%s'\n"
+msgstr "Неисправан УРИ „%s“\n"
+
+#: src/namestore/gnunet-namestore.c:750
+#, c-format
+msgid "Invalid nick `%s'\n"
+msgstr "Неисправан надимак „%s“\n"
+
+#: src/namestore/gnunet-namestore.c:790
+#, c-format
+msgid "Ego `%s' not known to identity service\n"
+msgstr "Его „%s“ није познат услузи идентитета\n"
+
+#: src/namestore/gnunet-namestore.c:817
+#, c-format
+msgid "No default ego configured in identity service\n"
+msgstr "Није подешен основни его у услузи идентитета\n"
+
+#: src/namestore/gnunet-namestore.c:853
+#, c-format
+msgid "Identity service is not running\n"
+msgstr "Услуга идентитета није покренута\n"
+
+#: src/namestore/gnunet-namestore.c:865
+#, c-format
+msgid "Cannot connect to identity service\n"
+msgstr "Не могу да се повежем са услугом идентитета\n"
+
+#: src/namestore/gnunet-namestore.c:913
+msgid "add record"
+msgstr "додаје запис"
+
+#: src/namestore/gnunet-namestore.c:916
+msgid "delete record"
+msgstr "брише запис"
+
+#: src/namestore/gnunet-namestore.c:919
+msgid "display records"
+msgstr "приказује записе"
+
+#: src/namestore/gnunet-namestore.c:922
+msgid "expiration time for record to use (for adding only), \"never\" is
possible"
+msgstr "време истека записа за коришћење (само за додавање), „never“ је могуће"
+
+#: src/namestore/gnunet-namestore.c:925
+msgid "set the desired nick name for the zone"
+msgstr "поставља жељени назив надимка за зону"
+
+#: src/namestore/gnunet-namestore.c:928
+msgid "monitor changes in the namestore"
+msgstr "прати измене у смештају назива"
+
+#: src/namestore/gnunet-namestore.c:934
+msgid "determine our name for the given PKEY"
+msgstr "одређује наш назив за дати „PKEY“"
+
+#: src/namestore/gnunet-namestore.c:937
+msgid "type of the record to add/delete/display"
+msgstr "врста записа за додавање/брисање/приказ"
+
+#: src/namestore/gnunet-namestore.c:940
+msgid "URI to import into our zone"
+msgstr "УРИ за увоз у нашу зону"
+
+#: src/namestore/gnunet-namestore.c:943
+msgid "value of the record to add/delete"
+msgstr "вредност записа за додавање/брисање"
+
+#: src/namestore/gnunet-namestore.c:946
+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"
+msgstr "прави сеновити запис (важи само ако су сви остали записи исте врсте
истекли"
+
+#: src/namestore/gnunet-namestore.c:952
+msgid "name of the ego controlling the zone"
+msgstr "назив егоа који контролише зону"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:464
+#, c-format
+msgid "Unsupported form value `%s'\n"
+msgstr "Неподржана вредност облика „%s“\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:491
+#, c-format
+msgid "Failed to create record for domain `%s': %s\n"
+msgstr "Нисам успео да направим запис за домен „%s“: %s\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:525
+#, c-format
+msgid "Found existing name `%s' for the given key\n"
+msgstr "Нађох постојећи назив „%s“ за дати кључ\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:534
+msgid "Error when mapping zone to name\n"
+msgstr "Грешка приликом мапирања зоне у назив\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:596
+#, c-format
+msgid "Found %u existing records for domain `%s'\n"
+msgstr "Нађох %u постојећа записа за домен „%s“\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:652
+#, c-format
+msgid "Failed to create page for `%s'\n"
+msgstr "Нисам успео да направим страницу за „%s“\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:668
+#, c-format
+msgid "Failed to setup post processor for `%s'\n"
+msgstr "Нисам успео да поставим постпроцесор за „%s“\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:704
+msgid "Domain name must not contain `.'\n"
+msgstr "Назив домена не сме да садржи „.“\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:712
+msgid "Domain name must not contain `+'\n"
+msgstr "Назив домена не сме да садржи „+“\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:910
+msgid "No ego configured for `fcfsd` subsystem\n"
+msgstr "Није подешен его за „fcfsd“ подсистем\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:936
+msgid "Failed to start HTTP server\n"
+msgstr "Нисам успео да покренем ХТТП сервер\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:978
+msgid "Failed to connect to identity\n"
+msgstr "Нисам успео да се повежем са идентитетом\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1011
+msgid "GNU Name System First Come First Serve name registration service"
+msgstr "Услуга регистрације назива Први Стиже Први Служи ГНУ Система Назива"
+
+#: src/namestore/gnunet-service-namestore.c:655
+#, c-format
+msgid "Failed to replicate block in namecache: %s\n"
+msgstr "Нисам успео да реплицирам блок у остави назива: %s\n"
+
+#: src/namestore/namestore_api.c:275
+msgid "Namestore failed to store record\n"
+msgstr "Смештај назива није успео да смести запис\n"
+
+#: src/nat/gnunet-nat-server.c:279
+#, c-format
+msgid "Please pass valid port number as the first argument! (got `%s')\n"
+msgstr "Проследите исправан број прикључника као први аргумент! (добих „%s“)\n"
+
+#: src/nat/gnunet-nat-server.c:321
+msgid "GNUnet NAT traversal test helper daemon"
+msgstr "Демон помоћника теста ГНУнет НАТ попречника"
+
+#: src/nat/nat_auto.c:170
+msgid "NAT traversal with ICMP Server timed out.\n"
+msgstr "Истекло је време НАТ попречника са ИЦМП сервером.\n"
+
+#: src/nat/nat_auto.c:203
+msgid "NAT traversal with ICMP Server succeeded.\n"
+msgstr "НАТ попречник са ИЦМП сервером је успео.\n"
+
+#: src/nat/nat_auto.c:204
+msgid "NAT traversal with ICMP Server failed.\n"
+msgstr "НАТ попречник са ИЦМП сервером није успео.\n"
+
+#: src/nat/nat_auto.c:225
+msgid "Testing connection reversal with ICMP server.\n"
+msgstr "Тестира обратност везе са ИЦМП сервером.\n"
+
+#: src/nat/nat_auto.c:274
+#, c-format
+msgid "Detected external IP `%s'\n"
+msgstr "Откривен је спољни ИП „%s“\n"
+
+#: src/nat/nat_auto.c:344
+msgid "This system has a global IPv6 address, setting IPv6 to supported.\n"
+msgstr "Овај систем има општу ИПв6 адресу, постављам ИПв6 на подржану.\n"
+
+#: src/nat/nat_auto.c:360
+#, c-format
+msgid "Detected internal network address `%s'.\n"
+msgstr "Откривена је унутрашња адреса мреже „%s“.\n"
+
+#: src/nat/nat_auto.c:413
+msgid "upnpc found, enabling its use\n"
+msgstr "нађох „upnpc“, омогућујем њено коришћење\n"
+
+#: src/nat/nat_auto.c:414
+msgid "upnpc not found\n"
+msgstr "нисам нашао „upnpc“\n"
+
+#: src/nat/nat_auto.c:447
+msgid "gnunet-helper-nat-server found, testing it\n"
+msgstr "нађох „gnunet-helper-nat-server“, тестирам је\n"
+
+#: src/nat/nat_auto.c:448
+msgid "No working gnunet-helper-nat-server found\n"
+msgstr "Нисам нашао радну „gnunet-helper-nat-server“\n"
+
+#: src/nat/nat_auto.c:482
+msgid "gnunet-helper-nat-client found, enabling it\n"
+msgstr "нађох „gnunet-helper-nat-client“, омогућавам је\n"
+
+#: src/nat/nat_auto.c:483
+msgid "gnunet-helper-nat-client not found or behind NAT, disabling it\n"
+msgstr "нисам нашао „gnunet-helper-nat-client“ или иза НАТ-а, искључујем је\n"
+
+#: src/nat/nat.c:867
+#, c-format
+msgid "gnunet-helper-nat-server generated malformed address `%s'\n"
+msgstr "„gnunet-helper-nat-server“ је створила лошу адресу „%s“\n"
+
+#: src/nat/nat.c:917
+#, c-format
+msgid "Failed to start %s\n"
+msgstr "Нисам успео да покренем „%s“\n"
+
+#: src/nat/nat.c:1205
+msgid "malformed"
+msgstr "лоше"
+
+#: src/nat/nat.c:1276 src/nat/nat.c:1288
+#, c-format
+msgid "Configuration requires `%s', but binary is not installed properly (SUID
bit not set). Option disabled.\n"
+msgstr "Подешавање захтева „%s“, али бинарно није исправно инсталирано („SUID“
бит није постављен). Опција је искључена.\n"
+
+#: src/nat/nat.c:1426
+msgid "Internal IP address not known, cannot use ICMP NAT traversal method\n"
+msgstr "Унутрашња ИП адреса није позната, не могу користити методу ИЦМП НАТ
попречника\n"
+
+#: src/nat/nat.c:1442
+#, c-format
+msgid "Running gnunet-helper-nat-client %s %s %u\n"
+msgstr "Извршавам „gnunet-helper-nat-client“ %s %s %u\n"
+
+#: src/nat/nat_mini.c:155
+msgid "no valid address was returned by `external-ip'"
+msgstr "ниједна исправна адреса није враћена „external-ip“-ом"
+
+#: src/nat/nat_mini.c:175
+msgid "`external-ip' command not found"
+msgstr "нисам нашао наредбу „external-ip“"
+
+#: src/nat/nat_mini.c:201
+msgid "`external-ip' command not found\n"
+msgstr "нисам нашао наредбу „external-ip“\n"
+
+#: src/nat/nat_mini.c:366
+msgid "Failed to run `upnpc` command"
+msgstr "Нисам успео да покренем наредбу „upnpc“"
+
+#: src/nat/nat_mini.c:512
+msgid "`upnpc' command took too long, process killed"
+msgstr "„upnpc“ наредби треба превише времена, процес је убијен"
+
+#: src/nat/nat_mini.c:540
+msgid "`upnpc' command failed to establish port mapping"
+msgstr "„upnpc“ наредба није успела да успостави мапирање прикључника"
+
+#: src/nat/nat_mini.c:604
+msgid "`upnpc' command not found\n"
+msgstr "нисам нашао „upnpc“ наредбу\n"
+
+#: src/nat/nat_mini.c:608
+msgid "`upnpc` command not found"
+msgstr "нисам нашао „upnpc“ наредбу"
+
+#: src/nat/nat_test.c:351
+msgid "Failed to connect to `gnunet-nat-server'\n"
+msgstr "Нисам успео да се повежем на „gnunet-nat-server“\n"
+
+#: src/nat/nat_test.c:423
+#, c-format
+msgid "Failed to create listen socket bound to `%s' for NAT test: %s\n"
+msgstr "Нисам успео да направим свезу прикључнице ослушкивања ка „%s“ за НАТ
тест: %s\n"
+
+#: src/nse/gnunet-nse.c:117
+msgid "NSE service is not running\n"
+msgstr "НСЕ услуга није покренута\n"
+
+#: src/nse/gnunet-nse.c:122
+msgid "Error while checking if NSE service is running or not\n"
+msgstr "Грешка приликом проверавања да ли НСЕ услуга ради или не\n"
+
+#: src/nse/gnunet-nse.c:168
+msgid "Show network size estimates from NSE service."
+msgstr "Показује процене величине мреже из НСЕ услуге."
+
+#: src/nse/gnunet-nse-profiler.c:858
+msgid "limit to the number of connections to NSE services, 0 for none"
+msgstr "ограничење броја веза на НСЕ услуге, 0 за ништа"
+
+#: src/nse/gnunet-nse-profiler.c:861
+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 "назив датотеке за записивање главних резултата"
+
+#: src/nse/gnunet-nse-profiler.c:870
+msgid "Number of peers to run in each round, separated by commas"
+msgstr "Број парњака за покретање у свакој рунди, раздвојени зарезима"
+
+#: src/nse/gnunet-nse-profiler.c:876
+msgid "delay between rounds"
+msgstr "застој између рунди"
+
+#: src/nse/gnunet-nse-profiler.c:885
+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
+msgid "Value is too large.\n"
+msgstr "Вредност је превелика.\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:215
+#, c-format
+msgid "Removing expired address of transport `%s'\n"
+msgstr "Уклањам истеклу адресу преноса „%s“\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:352
+#, c-format
+msgid "Failed to parse HELLO in file `%s': %s\n"
+msgstr "Нисам успео да обрадим „HELLO“ у датотеци „%s“: %s\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:371
+#: src/peerinfo/gnunet-service-peerinfo.c:388
+#, c-format
+msgid "Failed to parse HELLO in file `%s'\n"
+msgstr "Нисам успео да обрадим „HELLO“ у датотеци „%s“\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:466
+msgid "# peers known"
+msgstr "# парњака је познато"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:503
+#, c-format
+msgid "File `%s' in directory `%s' does not match naming convention.
Removed.\n"
+msgstr "Датотека „%s“ у директоријуму „%s“ не одговара договору именовања.
Уклоњена је.\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:653
+#, c-format
+msgid "Scanning directory `%s'\n"
+msgstr "Скенирам директоријум „%s“\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:658
+#, c-format
+msgid "Still no peers found in `%s'!\n"
+msgstr "Још увек нисам нашао парњаке у „%s“!\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:994
+#, c-format
+msgid "Cleaning up directory `%s'\n"
+msgstr "Чистим директоријум „%s“\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:1287
+#, c-format
+msgid "Importing HELLOs from `%s'\n"
+msgstr "Увозим „HELLO“-е из „%s“\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:1298
+msgid "Skipping import of included HELLOs\n"
+msgstr "Прескачем увоз укључених „HELLO“-а\n"
+
+#: src/peerinfo/peerinfo_api.c:236
+msgid "aborted due to explicit disconnect request"
+msgstr "прекинуто услед изричитог захтева прекида везе"
+
+#: src/peerinfo/peerinfo_api.c:356
+msgid "failed to transmit request (service down?)"
+msgstr "нисам успео да пренесем захтев (услуга је пала?)"
+
+#: src/peerinfo/peerinfo_api.c:506
+msgid "Failed to receive response from `PEERINFO' service."
+msgstr "Нисам успео да примим одговор са услуге „PEERINFO“."
+
+#: 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
+msgid "Received invalid message from `PEERINFO' service."
+msgstr "Примих неисправну поруку са услуге „PEERINFO“."
+
+#: src/peerinfo/peerinfo_api.c:678
+msgid "Timeout transmitting iteration request to `PEERINFO' service."
+msgstr "Истекло је време преношења захтева понављања ка услузи
„ПОДАЦИ_ПАРЊАКА“."
+
+#: src/peerinfo/peerinfo_api_notify.c:268
+#, c-format
+msgid "Could not connect to `%s' service.\n"
+msgstr "Не могу да се повежем са „%s“ услугом.\n"
+
+#: src/peerinfo-tool/gnunet-peerinfo.c:232
+#, c-format
+msgid "%sPeer `%s'\n"
+msgstr "%sПарњак „%s“\n"
+
+#: src/peerinfo-tool/gnunet-peerinfo.c:239
+#, c-format
+msgid "\tExpires: %s \t %s\n"
+msgstr "\tИстиче: %s \t %s\n"
+
+#: src/peerinfo-tool/gnunet-peerinfo.c:428
+#, c-format
+msgid "Failure: Did not receive %s\n"
+msgstr "Неуспех: Нисам примио „%s“\n"
+
+#: src/peerinfo-tool/gnunet-peerinfo.c:436
+#, c-format
+msgid "Failure: Received invalid %s\n"
+msgstr "Неуспех: Примих неисправно „%s“\n"
+
+#: src/peerinfo-tool/gnunet-peerinfo.c:445
+#, c-format
+msgid "Failed to write HELLO with %u bytes to file `%s'\n"
+msgstr "Нисам успео да упишем „HELLO“ са %u бајта у датотеку „%s“\n"
+
+#: src/peerinfo-tool/gnunet-peerinfo.c:458
+#, c-format
+msgid "Wrote %s HELLO containing %u addresses with %u bytes to file `%s'\n"
+msgstr "Записах „%s HELLO“ које садржи %u адресе са %u бајта у датотеку „%s“\n"
+
+#: src/peerinfo-tool/gnunet-peerinfo.c:522
+#, c-format
+msgid "Failure adding HELLO: %s\n"
+msgstr "Неуспех додавања „HELLO“-а: %s\n"
+
+#: src/peerinfo-tool/gnunet-peerinfo.c:633
+#, c-format
+msgid "Service `%s' is not running, please start GNUnet\n"
+msgstr "Услуга „%s“ није покренута, покрените ГНУнет\n"
+
+#: src/peerinfo-tool/gnunet-peerinfo.c:654 src/util/gnunet-scrypt.c:224
+#, c-format
+msgid "Loading hostkey from `%s' failed.\n"
+msgstr "Учитавање кључа домаћина из „%s“ није успело.\n"
+
+#: src/peerinfo-tool/gnunet-peerinfo.c:745
+#, c-format
+msgid "I am peer `%s'.\n"
+msgstr "Ја сам парњак „%s“.\n"
+
+#: src/peerinfo-tool/gnunet-peerinfo.c:789
+msgid "don't resolve host names"
+msgstr "не разрешава називе домаћина"
+
+#: src/peerinfo-tool/gnunet-peerinfo.c:792
+msgid "output only the identity strings"
+msgstr "исписује само ниске идентитета"
+
+#: src/peerinfo-tool/gnunet-peerinfo.c:795
+msgid "include friend-only information"
+msgstr "укључује податке само-пријатељ"
+
+#: src/peerinfo-tool/gnunet-peerinfo.c:798
+msgid "output our own identity only"
+msgstr "исписује само наш лични идентитет"
+
+#: src/peerinfo-tool/gnunet-peerinfo.c:801
+msgid "list all known peers"
+msgstr "исписује све познате парњаке"
+
+#: src/peerinfo-tool/gnunet-peerinfo.c:804
+msgid "dump hello to file"
+msgstr "шаље „hello“ у датотеку"
+
+#: src/peerinfo-tool/gnunet-peerinfo.c:807
+msgid "also output HELLO uri(s)"
+msgstr "такође исписује „HELLO“ ури-је"
+
+#: src/peerinfo-tool/gnunet-peerinfo.c:810
+msgid "add given HELLO uri to the database"
+msgstr "додаје дату „HELLO“ путању у базу података"
+
+#: src/peerinfo-tool/gnunet-peerinfo.c:821
+msgid "Print information about peers."
+msgstr "Исписује податке о парњацима."
+
+#: src/peerinfo-tool/gnunet-peerinfo_plugins.c:105
+#: src/transport/gnunet-service-transport_plugins.c:128
+#, c-format
+msgid "Starting transport plugins `%s'\n"
+msgstr "Покрећем прикључке преноса „%s“\n"
+
+#: src/peerinfo-tool/gnunet-peerinfo_plugins.c:109
+#: src/transport/gnunet-service-transport_plugins.c:133
+#, c-format
+msgid "Loading `%s' transport plugin\n"
+msgstr "Учитавам „%s“ прикључак преноса\n"
+
+#: src/peerinfo-tool/gnunet-peerinfo_plugins.c:129
+#: src/transport/gnunet-service-transport_plugins.c:165
+#, c-format
+msgid "Failed to load transport plugin for `%s'\n"
+msgstr "Нисам успео да учитам прикључак преноса за „%s“\n"
+
+#: src/postgres/postgres.c:59
+#, c-format
+msgid "`%s:%s' failed at %s:%d with error: %s"
+msgstr "`%s:%s' није успело на %s:%d са грешком: %s"
+
+#: src/postgres/postgres.c:148
+#, c-format
+msgid "Unable to initialize Postgres: %s"
+msgstr "Не могу да покренем Постгрес: %s"
+
+#: src/psycstore/gnunet-service-psycstore.c:200
+msgid "Failed to store membership information!\n"
+msgstr "Нисам успео да сместим податке о чланству!\n"
+
+#: src/psycstore/gnunet-service-psycstore.c:224
+msgid "Failed to test membership!\n"
+msgstr "Нисам успео да тестирам чланство!\n"
+
+#: src/psycstore/gnunet-service-psycstore.c:246
+msgid "Failed to store fragment!\n"
+msgstr "Нисам успео да сместим делић!\n"
+
+#: src/psycstore/gnunet-service-psycstore.c:272
+msgid "Failed to get fragment!\n"
+msgstr "Нисам успео да добавим делић!\n"
+
+#: src/psycstore/gnunet-service-psycstore.c:299
+msgid "Failed to get message!\n"
+msgstr "Нисам успео да добавим поруку!\n"
+
+#: src/psycstore/gnunet-service-psycstore.c:328
+msgid "Failed to get message fragment!\n"
+msgstr "Нисам успео да добавим делић поруке!\n"
+
+#: src/psycstore/gnunet-service-psycstore.c:356
+msgid "Failed to get master counters!\n"
+msgstr "Нисам успео да добавим главне бројаче!\n"
+
+#: src/psycstore/gnunet-service-psycstore.c:392
+#: src/psycstore/gnunet-service-psycstore.c:465
+msgid "Tried to set invalid state variable name!\n"
+msgstr "Покушах да поставим назив променљиве неисправног стања!\n"
+
+#: src/psycstore/gnunet-service-psycstore.c:408
+msgid "Failed to begin modifying state!\n"
+msgstr "Нисам успео да започнем стање измене!\n"
+
+#: src/psycstore/gnunet-service-psycstore.c:431
+#, c-format
+msgid "Unknown operator: %c\n"
+msgstr "Непознат оператор: %c\n"
+
+#: src/psycstore/gnunet-service-psycstore.c:441
+msgid "Failed to end modifying state!\n"
+msgstr "Нисам успео да завршим стање измене!\n"
+
+#: src/psycstore/gnunet-service-psycstore.c:479
+msgid "Failed to begin synchronizing state!\n"
+msgstr "Нисам успео да започнем стање усклађивања!\n"
+
+#: src/psycstore/gnunet-service-psycstore.c:495
+msgid "Failed to end synchronizing state!\n"
+msgstr "Нисам успео да завршим стање усклађивања!\n"
+
+#: src/psycstore/gnunet-service-psycstore.c:515
+#: src/psycstore/gnunet-service-psycstore.c:534
+msgid "Failed to reset state!\n"
+msgstr "Нисам успео да повратим стање!\n"
+
+#: src/psycstore/gnunet-service-psycstore.c:557
+#: src/psycstore/gnunet-service-psycstore.c:608
+msgid "Tried to get invalid state variable name!\n"
+msgstr "Покушах да добавим назив променљиве неисправног стања!\n"
+
+#: src/psycstore/gnunet-service-psycstore.c:584
+#: src/psycstore/gnunet-service-psycstore.c:623
+msgid "Failed to get state variable!\n"
+msgstr "Нисам успео да добавим променљиву стања!\n"
+
+#: src/psycstore/plugin_psycstore_sqlite.c:60
+#, c-format
+msgid "`%s' failed at %s:%d with error: %s (%d)\n"
+msgstr "„%s“ није успело на %s:%d са грешком: %s (%d)\n"
+
+#: src/psycstore/plugin_psycstore_sqlite.c:253
+#, c-format
+msgid ""
+"Error preparing SQL query: %s\n"
+" %s\n"
+msgstr ""
+"Грешка припремања СКуЛ упита: %s\n"
+" %s\n"
+
+#: src/psycstore/plugin_psycstore_sqlite.c:276
+#, c-format
+msgid ""
+"Error executing SQL query: %s\n"
+" %s\n"
+msgstr ""
+"Грешка извршавања СКуЛ упита: %s\n"
+" %s\n"
+
+#: src/psycstore/plugin_psycstore_sqlite.c:1796
+msgid "SQLite database running\n"
+msgstr "База података СКуЛајта ради\n"
+
+#: src/pt/gnunet-daemon-pt.c:482
+msgid "Failed to pack DNS request. Dropping.\n"
+msgstr "Нисам успео да упакујем ДНС захтев. Одбацујем.\n"
+
+#: src/pt/gnunet-daemon-pt.c:488
+msgid "# DNS requests mapped to VPN"
+msgstr "# ДНС захтеви су мапирани у ВПН"
+
+#: src/pt/gnunet-daemon-pt.c:541
+msgid "# DNS records modified"
+msgstr "# ДНС записи су измењени"
+
+#: src/pt/gnunet-daemon-pt.c:717
+msgid "# DNS replies intercepted"
+msgstr "# ДНС одговори су пресретени"
+
+#: src/pt/gnunet-daemon-pt.c:723
+msgid "Failed to parse DNS request. Dropping.\n"
+msgstr "Нисам успео да обрадим ДНС захтев. Одбацујем.\n"
+
+#: src/pt/gnunet-daemon-pt.c:826
+msgid "# DNS requests dropped (timeout)"
+msgstr "# ДНС захтеви су одбачени (истекло је време)"
+
+#: src/pt/gnunet-daemon-pt.c:883
+msgid "# DNS requests intercepted"
+msgstr "# ДНС захтеви су пресретени"
+
+#: src/pt/gnunet-daemon-pt.c:888
+msgid "# DNS requests dropped (DNS mesh channel down)"
+msgstr "# ДНС захтеви су одбачени (ДНС меш канал је пао)"
+
+#: src/pt/gnunet-daemon-pt.c:896
+msgid "# DNS requests dropped (malformed)"
+msgstr "# ДНС захтеви су одбачени (лоши су)"
+
+#: src/pt/gnunet-daemon-pt.c:969
+msgid "# DNS replies received"
+msgstr "# ДНС одговори су примљени"
+
+#: src/pt/gnunet-daemon-pt.c:985
+msgid "# DNS replies dropped (too late?)"
+msgstr "# ДНС одговори су одбачени (прекасно је?)"
+
+#: src/pt/gnunet-daemon-pt.c:1261 src/pt/gnunet-daemon-pt.c:1270
+#: src/pt/gnunet-daemon-pt.c:1290 src/pt/gnunet-daemon-pt.c:1301
+#: src/pt/gnunet-daemon-pt.c:1310
+#, c-format
+msgid "Failed to connect to %s service. Exiting.\n"
+msgstr "Нисам успео да се повежем са „%s“ услугом. Излазим.\n"
+
+#: src/pt/gnunet-daemon-pt.c:1347
+msgid "Daemon to run to perform IP protocol translation to GNUnet"
+msgstr "Демон за покретање за обављање превода ИП протокола у ГНУнет"
+
+#: src/regex/gnunet-daemon-regexprofiler.c:270
+#: src/regex/gnunet-regex-simulation-profiler.c:659
+#, c-format
+msgid "%s service is lacking key configuration settings (%s). Exiting.\n"
+msgstr "„%s“ услузи недостају поставке подешавања кључа (%s). Излазим.\n"
+
+#: src/regex/gnunet-daemon-regexprofiler.c:380
+msgid "Daemon to announce regular expressions for the peer using mesh."
+msgstr "Демон за најаву регуларних израза за парњака који користи меш."
+
+#: src/regex/gnunet-regex-profiler.c:1288
+msgid "No configuration file given. Exiting\n"
+msgstr "Није дата датотека подешавања. Излазим\n"
+
+#: src/regex/gnunet-regex-profiler.c:1299
+msgid "Configuration option \"regex_prefix\" missing. Exiting\n"
+msgstr "Недостаје опција подешавања „regex_prefix“. Излазим\n"
+
+#: src/regex/gnunet-regex-profiler.c:1328
+#: src/regex/gnunet-regex-simulation-profiler.c:622
+#, c-format
+msgid "No policy directory specified on command line. Exiting.\n"
+msgstr "На линији наредби није наведен директоријум политике. Излазим.\n"
+
+#: src/regex/gnunet-regex-profiler.c:1334
+#: src/regex/gnunet-regex-simulation-profiler.c:629
+#, c-format
+msgid "Specified policies directory does not exist. Exiting.\n"
+msgstr "Наведени директоријум политике не постоји. Излазим.\n"
+
+#: src/regex/gnunet-regex-profiler.c:1341
+#, c-format
+msgid "No files found in `%s'\n"
+msgstr "Нисам нашао датотеке у „%s“\n"
+
+#: src/regex/gnunet-regex-profiler.c:1350
+msgid "No search strings file given. Exiting.\n"
+msgstr "Није дата датотека ниски претраге. Излазим.\n"
+
+#: src/regex/gnunet-regex-profiler.c:1370
+msgid "Error loading search strings. Exiting.\n"
+msgstr "Грешка учитавања ниски претраге. Излазим.\n"
+
+#: src/regex/gnunet-regex-profiler.c:1455
+msgid "name of the file for writing statistics"
+msgstr "назив датотеке за записивање статистике"
+
+#: src/regex/gnunet-regex-profiler.c:1458
+msgid "wait TIMEOUT before ending the experiment"
+msgstr "чека ВРЕМЕ_ИСТЕКА пре завршавања експеримента"
+
+#: src/regex/gnunet-regex-profiler.c:1461
+msgid "directory with policy files"
+msgstr "директоријум са датотекама политике"
+
+#: src/regex/gnunet-regex-profiler.c:1464
+msgid "name of file with input strings"
+msgstr "назив датотеке са улазним нискама"
+
+#: src/regex/gnunet-regex-profiler.c:1467
+msgid "name of file with hosts' names"
+msgstr "назив датотеке са називима домаћина"
+
+#: src/regex/gnunet-regex-profiler.c:1479
+msgid "Profiler for regex"
+msgstr "Профилатор за регуларни израз"
+
+#: src/regex/gnunet-regex-simulation-profiler.c:689
+msgid "name of the table to write DFAs"
+msgstr "назив табеле за уписивање ДФА-са"
+
+#: src/regex/gnunet-regex-simulation-profiler.c:692
+msgid "maximum path compression length"
+msgstr "највећа дужина сажимања путање"
+
+#: src/regex/gnunet-regex-simulation-profiler.c:705
+msgid "Profiler for regex library"
+msgstr "Профилатор за библиотеку регуларног израза"
+
+#: src/regex/regex_api.c:131
+#, c-format
+msgid "Regex `%s' is too long!\n"
+msgstr "Регуларни израз „%s“ је превелик!\n"
+
+#: src/revocation/gnunet-revocation.c:126
+#, c-format
+msgid "Key `%s' is valid\n"
+msgstr "Кључ „%s“ је исправан\n"
+
+#: src/revocation/gnunet-revocation.c:131
+#, c-format
+msgid "Key `%s' has been revoked\n"
+msgstr "Тастер „%s“ је опозван\n"
+
+#: src/revocation/gnunet-revocation.c:137
+msgid "Internal error\n"
+msgstr "Унутрашња грешка\n"
+
+#: src/revocation/gnunet-revocation.c:163
+#, c-format
+msgid "Key for ego `%s' is still valid, revocation failed (!)\n"
+msgstr "Кључ за его „%s“ још увек важи, опозивање није успело (!)\n"
+
+#: src/revocation/gnunet-revocation.c:168
+msgid "Revocation failed (!)\n"
+msgstr "Опозивање није успело (!)\n"
+
+#: src/revocation/gnunet-revocation.c:173
+#, c-format
+msgid "Key for ego `%s' has been successfully revoked\n"
+msgstr "Кључ за его „%s“ је успешно опозван\n"
+
+#: src/revocation/gnunet-revocation.c:178
+msgid "Revocation successful.\n"
+msgstr "Опозивање је успело.\n"
+
+#: src/revocation/gnunet-revocation.c:183
+msgid "Internal error, key revocation might have failed\n"
+msgstr "Унутрашња грешка, опозив кључа можда није успео\n"
+
+#: src/revocation/gnunet-revocation.c:294
+#, c-format
+msgid "Revocation certificate for `%s' stored in `%s'\n"
+msgstr "Уверење опозива за „%s“ је смештено у „%s“\n"
+
+#: src/revocation/gnunet-revocation.c:324
+#, c-format
+msgid "Ego `%s' not found.\n"
+msgstr "Нисам нашао его „%s“.\n"
+
+#: src/revocation/gnunet-revocation.c:345
+#, c-format
+msgid "Error: revocation certificate in `%s' is not for `%s'\n"
+msgstr "Грешка: уверење опозива у „%s“ није за „%s“\n"
+
+#: src/revocation/gnunet-revocation.c:365
+msgid "Revocation certificate ready\n"
+msgstr "Уверење опозива је спремно\n"
+
+#: src/revocation/gnunet-revocation.c:375
+msgid "Revocation certificate not ready, calculating proof of work\n"
+msgstr "Уверење опозива није спремно, израчунавам доказ о раду\n"
+
+#: src/revocation/gnunet-revocation.c:407
+#, c-format
+msgid "Public key `%s' malformed\n"
+msgstr "Јавни кључ „%s“ је лош\n"
+
+#: src/revocation/gnunet-revocation.c:421
+msgid "Testing and revoking at the same time is not allowed, only executing
test.\n"
+msgstr "Тестирање и опозивање у исто време није дозвољено, само тестирање
извршавам.\n"
+
+#: src/revocation/gnunet-revocation.c:441
+msgid "No filename to store revocation certificate given.\n"
+msgstr "Није дат назив датотеке за смештање уверења опозива.\n"
+
+#: src/revocation/gnunet-revocation.c:463
+#, c-format
+msgid "Failed to read revocation certificate from `%s'\n"
+msgstr "Нисам успео да прочитам уверење опозива из „%s“\n"
+
+#: src/revocation/gnunet-revocation.c:488
+msgid "No action specified. Nothing to do.\n"
+msgstr "Није наведена ниједна радња. Немам шта да радим.\n"
+
+#: src/revocation/gnunet-revocation.c:504
+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 "
+msgstr "опозива лични кључ придружен личном кључу са его НАЗИВОМ "
+
+#: src/revocation/gnunet-revocation.c:510
+msgid "actually perform revocation, otherwise we just do the precomputation"
+msgstr "заправо обавља опозив, у супротном само радимо предизрачунавање"
+
+#: src/revocation/gnunet-revocation.c:513
+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"
+msgstr "Двоструки опзив је примљен од парњака. Занемарено.\n"
+
+#: src/revocation/gnunet-service-revocation.c:434
+#, c-format
+msgid "Error computing revocation set union with %s\n"
+msgstr "Грешка прорачуна уније скупа опозивања са %s\n"
+
+#: src/revocation/gnunet-service-revocation.c:486
+msgid "SET service crashed, terminating revocation service\n"
+msgstr "Услуга ПОСТАВИ се урушила, окончавам услугу опозивања\n"
+
+#: src/revocation/gnunet-service-revocation.c:812
+msgid "Could not open revocation database file!"
+msgstr "Не могу да отворим датотеку базе података опозивања!"
+
+#: src/scalarproduct/gnunet-scalarproduct.c:225
+msgid "You must specify at least one message ID to check!\n"
+msgstr "Морате навести бар један ИБ поруке за проверу!\n"
+
+#: src/scalarproduct/gnunet-scalarproduct.c:232
+msgid "This program needs a session identifier for comparing vectors.\n"
+msgstr "Овом програму је потребан одредник сесије за поређење вектора.\n"
+
+#: src/scalarproduct/gnunet-scalarproduct.c:239
+msgid "Please give a session key for --input_key!\n"
+msgstr "Дајте кључ сесије за „--input_key“!\n"
+
+#: src/scalarproduct/gnunet-scalarproduct.c:251
+#, c-format
+msgid "Tried to set initiator mode, as peer ID was given. However, `%s' is not
a valid peer identifier.\n"
+msgstr "Покушах да поставим режим покретача, јер је ИБ парњака био дат. Било
како било, „%s“ није добар одредник парњака.\n"
+
+#: src/scalarproduct/gnunet-scalarproduct.c:278
+#: src/scalarproduct/gnunet-scalarproduct.c:314
+#, c-format
+msgid "Could not convert `%s' to int32_t.\n"
+msgstr "Не могу да претворим „%s“ у „int32_t“.\n"
+
+#: src/scalarproduct/gnunet-scalarproduct.c:286
+msgid "Need elements to compute the vectorproduct, got none.\n"
+msgstr "Потребни су елементи за израчунавање производа вектора, нисам добио
ниједан.\n"
+
+#: src/scalarproduct/gnunet-scalarproduct.c:346
+#, c-format
+msgid "Could not convert `%s' to integer.\n"
+msgstr "Не могу да претворим „%s“ у цео број.\n"
+
+#: src/scalarproduct/gnunet-scalarproduct.c:407
+msgid "A comma separated list of elements to compare as vector with our remote
peer."
+msgstr "Зарезом раздвојен списак елемената за поређење као вектора са нашим
удаљеним парњаком."
+
+#: src/scalarproduct/gnunet-scalarproduct.c:410
+msgid "A comma separated mask to select which elements should actually be
compared."
+msgstr "Зарезом раздвојена маска за бирање који елементи заправо требају бити
поређени."
+
+#: src/scalarproduct/gnunet-scalarproduct.c:413
+msgid "[Optional] peer to calculate our scalarproduct with. If this parameter
is not given, the service will wait for a remote peer to compute the request."
+msgstr "[Изборни] парњак са којим израчунавамо наш скаларни производ. Ако тај
параметар није дат, услуга ће чекати да удаљени парњак прорачуна захтев."
+
+#: src/scalarproduct/gnunet-scalarproduct.c:416
+msgid "Transaction ID shared with peer."
+msgstr "ИБ преноса дељеног са парњаком."
+
+#: src/scalarproduct/gnunet-scalarproduct.c:425
+msgid "Calculate the Vectorproduct with a GNUnet peer."
+msgstr "Израчунава Производ вектора са ГНУнет парњаком."
+
+#: src/scalarproduct/gnunet-service-scalarproduct.c:541
+#, c-format
+msgid "Client (%p) disconnected from us.\n"
+msgstr "Прекинута је веза клијента (%p) са нама.\n"
+
+#: src/scalarproduct/gnunet-service-scalarproduct.c:613
+#: src/scalarproduct/gnunet-service-scalarproduct.c:702
+#, c-format
+msgid "Could not send message to client (%p)!\n"
+msgstr "Не могу да пошаљем поруку клијенту (%p)!\n"
+
+#: src/scalarproduct/gnunet-service-scalarproduct.c:619
+#, c-format
+msgid "Sending session-end notification to client (%p) for session %s\n"
+msgstr "Шаљем обавештење о крају сесије клијенту (%p) за сесију %s\n"
+
+#: src/scalarproduct/gnunet-service-scalarproduct.c:712
+#, c-format
+msgid "Sent result to client (%p), this session (%s) has ended!\n"
+msgstr "Резултати су послати клијенту (%p), ова сесија (%s) је завршена!\n"
+
+#: src/scalarproduct/gnunet-service-scalarproduct.c:766
+#: src/scalarproduct/gnunet-service-scalarproduct.c:855
+msgid "Could not send service-response message via mesh!)\n"
+msgstr "Не могу да пошаљем поруку одговора услуге путем меша!)\n"
+
+#: src/scalarproduct/gnunet-service-scalarproduct.c:1028
+#, c-format
+msgid "Failed to communicate with `%s', scalar product calculation aborted.\n"
+msgstr "Нисам успео да разговарам са „%s“, прорачун скаларног производа је
прекинут.\n"
+
+#: src/scalarproduct/gnunet-service-scalarproduct.c:1099
+#: src/scalarproduct/gnunet-service-scalarproduct.c:1208
+msgid "Transmitting service request.\n"
+msgstr "Одашиљем захтев услуге.\n"
+
+#: src/scalarproduct/gnunet-service-scalarproduct.c:1108
+msgid "Could not send service-request multipart message to channel!\n"
+msgstr "Не могу да пошаљем вишеделовну поруку захтева услуге каналу!\n"
+
+#: src/scalarproduct/gnunet-service-scalarproduct.c:1147
+#, c-format
+msgid "Successfully created new channel to peer (%s)!\n"
+msgstr "Успешно је створен нови канал за парњака (%s)!\n"
+
+#: src/scalarproduct/gnunet-service-scalarproduct.c:1217
+msgid "Could not send message to channel!\n"
+msgstr "Не могу да пошаљем поруку на канал!\n"
+
+#: src/scalarproduct/gnunet-service-scalarproduct.c:1274
+msgid "Too short message received from client!\n"
+msgstr "Прекратка порука је примљена од клијента!\n"
+
+#: src/scalarproduct/gnunet-service-scalarproduct.c:1287
+msgid "Invalid message received from client, session information incorrect!\n"
+msgstr "Неисправна порука је примљена са клијента, подаци о сесији су
нетачни!\n"
+
+#: src/scalarproduct/gnunet-service-scalarproduct.c:1298
+#, c-format
+msgid "Duplicate session information received, cannot create new session with
key `%s'\n"
+msgstr "Двоструки подаци сесије су примљени, не могу да направим нову сесију
са кључем „%s“\n"
+
+#: src/scalarproduct/gnunet-service-scalarproduct.c:1318
+#, c-format
+msgid "Got client-request-session with key %s, preparing channel to remote
service.\n"
+msgstr "Добих сесију захтева клијента са кључем %s, припремам канал за удљену
услугу.\n"
+
+#: src/scalarproduct/gnunet-service-scalarproduct.c:1354
+#, c-format
+msgid "Creating new channel for session with key %s.\n"
+msgstr "Стварам нови канал за сесију са кључем „%s“.\n"
+
+#: 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"
+msgstr "Добих сесију одговарача клијента са кључем %s и одговарајући скуп
сесије захтева услуге, обрађујем.\n"
+
+#: 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"
+msgstr "Добих сесију одговарача клијента са кључем %s али НЕ и одговарајући
скуп сесије захтева услуге, стављам елемент у ред за касније коришћење.\n"
+
+#: src/scalarproduct/gnunet-service-scalarproduct.c:1439
+#, c-format
+msgid "New incoming channel from peer %s.\n"
+msgstr "Нови долазни канал са парњака „%s“.\n"
+
+#: src/scalarproduct/gnunet-service-scalarproduct.c:1471
+#, c-format
+msgid "Peer disconnected, terminating session %s with peer (%s)\n"
+msgstr "Веза са парњаком је прекинута, окончавам сесију %s са парњаком (%s)\n"
+
+#: 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"
+msgstr "Добих сесију са кључем „%s“ и одговарајући скуп елемената,
обрађујем.\n"
+
+#: 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"
+msgstr "Добих сесију са кључем „%s“ без одговарајућег скупа елемената, стављам
у ред.\n"
+
+#: src/scalarproduct/gnunet-service-scalarproduct.c:1771
+#, c-format
+msgid "Got message with duplicate session key (`%s'), ignoring service
request.\n"
+msgstr "Добих поруку са двоструким кључем сесије („%s“), занемарујем захтев
сесије.\n"
+
+#: src/scalarproduct/gnunet-service-scalarproduct.c:2014
+msgid "Shutting down, initiating cleanup.\n"
+msgstr "Гасим, покрећем чишћење.\n"
+
+#: src/scalarproduct/gnunet-service-scalarproduct.c:2100
+msgid "Connect to MESH failed\n"
+msgstr "Повезивање са МЕШОМ није успело\n"
+
+#: src/scalarproduct/gnunet-service-scalarproduct.c:2104
+msgid "Mesh initialized\n"
+msgstr "Меш је покренут\n"
+
+#: src/scalarproduct/scalarproduct_api.c:246
+msgid "# SUC responder result messages received"
+msgstr "# примљене су поруке резултата „SUC“ одговарача"
+
+#: src/scalarproduct/scalarproduct_api.c:300
+msgid "# bytes sent to scalarproduct"
+msgstr "# бајтови су послати скаларном производу"
+
+#: src/scalarproduct/scalarproduct_api.c:345
+#: src/scalarproduct/scalarproduct_api.c:440
+msgid "Failed to connect to the scalarproduct service\n"
+msgstr "Нисам успео да се повежем са услугом скаларног производа\n"
+
+#: src/scalarproduct/scalarproduct_api.c:353
+#: src/scalarproduct/scalarproduct_api.c:448
+msgid "Failed to send a message to the statistics service\n"
+msgstr "Нисам успео да пошаљем поруку услузи статистике\n"
+
+#: src/scalarproduct/scalarproduct_api.c:387
+#: src/scalarproduct/scalarproduct_api.c:485
+msgid "Failed to send a message to the scalarproduct service\n"
+msgstr "Нисам успео да пошаљем поруку услузи скаларног производа\n"
+
+#: src/secretsharing/gnunet-secretsharing-profiler.c:538
+msgid "dkg start delay"
+msgstr "застој „dkg“ почетка"
+
+#: src/secretsharing/gnunet-secretsharing-profiler.c:541
+msgid "dkg timeout"
+msgstr "време истека „dkg“-а"
+
+#: src/secretsharing/gnunet-secretsharing-profiler.c:544
+msgid "threshold"
+msgstr "осетљивост"
+
+#: src/secretsharing/gnunet-secretsharing-profiler.c:547
+msgid "also profile decryption"
+msgstr "такође опис профила"
+
+#: src/set/gnunet-service-set.c:1431
+msgid "Could not connect to mesh service\n"
+msgstr "Не могу да се повежем са меш услугом\n"
+
+#: src/set/gnunet-set-ibf-profiler.c:221
+msgid "number of element in set A-B"
+msgstr "број елемената у скупу A-B"
+
+#: src/set/gnunet-set-ibf-profiler.c:224
+msgid "number of element in set B-A"
+msgstr "број елемената у скупу B-A"
+
+#: src/set/gnunet-set-ibf-profiler.c:227
+msgid "number of common elements in A and B"
+msgstr "број заједничких елемената у A и B"
+
+#: src/set/gnunet-set-ibf-profiler.c:230
+msgid "hash num"
+msgstr "хеш број"
+
+#: src/set/gnunet-set-ibf-profiler.c:233
+msgid "ibf size"
+msgstr "„ibf“ величина"
+
+#: src/set/gnunet-set-profiler.c:295
+msgid "oeration to execute"
+msgstr "операција за извршавање"
+
+#: src/statistics/gnunet-service-statistics.c:280
+#, c-format
+msgid "Loading %llu bytes of statistics from `%s'\n"
+msgstr "Учитавам %llu бајта статистике из „%s“\n"
+
+#: src/statistics/gnunet-service-statistics.c:346
+#, c-format
+msgid "Wrote %llu bytes of statistics to `%s'\n"
+msgstr "Записујем %llu бајта статистике у „%s“\n"
+
+#: src/statistics/gnunet-statistics.c:140
+msgid "Failed to obtain statistics.\n"
+msgstr "Нисам успео да добијем статистику.\n"
+
+#: src/statistics/gnunet-statistics.c:142
+#, c-format
+msgid "Failed to obtain statistics from host `%s:%llu'\n"
+msgstr "Нисам успео да добијем статистику од домаћина „%s:%llu“\n"
+
+#: src/statistics/gnunet-statistics.c:189
+msgid "Missing argument: subsystem \n"
+msgstr "Недостаје аргумент: подсистем \n"
+
+#: src/statistics/gnunet-statistics.c:195
+msgid "Missing argument: name\n"
+msgstr "Недостаје аргумент: назив\n"
+
+#: src/statistics/gnunet-statistics.c:226
+#, c-format
+msgid "No subsystem or name given\n"
+msgstr "Није дат подсистем или назив\n"
+
+#: src/statistics/gnunet-statistics.c:234
+#, c-format
+msgid "Failed to initialize watch routine\n"
+msgstr "Нисам успео да покренем рутину гледања\n"
+
+#: src/statistics/gnunet-statistics.c:261
+#, c-format
+msgid "Trying to connect to remote host, but service `%s' is not running\n"
+msgstr "Покушавам да се повежем са удаљеним домаћином, али услуга „%s“ није
покренута\n"
+
+#: src/statistics/gnunet-statistics.c:269
+#, c-format
+msgid "A port is required to connect to host `%s'\n"
+msgstr "Потребан је прикључник за повезивање са домаћином „%s“\n"
+
+#: src/statistics/gnunet-statistics.c:276
+#, c-format
+msgid "A port has to be between 1 and 65535 to connect to host `%s'\n"
+msgstr "Прикључник треба бити између 1 и 65535 за повезивање са домаћином
„%s“\n"
+
+#: src/statistics/gnunet-statistics.c:308
+#, c-format
+msgid "Invalid argument `%s'\n"
+msgstr "Неисправан аргумент „%s“\n"
+
+#: src/statistics/gnunet-statistics.c:334
+msgid "limit output to statistics for the given NAME"
+msgstr "ограничава излаз на статистику за дати НАЗИВ"
+
+#: src/statistics/gnunet-statistics.c:337
+msgid "make the value being set persistent"
+msgstr "чини да вредност бива постављена трајном"
+
+#: src/statistics/gnunet-statistics.c:340
+msgid "limit output to the given SUBSYSTEM"
+msgstr "ограничава излаз на дати ПОДСИСТЕМ"
+
+#: src/statistics/gnunet-statistics.c:343
+msgid "just print the statistics value"
+msgstr "само исписује вредност статистике"
+
+#: src/statistics/gnunet-statistics.c:346
+msgid "watch value continuously"
+msgstr "гледа вредност непрекидно"
+
+#: src/statistics/gnunet-statistics.c:349
+msgid "connect to remote host"
+msgstr "повезује се са удаљеним домаћином"
+
+#: src/statistics/gnunet-statistics.c:352
+msgid "port for remote host"
+msgstr "прикључник за удаљеног домаћина"
+
+#: src/statistics/gnunet-statistics.c:364
+msgid "Print statistics about GNUnet operations."
+msgstr "Исписује статистику о ГНУнет радњама."
+
+#: src/statistics/statistics_api.c:519
+msgid "Could not save some persistent statistics\n"
+msgstr "Не могу да сачувам нешто од трајне статистике\n"
+
+#: src/statistics/statistics_api.c:1090
+msgid "Failed to receive acknowledgement from statistics service, some
statistics might have been lost!\n"
+msgstr "Нисам успео да примим потврду од услуге статистике, неке статистике
могу бити изгубљене!\n"
+
+#: src/testbed/generate-underlay-topology.c:223
+msgid "Need atleast 2 arguments\n"
+msgstr "Потребна су најмање 2 аргумента\n"
+
+#: src/testbed/generate-underlay-topology.c:228
+msgid "Database filename missing\n"
+msgstr "Недостаје назив датотеке базе података\n"
+
+#: src/testbed/generate-underlay-topology.c:235
+msgid "Topology string missing\n"
+msgstr "Ниска размештаја недостаје\n"
+
+#: src/testbed/generate-underlay-topology.c:240
+#, c-format
+msgid "Invalid topology: %s\n"
+msgstr "Неисправан размештај: %s\n"
+
+#: src/testbed/generate-underlay-topology.c:252
+#, c-format
+msgid "An argument is missing for given topology `%s'\n"
+msgstr "Недостаје аргумент за дати размештај „%s“\n"
+
+#: src/testbed/generate-underlay-topology.c:258
+#, c-format
+msgid "Invalid argument `%s' given as topology argument\n"
+msgstr "Неисправан аргумент „%s“ је дат као аргумент размештаја\n"
+
+#: src/testbed/generate-underlay-topology.c:266
+#, c-format
+msgid "Filename argument missing for topology `%s'\n"
+msgstr "Аргумент назива датотеке недостаје за размештај „%s“\n"
+
+#: src/testbed/generate-underlay-topology.c:280
+#, c-format
+msgid "Second argument for topology `%s' is missing\n"
+msgstr "Други аргумент за размештај „%s“ недостаје\n"
+
+#: src/testbed/generate-underlay-topology.c:286
+#, c-format
+msgid "Invalid argument `%s'; expecting unsigned int\n"
+msgstr "Неисправан аргумент „%s“; очекујем цео број без знака\n"
+
+#: src/testbed/generate-underlay-topology.c:335
+#: src/testbed/gnunet-testbed-profiler.c:293
+msgid "create COUNT number of peers"
+msgstr "ствара УКУПНОСТ број парњака"
+
+#: src/testbed/generate-underlay-topology.c:344
+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"
+"\t LINE\n"
+"\t RING\n"
+"\t RANDOM <num_rnd_links>\n"
+"\t SMALL_WORLD <num_rnd_links>\n"
+"\t SMALL_WORLD_RING <num_rnd_links>\n"
+"\t CLIQUE\n"
+"\t 2D_TORUS\n"
+"\t SCALE_FREE <cap> <m>\n"
+"\t FROM_FILE <filename>\n"
+"TOPOOPTS:\n"
+"\t num_rnd_links: The number of random links\n"
+"\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"
+msgstr ""
+"Ствара СКуЛајт3 базу података која представља дати основни размештај.\n"
+"Коришћење: gnunet-underlay-topology [ОПЦИЈЕ] db-filename TOPO [ТОПООПЦИЈЕ]\n"
+"Следеће опције су доступне за „TOPO“ за којима следе ТОПООПЦИЈЕ ако су
примењиве:\n"
+"\t LINE\n"
+"\t RING\n"
+"\t RANDOM <num_rnd_links>\n"
+"\t SMALL_WORLD <num_rnd_links>\n"
+"\t SMALL_WORLD_RING <num_rnd_links>\n"
+"\t CLIQUE\n"
+"\t 2D_TORUS\n"
+"\t SCALE_FREE <cap> <m>\n"
+"\t FROM_FILE <filename>\n"
+"TOPOOPTS:\n"
+"\t num_rnd_links: Број насумичних веза\n"
+"\t cap: највећи број веза које чвор може да има\n"
+"\t m: број веза које чвор треба да има приликом придруживања мрежи\n"
+"\t filename: путања датотеке која садржи податке о размештају\n"
+"НАПОМЕНА: формат горе поменуте датотеке је описан овде:
https://www.gnunet.org/content/topology-file-format\n"
+
+#: src/testbed/gnunet-daemon-latency-logger.c:325
+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"
+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
+#, c-format
+msgid "Incorrect hostkey file format: %s\n"
+msgstr "Нетачан формат датотеке кључа домаћина: %s\n"
+
+#: src/testbed/gnunet-daemon-testbed-underlay.c:474
+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"
+msgstr "Не могу да отворим „%s“ за писање статистике учитавања. Не записујем
у дневник статистику учитавања\n"
+
+#: src/testbed/gnunet-service-testbed_peers.c:1015
+msgid "Misconfiguration (can't connect to the ARM service)"
+msgstr "Лоше подешавање (не могу да се повежем на АУР услугу)"
+
+#: src/testbed/gnunet-service-testbed_peers.c:1021
+msgid "Request doesn't fit into a message"
+msgstr "Захтев не стаје у поруку"
+
+#: src/testbed/gnunet-service-testbed_peers.c:1059
+#, c-format
+msgid "%s service can't be started because ARM is shutting down"
+msgstr "„%s“ услуга се не може покренути јер се АУР гаси"
+
+#: src/testbed/gnunet_testbed_mpi_spawn.c:125
+msgid "Waiting for child to exit.\n"
+msgstr "Чекам на пород да изађе.\n"
+
+#: src/testbed/gnunet_testbed_mpi_spawn.c:247
+#, c-format
+msgid "Spawning process `%s'\n"
+msgstr "Умножавам процес „%s“\n"
+
+#: src/testbed/gnunet-testbed-profiler.c:267
+#, c-format
+msgid "Exiting as the number of peers is %u\n"
+msgstr "Излазим јер је број парњака %u\n"
+
+#: 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"
+msgstr "покреће профајлера у не-дејственом режиму у коме над поставком пробног
места профајлер не чека на притисак тастера већ наставља да ради све док се не
прими сигнал окончања"
+
+#: src/testbed/testbed_api_hosts.c:415
+#, c-format
+msgid "Hosts file %s not found\n"
+msgstr "Нисам нашао датотеку домаћина „%s“\n"
+
+#: src/testbed/testbed_api_hosts.c:423
+#, c-format
+msgid "Hosts file %s has no data\n"
+msgstr "Датотека домаћина „%s“ нема података\n"
+
+#: src/testbed/testbed_api_hosts.c:430
+#, c-format
+msgid "Hosts file %s cannot be read\n"
+msgstr "Не могу да прочитам датотеку домаћина „%s“\n"
+
+#: src/testbed/testbed_api_hosts.c:570
+#, c-format
+msgid "The function %s is only available when compiled with (--with-ll)\n"
+msgstr "Функција „%s“ је доступна само када је преведена са (--with-ll)\n"
+
+#: src/testbed/testbed_api_hosts.c:1586
+#, c-format
+msgid "Adding host %u failed with error: %s\n"
+msgstr "Додавање домаћина %u није успело са грешком: %s\n"
+
+#: src/testbed/testbed_api_testbed.c:819
+msgid "Linking controllers failed. Exiting"
+msgstr "Повезивање контролера није успело. Излазим"
+
+#: src/testbed/testbed_api_testbed.c:988
+#, c-format
+msgid "Host registration failed for a host. Error: %s\n"
+msgstr "Регистрација домаћина није успела за домаћина. Грешка: %s\n"
+
+#: src/testbed/testbed_api_testbed.c:1054
+msgid "Controller crash detected. Shutting down.\n"
+msgstr "Урушавање контролера је откривено. Гасим се.\n"
+
+#: src/testbed/testbed_api_testbed.c:1143
+#, c-format
+msgid "Host %s cannot start testbed\n"
+msgstr "Домаћин „%s“ не може да покрене пробно место\n"
+
+#: src/testbed/testbed_api_testbed.c:1147
+msgid "Testbed cannot be started on localhost\n"
+msgstr "Пробно место се не може покренути на локалном домаћину\n"
+
+#: src/testbed/testbed_api_testbed.c:1185
+msgid "Cannot start the master controller"
+msgstr "Не могу да покренем главног контролора"
+
+#: src/testbed/testbed_api_testbed.c:1203
+msgid "Shutting down testbed due to timeout while setup.\n"
+msgstr "Гасим пробно место због истека времена приликом подешавања.\n"
+
+#: src/testbed/testbed_api_testbed.c:1263
+msgid "No hosts loaded from LoadLeveler. Need at least one host\n"
+msgstr "Ниједан домаћин није учитан из „LoadLeveler“-а. Потребан је барем
један домаћин\n"
+
+#: src/testbed/testbed_api_testbed.c:1275
+msgid "No hosts loaded. Need at least one host\n"
+msgstr "Ниједан домаћин није учитан. Потребан је барем један домаћин\n"
+
+#: src/testbed/testbed_api_testbed.c:1299
+msgid "Specified topology must be supported by testbed"
+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'"
+msgstr "Највећи број ивица које парњак може имати у слободном размештају
лествице не може бити већи од %u. Дато је „%s = %llu“"
+
+#: 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'"
+msgstr "Број ивица које се могу успоставити приликом додавања новог чвора у
слободном размештају лествице не може бити већи од %u. Дато је „%s = %llu“"
+
+#: src/testbed/testbed_api_topology.c:960
+#, c-format
+msgid "Topology file %s not found\n"
+msgstr "Нисам нашао датотеку размештаја „%s“\n"
+
+#: src/testbed/testbed_api_topology.c:966
+#, c-format
+msgid "Topology file %s has no data\n"
+msgstr "Датотека размештаја „%s“ нема података\n"
+
+#: src/testbed/testbed_api_topology.c:973
+#, c-format
+msgid "Topology file %s cannot be read\n"
+msgstr "Не могу да прочитам датотеку размештаја „%s“\n"
+
+#: src/testbed/testbed_api_topology.c:995
+#, c-format
+msgid "Failed to read peer index from toology file: %s"
+msgstr "Нисам успео да прочитам индекс парњака из датотеке размештаја: %s"
+
+#: src/testbed/testbed_api_topology.c:1004
+#: src/testbed/testbed_api_topology.c:1028
+#, c-format
+msgid "Value in given topology file: %s out of range\n"
+msgstr "Вредност у датој датотеци размештаја: „%s“ је ван опсега\n"
+
+#: src/testbed/testbed_api_topology.c:1010
+#: src/testbed/testbed_api_topology.c:1034
+#, c-format
+msgid "Failed to read peer index from topology file: %s"
+msgstr "Нисам успео да прочитам индекс парњака из датотеке размештаја: %s"
+
+#: src/testbed/testbed_api_topology.c:1016
+#: src/testbed/testbed_api_topology.c:1040
+msgid "Topology file needs more peers than given ones\n"
+msgstr "Датотеци размештаја је потребно више парњака од једног датог\n"
+
+#: src/testbed/testbed_api_topology.c:1074
+#, c-format
+msgid "Ignoring to connect peer %u to peer %u\n"
+msgstr "Занемарујем да повежем парњака %u са парњаком %u\n"
+
+#: src/testing/gnunet-testing.c:173
+#, c-format
+msgid "Could not extract hostkey %u (offset too large?)\n"
+msgstr "Не могу да извучем кључ домаћина %u (померај је превелик?)\n"
+
+#: src/testing/gnunet-testing.c:258
+#, c-format
+msgid "Unknown command, use 'q' to quit or 'r' to restart peer\n"
+msgstr "Непозната наредба, користите „q“ да прекинете или „r“ да поново
покренете парњака\n"
+
+#: src/testing/gnunet-testing.c:355
+msgid "create unique configuration files"
+msgstr "ствара јединствене датотеке подешавања"
+
+#: src/testing/gnunet-testing.c:357
+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"
+msgstr "број јединствених датотека подешавања за стварање, или број кључа
домаћина за извлачење"
+
+#: src/testing/gnunet-testing.c:361
+msgid "configuration template"
+msgstr "шаблон подешавања"
+
+#: src/testing/gnunet-testing.c:363
+msgid "run the given service, wait on stdin for 'r' (restart) or 'q' (quit)"
+msgstr "покреће дату услугу, чека на стандардном улазу за „r“ (поновно
покретање) или „q“ (излази)"
+
+#: src/testing/gnunet-testing.c:376
+msgid "Command line tool to access the testing library"
+msgstr "Алат линије наредби за приезуп библиотеци тестирања"
+
+#: src/testing/list-keys.c:90
+msgid "list COUNT number of keys"
+msgstr "исписује УКУПНОСТ број парњака"
+
+#: src/testing/list-keys.c:93
+msgid "skip COUNT number of keys in the beginning"
+msgstr "прескаче УКУПНОСТ број кључева на почетку"
+
+#: src/testing/testing.c:277
+#, c-format
+msgid "Hostkeys file not found: %s\n"
+msgstr "Нисам нашао датотеку кључева домаћина: %s\n"
+
+#: src/testing/testing.c:718
+#, c-format
+msgid "Key number %u does not exist\n"
+msgstr "Број кључа %u не постоји\n"
+
+#: 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"
+msgstr "Покушали сте да направите пробно место са више од %u домаћина. Прво
пре свега израчунајте више кључева домаћина.\n"
+
+#: src/testing/testing.c:1166
+#, c-format
+msgid "Failed to initialize hostkey for peer %u\n"
+msgstr "Нисам успео да покренем кључ домаћина за парњака %u\n"
+
+#: src/testing/testing.c:1176
+msgid "PRIVATE_KEY option in PEER section missing in configuration\n"
+msgstr "опција „PRIVATE_KEY“ у одељку „PEER“ недостаје у подешавањима\n"
+
+#: src/testing/testing.c:1189
+msgid "Failed to create configuration for peer (not enough free ports?)\n"
+msgstr "Нисам успео да направим подешавање за парњака (нема довољно слободних
прикључника?)\n"
+
+#: src/testing/testing.c:1203
+#, c-format
+msgid "Cannot open hostkey file `%s': %s\n"
+msgstr "Не могу да отворим датотеку кључа домаћина „%s“: %s\n"
+
+#: src/testing/testing.c:1215
+#, c-format
+msgid "Failed to write hostkey file for peer %u: %s\n"
+msgstr "Нисам успео да запишем датотеку кључа домаћина за парњака %u: %s\n"
+
+#: src/testing/testing.c:1240
+#, c-format
+msgid "Failed to write configuration file `%s' for peer %u: %s\n"
+msgstr "Нисам успео да запишем датотеку подешавања „%s“ за парњака %u: %s\n"
+
+#: src/testing/testing.c:1342
+#, c-format
+msgid "Failed to start `%s': %s\n"
+msgstr "Нисам успео да покренем „%s“: %s\n"
+
+#: src/testing/testing.c:1706
+#, c-format
+msgid "Failed to load configuration from %s\n"
+msgstr "Нисам успео да учитам подешавање за „%s“\n"
+
+#: src/topology/friends.c:100
+#, c-format
+msgid "Syntax error in FRIENDS file at offset %llu, skipping bytes `%.*s'.\n"
+msgstr "Грешка синтаксе у датотеци „FRIENDS“ на померају %llu, прескачем
бајтове „%.*s“.\n"
+
+#: src/topology/friends.c:154
+#, c-format
+msgid "Directory for file `%s' does not seem to be writable.\n"
+msgstr "Директоријум за датотеку „%s“ не изгледа да је уписив.\n"
+
+#: src/topology/gnunet-daemon-topology.c:255
+msgid "# peers blacklisted"
+msgstr "# парњаци су стављени на списак забрана"
+
+#: src/topology/gnunet-daemon-topology.c:388
+msgid "# connect requests issued to transport"
+msgstr "# захтеви везе су издати преносу"
+
+#: src/topology/gnunet-daemon-topology.c:728
+#: src/topology/gnunet-daemon-topology.c:813
+msgid "# friends connected"
+msgstr "# пријатељи су повезани"
+
+#: src/topology/gnunet-daemon-topology.c:993
+msgid "Failed to connect to core service, can not manage topology!\n"
+msgstr "Нисам успео да се повежем са услугом језгра, не могу да радим
размештајем!\n"
+
+#: src/topology/gnunet-daemon-topology.c:1022
+#, c-format
+msgid "Found myself `%s' in friend list (useless, ignored)\n"
+msgstr "Нађох себе „%s“ на списку пријатеља (некорисно, занемарујем)\n"
+
+#: src/topology/gnunet-daemon-topology.c:1029
+#, c-format
+msgid "Found friend `%s' in configuration\n"
+msgstr "Нађох пријатеља „%s“ у подешавањима\n"
+
+#: src/topology/gnunet-daemon-topology.c:1050
+msgid "Encountered errors parsing friends list!\n"
+msgstr "Наиђох на грешке током обраде списка пријатеља!\n"
+
+#: src/topology/gnunet-daemon-topology.c:1052
+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"
+msgstr "Наведено је мање пријатеља него што се захтева најмањим бројем
пријатеља. Повезаћу се само са пријатељима.\n"
+
+#: src/topology/gnunet-daemon-topology.c:1063
+msgid "More friendly connections required than target total number of
connections.\n"
+msgstr "Захтевано је више пријатељских веза него циљни укупан број веза.\n"
+
+#: src/topology/gnunet-daemon-topology.c:1094
+msgid "# HELLO messages received"
+msgstr "# „HELLO“ поруке су примљене"
+
+#: src/topology/gnunet-daemon-topology.c:1151
+msgid "# HELLO messages gossipped"
+msgstr "# „HELLO“ поруке су наклопљене"
+
+#: src/topology/gnunet-daemon-topology.c:1290
+msgid "GNUnet topology control (maintaining P2P mesh and F2F constraints)"
+msgstr "Контрола ГНУнет размештаја (задржавајући П2П меш и Ф2Ф ограничења)"
+
+#: src/transport/gnunet-service-transport_blacklist.c:271
+#, c-format
+msgid "Adding blacklisting entry for peer `%s'\n"
+msgstr "Додајем унос списка забрана за парњака „%s“\n"
+
+#: src/transport/gnunet-service-transport_blacklist.c:279
+#, c-format
+msgid "Adding blacklisting entry for peer `%s':`%s'\n"
+msgstr "Додајем унос списка забрана за парњака „%s“:„%s“\n"
+
+#: src/transport/gnunet-service-transport_blacklist.c:464
+#: src/transport/gnunet-service-transport_blacklist.c:745
+msgid "# disconnects due to blacklist"
+msgstr "# прекиди везе због списка забрана"
+
+#: src/transport/gnunet-service-transport.c:220
+msgid "# bytes payload discarded due to not connected peer"
+msgstr "# бајтови утовара су одбачени због не повезаног парњака"
+
+#: src/transport/gnunet-service-transport.c:424
+msgid "# bytes total received"
+msgstr "# укупно бајтова је примљено"
+
+#: src/transport/gnunet-service-transport.c:515
+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 "Не могу да добијем исправну везу за „%s“ %s (%s)\n"
+
+#: 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 "Адреса или сесија је непозната: нисам успео да својства за парњака
„%s“ прикључак „%s“ адресу „%s“ сесију %p\n"
+
+#: src/transport/gnunet-service-transport.c:1084
+msgid "Transport service is lacking key configuration settings. Exiting.\n"
+msgstr "Услузи преноса недостају поставке подешавања кључа. Излазим.\n"
+
+#: 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 "Одбацујем поруку врсте %u и величине %u, има %u/%u порука на чекању\n"
+
+#: src/transport/gnunet-service-transport_clients.c:439
+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 "Одбацујем контролну везу од парњака „%s“, а то нисам ја!\n"
+
+#: src/transport/gnunet-service-transport_clients.c:737
+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 "Списак забрана одбацује покушај повезивања са парњаком „%s“\n"
+
+#: src/transport/gnunet-service-transport_clients.c:776
+#, c-format
+msgid "Blacklist allows connection attempt to peer `%s'\n"
+msgstr "Списак забрана дозвољава покушај повезивања са парњаком „%s“\n"
+
+#: src/transport/gnunet-service-transport_clients.c:801
+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 "Примих поруку захтева повезивања за парњака „%s“\n"
+
+#: src/transport/gnunet-service-transport_clients.c:826
+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"
+msgstr "Примих поруку захтева прекида везе за парњака „%s“\n"
+
+#: src/transport/gnunet-service-transport_hello.c:181
+msgid "# refreshed my HELLO"
+msgstr "# освежих мој „HELLO“"
+
+#: src/transport/gnunet-service-transport_neighbours.c:1095
+msgid "# DISCONNECT messages sent"
+msgstr "# ПРЕКИНИ_ВЕЗУ поруке су послате"
+
+#: src/transport/gnunet-service-transport_neighbours.c:1220
+#: src/transport/gnunet-service-transport_neighbours.c:1629
+msgid "# bytes in message queue for other peers"
+msgstr "# бајтови у реду поруке за друге парњаке"
+
+#: src/transport/gnunet-service-transport_neighbours.c:1225
+msgid "# messages transmitted to other peers"
+msgstr "# поруке су пренесене другим парњацима"
+
+#: src/transport/gnunet-service-transport_neighbours.c:1230
+msgid "# transmission failures for messages to other peers"
+msgstr "# неуспеси преноса за поруке ка другим парњацима"
+
+#: src/transport/gnunet-service-transport_neighbours.c:1287
+msgid "# messages timed out while in transport queue"
+msgstr "# истекло је време порукама док су у реду преноса"
+
+#: src/transport/gnunet-service-transport_neighbours.c:1343
+msgid "# keepalives sent"
+msgstr "# одржавања у раду су послата"
+
+#: src/transport/gnunet-service-transport_neighbours.c:1376
+msgid "# KEEPALIVE messages discarded (peer unknown)"
+msgstr "# ОДРЖИ_У_РАДУ поруке су одбачене (парњак није познат)"
+
+#: src/transport/gnunet-service-transport_neighbours.c:1384
+msgid "# KEEPALIVE messages discarded (no session)"
+msgstr "# ОДРЖИ_У_РАДУ поруке су одбачене (нема сесије)"
+
+#: src/transport/gnunet-service-transport_neighbours.c:1431
+msgid "# KEEPALIVE_RESPONSE messages discarded (not connected)"
+msgstr "# ОДГОВОР_ОДРЖИ_У_РАДУ поруке су одбачене (нисам повезан)"
+
+#: src/transport/gnunet-service-transport_neighbours.c:1440
+msgid "# KEEPALIVE_RESPONSE messages discarded (not expected)"
+msgstr "# ОДГОВОР_ОДРЖИ_У_РАДУ поруке су одбачене (није очекиван)"
+
+#: src/transport/gnunet-service-transport_neighbours.c:1448
+msgid "# KEEPALIVE_RESPONSE messages discarded (address changed)"
+msgstr "# ОДГОВОР_ОДРЖИ_У_РАДУ поруке су одбачене (адреса је измењена)"
+
+#: src/transport/gnunet-service-transport_neighbours.c:1456
+msgid "# KEEPALIVE_RESPONSE messages discarded (wrong nonce)"
+msgstr "# ОДГОВОР_ОДРЖИ_У_РАДУ поруке су одбачене (погрешна тренутност)"
+
+#: src/transport/gnunet-service-transport_neighbours.c:1534
+msgid "# messages discarded due to lack of neighbour record"
+msgstr "# поруке су одбачене услед недостатка записа суседа"
+
+#: src/transport/gnunet-service-transport_neighbours.c:1568
+msgid "# bandwidth quota violations by other peers"
+msgstr "# повређивање квоте пропусног опсега од стране других парњака"
+
+#: src/transport/gnunet-service-transport_neighbours.c:1584
+msgid "# ms throttling suggested"
+msgstr "# ms пригушење се саветује"
+
+#: src/transport/gnunet-service-transport_neighbours.c:1678
+#, c-format
+msgid "Failed to send CONNECT message to peer `%s' using address `%s' session
%p\n"
+msgstr "Нисам успео да пошаљем поруку ПОВЕЖИ_СЕ парњаку „%s“ користећи адресу
„%s“ сесије %p\n"
+
+#: src/transport/gnunet-service-transport_neighbours.c:1705
+msgid "# Failed attempts to switch addresses (failed to send CONNECT CONT)"
+msgstr "# Нису успели покушаји за пребацивање адреса (нисам успео да пошаљем
УКУПНО ПОВЕЖИ_СЕ)"
+
+#: src/transport/gnunet-service-transport_neighbours.c:1751
+msgid "# SESSION_CONNECT messages sent"
+msgstr "# ПОВЕЗИВАЊЕ_СЕСИЈЕ поруке су послате"
+
+#: src/transport/gnunet-service-transport_neighbours.c:1767
+#, c-format
+msgid "Failed to transmit CONNECT message via plugin to %s\n"
+msgstr "Нисам успео да пренесем поруку ПОВЕЖИ_СЕ путем прикључка ка „%s“\n"
+
+#: src/transport/gnunet-service-transport_neighbours.c:1794
+msgid "# Failed attempts to switch addresses (failed to send CONNECT)"
+msgstr "# Нису успели покушаји за пребацивање адреса (нисам успео да пошаљем
ПОВЕЖИ_СЕ)"
+
+#: src/transport/gnunet-service-transport_neighbours.c:1844
+#, c-format
+msgid "Failed to send CONNECT_ACK message to peer `%s' using address `%s'
session %p\n"
+msgstr "Нисам успео да пошаљем поруку ПОВЕЖИ_АЦК парњаку „%s“ користећи адресу
„%s“ сесије %p\n"
+
+#: src/transport/gnunet-service-transport_neighbours.c:1899
+msgid "# CONNECT_ACK messages sent"
+msgstr "# ПОВЕЖИ_АЦК поруке су послате"
+
+#: src/transport/gnunet-service-transport_neighbours.c:1914
+#, c-format
+msgid "Failed to transmit CONNECT_ACK message via plugin to %s\n"
+msgstr "Нисам успео да пренесем поруку ПОВЕЖИ_АЦК путем прикључка ка „%s“\n"
+
+#: src/transport/gnunet-service-transport_neighbours.c:2192
+#, c-format
+msgid "Blacklisting disapproved to connect to peer `%s'\n"
+msgstr "Списак забрана није одобрио повезивање са парњаком „%s“\n"
+
+#: src/transport/gnunet-service-transport_neighbours.c:2312
+msgid "# CONNECT messages received"
+msgstr "# ПОВЕЖИ_СЕ поруке су примљене"
+
+#: src/transport/gnunet-service-transport_neighbours.c:2317
+#, c-format
+msgid "CONNECT request from peer `%s' ignored due impending shutdown\n"
+msgstr "ПОВЕЖИ_СЕ захтев са парњака „%s“ је занемарен због неминовног гашења\n"
+
+#: src/transport/gnunet-service-transport_neighbours.c:2590
+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"
+msgstr "# ПОВЕЖИ_АЦК поруке су примљене"
+
+#: src/transport/gnunet-service-transport_neighbours.c:3115
+msgid "# unexpected CONNECT_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)"
+msgstr "# неочекиване ПОВЕЖИ_АЦК поруке (нису спремне)"
+
+#: src/transport/gnunet-service-transport_neighbours.c:3176
+msgid "# unexpected CONNECT_ACK messages (waiting on ATS)"
+msgstr "# неочекиване ПОВЕЖИ_АЦК поруке (чекам на АТС)"
+
+#: src/transport/gnunet-service-transport_neighbours.c:3200
+msgid "# Successful attempts to switch addresses"
+msgstr "# Покушаји за пребацивање адреса су успели"
+
+#: src/transport/gnunet-service-transport_neighbours.c:3208
+msgid "# unexpected CONNECT_ACK messages (disconnecting)"
+msgstr "# неочекиване ПОВЕЖИ_АЦК поруке (прекидам везу)"
+
+#: src/transport/gnunet-service-transport_neighbours.c:3396
+msgid "# SESSION_ACK messages received"
+msgstr "# поруке СЕСИЈА_АЦК су примљене"
+
+#: src/transport/gnunet-service-transport_neighbours.c:3424
+msgid "# unexpected SESSION_ACK messages"
+msgstr "# неочекиване СЕСИЈА_АЦК поруке"
+
+#: src/transport/gnunet-service-transport_neighbours.c:3490
+msgid "# SET QUOTA messages ignored (no such peer)"
+msgstr "# ПОСТАВИ КВОТУ поруке су занемарене (нема таквог парњака)"
+
+#: src/transport/gnunet-service-transport_neighbours.c:3505
+msgid "# disconnects due to quota of 0"
+msgstr "# прекиди везе због квоте 0"
+
+#: src/transport/gnunet-service-transport_neighbours.c:3545
+msgid "# disconnect messages ignored (malformed)"
+msgstr "# поруке прекида везе су занемарене(лоше су)"
+
+#: src/transport/gnunet-service-transport_neighbours.c:3551
+msgid "# DISCONNECT messages received"
+msgstr "# ПРЕКИНИ_ВЕЗУ поруке су примљене"
+
+#: src/transport/gnunet-service-transport_neighbours.c:3560
+msgid "# disconnect messages ignored (timestamp)"
+msgstr "# поруке прекида везе су занемарене(временска ознака)"
+
+#: src/transport/gnunet-service-transport_neighbours.c:3687
+msgid "# disconnected from peer upon explicit request"
+msgstr "# прекинута је веза са парњаком услед изричитог захтева"
+
+#: src/transport/gnunet-service-transport_plugins.c:120
+msgid "Transport service is lacking NEIGHBOUR_LIMIT option.\n"
+msgstr "Услузи преноса недостаје опција ОГРАНИЧЕЊЕ_СУСЕДА.\n"
+
+#: 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
+#, c-format
+msgid "Missing function `%s' in transport plugin for `%s'\n"
+msgstr "Недостаје функција „%s“ у прикључку преноса за „%s“\n"
+
+#: src/transport/gnunet-service-transport_plugins.c:265
+#, c-format
+msgid "Did not load plugin `%s' due to missing functions\n"
+msgstr "Не учитавам прикључак „%s“ услед недостајућих функција\n"
+
+#: src/transport/gnunet-service-transport_validation.c:488
+msgid "# address records discarded"
+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"
+msgstr "Не преносим „%s“ са „%s“, порука је превелика (%u бајта!). Ово није
требало да се деси.\n"
+
+#: src/transport/gnunet-service-transport_validation.c:616
+msgid "# PING without HELLO messages sent"
+msgstr "# ПИНГ без „HELLO“ порука је послат"
+
+#: src/transport/gnunet-service-transport_validation.c:722
+msgid "# address revalidations started"
+msgstr "# поновно потврђивање адресе је започето"
+
+#: src/transport/gnunet-service-transport_validation.c:1011
+msgid "# PING message for different peer received"
+msgstr "# ПИНГ порука за различитог парњака је примљена"
+
+#: src/transport/gnunet-service-transport_validation.c:1062
+#, c-format
+msgid "Plugin `%s' not available, cannot confirm having this address\n"
+msgstr "Прикључак „%s“ није доступан, не могу да потврдим имајући ову адресу\n"
+
+#: src/transport/gnunet-service-transport_validation.c:1072
+msgid "# failed address checks during validation"
+msgstr "# неуспешне провере адресе за време потврђивања"
+
+#: src/transport/gnunet-service-transport_validation.c:1075
+#, c-format
+msgid "Address `%s' is not one of my addresses, not confirming PING\n"
+msgstr "Адреса „%s“ није једна од мојих адреса, не потврђујем ПИНГ\n"
+
+#: src/transport/gnunet-service-transport_validation.c:1083
+msgid "# successful address checks during validation"
+msgstr "# успешне провере адресе за време потврђивања"
+
+#: src/transport/gnunet-service-transport_validation.c:1095
+#, c-format
+msgid "Not confirming PING from peer `%s' with address `%s' since I cannot
confirm having this address.\n"
+msgstr "Не потврђујем ПИНГ од парњака „%s“ са адресом „%s“ јер не могу да
потврдим да имам ту адресу.\n"
+
+#: src/transport/gnunet-service-transport_validation.c:1103
+#, c-format
+msgid "Received a PING message with validation bug from `%s'\n"
+msgstr "Примих ПИНГ поруку са грешком потврђивања са „%s“\n"
+
+#: src/transport/gnunet-service-transport_validation.c:1157
+#, c-format
+msgid "Failed to create PONG signature for peer `%s'\n"
+msgstr "Нисам успео да направим ПОНГ потпис за парњака „%s“\n"
+
+#: src/transport/gnunet-service-transport_validation.c:1206
+msgid "# PONGs unicast via reliable transport"
+msgstr "# једноодредишни пренос ПОНГ-ова путем поузданог преноса"
+
+#: src/transport/gnunet-service-transport_validation.c:1215
+msgid "# PONGs multicast to all available addresses"
+msgstr "# вишеодредишни пренос ПОНГ-ова ка свим доступним адресама"
+
+#: src/transport/gnunet-service-transport_validation.c:1356
+msgid "# PONGs dropped, no matching pending validation"
+msgstr "# ПОНГ-ови су одбачени, нема одговарајућих потврђивања на чекању"
+
+#: src/transport/gnunet-service-transport_validation.c:1371
+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 "Потврђивање је примило нову „%s“ поруку за парњака „%s“ са величином
%u\n"
+
+#: src/transport/gnunet-service-transport_validation.c:1500
+#, c-format
+msgid "Adding `%s' without addresses for peer `%s'\n"
+msgstr "Додајем „%s“ без адреса за парњака „%s“\n"
+
+#: src/transport/gnunet-transport.c:367
+#, c-format
+msgid "Transmitted %llu bytes/s (%llu bytes in %s)\n"
+msgstr "Пренесох %llu бајта/сек (%llu бајта за %s)\n"
+
+#: src/transport/gnunet-transport.c:375
+#, c-format
+msgid "Received %llu bytes/s (%llu bytes in %s)\n"
+msgstr "Примих %llu бајта/сек (%llu бајта за %s)\n"
+
+#: src/transport/gnunet-transport.c:415
+#, c-format
+msgid "Failed to connect to `%s'\n"
+msgstr "Нисам успео да се повежем на „%s“\n"
+
+#: src/transport/gnunet-transport.c:428
+#, c-format
+msgid "Failed to resolve address for peer `%s'\n"
+msgstr "Нисам успео да решим адресу за парњака „%s“\n"
+
+#: src/transport/gnunet-transport.c:438
+msgid "Failed to list connections, timeout occured\n"
+msgstr "Нисам успео да испишем везе, дошло је до истека времена\n"
+
+#: src/transport/gnunet-transport.c:559
+#, c-format
+msgid ""
+"Peer `%s' %s %s\n"
+"\t%s%s\n"
+"\t%s%s\n"
+"\t%s%s\n"
+msgstr ""
+"Парњак „%s“ %s %s\n"
+"\t%s%s\n"
+"\t%s%s\n"
+"\t%s%s\n"
+
+#: src/transport/gnunet-transport.c:586
+#, c-format
+msgid "Peer `%s' %s `%s' \n"
+msgstr "Парњак „%s“ %s „%s“ \n"
+
+#: src/transport/gnunet-transport.c:712
+msgid "No transport plugins configured, peer will never communicate\n"
+msgstr "Нису подешени прикључци преноса, парњак неће никада комуницирати\n"
+
+#: src/transport/gnunet-transport.c:726
+#, c-format
+msgid "No port configured for plugin `%s', cannot test it\n"
+msgstr "Није подешен прикључник за прикључак „%s“, не могу да га тестирам\n"
+
+#: src/transport/gnunet-transport.c:789
+#, c-format
+msgid "Transmitting %u bytes to %s\n"
+msgstr "Преносим %u бајта ка %s\n"
+
+#: src/transport/gnunet-transport.c:810
+#, c-format
+msgid "Successfully connected to `%s'\n"
+msgstr "Успешно је успостављена веза са „%s“\n"
+
+#: src/transport/gnunet-transport.c:834
+#, c-format
+msgid "Successfully connected to `%s', starting to send benchmark data in %u
Kb blocks\n"
+msgstr "Успешно смо повезани са „%s“, почињем да шаљем податке оцењивања у
блоковима од %u Kb\n"
+
+#: src/transport/gnunet-transport.c:865
+#, c-format
+msgid "Successfully disconnected from `%s'\n"
+msgstr "Успешно је прекинута веза са „%s“\n"
+
+#: src/transport/gnunet-transport.c:888
+#, c-format
+msgid "Disconnected from peer `%s' while benchmarking\n"
+msgstr "Прекинута је веза са парњаком „%s“ за време оцењивања\n"
+
+#: src/transport/gnunet-transport.c:950
+#, c-format
+msgid "Received %u bytes from %s\n"
+msgstr "Примих %u бајта од „%s“\n"
+
+#: src/transport/gnunet-transport.c:975
+#, c-format
+msgid "Peer `%s': %s %s in state `%s' until %s\n"
+msgstr "Парњак „%s“: %s %s у стању „%s“ све до %s\n"
+
+#: src/transport/gnunet-transport.c:986
+#, c-format
+msgid "Peer `%s': %s %s\n"
+msgstr "Парњак „%s“: %s %s\n"
+
+#: src/transport/gnunet-transport.c:1197 src/transport/gnunet-transport.c:1222
+msgid "Failed to send connect request to transport service\n"
+msgstr "Нисам успео да пошаљем захтев за повезивање са услугом преноса\n"
+
+#: src/transport/gnunet-transport.c:1266
+#, c-format
+msgid "Multiple operations given. Please choose only one operation: %s, %s,
%s, %s, %s, %s\n"
+msgstr "Дато је више радњи. Изаберите само једну од: %s, %s, %s, %s, %s, %s\n"
+
+#: src/transport/gnunet-transport.c:1274
+#, c-format
+msgid "No operation given. Please choose one operation: %s, %s, %s, %s, %s,
%s\n"
+msgstr "Није дата радња. Изаберите једну од: %s, %s, %s, %s, %s, %s\n"
+
+#: 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
+msgid "Failed to connect to transport service\n"
+msgstr "Нисам успео да се повежем са услугом преноса\n"
+
+#: src/transport/gnunet-transport.c:1302 src/transport/gnunet-transport.c:1332
+#: src/transport/gnunet-transport.c:1362
+msgid "Failed to send request to transport service\n"
+msgstr "Нисам успео да пошаљем захтев услузи преноса\n"
+
+#: src/transport/gnunet-transport.c:1381
+msgid "Starting to receive benchmark data\n"
+msgstr "Почињем да примам податке оцењивања\n"
+
+#: src/transport/gnunet-transport.c:1465
+msgid "print information for all peers (instead of only connected peers )"
+msgstr "исписује податке за све парњаке (уместо само о повезаним парњацима )"
+
+#: src/transport/gnunet-transport.c:1468
+msgid "measure how fast we are receiving data from all peers (until CTRL-C)"
+msgstr "мери колико брзо примамо податке са свих парњака (све до КТРЛ-Ц)"
+
+#: src/transport/gnunet-transport.c:1471
+msgid "connect to a peer"
+msgstr "повезује се са парњаком"
+
+#: src/transport/gnunet-transport.c:1474
+msgid "disconnect to a peer"
+msgstr "прекида везу са парњаком"
+
+#: src/transport/gnunet-transport.c:1477
+msgid "print information for all pending validations "
+msgstr "исписује податке за сва потврђивања на чекању "
+
+#: src/transport/gnunet-transport.c:1480
+msgid "print information for all pending validations continously"
+msgstr "непрекидно исписује податке за сва потврђивања на чекању"
+
+#: src/transport/gnunet-transport.c:1483
+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)"
+msgstr "обезбеђује податке о свим догађајима повезивања и прекида везе
(непрекидно)"
+
+#: src/transport/gnunet-transport.c:1491
+msgid "do not resolve hostnames"
+msgstr "не разрешава називе домаћина"
+
+#: src/transport/gnunet-transport.c:1493
+msgid "peer identity"
+msgstr "идентитет парњака"
+
+#: src/transport/gnunet-transport.c:1495
+msgid "send data for benchmarking to the other peer (until CTRL-C)"
+msgstr "шаље податке за оцењивање другим парњацима (све до КТРЛ-Ц)"
+
+#: src/transport/gnunet-transport.c:1498
+msgid "test transport configuration (involves external server)"
+msgstr "тестира подешавање транспорта (призива спољни сервер)"
+
+#: src/transport/gnunet-transport.c:1507
+msgid "Direct access to transport service."
+msgstr "Непосредан приступ услузи преноса."
+
+#: src/transport/plugin_transport_bluetooth.c:621
+msgid "# Bluetooth ACKs sent"
+msgstr "# АЦК-ови блутута су послати"
+
+#: src/transport/plugin_transport_bluetooth.c:640
+msgid "# Bluetooth messages defragmented"
+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"
+msgstr "# Блутут сесије су додељене"
+
+#: src/transport/plugin_transport_bluetooth.c:837
+msgid "# Bluetooth message fragments sent"
+msgstr "# Делићи блутут поруке су послати"
+
+#: src/transport/plugin_transport_bluetooth.c:861
+msgid "# Bluetooth messages pending (with fragmentation)"
+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"
+msgstr "# Крајње тачке Блутут МАЦ-а су додељене"
+
+#: src/transport/plugin_transport_bluetooth.c:1307
+msgid "# HELLO messages received via Bluetooth"
+msgstr "# „HELLO“ поруке су примљене путем блутута"
+
+#: src/transport/plugin_transport_bluetooth.c:1331
+msgid "# fragments received via Bluetooth"
+msgstr "# делићи су примљени путем Блутута"
+
+#: src/transport/plugin_transport_bluetooth.c:1341
+msgid "# ACKs received via Bluetooth"
+msgstr "# АЦК-ови су примљени путем блутута"
+
+#: src/transport/plugin_transport_bluetooth.c:1401
+msgid "# Bluetooth DATA messages discarded due to CRC32 error"
+msgstr "# Поруке ПОДАТАКА блутута су одбачене услед „CRC32“ грешке"
+
+#: src/transport/plugin_transport_bluetooth.c:1512
+msgid "# DATA messages received via Bluetooth"
+msgstr "# поруке ПОДАТАКА су примљене путем блутута"
+
+#: src/transport/plugin_transport_bluetooth.c:1547
+msgid "# Bluetooth DATA messages processed"
+msgstr "# Поруке Блутут ПОДАТАКА су обрађене"
+
+#: src/transport/plugin_transport_bluetooth.c:1610
+msgid "# HELLO beacons sent via Bluetooth"
+msgstr "# „HELLO“ ознаке су послате путем Блутута"
+
+#: src/transport/plugin_transport_bluetooth.c:1723
+msgid "Bluetooth address with invalid size encountered\n"
+msgstr "Наишли смо на адресу блутута са неисправном величином\n"
+
+#: src/transport/plugin_transport_bluetooth.c:1923
+#, c-format
+msgid "Helper binary `%s' not SUID, cannot run bluetooth transport\n"
+msgstr "Извршна помоћника „%s“ није СУИБ, не могу да покренем блутут пренос\n"
+
+#: src/transport/plugin_transport_http_client.c:1622
+#, c-format
+msgid "Could not initialize curl multi handle, failed to start %s plugin!\n"
+msgstr "Не могу да покренем мулти ручку „curl“-а, нисам успео да покренем „%s“
прикључак!\n"
+
+#: src/transport/plugin_transport_http_client.c:1697
+#: src/transport/plugin_transport_http_server.c:3007
+#, c-format
+msgid "Shutting down plugin `%s'\n"
+msgstr "Гасим прикључак „%s“\n"
+
+#: src/transport/plugin_transport_http_client.c:1722
+#: src/transport/plugin_transport_http_server.c:3063
+#, c-format
+msgid "Shutdown for plugin `%s' complete\n"
+msgstr "Гашење за прикључак „%s“ је завршено\n"
+
+#: src/transport/plugin_transport_http_client.c:1750
+#: src/transport/plugin_transport_http_server.c:2907
+#, c-format
+msgid "Maximum number of connections is %u\n"
+msgstr "Највећи број веза је %u\n"
+
+#: src/transport/plugin_transport_http_server.c:1402
+#, c-format
+msgid "Access from connection %p (%u of %u) for `%s' `%s' url `%s' with upload
data size %u\n"
+msgstr "Приступ из везе %p (%u од %u) за „%s“ „%s“ адреса „%s“ са величином
података утовара %u\n"
+
+#: src/transport/plugin_transport_http_server.c:1663
+#, c-format
+msgid "Accepting connection (%u of %u) from `%s'\n"
+msgstr "Прихватам везу (%u од %u) са „%s“\n"
+
+#: src/transport/plugin_transport_http_server.c:1671
+#, c-format
+msgid "Server reached maximum number connections (%u), rejecting new
connection\n"
+msgstr "Сервер је достигао највећи број веза (%u), одбацује нове везе\n"
+
+#: 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"
+msgstr "Не могу да направим ново ТЛС уверење, програм
„gnunet-transport-certificate-creation“ се не може покренути!\n"
+
+#: src/transport/plugin_transport_http_server.c:1982
+#, c-format
+msgid "No usable TLS certificate found and creating one at `%s/%s' failed!\n"
+msgstr "Нисам нашао употребљиво ТЛС уверење а његово стварање на „%s/%s“ није
успело!\n"
+
+#: src/transport/plugin_transport_http_server.c:2405
+msgid "Require valid port number for service in configuration!\n"
+msgstr "Захтева исправан број прикључника за услугу у подешавањима!\n"
+
+#: src/transport/plugin_transport_http_server.c:2437 src/util/service.c:698
+#, c-format
+msgid "Failed to resolve `%s': %s\n"
+msgstr "Нисам успео да решим „%s“: %s\n"
+
+#: src/transport/plugin_transport_http_server.c:2454 src/util/service.c:715
+#, c-format
+msgid "Failed to find %saddress for `%s'.\n"
+msgstr "Нисам успео да нађем %s адресу за „%s“.\n"
+
+#: src/transport/plugin_transport_http_server.c:2565
+#, c-format
+msgid "Found %u addresses to report to NAT service\n"
+msgstr "Нађох %u адрес за извештавање НАТ услузи\n"
+
+#: src/transport/plugin_transport_http_server.c:2637
+msgid "Disabling IPv6 since it is not supported on this system!\n"
+msgstr "Искључујем ИПв6 јер није подржано на овом систему!\n"
+
+#: src/transport/plugin_transport_http_server.c:2730
+#, c-format
+msgid "IPv4 support is %s\n"
+msgstr "ИПв4 подршка је %s\n"
+
+#: src/transport/plugin_transport_http_server.c:2744
+#, c-format
+msgid "IPv6 support is %s\n"
+msgstr "ИПв6 подршка је %s\n"
+
+#: src/transport/plugin_transport_http_server.c:2751
+msgid "Neither IPv4 nor IPv6 are enabled! Fix in configuration\n"
+msgstr "Ни ИПв4 ни ИПв6 није укључено! Исправите у подешавању\n"
+
+#: src/transport/plugin_transport_http_server.c:2762
+msgid "Port is required! Fix in configuration\n"
+msgstr "Прикључник је потребан! Исправите у подешавању\n"
+
+#: src/transport/plugin_transport_http_server.c:2769
+#, c-format
+msgid "Using port %u\n"
+msgstr "Користим прикључник %u\n"
+
+#: src/transport/plugin_transport_http_server.c:2784
+#, c-format
+msgid "Specific IPv4 address `%s' in configuration file is invalid!\n"
+msgstr "Специфична ИПв4 адреса „%s“ у датотеци подешавања је неисправна!\n"
+
+#: src/transport/plugin_transport_http_server.c:2794
+#, c-format
+msgid "Binding to IPv4 address %s\n"
+msgstr "Свезујем за ИПв4 адресу %s\n"
+
+#: src/transport/plugin_transport_http_server.c:2815
+#, c-format
+msgid "Specific IPv6 address `%s' in configuration file is invalid!\n"
+msgstr "Специфична ИПв6 адреса „%s“ у датотеци подешавања је неисправна!\n"
+
+#: src/transport/plugin_transport_http_server.c:2825
+#, c-format
+msgid "Binding to IPv6 address %s\n"
+msgstr "Свезујем за ИПв6 адресу %s\n"
+
+#: src/transport/plugin_transport_http_server.c:2877
+#, c-format
+msgid "Using external hostname `%s'\n"
+msgstr "Користим спољни назив домаћина „%s“\n"
+
+#: src/transport/plugin_transport_http_server.c:2893
+#, c-format
+msgid "Notifying transport only about hostname `%s'\n"
+msgstr "Обавештавам пренос само о називу домаћина „%s“\n"
+
+#: src/transport/plugin_transport_smtp.c:223
+#, c-format
+msgid "Received malformed message via %s. Ignored.\n"
+msgstr "Примих лошу поруку путем „%s“. Занемарујем.\n"
+
+#: src/transport/plugin_transport_smtp.c:310
+msgid "SMTP filter string to invalid, lacks ': '\n"
+msgstr "Ниска СМТП филтера је превише неисправна, недостаје „: “\n"
+
+#: src/transport/plugin_transport_smtp.c:319
+#, c-format
+msgid "SMTP filter string to long, capped to `%s'\n"
+msgstr "Ниска СМТП филтера је предуга, скраћена је на „%s“\n"
+
+#: src/transport/plugin_transport_smtp.c:414
+#: src/transport/plugin_transport_smtp.c:424
+#: src/transport/plugin_transport_smtp.c:437
+#: src/transport/plugin_transport_smtp.c:456
+#: src/transport/plugin_transport_smtp.c:479
+#: src/transport/plugin_transport_smtp.c:487
+#: src/transport/plugin_transport_smtp.c:500
+#: src/transport/plugin_transport_smtp.c:511
+#, c-format
+msgid "SMTP: `%s' failed: %s.\n"
+msgstr "СМТП: „%s“ није успело: %s.\n"
+
+#: src/transport/plugin_transport_smtp.c:652
+msgid "No email-address specified, can not start SMTP transport.\n"
+msgstr "Није наведена адреса е-поште, не могу да почнем СМТП пренос.\n"
+
+#: src/transport/plugin_transport_smtp.c:664
+msgid "# bytes received via SMTP"
+msgstr "# бајтови су примљени путем СМТП-а"
+
+#: src/transport/plugin_transport_smtp.c:665
+msgid "# bytes sent via SMTP"
+msgstr "# бајтови су послати путем СМТП-а"
+
+#: src/transport/plugin_transport_smtp.c:667
+msgid "# bytes dropped by SMTP (outgoing)"
+msgstr "# бајтови су одбачени СМТП-ом (одлазни)"
+
+#: src/transport/plugin_transport_tcp.c:555
+#, c-format
+msgid "Unexpected address length: %u bytes\n"
+msgstr "Неочекивана дужина адресе: %u бајта\n"
+
+#: 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
+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
+msgid "# bytes currently in TCP buffers"
+msgstr "# бајтова тренутно у ТЦП међумеморијама"
+
+#: src/transport/plugin_transport_tcp.c:798
+msgid "# bytes discarded by TCP (disconnect)"
+msgstr "# бајтови су одбачени ТЦП-ом (прекид везе)"
+
+#: src/transport/plugin_transport_tcp.c:1012
+msgid "# bytes discarded by TCP (timeout)"
+msgstr "# бајтови су одбачени ТЦП-ом (истекло време)"
+
+#: src/transport/plugin_transport_tcp.c:1059
+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 "Покушавам да пошаљем са неисправном сесијом %p\n"
+
+#: src/transport/plugin_transport_tcp.c:1462
+msgid "# requests to create session with invalid address"
+msgstr "# захтева за стварање сесије са неисправном адресом"
+
+#: src/transport/plugin_transport_tcp.c:1567
+msgid "# transport-service disconnect requests for TCP"
+msgstr "# захтеви прекида везе услуге преноса за ТЦП"
+
+#: src/transport/plugin_transport_tcp.c:2055
+msgid "# TCP WELCOME messages received"
+msgstr "# поруке ТЦП ДОБРОДОШЛИЦЕ су примљене"
+
+#: src/transport/plugin_transport_tcp.c:2215
+msgid "# bytes received via TCP"
+msgstr "# бајта је примљено путем ТЦП-а"
+
+#: src/transport/plugin_transport_tcp.c:2279
+msgid "# network-level TCP disconnect events"
+msgstr "# догађаји ТЦП мрежног нивоа прекидања везе"
+
+#: src/transport/plugin_transport_tcp.c:2437 src/util/service.c:582
+#: src/util/service.c:588
+#, c-format
+msgid "Require valid port number for service `%s' in configuration!\n"
+msgstr "Захтева исправан број прикључника за услугу „%s“ у подешавањима!\n"
+
+#: src/transport/plugin_transport_tcp.c:2451
+msgid "Failed to start service.\n"
+msgstr "Нисам успео да покренем услугу.\n"
+
+#: src/transport/plugin_transport_tcp.c:2547
+#, c-format
+msgid "TCP transport listening on port %llu\n"
+msgstr "ТЦП пренос ослушкује на прикључнику %llu\n"
+
+#: src/transport/plugin_transport_tcp.c:2551
+msgid "TCP transport not listening on any port (client only)\n"
+msgstr "ТЦП пренос не ослушкује ни на једном прикључнику (само клијент)\n"
+
+#: src/transport/plugin_transport_tcp.c:2554
+#, c-format
+msgid "TCP transport advertises itself as being on port %llu\n"
+msgstr "ТЦП пренос упозорава себе да је на прикључнику %llu\n"
+
+#: src/transport/plugin_transport_udp_broadcasting.c:167
+msgid "# IPv6 multicast HELLO beacons received via udp"
+msgstr "# ИПв6 вишеодредишне „HELLO“ ознаке су примљене путем удп-а"
+
+#: src/transport/plugin_transport_udp_broadcasting.c:210
+msgid "# IPv4 broadcast HELLO beacons received via udp"
+msgstr "# ИПв4 свеодредишне „HELLO“ ознаке су примљене путем удп-а"
+
+#: src/transport/plugin_transport_udp_broadcasting.c:603
+msgid "Disabling HELLO broadcasting due to friend-to-friend only
configuration!\n"
+msgstr "Искључујем „HELLO“ емитовање због подешавања само пријатељ
пријатељу!\n"
+
+#: src/transport/plugin_transport_udp_broadcasting.c:626
+#, c-format
+msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n"
+msgstr "Нисам успео да поставим опцију ИПв4 емитовања за прикључницу емитовања
на прикључнику %d\n"
+
+#: src/transport/plugin_transport_udp.c:1513
+#, c-format
+msgid "Trying to create session for address of unexpected length %u (should be
%u or %u)\n"
+msgstr "Покушавам да направим сесију за адресу неочекиване дужине %u (треба
бити %u или %u)\n"
+
+#: src/transport/plugin_transport_udp.c:2602
+#, c-format
+msgid "UDP could not transmit message to `%s': Network seems down, please
check your network configuration\n"
+msgstr "УДП не може да пренесе поруку до „%s“: Изгледа да је мрежа пала,
проверите ваша мрежна подешавања\n"
+
+#: 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"
+msgstr "УДП не може да пренесе ИПв6 поруку! Проверите мрежна подешавања и
искључите ИПв6 ако ваша веза нема општу Ипв6 адресу\n"
+
+#: src/transport/plugin_transport_udp.c:2961
+msgid "Failed to open UDP sockets\n"
+msgstr "Нисам успео да отворим УДП прикључницу\n"
+
+#: src/transport/plugin_transport_udp.c:3056
+#, c-format
+msgid "Given `%s' option is out of range: %llu > %u\n"
+msgstr "Дата „%s“ опција је ван опсега: %llu > %u\n"
+
+#: src/transport/plugin_transport_udp.c:3097
+#, c-format
+msgid "Invalid IPv6 address: `%s'\n"
+msgstr "Неисправна ИПв6 адреса: „%s“\n"
+
+#: src/transport/plugin_transport_udp.c:3168
+msgid "Failed to create network sockets, plugin failed\n"
+msgstr "Нисам успео да направим прикључнице мреже, прикључак није успео\n"
+
+#: src/transport/plugin_transport_unix.c:1321
+#, c-format
+msgid "Cannot create path to `%s'\n"
+msgstr "Не могу да направим путању до „%s“\n"
+
+#: src/transport/plugin_transport_unix.c:1652
+msgid "No UNIXPATH given in configuration!\n"
+msgstr "Није дата ЈУНИКС_ПУТАЊА у подешавањима!\n"
+
+#: src/transport/plugin_transport_unix.c:1688
+msgid "Failed to open UNIX listen socket\n"
+msgstr "Нисам успео да отворим ЈУНИКС прикључницу ослушкивања\n"
+
+#: src/transport/plugin_transport_wlan.c:620
+msgid "# WLAN ACKs sent"
+msgstr "# „WLAN“ АЦК-ови су послати"
+
+#: src/transport/plugin_transport_wlan.c:639
+msgid "# WLAN messages defragmented"
+msgstr "# делићи „WLAN“ порука су уједињени"
+
+#: 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"
+msgstr "# „WLAN“ сесије су додељене"
+
+#: src/transport/plugin_transport_wlan.c:876
+msgid "# WLAN message fragments sent"
+msgstr "# делићи „WLAN“ поруке су послати"
+
+#: src/transport/plugin_transport_wlan.c:900
+msgid "# WLAN messages pending (with fragmentation)"
+msgstr "# Поруке „WLAN“-а су на чекању (са расцепканошћу)"
+
+#: 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"
+msgstr "# Крајње тачке „WLAN“ МАЦ-а су додељене"
+
+#: src/transport/plugin_transport_wlan.c:1302
+msgid "# HELLO messages received via WLAN"
+msgstr "# „HELLO“ поруке су примљене путем „WLAN“-а"
+
+#: src/transport/plugin_transport_wlan.c:1326
+msgid "# fragments received via WLAN"
+msgstr "# делићи су примљени путем „WLAN“-а"
+
+#: src/transport/plugin_transport_wlan.c:1336
+msgid "# ACKs received via WLAN"
+msgstr "# АЦК-ови су примљени путем „WLAN“-а"
+
+#: src/transport/plugin_transport_wlan.c:1396
+msgid "# WLAN DATA messages discarded due to CRC32 error"
+msgstr "# Поруке ПОДАТАКА „WLAN“ су одбачене услед „CRC32“ грешке"
+
+#: src/transport/plugin_transport_wlan.c:1518
+msgid "# DATA messages received via WLAN"
+msgstr "# поруке ПОДАТАКА су примљене путем „WLAN“-а"
+
+#: src/transport/plugin_transport_wlan.c:1553
+msgid "# WLAN DATA messages processed"
+msgstr "# Поруке „WLAN“ ПОДАТАКА су обрађене"
+
+#: src/transport/plugin_transport_wlan.c:1616
+msgid "# HELLO beacons sent via WLAN"
+msgstr "# „HELLO“ ознаке су послате путем „WLAN“—а"
+
+#: src/transport/plugin_transport_wlan.c:1729
+msgid "WLAN address with invalid size encountered\n"
+msgstr "Наишли смо на адресу „WLAN“ са неисправном величином\n"
+
+#: src/transport/plugin_transport_wlan.c:1929
+#, c-format
+msgid "Helper binary `%s' not SUID, cannot run WLAN transport\n"
+msgstr "Извршна помоћника „%s“ није СУИБ, не могу да покренем „WLAN“ пренос\n"
+
+#: src/transport/transport_api.c:739
+#, c-format
+msgid "Received unexpected message of type %u in %s:%u\n"
+msgstr "Примих неочекивану поруку врсте %u у %s:%u\n"
+
+#: src/transport/transport-testing.c:584
+msgid "Failed to initialize testing library!\n"
+msgstr "Нисам успео да покренем библиотеку тестирања!\n"
+
+#: src/tun/regex.c:129
+#, c-format
+msgid "Bad mask: %d\n"
+msgstr "Лоша маска: %d\n"
+
+#: src/util/bio.c:170 src/util/bio.c:178
+#, c-format
+msgid "Error reading `%s': %s"
+msgstr "Грешка при читању „%s“: %s"
+
+#: src/util/bio.c:180
+msgid "End of file"
+msgstr "Крај датотеке"
+
+#: src/util/bio.c:237
+#, c-format
+msgid "Error reading length of string `%s'"
+msgstr "Грешка читања дужине ниске „%s“"
+
+#: src/util/bio.c:247
+#, c-format
+msgid "String `%s' longer than allowed (%u > %u)"
+msgstr "Ниска „%s“ је дужа од дозвољеног (%u > %u)"
+
+#: src/util/bio.c:293
+#, c-format
+msgid "Serialized metadata `%s' larger than allowed (%u>%u)"
+msgstr "Серијализовани метаподаци „%s“ су већи од дозвољеног (%u>%u)"
+
+#: src/util/bio.c:307
+#, c-format
+msgid "Metadata `%s' failed to deserialize"
+msgstr "Метаподаци „%s“ нису успели да се десеријализују"
+
+#: src/util/client.c:261 src/util/client.c:858 src/util/service.c:619
+#, c-format
+msgid "UNIXPATH `%s' too long, maximum length is %llu\n"
+msgstr "ЈУНИКС_ПУТАЊА „%s“ је предуга, највећа дужина је %llu\n"
+
+#: src/util/client.c:265 src/util/client.c:863 src/util/service.c:623
+#, c-format
+msgid "Using `%s' instead\n"
+msgstr "Користим зато „%s“\n"
+
+#: src/util/client.c:360
+#, c-format
+msgid "Could not determine valid hostname and port for service `%s' from
configuration.\n"
+msgstr "Не могу да одредим исправан назив доамћина и прикључник за услугу „%s“
из подешавања.\n"
+
+#: src/util/client.c:368
+#, c-format
+msgid "Need a non-empty hostname for service `%s'.\n"
+msgstr "Потребан је не-празан назив домаћина за услугу „%s“.\n"
+
+#: src/util/client.c:1008
+#, c-format
+msgid "Could not connect to service `%s', configuration broken.\n"
+msgstr "Не могу да се повежем на услугу „%s“, подешавање је оштећено.\n"
+
+#: src/util/client.c:1020
+#, c-format
+msgid "Failure to transmit request to service `%s'\n"
+msgstr "Нисам успео да пренесем захтев услузи „%s“\n"
+
+#: src/util/client.c:1303
+msgid "Could not submit request, not expecting to receive a response.\n"
+msgstr "Не могу да предам захтев, не очекујем да примим одговор.\n"
+
+#: src/util/common_logging.c:254 src/util/common_logging.c:1039
+msgid "DEBUG"
+msgstr "ПРОЧИШЋАВАЊЕ"
+
+#: src/util/common_logging.c:256 src/util/common_logging.c:1037
+msgid "INFO"
+msgstr "ПОДАЦИ"
+
+#: src/util/common_logging.c:258 src/util/common_logging.c:1035
+msgid "WARNING"
+msgstr "УПОЗОРЕЊЕ"
+
+#: src/util/common_logging.c:260 src/util/common_logging.c:1033
+msgid "ERROR"
+msgstr "ГРЕШКА"
+
+#: src/util/common_logging.c:262 src/util/common_logging.c:1041
+msgid "NONE"
+msgstr "НИШТА"
+
+#: src/util/common_logging.c:391
+#, c-format
+msgid "Failed to create or access directory for log file `%s'\n"
+msgstr "Нисам успео да направим или да приступим директоријуму да забележим
датотеку „%s“\n"
+
+#: src/util/common_logging.c:817
+#, c-format
+msgid "Message `%.*s' repeated %u times in the last %s\n"
+msgstr "Порука „%.*s“ је поновљена %u пута у прошлости %s\n"
+
+#: src/util/common_logging.c:1042
+msgid "INVALID"
+msgstr "НЕИСПРАВНО"
+
+#: src/util/common_logging.c:1157
+msgid "unknown address"
+msgstr "непозната адреса"
+
+#: src/util/common_logging.c:1196
+msgid "invalid address"
+msgstr "неисправна адреса"
+
+#: src/util/common_logging.c:1214
+#, c-format
+msgid "Configuration fails to specify option `%s' in section `%s'!\n"
+msgstr "Подешавање није успело да наведе опцију „%s“ у одељку „%s“!\n"
+
+#: src/util/common_logging.c:1235
+#, c-format
+msgid "Configuration specifies invalid value for option `%s' in section `%s':
%s\n"
+msgstr "Подешавање наводи неисправну вредност за опцију „%s“ у одељку „%s“:
%s\n"
+
+#: src/util/configuration.c:288
+#, c-format
+msgid "Syntax error while deserializing in line %u\n"
+msgstr "Грешка синтаксе приликом десеријализације у реду %u\n"
+
+#: src/util/configuration.c:996
+#, c-format
+msgid "Configuration value '%s' for '%s' in section '%s' is not in set of
legal choices\n"
+msgstr "Вредност подешавања '%s' за '%s' у одељку '%s' није ус купу исправних
избора\n"
+
+#: src/util/configuration.c:1066
+#, c-format
+msgid "Recursive expansion suspected, aborting $-expansion for term `%s'\n"
+msgstr "Сумња се на дубинско ширење, прекидам $-ширење за термин „%s“\n"
+
+#: src/util/configuration.c:1098
+#, c-format
+msgid "Missing closing `%s' in option `%s'\n"
+msgstr "Недостаје затварење „%s“ у опцији „%s“\n"
+
+#: src/util/configuration.c:1172
+#, c-format
+msgid "Failed to expand `%s' in `%s' as it is neither found in [PATHS] nor
defined as an environmental variable\n"
+msgstr "Нисам успео да раширим „%s“ у „%s“ јер нисам нашао у [ПУТАЊАМА] нити
је дефинисано као променљива окружења\n"
+
+#: src/util/connection.c:423
+#, c-format
+msgid "Access denied to `%s'\n"
+msgstr "Приступ је збрањен за „%s“\n"
+
+#: src/util/connection.c:438
+#, c-format
+msgid "Accepting connection from `%s': %p\n"
+msgstr "Прихватам везу са „%s“: %p\n"
+
+#: src/util/connection.c:553
+#, c-format
+msgid "Failed to establish TCP connection to `%s:%u', no further addresses to
try.\n"
+msgstr "Нисам успео да успоставим ТЦП везу са `%s:%u', нема будућих адреса за
покушавање.\n"
+
+#: src/util/connection.c:751 src/util/connection.c:919
+#, c-format
+msgid "Trying to connect to `%s' (%p)\n"
+msgstr "Покушавам да се повежем на „%s“ (%p)\n"
+
+#: src/util/connection.c:910
+#, c-format
+msgid "Attempt to connect to `%s' failed\n"
+msgstr "Покушај повезивања са „%s“ није успео\n"
+
+#: 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"
+msgstr "Величина датотеке на диску није тачна за овај Блум филтер (желим %llu,
имам %llu)\n"
+
+#: src/util/crypto_ecc.c:702 src/util/crypto_ecc.c:740
+#: src/util/crypto_ecc.c:858 src/util/crypto_ecc.c:896
+#, c-format
+msgid "Could not acquire lock on file `%s': %s...\n"
+msgstr "Не могу да остварим закључавање на датотеци „%s“: %s...\n"
+
+#: src/util/crypto_ecc.c:707 src/util/crypto_ecc.c:863
+msgid "Creating a new private key. This may take a while.\n"
+msgstr "Стварам нови лични кључ. Ово може потрајати.\n"
+
+#: src/util/crypto_ecc.c:744 src/util/crypto_ecc.c:900
+msgid "This may be ok if someone is currently generating a private key.\n"
+msgstr "Ово може бити у реду ако неко тренутно ствара лични кључ.\n"
+
+#: src/util/crypto_ecc.c:774 src/util/crypto_ecc.c:930
+#, c-format
+msgid "When trying to read key file `%s' I found %u bytes but I need at least
%u.\n"
+msgstr "Приликом покушаја читања датотеке кључа „%s“ нађох %u бајта али ми
треба барем %u.\n"
+
+#: src/util/crypto_ecc.c:778 src/util/crypto_ecc.c:934
+msgid "This may be ok if someone is currently generating a key.\n"
+msgstr "Ово може бити у реду ако неко тренутно ствара кључ.\n"
+
+#: src/util/crypto_ecc.c:1016
+msgid "Could not load peer's private key\n"
+msgstr "Не могу да учитам лични кључ парњака\n"
+
+#: src/util/crypto_ecc.c:1120
+#, c-format
+msgid "ECC signing failed at %s:%d: %s\n"
+msgstr "„ECC“ потписивање није успело на %s:%d: %s\n"
+
+#: src/util/crypto_ecc.c:1170
+#, c-format
+msgid "EdDSA signing failed at %s:%d: %s\n"
+msgstr "„EdDSA“ потписивање није успело на %s:%d: %s\n"
+
+#: src/util/crypto_ecc.c:1244
+#, c-format
+msgid "ECDSA signature verification failed at %s:%d: %s\n"
+msgstr "Провера „ECDSA“ потписа није успела на %s:%d: %s\n"
+
+#: src/util/crypto_ecc.c:1301
+#, c-format
+msgid "EdDSA signature verification failed at %s:%d: %s\n"
+msgstr "Провера „EdDSA“ потписа није успела на %s:%d: %s\n"
+
+#: src/util/crypto_random.c:284
+#, c-format
+msgid "libgcrypt has not the expected version (version %s is required).\n"
+msgstr "„libgcrypt“ није очекиваног издања (издање %s је потребно).\n"
+
+#: src/util/disk.c:1184
+#, c-format
+msgid "Expected `%s' to be a directory!\n"
+msgstr "Очекивах да „%s“ буде директоријум!\n"
+
+#: src/util/disk.c:1546 src/util/service.c:1318
+#, c-format
+msgid "Cannot obtain information about user `%s': %s\n"
+msgstr "Не могу да добијем податке о кориснику „%s“: %s\n"
+
+#: src/util/getopt.c:568
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: опција „%s“ је нејасна\n"
+
+#: src/util/getopt.c:592
+#, c-format
+msgid "%s: option `--%s' does not allow an argument\n"
+msgstr "%s: опција „--%s“ не дозвољава аргумент\n"
+
+#: src/util/getopt.c:597
+#, c-format
+msgid "%s: option `%c%s' does not allow an argument\n"
+msgstr "%s: опција „%c%s“ не дозвољава аргумент\n"
+
+#: src/util/getopt.c:614 src/util/getopt.c:781
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: опција „%s“ захтева аргумент\n"
+
+#: src/util/getopt.c:643
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: непрепозната опција „--%s“\n"
+
+#: src/util/getopt.c:647
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: непрепозната опција „%c%s“\n"
+
+#: src/util/getopt.c:672
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: недозвољена опција —— %c\n"
+
+#: src/util/getopt.c:674
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: неисправна опција —— %c\n"
+
+#: src/util/getopt.c:702 src/util/getopt.c:829
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: опција захтева аргумент —— %c\n"
+
+#: src/util/getopt.c:750
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: опција „-W %s“ је нејасна\n"
+
+#: src/util/getopt.c:768
+#, c-format
+msgid "%s: option `-W %s' does not allow an argument\n"
+msgstr "%s: опција „-W %s“ не дозвољава аргумент\n"
+
+#: src/util/getopt.c:933
+#, c-format
+msgid "Use %s to get a list of options.\n"
+msgstr "Употребите „%s“ да добавите списак опција.\n"
+
+#: src/util/getopt_helpers.c:84
+#, 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
+#, c-format
+msgid "You must pass a number to the `%s' option.\n"
+msgstr "Морате да проследите број опцији „%s“.\n"
+
+#: src/util/getopt_helpers.c:298
+#, c-format
+msgid "You must pass relative time to the `%s' option.\n"
+msgstr "Морате да проследите релативно време опцији „%s“.\n"
+
+#: src/util/gnunet-config.c:90
+#, c-format
+msgid "--section argument is required\n"
+msgstr "аргумент „--section“ је потребан\n"
+
+#: src/util/gnunet-config.c:133
+#, c-format
+msgid "--option argument required to set value\n"
+msgstr "аргумент „--option“ је потребан за постављање вредности\n"
+
+#: src/util/gnunet-config.c:160
+msgid "obtain option of value as a filename (with $-expansion)"
+msgstr "добија опцију вредности као назив датотеке (са $-ширењем)"
+
+#: src/util/gnunet-config.c:163
+msgid "name of the section to access"
+msgstr "назив одељка за приступање"
+
+#: src/util/gnunet-config.c:166
+msgid "name of the option to access"
+msgstr "назив опције за приступање"
+
+#: src/util/gnunet-config.c:169
+msgid "value to set"
+msgstr "вредност за постављање"
+
+#: src/util/gnunet-config.c:178
+msgid "Manipulate GNUnet configuration files"
+msgstr "Управља ГНУнет датотекама подешавања"
+
+#: src/util/gnunet-ecc.c:75
+#, c-format
+msgid "Failed to open `%s': %s\n"
+msgstr "Нисам успео да отворим „%s“: %s\n"
+
+#: src/util/gnunet-ecc.c:81
+#, c-format
+msgid "Generating %u keys, please wait"
+msgstr "Стварам %u кључа, сачекајте"
+
+#: src/util/gnunet-ecc.c:97
+#, c-format
+msgid ""
+"\n"
+"Failed to write to `%s': %s\n"
+msgstr ""
+"\n"
+"Нисам успео да пишем у „%s“: %s\n"
+
+#: src/util/gnunet-ecc.c:107
+#, c-format
+msgid ""
+"\n"
+"Finished!\n"
+msgstr ""
+"\n"
+"Завршено!\n"
+
+#: src/util/gnunet-ecc.c:110
+#, c-format
+msgid ""
+"\n"
+"Error, %u keys not generated\n"
+msgstr ""
+"\n"
+"Грешка, %u кључа нису створена\n"
+
+#: src/util/gnunet-ecc.c:199
+#, c-format
+msgid "Hostkeys file `%s' not found\n"
+msgstr "Нисам нашао датотеку кључа домаћина „%s“\n"
+
+#: src/util/gnunet-ecc.c:210
+#, c-format
+msgid "Hostkeys file `%s' is empty\n"
+msgstr "Датотека кључа домаћина „%s“ је празна\n"
+
+#: src/util/gnunet-ecc.c:232
+#, c-format
+msgid "Could not read hostkey file: %s\n"
+msgstr "Не могу да прочитам датотеку кључа домаћина: %s\n"
+
+#: src/util/gnunet-ecc.c:283
+msgid "No hostkey file specified on command line\n"
+msgstr "Није наведена датотека кључа домаћина на линији наредби\n"
+
+#: src/util/gnunet-ecc.c:349
+msgid "list keys included in a file (for testing)"
+msgstr "исписује кључеве укључене у датотеци (за тестирање)"
+
+#: src/util/gnunet-ecc.c:352
+msgid "number of keys to list included in a file (for testing)"
+msgstr "број кључева за испис укључених у датотеци (за тестирање)"
+
+#: src/util/gnunet-ecc.c:355
+msgid "create COUNT public-private key pairs (for testing)"
+msgstr "ствара БРОЈ пара јавног-личног кључа (за тестирање)"
+
+#: src/util/gnunet-ecc.c:358
+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
+msgid "print examples of ECC operations (used for compatibility testing)"
+msgstr "исписује примере ЕЦЦ операција (користи се за тестирање сагласности)"
+
+#: src/util/gnunet-ecc.c:375
+msgid "Manipulate GNUnet private ECC key files"
+msgstr "Управља ГНУнет датотекама личног ЕЦЦ кључа"
+
+#: src/util/gnunet-resolver.c:149
+msgid "perform a reverse lookup"
+msgstr "обавља повратну претрагу"
+
+#: src/util/gnunet-resolver.c:160
+msgid "Use build-in GNUnet stub resolver"
+msgstr "Користи уграђеног заменског решавача ГНУнет-а"
+
+#: src/util/gnunet-scrypt.c:279
+msgid "number of bits to require for the proof of work"
+msgstr "број битова за тражење доказивања о раду"
+
+#: src/util/gnunet-scrypt.c:282
+msgid "file with private key, otherwise default is used"
+msgstr "датотека са личним кључем, у супротном користи се основна"
+
+#: src/util/gnunet-scrypt.c:285
+msgid "file with proof of work, otherwise default is used"
+msgstr "датотека са доказом о раду, у супротном користи се основна"
+
+#: src/util/gnunet-scrypt.c:288
+msgid "time to wait between calculations"
+msgstr "време за чекање између прорачуна"
+
+#: src/util/gnunet-scrypt.c:299
+msgid "Manipulate GNUnet proof of work files"
+msgstr "Управља ГНУнет датотекама доказа о раду"
+
+#: src/util/gnunet-service-resolver.c:299
+#, c-format
+msgid "Could not resolve `%s' (%s): %s\n"
+msgstr "Не могу да решим „%s“ (%s): %s\n"
+
+#: src/util/gnunet-service-resolver.c:371
+#: src/util/gnunet-service-resolver.c:412
+#, c-format
+msgid "Could not find IP of host `%s': %s\n"
+msgstr "Не могу да нађем ИП домаћина „%s“: %s\n"
+
+#: src/util/gnunet-uri.c:84
+#, c-format
+msgid "No URI specified on command line\n"
+msgstr "Није наведена путања на линији наредби\n"
+
+#: src/util/gnunet-uri.c:89
+#, c-format
+msgid "Invalid URI: does not start with `%s'\n"
+msgstr "Неисправна путања: не почиње са „%s“\n"
+
+#: src/util/gnunet-uri.c:96
+#, c-format
+msgid "Invalid URI: fails to specify subsystem\n"
+msgstr "Неисправна путања: није успело навођење подсистема\n"
+
+#: src/util/gnunet-uri.c:106
+#, c-format
+msgid "No handler known for subsystem `%s'\n"
+msgstr "Није познат руковалац за подсистем „%s“\n"
+
+#: src/util/gnunet-uri.c:168
+msgid "Perform default-actions for GNUnet URIs"
+msgstr "Обавља основне радње за путање ГНУнет-а"
+
+#: src/util/helper.c:338
+#, c-format
+msgid "Error reading from `%s': %s\n"
+msgstr "Грешка читања из „%s“: %s\n"
+
+#: src/util/helper.c:383
+#, c-format
+msgid "Failed to parse inbound message from helper `%s'\n"
+msgstr "Нисам успео да обрадим долазну поруку са помоћника „%s“\n"
+
+#: src/util/helper.c:609
+#, c-format
+msgid "Error writing to `%s': %s\n"
+msgstr "Грешка писања у „%s“: %s\n"
+
+#: src/util/network.c:134
+#, c-format
+msgid "Unable to shorten unix path `%s' while keeping name unique\n"
+msgstr "Не могу да скратим јуникс путању „%s“ док задржавам назив
јединственим\n"
+
+#: src/util/network.c:1355 src/util/network.c:1480
+#, c-format
+msgid "Fatal internal logic error, process hangs in `%s' (abort with
CTRL-C)!\n"
+msgstr "Кобна унутрашња логичка грешка, процес се заплео у „%s“ (прекините са
КТРЛ-Ц)!\n"
+
+#: src/util/os_installation.c:421
+#, c-format
+msgid "Could not determine installation path for %s. Set `%s' environment
variable.\n"
+msgstr "Не могу да одредим путању инсталирања за „%s“. Поставите „%s“
променљиву окружења.\n"
+
+#: src/util/os_installation.c:766
+#, c-format
+msgid "Could not find binary `%s' in PATH!\n"
+msgstr "Не могу да нађем извршну „%s“ у ПУТАЊИ!\n"
+
+#: src/util/os_installation.c:826
+#, c-format
+msgid "CreateProcess failed for binary %s (%d).\n"
+msgstr "„CreateProcess“ није успело за извршну „%s“ (%d).\n"
+
+#: src/util/os_installation.c:836
+#, c-format
+msgid "GetExitCodeProcess failed for binary %s (%d).\n"
+msgstr "„GetExitCodeProcess“ није успело за извршну „%s“ (%d).\n"
+
+#: src/util/plugin.c:87
+#, c-format
+msgid "Initialization of plugin mechanism failed: %s!\n"
+msgstr "Покретање механизма прикључка није успело: %s!\n"
+
+#: src/util/plugin.c:148
+#, c-format
+msgid "`%s' failed to resolve method '%s' with error: %s\n"
+msgstr "„%s“ није успело да реши метод '%s' са грешком: %s\n"
+
+#: src/util/plugin.c:223
+#, c-format
+msgid "`%s' failed for library `%s' with error: %s\n"
+msgstr "„%s“ није успело за библиотеку '%s' са грешком: %s\n"
+
+#: src/util/plugin.c:382
+msgid "Could not determine plugin installation path.\n"
+msgstr "Не могу да одредим путању инсталирања прикључка.\n"
+
+#: src/util/program.c:246 src/util/service.c:1452
+#, c-format
+msgid "Malformed configuration file `%s', exit ...\n"
+msgstr "Лоша датотека подешавања „%s“, излазим ...\n"
+
+#: src/util/program.c:258 src/util/service.c:1467
+#, c-format
+msgid "Could not access configuration file `%s'\n"
+msgstr "Не могу да приступим датотеци подешавања „%s“\n"
+
+#: src/util/program.c:263 src/util/service.c:1462
+msgid "Malformed configuration, exit ...\n"
+msgstr "Лоше подешавање, излазим ...\n"
+
+#: src/util/resolver_api.c:198
+#, c-format
+msgid "Must specify `%s' for `%s' in configuration!\n"
+msgstr "Морате навести „%s“ за „%s“ у подешавањима!\n"
+
+#: src/util/resolver_api.c:216
+#, c-format
+msgid "Must specify `%s' or numeric IP address for `%s' of `%s' in
configuration!\n"
+msgstr "Морате навести „%s“ или бројевну ИП адресу за „%s“ од „%s“ у
подешавањима!\n"
+
+#: src/util/resolver_api.c:348
+#, c-format
+msgid "Timeout trying to resolve IP address `%s'.\n"
+msgstr "Истекло је време при покушају решавања ИП адресе „%s“.\n"
+
+#: src/util/resolver_api.c:352
+#, c-format
+msgid "Timeout trying to resolve hostname `%s'.\n"
+msgstr "Истекло је време при покушају решавања назива домаћина „%s“.\n"
+
+#: src/util/resolver_api.c:908
+#, c-format
+msgid "Could not resolve our FQDN : %s\n"
+msgstr "Не могу да решим наш „FQDN“ : %s\n"
+
+#: src/util/scheduler.c:813
+msgid "Looks like we're busy waiting...\n"
+msgstr "Изгледа да смо заузети чекајући...\n"
+
+#: src/util/scheduler.c:948
+#, c-format
+msgid "Attempt to cancel dead task %llu!\n"
+msgstr "Покушах да обришем неактиван задатак %llu!\n"
+
+#: src/util/server.c:484
+#, c-format
+msgid "`%s' failed for port %d (%s).\n"
+msgstr "„%s“ није успело за прикључник %d (%s).\n"
+
+#: src/util/server.c:493
+#, c-format
+msgid "`%s' failed for port %d (%s): address already in use\n"
+msgstr "„%s“ није успело за прикључник %d (%s): адреса је већ у употреби\n"
+
+#: src/util/server.c:499
+#, c-format
+msgid "`%s' failed for `%s': address already in use\n"
+msgstr "„%s“ није успело за „%s“: адреса је већ у употреби\n"
+
+#: src/util/server.c:892
+#, c-format
+msgid "Processing code for message of type %u did not call
`GNUNET_SERVER_receive_done' after %s\n"
+msgstr "Обрађивачки код за поруку врсте %u није позвао
„GNUNET_SERVER_receive_done“ након „%s“\n"
+
+#: src/util/service.c:347
+#, c-format
+msgid "Unknown address family %d\n"
+msgstr "Непозната породица адресе „%d“\n"
+
+#: src/util/service.c:354
+#, c-format
+msgid "Access from `%s' denied to service `%s'\n"
+msgstr "Приступ из „%s“ је забрањен за услугу „%s“\n"
+
+#: src/util/service.c:409
+#, c-format
+msgid "Could not parse IPv4 network specification `%s' for `%s:%s'\n"
+msgstr "Не могу да обрадим спецификацију ИПв4 мреже „%s“ за `%s:%s'\n"
+
+#: src/util/service.c:446
+#, c-format
+msgid "Could not parse IPv6 network specification `%s' for `%s:%s'\n"
+msgstr "Не могу да обрадим спецификацију ИПв6 мреже „%s“ за `%s:%s'\n"
+
+#: src/util/service.c:563
+#, c-format
+msgid "Disabling IPv6 support for service `%s', failed to create IPv6 socket:
%s\n"
+msgstr "Искључујем ИПв6 подршку за услугу „%s“, нисм успео да направим ИПв6
прикључницу: %s\n"
+
+#: src/util/service.c:653
+#, c-format
+msgid "Disabling UNIX domain socket support for service `%s', failed to create
UNIX domain socket: %s\n"
+msgstr "Искључујем подршку прикључнице ЈУНИКС домена за услугу „%s“, нисм
успео да направим прикључницу ЈУНИКС домена: %s\n"
+
+#: src/util/service.c:669
+#, c-format
+msgid "Have neither PORT nor UNIXPATH for service `%s', but one is required\n"
+msgstr "Немам ни ПРИКЉУЧНИК ни ЈУНИКС_ПУТАЊУ за услугу „%s“, али је једно
потребно\n"
+
+#: src/util/service.c:903
+msgid "Could not access a pre-bound socket, will try to bind myself\n"
+msgstr "Не могу да приступим унапред свезаној прикључници, покушаћу да свежем
себе самог\n"
+
+#: src/util/service.c:952 src/util/service.c:970
+#, c-format
+msgid "Specified value for `%s' of service `%s' is invalid\n"
+msgstr "Наведена вредност за „%s“ услуге „%s“ је неисправна\n"
+
+#: src/util/service.c:995
+#, c-format
+msgid "Could not access pre-bound socket %u, will try to bind myself\n"
+msgstr "Не могу да приступим унапред свезаној прикључници %u, покушаћу да
свежем себе самог\n"
+
+#: src/util/service.c:1165
+#, c-format
+msgid "Failed to start `%s' at `%s'\n"
+msgstr "Нисам успео да покренем „%s“ на „%s“\n"
+
+#: src/util/service.c:1207
+#, c-format
+msgid "Service `%s' runs at %s\n"
+msgstr "Услуга „%s“ ради на „%s“\n"
+
+#: src/util/service.c:1256
+msgid "Service process failed to initialize\n"
+msgstr "Процес услуге није успео да се покрене\n"
+
+#: src/util/service.c:1260
+msgid "Service process could not initialize server function\n"
+msgstr "Процес услуге не може да покрене функцију сервера\n"
+
+#: src/util/service.c:1264
+msgid "Service process failed to report status\n"
+msgstr "Процес услуге није успео да извести о стању\n"
+
+#: src/util/service.c:1319
+msgid "No such user"
+msgstr "Нема таквог корисника"
+
+#: src/util/service.c:1332
+#, c-format
+msgid "Cannot change user/group to `%s': %s\n"
+msgstr "Не могу да променим власника/групу на „%s“: %s\n"
+
+#: src/util/service.c:1402
+msgid "do daemonize (detach from terminal)"
+msgstr "ради демонизацију (откачиње од терминала)"
+
+#: src/util/signal.c:89
+#, c-format
+msgid "signal (%d, %p) returned %d.\n"
+msgstr "сигнал (%d, %p) је дао %d.\n"
+
+#: src/util/strings.c:145
+msgid "b"
+msgstr "b"
+
+#: src/util/strings.c:433
+#, c-format
+msgid "Character sets requested were `%s'->`%s'\n"
+msgstr "Скупови знакова се захтевају где је „%s“–>„%s“\n"
+
+#: src/util/strings.c:561
+msgid "Failed to expand `$HOME': environment variable `HOME' not set"
+msgstr "Нисам успео да раширим „$HOME“: променљива окружења „HOME“ није
постављена"
+
+#: src/util/strings.c:658
+msgid "µs"
+msgstr "µs"
+
+#: src/util/strings.c:662
+msgid "forever"
+msgstr "заувек"
+
+#: src/util/strings.c:664
+msgid "0 ms"
+msgstr "0 ms"
+
+#: src/util/strings.c:670
+msgid "ms"
+msgstr "ms"
+
+#: src/util/strings.c:676
+msgid "s"
+msgstr "s"
+
+#: src/util/strings.c:682
+msgid "m"
+msgstr "m"
+
+#: src/util/strings.c:688
+msgid "h"
+msgstr "h"
+
+#: src/util/strings.c:695
+msgid "day"
+msgstr "дан"
+
+#: src/util/strings.c:697
+msgid "days"
+msgstr "дана"
+
+#: src/util/strings.c:726
+msgid "end of time"
+msgstr "крај времена"
+
+#: src/util/strings.c:1159
+msgid "IPv6 address did not start with `['\n"
+msgstr "ИПв6 адреса не почиње са [\n"
+
+#: src/util/strings.c:1167
+msgid "IPv6 address did contain ':' to separate port number\n"
+msgstr "ИПв6 адреса садржи : за раздвајање броја прикључника\n"
+
+#: src/util/strings.c:1173
+msgid "IPv6 address did contain ']' before ':' to separate port number\n"
+msgstr "ИПв6 адреса садржи ] пре : за раздвајање броја прикључника\n"
+
+#: src/util/strings.c:1180
+msgid "IPv6 address did contain a valid port number after the last ':'\n"
+msgstr "ИПв6 адреса садржи исправан број прикључника након последње „:“\n"
+
+#: src/util/strings.c:1189
+#, c-format
+msgid "Invalid IPv6 address `%s': %s\n"
+msgstr "Неисправна ИПв6 адреса „%s“: %s\n"
+
+#: src/util/strings.c:1395 src/util/strings.c:1411
+msgid "Port not in range\n"
+msgstr "Прикључник није у опсегу\n"
+
+#: src/util/strings.c:1420
+#, c-format
+msgid "Malformed port policy `%s'\n"
+msgstr "Лоша политика прикључника „%s“\n"
+
+#: src/util/strings.c:1503 src/util/strings.c:1534 src/util/strings.c:1582
+#: src/util/strings.c:1603
+#, c-format
+msgid "Invalid format for IP: `%s'\n"
+msgstr "Неисправан формат за ИП: „%s“\n"
+
+#: src/util/strings.c:1560
+#, c-format
+msgid "Invalid network notation ('/%d' is not legal in IPv4 CIDR)."
+msgstr "Неисправна напомена мреже („/%d“ није исправно у ИПв4 ЦИДР-у)."
+
+#: src/util/strings.c:1612
+#, c-format
+msgid "Invalid format: `%s'\n"
+msgstr "Неисправан формат: „%s“\n"
+
+#: src/util/strings.c:1664
+#, c-format
+msgid "Invalid network notation (does not end with ';': `%s')\n"
+msgstr "Неисправна напомена мреже (не завршава се са „;“: „%s“)\n"
+
+#: src/util/strings.c:1714
+#, c-format
+msgid "Wrong format `%s' for netmask\n"
+msgstr "Погрешан формат „%s“ за мрежну маску\n"
+
+#: src/util/strings.c:1745
+#, c-format
+msgid "Wrong format `%s' for network\n"
+msgstr "Погрешан формат „%s“ за мрежу\n"
+
+#: src/vpn/gnunet-service-vpn.c:550 src/vpn/gnunet-service-vpn.c:1086
+msgid "# Active channels"
+msgstr "# Активни канали"
+
+#: src/vpn/gnunet-service-vpn.c:642
+msgid "# Bytes given to mesh for transmission"
+msgstr "# Бајтови су дати мешу за преношење"
+
+#: src/vpn/gnunet-service-vpn.c:680
+msgid "# Bytes dropped in mesh queue (overflow)"
+msgstr "# Бајтови су одбачени у реду меша (прекорачење)"
+
+#: src/vpn/gnunet-service-vpn.c:753
+msgid "# Mesh channels created"
+msgstr "# Меш канали су направљени"
+
+#: src/vpn/gnunet-service-vpn.c:784
+msgid "Failed to setup mesh channel!\n"
+msgstr "Нисам успео да поставим меш канал!\n"
+
+#: src/vpn/gnunet-service-vpn.c:978
+#, c-format
+msgid "Protocol %u not supported, dropping\n"
+msgstr "Протокол %u није подржан, одбацујем\n"
+
+#: src/vpn/gnunet-service-vpn.c:1305
+msgid "# ICMPv4 packets dropped (not allowed)"
+msgstr "# ICMPv4 пакети су одбачени (нису дозвољени)"
+
+#: src/vpn/gnunet-service-vpn.c:1326
+msgid "# ICMPv6 packets dropped (not allowed)"
+msgstr "# ICMPv6 пакети су одбачени (нису дозвољени)"
+
+#: src/vpn/gnunet-service-vpn.c:1531
+msgid "# Packets received from TUN interface"
+msgstr "# Пакети су примљени са ТУН сучеља"
+
+#: src/vpn/gnunet-service-vpn.c:1564 src/vpn/gnunet-service-vpn.c:1600
+#, c-format
+msgid "Packet received for unmapped destination `%s' (dropping it)\n"
+msgstr "Пакет је примљен за одмапирано одредиште „%s“ (одбацујем га)\n"
+
+#: src/vpn/gnunet-service-vpn.c:1610
+msgid "Received IPv4 packet with options (dropping it)\n"
+msgstr "Примљен је ИПв4 пакет са опцијама (одбацујем га)\n"
+
+#: src/vpn/gnunet-service-vpn.c:1624
+#, c-format
+msgid "Received packet of unknown protocol %d from TUN (dropping it)\n"
+msgstr "Примљен је пакет непознатог протокола %d са ТУН-а (одбацујем га)\n"
+
+#: src/vpn/gnunet-service-vpn.c:1706
+msgid "# ICMP packets received from mesh"
+msgstr "# ИЦМП пакети су примљени од меша"
+
+#: src/vpn/gnunet-service-vpn.c:2045
+msgid "# UDP packets received from mesh"
+msgstr "# УДП пакети су примљени од меша"
+
+#: src/vpn/gnunet-service-vpn.c:2200
+msgid "# TCP packets received from mesh"
+msgstr "# ТЦП пакети су примљени од меша"
+
+#: src/vpn/gnunet-service-vpn.c:2351
+msgid "Failed to find unallocated IPv4 address in VPN's range\n"
+msgstr "Нисам успео да нађем недодељену ИПв4 адресу у опсегу ВПН-а\n"
+
+#: src/vpn/gnunet-service-vpn.c:2406
+msgid "Failed to find unallocated IPv6 address in VPN's range\n"
+msgstr "Нисам успео да нађем недодељену ИПв6 адресу у опсегу ВПН-а\n"
+
+#: src/vpn/gnunet-service-vpn.c:2447 src/vpn/gnunet-service-vpn.c:2663
+msgid "# Active destinations"
+msgstr "# Активна одредишта"
+
+#: src/vpn/gnunet-service-vpn.c:2715
+msgid "Failed to allocate IP address for new destination\n"
+msgstr "Нисам успео да доделим ИП адресу за ново одредиште\n"
+
+#: src/vpn/gnunet-service-vpn.c:2982
+msgid "Must specify valid IPv6 address"
+msgstr "Морате навести исправну ИПв6 адресу"
+
+#: src/vpn/gnunet-service-vpn.c:3006
+msgid "Must specify valid IPv6 mask"
+msgstr "Морате навести исправну ИПв6 маску"
+
+#: src/vpn/gnunet-service-vpn.c:3014
+msgid "IPv6 support disabled as this system does not support IPv6\n"
+msgstr "ИПв6 подршка је искључена јер овај систем не подржава ИПв6\n"
+
+#: src/vpn/gnunet-service-vpn.c:3027
+msgid "Must specify valid IPv4 address"
+msgstr "Морате навести исправну ИПв4 адресу"
+
+#: src/vpn/gnunet-service-vpn.c:3040
+msgid "Must specify valid IPv4 mask"
+msgstr "Морате навести исправну ИПв4 маску"
+
+#: src/vpn/gnunet-service-vpn.c:3050
+msgid "IPv4 support disabled as this system does not support IPv4\n"
+msgstr "ИПв4 подршка је искључена јер овај систем не подржава ИПв4\n"
+
+#: src/vpn/gnunet-vpn.c:147
+msgid "Error creating tunnel\n"
+msgstr "Грешка стварања тунела\n"
+
+#: src/vpn/gnunet-vpn.c:190 src/vpn/gnunet-vpn.c:221
+#, c-format
+msgid "Option `%s' makes no sense with option `%s'.\n"
+msgstr "Опција „%s“ нема смисла са опцијом „%s“.\n"
+
+#: src/vpn/gnunet-vpn.c:203
+#, c-format
+msgid "Option `%s' or `%s' is required.\n"
+msgstr "Опција „%s“ или „%s“ је потребна.\n"
+
+#: src/vpn/gnunet-vpn.c:215
+#, c-format
+msgid "Option `%s' or `%s' is required when using option `%s'.\n"
+msgstr "Опција „%s“ или „%s“ се захтева приликом коришћења опције „%s“.\n"
+
+#: src/vpn/gnunet-vpn.c:235
+#, c-format
+msgid "`%s' is not a valid peer identifier.\n"
+msgstr "„%s“ није исправан одредник парњака.\n"
+
+#: src/vpn/gnunet-vpn.c:255
+#, c-format
+msgid "`%s' is not a valid IP address.\n"
+msgstr "„%s“ није исправна ИП адреса.\n"
+
+#: src/vpn/gnunet-vpn.c:290
+msgid "request that result should be an IPv4 address"
+msgstr "захтева да резултат треба да буде ИПв4 адреса"
+
+#: src/vpn/gnunet-vpn.c:293
+msgid "request that result should be an IPv6 address"
+msgstr "захтева да резултат треба да буде ИПв6 адреса"
+
+#: src/vpn/gnunet-vpn.c:296
+msgid "how long should the mapping be valid for new tunnels?"
+msgstr "колико дуго мапирање треба бити важеће за нове тунеле?"
+
+#: src/vpn/gnunet-vpn.c:299
+msgid "destination IP for the tunnel"
+msgstr "ИП одредишта за тунел"
+
+#: src/vpn/gnunet-vpn.c:302
+msgid "peer offering the service we would like to access"
+msgstr "парњак који нуди услугу којој желимо да приступимо"
+
+#: src/vpn/gnunet-vpn.c:305
+msgid "name of the service we would like to access"
+msgstr "назив услуге којој желимо да приступимо"
+
+#: src/vpn/gnunet-vpn.c:308
+msgid "service is offered via TCP"
+msgstr "услуга се нуди путем ТЦП-а"
+
+#: src/vpn/gnunet-vpn.c:311
+msgid "service is offered via UDP"
+msgstr "услуга се нуди путем УДП-ом"
+
+#: src/vpn/gnunet-vpn.c:323
+msgid "Setup tunnels via VPN."
+msgstr "Поставља тунеле путем ВПН-а."
+
+#: src/include/gnunet_common.h:566 src/include/gnunet_common.h:573
+#: src/include/gnunet_common.h:581
+#, c-format
+msgid "Assertion failed at %s:%d.\n"
+msgstr "Потврђивање није успело на %s:%d.\n"
+
+#: src/include/gnunet_common.h:593
+#, c-format
+msgid "External protocol violation detected at %s:%d.\n"
+msgstr "Повреда спољног протокола је откривена на %s:%d.\n"
+
+#: src/include/gnunet_common.h:620 src/include/gnunet_common.h:629
+#, c-format
+msgid "`%s' failed on file `%s' at %s:%d with error: %s\n"
+msgstr "„%s“ није успело на датотеци „%s“ на %s:%d са грешком: %s\n"
diff --git a/po/sv.po b/po/sv.po
index 25812f069..6dd57d227 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: 2020-09-06 10:07+0200\n"
+"POT-Creation-Date: 2020-10-13 16:12+0200\n"
"PO-Revision-Date: 2006-01-21 17:16+0100\n"
"Last-Translator: Daniel Nylander <po@danielnylander.se>\n"
"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
@@ -27,8 +27,8 @@ msgid "Issuer public key `%s' is not well-formed\n"
msgstr "Ogiltigt argument: \"%s\"\n"
#: src/abd/gnunet-abd.c:560 src/abd/gnunet-service-abd.c:1747
-#: src/namestore/gnunet-namestore.c:1001
#: src/namestore/gnunet-namestore-fcfsd.c:1154
+#: src/namestore/gnunet-namestore.c:1001
#, fuzzy, c-format
msgid "Failed to connect to namestore\n"
msgstr "Misslyckades att ansluta till gnunetd.\n"
@@ -502,82 +502,14 @@ msgstr ""
msgid "Initiating shutdown as requested by client.\n"
msgstr ""
-#: src/ats/gnunet-ats-solver-eval.c:2992 src/ats/gnunet-ats-solver-eval.c:3044
-#, c-format
-msgid ""
-"Could not load quota for network `%s': `%s', assigning default bandwidth "
-"%llu\n"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3011
-#, c-format
-msgid ""
-"No outbound quota configured for network `%s', assigning default bandwidth "
-"%llu\n"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3063
-#, c-format
-msgid ""
-"No outbound quota configure for network `%s', assigning default bandwidth "
-"%llu\n"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3552 src/ats-tests/gnunet-solver-eval.c:997
-msgid "solver to use"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3557
-#: src/ats-tests/gnunet-solver-eval.c:1003
-#: src/ats-tests/gnunet-solver-eval.c:1008
-msgid "experiment to use"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3564
-#, fuzzy
-msgid "print logging"
-msgstr "Startade samling \"%s\".\n"
-
-#: src/ats/gnunet-ats-solver-eval.c:3569
-msgid "save logging to disk"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3574
-msgid "disable normalization"
-msgstr ""
-
-#: src/ats/gnunet-service-ats_plugins.c:326
-#, c-format
-msgid ""
-"Could not load %s quota for network `%s': `%s', assigning default bandwidth "
-"%llu\n"
-msgstr ""
-
-#: src/ats/gnunet-service-ats_plugins.c:336
-#, c-format
-msgid "%s quota configured for network `%s' is %llu\n"
-msgstr ""
-
-#: src/ats/gnunet-service-ats_plugins.c:382
-#, c-format
-msgid ""
-"No %s-quota configured for network `%s', assigning default bandwidth %llu\n"
+#: src/ats-tests/ats-testing-log.c:896
+msgid "Stop logging\n"
msgstr ""
-#: src/ats/gnunet-service-ats_plugins.c:474
-#, fuzzy, c-format
-msgid "Failed to initialize solver `%s'!\n"
-msgstr "Kunde inte initiera SQLite.\n"
-
-#: src/ats/plugin_ats_proportional.c:1142
-#, fuzzy, c-format
-msgid "Invalid %s configuration %f \n"
-msgstr "Kunde inte spara konfigurationsfil \"%s\":"
-
-#: src/ats/plugin_ats_proportional.c:1165
+#: src/ats-tests/ats-testing-log.c:952
#, fuzzy, c-format
-msgid "Invalid %s configuration %f\n"
-msgstr "Kunde inte spara konfigurationsfil \"%s\":"
+msgid "Start logging `%s'\n"
+msgstr "Startade samling \"%s\".\n"
#: src/ats-tests/ats-testing.c:420
#, c-format
@@ -589,15 +521,6 @@ msgstr ""
msgid "Failed to connect master peer [%u] with slave [%u]\n"
msgstr "Misslyckades att ansluta till gnunetd.\n"
-#: src/ats-tests/ats-testing-log.c:896
-msgid "Stop logging\n"
-msgstr ""
-
-#: src/ats-tests/ats-testing-log.c:952
-#, fuzzy, c-format
-msgid "Start logging `%s'\n"
-msgstr "Startade samling \"%s\".\n"
-
#: src/ats-tests/gnunet-ats-sim.c:92
#, c-format
msgid ""
@@ -605,6 +528,16 @@ msgid ""
"= %u KiB/s\n"
msgstr ""
+#: src/ats-tests/gnunet-solver-eval.c:997 src/ats/gnunet-ats-solver-eval.c:3552
+msgid "solver to use"
+msgstr ""
+
+#: src/ats-tests/gnunet-solver-eval.c:1003
+#: src/ats-tests/gnunet-solver-eval.c:1008
+#: src/ats/gnunet-ats-solver-eval.c:3557
+msgid "experiment to use"
+msgstr ""
+
#: src/ats-tool/gnunet-ats.c:299
#, c-format
msgid "%u address resolutions had a timeout\n"
@@ -726,6 +659,73 @@ msgstr ""
msgid "Print information about ATS state"
msgstr "Skriv ut information om GNUnets motparter."
+#: src/ats/gnunet-ats-solver-eval.c:2992 src/ats/gnunet-ats-solver-eval.c:3044
+#, c-format
+msgid ""
+"Could not load quota for network `%s': `%s', assigning default bandwidth "
+"%llu\n"
+msgstr ""
+
+#: src/ats/gnunet-ats-solver-eval.c:3011
+#, c-format
+msgid ""
+"No outbound quota configured for network `%s', assigning default bandwidth "
+"%llu\n"
+msgstr ""
+
+#: src/ats/gnunet-ats-solver-eval.c:3063
+#, c-format
+msgid ""
+"No outbound quota configure for network `%s', assigning default bandwidth "
+"%llu\n"
+msgstr ""
+
+#: src/ats/gnunet-ats-solver-eval.c:3564
+#, fuzzy
+msgid "print logging"
+msgstr "Startade samling \"%s\".\n"
+
+#: src/ats/gnunet-ats-solver-eval.c:3569
+msgid "save logging to disk"
+msgstr ""
+
+#: src/ats/gnunet-ats-solver-eval.c:3574
+msgid "disable normalization"
+msgstr ""
+
+#: src/ats/gnunet-service-ats_plugins.c:326
+#, c-format
+msgid ""
+"Could not load %s quota for network `%s': `%s', assigning default bandwidth "
+"%llu\n"
+msgstr ""
+
+#: src/ats/gnunet-service-ats_plugins.c:336
+#, c-format
+msgid "%s quota configured for network `%s' is %llu\n"
+msgstr ""
+
+#: src/ats/gnunet-service-ats_plugins.c:382
+#, c-format
+msgid ""
+"No %s-quota configured for network `%s', assigning default bandwidth %llu\n"
+msgstr ""
+
+#: src/ats/gnunet-service-ats_plugins.c:474
+#, fuzzy, c-format
+msgid "Failed to initialize solver `%s'!\n"
+msgstr "Kunde inte initiera SQLite.\n"
+
+#: src/ats/plugin_ats_proportional.c:1142
+#, fuzzy, c-format
+msgid "Invalid %s configuration %f \n"
+msgstr "Kunde inte spara konfigurationsfil \"%s\":"
+
+#: src/ats/plugin_ats_proportional.c:1165
+#, fuzzy, c-format
+msgid "Invalid %s configuration %f\n"
+msgstr "Kunde inte spara konfigurationsfil \"%s\":"
+
#: src/auction/gnunet-auction-create.c:163
msgid "description of the item to be sold"
msgstr ""
@@ -865,6 +865,28 @@ msgstr ""
msgid "Connection to conversation service lost, trying to reconnect\n"
msgstr ""
+#: src/conversation/gnunet-conversation-test.c:120
+#, c-format
+msgid ""
+"\n"
+"End of transmission. Have a GNU day.\n"
+msgstr ""
+
+#: src/conversation/gnunet-conversation-test.c:146
+#, c-format
+msgid ""
+"\n"
+"We are now playing your recording back. If you can hear it, your audio "
+"settings are working..."
+msgstr ""
+
+#: src/conversation/gnunet-conversation-test.c:218
+#, c-format
+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.c:264
#, c-format
msgid "Incoming call from `%s'. Please /accept %u or /cancel %u the call.\n"
@@ -1124,30 +1146,8 @@ msgstr ""
msgid "Enables having a conversation with other GNUnet users."
msgstr ""
-#: src/conversation/gnunet-conversation-test.c:120
-#, c-format
-msgid ""
-"\n"
-"End of transmission. Have a GNU day.\n"
-msgstr ""
-
-#: src/conversation/gnunet-conversation-test.c:146
-#, c-format
-msgid ""
-"\n"
-"We are now playing your recording back. If you can hear it, your audio "
-"settings are working..."
-msgstr ""
-
-#: src/conversation/gnunet-conversation-test.c:218
-#, c-format
-msgid ""
-"We will now be recording you for %s. After that time, the recording will be "
-"played back to you..."
-msgstr ""
-
-#: src/conversation/gnunet_gst.c:664
#: src/conversation/gnunet-helper-audio-playback-gst.c:363
+#: src/conversation/gnunet_gst.c:664
#, c-format
msgid "Read error from STDIN: %d %s\n"
msgstr ""
@@ -1975,17 +1975,17 @@ msgstr "\"%s\" till \"%s\" misslyckades vid %s:%d med
fel: %s\n"
msgid "Mysql database running\n"
msgstr ""
-#: src/datastore/plugin_datastore_postgres.c:278
-#: src/datastore/plugin_datastore_postgres.c:891
+#: src/datastore/plugin_datastore_postgres.c:284
+#: src/datastore/plugin_datastore_postgres.c:897
msgid "Postgress exec failure"
msgstr ""
-#: src/datastore/plugin_datastore_postgres.c:852
+#: src/datastore/plugin_datastore_postgres.c:858
#, 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:950
+#: src/datastore/plugin_datastore_postgres.c:956
msgid "Postgres database running\n"
msgstr ""
@@ -2093,90 +2093,42 @@ msgstr ""
msgid "Prints all packets that go through the DHT."
msgstr ""
-#: src/dht/gnunet_dht_profiler.c:922 src/testbed/gnunet-testbed-profiler.c:255
-#, fuzzy, c-format
-msgid "Exiting as the number of peers is %u\n"
-msgstr "Maximalt antal chattklienter uppnått.\n"
+#: src/dht/gnunet-dht-put.c:133
+msgid "Must provide KEY and DATA for DHT put!\n"
+msgstr ""
-#: src/dht/gnunet_dht_profiler.c:955 src/rps/gnunet-rps-profiler.c:3194
-#, fuzzy
-msgid "number of peers to start"
-msgstr "antal iterationer"
+#: src/dht/gnunet-dht-put.c:140
+#, fuzzy, c-format
+msgid "Could not connect to DHT service!\n"
+msgstr "Kunde inte ansluta till gnunetd.\n"
-#: src/dht/gnunet_dht_profiler.c:961
-msgid "number of PUTs to perform per peer"
+#: src/dht/gnunet-dht-put.c:151
+#, c-format
+msgid "Issuing put request for `%s' with data `%s'!\n"
msgstr ""
-#: src/dht/gnunet_dht_profiler.c:967 src/nse/gnunet-nse-profiler.c:872
-#: src/testbed/gnunet-testbed-profiler.c:305
-msgid "name of the file with the login information for the testbed"
+#: src/dht/gnunet-dht-put.c:187
+msgid "the data to insert under the key"
msgstr ""
-#: src/dht/gnunet_dht_profiler.c:973
-msgid "delay between rounds for collecting statistics (default: 30 sec)"
+#: src/dht/gnunet-dht-put.c:193
+msgid "how long to store this entry in the dht (in seconds)"
msgstr ""
-#: src/dht/gnunet_dht_profiler.c:979
-msgid "delay to start doing PUTs (default: 1 sec)"
+#: src/dht/gnunet-dht-put.c:208
+msgid "how many replicas to create"
msgstr ""
-#: src/dht/gnunet_dht_profiler.c:985
-msgid "delay to start doing GETs (default: 5 min)"
+#: src/dht/gnunet-dht-put.c:212
+msgid "use DHT's record route option"
msgstr ""
-#: src/dht/gnunet_dht_profiler.c:990
-msgid "replication degree for DHT PUTs"
+#: src/dht/gnunet-dht-put.c:217
+msgid "the type to insert data as"
msgstr ""
-#: src/dht/gnunet_dht_profiler.c:996
-msgid "chance that a peer is selected at random for PUTs"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1002
-msgid "timeout for DHT PUT and GET requests (default: 1 min)"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1023
-#, fuzzy
-msgid "Measure quality and performance of the DHT service."
-msgstr "Kan inte tillgå tjänsten"
-
-#: src/dht/gnunet-dht-put.c:133
-msgid "Must provide KEY and DATA for DHT put!\n"
-msgstr ""
-
-#: src/dht/gnunet-dht-put.c:140
-#, fuzzy, c-format
-msgid "Could not connect to DHT service!\n"
-msgstr "Kunde inte ansluta till gnunetd.\n"
-
-#: src/dht/gnunet-dht-put.c:151
-#, c-format
-msgid "Issuing put request for `%s' with data `%s'!\n"
-msgstr ""
-
-#: src/dht/gnunet-dht-put.c:187
-msgid "the data to insert under the key"
-msgstr ""
-
-#: src/dht/gnunet-dht-put.c:193
-msgid "how long to store this entry in the dht (in seconds)"
-msgstr ""
-
-#: src/dht/gnunet-dht-put.c:208
-msgid "how many replicas to create"
-msgstr ""
-
-#: src/dht/gnunet-dht-put.c:212
-msgid "use DHT's record route option"
-msgstr ""
-
-#: src/dht/gnunet-dht-put.c:217
-msgid "the type to insert data as"
-msgstr ""
-
-#: src/dht/gnunet-dht-put.c:232
-msgid "Issue a PUT request to the GNUnet DHT insert DATA under KEY."
+#: src/dht/gnunet-dht-put.c:232
+msgid "Issue a PUT request to the GNUnet DHT insert DATA under KEY."
msgstr ""
#: src/dht/gnunet-service-dht_clients.c:367
@@ -2411,6 +2363,54 @@ msgstr ""
msgid "# DHT requests combined"
msgstr "# byte mottogs via TCP"
+#: src/dht/gnunet_dht_profiler.c:922 src/testbed/gnunet-testbed-profiler.c:255
+#, fuzzy, c-format
+msgid "Exiting as the number of peers is %u\n"
+msgstr "Maximalt antal chattklienter uppnått.\n"
+
+#: src/dht/gnunet_dht_profiler.c:955 src/rps/gnunet-rps-profiler.c:3194
+#, fuzzy
+msgid "number of peers to start"
+msgstr "antal iterationer"
+
+#: src/dht/gnunet_dht_profiler.c:961
+msgid "number of PUTs to perform per peer"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:967 src/nse/gnunet-nse-profiler.c:872
+#: src/testbed/gnunet-testbed-profiler.c:305
+msgid "name of the file with the login information for the testbed"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:973
+msgid "delay between rounds for collecting statistics (default: 30 sec)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:979
+msgid "delay to start doing PUTs (default: 1 sec)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:985
+msgid "delay to start doing GETs (default: 5 min)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:990
+msgid "replication degree for DHT PUTs"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:996
+msgid "chance that a peer is selected at random for PUTs"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1002
+msgid "timeout for DHT PUT and GET requests (default: 1 min)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1023
+#, fuzzy
+msgid "Measure quality and performance of the DHT service."
+msgstr "Kan inte tillgå tjänsten"
+
#: src/dht/plugin_block_dht.c:189
#, fuzzy, c-format
msgid "Block not of type %u\n"
@@ -3362,15 +3362,6 @@ msgid ""
"chk/...)"
msgstr ""
-#: src/fs/gnunet-fs.c:128
-msgid "print a list of all indexed files"
-msgstr ""
-
-#: src/fs/gnunet-fs.c:141
-#, fuzzy
-msgid "Special file-sharing operations"
-msgstr "Visa alla alternativ"
-
#: src/fs/gnunet-fs-profiler.c:211
msgid "run the experiment with COUNT peers"
msgstr ""
@@ -3387,6 +3378,15 @@ msgstr ""
msgid "run a testbed to measure file-sharing performance"
msgstr ""
+#: src/fs/gnunet-fs.c:128
+msgid "print a list of all indexed files"
+msgstr ""
+
+#: src/fs/gnunet-fs.c:141
+#, fuzzy
+msgid "Special file-sharing operations"
+msgstr "Visa alla alternativ"
+
#: src/fs/gnunet-publish.c:219 src/fs/gnunet-publish.c:234
#, c-format
msgid "Publishing `%s' at %llu/%llu (%s remaining)\n"
@@ -4073,52 +4073,6 @@ msgstr ""
msgid "look for GNS2DNS records instead of ANY"
msgstr ""
-#: src/gns/gnunet-gns.c:257
-#, fuzzy, c-format
-msgid "`%s' is not a valid DNS domain name\n"
-msgstr "\"%s\" är inte tillgänglig."
-
-#: src/gns/gnunet-gns.c:267 src/util/dnsparser.c:254
-#, fuzzy, c-format
-msgid "Failed to convert DNS IDNA name `%s' to UTF-8: %s\n"
-msgstr "Misslyckades att leverera \"%s\" meddelande.\n"
-
-#: src/gns/gnunet-gns.c:281
-msgid "Cannot resolve using GNS: GNUnet peer not running\n"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:305
-#, c-format
-msgid "Invalid typename specified, assuming `ANY'\n"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:340
-msgid "Lookup a record for the given name"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:346
-#, fuzzy
-msgid "Specify the type of the record to lookup"
-msgstr "ange prioritet för innehållet"
-
-#: src/gns/gnunet-gns.c:352
-#, fuzzy
-msgid "Specify a timeout for the lookup"
-msgstr "ange prioritet för innehållet"
-
-#: src/gns/gnunet-gns.c:356
-msgid "No unneeded output"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:361
-msgid "DNS Compatibility: Name is passed in IDNA instead of UTF-8"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:375
-#, fuzzy
-msgid "GNUnet GNS resolver tool"
-msgstr "Spåra GNUnets nätverkstopologi."
-
#: src/gns/gnunet-gns-import.c:486
msgid "This program will import some GNS authorities into your GNS namestore."
msgstr ""
@@ -4239,6 +4193,52 @@ msgstr ""
msgid "GNUnet GNS proxy"
msgstr ""
+#: src/gns/gnunet-gns.c:257
+#, fuzzy, c-format
+msgid "`%s' is not a valid DNS domain name\n"
+msgstr "\"%s\" är inte tillgänglig."
+
+#: src/gns/gnunet-gns.c:267 src/util/dnsparser.c:254
+#, fuzzy, c-format
+msgid "Failed to convert DNS IDNA name `%s' to UTF-8: %s\n"
+msgstr "Misslyckades att leverera \"%s\" meddelande.\n"
+
+#: src/gns/gnunet-gns.c:281
+msgid "Cannot resolve using GNS: GNUnet peer not running\n"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:305
+#, c-format
+msgid "Invalid typename specified, assuming `ANY'\n"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:340
+msgid "Lookup a record for the given name"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:346
+#, fuzzy
+msgid "Specify the type of the record to lookup"
+msgstr "ange prioritet för innehållet"
+
+#: src/gns/gnunet-gns.c:352
+#, fuzzy
+msgid "Specify a timeout for the lookup"
+msgstr "ange prioritet för innehållet"
+
+#: src/gns/gnunet-gns.c:356
+msgid "No unneeded output"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:361
+msgid "DNS Compatibility: Name is passed in IDNA instead of UTF-8"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:375
+#, fuzzy
+msgid "GNUnet GNS resolver tool"
+msgstr "Spåra GNUnets nätverkstopologi."
+
#: src/gns/gnunet-service-gns.c:505
#, fuzzy
msgid "Properly base32-encoded public key required"
@@ -4250,8 +4250,8 @@ msgid "Failed to connect to the namecache!\n"
msgstr "Misslyckades att ansluta till gnunetd.\n"
#: src/gns/gnunet-service-gns.c:560
-#: src/zonemaster/gnunet-service-zonemaster.c:887
#: src/zonemaster/gnunet-service-zonemaster-monitor.c:444
+#: src/zonemaster/gnunet-service-zonemaster.c:887
#, fuzzy
msgid "Could not connect to DHT!\n"
msgstr "Kunde inte ansluta till gnunetd.\n"
@@ -4749,7 +4749,7 @@ msgid "# hostlist advertisements send"
msgstr ""
#: src/hostlist/gnunet-daemon-hostlist_server.c:674
-#: src/transport/gnunet-service-transport.c:2659
+#: src/transport/gnunet-service-transport.c:2661
#, fuzzy
msgid "Could not access PEERINFO service. Exiting.\n"
msgstr "Kunde inte komma åt namnrymdsinformation.\n"
@@ -5003,6 +5003,70 @@ msgstr ""
msgid "Failed to setup database at `%s'\n"
msgstr "Fel vid %s:%d.\n"
+#: src/namestore/gnunet-namestore-fcfsd.c:552
+#, fuzzy, c-format
+msgid "Unsupported form value `%s'\n"
+msgstr "Kommando \"%s\" stöds ej. Avbryter.\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:579
+#, fuzzy, c-format
+msgid "Failed to create record for domain `%s': %s\n"
+msgstr "Kunde inte tolka konfigurationsfil \"%s\".\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:600
+msgid "Error when mapping zone to name\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:632
+#, c-format
+msgid "Found existing name `%s' for the given key\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:694
+#, c-format
+msgid "Found %u existing records for domain `%s'\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:784
+#, fuzzy, c-format
+msgid "Failed to create page for `%s'\n"
+msgstr "Kunde inte skapa namnrymd \"%s\" (existerar?).\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:803
+#, fuzzy, c-format
+msgid "Failed to setup post processor for `%s'\n"
+msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:840
+msgid "Domain name must not contain `.'\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:849
+msgid "Domain name must not contain `+'\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1084
+msgid "No ego configured for `fcfsd` subsystem\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1115
+#, fuzzy
+msgid "Failed to start HTTP server\n"
+msgstr "Misslyckades att starta samling.\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1163
+#, fuzzy
+msgid "Failed to connect to identity\n"
+msgstr "Misslyckades att ansluta till gnunetd.\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1190
+msgid "name of the zone that is to be managed by FCFSD"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1210
+msgid "GNU Name System First Come First Serve name registration service"
+msgstr ""
+
#: src/namestore/gnunet-namestore.c:334
#, fuzzy, c-format
msgid "Adding record failed: %s\n"
@@ -5239,70 +5303,6 @@ msgstr ""
msgid "name of the ego controlling the zone"
msgstr "Visa värde av alternativet"
-#: src/namestore/gnunet-namestore-fcfsd.c:552
-#, fuzzy, c-format
-msgid "Unsupported form value `%s'\n"
-msgstr "Kommando \"%s\" stöds ej. Avbryter.\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:579
-#, fuzzy, c-format
-msgid "Failed to create record for domain `%s': %s\n"
-msgstr "Kunde inte tolka konfigurationsfil \"%s\".\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:600
-msgid "Error when mapping zone to name\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:632
-#, c-format
-msgid "Found existing name `%s' for the given key\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:694
-#, c-format
-msgid "Found %u existing records for domain `%s'\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:784
-#, fuzzy, c-format
-msgid "Failed to create page for `%s'\n"
-msgstr "Kunde inte skapa namnrymd \"%s\" (existerar?).\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:803
-#, fuzzy, c-format
-msgid "Failed to setup post processor for `%s'\n"
-msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:840
-msgid "Domain name must not contain `.'\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:849
-msgid "Domain name must not contain `+'\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1084
-msgid "No ego configured for `fcfsd` subsystem\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1115
-#, fuzzy
-msgid "Failed to start HTTP server\n"
-msgstr "Misslyckades att starta samling.\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1163
-#, fuzzy
-msgid "Failed to connect to identity\n"
-msgstr "Misslyckades att ansluta till gnunetd.\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1190
-msgid "name of the zone that is to be managed by FCFSD"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1210
-msgid "GNU Name System First Come First Serve name registration service"
-msgstr ""
-
#: src/namestore/gnunet-service-namestore.c:866
#, fuzzy, c-format
msgid "Failed to replicate block in namecache: %s\n"
@@ -5625,11 +5625,6 @@ msgstr ""
msgid "`upnpc' command not found\n"
msgstr ""
-#: src/nse/gnunet-nse.c:124
-#, fuzzy
-msgid "Show network size estimates from NSE service."
-msgstr "# byte mottogs via TCP"
-
#: src/nse/gnunet-nse-profiler.c:857
#, fuzzy
msgid "limit to the number of connections to NSE services, 0 for none"
@@ -5656,66 +5651,16 @@ msgstr ""
msgid "Measure quality and performance of the NSE service."
msgstr "Kan inte tillgå tjänsten"
-#: src/nse/gnunet-service-nse.c:1443
-#: src/revocation/gnunet-service-revocation.c:834 src/util/gnunet-scrypt.c:257
-msgid "Value is too large.\n"
-msgstr ""
-
-#: src/peerinfo/gnunet-service-peerinfo.c:175
-#, fuzzy, c-format
-msgid "Removing expired address of transport `%s'\n"
-msgstr "Tillgängliga transport(er): %s\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:306
-#, fuzzy, c-format
-msgid "Failed to parse HELLO in file `%s': %s\n"
-msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:323
-#: src/peerinfo/gnunet-service-peerinfo.c:348
-#, fuzzy, c-format
-msgid "Failed to parse HELLO in file `%s'\n"
-msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:426
-msgid "# peers known"
-msgstr ""
-
-#: src/peerinfo/gnunet-service-peerinfo.c:468
-#, c-format
-msgid ""
-"File `%s' in directory `%s' does not match naming convention. Removed.\n"
-msgstr ""
-
-#: src/peerinfo/gnunet-service-peerinfo.c:624
-#, fuzzy, c-format
-msgid "Scanning directory `%s'\n"
-msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:631
-#, c-format
-msgid "Still no peers found in `%s'!\n"
-msgstr ""
-
-#: src/peerinfo/gnunet-service-peerinfo.c:1024
-#, fuzzy, c-format
-msgid "Cleaning up directory `%s'\n"
-msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:1319
-#, c-format
-msgid "Importing HELLOs from `%s'\n"
-msgstr ""
+#: src/nse/gnunet-nse.c:124
+#, fuzzy
+msgid "Show network size estimates from NSE service."
+msgstr "# byte mottogs via TCP"
-#: src/peerinfo/gnunet-service-peerinfo.c:1332
-msgid "Skipping import of included HELLOs\n"
+#: src/nse/gnunet-service-nse.c:1443
+#: src/revocation/gnunet-service-revocation.c:834 src/util/gnunet-scrypt.c:257
+msgid "Value is too large.\n"
msgstr ""
-#: src/peerinfo/peerinfo_api.c:217
-#, fuzzy
-msgid "Failed to receive response from `PEERINFO' service."
-msgstr "Misslyckades att ta emot svar till \"%s\" meddelande från gnunetd\n"
-
#: src/peerinfo-tool/gnunet-peerinfo.c:237
#, fuzzy, c-format
msgid "%sPeer `%s'\n"
@@ -5812,6 +5757,61 @@ msgstr "Kunde inte slå upp \"%s\": %s\n"
msgid "Peerinfo REST API initialized\n"
msgstr " Anslutning misslyckades\n"
+#: src/peerinfo/gnunet-service-peerinfo.c:175
+#, fuzzy, c-format
+msgid "Removing expired address of transport `%s'\n"
+msgstr "Tillgängliga transport(er): %s\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:306
+#, fuzzy, c-format
+msgid "Failed to parse HELLO in file `%s': %s\n"
+msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:323
+#: src/peerinfo/gnunet-service-peerinfo.c:348
+#, fuzzy, c-format
+msgid "Failed to parse HELLO in file `%s'\n"
+msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:426
+msgid "# peers known"
+msgstr ""
+
+#: src/peerinfo/gnunet-service-peerinfo.c:468
+#, c-format
+msgid ""
+"File `%s' in directory `%s' does not match naming convention. Removed.\n"
+msgstr ""
+
+#: src/peerinfo/gnunet-service-peerinfo.c:624
+#, fuzzy, c-format
+msgid "Scanning directory `%s'\n"
+msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:631
+#, c-format
+msgid "Still no peers found in `%s'!\n"
+msgstr ""
+
+#: src/peerinfo/gnunet-service-peerinfo.c:1024
+#, fuzzy, c-format
+msgid "Cleaning up directory `%s'\n"
+msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:1319
+#, c-format
+msgid "Importing HELLOs from `%s'\n"
+msgstr ""
+
+#: src/peerinfo/gnunet-service-peerinfo.c:1332
+msgid "Skipping import of included HELLOs\n"
+msgstr ""
+
+#: src/peerinfo/peerinfo_api.c:217
+#, fuzzy
+msgid "Failed to receive response from `PEERINFO' service."
+msgstr "Misslyckades att ta emot svar till \"%s\" meddelande från gnunetd\n"
+
#: src/peerstore/gnunet-peerstore.c:92
msgid "peerstore"
msgstr ""
@@ -6283,18 +6283,6 @@ msgstr ""
msgid "Could not open revocation database file!"
msgstr "Kunde inte ansluta till gnunetd.\n"
-#: src/rps/gnunet-rps.c:270
-msgid "Seed a PeerID"
-msgstr ""
-
-#: src/rps/gnunet-rps.c:275
-msgid "Get updates of view (0 for infinite updates)"
-msgstr ""
-
-#: src/rps/gnunet-rps.c:279
-msgid "Get peers from biased stream"
-msgstr ""
-
#: src/rps/gnunet-rps-profiler.c:3200
msgid "duration of the profiling"
msgstr ""
@@ -6314,6 +6302,18 @@ msgstr "antal iterationer"
msgid "Measure quality and performance of the RPS service."
msgstr "Kan inte tillgå tjänsten"
+#: src/rps/gnunet-rps.c:270
+msgid "Seed a PeerID"
+msgstr ""
+
+#: src/rps/gnunet-rps.c:275
+msgid "Get updates of view (0 for infinite updates)"
+msgstr ""
+
+#: src/rps/gnunet-rps.c:279
+msgid "Get peers from biased stream"
+msgstr ""
+
#: src/scalarproduct/gnunet-scalarproduct.c:229
#, fuzzy
msgid "You must specify at least one message ID to check!\n"
@@ -6369,10 +6369,10 @@ msgstr ""
msgid "Calculate the Vectorproduct with a GNUnet peer."
msgstr ""
-#: src/scalarproduct/gnunet-service-scalarproduct_alice.c:1358
-#: src/scalarproduct/gnunet-service-scalarproduct_bob.c:1355
#: src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c:1118
#: src/scalarproduct/gnunet-service-scalarproduct-ecc_bob.c:1063
+#: src/scalarproduct/gnunet-service-scalarproduct_alice.c:1358
+#: src/scalarproduct/gnunet-service-scalarproduct_bob.c:1355
#, fuzzy
msgid "Connect to CADET failed\n"
msgstr " Anslutning misslyckades (fel?)\n"
@@ -6727,16 +6727,6 @@ msgstr ""
msgid "%.s Unknown result code."
msgstr ""
-#: src/testbed/gnunet_testbed_mpi_spawn.c:119
-#, fuzzy
-msgid "Waiting for child to exit.\n"
-msgstr "Väntar på att motparter ska ansluta (%u iterationer kvar)...\n"
-
-#: src/testbed/gnunet_testbed_mpi_spawn.c:242
-#, fuzzy, c-format
-msgid "Spawning process `%s'\n"
-msgstr "Startade samling \"%s\".\n"
-
#: src/testbed/gnunet-testbed-profiler.c:290
msgid "tolerate COUNT number of continious timeout failures"
msgstr ""
@@ -6748,6 +6738,16 @@ msgid ""
"signal is received"
msgstr ""
+#: src/testbed/gnunet_testbed_mpi_spawn.c:119
+#, fuzzy
+msgid "Waiting for child to exit.\n"
+msgstr "Väntar på att motparter ska ansluta (%u iterationer kvar)...\n"
+
+#: src/testbed/gnunet_testbed_mpi_spawn.c:242
+#, fuzzy, c-format
+msgid "Spawning process `%s'\n"
+msgstr "Startade samling \"%s\".\n"
+
#: src/testbed/testbed_api.c:399
#, fuzzy, c-format
msgid "Adding host %u failed with error: %s\n"
@@ -7044,19 +7044,19 @@ msgstr "# krypterade PONG-meddelanden mottagna"
msgid "GNUnet topology control"
msgstr ""
-#: src/transport/gnunet-communicator-tcp.c:3189
-#: src/transport/gnunet-communicator-udp.c:2826
+#: src/transport/gnunet-communicator-tcp.c:3221
+#: src/transport/gnunet-communicator-udp.c:2995
#: src/transport/gnunet-service-tng.c:10014
-#: src/transport/gnunet-service-transport.c:2624
+#: src/transport/gnunet-service-transport.c:2626
#, fuzzy
msgid "Transport service is lacking key configuration settings. Exiting.\n"
msgstr "GNUnet-konfiguration"
-#: src/transport/gnunet-communicator-tcp.c:3494
+#: src/transport/gnunet-communicator-tcp.c:3553
msgid "GNUnet TCP communicator"
msgstr ""
-#: src/transport/gnunet-communicator-udp.c:2898
+#: src/transport/gnunet-communicator-udp.c:3067
msgid "GNUnet UDP communicator"
msgstr ""
@@ -7081,53 +7081,53 @@ msgstr "Kunde inte skapa namnrymd \"%s\"
(existerar?).\n"
msgid "GNUnet UNIX domain socket communicator"
msgstr ""
-#: src/transport/gnunet-service-transport_ats.c:137
-msgid "# Addresses given to ATS"
-msgstr ""
-
#: src/transport/gnunet-service-transport.c:445
msgid "# messages dropped due to slow client"
msgstr ""
-#: src/transport/gnunet-service-transport.c:794
+#: src/transport/gnunet-service-transport.c:796
msgid "# bytes payload dropped (other peer was not connected)"
msgstr ""
-#: src/transport/gnunet-service-transport.c:1477
+#: src/transport/gnunet-service-transport.c:1479
#, fuzzy
msgid "# bytes payload discarded due to not connected peer"
msgstr "Nätverksannonsering avstängd i konfigurationen!\n"
-#: src/transport/gnunet-service-transport.c:1622
+#: src/transport/gnunet-service-transport.c:1624
#, fuzzy
msgid "# bytes total received"
msgstr "# byte krypterade"
-#: src/transport/gnunet-service-transport.c:1712
+#: src/transport/gnunet-service-transport.c:1714
#, fuzzy
msgid "# bytes payload received"
msgstr "# byte dekrypterade"
-#: src/transport/gnunet-service-transport.c:2016
-#: src/transport/gnunet-service-transport.c:2450
+#: src/transport/gnunet-service-transport.c:2018
+#: src/transport/gnunet-service-transport.c:2452
msgid "# disconnects due to blacklist"
msgstr ""
-#: src/transport/gnunet-service-transport.c:2454
+#: src/transport/gnunet-service-transport.c:2456
#, fuzzy, c-format
msgid "Disallowing connection to peer `%s' on transport %s\n"
msgstr "Kunde inte slå upp \"%s\": %s\n"
-#: src/transport/gnunet-service-transport.c:2549
+#: src/transport/gnunet-service-transport.c:2551
#, fuzzy, c-format
msgid "Adding blacklisting entry for peer `%s'\n"
msgstr "Motpart \"%s\" med pålitlighet %8u och adress \"%s\"\n"
-#: src/transport/gnunet-service-transport.c:2558
+#: src/transport/gnunet-service-transport.c:2560
#, c-format
msgid "Adding blacklisting entry for peer `%s':`%s'\n"
msgstr ""
+#: src/transport/gnunet-service-transport_ats.c:137
+msgid "# Addresses given to ATS"
+msgstr ""
+
#: src/transport/gnunet-service-transport_hello.c:195
msgid "# refreshed my HELLO"
msgstr ""
@@ -7464,6 +7464,46 @@ msgstr ""
msgid "# HELLOs given to peerinfo"
msgstr "Meddelande mottaget från klient är ogiltig.\n"
+#: src/transport/gnunet-transport-profiler.c:220
+#, c-format
+msgid "%llu B in %llu ms == %.2f KB/s!\n"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:577
+msgid "send data to peer"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:581
+#, fuzzy
+msgid "receive data from peer"
+msgstr "# byte mottagna av typen %d"
+
+#: src/transport/gnunet-transport-profiler.c:586
+#, fuzzy
+msgid "iterations"
+msgstr "Visa alla alternativ"
+
+#: src/transport/gnunet-transport-profiler.c:591
+#, fuzzy
+msgid "number of messages to send"
+msgstr "antal meddelanden att använda per iteration"
+
+#: src/transport/gnunet-transport-profiler.c:596
+#, fuzzy
+msgid "message size to use"
+msgstr "meddelandestorlek"
+
+#: src/transport/gnunet-transport-profiler.c:601
+#: src/transport/gnunet-transport.c:1404
+msgid "peer identity"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:614
+#: src/transport/gnunet-transport.c:1426
+#, fuzzy
+msgid "Direct access to transport service."
+msgstr "Misslyckades att ansluta till gnunetd.\n"
+
#: src/transport/gnunet-transport.c:406
#, fuzzy, c-format
msgid "Transmitted %llu bytes/s (%llu bytes in %s)\n"
@@ -7603,11 +7643,6 @@ msgstr "Skriv ut information om GNUnets motparter."
msgid "do not resolve hostnames"
msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
-#: src/transport/gnunet-transport.c:1404
-#: src/transport/gnunet-transport-profiler.c:601
-msgid "peer identity"
-msgstr ""
-
#: src/transport/gnunet-transport.c:1408
msgid "monitor plugin sessions"
msgstr ""
@@ -7616,41 +7651,6 @@ msgstr ""
msgid "send data for benchmarking to the other peer (until CTRL-C)"
msgstr ""
-#: src/transport/gnunet-transport.c:1426
-#: src/transport/gnunet-transport-profiler.c:614
-#, fuzzy
-msgid "Direct access to transport service."
-msgstr "Misslyckades att ansluta till gnunetd.\n"
-
-#: src/transport/gnunet-transport-profiler.c:220
-#, c-format
-msgid "%llu B in %llu ms == %.2f KB/s!\n"
-msgstr ""
-
-#: src/transport/gnunet-transport-profiler.c:577
-msgid "send data to peer"
-msgstr ""
-
-#: src/transport/gnunet-transport-profiler.c:581
-#, fuzzy
-msgid "receive data from peer"
-msgstr "# byte mottagna av typen %d"
-
-#: src/transport/gnunet-transport-profiler.c:586
-#, fuzzy
-msgid "iterations"
-msgstr "Visa alla alternativ"
-
-#: src/transport/gnunet-transport-profiler.c:591
-#, fuzzy
-msgid "number of messages to send"
-msgstr "antal meddelanden att använda per iteration"
-
-#: src/transport/gnunet-transport-profiler.c:596
-#, fuzzy
-msgid "message size to use"
-msgstr "meddelandestorlek"
-
#: src/transport/plugin_transport_http_client.c:1489
#: src/transport/plugin_transport_http_server.c:2331
#: src/transport/plugin_transport_http_server.c:3562
@@ -7938,21 +7938,6 @@ msgstr ""
msgid "TCP transport advertises itself as being on port %llu\n"
msgstr ""
-#: src/transport/plugin_transport_udp_broadcasting.c:169
-#, fuzzy
-msgid "# Multicast HELLO beacons received via UDP"
-msgstr "# krypterade PONG-meddelanden mottagna"
-
-#: src/transport/plugin_transport_udp_broadcasting.c:553
-msgid ""
-"Disabling HELLO broadcasting due to friend-to-friend only configuration!\n"
-msgstr ""
-
-#: src/transport/plugin_transport_udp_broadcasting.c:571
-#, c-format
-msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n"
-msgstr ""
-
#: src/transport/plugin_transport_udp.c:3169
#, c-format
msgid ""
@@ -8001,6 +7986,21 @@ msgstr "\"%s\" är inte tillgänglig."
msgid "Failed to create UDP network sockets\n"
msgstr "Kunde inte skapa namnrymd \"%s\" (existerar?).\n"
+#: src/transport/plugin_transport_udp_broadcasting.c:169
+#, fuzzy
+msgid "# Multicast HELLO beacons received via UDP"
+msgstr "# krypterade PONG-meddelanden mottagna"
+
+#: src/transport/plugin_transport_udp_broadcasting.c:553
+msgid ""
+"Disabling HELLO broadcasting due to friend-to-friend only configuration!\n"
+msgstr ""
+
+#: src/transport/plugin_transport_udp_broadcasting.c:571
+#, c-format
+msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n"
+msgstr ""
+
#: src/transport/plugin_transport_unix.c:1396
#, fuzzy, c-format
msgid "Cannot bind to `%s'\n"
@@ -8184,7 +8184,7 @@ msgid "do daemonize (detach from terminal)"
msgstr ""
#: src/transport/tcp_service_legacy.c:1397
-#: src/transport/transport-testing2.c:1116 src/util/service.c:2072
+#: src/transport/transport-testing2.c:983 src/util/service.c:2072
#: src/util/service.c:2084
#, fuzzy, c-format
msgid "Malformed configuration file `%s', exit ...\n"
@@ -8852,19 +8852,19 @@ msgid ""
"Fatal internal logic error, process hangs in `%s' (abort with CTRL-C)!\n"
msgstr ""
-#: src/util/os_installation.c:409
+#: src/util/os_installation.c:411
#, c-format
msgid ""
"Could not determine installation path for %s. Set `%s' environment "
"variable.\n"
msgstr ""
-#: src/util/os_installation.c:792
+#: src/util/os_installation.c:794
#, fuzzy, c-format
msgid "Could not find binary `%s' in PATH!\n"
msgstr "Kunde inte hitta motpart \"%s\" i routingtabell!\n"
-#: src/util/os_installation.c:825
+#: src/util/os_installation.c:827
#, c-format
msgid "Binary `%s' exists, but is not SUID\n"
msgstr ""
@@ -8889,17 +8889,17 @@ msgstr "\"%s\" misslyckades vid %s:%d med fel: %s\n"
msgid "Could not determine plugin installation path.\n"
msgstr "Kunde inte fastställa min publika IPv6-adress.\n"
-#: src/util/program.c:262
+#: src/util/program.c:267
#, fuzzy, c-format
msgid "Unreadable or malformed configuration file `%s', exit ...\n"
msgstr "Kunde inte spara konfigurationsfil \"%s\":"
-#: src/util/program.c:279
+#: src/util/program.c:284
#, fuzzy, c-format
msgid "Unreadable or malformed default configuration file `%s', exit ...\n"
msgstr "Kunde inte spara konfigurationsfil \"%s\":"
-#: src/util/program.c:294
+#: src/util/program.c:299
#, fuzzy
msgid "Unreadable or malformed configuration, exit ...\n"
msgstr "Kunde inte spara konfigurationsfil \"%s\":"
@@ -8966,10 +8966,6 @@ msgstr ""
msgid "Attempting to proxy service `%s' to invalid port %d or hostname.\n"
msgstr ""
-#: src/util/strings.c:179
-msgid "b"
-msgstr "b"
-
#: src/util/strings.c:503
#, c-format
msgid "Character sets requested were `%s'->`%s'\n"
@@ -8979,48 +8975,6 @@ msgstr ""
msgid "Failed to expand `$HOME': environment variable `HOME' not set"
msgstr ""
-#: src/util/strings.c:706
-msgid "µs"
-msgstr ""
-
-#: src/util/strings.c:710
-msgid "forever"
-msgstr ""
-
-#: src/util/strings.c:712
-msgid "0 ms"
-msgstr ""
-
-#: src/util/strings.c:716
-msgid "ms"
-msgstr "ms"
-
-#: src/util/strings.c:720
-msgid "s"
-msgstr "s"
-
-#: src/util/strings.c:724
-msgid "m"
-msgstr "m"
-
-#: src/util/strings.c:728
-msgid "h"
-msgstr "h"
-
-#: src/util/strings.c:734
-#, fuzzy
-msgid "day"
-msgstr " dagar"
-
-#: src/util/strings.c:736
-#, fuzzy
-msgid "days"
-msgstr " dagar"
-
-#: src/util/strings.c:764
-msgid "end of time"
-msgstr ""
-
#: src/util/strings.c:1240
msgid "IPv6 address did not start with `['\n"
msgstr ""
@@ -9271,12 +9225,35 @@ msgstr "# byte mottagna via UDP"
msgid "Setup tunnels via VPN."
msgstr ""
-#: src/zonemaster/gnunet-service-zonemaster.c:849
#: src/zonemaster/gnunet-service-zonemaster-monitor.c:420
+#: src/zonemaster/gnunet-service-zonemaster.c:849
#, fuzzy
msgid "Failed to connect to the namestore!\n"
msgstr "Misslyckades att ansluta till gnunetd.\n"
+#~ msgid "b"
+#~ msgstr "b"
+
+#~ msgid "ms"
+#~ msgstr "ms"
+
+#~ msgid "s"
+#~ msgstr "s"
+
+#~ msgid "m"
+#~ msgstr "m"
+
+#~ msgid "h"
+#~ msgstr "h"
+
+#, fuzzy
+#~ msgid "day"
+#~ msgstr " dagar"
+
+#, fuzzy
+#~ msgid "days"
+#~ msgstr " dagar"
+
#, fuzzy, c-format
#~ msgid "Could not acquire lock on file `%s': %s...\n"
#~ msgstr "Kunde inte slå upp \"%s\": %s\n"
diff --git a/po/vi.po b/po/vi.po
index 732d1d432..7f142eea6 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: 2020-09-06 10:07+0200\n"
+"POT-Creation-Date: 2020-10-13 16:12+0200\n"
"PO-Revision-Date: 2008-09-10 22:05+0930\n"
"Last-Translator: Clytie Siddall <clytie@riverland.net.au>\n"
"Language-Team: Vietnamese <vi-VN@googlegroups.com>\n"
@@ -30,8 +30,8 @@ msgid "Issuer public key `%s' is not well-formed\n"
msgstr "Đối số không hợp lệ cho « %s ».\n"
#: src/abd/gnunet-abd.c:560 src/abd/gnunet-service-abd.c:1747
-#: src/namestore/gnunet-namestore.c:1001
#: src/namestore/gnunet-namestore-fcfsd.c:1154
+#: src/namestore/gnunet-namestore.c:1001
#, fuzzy, c-format
msgid "Failed to connect to namestore\n"
msgstr "Không kết nối được đến trình nền gnunetd."
@@ -509,82 +509,15 @@ msgstr ""
msgid "Initiating shutdown as requested by client.\n"
msgstr ""
-#: src/ats/gnunet-ats-solver-eval.c:2992 src/ats/gnunet-ats-solver-eval.c:3044
-#, c-format
-msgid ""
-"Could not load quota for network `%s': `%s', assigning default bandwidth "
-"%llu\n"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3011
-#, c-format
-msgid ""
-"No outbound quota configured for network `%s', assigning default bandwidth "
-"%llu\n"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3063
-#, c-format
-msgid ""
-"No outbound quota configure for network `%s', assigning default bandwidth "
-"%llu\n"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3552 src/ats-tests/gnunet-solver-eval.c:997
-msgid "solver to use"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3557
-#: src/ats-tests/gnunet-solver-eval.c:1003
-#: src/ats-tests/gnunet-solver-eval.c:1008
-msgid "experiment to use"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3564
+#: src/ats-tests/ats-testing-log.c:896
#, fuzzy
-msgid "print logging"
+msgid "Stop logging\n"
msgstr "Theo dõi"
-#: src/ats/gnunet-ats-solver-eval.c:3569
-msgid "save logging to disk"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3574
-msgid "disable normalization"
-msgstr ""
-
-#: src/ats/gnunet-service-ats_plugins.c:326
-#, c-format
-msgid ""
-"Could not load %s quota for network `%s': `%s', assigning default bandwidth "
-"%llu\n"
-msgstr ""
-
-#: src/ats/gnunet-service-ats_plugins.c:336
-#, c-format
-msgid "%s quota configured for network `%s' is %llu\n"
-msgstr ""
-
-#: src/ats/gnunet-service-ats_plugins.c:382
-#, c-format
-msgid ""
-"No %s-quota configured for network `%s', assigning default bandwidth %llu\n"
-msgstr ""
-
-#: src/ats/gnunet-service-ats_plugins.c:474
-#, fuzzy, c-format
-msgid "Failed to initialize solver `%s'!\n"
-msgstr "Không thể sơ khởi SQLite: %s.\n"
-
-#: src/ats/plugin_ats_proportional.c:1142
-#, fuzzy, c-format
-msgid "Invalid %s configuration %f \n"
-msgstr "Không thể lưu tập tin cấu hình « %s »:"
-
-#: src/ats/plugin_ats_proportional.c:1165
+#: src/ats-tests/ats-testing-log.c:952
#, fuzzy, c-format
-msgid "Invalid %s configuration %f\n"
-msgstr "Không thể lưu tập tin cấu hình « %s »:"
+msgid "Start logging `%s'\n"
+msgstr "Đang bắt đầu tài về « %s »\n"
#: src/ats-tests/ats-testing.c:420
#, c-format
@@ -596,16 +529,6 @@ msgstr ""
msgid "Failed to connect master peer [%u] with slave [%u]\n"
msgstr "Lỗi kết nối đến gnunetd.\n"
-#: src/ats-tests/ats-testing-log.c:896
-#, fuzzy
-msgid "Stop logging\n"
-msgstr "Theo dõi"
-
-#: src/ats-tests/ats-testing-log.c:952
-#, fuzzy, c-format
-msgid "Start logging `%s'\n"
-msgstr "Đang bắt đầu tài về « %s »\n"
-
#: src/ats-tests/gnunet-ats-sim.c:92
#, c-format
msgid ""
@@ -613,6 +536,16 @@ msgid ""
"= %u KiB/s\n"
msgstr ""
+#: src/ats-tests/gnunet-solver-eval.c:997 src/ats/gnunet-ats-solver-eval.c:3552
+msgid "solver to use"
+msgstr ""
+
+#: src/ats-tests/gnunet-solver-eval.c:1003
+#: src/ats-tests/gnunet-solver-eval.c:1008
+#: src/ats/gnunet-ats-solver-eval.c:3557
+msgid "experiment to use"
+msgstr ""
+
#: src/ats-tool/gnunet-ats.c:299
#, c-format
msgid "%u address resolutions had a timeout\n"
@@ -735,6 +668,73 @@ msgstr ""
msgid "Print information about ATS state"
msgstr "In ra thông tin về các đồng đẳng GNUnet."
+#: src/ats/gnunet-ats-solver-eval.c:2992 src/ats/gnunet-ats-solver-eval.c:3044
+#, c-format
+msgid ""
+"Could not load quota for network `%s': `%s', assigning default bandwidth "
+"%llu\n"
+msgstr ""
+
+#: src/ats/gnunet-ats-solver-eval.c:3011
+#, c-format
+msgid ""
+"No outbound quota configured for network `%s', assigning default bandwidth "
+"%llu\n"
+msgstr ""
+
+#: src/ats/gnunet-ats-solver-eval.c:3063
+#, c-format
+msgid ""
+"No outbound quota configure for network `%s', assigning default bandwidth "
+"%llu\n"
+msgstr ""
+
+#: src/ats/gnunet-ats-solver-eval.c:3564
+#, fuzzy
+msgid "print logging"
+msgstr "Theo dõi"
+
+#: src/ats/gnunet-ats-solver-eval.c:3569
+msgid "save logging to disk"
+msgstr ""
+
+#: src/ats/gnunet-ats-solver-eval.c:3574
+msgid "disable normalization"
+msgstr ""
+
+#: src/ats/gnunet-service-ats_plugins.c:326
+#, c-format
+msgid ""
+"Could not load %s quota for network `%s': `%s', assigning default bandwidth "
+"%llu\n"
+msgstr ""
+
+#: src/ats/gnunet-service-ats_plugins.c:336
+#, c-format
+msgid "%s quota configured for network `%s' is %llu\n"
+msgstr ""
+
+#: src/ats/gnunet-service-ats_plugins.c:382
+#, c-format
+msgid ""
+"No %s-quota configured for network `%s', assigning default bandwidth %llu\n"
+msgstr ""
+
+#: src/ats/gnunet-service-ats_plugins.c:474
+#, fuzzy, c-format
+msgid "Failed to initialize solver `%s'!\n"
+msgstr "Không thể sơ khởi SQLite: %s.\n"
+
+#: src/ats/plugin_ats_proportional.c:1142
+#, fuzzy, c-format
+msgid "Invalid %s configuration %f \n"
+msgstr "Không thể lưu tập tin cấu hình « %s »:"
+
+#: src/ats/plugin_ats_proportional.c:1165
+#, fuzzy, c-format
+msgid "Invalid %s configuration %f\n"
+msgstr "Không thể lưu tập tin cấu hình « %s »:"
+
#: src/auction/gnunet-auction-create.c:163
msgid "description of the item to be sold"
msgstr ""
@@ -874,6 +874,28 @@ msgstr ""
msgid "Connection to conversation service lost, trying to reconnect\n"
msgstr ""
+#: src/conversation/gnunet-conversation-test.c:120
+#, c-format
+msgid ""
+"\n"
+"End of transmission. Have a GNU day.\n"
+msgstr ""
+
+#: src/conversation/gnunet-conversation-test.c:146
+#, c-format
+msgid ""
+"\n"
+"We are now playing your recording back. If you can hear it, your audio "
+"settings are working..."
+msgstr ""
+
+#: src/conversation/gnunet-conversation-test.c:218
+#, c-format
+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.c:264
#, c-format
msgid "Incoming call from `%s'. Please /accept %u or /cancel %u the call.\n"
@@ -1133,30 +1155,8 @@ msgstr ""
msgid "Enables having a conversation with other GNUnet users."
msgstr ""
-#: src/conversation/gnunet-conversation-test.c:120
-#, c-format
-msgid ""
-"\n"
-"End of transmission. Have a GNU day.\n"
-msgstr ""
-
-#: src/conversation/gnunet-conversation-test.c:146
-#, c-format
-msgid ""
-"\n"
-"We are now playing your recording back. If you can hear it, your audio "
-"settings are working..."
-msgstr ""
-
-#: src/conversation/gnunet-conversation-test.c:218
-#, c-format
-msgid ""
-"We will now be recording you for %s. After that time, the recording will be "
-"played back to you..."
-msgstr ""
-
-#: src/conversation/gnunet_gst.c:664
#: src/conversation/gnunet-helper-audio-playback-gst.c:363
+#: src/conversation/gnunet_gst.c:664
#, c-format
msgid "Read error from STDIN: %d %s\n"
msgstr ""
@@ -1994,19 +1994,19 @@ msgstr "« %s » bị lỗi tại %s:%d với lỗi: %s\n"
msgid "Mysql database running\n"
msgstr ""
-#: src/datastore/plugin_datastore_postgres.c:278
-#: src/datastore/plugin_datastore_postgres.c:891
+#: src/datastore/plugin_datastore_postgres.c:284
+#: src/datastore/plugin_datastore_postgres.c:897
msgid "Postgress exec failure"
msgstr ""
-#: src/datastore/plugin_datastore_postgres.c:852
+#: src/datastore/plugin_datastore_postgres.c:858
#, 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:950
+#: src/datastore/plugin_datastore_postgres.c:956
msgid "Postgres database running\n"
msgstr ""
@@ -2115,90 +2115,42 @@ msgstr ""
msgid "Prints all packets that go through the DHT."
msgstr ""
-#: src/dht/gnunet_dht_profiler.c:922 src/testbed/gnunet-testbed-profiler.c:255
-#, fuzzy, c-format
-msgid "Exiting as the number of peers is %u\n"
-msgstr "tăng sổ tối đa các kết nối TCP/IP"
+#: src/dht/gnunet-dht-put.c:133
+msgid "Must provide KEY and DATA for DHT put!\n"
+msgstr ""
-#: src/dht/gnunet_dht_profiler.c:955 src/rps/gnunet-rps-profiler.c:3194
-#, fuzzy
-msgid "number of peers to start"
-msgstr "số lần lặp lại"
+#: src/dht/gnunet-dht-put.c:140
+#, fuzzy, c-format
+msgid "Could not connect to DHT service!\n"
+msgstr "Không thể kết nối tới %s:%u: %s\n"
-#: src/dht/gnunet_dht_profiler.c:961
-msgid "number of PUTs to perform per peer"
+#: src/dht/gnunet-dht-put.c:151
+#, c-format
+msgid "Issuing put request for `%s' with data `%s'!\n"
msgstr ""
-#: src/dht/gnunet_dht_profiler.c:967 src/nse/gnunet-nse-profiler.c:872
-#: src/testbed/gnunet-testbed-profiler.c:305
-msgid "name of the file with the login information for the testbed"
+#: src/dht/gnunet-dht-put.c:187
+msgid "the data to insert under the key"
msgstr ""
-#: src/dht/gnunet_dht_profiler.c:973
-msgid "delay between rounds for collecting statistics (default: 30 sec)"
+#: src/dht/gnunet-dht-put.c:193
+msgid "how long to store this entry in the dht (in seconds)"
msgstr ""
-#: src/dht/gnunet_dht_profiler.c:979
-msgid "delay to start doing PUTs (default: 1 sec)"
+#: src/dht/gnunet-dht-put.c:208
+msgid "how many replicas to create"
msgstr ""
-#: src/dht/gnunet_dht_profiler.c:985
-msgid "delay to start doing GETs (default: 5 min)"
+#: src/dht/gnunet-dht-put.c:212
+msgid "use DHT's record route option"
msgstr ""
-#: src/dht/gnunet_dht_profiler.c:990
-msgid "replication degree for DHT PUTs"
+#: src/dht/gnunet-dht-put.c:217
+msgid "the type to insert data as"
msgstr ""
-#: src/dht/gnunet_dht_profiler.c:996
-msgid "chance that a peer is selected at random for PUTs"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1002
-msgid "timeout for DHT PUT and GET requests (default: 1 min)"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1023
-#, fuzzy
-msgid "Measure quality and performance of the DHT service."
-msgstr "Không thể truy cập đến dịch vụ"
-
-#: src/dht/gnunet-dht-put.c:133
-msgid "Must provide KEY and DATA for DHT put!\n"
-msgstr ""
-
-#: src/dht/gnunet-dht-put.c:140
-#, fuzzy, c-format
-msgid "Could not connect to DHT service!\n"
-msgstr "Không thể kết nối tới %s:%u: %s\n"
-
-#: src/dht/gnunet-dht-put.c:151
-#, c-format
-msgid "Issuing put request for `%s' with data `%s'!\n"
-msgstr ""
-
-#: src/dht/gnunet-dht-put.c:187
-msgid "the data to insert under the key"
-msgstr ""
-
-#: src/dht/gnunet-dht-put.c:193
-msgid "how long to store this entry in the dht (in seconds)"
-msgstr ""
-
-#: src/dht/gnunet-dht-put.c:208
-msgid "how many replicas to create"
-msgstr ""
-
-#: src/dht/gnunet-dht-put.c:212
-msgid "use DHT's record route option"
-msgstr ""
-
-#: src/dht/gnunet-dht-put.c:217
-msgid "the type to insert data as"
-msgstr ""
-
-#: src/dht/gnunet-dht-put.c:232
-msgid "Issue a PUT request to the GNUnet DHT insert DATA under KEY."
+#: src/dht/gnunet-dht-put.c:232
+msgid "Issue a PUT request to the GNUnet DHT insert DATA under KEY."
msgstr ""
#: src/dht/gnunet-service-dht_clients.c:367
@@ -2434,6 +2386,54 @@ msgstr ""
msgid "# DHT requests combined"
msgstr "# các yêu cầu get (lấy) dht được nhận"
+#: src/dht/gnunet_dht_profiler.c:922 src/testbed/gnunet-testbed-profiler.c:255
+#, fuzzy, c-format
+msgid "Exiting as the number of peers is %u\n"
+msgstr "tăng sổ tối đa các kết nối TCP/IP"
+
+#: src/dht/gnunet_dht_profiler.c:955 src/rps/gnunet-rps-profiler.c:3194
+#, fuzzy
+msgid "number of peers to start"
+msgstr "số lần lặp lại"
+
+#: src/dht/gnunet_dht_profiler.c:961
+msgid "number of PUTs to perform per peer"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:967 src/nse/gnunet-nse-profiler.c:872
+#: src/testbed/gnunet-testbed-profiler.c:305
+msgid "name of the file with the login information for the testbed"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:973
+msgid "delay between rounds for collecting statistics (default: 30 sec)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:979
+msgid "delay to start doing PUTs (default: 1 sec)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:985
+msgid "delay to start doing GETs (default: 5 min)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:990
+msgid "replication degree for DHT PUTs"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:996
+msgid "chance that a peer is selected at random for PUTs"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1002
+msgid "timeout for DHT PUT and GET requests (default: 1 min)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1023
+#, fuzzy
+msgid "Measure quality and performance of the DHT service."
+msgstr "Không thể truy cập đến dịch vụ"
+
#: src/dht/plugin_block_dht.c:189
#, fuzzy, c-format
msgid "Block not of type %u\n"
@@ -3385,15 +3385,6 @@ msgid ""
"chk/...)"
msgstr ""
-#: src/fs/gnunet-fs.c:128
-msgid "print a list of all indexed files"
-msgstr ""
-
-#: src/fs/gnunet-fs.c:141
-#, fuzzy
-msgid "Special file-sharing operations"
-msgstr "Tùy chọn chia sẻ tập tin"
-
#: src/fs/gnunet-fs-profiler.c:211
msgid "run the experiment with COUNT peers"
msgstr ""
@@ -3410,6 +3401,15 @@ msgstr ""
msgid "run a testbed to measure file-sharing performance"
msgstr ""
+#: src/fs/gnunet-fs.c:128
+msgid "print a list of all indexed files"
+msgstr ""
+
+#: src/fs/gnunet-fs.c:141
+#, fuzzy
+msgid "Special file-sharing operations"
+msgstr "Tùy chọn chia sẻ tập tin"
+
#: src/fs/gnunet-publish.c:219 src/fs/gnunet-publish.c:234
#, c-format
msgid "Publishing `%s' at %llu/%llu (%s remaining)\n"
@@ -4120,52 +4120,6 @@ msgstr ""
msgid "look for GNS2DNS records instead of ANY"
msgstr ""
-#: src/gns/gnunet-gns.c:257
-#, fuzzy, c-format
-msgid "`%s' is not a valid DNS domain name\n"
-msgstr "« %s » không sẵn sàng.\n"
-
-#: src/gns/gnunet-gns.c:267 src/util/dnsparser.c:254
-#, fuzzy, c-format
-msgid "Failed to convert DNS IDNA name `%s' to UTF-8: %s\n"
-msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n"
-
-#: src/gns/gnunet-gns.c:281
-msgid "Cannot resolve using GNS: GNUnet peer not running\n"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:305
-#, c-format
-msgid "Invalid typename specified, assuming `ANY'\n"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:340
-msgid "Lookup a record for the given name"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:346
-#, fuzzy
-msgid "Specify the type of the record to lookup"
-msgstr "xác định mức ưu tiên của nội dung"
-
-#: src/gns/gnunet-gns.c:352
-#, fuzzy
-msgid "Specify a timeout for the lookup"
-msgstr "xác định mức ưu tiên của nội dung"
-
-#: src/gns/gnunet-gns.c:356
-msgid "No unneeded output"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:361
-msgid "DNS Compatibility: Name is passed in IDNA instead of UTF-8"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:375
-#, fuzzy
-msgid "GNUnet GNS resolver tool"
-msgstr "Bản ghi lỗi GNUnet"
-
#: src/gns/gnunet-gns-import.c:486
msgid "This program will import some GNS authorities into your GNS namestore."
msgstr ""
@@ -4286,6 +4240,52 @@ msgstr ""
msgid "GNUnet GNS proxy"
msgstr ""
+#: src/gns/gnunet-gns.c:257
+#, fuzzy, c-format
+msgid "`%s' is not a valid DNS domain name\n"
+msgstr "« %s » không sẵn sàng.\n"
+
+#: src/gns/gnunet-gns.c:267 src/util/dnsparser.c:254
+#, fuzzy, c-format
+msgid "Failed to convert DNS IDNA name `%s' to UTF-8: %s\n"
+msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n"
+
+#: src/gns/gnunet-gns.c:281
+msgid "Cannot resolve using GNS: GNUnet peer not running\n"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:305
+#, c-format
+msgid "Invalid typename specified, assuming `ANY'\n"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:340
+msgid "Lookup a record for the given name"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:346
+#, fuzzy
+msgid "Specify the type of the record to lookup"
+msgstr "xác định mức ưu tiên của nội dung"
+
+#: src/gns/gnunet-gns.c:352
+#, fuzzy
+msgid "Specify a timeout for the lookup"
+msgstr "xác định mức ưu tiên của nội dung"
+
+#: src/gns/gnunet-gns.c:356
+msgid "No unneeded output"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:361
+msgid "DNS Compatibility: Name is passed in IDNA instead of UTF-8"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:375
+#, fuzzy
+msgid "GNUnet GNS resolver tool"
+msgstr "Bản ghi lỗi GNUnet"
+
#: src/gns/gnunet-service-gns.c:505
#, fuzzy
msgid "Properly base32-encoded public key required"
@@ -4297,8 +4297,8 @@ msgid "Failed to connect to the namecache!\n"
msgstr "Không kết nối được đến trình nền gnunetd."
#: src/gns/gnunet-service-gns.c:560
-#: src/zonemaster/gnunet-service-zonemaster.c:887
#: src/zonemaster/gnunet-service-zonemaster-monitor.c:444
+#: src/zonemaster/gnunet-service-zonemaster.c:887
#, fuzzy
msgid "Could not connect to DHT!\n"
msgstr "Không thể kết nối tới %s:%u: %s\n"
@@ -4809,7 +4809,7 @@ msgid "# hostlist advertisements send"
msgstr "# Các quảng cáo ngoại được chuyển tiếp"
#: src/hostlist/gnunet-daemon-hostlist_server.c:674
-#: src/transport/gnunet-service-transport.c:2659
+#: src/transport/gnunet-service-transport.c:2661
#, fuzzy
msgid "Could not access PEERINFO service. Exiting.\n"
msgstr "Không thể truy cập đến thông tin về không gian tên.\n"
@@ -5065,6 +5065,70 @@ msgstr "kho dữ liệu sqlite"
msgid "Failed to setup database at `%s'\n"
msgstr "Lỗi chạy %s: %s %d\n"
+#: src/namestore/gnunet-namestore-fcfsd.c:552
+#, fuzzy, c-format
+msgid "Unsupported form value `%s'\n"
+msgstr "Lệnh không được hỗ trợ « %s ». Đang hủy bỏ.\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:579
+#, fuzzy, c-format
+msgid "Failed to create record for domain `%s': %s\n"
+msgstr "Không thể truy cập đến tập tin gnunet-directory « %s »\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:600
+msgid "Error when mapping zone to name\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:632
+#, c-format
+msgid "Found existing name `%s' for the given key\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:694
+#, c-format
+msgid "Found %u existing records for domain `%s'\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:784
+#, fuzzy, c-format
+msgid "Failed to create page for `%s'\n"
+msgstr "Không thể tạo miền tên.\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:803
+#, fuzzy, c-format
+msgid "Failed to setup post processor for `%s'\n"
+msgstr "Lỗi cập nhật dữ liệu cho mô-đun « %s »\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:840
+msgid "Domain name must not contain `.'\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:849
+msgid "Domain name must not contain `+'\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1084
+msgid "No ego configured for `fcfsd` subsystem\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1115
+#, fuzzy
+msgid "Failed to start HTTP server\n"
+msgstr "Lỗi bắt đầu thu thập.\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1163
+#, fuzzy
+msgid "Failed to connect to identity\n"
+msgstr "Lỗi kết nối đến gnunetd.\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1190
+msgid "name of the zone that is to be managed by FCFSD"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1210
+msgid "GNU Name System First Come First Serve name registration service"
+msgstr ""
+
#: src/namestore/gnunet-namestore.c:334
#, fuzzy, c-format
msgid "Adding record failed: %s\n"
@@ -5294,70 +5358,6 @@ msgstr ""
msgid "name of the ego controlling the zone"
msgstr ""
-#: src/namestore/gnunet-namestore-fcfsd.c:552
-#, fuzzy, c-format
-msgid "Unsupported form value `%s'\n"
-msgstr "Lệnh không được hỗ trợ « %s ». Đang hủy bỏ.\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:579
-#, fuzzy, c-format
-msgid "Failed to create record for domain `%s': %s\n"
-msgstr "Không thể truy cập đến tập tin gnunet-directory « %s »\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:600
-msgid "Error when mapping zone to name\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:632
-#, c-format
-msgid "Found existing name `%s' for the given key\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:694
-#, c-format
-msgid "Found %u existing records for domain `%s'\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:784
-#, fuzzy, c-format
-msgid "Failed to create page for `%s'\n"
-msgstr "Không thể tạo miền tên.\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:803
-#, fuzzy, c-format
-msgid "Failed to setup post processor for `%s'\n"
-msgstr "Lỗi cập nhật dữ liệu cho mô-đun « %s »\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:840
-msgid "Domain name must not contain `.'\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:849
-msgid "Domain name must not contain `+'\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1084
-msgid "No ego configured for `fcfsd` subsystem\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1115
-#, fuzzy
-msgid "Failed to start HTTP server\n"
-msgstr "Lỗi bắt đầu thu thập.\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1163
-#, fuzzy
-msgid "Failed to connect to identity\n"
-msgstr "Lỗi kết nối đến gnunetd.\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1190
-msgid "name of the zone that is to be managed by FCFSD"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1210
-msgid "GNU Name System First Come First Serve name registration service"
-msgstr ""
-
#: src/namestore/gnunet-service-namestore.c:866
#, fuzzy, c-format
msgid "Failed to replicate block in namecache: %s\n"
@@ -5677,11 +5677,6 @@ msgstr ""
msgid "`upnpc' command not found\n"
msgstr ""
-#: src/nse/gnunet-nse.c:124
-#, fuzzy
-msgid "Show network size estimates from NSE service."
-msgstr "# các yêu cầu get (lấy) dht được nhận"
-
#: src/nse/gnunet-nse-profiler.c:857
#, fuzzy
msgid "limit to the number of connections to NSE services, 0 for none"
@@ -5708,70 +5703,16 @@ msgstr ""
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:1443
-#: src/revocation/gnunet-service-revocation.c:834 src/util/gnunet-scrypt.c:257
+#: src/nse/gnunet-nse.c:124
#, fuzzy
-msgid "Value is too large.\n"
-msgstr "Giá trị không nằm trong phạm vi được phép."
-
-#: src/peerinfo/gnunet-service-peerinfo.c:175
-#, fuzzy, c-format
-msgid "Removing expired address of transport `%s'\n"
-msgstr "Đã nạp truyền tải « %s »\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:306
-#, fuzzy, c-format
-msgid "Failed to parse HELLO in file `%s': %s\n"
-msgstr "Lỗi đọc danh sách bạn bè từ « %s »\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:323
-#: src/peerinfo/gnunet-service-peerinfo.c:348
-#, fuzzy, c-format
-msgid "Failed to parse HELLO in file `%s'\n"
-msgstr "Lỗi đọc danh sách bạn bè từ « %s »\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:426
-msgid "# peers known"
-msgstr ""
-
-#: src/peerinfo/gnunet-service-peerinfo.c:468
-#, c-format
-msgid ""
-"File `%s' in directory `%s' does not match naming convention. Removed.\n"
-msgstr ""
-"Tập tin « %s » trong thư mục « %s » không tùy theo quy ước đặt tên. Bị gỡ "
-"bỏ.\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:624
-#, fuzzy, c-format
-msgid "Scanning directory `%s'\n"
-msgstr "Lỗi đọc danh sách bạn bè từ « %s »\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:631
-#, c-format
-msgid "Still no peers found in `%s'!\n"
-msgstr "Vẫn còn không tìm thấy đồng đẳng trong « %s ».\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:1024
-#, fuzzy, c-format
-msgid "Cleaning up directory `%s'\n"
-msgstr "Lỗi đọc danh sách bạn bè từ « %s »\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:1319
-#, c-format
-msgid "Importing HELLOs from `%s'\n"
-msgstr ""
-
-#: src/peerinfo/gnunet-service-peerinfo.c:1332
-msgid "Skipping import of included HELLOs\n"
-msgstr ""
+msgid "Show network size estimates from NSE service."
+msgstr "# các yêu cầu get (lấy) dht được nhận"
-#: src/peerinfo/peerinfo_api.c:217
-#, fuzzy
-msgid "Failed to receive response from `PEERINFO' service."
-msgstr ""
-"\n"
-"Không nhận được đáp ứng từ gnunetd.\n"
+#: src/nse/gnunet-service-nse.c:1443
+#: src/revocation/gnunet-service-revocation.c:834 src/util/gnunet-scrypt.c:257
+#, fuzzy
+msgid "Value is too large.\n"
+msgstr "Giá trị không nằm trong phạm vi được phép."
#: src/peerinfo-tool/gnunet-peerinfo.c:237
#, fuzzy, c-format
@@ -5870,6 +5811,65 @@ msgstr "Không thể nạp phần bổ sung truyền tải « %s »\n"
msgid "Peerinfo REST API initialized\n"
msgstr "Lỗi sơ khởi lõi.\n"
+#: src/peerinfo/gnunet-service-peerinfo.c:175
+#, fuzzy, c-format
+msgid "Removing expired address of transport `%s'\n"
+msgstr "Đã nạp truyền tải « %s »\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:306
+#, fuzzy, c-format
+msgid "Failed to parse HELLO in file `%s': %s\n"
+msgstr "Lỗi đọc danh sách bạn bè từ « %s »\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:323
+#: src/peerinfo/gnunet-service-peerinfo.c:348
+#, fuzzy, c-format
+msgid "Failed to parse HELLO in file `%s'\n"
+msgstr "Lỗi đọc danh sách bạn bè từ « %s »\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:426
+msgid "# peers known"
+msgstr ""
+
+#: src/peerinfo/gnunet-service-peerinfo.c:468
+#, c-format
+msgid ""
+"File `%s' in directory `%s' does not match naming convention. Removed.\n"
+msgstr ""
+"Tập tin « %s » trong thư mục « %s » không tùy theo quy ước đặt tên. Bị gỡ "
+"bỏ.\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:624
+#, fuzzy, c-format
+msgid "Scanning directory `%s'\n"
+msgstr "Lỗi đọc danh sách bạn bè từ « %s »\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:631
+#, c-format
+msgid "Still no peers found in `%s'!\n"
+msgstr "Vẫn còn không tìm thấy đồng đẳng trong « %s ».\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:1024
+#, fuzzy, c-format
+msgid "Cleaning up directory `%s'\n"
+msgstr "Lỗi đọc danh sách bạn bè từ « %s »\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:1319
+#, c-format
+msgid "Importing HELLOs from `%s'\n"
+msgstr ""
+
+#: src/peerinfo/gnunet-service-peerinfo.c:1332
+msgid "Skipping import of included HELLOs\n"
+msgstr ""
+
+#: src/peerinfo/peerinfo_api.c:217
+#, fuzzy
+msgid "Failed to receive response from `PEERINFO' service."
+msgstr ""
+"\n"
+"Không nhận được đáp ứng từ gnunetd.\n"
+
#: src/peerstore/gnunet-peerstore.c:92
msgid "peerstore"
msgstr ""
@@ -6339,18 +6339,6 @@ msgstr ""
msgid "Could not open revocation database file!"
msgstr "« %s »: Không thể kết nối.\n"
-#: src/rps/gnunet-rps.c:270
-msgid "Seed a PeerID"
-msgstr ""
-
-#: src/rps/gnunet-rps.c:275
-msgid "Get updates of view (0 for infinite updates)"
-msgstr ""
-
-#: src/rps/gnunet-rps.c:279
-msgid "Get peers from biased stream"
-msgstr ""
-
#: src/rps/gnunet-rps-profiler.c:3200
msgid "duration of the profiling"
msgstr ""
@@ -6370,6 +6358,18 @@ msgstr "số lần lặp lại"
msgid "Measure quality and performance of the RPS service."
msgstr "Không thể truy cập đến dịch vụ"
+#: src/rps/gnunet-rps.c:270
+msgid "Seed a PeerID"
+msgstr ""
+
+#: src/rps/gnunet-rps.c:275
+msgid "Get updates of view (0 for infinite updates)"
+msgstr ""
+
+#: src/rps/gnunet-rps.c:279
+msgid "Get peers from biased stream"
+msgstr ""
+
#: src/scalarproduct/gnunet-scalarproduct.c:229
#, fuzzy
msgid "You must specify at least one message ID to check!\n"
@@ -6425,10 +6425,10 @@ msgstr ""
msgid "Calculate the Vectorproduct with a GNUnet peer."
msgstr ""
-#: src/scalarproduct/gnunet-service-scalarproduct_alice.c:1358
-#: src/scalarproduct/gnunet-service-scalarproduct_bob.c:1355
#: src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c:1118
#: src/scalarproduct/gnunet-service-scalarproduct-ecc_bob.c:1063
+#: src/scalarproduct/gnunet-service-scalarproduct_alice.c:1358
+#: src/scalarproduct/gnunet-service-scalarproduct_bob.c:1355
#, fuzzy
msgid "Connect to CADET failed\n"
msgstr " Không kết nối được (lỗi ?)\n"
@@ -6783,16 +6783,6 @@ msgstr "« %s » đang tắt.\n"
msgid "%.s Unknown result code."
msgstr ""
-#: src/testbed/gnunet_testbed_mpi_spawn.c:119
-#, fuzzy
-msgid "Waiting for child to exit.\n"
-msgstr "Đang đợi các đồng đẳng kết nối"
-
-#: src/testbed/gnunet_testbed_mpi_spawn.c:242
-#, fuzzy, c-format
-msgid "Spawning process `%s'\n"
-msgstr "Đang bắt đầu tài về « %s »\n"
-
#: src/testbed/gnunet-testbed-profiler.c:290
msgid "tolerate COUNT number of continious timeout failures"
msgstr ""
@@ -6804,6 +6794,16 @@ msgid ""
"signal is received"
msgstr ""
+#: src/testbed/gnunet_testbed_mpi_spawn.c:119
+#, fuzzy
+msgid "Waiting for child to exit.\n"
+msgstr "Đang đợi các đồng đẳng kết nối"
+
+#: src/testbed/gnunet_testbed_mpi_spawn.c:242
+#, fuzzy, c-format
+msgid "Spawning process `%s'\n"
+msgstr "Đang bắt đầu tài về « %s »\n"
+
#: src/testbed/testbed_api.c:399
#, fuzzy, c-format
msgid "Adding host %u failed with error: %s\n"
@@ -7106,19 +7106,19 @@ msgstr "# các thông báo PONG đã mật mã được nhận"
msgid "GNUnet topology control"
msgstr ""
-#: src/transport/gnunet-communicator-tcp.c:3189
-#: src/transport/gnunet-communicator-udp.c:2826
+#: src/transport/gnunet-communicator-tcp.c:3221
+#: src/transport/gnunet-communicator-udp.c:2995
#: src/transport/gnunet-service-tng.c:10014
-#: src/transport/gnunet-service-transport.c:2624
+#: src/transport/gnunet-service-transport.c:2626
#, fuzzy
msgid "Transport service is lacking key configuration settings. Exiting.\n"
msgstr "Lưu cấu hình ngay bây giờ không?"
-#: src/transport/gnunet-communicator-tcp.c:3494
+#: src/transport/gnunet-communicator-tcp.c:3553
msgid "GNUnet TCP communicator"
msgstr ""
-#: src/transport/gnunet-communicator-udp.c:2898
+#: src/transport/gnunet-communicator-udp.c:3067
msgid "GNUnet UDP communicator"
msgstr ""
@@ -7143,54 +7143,54 @@ msgstr "Không thể tạo miền tên.\n"
msgid "GNUnet UNIX domain socket communicator"
msgstr ""
-#: src/transport/gnunet-service-transport_ats.c:137
-msgid "# Addresses given to ATS"
-msgstr ""
-
#: src/transport/gnunet-service-transport.c:445
#, fuzzy
msgid "# messages dropped due to slow client"
msgstr "# các yêu cầu lỗ hổng bị bỏ do trọng tải"
-#: src/transport/gnunet-service-transport.c:794
+#: src/transport/gnunet-service-transport.c:796
msgid "# bytes payload dropped (other peer was not connected)"
msgstr ""
-#: src/transport/gnunet-service-transport.c:1477
+#: src/transport/gnunet-service-transport.c:1479
#, fuzzy
msgid "# bytes payload discarded due to not connected peer"
msgstr "# Các quảng cáo đồng đẳng bị hủy do trọng tải"
-#: src/transport/gnunet-service-transport.c:1622
+#: src/transport/gnunet-service-transport.c:1624
#, fuzzy
msgid "# bytes total received"
msgstr "# tổng số nội dung lỗ hổng được nhận"
-#: src/transport/gnunet-service-transport.c:1712
+#: src/transport/gnunet-service-transport.c:1714
#, fuzzy
msgid "# bytes payload received"
msgstr "# các byte đã giải mã"
-#: src/transport/gnunet-service-transport.c:2016
-#: src/transport/gnunet-service-transport.c:2450
+#: src/transport/gnunet-service-transport.c:2018
+#: src/transport/gnunet-service-transport.c:2452
msgid "# disconnects due to blacklist"
msgstr ""
-#: src/transport/gnunet-service-transport.c:2454
+#: src/transport/gnunet-service-transport.c:2456
#, fuzzy, c-format
msgid "Disallowing connection to peer `%s' on transport %s\n"
msgstr "Không thể nạp phần bổ sung truyền tải « %s »\n"
-#: src/transport/gnunet-service-transport.c:2549
+#: src/transport/gnunet-service-transport.c:2551
#, fuzzy, c-format
msgid "Adding blacklisting entry for peer `%s'\n"
msgstr "Không thể lấy địa chỉ của đồng đẳng « %s ».\n"
-#: src/transport/gnunet-service-transport.c:2558
+#: src/transport/gnunet-service-transport.c:2560
#, c-format
msgid "Adding blacklisting entry for peer `%s':`%s'\n"
msgstr ""
+#: src/transport/gnunet-service-transport_ats.c:137
+msgid "# Addresses given to ATS"
+msgstr ""
+
#: src/transport/gnunet-service-transport_hello.c:195
msgid "# refreshed my HELLO"
msgstr ""
@@ -7530,6 +7530,46 @@ msgstr ""
msgid "# HELLOs given to peerinfo"
msgstr "Nhận được thông báo « %s » sai từ đồng đẳng « %s ».\n"
+#: src/transport/gnunet-transport-profiler.c:220
+#, c-format
+msgid "%llu B in %llu ms == %.2f KB/s!\n"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:577
+msgid "send data to peer"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:581
+#, fuzzy
+msgid "receive data from peer"
+msgstr "Yêu cầu cấp %d từ đồng đẳng %d\n"
+
+#: src/transport/gnunet-transport-profiler.c:586
+#, fuzzy
+msgid "iterations"
+msgstr "Tùy chọn chung"
+
+#: src/transport/gnunet-transport-profiler.c:591
+#, fuzzy
+msgid "number of messages to send"
+msgstr "số tin nhắn cần dùng mỗi lần lặp"
+
+#: src/transport/gnunet-transport-profiler.c:596
+#, fuzzy
+msgid "message size to use"
+msgstr "kích cỡ tin nhắn"
+
+#: src/transport/gnunet-transport-profiler.c:601
+#: src/transport/gnunet-transport.c:1404
+msgid "peer identity"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:614
+#: src/transport/gnunet-transport.c:1426
+#, fuzzy
+msgid "Direct access to transport service."
+msgstr "Lỗi kết nối đến gnunetd.\n"
+
#: src/transport/gnunet-transport.c:406
#, fuzzy, c-format
msgid "Transmitted %llu bytes/s (%llu bytes in %s)\n"
@@ -7669,11 +7709,6 @@ msgstr "In ra thông tin về các đồng đẳng GNUnet."
msgid "do not resolve hostnames"
msgstr "không quyết định các tên máy"
-#: src/transport/gnunet-transport.c:1404
-#: src/transport/gnunet-transport-profiler.c:601
-msgid "peer identity"
-msgstr ""
-
#: src/transport/gnunet-transport.c:1408
msgid "monitor plugin sessions"
msgstr ""
@@ -7682,41 +7717,6 @@ msgstr ""
msgid "send data for benchmarking to the other peer (until CTRL-C)"
msgstr ""
-#: src/transport/gnunet-transport.c:1426
-#: src/transport/gnunet-transport-profiler.c:614
-#, fuzzy
-msgid "Direct access to transport service."
-msgstr "Lỗi kết nối đến gnunetd.\n"
-
-#: src/transport/gnunet-transport-profiler.c:220
-#, c-format
-msgid "%llu B in %llu ms == %.2f KB/s!\n"
-msgstr ""
-
-#: src/transport/gnunet-transport-profiler.c:577
-msgid "send data to peer"
-msgstr ""
-
-#: src/transport/gnunet-transport-profiler.c:581
-#, fuzzy
-msgid "receive data from peer"
-msgstr "Yêu cầu cấp %d từ đồng đẳng %d\n"
-
-#: src/transport/gnunet-transport-profiler.c:586
-#, fuzzy
-msgid "iterations"
-msgstr "Tùy chọn chung"
-
-#: src/transport/gnunet-transport-profiler.c:591
-#, fuzzy
-msgid "number of messages to send"
-msgstr "số tin nhắn cần dùng mỗi lần lặp"
-
-#: src/transport/gnunet-transport-profiler.c:596
-#, fuzzy
-msgid "message size to use"
-msgstr "kích cỡ tin nhắn"
-
#: src/transport/plugin_transport_http_client.c:1489
#: src/transport/plugin_transport_http_server.c:2331
#: src/transport/plugin_transport_http_server.c:3562
@@ -7995,21 +7995,6 @@ msgstr ""
msgid "TCP transport advertises itself as being on port %llu\n"
msgstr ""
-#: src/transport/plugin_transport_udp_broadcasting.c:169
-#, fuzzy
-msgid "# Multicast HELLO beacons received via UDP"
-msgstr "# các thông báo PONG đã mật mã được nhận"
-
-#: src/transport/plugin_transport_udp_broadcasting.c:553
-msgid ""
-"Disabling HELLO broadcasting due to friend-to-friend only configuration!\n"
-msgstr ""
-
-#: src/transport/plugin_transport_udp_broadcasting.c:571
-#, c-format
-msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n"
-msgstr ""
-
#: src/transport/plugin_transport_udp.c:3169
#, c-format
msgid ""
@@ -8058,6 +8043,21 @@ msgstr "« %s » không sẵn sàng.\n"
msgid "Failed to create UDP network sockets\n"
msgstr "Không thể tạo miền tên.\n"
+#: src/transport/plugin_transport_udp_broadcasting.c:169
+#, fuzzy
+msgid "# Multicast HELLO beacons received via UDP"
+msgstr "# các thông báo PONG đã mật mã được nhận"
+
+#: src/transport/plugin_transport_udp_broadcasting.c:553
+msgid ""
+"Disabling HELLO broadcasting due to friend-to-friend only configuration!\n"
+msgstr ""
+
+#: src/transport/plugin_transport_udp_broadcasting.c:571
+#, c-format
+msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n"
+msgstr ""
+
#: src/transport/plugin_transport_unix.c:1396
#, fuzzy, c-format
msgid "Cannot bind to `%s'\n"
@@ -8240,7 +8240,7 @@ msgid "do daemonize (detach from terminal)"
msgstr ""
#: src/transport/tcp_service_legacy.c:1397
-#: src/transport/transport-testing2.c:1116 src/util/service.c:2072
+#: src/transport/transport-testing2.c:983 src/util/service.c:2072
#: src/util/service.c:2084
#, fuzzy, c-format
msgid "Malformed configuration file `%s', exit ...\n"
@@ -8912,19 +8912,19 @@ msgid ""
"Fatal internal logic error, process hangs in `%s' (abort with CTRL-C)!\n"
msgstr ""
-#: src/util/os_installation.c:409
+#: src/util/os_installation.c:411
#, c-format
msgid ""
"Could not determine installation path for %s. Set `%s' environment "
"variable.\n"
msgstr ""
-#: src/util/os_installation.c:792
+#: src/util/os_installation.c:794
#, fuzzy, c-format
msgid "Could not find binary `%s' in PATH!\n"
msgstr "Không thể đọc danh sách bạn bè « %s »\n"
-#: src/util/os_installation.c:825
+#: src/util/os_installation.c:827
#, c-format
msgid "Binary `%s' exists, but is not SUID\n"
msgstr ""
@@ -8949,17 +8949,17 @@ msgstr "« %s » thất bại cho thư viện « %s » với lỗi:
%s\n"
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"
-#: src/util/program.c:262
+#: src/util/program.c:267
#, fuzzy, c-format
msgid "Unreadable or malformed configuration file `%s', exit ...\n"
msgstr "Không thể lưu tập tin cấu hình « %s »:"
-#: src/util/program.c:279
+#: src/util/program.c:284
#, fuzzy, c-format
msgid "Unreadable or malformed default configuration file `%s', exit ...\n"
msgstr "Không thể lưu tập tin cấu hình « %s »:"
-#: src/util/program.c:294
+#: src/util/program.c:299
#, fuzzy
msgid "Unreadable or malformed configuration, exit ...\n"
msgstr "Không thể lưu tập tin cấu hình « %s »:"
@@ -9024,10 +9024,6 @@ msgstr ""
msgid "Attempting to proxy service `%s' to invalid port %d or hostname.\n"
msgstr ""
-#: src/util/strings.c:179
-msgid "b"
-msgstr "b"
-
#: src/util/strings.c:503
#, c-format
msgid "Character sets requested were `%s'->`%s'\n"
@@ -9038,48 +9034,6 @@ msgid "Failed to expand `$HOME': environment variable
`HOME' not set"
msgstr ""
"Lỗi mở rộng biến môi trường « $HOME »: chưa đặt biến môi trường « HOME »"
-#: src/util/strings.c:706
-msgid "µs"
-msgstr ""
-
-#: src/util/strings.c:710
-msgid "forever"
-msgstr ""
-
-#: src/util/strings.c:712
-msgid "0 ms"
-msgstr ""
-
-#: src/util/strings.c:716
-msgid "ms"
-msgstr "mg"
-
-#: src/util/strings.c:720
-msgid "s"
-msgstr "g"
-
-#: src/util/strings.c:724
-msgid "m"
-msgstr "p"
-
-#: src/util/strings.c:728
-msgid "h"
-msgstr "g"
-
-#: src/util/strings.c:734
-#, fuzzy
-msgid "day"
-msgstr " ngày"
-
-#: src/util/strings.c:736
-#, fuzzy
-msgid "days"
-msgstr " ngày"
-
-#: src/util/strings.c:764
-msgid "end of time"
-msgstr ""
-
#: src/util/strings.c:1240
msgid "IPv6 address did not start with `['\n"
msgstr ""
@@ -9330,12 +9284,35 @@ msgstr "# các byte đã nhận qua UDP"
msgid "Setup tunnels via VPN."
msgstr ""
-#: src/zonemaster/gnunet-service-zonemaster.c:849
#: src/zonemaster/gnunet-service-zonemaster-monitor.c:420
+#: src/zonemaster/gnunet-service-zonemaster.c:849
#, fuzzy
msgid "Failed to connect to the namestore!\n"
msgstr "Không kết nối được đến trình nền gnunetd."
+#~ msgid "b"
+#~ msgstr "b"
+
+#~ msgid "ms"
+#~ msgstr "mg"
+
+#~ msgid "s"
+#~ msgstr "g"
+
+#~ msgid "m"
+#~ msgstr "p"
+
+#~ msgid "h"
+#~ msgstr "g"
+
+#, fuzzy
+#~ msgid "day"
+#~ msgstr " ngày"
+
+#, fuzzy
+#~ msgid "days"
+#~ msgstr " ngày"
+
#, 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"
diff --git a/po/zh_CN.po b/po/zh_CN.po
index dec62e27f..a5376561d 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: 2020-09-06 10:07+0200\n"
+"POT-Creation-Date: 2020-10-13 16:12+0200\n"
"PO-Revision-Date: 2011-07-09 12:12+0800\n"
"Last-Translator: Wylmer Wang <wantinghard@gmail.com>\n"
"Language-Team: Chinese (simplified) <i18n-zh@googlegroups.com>\n"
@@ -27,8 +27,8 @@ msgid "Issuer public key `%s' is not well-formed\n"
msgstr "“%s”的参数无效。\n"
#: src/abd/gnunet-abd.c:560 src/abd/gnunet-service-abd.c:1747
-#: src/namestore/gnunet-namestore.c:1001
#: src/namestore/gnunet-namestore-fcfsd.c:1154
+#: src/namestore/gnunet-namestore.c:1001
#, fuzzy, c-format
msgid "Failed to connect to namestore\n"
msgstr "初始化“%s”服务失败。\n"
@@ -494,82 +494,14 @@ msgstr ""
msgid "Initiating shutdown as requested by client.\n"
msgstr ""
-#: src/ats/gnunet-ats-solver-eval.c:2992 src/ats/gnunet-ats-solver-eval.c:3044
-#, c-format
-msgid ""
-"Could not load quota for network `%s': `%s', assigning default bandwidth "
-"%llu\n"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3011
-#, c-format
-msgid ""
-"No outbound quota configured for network `%s', assigning default bandwidth "
-"%llu\n"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3063
-#, c-format
-msgid ""
-"No outbound quota configure for network `%s', assigning default bandwidth "
-"%llu\n"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3552 src/ats-tests/gnunet-solver-eval.c:997
-msgid "solver to use"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3557
-#: src/ats-tests/gnunet-solver-eval.c:1003
-#: src/ats-tests/gnunet-solver-eval.c:1008
-msgid "experiment to use"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3564
-#, fuzzy
-msgid "print logging"
-msgstr "未知的命令“%s”。\n"
-
-#: src/ats/gnunet-ats-solver-eval.c:3569
-msgid "save logging to disk"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3574
-msgid "disable normalization"
-msgstr ""
-
-#: src/ats/gnunet-service-ats_plugins.c:326
-#, c-format
-msgid ""
-"Could not load %s quota for network `%s': `%s', assigning default bandwidth "
-"%llu\n"
-msgstr ""
-
-#: src/ats/gnunet-service-ats_plugins.c:336
-#, c-format
-msgid "%s quota configured for network `%s' is %llu\n"
-msgstr ""
-
-#: src/ats/gnunet-service-ats_plugins.c:382
-#, c-format
-msgid ""
-"No %s-quota configured for network `%s', assigning default bandwidth %llu\n"
+#: src/ats-tests/ats-testing-log.c:896
+msgid "Stop logging\n"
msgstr ""
-#: src/ats/gnunet-service-ats_plugins.c:474
-#, fuzzy, c-format
-msgid "Failed to initialize solver `%s'!\n"
-msgstr "无法初始化 SQLite:%s。\n"
-
-#: src/ats/plugin_ats_proportional.c:1142
-#, fuzzy, c-format
-msgid "Invalid %s configuration %f \n"
-msgstr "解析配置文件“%s”失败\n"
-
-#: src/ats/plugin_ats_proportional.c:1165
+#: src/ats-tests/ats-testing-log.c:952
#, fuzzy, c-format
-msgid "Invalid %s configuration %f\n"
-msgstr "解析配置文件“%s”失败\n"
+msgid "Start logging `%s'\n"
+msgstr "未知的命令“%s”。\n"
#: src/ats-tests/ats-testing.c:420
#, c-format
@@ -581,15 +513,6 @@ msgstr ""
msgid "Failed to connect master peer [%u] with slave [%u]\n"
msgstr "初始化“%s”服务失败。\n"
-#: src/ats-tests/ats-testing-log.c:896
-msgid "Stop logging\n"
-msgstr ""
-
-#: src/ats-tests/ats-testing-log.c:952
-#, fuzzy, c-format
-msgid "Start logging `%s'\n"
-msgstr "未知的命令“%s”。\n"
-
#: src/ats-tests/gnunet-ats-sim.c:92
#, c-format
msgid ""
@@ -597,6 +520,16 @@ msgid ""
"= %u KiB/s\n"
msgstr ""
+#: src/ats-tests/gnunet-solver-eval.c:997 src/ats/gnunet-ats-solver-eval.c:3552
+msgid "solver to use"
+msgstr ""
+
+#: src/ats-tests/gnunet-solver-eval.c:1003
+#: src/ats-tests/gnunet-solver-eval.c:1008
+#: src/ats/gnunet-ats-solver-eval.c:3557
+msgid "experiment to use"
+msgstr ""
+
#: src/ats-tool/gnunet-ats.c:299
#, c-format
msgid "%u address resolutions had a timeout\n"
@@ -718,6 +651,73 @@ msgstr ""
msgid "Print information about ATS state"
msgstr "无法获取有关用户“%s”的信息:%s\n"
+#: src/ats/gnunet-ats-solver-eval.c:2992 src/ats/gnunet-ats-solver-eval.c:3044
+#, c-format
+msgid ""
+"Could not load quota for network `%s': `%s', assigning default bandwidth "
+"%llu\n"
+msgstr ""
+
+#: src/ats/gnunet-ats-solver-eval.c:3011
+#, c-format
+msgid ""
+"No outbound quota configured for network `%s', assigning default bandwidth "
+"%llu\n"
+msgstr ""
+
+#: src/ats/gnunet-ats-solver-eval.c:3063
+#, c-format
+msgid ""
+"No outbound quota configure for network `%s', assigning default bandwidth "
+"%llu\n"
+msgstr ""
+
+#: src/ats/gnunet-ats-solver-eval.c:3564
+#, fuzzy
+msgid "print logging"
+msgstr "未知的命令“%s”。\n"
+
+#: src/ats/gnunet-ats-solver-eval.c:3569
+msgid "save logging to disk"
+msgstr ""
+
+#: src/ats/gnunet-ats-solver-eval.c:3574
+msgid "disable normalization"
+msgstr ""
+
+#: src/ats/gnunet-service-ats_plugins.c:326
+#, c-format
+msgid ""
+"Could not load %s quota for network `%s': `%s', assigning default bandwidth "
+"%llu\n"
+msgstr ""
+
+#: src/ats/gnunet-service-ats_plugins.c:336
+#, c-format
+msgid "%s quota configured for network `%s' is %llu\n"
+msgstr ""
+
+#: src/ats/gnunet-service-ats_plugins.c:382
+#, c-format
+msgid ""
+"No %s-quota configured for network `%s', assigning default bandwidth %llu\n"
+msgstr ""
+
+#: src/ats/gnunet-service-ats_plugins.c:474
+#, fuzzy, c-format
+msgid "Failed to initialize solver `%s'!\n"
+msgstr "无法初始化 SQLite:%s。\n"
+
+#: src/ats/plugin_ats_proportional.c:1142
+#, fuzzy, c-format
+msgid "Invalid %s configuration %f \n"
+msgstr "解析配置文件“%s”失败\n"
+
+#: src/ats/plugin_ats_proportional.c:1165
+#, fuzzy, c-format
+msgid "Invalid %s configuration %f\n"
+msgstr "解析配置文件“%s”失败\n"
+
#: src/auction/gnunet-auction-create.c:163
msgid "description of the item to be sold"
msgstr ""
@@ -854,6 +854,28 @@ msgstr ""
msgid "Connection to conversation service lost, trying to reconnect\n"
msgstr ""
+#: src/conversation/gnunet-conversation-test.c:120
+#, c-format
+msgid ""
+"\n"
+"End of transmission. Have a GNU day.\n"
+msgstr ""
+
+#: src/conversation/gnunet-conversation-test.c:146
+#, c-format
+msgid ""
+"\n"
+"We are now playing your recording back. If you can hear it, your audio "
+"settings are working..."
+msgstr ""
+
+#: src/conversation/gnunet-conversation-test.c:218
+#, c-format
+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.c:264
#, c-format
msgid "Incoming call from `%s'. Please /accept %u or /cancel %u the call.\n"
@@ -1112,30 +1134,8 @@ msgstr ""
msgid "Enables having a conversation with other GNUnet users."
msgstr ""
-#: src/conversation/gnunet-conversation-test.c:120
-#, c-format
-msgid ""
-"\n"
-"End of transmission. Have a GNU day.\n"
-msgstr ""
-
-#: src/conversation/gnunet-conversation-test.c:146
-#, c-format
-msgid ""
-"\n"
-"We are now playing your recording back. If you can hear it, your audio "
-"settings are working..."
-msgstr ""
-
-#: src/conversation/gnunet-conversation-test.c:218
-#, c-format
-msgid ""
-"We will now be recording you for %s. After that time, the recording will be "
-"played back to you..."
-msgstr ""
-
-#: src/conversation/gnunet_gst.c:664
#: src/conversation/gnunet-helper-audio-playback-gst.c:363
+#: src/conversation/gnunet_gst.c:664
#, c-format
msgid "Read error from STDIN: %d %s\n"
msgstr ""
@@ -1917,17 +1917,17 @@ msgstr "“%s”于 %s:%d 处失败,错误为:%s\n"
msgid "Mysql database running\n"
msgstr ""
-#: src/datastore/plugin_datastore_postgres.c:278
-#: src/datastore/plugin_datastore_postgres.c:891
+#: src/datastore/plugin_datastore_postgres.c:284
+#: src/datastore/plugin_datastore_postgres.c:897
msgid "Postgress exec failure"
msgstr ""
-#: src/datastore/plugin_datastore_postgres.c:852
+#: src/datastore/plugin_datastore_postgres.c:858
#, fuzzy
msgid "Failed to drop table from database.\n"
msgstr "发送消息失败。\n"
-#: src/datastore/plugin_datastore_postgres.c:950
+#: src/datastore/plugin_datastore_postgres.c:956
msgid "Postgres database running\n"
msgstr ""
@@ -2036,90 +2036,42 @@ msgstr ""
msgid "Prints all packets that go through the DHT."
msgstr ""
-#: src/dht/gnunet_dht_profiler.c:922 src/testbed/gnunet-testbed-profiler.c:255
-#, fuzzy, c-format
-msgid "Exiting as the number of peers is %u\n"
-msgstr "增加 TCP/IP 的最大连接数"
+#: src/dht/gnunet-dht-put.c:133
+msgid "Must provide KEY and DATA for DHT put!\n"
+msgstr ""
-#: src/dht/gnunet_dht_profiler.c:955 src/rps/gnunet-rps-profiler.c:3194
-#, fuzzy
-msgid "number of peers to start"
-msgstr "迭代次数"
+#: src/dht/gnunet-dht-put.c:140
+#, fuzzy, c-format
+msgid "Could not connect to DHT service!\n"
+msgstr "无法连接到 %s:%u:%s\n"
-#: src/dht/gnunet_dht_profiler.c:961
-msgid "number of PUTs to perform per peer"
+#: src/dht/gnunet-dht-put.c:151
+#, c-format
+msgid "Issuing put request for `%s' with data `%s'!\n"
msgstr ""
-#: src/dht/gnunet_dht_profiler.c:967 src/nse/gnunet-nse-profiler.c:872
-#: src/testbed/gnunet-testbed-profiler.c:305
-msgid "name of the file with the login information for the testbed"
+#: src/dht/gnunet-dht-put.c:187
+msgid "the data to insert under the key"
msgstr ""
-#: src/dht/gnunet_dht_profiler.c:973
-msgid "delay between rounds for collecting statistics (default: 30 sec)"
+#: src/dht/gnunet-dht-put.c:193
+msgid "how long to store this entry in the dht (in seconds)"
msgstr ""
-#: src/dht/gnunet_dht_profiler.c:979
-msgid "delay to start doing PUTs (default: 1 sec)"
+#: src/dht/gnunet-dht-put.c:208
+msgid "how many replicas to create"
msgstr ""
-#: src/dht/gnunet_dht_profiler.c:985
-msgid "delay to start doing GETs (default: 5 min)"
+#: src/dht/gnunet-dht-put.c:212
+msgid "use DHT's record route option"
msgstr ""
-#: src/dht/gnunet_dht_profiler.c:990
-msgid "replication degree for DHT PUTs"
+#: src/dht/gnunet-dht-put.c:217
+msgid "the type to insert data as"
msgstr ""
-#: src/dht/gnunet_dht_profiler.c:996
-msgid "chance that a peer is selected at random for PUTs"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1002
-msgid "timeout for DHT PUT and GET requests (default: 1 min)"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1023
-#, fuzzy
-msgid "Measure quality and performance of the DHT service."
-msgstr "无法访问该服务"
-
-#: src/dht/gnunet-dht-put.c:133
-msgid "Must provide KEY and DATA for DHT put!\n"
-msgstr ""
-
-#: src/dht/gnunet-dht-put.c:140
-#, fuzzy, c-format
-msgid "Could not connect to DHT service!\n"
-msgstr "无法连接到 %s:%u:%s\n"
-
-#: src/dht/gnunet-dht-put.c:151
-#, c-format
-msgid "Issuing put request for `%s' with data `%s'!\n"
-msgstr ""
-
-#: src/dht/gnunet-dht-put.c:187
-msgid "the data to insert under the key"
-msgstr ""
-
-#: src/dht/gnunet-dht-put.c:193
-msgid "how long to store this entry in the dht (in seconds)"
-msgstr ""
-
-#: src/dht/gnunet-dht-put.c:208
-msgid "how many replicas to create"
-msgstr ""
-
-#: src/dht/gnunet-dht-put.c:212
-msgid "use DHT's record route option"
-msgstr ""
-
-#: src/dht/gnunet-dht-put.c:217
-msgid "the type to insert data as"
-msgstr ""
-
-#: src/dht/gnunet-dht-put.c:232
-msgid "Issue a PUT request to the GNUnet DHT insert DATA under KEY."
+#: src/dht/gnunet-dht-put.c:232
+msgid "Issue a PUT request to the GNUnet DHT insert DATA under KEY."
msgstr ""
#: src/dht/gnunet-service-dht_clients.c:367
@@ -2329,6 +2281,54 @@ msgstr ""
msgid "# DHT requests combined"
msgstr ""
+#: src/dht/gnunet_dht_profiler.c:922 src/testbed/gnunet-testbed-profiler.c:255
+#, fuzzy, c-format
+msgid "Exiting as the number of peers is %u\n"
+msgstr "增加 TCP/IP 的最大连接数"
+
+#: src/dht/gnunet_dht_profiler.c:955 src/rps/gnunet-rps-profiler.c:3194
+#, fuzzy
+msgid "number of peers to start"
+msgstr "迭代次数"
+
+#: src/dht/gnunet_dht_profiler.c:961
+msgid "number of PUTs to perform per peer"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:967 src/nse/gnunet-nse-profiler.c:872
+#: src/testbed/gnunet-testbed-profiler.c:305
+msgid "name of the file with the login information for the testbed"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:973
+msgid "delay between rounds for collecting statistics (default: 30 sec)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:979
+msgid "delay to start doing PUTs (default: 1 sec)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:985
+msgid "delay to start doing GETs (default: 5 min)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:990
+msgid "replication degree for DHT PUTs"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:996
+msgid "chance that a peer is selected at random for PUTs"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1002
+msgid "timeout for DHT PUT and GET requests (default: 1 min)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1023
+#, fuzzy
+msgid "Measure quality and performance of the DHT service."
+msgstr "无法访问该服务"
+
#: src/dht/plugin_block_dht.c:189
#, c-format
msgid "Block not of type %u\n"
@@ -3248,14 +3248,6 @@ msgid ""
"chk/...)"
msgstr ""
-#: src/fs/gnunet-fs.c:128
-msgid "print a list of all indexed files"
-msgstr ""
-
-#: src/fs/gnunet-fs.c:141
-msgid "Special file-sharing operations"
-msgstr ""
-
#: src/fs/gnunet-fs-profiler.c:211
msgid "run the experiment with COUNT peers"
msgstr ""
@@ -3272,6 +3264,14 @@ msgstr ""
msgid "run a testbed to measure file-sharing performance"
msgstr ""
+#: src/fs/gnunet-fs.c:128
+msgid "print a list of all indexed files"
+msgstr ""
+
+#: src/fs/gnunet-fs.c:141
+msgid "Special file-sharing operations"
+msgstr ""
+
#: src/fs/gnunet-publish.c:219 src/fs/gnunet-publish.c:234
#, c-format
msgid "Publishing `%s' at %llu/%llu (%s remaining)\n"
@@ -3926,50 +3926,6 @@ msgstr ""
msgid "look for GNS2DNS records instead of ANY"
msgstr ""
-#: src/gns/gnunet-gns.c:257
-#, fuzzy, c-format
-msgid "`%s' is not a valid DNS domain name\n"
-msgstr "“%s”不可用。\n"
-
-#: src/gns/gnunet-gns.c:267 src/util/dnsparser.c:254
-#, fuzzy, c-format
-msgid "Failed to convert DNS IDNA name `%s' to UTF-8: %s\n"
-msgstr "打开日志文件“%s”失败:%s\n"
-
-#: src/gns/gnunet-gns.c:281
-msgid "Cannot resolve using GNS: GNUnet peer not running\n"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:305
-#, c-format
-msgid "Invalid typename specified, assuming `ANY'\n"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:340
-msgid "Lookup a record for the given name"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:346
-msgid "Specify the type of the record to lookup"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:352
-msgid "Specify a timeout for the lookup"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:356
-msgid "No unneeded output"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:361
-msgid "DNS Compatibility: Name is passed in IDNA instead of UTF-8"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:375
-#, fuzzy
-msgid "GNUnet GNS resolver tool"
-msgstr "GNUnet 错误日志"
-
#: src/gns/gnunet-gns-import.c:486
msgid "This program will import some GNS authorities into your GNS namestore."
msgstr ""
@@ -4090,6 +4046,50 @@ msgstr ""
msgid "GNUnet GNS proxy"
msgstr ""
+#: src/gns/gnunet-gns.c:257
+#, fuzzy, c-format
+msgid "`%s' is not a valid DNS domain name\n"
+msgstr "“%s”不可用。\n"
+
+#: src/gns/gnunet-gns.c:267 src/util/dnsparser.c:254
+#, fuzzy, c-format
+msgid "Failed to convert DNS IDNA name `%s' to UTF-8: %s\n"
+msgstr "打开日志文件“%s”失败:%s\n"
+
+#: src/gns/gnunet-gns.c:281
+msgid "Cannot resolve using GNS: GNUnet peer not running\n"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:305
+#, c-format
+msgid "Invalid typename specified, assuming `ANY'\n"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:340
+msgid "Lookup a record for the given name"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:346
+msgid "Specify the type of the record to lookup"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:352
+msgid "Specify a timeout for the lookup"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:356
+msgid "No unneeded output"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:361
+msgid "DNS Compatibility: Name is passed in IDNA instead of UTF-8"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:375
+#, fuzzy
+msgid "GNUnet GNS resolver tool"
+msgstr "GNUnet 错误日志"
+
#: src/gns/gnunet-service-gns.c:505
#, fuzzy
msgid "Properly base32-encoded public key required"
@@ -4101,8 +4101,8 @@ msgid "Failed to connect to the namecache!\n"
msgstr "初始化“%s”服务失败。\n"
#: src/gns/gnunet-service-gns.c:560
-#: src/zonemaster/gnunet-service-zonemaster.c:887
#: src/zonemaster/gnunet-service-zonemaster-monitor.c:444
+#: src/zonemaster/gnunet-service-zonemaster.c:887
#, fuzzy
msgid "Could not connect to DHT!\n"
msgstr "无法连接到 %s:%u:%s\n"
@@ -4594,7 +4594,7 @@ msgid "# hostlist advertisements send"
msgstr ""
#: src/hostlist/gnunet-daemon-hostlist_server.c:674
-#: src/transport/gnunet-service-transport.c:2659
+#: src/transport/gnunet-service-transport.c:2661
msgid "Could not access PEERINFO service. Exiting.\n"
msgstr ""
@@ -4847,6 +4847,70 @@ msgstr "sqlite 数据仓库"
msgid "Failed to setup database at `%s'\n"
msgstr "运行 %s失败:%s %d\n"
+#: src/namestore/gnunet-namestore-fcfsd.c:552
+#, fuzzy, c-format
+msgid "Unsupported form value `%s'\n"
+msgstr "未知的命令“%s”。\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:579
+#, fuzzy, c-format
+msgid "Failed to create record for domain `%s': %s\n"
+msgstr "解析配置文件“%s”失败\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:600
+msgid "Error when mapping zone to name\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:632
+#, c-format
+msgid "Found existing name `%s' for the given key\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:694
+#, c-format
+msgid "Found %u existing records for domain `%s'\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:784
+#, fuzzy, c-format
+msgid "Failed to create page for `%s'\n"
+msgstr "发送消息失败。\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:803
+#, fuzzy, c-format
+msgid "Failed to setup post processor for `%s'\n"
+msgstr "解析配置文件“%s”失败\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:840
+msgid "Domain name must not contain `.'\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:849
+msgid "Domain name must not contain `+'\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1084
+msgid "No ego configured for `fcfsd` subsystem\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1115
+#, fuzzy
+msgid "Failed to start HTTP server\n"
+msgstr "初始化“%s”服务失败。\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1163
+#, fuzzy
+msgid "Failed to connect to identity\n"
+msgstr "初始化“%s”服务失败。\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1190
+msgid "name of the zone that is to be managed by FCFSD"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1210
+msgid "GNU Name System First Come First Serve name registration service"
+msgstr ""
+
#: src/namestore/gnunet-namestore.c:334
#, c-format
msgid "Adding record failed: %s\n"
@@ -5076,70 +5140,6 @@ msgstr ""
msgid "name of the ego controlling the zone"
msgstr ""
-#: src/namestore/gnunet-namestore-fcfsd.c:552
-#, fuzzy, c-format
-msgid "Unsupported form value `%s'\n"
-msgstr "未知的命令“%s”。\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:579
-#, fuzzy, c-format
-msgid "Failed to create record for domain `%s': %s\n"
-msgstr "解析配置文件“%s”失败\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:600
-msgid "Error when mapping zone to name\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:632
-#, c-format
-msgid "Found existing name `%s' for the given key\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:694
-#, c-format
-msgid "Found %u existing records for domain `%s'\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:784
-#, fuzzy, c-format
-msgid "Failed to create page for `%s'\n"
-msgstr "发送消息失败。\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:803
-#, fuzzy, c-format
-msgid "Failed to setup post processor for `%s'\n"
-msgstr "解析配置文件“%s”失败\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:840
-msgid "Domain name must not contain `.'\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:849
-msgid "Domain name must not contain `+'\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1084
-msgid "No ego configured for `fcfsd` subsystem\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1115
-#, fuzzy
-msgid "Failed to start HTTP server\n"
-msgstr "初始化“%s”服务失败。\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1163
-#, fuzzy
-msgid "Failed to connect to identity\n"
-msgstr "初始化“%s”服务失败。\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1190
-msgid "name of the zone that is to be managed by FCFSD"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1210
-msgid "GNU Name System First Come First Serve name registration service"
-msgstr ""
-
#: src/namestore/gnunet-service-namestore.c:866
#, fuzzy, c-format
msgid "Failed to replicate block in namecache: %s\n"
@@ -5455,10 +5455,6 @@ msgstr ""
msgid "`upnpc' command not found\n"
msgstr ""
-#: src/nse/gnunet-nse.c:124
-msgid "Show network size estimates from NSE service."
-msgstr ""
-
#: src/nse/gnunet-nse-profiler.c:857
msgid "limit to the number of connections to NSE services, 0 for none"
msgstr ""
@@ -5476,74 +5472,24 @@ msgid "Number of peers to run in each round, separated
by commas"
msgstr ""
#: src/nse/gnunet-nse-profiler.c:900
-msgid "delay between rounds"
-msgstr ""
-
-#: src/nse/gnunet-nse-profiler.c:912
-#, fuzzy
-msgid "Measure quality and performance of the NSE service."
-msgstr "无法访问该服务"
-
-#: src/nse/gnunet-service-nse.c:1443
-#: src/revocation/gnunet-service-revocation.c:834 src/util/gnunet-scrypt.c:257
-#, fuzzy
-msgid "Value is too large.\n"
-msgstr "值不在合法范围内。"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:175
-#, c-format
-msgid "Removing expired address of transport `%s'\n"
-msgstr ""
-
-#: src/peerinfo/gnunet-service-peerinfo.c:306
-#, fuzzy, c-format
-msgid "Failed to parse HELLO in file `%s': %s\n"
-msgstr "解析配置文件“%s”失败\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:323
-#: src/peerinfo/gnunet-service-peerinfo.c:348
-#, fuzzy, c-format
-msgid "Failed to parse HELLO in file `%s'\n"
-msgstr "解析配置文件“%s”失败\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:426
-msgid "# peers known"
-msgstr ""
-
-#: src/peerinfo/gnunet-service-peerinfo.c:468
-#, c-format
-msgid ""
-"File `%s' in directory `%s' does not match naming convention. Removed.\n"
-msgstr ""
-
-#: src/peerinfo/gnunet-service-peerinfo.c:624
-#, fuzzy, c-format
-msgid "Scanning directory `%s'\n"
-msgstr "解析配置文件“%s”失败\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:631
-#, c-format
-msgid "Still no peers found in `%s'!\n"
-msgstr ""
-
-#: src/peerinfo/gnunet-service-peerinfo.c:1024
-#, fuzzy, c-format
-msgid "Cleaning up directory `%s'\n"
-msgstr "解析配置文件“%s”失败\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:1319
-#, c-format
-msgid "Importing HELLOs from `%s'\n"
-msgstr ""
-
-#: src/peerinfo/gnunet-service-peerinfo.c:1332
-msgid "Skipping import of included HELLOs\n"
+msgid "delay between rounds"
msgstr ""
-#: src/peerinfo/peerinfo_api.c:217
-msgid "Failed to receive response from `PEERINFO' service."
+#: src/nse/gnunet-nse-profiler.c:912
+#, fuzzy
+msgid "Measure quality and performance of the NSE service."
+msgstr "无法访问该服务"
+
+#: src/nse/gnunet-nse.c:124
+msgid "Show network size estimates from NSE service."
msgstr ""
+#: src/nse/gnunet-service-nse.c:1443
+#: src/revocation/gnunet-service-revocation.c:834 src/util/gnunet-scrypt.c:257
+#, fuzzy
+msgid "Value is too large.\n"
+msgstr "值不在合法范围内。"
+
#: src/peerinfo-tool/gnunet-peerinfo.c:237
#, fuzzy, c-format
msgid "%sPeer `%s'\n"
@@ -5640,6 +5586,60 @@ msgstr "解析配置文件“%s”失败\n"
msgid "Peerinfo REST API initialized\n"
msgstr ""
+#: src/peerinfo/gnunet-service-peerinfo.c:175
+#, c-format
+msgid "Removing expired address of transport `%s'\n"
+msgstr ""
+
+#: src/peerinfo/gnunet-service-peerinfo.c:306
+#, fuzzy, c-format
+msgid "Failed to parse HELLO in file `%s': %s\n"
+msgstr "解析配置文件“%s”失败\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:323
+#: src/peerinfo/gnunet-service-peerinfo.c:348
+#, fuzzy, c-format
+msgid "Failed to parse HELLO in file `%s'\n"
+msgstr "解析配置文件“%s”失败\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:426
+msgid "# peers known"
+msgstr ""
+
+#: src/peerinfo/gnunet-service-peerinfo.c:468
+#, c-format
+msgid ""
+"File `%s' in directory `%s' does not match naming convention. Removed.\n"
+msgstr ""
+
+#: src/peerinfo/gnunet-service-peerinfo.c:624
+#, fuzzy, c-format
+msgid "Scanning directory `%s'\n"
+msgstr "解析配置文件“%s”失败\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:631
+#, c-format
+msgid "Still no peers found in `%s'!\n"
+msgstr ""
+
+#: src/peerinfo/gnunet-service-peerinfo.c:1024
+#, fuzzy, c-format
+msgid "Cleaning up directory `%s'\n"
+msgstr "解析配置文件“%s”失败\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:1319
+#, c-format
+msgid "Importing HELLOs from `%s'\n"
+msgstr ""
+
+#: src/peerinfo/gnunet-service-peerinfo.c:1332
+msgid "Skipping import of included HELLOs\n"
+msgstr ""
+
+#: src/peerinfo/peerinfo_api.c:217
+msgid "Failed to receive response from `PEERINFO' service."
+msgstr ""
+
#: src/peerstore/gnunet-peerstore.c:92
msgid "peerstore"
msgstr ""
@@ -6094,18 +6094,6 @@ msgstr ""
msgid "Could not open revocation database file!"
msgstr "无法连接到 %s:%u:%s\n"
-#: src/rps/gnunet-rps.c:270
-msgid "Seed a PeerID"
-msgstr ""
-
-#: src/rps/gnunet-rps.c:275
-msgid "Get updates of view (0 for infinite updates)"
-msgstr ""
-
-#: src/rps/gnunet-rps.c:279
-msgid "Get peers from biased stream"
-msgstr ""
-
#: src/rps/gnunet-rps-profiler.c:3200
msgid "duration of the profiling"
msgstr ""
@@ -6124,6 +6112,18 @@ msgstr "迭代次数"
msgid "Measure quality and performance of the RPS service."
msgstr "无法访问该服务"
+#: src/rps/gnunet-rps.c:270
+msgid "Seed a PeerID"
+msgstr ""
+
+#: src/rps/gnunet-rps.c:275
+msgid "Get updates of view (0 for infinite updates)"
+msgstr ""
+
+#: src/rps/gnunet-rps.c:279
+msgid "Get peers from biased stream"
+msgstr ""
+
#: src/scalarproduct/gnunet-scalarproduct.c:229
#, fuzzy
msgid "You must specify at least one message ID to check!\n"
@@ -6179,10 +6179,10 @@ msgstr ""
msgid "Calculate the Vectorproduct with a GNUnet peer."
msgstr ""
-#: src/scalarproduct/gnunet-service-scalarproduct_alice.c:1358
-#: src/scalarproduct/gnunet-service-scalarproduct_bob.c:1355
#: src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c:1118
#: src/scalarproduct/gnunet-service-scalarproduct-ecc_bob.c:1063
+#: src/scalarproduct/gnunet-service-scalarproduct_alice.c:1358
+#: src/scalarproduct/gnunet-service-scalarproduct_bob.c:1355
#, fuzzy
msgid "Connect to CADET failed\n"
msgstr "“%s”已连接到“%s”。\n"
@@ -6537,15 +6537,6 @@ msgstr ""
msgid "%.s Unknown result code."
msgstr ""
-#: src/testbed/gnunet_testbed_mpi_spawn.c:119
-msgid "Waiting for child to exit.\n"
-msgstr ""
-
-#: src/testbed/gnunet_testbed_mpi_spawn.c:242
-#, fuzzy, c-format
-msgid "Spawning process `%s'\n"
-msgstr "卸载 GNUnet 服务"
-
#: src/testbed/gnunet-testbed-profiler.c:290
msgid "tolerate COUNT number of continious timeout failures"
msgstr ""
@@ -6557,6 +6548,15 @@ msgid ""
"signal is received"
msgstr ""
+#: src/testbed/gnunet_testbed_mpi_spawn.c:119
+msgid "Waiting for child to exit.\n"
+msgstr ""
+
+#: src/testbed/gnunet_testbed_mpi_spawn.c:242
+#, fuzzy, c-format
+msgid "Spawning process `%s'\n"
+msgstr "卸载 GNUnet 服务"
+
#: src/testbed/testbed_api.c:399
#, fuzzy, c-format
msgid "Adding host %u failed with error: %s\n"
@@ -6853,19 +6853,19 @@ msgstr ""
msgid "GNUnet topology control"
msgstr ""
-#: src/transport/gnunet-communicator-tcp.c:3189
-#: src/transport/gnunet-communicator-udp.c:2826
+#: src/transport/gnunet-communicator-tcp.c:3221
+#: src/transport/gnunet-communicator-udp.c:2995
#: src/transport/gnunet-service-tng.c:10014
-#: src/transport/gnunet-service-transport.c:2624
+#: src/transport/gnunet-service-transport.c:2626
#, fuzzy
msgid "Transport service is lacking key configuration settings. Exiting.\n"
msgstr "立即保存配置?"
-#: src/transport/gnunet-communicator-tcp.c:3494
+#: src/transport/gnunet-communicator-tcp.c:3553
msgid "GNUnet TCP communicator"
msgstr ""
-#: src/transport/gnunet-communicator-udp.c:2898
+#: src/transport/gnunet-communicator-udp.c:3067
msgid "GNUnet UDP communicator"
msgstr ""
@@ -6890,50 +6890,50 @@ msgstr "发送消息失败。\n"
msgid "GNUnet UNIX domain socket communicator"
msgstr ""
-#: src/transport/gnunet-service-transport_ats.c:137
-msgid "# Addresses given to ATS"
-msgstr ""
-
#: src/transport/gnunet-service-transport.c:445
msgid "# messages dropped due to slow client"
msgstr ""
-#: src/transport/gnunet-service-transport.c:794
+#: src/transport/gnunet-service-transport.c:796
msgid "# bytes payload dropped (other peer was not connected)"
msgstr ""
-#: src/transport/gnunet-service-transport.c:1477
+#: src/transport/gnunet-service-transport.c:1479
msgid "# bytes payload discarded due to not connected peer"
msgstr ""
-#: src/transport/gnunet-service-transport.c:1622
+#: src/transport/gnunet-service-transport.c:1624
msgid "# bytes total received"
msgstr ""
-#: src/transport/gnunet-service-transport.c:1712
+#: src/transport/gnunet-service-transport.c:1714
msgid "# bytes payload received"
msgstr ""
-#: src/transport/gnunet-service-transport.c:2016
-#: src/transport/gnunet-service-transport.c:2450
+#: src/transport/gnunet-service-transport.c:2018
+#: src/transport/gnunet-service-transport.c:2452
msgid "# disconnects due to blacklist"
msgstr ""
-#: src/transport/gnunet-service-transport.c:2454
+#: src/transport/gnunet-service-transport.c:2456
#, fuzzy, c-format
msgid "Disallowing connection to peer `%s' on transport %s\n"
msgstr "解析配置文件“%s”失败\n"
-#: src/transport/gnunet-service-transport.c:2549
+#: src/transport/gnunet-service-transport.c:2551
#, fuzzy, c-format
msgid "Adding blacklisting entry for peer `%s'\n"
msgstr "卸载 GNUnet 服务"
-#: src/transport/gnunet-service-transport.c:2558
+#: src/transport/gnunet-service-transport.c:2560
#, c-format
msgid "Adding blacklisting entry for peer `%s':`%s'\n"
msgstr ""
+#: src/transport/gnunet-service-transport_ats.c:137
+msgid "# Addresses given to ATS"
+msgstr ""
+
#: src/transport/gnunet-service-transport_hello.c:195
msgid "# refreshed my HELLO"
msgstr ""
@@ -7242,6 +7242,44 @@ msgstr ""
msgid "# HELLOs given to peerinfo"
msgstr ""
+#: src/transport/gnunet-transport-profiler.c:220
+#, c-format
+msgid "%llu B in %llu ms == %.2f KB/s!\n"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:577
+msgid "send data to peer"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:581
+msgid "receive data from peer"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:586
+msgid "iterations"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:591
+#, fuzzy
+msgid "number of messages to send"
+msgstr "每次迭代所使用的消息数量"
+
+#: src/transport/gnunet-transport-profiler.c:596
+#, fuzzy
+msgid "message size to use"
+msgstr "消息尺寸"
+
+#: src/transport/gnunet-transport-profiler.c:601
+#: src/transport/gnunet-transport.c:1404
+msgid "peer identity"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:614
+#: src/transport/gnunet-transport.c:1426
+#, fuzzy
+msgid "Direct access to transport service."
+msgstr "初始化“%s”服务失败。\n"
+
#: src/transport/gnunet-transport.c:406
#, c-format
msgid "Transmitted %llu bytes/s (%llu bytes in %s)\n"
@@ -7378,11 +7416,6 @@ msgstr ""
msgid "do not resolve hostnames"
msgstr ""
-#: src/transport/gnunet-transport.c:1404
-#: src/transport/gnunet-transport-profiler.c:601
-msgid "peer identity"
-msgstr ""
-
#: src/transport/gnunet-transport.c:1408
msgid "monitor plugin sessions"
msgstr ""
@@ -7391,39 +7424,6 @@ msgstr ""
msgid "send data for benchmarking to the other peer (until CTRL-C)"
msgstr ""
-#: src/transport/gnunet-transport.c:1426
-#: src/transport/gnunet-transport-profiler.c:614
-#, fuzzy
-msgid "Direct access to transport service."
-msgstr "初始化“%s”服务失败。\n"
-
-#: src/transport/gnunet-transport-profiler.c:220
-#, c-format
-msgid "%llu B in %llu ms == %.2f KB/s!\n"
-msgstr ""
-
-#: src/transport/gnunet-transport-profiler.c:577
-msgid "send data to peer"
-msgstr ""
-
-#: src/transport/gnunet-transport-profiler.c:581
-msgid "receive data from peer"
-msgstr ""
-
-#: src/transport/gnunet-transport-profiler.c:586
-msgid "iterations"
-msgstr ""
-
-#: src/transport/gnunet-transport-profiler.c:591
-#, fuzzy
-msgid "number of messages to send"
-msgstr "每次迭代所使用的消息数量"
-
-#: src/transport/gnunet-transport-profiler.c:596
-#, fuzzy
-msgid "message size to use"
-msgstr "消息尺寸"
-
#: src/transport/plugin_transport_http_client.c:1489
#: src/transport/plugin_transport_http_server.c:2331
#: src/transport/plugin_transport_http_server.c:3562
@@ -7700,20 +7700,6 @@ msgstr ""
msgid "TCP transport advertises itself as being on port %llu\n"
msgstr ""
-#: src/transport/plugin_transport_udp_broadcasting.c:169
-msgid "# Multicast HELLO beacons received via UDP"
-msgstr ""
-
-#: src/transport/plugin_transport_udp_broadcasting.c:553
-msgid ""
-"Disabling HELLO broadcasting due to friend-to-friend only configuration!\n"
-msgstr ""
-
-#: src/transport/plugin_transport_udp_broadcasting.c:571
-#, c-format
-msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n"
-msgstr ""
-
#: src/transport/plugin_transport_udp.c:3169
#, c-format
msgid ""
@@ -7762,6 +7748,20 @@ msgstr "“%s”不可用。\n"
msgid "Failed to create UDP network sockets\n"
msgstr "发送消息失败。\n"
+#: src/transport/plugin_transport_udp_broadcasting.c:169
+msgid "# Multicast HELLO beacons received via UDP"
+msgstr ""
+
+#: src/transport/plugin_transport_udp_broadcasting.c:553
+msgid ""
+"Disabling HELLO broadcasting due to friend-to-friend only configuration!\n"
+msgstr ""
+
+#: src/transport/plugin_transport_udp_broadcasting.c:571
+#, c-format
+msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n"
+msgstr ""
+
#: src/transport/plugin_transport_unix.c:1396
#, fuzzy, c-format
msgid "Cannot bind to `%s'\n"
@@ -7934,7 +7934,7 @@ msgid "do daemonize (detach from terminal)"
msgstr ""
#: src/transport/tcp_service_legacy.c:1397
-#: src/transport/transport-testing2.c:1116 src/util/service.c:2072
+#: src/transport/transport-testing2.c:983 src/util/service.c:2072
#: src/util/service.c:2084
#, fuzzy, c-format
msgid "Malformed configuration file `%s', exit ...\n"
@@ -8598,19 +8598,19 @@ msgid ""
"Fatal internal logic error, process hangs in `%s' (abort with CTRL-C)!\n"
msgstr ""
-#: src/util/os_installation.c:409
+#: src/util/os_installation.c:411
#, fuzzy, c-format
msgid ""
"Could not determine installation path for %s. Set `%s' environment "
"variable.\n"
msgstr "无法确定安装路径。请尝试设置“%s”\n"
-#: src/util/os_installation.c:792
+#: src/util/os_installation.c:794
#, fuzzy, c-format
msgid "Could not find binary `%s' in PATH!\n"
msgstr "找不到主机“%s”的 IP:%s\n"
-#: src/util/os_installation.c:825
+#: src/util/os_installation.c:827
#, c-format
msgid "Binary `%s' exists, but is not SUID\n"
msgstr ""
@@ -8635,17 +8635,17 @@ msgstr ""
msgid "Could not determine plugin installation path.\n"
msgstr "无法确定用户界面定义文件。"
-#: src/util/program.c:262
+#: src/util/program.c:267
#, fuzzy, c-format
msgid "Unreadable or malformed configuration file `%s', exit ...\n"
msgstr "解析配置文件“%s”失败\n"
-#: src/util/program.c:279
+#: src/util/program.c:284
#, fuzzy, c-format
msgid "Unreadable or malformed default configuration file `%s', exit ...\n"
msgstr "解析配置文件“%s”失败\n"
-#: src/util/program.c:294
+#: src/util/program.c:299
#, fuzzy
msgid "Unreadable or malformed configuration, exit ...\n"
msgstr "解析配置文件“%s”失败\n"
@@ -8710,10 +8710,6 @@ msgstr ""
msgid "Attempting to proxy service `%s' to invalid port %d or hostname.\n"
msgstr ""
-#: src/util/strings.c:179
-msgid "b"
-msgstr "b"
-
#: src/util/strings.c:503
#, c-format
msgid "Character sets requested were `%s'->`%s'\n"
@@ -8723,48 +8719,6 @@ msgstr ""
msgid "Failed to expand `$HOME': environment variable `HOME' not set"
msgstr "扩展“$HOME”失败:没有设置环境变量“HOME”"
-#: src/util/strings.c:706
-msgid "µs"
-msgstr ""
-
-#: src/util/strings.c:710
-msgid "forever"
-msgstr ""
-
-#: src/util/strings.c:712
-msgid "0 ms"
-msgstr ""
-
-#: src/util/strings.c:716
-msgid "ms"
-msgstr "毫秒"
-
-#: src/util/strings.c:720
-msgid "s"
-msgstr "秒"
-
-#: src/util/strings.c:724
-msgid "m"
-msgstr "分"
-
-#: src/util/strings.c:728
-msgid "h"
-msgstr "时"
-
-#: src/util/strings.c:734
-#, fuzzy
-msgid "day"
-msgstr " 天"
-
-#: src/util/strings.c:736
-#, fuzzy
-msgid "days"
-msgstr " 天"
-
-#: src/util/strings.c:764
-msgid "end of time"
-msgstr ""
-
#: src/util/strings.c:1240
msgid "IPv6 address did not start with `['\n"
msgstr ""
@@ -9007,12 +8961,35 @@ msgstr ""
msgid "Setup tunnels via VPN."
msgstr ""
-#: src/zonemaster/gnunet-service-zonemaster.c:849
#: src/zonemaster/gnunet-service-zonemaster-monitor.c:420
+#: src/zonemaster/gnunet-service-zonemaster.c:849
#, fuzzy
msgid "Failed to connect to the namestore!\n"
msgstr "初始化“%s”服务失败。\n"
+#~ msgid "b"
+#~ msgstr "b"
+
+#~ msgid "ms"
+#~ msgstr "毫秒"
+
+#~ msgid "s"
+#~ msgstr "秒"
+
+#~ msgid "m"
+#~ msgstr "分"
+
+#~ msgid "h"
+#~ msgstr "时"
+
+#, fuzzy
+#~ msgid "day"
+#~ msgstr " 天"
+
+#, fuzzy
+#~ msgid "days"
+#~ msgstr " 天"
+
#, fuzzy, c-format
#~ msgid "Could not acquire lock on file `%s': %s...\n"
#~ msgstr "无法解析“%s”(%s):%s\n"
diff --git a/src/Makefile.am b/src/Makefile.am
index 234a63389..c04d730be 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -12,7 +12,8 @@ endif
if HAVE_EXPERIMENTAL
EXP_DIR = \
rps \
- abd
+ #abd FTBFS
+ messenger
if HAVE_ABE
EXP_DIR += \
abe
@@ -51,7 +52,6 @@ SUBDIRS = \
include $(INTLEMU_SUBDIRS) \
util \
nt \
- gnsrecord \
hello \
block \
statistics \
@@ -74,7 +74,6 @@ SUBDIRS = \
fragmentation \
transport \
ats-tool \
- peerinfo-tool \
core \
$(TESTBED) \
$(ATS_TESTS) \
@@ -85,8 +84,10 @@ SUBDIRS = \
regex \
dns \
identity \
+ gnsrecord \
namecache \
namestore \
+ peerinfo-tool \
cadet \
set \
seti \
diff --git a/src/ats-tests/ats-testing-log.c b/src/ats-tests/ats-testing-log.c
index 38094a438..955401dd8 100644
--- a/src/ats-tests/ats-testing-log.c
+++ b/src/ats-tests/ats-testing-log.c
@@ -575,7 +575,7 @@ GNUNET_ATS_TEST_logging_write_to_file (struct LoggingHandle
*l,
/* Assembling slave string */
GNUNET_asprintf (&data,
-
"%llu;%llu;%u;%u;%u;%u;%u;%u;%.3f;%u;%u;%u;%u;%u;%u;%u;%.3f;%.3f\n",
+
"%llu;%llu;%u;%u;%u;%u;%u;%u;%.3f;%u;%u;%llu;%u;%u;%u;%u;%.3f;%.3f\n",
(long long unsigned
int) cur_lt->timestamp.abs_value_us,
(long long unsigned
@@ -593,7 +593,7 @@ GNUNET_ATS_TEST_logging_write_to_file (struct LoggingHandle
*l,
(double) plt->app_rtt / 1000,
plt->bandwidth_in,
plt->bandwidth_out,
- plt->ats_delay,
+ plt->ats_delay.rel_value_us,
plt->ats_distance,
plt->ats_network_type,
plt->ats_utilization_out,
diff --git a/src/cadet/gnunet-service-cadet_channel.c
b/src/cadet/gnunet-service-cadet_channel.c
index dab53b8c4..ae6d21452 100644
--- a/src/cadet/gnunet-service-cadet_channel.c
+++ b/src/cadet/gnunet-service-cadet_channel.c
@@ -442,7 +442,7 @@ GCCH_2s (const struct CadetChannel *ch)
? "loopback"
: GNUNET_i2s (GCP_get_id (GCT_get_destination (ch->t))),
GNUNET_h2s (&ch->port),
- ch->ctn,
+ ch->ctn.cn,
(NULL == ch->owner)
? 0
: ntohl (ch->owner->ccn.channel_of_client),
@@ -1899,10 +1899,10 @@ GCCH_handle_local_data (struct CadetChannel *ch,
GNUNET_memcpy (&crm->data_message[1], buf, buf_len);
GNUNET_CONTAINER_DLL_insert_tail (ch->head_sent, ch->tail_sent, crm);
LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Sending message %u from local client to %s with %u bytes\n",
+ "Sending message %u from local client to %s with %lu bytes\n",
ntohl (crm->data_message->mid.mid),
GCCH_2s (ch),
- buf_len);
+ (unsigned long) buf_len);
if (NULL != ch->retry_data_task)
{
GNUNET_SCHEDULER_cancel (ch->retry_data_task);
@@ -2044,7 +2044,7 @@ GCCH_debug (struct CadetChannel *ch, enum
GNUNET_ErrorType level)
LOG2 (level, "CHN *** DEBUG NULL CHANNEL ***\n");
return;
}
- LOG2 (level, "CHN %s:%X (%p)\n", GCT_2s (ch->t), ch->ctn, ch);
+ LOG2 (level, "CHN %s:%X (%p)\n", GCT_2s (ch->t), ch->ctn.cn, ch);
if (NULL != ch->owner)
{
LOG2 (level,
@@ -2062,7 +2062,7 @@ GCCH_debug (struct CadetChannel *ch, enum
GNUNET_ErrorType level)
ntohl (ch->dest->ccn.channel_of_client));
}
LOG2 (level,
- "CHN Message IDs recv: %d (%LLX), send: %d\n",
+ "CHN Message IDs recv: %d (%llX), send: %d\n",
ntohl (ch->mid_recv.mid),
(unsigned long long) ch->mid_futures,
ntohl (ch->mid_send.mid));
diff --git a/src/cadet/gnunet-service-cadet_core.c
b/src/cadet/gnunet-service-cadet_core.c
index 9a83fa31d..95a5d3f63 100644
--- a/src/cadet/gnunet-service-cadet_core.c
+++ b/src/cadet/gnunet-service-cadet_core.c
@@ -296,7 +296,7 @@ discard_all_from_rung_tail ()
while (NULL != (dir = tail->rd_head))
{
LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Queue full due new message %s on connection %s, dropping old
message\n",
+ "Queue full due new message on connection %s, dropping old message\n",
GNUNET_sh2s (&dir->my_route->cid.connection_of_tunnel));
GNUNET_STATISTICS_update (stats,
"# messages dropped due to full buffer",
@@ -408,7 +408,7 @@ route_message (struct CadetPeer *prev,
{
/* We are in the highest rung, drop our own! */
LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Queue full due new message %s on connection %s, dropping old
message\n",
+ "Queue full due new message on connection %s, dropping old
message\n",
GNUNET_sh2s (&dir->my_route->cid.connection_of_tunnel));
GNUNET_STATISTICS_update (stats,
"# messages dropped due to full buffer",
diff --git a/src/cadet/gnunet-service-cadet_dht.c
b/src/cadet/gnunet-service-cadet_dht.c
index 4e8ccbb08..e1bbeb2c3 100644
--- a/src/cadet/gnunet-service-cadet_dht.c
+++ b/src/cadet/gnunet-service-cadet_dht.c
@@ -195,8 +195,8 @@ announce_id (void *cls)
&my_full_id,
sizeof(my_full_id));
LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Announcing my HELLO (%u bytes) in the DHT\n",
- size);
+ "Announcing my HELLO (%lu bytes) in the DHT\n",
+ (unsigned long) size);
GNUNET_DHT_put (dht_handle, /* DHT handle */
&phash, /* Key to use */
dht_replication_level, /* Replication level */
diff --git a/src/cadet/gnunet-service-cadet_tunnels.c
b/src/cadet/gnunet-service-cadet_tunnels.c
index 2ca46b5aa..78bc54a5c 100644
--- a/src/cadet/gnunet-service-cadet_tunnels.c
+++ b/src/cadet/gnunet-service-cadet_tunnels.c
@@ -2431,7 +2431,7 @@ connection_ready_cb (void *cls,
{
case CADET_TUNNEL_KEY_UNINITIALIZED:
LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Do not begin KX for %s if WE have no channels waiting. Retrying
after %d\n",
+ "Do not begin KX for %s if WE have no channels waiting. Retrying
after %llu\n",
GCT_2s (t),
GNUNET_TIME_absolute_get_remaining (t->next_kx_attempt).rel_value_us);
/* Do not begin KX if WE have no channels waiting! */
diff --git a/src/consensus/consensus_api.c b/src/consensus/consensus_api.c
index 06b4c88ef..b4a9e5d39 100644
--- a/src/consensus/consensus_api.c
+++ b/src/consensus/consensus_api.c
@@ -280,7 +280,7 @@ GNUNET_CONSENSUS_insert (struct GNUNET_CONSENSUS_Handle
*consensus,
struct GNUNET_MQ_Envelope *ev;
struct InsertDoneInfo *i;
- LOG (GNUNET_ERROR_TYPE_DEBUG, "inserting, size=%llu\n", element->size);
+ LOG (GNUNET_ERROR_TYPE_DEBUG, "inserting, size=%u\n", element->size);
ev = GNUNET_MQ_msg_extra (element_msg, element->size,
GNUNET_MESSAGE_TYPE_CONSENSUS_CLIENT_INSERT);
diff --git a/src/conversation/Makefile.am b/src/conversation/Makefile.am
index 7645b7973..0f99a6526 100644
--- a/src/conversation/Makefile.am
+++ b/src/conversation/Makefile.am
@@ -185,6 +185,7 @@ gnunet_service_conversation_LDADD = \
libgnunetmicrophone.la \
$(top_builddir)/src/cadet/libgnunetcadet.la \
$(top_builddir)/src/util/libgnunetutil.la \
+ $(top_builddir)/src/identity/libgnunetidentity.la \
$(INTLLIBS)
#gnunet_service_conversation_LDFLAGS = \
#
diff --git a/src/conversation/conversation.h b/src/conversation/conversation.h
index ed614ab1b..d244f5163 100644
--- a/src/conversation/conversation.h
+++ b/src/conversation/conversation.h
@@ -27,6 +27,8 @@
#ifndef CONVERSATION_H
#define CONVERSATION_H
+#include "gnunet_identity_service.h"
+
#ifdef __cplusplus
extern "C"
{
@@ -105,7 +107,7 @@ struct ClientPhoneRingMessage
/**
* Who is calling us?
*/
- struct GNUNET_CRYPTO_EcdsaPublicKey caller_id;
+ struct GNUNET_IDENTITY_PublicKey caller_id;
};
@@ -230,7 +232,7 @@ struct ClientCallMessage
/**
* Identity of the caller.
*/
- struct GNUNET_CRYPTO_EcdsaPrivateKey caller_id;
+ struct GNUNET_IDENTITY_PrivateKey caller_id;
};
@@ -301,7 +303,7 @@ struct CadetPhoneRingMessage
/**
* Who is calling us? (also who is signing).
*/
- struct GNUNET_CRYPTO_EcdsaPublicKey caller_id;
+ struct GNUNET_IDENTITY_PublicKey caller_id;
/**
* When does the signature expire?
@@ -311,7 +313,7 @@ struct CadetPhoneRingMessage
/**
* Signature over a `struct CadetPhoneRingInfoPS`
*/
- struct GNUNET_CRYPTO_EcdsaSignature signature;
+ struct GNUNET_IDENTITY_Signature signature;
};
diff --git a/src/conversation/conversation_api.c
b/src/conversation/conversation_api.c
index daf51042a..88fe8f11c 100644
--- a/src/conversation/conversation_api.c
+++ b/src/conversation/conversation_api.c
@@ -105,7 +105,7 @@ struct GNUNET_CONVERSATION_Caller
/**
* Identity of the person calling us.
*/
- struct GNUNET_CRYPTO_EcdsaPublicKey caller_id;
+ struct GNUNET_IDENTITY_PublicKey caller_id;
/**
* Internal handle to identify the caller with the service.
@@ -192,7 +192,7 @@ struct GNUNET_CONVERSATION_Phone
/**
* My GNS zone.
*/
- struct GNUNET_CRYPTO_EcdsaPrivateKey my_zone;
+ struct GNUNET_IDENTITY_PrivateKey my_zone;
/**
* State machine for the phone.
diff --git a/src/conversation/gnunet-conversation.c
b/src/conversation/gnunet-conversation.c
index 7a2a727a5..9ff0002e7 100644
--- a/src/conversation/gnunet-conversation.c
+++ b/src/conversation/gnunet-conversation.c
@@ -116,7 +116,7 @@ struct CallList
/**
* Public key identifying the caller.
*/
- struct GNUNET_CRYPTO_EcdsaPublicKey caller_id;
+ struct GNUNET_IDENTITY_PublicKey caller_id;
/**
* Unique number of the call.
@@ -194,7 +194,7 @@ static char *ego_name;
/**
* Public key of active conversation partner (if any).
*/
-static struct GNUNET_CRYPTO_EcdsaPublicKey peer_key;
+static struct GNUNET_IDENTITY_PublicKey peer_key;
/**
* Name of active conversation partner (if any).
@@ -244,7 +244,7 @@ static void
phone_event_handler (void *cls,
enum GNUNET_CONVERSATION_PhoneEventCode code,
struct GNUNET_CONVERSATION_Caller *caller,
- const struct GNUNET_CRYPTO_EcdsaPublicKey *caller_id)
+ const struct GNUNET_IDENTITY_PublicKey *caller_id)
{
struct CallList *cl;
diff --git a/src/conversation/gnunet-service-conversation.c
b/src/conversation/gnunet-service-conversation.c
index 502146255..a69c95a80 100644
--- a/src/conversation/gnunet-service-conversation.c
+++ b/src/conversation/gnunet-service-conversation.c
@@ -752,10 +752,11 @@ handle_cadet_ring_message (void *cls, const struct
CadetPhoneRingMessage *msg)
rs.expiration_time = msg->expiration_time;
if (GNUNET_OK !=
- GNUNET_CRYPTO_ecdsa_verify (GNUNET_SIGNATURE_PURPOSE_CONVERSATION_RING,
- &rs,
- &msg->signature,
- &msg->caller_id))
+ GNUNET_IDENTITY_signature_verify (
+ GNUNET_SIGNATURE_PURPOSE_CONVERSATION_RING,
+ &rs,
+ &msg->signature,
+ &msg->caller_id))
{
GNUNET_break_op (0);
destroy_line_cadet_channels (ch);
@@ -1136,11 +1137,9 @@ handle_client_call_message (void *cls, const struct
ClientCallMessage *msg)
cadet_handlers);
ch->mq = GNUNET_CADET_get_mq (ch->channel);
e = GNUNET_MQ_msg (ring, GNUNET_MESSAGE_TYPE_CONVERSATION_CADET_PHONE_RING);
- GNUNET_CRYPTO_ecdsa_key_get_public (&msg->caller_id, &ring->caller_id);
+ GNUNET_IDENTITY_key_get_public (&msg->caller_id, &ring->caller_id);
ring->expiration_time = rs.expiration_time;
- GNUNET_CRYPTO_ecdsa_sign (&msg->caller_id,
- &rs,
- &ring->signature);
+ GNUNET_IDENTITY_sign (&msg->caller_id, &rs, &ring->signature);
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending RING message via CADET\n");
GNUNET_MQ_send (ch->mq, e);
GNUNET_SERVICE_client_continue (line->client);
diff --git a/src/conversation/test_conversation_api.c
b/src/conversation/test_conversation_api.c
index b51186dc8..c5efecd52 100644
--- a/src/conversation/test_conversation_api.c
+++ b/src/conversation/test_conversation_api.c
@@ -305,7 +305,7 @@ static void
phone_event_handler (void *cls,
enum GNUNET_CONVERSATION_PhoneEventCode code,
struct GNUNET_CONVERSATION_Caller *caller,
- const struct GNUNET_CRYPTO_EcdsaPublicKey *caller_id)
+ const struct GNUNET_IDENTITY_PublicKey *caller_id)
{
static enum GNUNET_CONVERSATION_PhoneEventCode expect =
GNUNET_CONVERSATION_EC_PHONE_RING;
@@ -385,7 +385,7 @@ call_event_handler (void *cls, enum
GNUNET_CONVERSATION_CallEventCode code)
static void
caller_ego_create_cont (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *pk,
+ const struct GNUNET_IDENTITY_PrivateKey *pk,
const char *emsg)
{
(void) cls;
@@ -414,7 +414,7 @@ identity_cb (void *cls,
const char *name)
{
struct GNUNET_GNSRECORD_Data rd;
- struct GNUNET_CRYPTO_EcdsaPublicKey pub;
+ struct GNUNET_IDENTITY_PublicKey pub;
(void) cls;
(void) ctx;
@@ -465,7 +465,7 @@ identity_cb (void *cls,
static void
phone_ego_create_cont (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *pk,
+ const struct GNUNET_IDENTITY_PrivateKey *pk,
const char *emsg)
{
(void) cls;
diff --git a/src/conversation/test_conversation_api_reject.c
b/src/conversation/test_conversation_api_reject.c
index 69fa9f1dc..08c64df37 100644
--- a/src/conversation/test_conversation_api_reject.c
+++ b/src/conversation/test_conversation_api_reject.c
@@ -179,7 +179,7 @@ static void
phone_event_handler (void *cls,
enum GNUNET_CONVERSATION_PhoneEventCode code,
struct GNUNET_CONVERSATION_Caller *caller,
- const struct GNUNET_CRYPTO_EcdsaPublicKey *caller_id)
+ const struct GNUNET_IDENTITY_PublicKey *caller_id)
{
static enum GNUNET_CONVERSATION_PhoneEventCode expect =
GNUNET_CONVERSATION_EC_PHONE_RING;
@@ -238,7 +238,7 @@ call_event_handler (void *cls, enum
GNUNET_CONVERSATION_CallEventCode code)
static void
caller_ego_create_cont (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *pk,
+ const struct GNUNET_IDENTITY_PrivateKey *pk,
const char *emsg)
{
(void) cls;
@@ -267,7 +267,7 @@ identity_cb (void *cls,
const char *name)
{
struct GNUNET_GNSRECORD_Data rd;
- struct GNUNET_CRYPTO_EcdsaPublicKey pub;
+ struct GNUNET_IDENTITY_PublicKey pub;
(void) cls;
(void) ctx;
@@ -318,7 +318,7 @@ identity_cb (void *cls,
static void
phone_ego_create_cont (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *pk,
+ const struct GNUNET_IDENTITY_PrivateKey *pk,
const char *emsg)
{
(void) cls;
diff --git a/src/conversation/test_conversation_api_twocalls.c
b/src/conversation/test_conversation_api_twocalls.c
index 83e8cb55a..ac7a3c9dd 100644
--- a/src/conversation/test_conversation_api_twocalls.c
+++ b/src/conversation/test_conversation_api_twocalls.c
@@ -403,7 +403,7 @@ static void
phone_event_handler (void *cls,
enum GNUNET_CONVERSATION_PhoneEventCode code,
struct GNUNET_CONVERSATION_Caller *caller,
- const struct GNUNET_CRYPTO_EcdsaPublicKey *caller_id)
+ const struct GNUNET_IDENTITY_PublicKey *caller_id)
{
const char *cid;
@@ -507,7 +507,7 @@ call_event_handler (void *cls, enum
GNUNET_CONVERSATION_CallEventCode code)
static void
caller_ego_create_cont (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *pk,
+ const struct GNUNET_IDENTITY_PrivateKey *pk,
const char *emsg)
{
(void) cls;
@@ -536,7 +536,7 @@ identity_cb (void *cls,
const char *name)
{
struct GNUNET_GNSRECORD_Data rd;
- struct GNUNET_CRYPTO_EcdsaPublicKey pub;
+ struct GNUNET_IDENTITY_PublicKey pub;
(void) cls;
(void) ctx;
@@ -594,7 +594,7 @@ identity_cb (void *cls,
static void
phone_ego_create_cont (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *pk,
+ const struct GNUNET_IDENTITY_PrivateKey *pk,
const char *emsg)
{
(void) cls;
diff --git a/src/datacache/plugin_datacache_postgres.c
b/src/datacache/plugin_datacache_postgres.c
index c21be9219..724324ca4 100644
--- a/src/datacache/plugin_datacache_postgres.c
+++ b/src/datacache/plugin_datacache_postgres.c
@@ -67,14 +67,19 @@ static int
init_connection (struct Plugin *plugin)
{
struct GNUNET_PQ_ExecuteStatement es[] = {
+ GNUNET_PQ_make_try_execute ("CREATE TEMPORARY SEQUENCE IF NOT EXISTS
gn011dc_oid_seq"),
GNUNET_PQ_make_execute ("CREATE TEMPORARY TABLE IF NOT EXISTS gn011dc ("
+ " oid OID NOT NULL DEFAULT
nextval('gn011dc_oid_seq'),"
" type INTEGER NOT NULL,"
" prox INTEGER NOT NULL,"
" discard_time BIGINT NOT NULL,"
" key BYTEA NOT NULL,"
" value BYTEA NOT NULL,"
- " path BYTEA DEFAULT NULL)"
- "WITH OIDS"),
+ " path BYTEA DEFAULT NULL)"),
+ GNUNET_PQ_make_try_execute (
+ "ALTER SEQUENCE gnu011dc_oid_seq OWNED BY gn011dc.oid"),
+ GNUNET_PQ_make_try_execute (
+ "CREATE INDEX IF NOT EXISTS idx_oid ON gn011dc (oid)"),
GNUNET_PQ_make_try_execute (
"CREATE INDEX IF NOT EXISTS idx_key ON gn011dc (key)"),
GNUNET_PQ_make_try_execute (
diff --git a/src/datastore/datastore_api.c b/src/datastore/datastore_api.c
index 4537f6efe..bd7a612ed 100644
--- a/src/datastore/datastore_api.c
+++ b/src/datastore/datastore_api.c
@@ -994,8 +994,8 @@ GNUNET_DATASTORE_put (struct GNUNET_DATASTORE_Handle *h,
}
LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Asked to put %u bytes of data under key `%s' for %s\n",
- size,
+ "Asked to put %lu bytes of data under key `%s' for %s\n",
+ (unsigned long) size,
GNUNET_h2s (key),
GNUNET_STRINGS_relative_time_to_string (
GNUNET_TIME_absolute_get_remaining (expiration),
@@ -1205,8 +1205,8 @@ GNUNET_DATASTORE_remove (struct GNUNET_DATASTORE_Handle
*h,
if (NULL == cont)
cont = &drop_status_cont;
LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Asked to remove %u bytes under key `%s'\n",
- size,
+ "Asked to remove %lu bytes under key `%s'\n",
+ (unsigned long) size,
GNUNET_h2s (key));
env = GNUNET_MQ_msg_extra (dm,
size,
diff --git a/src/datastore/plugin_datastore_postgres.c
b/src/datastore/plugin_datastore_postgres.c
index 88ceb1b0a..6a5d45832 100644
--- a/src/datastore/plugin_datastore_postgres.c
+++ b/src/datastore/plugin_datastore_postgres.c
@@ -72,8 +72,10 @@ init_connection (struct Plugin *plugin)
* we only test equality on it and can cast it to/from uint32_t. For repl,
prio, and anonLevel
* we do math or inequality tests, so we can't handle the entire range of
uint32_t.
* This will also cause problems for expiration times after
294247-01-10-04:00:54 UTC.
- * PostgreSQL also recommends against using WITH OIDS.
- */GNUNET_PQ_make_execute ("CREATE TABLE IF NOT EXISTS gn090 ("
+ */
+ GNUNET_PQ_make_try_execute (
+ "CREATE SEQUENCE IF NOT EXISTS gn090_oid_seq"),
+ GNUNET_PQ_make_execute ("CREATE TABLE IF NOT EXISTS gn090 ("
" repl INTEGER NOT NULL DEFAULT 0,"
" type INTEGER NOT NULL DEFAULT 0,"
" prio INTEGER NOT NULL DEFAULT 0,"
@@ -82,8 +84,12 @@ init_connection (struct Plugin *plugin)
" rvalue BIGINT NOT NULL DEFAULT 0,"
" hash BYTEA NOT NULL DEFAULT '',"
" vhash BYTEA NOT NULL DEFAULT '',"
- " value BYTEA NOT NULL DEFAULT '')"
- "WITH OIDS"),
+ " value BYTEA NOT NULL DEFAULT '',"
+ " oid OID NOT NULL DEFAULT
nextval('gn090_oid_seq'))"),
+ GNUNET_PQ_make_try_execute (
+ "ALTER SEQUENCE gn090_oid_seq OWNED BY gn090.oid"),
+ GNUNET_PQ_make_try_execute (
+ "CREATE INDEX IF NOT EXISTS oid_hash ON gn090 (oid)"),
GNUNET_PQ_make_try_execute (
"CREATE INDEX IF NOT EXISTS idx_hash ON gn090 (hash)"),
GNUNET_PQ_make_try_execute (
diff --git a/src/dht/gnunet-service-dht_clients.c
b/src/dht/gnunet-service-dht_clients.c
index 1e44c1fad..5eb3115f4 100644
--- a/src/dht/gnunet-service-dht_clients.c
+++ b/src/dht/gnunet-service-dht_clients.c
@@ -488,8 +488,8 @@ handle_dht_local_put (void *cls,
GNUNET_h2s_full (&dht_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),
+ "Handling local PUT of %lu-bytes for query %s\n",
+ (unsigned long) (size - sizeof(struct GNUNET_DHT_ClientPutMessage)),
GNUNET_h2s (&dht_msg->key));
GDS_CLIENTS_handle_reply (GNUNET_TIME_absolute_ntoh (dht_msg->expiration),
&dht_msg->key,
@@ -619,7 +619,7 @@ handle_dht_local_get (void *cls,
"Received GET request for %s from local client %p, xq: %.*s\n",
GNUNET_h2s (&get->key),
ch->client,
- xquery_size,
+ (int) xquery_size,
xquery);
LOG_TRAFFIC (GNUNET_ERROR_TYPE_DEBUG,
"CLIENT-GET %s\n",
diff --git a/src/dht/gnunet-service-dht_datacache.c
b/src/dht/gnunet-service-dht_datacache.c
index 41b7a3a2b..7eded2152 100644
--- a/src/dht/gnunet-service-dht_datacache.c
+++ b/src/dht/gnunet-service-dht_datacache.c
@@ -94,9 +94,9 @@ GDS_DATACACHE_handle_put (struct GNUNET_TIME_Absolute
expiration,
put_path_length,
put_path);
LOG (GNUNET_ERROR_TYPE_DEBUG,
- "DATACACHE PUT for key %s [%u] completed (%d) after %u hops\n",
+ "DATACACHE PUT for key %s [%lu] completed (%d) after %u hops\n",
GNUNET_h2s (key),
- data_size,
+ (unsigned long) data_size,
r,
put_path_length);
}
diff --git a/src/dht/gnunet-service-dht_neighbours.c
b/src/dht/gnunet-service-dht_neighbours.c
index b211fca6b..88b0c5d92 100644
--- a/src/dht/gnunet-service-dht_neighbours.c
+++ b/src/dht/gnunet-service-dht_neighbours.c
@@ -2212,8 +2212,8 @@ handle_dht_p2p_get (void *cls,
bg,
peer_bf);
GDS_CLIENTS_process_get (options
- | (GNUNET_OK == forwarded)
- ? GNUNET_DHT_RO_LAST_HOP : 0,
+ | ((GNUNET_OK == forwarded)
+ ? GNUNET_DHT_RO_LAST_HOP : 0),
type,
ntohl (get->hop_count),
ntohl (get->desired_replication_level),
diff --git a/src/dht/plugin_block_dht.c b/src/dht/plugin_block_dht.c
index f213433ed..a9f336240 100644
--- a/src/dht/plugin_block_dht.c
+++ b/src/dht/plugin_block_dht.c
@@ -195,7 +195,7 @@ block_plugin_dht_get_key (void *cls,
{
GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR,
"block-dht",
- _ ("Size mismatch for block\n"),
+ _ ("Size mismatch for block with type %u\n"),
GNUNET_BLOCK_TYPE_DHT_HELLO);
return GNUNET_NO;
}
diff --git a/src/dns/gnunet-dns-monitor.c b/src/dns/gnunet-dns-monitor.c
index d9830baa4..836d65c79 100644
--- a/src/dns/gnunet-dns-monitor.c
+++ b/src/dns/gnunet-dns-monitor.c
@@ -203,7 +203,7 @@ display_record (const struct GNUNET_DNSPARSER_Record
*record)
else
{
GNUNET_asprintf (&tmp,
- "priority %u, weight = %s, port = %u, target = %s",
+ "priority %u, weight = %u, port = %u, target = %s",
(unsigned int) record->data.srv->priority,
(unsigned int) record->data.srv->weight,
(unsigned int) record->data.srv->port,
diff --git a/src/fragmentation/fragmentation.c
b/src/fragmentation/fragmentation.c
index 3a7da37e8..36e1c33f4 100644
--- a/src/fragmentation/fragmentation.c
+++ b/src/fragmentation/fragmentation.c
@@ -158,7 +158,7 @@ GNUNET_FRAGMENT_print_ack (const struct
GNUNET_MessageHeader *ack)
sizeof(buf),
"%u-%llX",
ntohl (fa->fragment_id),
- GNUNET_ntohll (fa->bits));
+ (unsigned long long) GNUNET_ntohll (fa->bits));
return buf;
}
diff --git a/src/fs/fs_download.c b/src/fs/fs_download.c
index 6154e8be0..d4677b794 100644
--- a/src/fs/fs_download.c
+++ b/src/fs/fs_download.c
@@ -1050,7 +1050,7 @@ process_result_with_request (void *cls,
GNUNET_asprintf (
&dc->emsg,
_ (
- "Internal error or bogus download URI (expected %u bytes at depth %u
and offset %llu/%llu, got %u bytes)"),
+ "Internal error or bogus download URI (expected %lu bytes at depth %u
and offset %llu/%llu, got %lu bytes)"),
bs,
dr->depth,
(unsigned long long) dr->offset,
diff --git a/src/fs/gnunet-daemon-fsprofiler.c
b/src/fs/gnunet-daemon-fsprofiler.c
index 829906461..fbb7c6028 100644
--- a/src/fs/gnunet-daemon-fsprofiler.c
+++ b/src/fs/gnunet-daemon-fsprofiler.c
@@ -592,14 +592,14 @@ run (void *cls, char *const *args GNUNET_UNUSED,
&replication_level))
replication_level = 1;
GNUNET_snprintf (myoptname, sizeof(myoptname),
- "DOWNLOAD-PATTERN-%u", my_peerid);
+ "DOWNLOAD-PATTERN-%llu", my_peerid);
if (GNUNET_OK !=
GNUNET_CONFIGURATION_get_value_string (cfg,
"FSPROFILER", myoptname,
&download_pattern))
download_pattern = GNUNET_strdup ("");
GNUNET_snprintf (myoptname, sizeof(myoptname),
- "PUBLISH-PATTERN-%u", my_peerid);
+ "PUBLISH-PATTERN-%llu", my_peerid);
if (GNUNET_OK !=
GNUNET_CONFIGURATION_get_value_string (cfg,
"FSPROFILER", myoptname,
diff --git a/src/fs/gnunet-publish.c b/src/fs/gnunet-publish.c
index 91fcd8f8a..dea467669 100644
--- a/src/fs/gnunet-publish.c
+++ b/src/fs/gnunet-publish.c
@@ -475,6 +475,7 @@ uri_ksk_continuation (void *cls,
const char *emsg)
{
const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv;
+ const struct GNUNET_IDENTITY_PrivateKey *pk;
if (NULL != emsg)
{
@@ -486,7 +487,10 @@ uri_ksk_continuation (void *cls,
GNUNET_SCHEDULER_shutdown ();
return;
}
- priv = GNUNET_IDENTITY_ego_get_private_key (namespace);
+ pk = GNUNET_IDENTITY_ego_get_private_key (namespace);
+ if (GNUNET_IDENTITY_TYPE_ECDSA != ntohl (pk->type))
+ return;
+ priv = &pk->ecdsa_key;
GNUNET_FS_publish_sks (ctx,
priv,
this_id,
@@ -569,6 +573,7 @@ directory_trim_complete (struct GNUNET_FS_ShareTreeItem
*directory_scan_result)
{
struct GNUNET_FS_FileInformation *fi;
const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv;
+ const struct GNUNET_IDENTITY_PrivateKey *pk;
fi = get_file_information (directory_scan_result);
GNUNET_FS_share_tree_free (directory_scan_result);
@@ -586,10 +591,13 @@ directory_trim_complete (struct GNUNET_FS_ShareTreeItem
*directory_scan_result)
GNUNET_SCHEDULER_shutdown ();
return;
}
- if (NULL == namespace)
- priv = NULL;
- else
- priv = GNUNET_IDENTITY_ego_get_private_key (namespace);
+ priv = NULL;
+ if (NULL != namespace)
+ {
+ pk = GNUNET_IDENTITY_ego_get_private_key (namespace);
+ GNUNET_assert (GNUNET_IDENTITY_TYPE_ECDSA == ntohl (pk->type));
+ priv = &pk->ecdsa_key;
+ }
pc = GNUNET_FS_publish_start (ctx,
fi,
priv,
diff --git a/src/gns/Makefile.am b/src/gns/Makefile.am
index 5a9c70997..744ba66ec 100644
--- a/src/gns/Makefile.am
+++ b/src/gns/Makefile.am
@@ -109,6 +109,7 @@ libgnunet_plugin_rest_gns_la_SOURCES = \
plugin_rest_gns.c
libgnunet_plugin_rest_gns_la_LIBADD = \
$(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \
+ $(top_builddir)/src/gnsrecord/libgnunetgnsrecordjson.la \
libgnunetgns.la \
$(top_builddir)/src/rest/libgnunetrest.la \
$(top_builddir)/src/identity/libgnunetidentity.la \
@@ -124,6 +125,7 @@ libgnunet_plugin_gnsrecord_gns_la_SOURCES = \
plugin_gnsrecord_gns.c
libgnunet_plugin_gnsrecord_gns_la_LIBADD = \
$(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \
+ $(top_builddir)/src/identity/libgnunetidentity.la \
$(top_builddir)/src/util/libgnunetutil.la \
$(LTLIBINTL)
libgnunet_plugin_gnsrecord_gns_la_LDFLAGS = \
@@ -135,6 +137,7 @@ gnunet_gns_SOURCES = \
gnunet_gns_LDADD = \
libgnunetgns.la \
$(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \
+ $(top_builddir)/src/identity/libgnunetidentity.la \
$(top_builddir)/src/util/libgnunetutil.la \
$(LIBIDN) $(LIBIDN2) \
$(GN_LIBINTL)
@@ -144,6 +147,7 @@ gnunet_gns_benchmark_SOURCES = \
gnunet_gns_benchmark_LDADD = \
libgnunetgns.la \
$(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \
+ $(top_builddir)/src/identity/libgnunetidentity.la \
$(top_builddir)/src/util/libgnunetutil.la \
$(GN_LIBINTL)
@@ -247,6 +251,7 @@ libgnunet_plugin_block_gns_la_LIBADD = \
$(top_builddir)/src/util/libgnunetutil.la \
$(top_builddir)/src/block/libgnunetblock.la \
$(top_builddir)/src/block/libgnunetblockgroup.la \
+ $(top_builddir)/src/identity/libgnunetidentity.la \
$(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la
libgnunet_plugin_block_gns_la_LDFLAGS = \
$(GN_LIBINTL) \
diff --git a/src/gns/gns.h b/src/gns/gns.h
index a193632b7..d824742ad 100644
--- a/src/gns/gns.h
+++ b/src/gns/gns.h
@@ -48,7 +48,7 @@ struct LookupMessage
/**
* Zone that is to be used for lookup
*/
- struct GNUNET_CRYPTO_EcdsaPublicKey zone;
+ struct GNUNET_IDENTITY_PublicKey zone;
/**
* Local options for where to look for results
diff --git a/src/gns/gns_api.c b/src/gns/gns_api.c
index bf95bf340..841a0d240 100644
--- a/src/gns/gns_api.c
+++ b/src/gns/gns_api.c
@@ -343,7 +343,7 @@ GNUNET_GNS_lookup_cancel (struct GNUNET_GNS_LookupRequest
*lr)
struct GNUNET_GNS_LookupRequest *
GNUNET_GNS_lookup_limited (struct GNUNET_GNS_Handle *handle,
const char *name,
- const struct GNUNET_CRYPTO_EcdsaPublicKey *zone,
+ const struct GNUNET_IDENTITY_PublicKey *zone,
uint32_t type,
enum GNUNET_GNS_LocalOptions options,
uint16_t recursion_depth_limit,
@@ -411,7 +411,7 @@ GNUNET_GNS_lookup_limited (struct GNUNET_GNS_Handle *handle,
struct GNUNET_GNS_LookupRequest*
GNUNET_GNS_lookup (struct GNUNET_GNS_Handle *handle,
const char *name,
- const struct GNUNET_CRYPTO_EcdsaPublicKey *zone,
+ const struct GNUNET_IDENTITY_PublicKey *zone,
uint32_t type,
enum GNUNET_GNS_LocalOptions options,
GNUNET_GNS_LookupResultProcessor proc,
diff --git a/src/gns/gns_tld_api.c b/src/gns/gns_tld_api.c
index 3ebf07db6..b883662ad 100644
--- a/src/gns/gns_tld_api.c
+++ b/src/gns/gns_tld_api.c
@@ -167,7 +167,7 @@ process_lookup_result (void *cls,
*/
static void
lookup_with_public_key (struct GNUNET_GNS_LookupWithTldRequest *ltr,
- const struct GNUNET_CRYPTO_EcdsaPublicKey *pkey)
+ const struct GNUNET_IDENTITY_PublicKey *pkey)
{
ltr->lr = GNUNET_GNS_lookup (ltr->gns_handle,
ltr->name,
@@ -190,11 +190,11 @@ lookup_with_public_key (struct
GNUNET_GNS_LookupWithTldRequest *ltr,
*/
static void
identity_zone_cb (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv,
+ const struct GNUNET_IDENTITY_PrivateKey *priv,
const char *ego_name)
{
struct GNUNET_GNS_LookupWithTldRequest *ltr = cls;
- struct GNUNET_CRYPTO_EcdsaPublicKey pkey;
+ struct GNUNET_IDENTITY_PublicKey pkey;
ltr->id_co = NULL;
if (NULL == priv)
@@ -219,7 +219,7 @@ identity_zone_cb (void *cls,
ltr->options = GNUNET_GNS_LO_NO_DHT;
else
ltr->options = GNUNET_GNS_LO_LOCAL_MASTER;
- GNUNET_CRYPTO_ecdsa_key_get_public (priv, &pkey);
+ GNUNET_IDENTITY_key_get_public (priv, &pkey);
lookup_with_public_key (ltr, &pkey);
}
@@ -249,7 +249,7 @@ GNUNET_GNS_lookup_with_tld (struct GNUNET_GNS_Handle
*handle,
const char *tld;
char *dot_tld;
char *zonestr;
- struct GNUNET_CRYPTO_EcdsaPublicKey pkey;
+ struct GNUNET_IDENTITY_PublicKey pkey;
ltr = GNUNET_new (struct GNUNET_GNS_LookupWithTldRequest);
ltr->gns_handle = handle;
@@ -261,8 +261,10 @@ GNUNET_GNS_lookup_with_tld (struct GNUNET_GNS_Handle
*handle,
/* start with trivial case: TLD is zkey */
tld = get_tld (ltr->name);
if (GNUNET_OK ==
- GNUNET_CRYPTO_ecdsa_public_key_from_string (tld, strlen (tld), &pkey))
+ GNUNET_IDENTITY_public_key_from_string (tld, &pkey))
{
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "`%s' seems to be a valid zone key\n", tld);
eat_tld (ltr->name, tld);
lookup_with_public_key (ltr, &pkey);
return ltr;
@@ -281,9 +283,8 @@ GNUNET_GNS_lookup_with_tld (struct GNUNET_GNS_Handle
*handle,
&zonestr))
{
if (GNUNET_OK !=
- GNUNET_CRYPTO_ecdsa_public_key_from_string (zonestr,
- strlen (zonestr),
- &pkey))
+ GNUNET_IDENTITY_public_key_from_string (zonestr,
+ &pkey))
{
GNUNET_log_config_invalid (
GNUNET_ERROR_TYPE_ERROR,
@@ -304,6 +305,8 @@ GNUNET_GNS_lookup_with_tld (struct GNUNET_GNS_Handle
*handle,
}
GNUNET_free (dot_tld);
}
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "`%s' should be a valid ego\n", ltr->name);
ltr->id_co =
GNUNET_IDENTITY_ego_lookup_by_suffix (ltr->gns_handle->cfg,
ltr->name,
diff --git a/src/gns/gnunet-gns-import.c b/src/gns/gnunet-gns-import.c
index 78db28cab..972fb49cd 100644
--- a/src/gns/gnunet-gns-import.c
+++ b/src/gns/gnunet-gns-import.c
@@ -168,12 +168,17 @@ check_pkey (unsigned int rd_len, const struct
GNUNET_GNSRECORD_Data *rd,
char *pk, int *found_rec)
{
int i;
+ struct GNUNET_IDENTITY_PublicKey pubkey;
for (i = 0; i < rd_len; i++)
{
char *s;
- if ((GNUNET_GNSRECORD_TYPE_PKEY != rd[i].record_type) ||
- (rd[i].data_size != sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey)) )
+ if (sizeof (uint32_t) > rd[i].data_size)
+ continue;
+ if (GNUNET_OK != GNUNET_GNSRECORD_identity_from_data (rd[i].data,
+ rd[i].data_size,
+ rd[i].record_type,
+ &pubkey))
continue;
s = GNUNET_GNSRECORD_value_to_string (rd[i].record_type,
rd[i].data,
diff --git a/src/gns/gnunet-service-gns.c b/src/gns/gnunet-service-gns.c
index 8c5b2d6c4..52300ae3b 100644
--- a/src/gns/gnunet-service-gns.c
+++ b/src/gns/gnunet-service-gns.c
@@ -123,7 +123,7 @@ struct GNS_TopLevelDomain
/**
* Public key associated with the @a tld.
*/
- struct GNUNET_CRYPTO_EcdsaPublicKey pkey;
+ struct GNUNET_IDENTITY_PublicKey pkey;
/**
* Top-level domain as a string, including leading ".".
@@ -177,7 +177,7 @@ static struct GNS_TopLevelDomain *tld_tail;
*/
int
GNS_find_tld (const char *tld_str,
- struct GNUNET_CRYPTO_EcdsaPublicKey *pkey)
+ struct GNUNET_IDENTITY_PublicKey *pkey)
{
if ('\0' == *tld_str)
return GNUNET_NO;
@@ -485,7 +485,7 @@ read_service_conf (void *cls,
const char *option,
const char *value)
{
- struct GNUNET_CRYPTO_EcdsaPublicKey pk;
+ struct GNUNET_IDENTITY_PublicKey pk;
struct GNS_TopLevelDomain *tld;
(void) cls;
diff --git a/src/gns/gnunet-service-gns.h b/src/gns/gnunet-service-gns.h
index 2a432f8aa..d4fb9ec9f 100644
--- a/src/gns/gnunet-service-gns.h
+++ b/src/gns/gnunet-service-gns.h
@@ -26,6 +26,7 @@
#ifndef GNUNET_SERVICE_GNS_H
#define GNUNET_SERVICE_GNS_H
+#include "gnunet_identity_service.h"
/**
* Find GNS zone belonging to TLD @a tld.
@@ -36,7 +37,7 @@
*/
int
GNS_find_tld (const char *tld_str,
- struct GNUNET_CRYPTO_EcdsaPublicKey *pkey);
+ struct GNUNET_IDENTITY_PublicKey *pkey);
/**
diff --git a/src/gns/gnunet-service-gns_interceptor.c
b/src/gns/gnunet-service-gns_interceptor.c
index 19416a506..b53f4af6b 100644
--- a/src/gns/gnunet-service-gns_interceptor.c
+++ b/src/gns/gnunet-service-gns_interceptor.c
@@ -314,7 +314,7 @@ handle_dns_request (void *cls,
{
struct GNUNET_DNSPARSER_Packet *p;
struct InterceptLookupHandle *ilh;
- struct GNUNET_CRYPTO_EcdsaPublicKey zone;
+ struct GNUNET_IDENTITY_PublicKey zone;
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Hijacked a DNS request. Processing.\n");
diff --git a/src/gns/gnunet-service-gns_resolver.c
b/src/gns/gnunet-service-gns_resolver.c
index cb75b23c7..d9d0d3099 100644
--- a/src/gns/gnunet-service-gns_resolver.c
+++ b/src/gns/gnunet-service-gns_resolver.c
@@ -173,7 +173,7 @@ struct AuthorityChain
/**
* The zone of the GNS authority
*/
- struct GNUNET_CRYPTO_EcdsaPublicKey gns_authority;
+ struct GNUNET_IDENTITY_PublicKey gns_authority;
struct
{
@@ -305,7 +305,7 @@ struct GNS_ResolverHandle
/**
* The top-level GNS authoritative zone to query
*/
- struct GNUNET_CRYPTO_EcdsaPublicKey authority_zone;
+ struct GNUNET_IDENTITY_PublicKey authority_zone;
/**
* called when resolution phase finishes
@@ -1251,7 +1251,7 @@ handle_gns_cname_result (struct GNS_ResolverHandle *rh,
const char *tld;
struct AuthorityChain *ac;
int af;
- struct GNUNET_CRYPTO_EcdsaPublicKey zone;
+ struct GNUNET_IDENTITY_PublicKey zone;
nlen = strlen (cname);
tld = GNS_get_tld (cname);
@@ -1296,7 +1296,7 @@ handle_gns_cname_result (struct GNS_ResolverHandle *rh,
{
GNUNET_asprintf (&res,
"%.*s",
- strlen (cname) - (strlen (tld) + 1),
+ (int) (strlen (cname) - (strlen (tld) + 1)),
cname);
}
else
@@ -1305,7 +1305,7 @@ handle_gns_cname_result (struct GNS_ResolverHandle *rh,
"%.*s.%.*s",
(int) rh->name_resolution_pos,
rh->name,
- (int) strlen (cname) - (strlen (tld) + 1),
+ (int) (strlen (cname) - (strlen (tld) + 1)),
cname);
}
rh->name_resolution_pos = strlen (res);
@@ -1696,10 +1696,13 @@ recursive_pkey_resolution (struct GNS_ResolverHandle
*rh,
const struct GNUNET_GNSRECORD_Data *rd)
{
struct AuthorityChain *ac;
+ struct GNUNET_IDENTITY_PublicKey auth;
/* delegation to another zone */
- if (sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey) !=
- rd->data_size)
+ if (GNUNET_OK != GNUNET_GNSRECORD_identity_from_data (rd->data,
+ rd->data_size,
+ rd->record_type,
+ &auth))
{
GNUNET_break_op (0);
fail_resolution (rh);
@@ -1709,9 +1712,7 @@ recursive_pkey_resolution (struct GNS_ResolverHandle *rh,
ac = GNUNET_new (struct AuthorityChain);
ac->rh = rh;
ac->gns_authority = GNUNET_YES;
- GNUNET_memcpy (&ac->authority_info.gns_authority,
- rd->data,
- sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey));
+ ac->authority_info.gns_authority = auth;
ac->label = resolver_lookup_get_next_label (rh);
/* add AC to tail */
GNUNET_CONTAINER_DLL_insert_tail (rh->ac_head,
@@ -1754,7 +1755,7 @@ recursive_gns2dns_resolution (struct GNS_ResolverHandle
*rh,
char *n;
size_t off;
struct Gns2DnsPending *gp;
- struct GNUNET_CRYPTO_EcdsaPublicKey zone;
+ struct GNUNET_IDENTITY_PublicKey zone;
struct sockaddr_in v4;
struct sockaddr_in6 v6;
@@ -2257,19 +2258,25 @@ handle_gns_resolution_result (void *cls,
break;
case GNUNET_GNSRECORD_TYPE_PKEY:
+ case GNUNET_GNSRECORD_TYPE_EDKEY:
{
- struct GNUNET_CRYPTO_EcdsaPublicKey pub;
-
- if (rd[i].data_size != sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey))
+ struct GNUNET_IDENTITY_PublicKey pubkey;
+ if (rd[i].data_size < sizeof(uint32_t))
+ {
+ GNUNET_break_op (0);
+ break;
+ }
+ if (GNUNET_OK !=
+ GNUNET_GNSRECORD_identity_from_data (rd[i].data,
+ rd[i].data_size,
+ rd[i].record_type,
+ &pubkey))
{
GNUNET_break_op (0);
break;
}
- GNUNET_memcpy (&pub,
- rd[i].data,
- rd[i].data_size);
rd_off++;
- if (GNUNET_GNSRECORD_TYPE_PKEY != rh->record_type)
+ if (rd[i].record_type != rh->record_type)
{
/* try to resolve "@" */
struct AuthorityChain *ac;
@@ -2277,7 +2284,7 @@ handle_gns_resolution_result (void *cls,
ac = GNUNET_new (struct AuthorityChain);
ac->rh = rh;
ac->gns_authority = GNUNET_YES;
- ac->authority_info.gns_authority = pub;
+ ac->authority_info.gns_authority = pubkey;
ac->label = GNUNET_strdup (GNUNET_GNS_EMPTY_LABEL_AT);
GNUNET_CONTAINER_DLL_insert_tail (rh->ac_head,
rh->ac_tail,
@@ -2367,6 +2374,7 @@ handle_gns_resolution_result (void *cls,
return;
case GNUNET_GNSRECORD_TYPE_PKEY:
+ case GNUNET_GNSRECORD_TYPE_EDKEY:
GNUNET_break_op (1 == rd_count); /* PKEY should be unique */
recursive_pkey_resolution (rh,
&rd[0]);
@@ -2469,10 +2477,7 @@ handle_dht_response (void *cls,
return;
}
block = data;
- if (size !=
- ntohl (block->purpose.size)
- + sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey)
- + sizeof(struct GNUNET_CRYPTO_EcdsaSignature))
+ if (size != GNUNET_GNSRECORD_block_get_size (block))
{
/* how did this pass DHT block validation!? */
GNUNET_break (0);
@@ -2480,8 +2485,8 @@ handle_dht_response (void *cls,
return;
}
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Decrypting DHT block of size %u for `%s', expires %s\n",
- ntohl (block->purpose.size),
+ "Decrypting DHT block of size %lu for `%s', expires %s\n",
+ GNUNET_GNSRECORD_block_get_size (block),
rh->name,
GNUNET_STRINGS_absolute_time_to_string (exp));
if (GNUNET_OK !=
@@ -2495,8 +2500,8 @@ handle_dht_response (void *cls,
fail_resolution (rh);
return;
}
- if (0 == GNUNET_TIME_absolute_get_remaining (GNUNET_TIME_absolute_ntoh (
- block->expiration_time)).
+ if (0 == GNUNET_TIME_absolute_get_remaining (
+ GNUNET_GNSRECORD_block_get_expiration (block)).
rel_value_us)
{
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
@@ -2594,7 +2599,7 @@ handle_namecache_block_response (void *cls,
struct GNS_ResolverHandle *rh = cls;
struct AuthorityChain *ac = rh->ac_tail;
const char *label = ac->label;
- const struct GNUNET_CRYPTO_EcdsaPublicKey *auth =
+ const struct GNUNET_IDENTITY_PublicKey *auth =
&ac->authority_info.gns_authority;
struct GNUNET_HashCode query;
@@ -2604,8 +2609,8 @@ handle_namecache_block_response (void *cls,
((GNUNET_GNS_LO_LOCAL_MASTER == rh->options) &&
(ac != rh->ac_head))) &&
((NULL == block) ||
- (0 == GNUNET_TIME_absolute_get_remaining (GNUNET_TIME_absolute_ntoh (
- block->expiration_time)).
+ (0 == GNUNET_TIME_absolute_get_remaining (
+ GNUNET_GNSRECORD_block_get_expiration (block)).
rel_value_us)))
{
/* namecache knows nothing; try DHT lookup */
@@ -2622,8 +2627,8 @@ handle_namecache_block_response (void *cls,
}
if ((NULL == block) ||
- (0 == GNUNET_TIME_absolute_get_remaining (GNUNET_TIME_absolute_ntoh (
- block->expiration_time)).
+ (0 == GNUNET_TIME_absolute_get_remaining (
+ GNUNET_GNSRECORD_block_get_expiration (block)).
rel_value_us))
{
/* DHT not permitted and no local result, fail */
@@ -2857,7 +2862,7 @@ start_resolver_lookup (void *cls)
* @return handle to cancel operation
*/
struct GNS_ResolverHandle *
-GNS_resolver_lookup (const struct GNUNET_CRYPTO_EcdsaPublicKey *zone,
+GNS_resolver_lookup (const struct GNUNET_IDENTITY_PublicKey *zone,
uint32_t record_type,
const char *name,
enum GNUNET_GNS_LocalOptions options,
diff --git a/src/gns/gnunet-service-gns_resolver.h
b/src/gns/gnunet-service-gns_resolver.h
index 3dab3c91a..b099c5d65 100644
--- a/src/gns/gnunet-service-gns_resolver.h
+++ b/src/gns/gnunet-service-gns_resolver.h
@@ -86,7 +86,7 @@ typedef void
* @return handle to cancel operation
*/
struct GNS_ResolverHandle *
-GNS_resolver_lookup (const struct GNUNET_CRYPTO_EcdsaPublicKey *zone,
+GNS_resolver_lookup (const struct GNUNET_IDENTITY_PublicKey *zone,
uint32_t record_type,
const char *name,
enum GNUNET_GNS_LocalOptions options,
diff --git a/src/gns/plugin_block_gns.c b/src/gns/plugin_block_gns.c
index aabedcaac..9b58c9034 100644
--- a/src/gns/plugin_block_gns.c
+++ b/src/gns/plugin_block_gns.c
@@ -145,17 +145,13 @@ block_plugin_gns_evaluate (void *cls,
return GNUNET_BLOCK_EVALUATION_RESULT_INVALID;
}
block = reply_block;
- if (ntohl (block->purpose.size) + sizeof(struct
- GNUNET_CRYPTO_EcdsaSignature)
- + sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey) !=
- reply_block_size)
+ if (GNUNET_GNSRECORD_block_get_size (block) > reply_block_size)
{
GNUNET_break_op (0);
return GNUNET_BLOCK_EVALUATION_RESULT_INVALID;
}
- GNUNET_CRYPTO_hash (&block->derived_key,
- sizeof(block->derived_key),
- &h);
+ GNUNET_GNSRECORD_query_from_block (block,
+ &h);
if (0 != GNUNET_memcmp (&h, query))
{
GNUNET_break_op (0);
@@ -206,9 +202,8 @@ block_plugin_gns_get_key (void *cls,
return GNUNET_BLOCK_EVALUATION_RESULT_INVALID;
}
block = reply_block;
- GNUNET_CRYPTO_hash (&block->derived_key,
- sizeof(block->derived_key),
- key);
+ GNUNET_GNSRECORD_query_from_block (block,
+ key);
return GNUNET_OK;
}
diff --git a/src/gns/plugin_gnsrecord_gns.c b/src/gns/plugin_gnsrecord_gns.c
index 81f2b9eff..a2ad0b905 100644
--- a/src/gns/plugin_gnsrecord_gns.c
+++ b/src/gns/plugin_gnsrecord_gns.c
@@ -50,13 +50,18 @@ gns_value_to_string (void *cls,
size_t data_size)
{
const char *cdata;
+ struct GNUNET_IDENTITY_PublicKey pk;
switch (type)
{
case GNUNET_GNSRECORD_TYPE_PKEY:
- if (data_size != sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey))
+ case GNUNET_GNSRECORD_TYPE_EDKEY:
+ if (GNUNET_OK != GNUNET_GNSRECORD_identity_from_data (data,
+ data_size,
+ type,
+ &pk))
return NULL;
- return GNUNET_CRYPTO_ecdsa_public_key_to_string (data);
+ return GNUNET_IDENTITY_public_key_to_string (&pk);
case GNUNET_GNSRECORD_TYPE_NICK:
return GNUNET_strndup (data, data_size);
@@ -153,24 +158,35 @@ gns_string_to_value (void *cls,
void **data,
size_t *data_size)
{
- struct GNUNET_CRYPTO_EcdsaPublicKey pkey;
+ struct GNUNET_IDENTITY_PublicKey pk;
+ uint32_t record_type;
if (NULL == s)
return GNUNET_SYSERR;
switch (type)
{
case GNUNET_GNSRECORD_TYPE_PKEY:
+ case GNUNET_GNSRECORD_TYPE_EDKEY:
if (GNUNET_OK !=
- GNUNET_CRYPTO_ecdsa_public_key_from_string (s, strlen (s), &pkey))
+ GNUNET_IDENTITY_public_key_from_string (s, &pk))
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _ ("Unable to parse PKEY record `%s'\n"),
+ _ ("Unable to parse zone key record `%s'\n"),
s);
return GNUNET_SYSERR;
}
- *data = GNUNET_new (struct GNUNET_CRYPTO_EcdsaPublicKey);
- GNUNET_memcpy (*data, &pkey, sizeof(pkey));
- *data_size = sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey);
+ *data_size = GNUNET_IDENTITY_key_get_length (&pk);
+ if (GNUNET_OK != GNUNET_GNSRECORD_data_from_identity (&pk,
+ (char **) data,
+ data_size,
+ &record_type))
+ return GNUNET_SYSERR;
+ if (record_type != type)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ _("Record type does not match parsed record type\n"));
+ return GNUNET_SYSERR;
+ }
return GNUNET_OK;
case GNUNET_GNSRECORD_TYPE_NICK:
@@ -301,6 +317,7 @@ static struct
const char *name;
uint32_t number;
} gns_name_map[] = { { "PKEY", GNUNET_GNSRECORD_TYPE_PKEY },
+ { "EDKEY", GNUNET_GNSRECORD_TYPE_PKEY },
{ "NICK", GNUNET_GNSRECORD_TYPE_NICK },
{ "LEHO", GNUNET_GNSRECORD_TYPE_LEHO },
{ "VPN", GNUNET_GNSRECORD_TYPE_VPN },
diff --git a/src/gns/plugin_rest_gns.c b/src/gns/plugin_rest_gns.c
index 6ec921f70..2ccb5be2b 100644
--- a/src/gns/plugin_rest_gns.c
+++ b/src/gns/plugin_rest_gns.c
@@ -28,6 +28,7 @@
#include "gnunet_rest_lib.h"
#include "gnunet_json_lib.h"
#include "gnunet_gnsrecord_lib.h"
+#include "gnunet_gnsrecord_json_lib.h"
#include "gnunet_gns_service.h"
#include "microhttpd.h"
#include <jansson.h>
@@ -264,7 +265,7 @@ handle_gns_response (void *cls,
return;
}
- result_obj = GNUNET_JSON_from_gnsrecord (handle->name, rd, rd_count);
+ result_obj = GNUNET_GNSRECORD_JSON_from_gnsrecord (handle->name, rd,
rd_count);
result = json_dumps (result_obj, 0);
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Result %s\n", result);
diff --git a/src/gns/test_gns_dht_lookup.sh b/src/gns/test_gns_dht_lookup.sh
index d5516fd03..8d446c507 100755
--- a/src/gns/test_gns_dht_lookup.sh
+++ b/src/gns/test_gns_dht_lookup.sh
@@ -26,6 +26,7 @@ gnunet-arm -i datastore -c test_gns_lookup.conf
gnunet-identity -C $OTHER_EGO -c test_gns_lookup.conf
DELEGATED_PKEY=$(gnunet-identity -d -c test_gns_lookup.conf | grep $OTHER_EGO
| awk '{print $3}')
gnunet-identity -C $MY_EGO -c test_gns_lookup.conf
+echo "MYEGO: $MY_EGO OTHER_EGO: $DELEGATED_PKEY"
gnunet-namestore -p -z $MY_EGO -a -n b -t PKEY -V $DELEGATED_PKEY -e never -c
test_gns_lookup.conf
#This works
gnunet-namestore -p -z $OTHER_EGO -a -n www -t A -V $TEST_IP -e never -c
test_gns_lookup.conf
diff --git a/src/gnsrecord/Makefile.am b/src/gnsrecord/Makefile.am
index 2e6eca7ba..ab604eb92 100644
--- a/src/gnsrecord/Makefile.am
+++ b/src/gnsrecord/Makefile.am
@@ -1,5 +1,5 @@
# This Makefile.am is in the public domain
-AM_CPPFLAGS = -I$(top_srcdir)/src/include
+AM_CPPFLAGS = -I$(top_srcdir)/src/include ${MHD_CFLAGS}
plugindir = $(libdir)/gnunet
@@ -30,12 +30,14 @@ TESTS = \
endif
lib_LTLIBRARIES = \
- libgnunetgnsrecord.la
+ libgnunetgnsrecord.la \
+ libgnunetgnsrecordjson.la
gnunet_gnsrecord_tvg_SOURCES = \
gnunet-gnsrecord-tvg.c
gnunet_gnsrecord_tvg_LDADD = \
$(top_builddir)/src/util/libgnunetutil.la \
+ $(top_builddir)/src/identity/libgnunetidentity.la \
libgnunetgnsrecord.la \
$(GN_LIBINTL)
@@ -47,11 +49,26 @@ libgnunetgnsrecord_la_SOURCES = \
gnsrecord_misc.c
libgnunetgnsrecord_la_LIBADD = \
$(top_builddir)/src/util/libgnunetutil.la \
+ $(top_builddir)/src/identity/libgnunetidentity.la \
+ $(LIBGCRYPT_LIBS) \
$(GN_LIBINTL)
+libgnunetgnsrecord_la_DEPENDENCIES = \
+ $(top_builddir)/src/identity/libgnunetidentity.la
libgnunetgnsrecord_la_LDFLAGS = \
$(GN_LIB_LDFLAGS) \
-version-info 0:0:0
+libgnunetgnsrecordjson_la_SOURCES = \
+ json_gnsrecord.c
+libgnunetgnsrecordjson_la_LIBADD = \
+ $(top_builddir)/src/util/libgnunetutil.la \
+ $(top_builddir)/src/identity/libgnunetidentity.la \
+ libgnunetgnsrecord.la \
+ -ljansson \
+ $(GN_LIBINTL)
+libgnunetgnsrecordjson_la_LDFLAGS = \
+ $(GN_LIB_LDFLAGS) \
+ -version-info 0:0:0
plugin_LTLIBRARIES = \
libgnunet_plugin_gnsrecord_dns.la
diff --git a/src/gnsrecord/gnsrecord_crypto.c b/src/gnsrecord/gnsrecord_crypto.c
index c8919760a..9c551a936 100644
--- a/src/gnsrecord/gnsrecord_crypto.c
+++ b/src/gnsrecord/gnsrecord_crypto.c
@@ -37,6 +37,61 @@
#define LOG(kind, ...) GNUNET_log_from (kind, "gnsrecord", __VA_ARGS__)
+ssize_t
+ecdsa_symmetric_decrypt (
+ const void *block,
+ size_t size,
+ const unsigned char *key,
+ const unsigned char *ctr,
+ void *result)
+{
+ gcry_cipher_hd_t handle;
+ int rc;
+
+ GNUNET_assert (0 == gcry_cipher_open (&handle, GCRY_CIPHER_AES256,
+ GCRY_CIPHER_MODE_CTR, 0));
+ rc = gcry_cipher_setkey (handle,
+ key,
+ GNUNET_CRYPTO_AES_KEY_LENGTH);
+ GNUNET_assert ((0 == rc) || ((char) rc == GPG_ERR_WEAK_KEY));
+ rc = gcry_cipher_setctr (handle,
+ ctr,
+ GNUNET_CRYPTO_AES_KEY_LENGTH / 2);
+ GNUNET_assert ((0 == rc) || ((char) rc == GPG_ERR_WEAK_KEY));
+ GNUNET_assert (0 == gcry_cipher_decrypt (handle, result, size, block, size));
+ gcry_cipher_close (handle);
+ return size;
+}
+
+
+
+ssize_t
+ecdsa_symmetric_encrypt (
+ const void *block,
+ size_t size,
+ const unsigned char *key,
+ const unsigned char *ctr,
+ void *result)
+{
+ gcry_cipher_hd_t handle;
+ int rc;
+
+ GNUNET_assert (0 == gcry_cipher_open (&handle, GCRY_CIPHER_AES256,
+ GCRY_CIPHER_MODE_CTR, 0));
+ rc = gcry_cipher_setkey (handle,
+ key,
+ GNUNET_CRYPTO_AES_KEY_LENGTH);
+ GNUNET_assert ((0 == rc) || ((char) rc == GPG_ERR_WEAK_KEY));
+ rc = gcry_cipher_setctr (handle,
+ ctr,
+ GNUNET_CRYPTO_AES_KEY_LENGTH / 2);
+ GNUNET_assert ((0 == rc) || ((char) rc == GPG_ERR_WEAK_KEY));
+ GNUNET_assert (0 == gcry_cipher_encrypt (handle, result, size, block, size));
+ gcry_cipher_close (handle);
+ return size;
+}
+
+
/**
* Derive session key and iv from label and public key.
@@ -47,25 +102,31 @@
* @param pub public key to use for KDF
*/
static void
-derive_block_aes_key (struct GNUNET_CRYPTO_SymmetricInitializationVector *iv,
- struct GNUNET_CRYPTO_SymmetricSessionKey *skey,
+derive_block_aes_key (unsigned char *ctr,
+ unsigned char *key,
const char *label,
+ uint64_t exp,
const struct GNUNET_CRYPTO_EcdsaPublicKey *pub)
{
static const char ctx_key[] = "gns-aes-ctx-key";
static const char ctx_iv[] = "gns-aes-ctx-iv";
- GNUNET_CRYPTO_kdf (skey, sizeof(struct GNUNET_CRYPTO_SymmetricSessionKey),
+ GNUNET_CRYPTO_kdf (key, GNUNET_CRYPTO_AES_KEY_LENGTH,
ctx_key, strlen (ctx_key),
pub, sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey),
label, strlen (label),
NULL, 0);
- GNUNET_CRYPTO_kdf (iv, sizeof(struct
- GNUNET_CRYPTO_SymmetricInitializationVector),
+ memset (ctr, 0, GNUNET_CRYPTO_AES_KEY_LENGTH / 2);
+ /** 4 byte nonce **/
+ GNUNET_CRYPTO_kdf (ctr, 4,
ctx_iv, strlen (ctx_iv),
pub, sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey),
label, strlen (label),
NULL, 0);
+ /** Expiration time 64 bit. **/
+ memcpy (ctr + 4, &exp, sizeof (exp));
+ /** Set counter part to 1 **/
+ ctr[15] |= 0x01;
}
@@ -81,19 +142,20 @@ derive_block_aes_key (struct
GNUNET_CRYPTO_SymmetricInitializationVector *iv,
* @return NULL on error (block too large)
*/
static struct GNUNET_GNSRECORD_Block *
-block_create (const struct GNUNET_CRYPTO_EcdsaPrivateKey *key,
- const struct GNUNET_CRYPTO_EcdsaPublicKey *pkey,
- struct GNUNET_TIME_Absolute expire,
- const char *label,
- const struct GNUNET_GNSRECORD_Data *rd,
- unsigned int rd_count)
+block_create_ecdsa (const struct GNUNET_CRYPTO_EcdsaPrivateKey *key,
+ const struct GNUNET_CRYPTO_EcdsaPublicKey *pkey,
+ struct GNUNET_TIME_Absolute expire,
+ const char *label,
+ const struct GNUNET_GNSRECORD_Data *rd,
+ unsigned int rd_count)
{
ssize_t payload_len = GNUNET_GNSRECORD_records_get_size (rd_count,
rd);
struct GNUNET_GNSRECORD_Block *block;
+ struct GNUNET_GNSRECORD_EcdsaBlock *ecblock;
struct GNUNET_CRYPTO_EcdsaPrivateKey *dkey;
- struct GNUNET_CRYPTO_SymmetricInitializationVector iv;
- struct GNUNET_CRYPTO_SymmetricSessionKey skey;
+ unsigned char ctr[GNUNET_CRYPTO_AES_KEY_LENGTH / 2];
+ unsigned char skey[GNUNET_CRYPTO_AES_KEY_LENGTH];
struct GNUNET_GNSRECORD_Data rdc[GNUNET_NZL (rd_count)];
uint32_t rd_count_nbo;
struct GNUNET_TIME_Absolute now;
@@ -140,35 +202,38 @@ block_create (const struct GNUNET_CRYPTO_EcdsaPrivateKey
*key,
block = GNUNET_malloc (sizeof(struct GNUNET_GNSRECORD_Block)
+ sizeof(uint32_t)
+ payload_len);
- block->purpose.size = htonl (sizeof(uint32_t)
- + payload_len
- + sizeof(struct
- GNUNET_CRYPTO_EccSignaturePurpose)
- + sizeof(struct GNUNET_TIME_AbsoluteNBO));
- block->purpose.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_GNS_RECORD_SIGN);
- block->expiration_time = GNUNET_TIME_absolute_hton (expire);
+ ecblock = &block->ecdsa_block;
+ block->type = htonl (GNUNET_GNSRECORD_TYPE_PKEY);
+ ecblock->purpose.size = htonl (sizeof(uint32_t)
+ + payload_len
+ + sizeof(struct
+ GNUNET_CRYPTO_EccSignaturePurpose)
+ + sizeof(struct GNUNET_TIME_AbsoluteNBO));
+ ecblock->purpose.purpose = htonl
(GNUNET_SIGNATURE_PURPOSE_GNS_RECORD_SIGN);
+ ecblock->expiration_time = GNUNET_TIME_absolute_hton (expire);
/* encrypt and sign */
dkey = GNUNET_CRYPTO_ecdsa_private_key_derive (key,
label,
"gns");
GNUNET_CRYPTO_ecdsa_key_get_public (dkey,
- &block->derived_key);
- derive_block_aes_key (&iv,
- &skey,
+ &ecblock->derived_key);
+ derive_block_aes_key (ctr,
+ skey,
label,
+ ecblock->expiration_time.abs_value_us__,
pkey);
GNUNET_break (payload_len + sizeof(uint32_t) ==
- GNUNET_CRYPTO_symmetric_encrypt (payload,
- payload_len
- + sizeof(uint32_t),
- &skey,
- &iv,
- &block[1]));
+ ecdsa_symmetric_encrypt (payload,
+ payload_len
+ + sizeof(uint32_t),
+ skey,
+ ctr,
+ &ecblock[1]));
}
if (GNUNET_OK !=
GNUNET_CRYPTO_ecdsa_sign_ (dkey,
- &block->purpose,
- &block->signature))
+ &ecblock->purpose,
+ &ecblock->signature))
{
GNUNET_break (0);
GNUNET_free (dkey);
@@ -191,7 +256,7 @@ block_create (const struct GNUNET_CRYPTO_EcdsaPrivateKey
*key,
* @return NULL on error (block too large)
*/
struct GNUNET_GNSRECORD_Block *
-GNUNET_GNSRECORD_block_create (const struct GNUNET_CRYPTO_EcdsaPrivateKey *key,
+GNUNET_GNSRECORD_block_create (const struct GNUNET_IDENTITY_PrivateKey *key,
struct GNUNET_TIME_Absolute expire,
const char *label,
const struct GNUNET_GNSRECORD_Data *rd,
@@ -199,14 +264,21 @@ GNUNET_GNSRECORD_block_create (const struct
GNUNET_CRYPTO_EcdsaPrivateKey *key,
{
struct GNUNET_CRYPTO_EcdsaPublicKey pkey;
- GNUNET_CRYPTO_ecdsa_key_get_public (key,
- &pkey);
- return block_create (key,
- &pkey,
- expire,
- label,
- rd,
- rd_count);
+ switch (ntohl (key->type))
+ {
+ case GNUNET_GNSRECORD_TYPE_PKEY:
+ GNUNET_CRYPTO_ecdsa_key_get_public (&key->ecdsa_key,
+ &pkey);
+ return block_create_ecdsa (&key->ecdsa_key,
+ &pkey,
+ expire,
+ label,
+ rd,
+ rd_count);
+ default:
+ GNUNET_assert (0);
+ }
+ return NULL;
}
@@ -240,12 +312,19 @@ struct KeyCacheLine
* @return NULL on error (block too large)
*/
struct GNUNET_GNSRECORD_Block *
-GNUNET_GNSRECORD_block_create2 (const struct GNUNET_CRYPTO_EcdsaPrivateKey
*key,
+GNUNET_GNSRECORD_block_create2 (const struct GNUNET_IDENTITY_PrivateKey *pkey,
struct GNUNET_TIME_Absolute expire,
const char *label,
const struct GNUNET_GNSRECORD_Data *rd,
unsigned int rd_count)
{
+ const struct GNUNET_CRYPTO_EcdsaPrivateKey *key;
+
+ if (GNUNET_IDENTITY_TYPE_ECDSA != ntohl (pkey->type))
+ {
+ return NULL; // FIXME
+ }
+ key = &pkey->ecdsa_key;
#define CSIZE 64
static struct KeyCacheLine cache[CSIZE];
struct KeyCacheLine *line;
@@ -261,12 +340,12 @@ GNUNET_GNSRECORD_block_create2 (const struct
GNUNET_CRYPTO_EcdsaPrivateKey *key,
&line->pkey);
}
#undef CSIZE
- return block_create (key,
- &line->pkey,
- expire,
- label,
- rd,
- rd_count);
+ return block_create_ecdsa (key,
+ &line->pkey,
+ expire,
+ label,
+ rd,
+ rd_count);
}
@@ -277,40 +356,40 @@ GNUNET_GNSRECORD_block_create2 (const struct
GNUNET_CRYPTO_EcdsaPrivateKey *key,
* @param block block to verify
* @return #GNUNET_OK if the signature is valid
*/
-int
+enum GNUNET_GenericReturnValue
GNUNET_GNSRECORD_block_verify (const struct GNUNET_GNSRECORD_Block *block)
{
+ const struct GNUNET_CRYPTO_EcdsaPublicKey *key;
+ const struct GNUNET_GNSRECORD_EcdsaBlock *ecblock;
+
+ if (GNUNET_GNSRECORD_TYPE_PKEY != ntohl (block->type))
+ {
+ GNUNET_break (0);
+ return GNUNET_NO;
+ }
+ ecblock = &block->ecdsa_block;
+ key = &ecblock->derived_key;
+
return GNUNET_CRYPTO_ecdsa_verify_ (GNUNET_SIGNATURE_PURPOSE_GNS_RECORD_SIGN,
- &block->purpose,
- &block->signature,
- &block->derived_key);
+ &ecblock->purpose,
+ &ecblock->signature,
+ key);
}
-/**
- * Decrypt block.
- *
- * @param block block to decrypt
- * @param zone_key public key of the zone
- * @param label the name for the records
- * @param proc function to call with the result
- * @param proc_cls closure for proc
- * @return #GNUNET_OK on success, #GNUNET_SYSERR if the block was
- * not well-formed
- */
-int
-GNUNET_GNSRECORD_block_decrypt (const struct GNUNET_GNSRECORD_Block *block,
- const struct
- GNUNET_CRYPTO_EcdsaPublicKey *zone_key,
- const char *label,
- GNUNET_GNSRECORD_RecordCallback proc,
- void *proc_cls)
+enum GNUNET_GenericReturnValue
+block_decrypt_ecdsa (const struct GNUNET_GNSRECORD_EcdsaBlock *block,
+ const struct
+ GNUNET_CRYPTO_EcdsaPublicKey *zone_key,
+ const char *label,
+ GNUNET_GNSRECORD_RecordCallback proc,
+ void *proc_cls)
{
size_t payload_len = ntohl (block->purpose.size)
- sizeof(struct GNUNET_CRYPTO_EccSignaturePurpose)
- sizeof(struct GNUNET_TIME_AbsoluteNBO);
- struct GNUNET_CRYPTO_SymmetricInitializationVector iv;
- struct GNUNET_CRYPTO_SymmetricSessionKey skey;
+ unsigned char ctr[GNUNET_CRYPTO_AES_KEY_LENGTH / 2];
+ unsigned char key[GNUNET_CRYPTO_AES_KEY_LENGTH];
if (ntohl (block->purpose.size) <
sizeof(struct GNUNET_CRYPTO_EccSignaturePurpose)
@@ -319,18 +398,19 @@ GNUNET_GNSRECORD_block_decrypt (const struct
GNUNET_GNSRECORD_Block *block,
GNUNET_break_op (0);
return GNUNET_SYSERR;
}
- derive_block_aes_key (&iv,
- &skey,
+ derive_block_aes_key (ctr,
+ key,
label,
+ block->expiration_time.abs_value_us__,
zone_key);
{
char payload[payload_len];
uint32_t rd_count;
GNUNET_break (payload_len ==
- GNUNET_CRYPTO_symmetric_decrypt (&block[1], payload_len,
- &skey, &iv,
- payload));
+ ecdsa_symmetric_decrypt (&block[1], payload_len,
+ key, ctr,
+ payload));
GNUNET_memcpy (&rd_count,
payload,
sizeof(uint32_t));
@@ -425,6 +505,39 @@ GNUNET_GNSRECORD_block_decrypt (const struct
GNUNET_GNSRECORD_Block *block,
}
+/**
+ * Decrypt block.
+ *
+ * @param block block to decrypt
+ * @param zone_key public key of the zone
+ * @param label the name for the records
+ * @param proc function to call with the result
+ * @param proc_cls closure for proc
+ * @return #GNUNET_OK on success, #GNUNET_SYSERR if the block was
+ * not well-formed
+ */
+enum GNUNET_GenericReturnValue
+GNUNET_GNSRECORD_block_decrypt (const struct GNUNET_GNSRECORD_Block *block,
+ const struct
+ GNUNET_IDENTITY_PublicKey *zone_key,
+ const char *label,
+ GNUNET_GNSRECORD_RecordCallback proc,
+ void *proc_cls)
+{
+ const struct GNUNET_CRYPTO_EcdsaPublicKey *key;
+
+ if (GNUNET_IDENTITY_TYPE_ECDSA != ntohl (zone_key->type))
+ {
+ return GNUNET_NO;
+ }
+ key = &zone_key->ecdsa_key;
+
+ return block_decrypt_ecdsa (&block->ecdsa_block,
+ key, label, proc, proc_cls);
+
+}
+
+
/**
* Calculate the DHT query for a given @a label in a given @a zone.
*
@@ -434,17 +547,24 @@ GNUNET_GNSRECORD_block_decrypt (const struct
GNUNET_GNSRECORD_Block *block,
*/
void
GNUNET_GNSRECORD_query_from_private_key (const struct
- GNUNET_CRYPTO_EcdsaPrivateKey *zone,
+ GNUNET_IDENTITY_PrivateKey *zone,
const char *label,
struct GNUNET_HashCode *query)
{
- struct GNUNET_CRYPTO_EcdsaPublicKey pub;
-
- GNUNET_CRYPTO_ecdsa_key_get_public (zone,
- &pub);
- GNUNET_GNSRECORD_query_from_public_key (&pub,
- label,
- query);
+ struct GNUNET_IDENTITY_PublicKey pub;
+ switch (ntohl (zone->type))
+ {
+ case GNUNET_GNSRECORD_TYPE_PKEY:
+
+ GNUNET_IDENTITY_key_get_public (zone,
+ &pub);
+ GNUNET_GNSRECORD_query_from_public_key (&pub,
+ label,
+ query);
+ break;
+ default:
+ GNUNET_assert (0);
+ }
}
@@ -457,18 +577,27 @@ GNUNET_GNSRECORD_query_from_private_key (const struct
*/
void
GNUNET_GNSRECORD_query_from_public_key (const struct
- GNUNET_CRYPTO_EcdsaPublicKey *pub,
+ GNUNET_IDENTITY_PublicKey *pub,
const char *label,
struct GNUNET_HashCode *query)
{
- struct GNUNET_CRYPTO_EcdsaPublicKey pd;
- GNUNET_CRYPTO_ecdsa_public_key_derive (pub,
- label,
- "gns",
- &pd);
- GNUNET_CRYPTO_hash (&pd,
- sizeof(pd),
- query);
+ struct GNUNET_IDENTITY_PublicKey pd;
+
+ switch (ntohl (pub->type))
+ {
+ case GNUNET_GNSRECORD_TYPE_PKEY:
+ pd.type = pub->type;
+ GNUNET_CRYPTO_ecdsa_public_key_derive (&pub->ecdsa_key,
+ label,
+ "gns",
+ &pd.ecdsa_key);
+ GNUNET_CRYPTO_hash (&pd.ecdsa_key,
+ sizeof (pd.ecdsa_key),
+ query);
+ break;
+ default:
+ GNUNET_assert (0);
+ }
}
diff --git a/src/gnsrecord/gnsrecord_misc.c b/src/gnsrecord/gnsrecord_misc.c
index 5061f8493..82c38f19a 100644
--- a/src/gnsrecord/gnsrecord_misc.c
+++ b/src/gnsrecord/gnsrecord_misc.c
@@ -62,14 +62,14 @@ GNUNET_GNSRECORD_string_to_lowercase (const char *src)
* @return string form; will be overwritten by next call to
#GNUNET_GNSRECORD_z2s
*/
const char *
-GNUNET_GNSRECORD_z2s (const struct GNUNET_CRYPTO_EcdsaPublicKey *z)
+GNUNET_GNSRECORD_z2s (const struct GNUNET_IDENTITY_PublicKey *z)
{
- static char buf[sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey) * 8];
+ static char buf[sizeof(struct GNUNET_IDENTITY_PublicKey) * 8];
char *end;
end = GNUNET_STRINGS_data_to_string ((const unsigned char *) z,
sizeof(struct
- GNUNET_CRYPTO_EcdsaPublicKey),
+ GNUNET_IDENTITY_PublicKey),
buf, sizeof(buf));
if (NULL == end)
{
@@ -99,7 +99,7 @@ GNUNET_GNSRECORD_records_cmp (const struct
GNUNET_GNSRECORD_Data *a,
if (a->record_type != b->record_type)
{
LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Record type %lu != %lu\n", a->record_type, b->record_type);
+ "Record type %u != %u\n", a->record_type, b->record_type);
return GNUNET_NO;
}
if ((a->expiration_time != b->expiration_time) &&
@@ -107,15 +107,15 @@ GNUNET_GNSRECORD_records_cmp (const struct
GNUNET_GNSRECORD_Data *a,
{
LOG (GNUNET_ERROR_TYPE_DEBUG,
"Expiration time %llu != %llu\n",
- a->expiration_time,
- b->expiration_time);
+ (unsigned long long) a->expiration_time,
+ (unsigned long long) b->expiration_time);
return GNUNET_NO;
}
if ((a->flags & GNUNET_GNSRECORD_RF_RCMP_FLAGS)
!= (b->flags & GNUNET_GNSRECORD_RF_RCMP_FLAGS))
{
LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Flags %lu (%lu) != %lu (%lu)\n", a->flags,
+ "Flags %u (%u) != %u (%u)\n", a->flags,
a->flags & GNUNET_GNSRECORD_RF_RCMP_FLAGS, b->flags,
b->flags & GNUNET_GNSRECORD_RF_RCMP_FLAGS);
return GNUNET_NO;
@@ -236,12 +236,12 @@ GNUNET_GNSRECORD_is_expired (const struct
GNUNET_GNSRECORD_Data *rd)
* key in an encoding suitable for DNS labels.
*/
const char *
-GNUNET_GNSRECORD_pkey_to_zkey (const struct GNUNET_CRYPTO_EcdsaPublicKey *pkey)
+GNUNET_GNSRECORD_pkey_to_zkey (const struct GNUNET_IDENTITY_PublicKey *pkey)
{
static char ret[128];
char *pkeys;
- pkeys = GNUNET_CRYPTO_ecdsa_public_key_to_string (pkey);
+ pkeys = GNUNET_IDENTITY_public_key_to_string (pkey);
GNUNET_snprintf (ret,
sizeof(ret),
"%s",
@@ -262,15 +262,140 @@ GNUNET_GNSRECORD_pkey_to_zkey (const struct
GNUNET_CRYPTO_EcdsaPublicKey *pkey)
*/
int
GNUNET_GNSRECORD_zkey_to_pkey (const char *zkey,
- struct GNUNET_CRYPTO_EcdsaPublicKey *pkey)
+ struct GNUNET_IDENTITY_PublicKey *pkey)
{
if (GNUNET_OK !=
- GNUNET_CRYPTO_ecdsa_public_key_from_string (zkey,
- strlen (zkey),
- pkey))
+ GNUNET_IDENTITY_public_key_from_string (zkey,
+ pkey))
return GNUNET_SYSERR;
return GNUNET_OK;
}
+enum GNUNET_GenericReturnValue
+GNUNET_GNSRECORD_identity_from_data (const char *data,
+ size_t data_size,
+ uint32_t type,
+ struct GNUNET_IDENTITY_PublicKey *key)
+{
+ if (GNUNET_NO == GNUNET_GNSRECORD_is_zonekey_type (type))
+ return GNUNET_SYSERR;
+ if (data_size > sizeof (struct GNUNET_IDENTITY_PublicKey))
+ return GNUNET_SYSERR;
+ return (GNUNET_IDENTITY_read_key_from_buffer (key, data, data_size) ==
+ data_size?
+ GNUNET_OK :
+ GNUNET_SYSERR);
+}
+
+
+enum GNUNET_GenericReturnValue
+GNUNET_GNSRECORD_data_from_identity (const struct
+ GNUNET_IDENTITY_PublicKey *key,
+ char **data,
+ size_t *data_size,
+ uint32_t *type)
+{
+ *type = ntohl (key->type);
+ *data_size = GNUNET_IDENTITY_key_get_length (key);
+ if (0 == *data_size)
+ return GNUNET_SYSERR;
+ *data = GNUNET_malloc (*data_size);
+ return (GNUNET_IDENTITY_write_key_to_buffer (key, *data, *data_size) ==
+ *data_size?
+ GNUNET_OK :
+ GNUNET_SYSERR);
+}
+
+
+enum GNUNET_GenericReturnValue
+GNUNET_GNSRECORD_is_zonekey_type (uint32_t type)
+{
+ switch (type)
+ {
+ case GNUNET_GNSRECORD_TYPE_PKEY:
+ case GNUNET_GNSRECORD_TYPE_EDKEY:
+ return GNUNET_YES;
+ default:
+ return GNUNET_NO;
+ }
+}
+
+
+size_t
+GNUNET_GNSRECORD_block_get_size (const struct GNUNET_GNSRECORD_Block *block)
+{
+ switch (ntohl (block->type))
+ {
+ case GNUNET_GNSRECORD_TYPE_PKEY:
+ return sizeof (uint32_t) /* zone type */
+ + sizeof (block->ecdsa_block) /* EcdsaBlock */
+ + ntohl (block->ecdsa_block.purpose.size) /* Length of signed
data */
+ - sizeof (block->ecdsa_block.purpose); /* Purpose already in
EcdsaBlock */
+ break;
+ default:
+ return 0;
+ }
+ return 0;
+}
+
+
+struct GNUNET_TIME_Absolute
+GNUNET_GNSRECORD_block_get_expiration (const struct
+ GNUNET_GNSRECORD_Block *block)
+{
+
+ switch (ntohl (block->type))
+ {
+ case GNUNET_GNSRECORD_TYPE_PKEY:
+ return GNUNET_TIME_absolute_ntoh (block->ecdsa_block.expiration_time);
+ default:
+ return GNUNET_TIME_absolute_get_zero_ ();
+ }
+ return GNUNET_TIME_absolute_get_zero_ ();
+
+}
+
+
+enum GNUNET_GenericReturnValue
+GNUNET_GNSRECORD_query_from_block (const struct GNUNET_GNSRECORD_Block *block,
+ struct GNUNET_HashCode *query)
+{
+ switch (ntohl (block->type))
+ {
+ case GNUNET_GNSRECORD_TYPE_PKEY:
+ GNUNET_CRYPTO_hash (&block->ecdsa_block.derived_key,
+ sizeof (block->ecdsa_block.derived_key),
+ query);
+ return GNUNET_OK;
+ default:
+ return GNUNET_SYSERR;
+ }
+ return GNUNET_SYSERR;
+
+}
+
+
+enum GNUNET_GenericReturnValue
+GNUNET_GNSRECORD_record_to_identity_key (const struct GNUNET_GNSRECORD_Data
*rd,
+ struct GNUNET_IDENTITY_PublicKey *key)
+{
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Got record of type %u\n",
+ rd->record_type);
+ switch (rd->record_type)
+ {
+ case GNUNET_GNSRECORD_TYPE_PKEY:
+ key->type = htonl (rd->record_type);
+ memcpy (&key->ecdsa_key, rd->data, sizeof (key->ecdsa_key));
+ return GNUNET_OK;
+ default:
+ return GNUNET_SYSERR;
+ }
+ return GNUNET_SYSERR;
+
+
+}
+
+
/* end of gnsrecord_misc.c */
diff --git a/src/gnsrecord/gnunet-gnsrecord-tvg.c
b/src/gnsrecord/gnunet-gnsrecord-tvg.c
index 789ff8aa3..47b13bdab 100644
--- a/src/gnsrecord/gnunet-gnsrecord-tvg.c
+++ b/src/gnsrecord/gnunet-gnsrecord-tvg.c
@@ -90,28 +90,38 @@ run (void *cls,
struct GNUNET_TIME_Absolute exp_abs = GNUNET_TIME_absolute_get ();
struct GNUNET_GNSRECORD_Block *rrblock;
char *bdata;
- struct GNUNET_CRYPTO_EcdsaPrivateKey id_priv;
- struct GNUNET_CRYPTO_EcdsaPublicKey id_pub;
- struct GNUNET_CRYPTO_EcdsaPrivateKey pkey_data_p;
- struct GNUNET_CRYPTO_EcdsaPublicKey pkey_data;
+ struct GNUNET_IDENTITY_PrivateKey id_priv;
+ struct GNUNET_IDENTITY_PublicKey id_pub;
+ struct GNUNET_IDENTITY_PrivateKey pkey_data_p;
+ struct GNUNET_IDENTITY_PublicKey pkey_data;
void *data;
size_t data_size;
char *rdata;
size_t rdata_size;
-
- GNUNET_CRYPTO_ecdsa_key_create (&id_priv);
- GNUNET_CRYPTO_ecdsa_key_get_public (&id_priv,
- &id_pub);
- fprintf (stdout, "Zone private key (d, little-endian scalar):\n");
- print_bytes (&id_priv, sizeof(id_priv), 0);
+ char ztld[128];
+
+ id_priv.type = htonl (GNUNET_GNSRECORD_TYPE_PKEY);
+ GNUNET_CRYPTO_ecdsa_key_create (&id_priv.ecdsa_key);
+ GNUNET_IDENTITY_key_get_public (&id_priv,
+ &id_pub);
+ fprintf (stdout, "Zone private key (d, little-endian, with ztype
prepended):\n");
+ print_bytes (&id_priv, GNUNET_IDENTITY_key_get_length (&id_pub), 8); //FIXME
length for privkey?
+ fprintf (stdout, "\n");
+ fprintf (stdout, "Zone identifier (zid):\n");
+ print_bytes (&id_pub, GNUNET_IDENTITY_key_get_length (&id_pub), 8);
+ GNUNET_STRINGS_data_to_string (&id_pub,
+ GNUNET_IDENTITY_key_get_length (&id_pub),
+ ztld,
+ sizeof (ztld));
fprintf (stdout, "\n");
- fprintf (stdout, "Zone public key (zk):\n");
- print_bytes (&id_pub, sizeof(id_pub), 0);
+ fprintf (stdout, "Encoded zone identifier (zkl = zTLD):\n");
+ fprintf (stdout, "%s\n", ztld);
fprintf (stdout, "\n");
- GNUNET_CRYPTO_ecdsa_key_create (&pkey_data_p);
- GNUNET_CRYPTO_ecdsa_key_get_public (&pkey_data_p,
- &pkey_data);
+ pkey_data_p.type = htonl (GNUNET_GNSRECORD_TYPE_PKEY);
+ GNUNET_CRYPTO_ecdsa_key_create (&pkey_data_p.ecdsa_key);
+ GNUNET_IDENTITY_key_get_public (&pkey_data_p,
+ &pkey_data);
fprintf (stdout,
"Label: %s\nRRCOUNT: %d\n\n", TEST_RECORD_LABEL, TEST_RRCOUNT);
memset (rd, 0, sizeof (struct GNUNET_GNSRECORD_Data) * 2);
@@ -147,19 +157,20 @@ run (void *cls,
TEST_RECORD_LABEL,
rd,
TEST_RRCOUNT);
- size_t bdata_size = ntohl (rrblock->purpose.size)
+ size_t bdata_size = ntohl (rrblock->ecdsa_block.purpose.size)
- sizeof(struct GNUNET_CRYPTO_EccSignaturePurpose)
- sizeof(struct GNUNET_TIME_AbsoluteNBO);
- size_t rrblock_size = ntohl (rrblock->purpose.size)
+ size_t ecblock_size = ntohl (rrblock->ecdsa_block.purpose.size)
+ sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey)
+ sizeof(struct GNUNET_CRYPTO_EcdsaSignature);
+ size_t block_size = ecblock_size + sizeof (uint32_t);
- bdata = (char*) &rrblock[1];
+ bdata = (char*) &(&rrblock->ecdsa_block)[1];
fprintf (stdout, "BDATA:\n");
print_bytes (bdata, bdata_size, 8);
fprintf (stdout, "\n");
fprintf (stdout, "RRBLOCK:\n");
- print_bytes (rrblock, rrblock_size, 8);
+ print_bytes (rrblock, block_size, 8);
fprintf (stdout, "\n");
}
diff --git a/src/json/json_gnsrecord.c b/src/gnsrecord/json_gnsrecord.c
similarity index 72%
rename from src/json/json_gnsrecord.c
rename to src/gnsrecord/json_gnsrecord.c
index 7e11aba94..068ff48c1 100644
--- a/src/json/json_gnsrecord.c
+++ b/src/gnsrecord/json_gnsrecord.c
@@ -26,6 +26,7 @@
#include "platform.h"
#include "gnunet_util_lib.h"
#include "gnunet_json_lib.h"
+#include "gnunet_gnsrecord_lib.h"
#define GNUNET_JSON_GNSRECORD_VALUE "value"
#define GNUNET_JSON_GNSRECORD_RECORD_DATA "data"
@@ -258,7 +259,7 @@ clean_gnsrecordobject (void *cls, struct
GNUNET_JSON_Specification *spec)
* @return JSON Specification
*/
struct GNUNET_JSON_Specification
-GNUNET_JSON_spec_gnsrecord (struct GNUNET_GNSRECORD_Data **rd,
+GNUNET_GNSRECORD_JSON_spec_gnsrecord (struct GNUNET_GNSRECORD_Data **rd,
unsigned int *rd_count,
char **name)
{
@@ -277,3 +278,114 @@ GNUNET_JSON_spec_gnsrecord (struct GNUNET_GNSRECORD_Data
**rd,
.size_ptr = NULL };
return ret;
}
+
+
+/**
+ * Convert GNS record to JSON.
+ *
+ * @param rname name of record
+ * @param rd record data
+ * @return corresponding JSON encoding
+ */
+json_t *
+GNUNET_GNSRECORD_JSON_from_gnsrecord (const char*rname,
+ const struct GNUNET_GNSRECORD_Data *rd,
+ unsigned int rd_count)
+{
+ struct GNUNET_TIME_Absolute abs_exp;
+ struct GNUNET_TIME_Relative rel_exp;
+ const char *expiration_time_str;
+ const char *record_type_str;
+ char *value_str;
+ json_t *data;
+ json_t *record;
+ json_t *records;
+
+ data = json_object ();
+ if (NULL == data)
+ {
+ GNUNET_break (0);
+ return NULL;
+ }
+ if (0 !=
+ json_object_set_new (data,
+ "record_name",
+ json_string (rname)))
+ {
+ GNUNET_break (0);
+ json_decref (data);
+ return NULL;
+ }
+ records = json_array ();
+ if (NULL == records)
+ {
+ GNUNET_break (0);
+ json_decref (data);
+ return NULL;
+ }
+ for (int i = 0; i < rd_count; i++)
+ {
+ value_str = GNUNET_GNSRECORD_value_to_string (rd[i].record_type,
+ rd[i].data,
+ rd[i].data_size);
+ if (GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION & rd[i].flags)
+ {
+ rel_exp.rel_value_us = rd[i].expiration_time;
+ expiration_time_str = GNUNET_STRINGS_relative_time_to_string (rel_exp,
+ GNUNET_NO);
+ }
+ else
+ {
+ abs_exp.abs_value_us = rd[i].expiration_time;
+ expiration_time_str = GNUNET_STRINGS_absolute_time_to_string (abs_exp);
+ }
+ record_type_str = GNUNET_GNSRECORD_number_to_typename (rd[i].record_type);
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Packing %s %s %s %d\n",
+ value_str, record_type_str, expiration_time_str, rd[i].flags);
+ record = json_pack ("{s:s,s:s,s:s,s:b,s:b,s:b,s:b}",
+ "value",
+ value_str,
+ "record_type",
+ record_type_str,
+ "expiration_time",
+ expiration_time_str,
+ "private",
+ rd[i].flags & GNUNET_GNSRECORD_RF_PRIVATE,
+ "relative_expiration",
+ rd[i].flags & GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION,
+ "supplemental",
+ rd[i].flags & GNUNET_GNSRECORD_RF_SUPPLEMENTAL,
+ "shadow",
+ rd[i].flags & GNUNET_GNSRECORD_RF_SHADOW_RECORD);
+ GNUNET_free (value_str);
+ if (NULL == record)
+ {
+ GNUNET_break (0);
+ json_decref (records);
+ json_decref (data);
+ return NULL;
+ }
+ if (0 !=
+ json_array_append_new (records,
+ record))
+ {
+ GNUNET_break (0);
+ json_decref (records);
+ json_decref (data);
+ return NULL;
+ }
+ }
+ if (0 !=
+ json_object_set_new (data,
+ "data",
+ records))
+ {
+ GNUNET_break (0);
+ json_decref (data);
+ return NULL;
+ }
+ return data;
+}
+
+
diff --git a/src/gnsrecord/perf_gnsrecord_crypto.c
b/src/gnsrecord/perf_gnsrecord_crypto.c
index eb4633f75..d9a3c20cf 100644
--- a/src/gnsrecord/perf_gnsrecord_crypto.c
+++ b/src/gnsrecord/perf_gnsrecord_crypto.c
@@ -73,7 +73,7 @@ run (void *cls,
struct GNUNET_GNSRECORD_Data *s_rd;
const char *s_name;
struct GNUNET_TIME_Absolute start_time;
- struct GNUNET_CRYPTO_EcdsaPrivateKey privkey;
+ struct GNUNET_IDENTITY_PrivateKey privkey;
struct GNUNET_TIME_Absolute expire;
(void) cls;
@@ -81,7 +81,8 @@ run (void *cls,
(void) cfgfile;
(void) cfg;
expire = GNUNET_TIME_absolute_get ();
- GNUNET_CRYPTO_ecdsa_key_create (&privkey);
+ privkey.type = htonl (GNUNET_GNSRECORD_TYPE_PKEY);
+ GNUNET_CRYPTO_ecdsa_key_create (&privkey.ecdsa_key);
/* test block creation */
s_name = "DUMMY.dummy.gnunet";
diff --git a/src/gnsrecord/plugin_gnsrecord_dns.c
b/src/gnsrecord/plugin_gnsrecord_dns.c
index 9ac6fb9e6..bde9944e2 100644
--- a/src/gnsrecord/plugin_gnsrecord_dns.c
+++ b/src/gnsrecord/plugin_gnsrecord_dns.c
@@ -100,7 +100,7 @@ dns_value_to_string (void *cls,
return NULL;
}
GNUNET_asprintf (&result,
- "rname=%s mname=%s %lu,%lu,%lu,%lu,%lu",
+ "rname=%s mname=%s %u,%u,%u,%u,%u",
soa->rname,
soa->mname,
soa->serial,
diff --git a/src/gnsrecord/test_gnsrecord_crypto.c
b/src/gnsrecord/test_gnsrecord_crypto.c
index b67e9a123..d541f3076 100644
--- a/src/gnsrecord/test_gnsrecord_crypto.c
+++ b/src/gnsrecord/test_gnsrecord_crypto.c
@@ -100,17 +100,18 @@ run (void *cls,
const struct GNUNET_CONFIGURATION_Handle *cfg)
{
struct GNUNET_GNSRECORD_Block *block;
- struct GNUNET_CRYPTO_EcdsaPublicKey pubkey;
+ struct GNUNET_IDENTITY_PublicKey pubkey;
struct GNUNET_HashCode query_pub;
struct GNUNET_HashCode query_priv;
struct GNUNET_TIME_Absolute expire = GNUNET_TIME_absolute_get ();
- struct GNUNET_CRYPTO_EcdsaPrivateKey privkey;
+ struct GNUNET_IDENTITY_PrivateKey privkey;
- GNUNET_CRYPTO_ecdsa_key_create (&privkey);
+ privkey.type = htonl (GNUNET_GNSRECORD_TYPE_PKEY);
+ GNUNET_CRYPTO_ecdsa_key_create (&privkey.ecdsa_key);
/* get public key */
- GNUNET_CRYPTO_ecdsa_key_get_public (&privkey,
- &pubkey);
+ GNUNET_IDENTITY_key_get_public (&privkey,
+ &pubkey);
/* test query derivation */
GNUNET_GNSRECORD_query_from_private_key (&privkey,
diff --git a/src/identity/gnunet-identity.c b/src/identity/gnunet-identity.c
index d0f5546f3..a01cd1ed7 100644
--- a/src/identity/gnunet-identity.c
+++ b/src/identity/gnunet-identity.c
@@ -65,6 +65,11 @@ static unsigned int verbose;
*/
static int quiet;
+/**
+ * Was "eddsa" specified?
+ */
+static int type_eddsa;
+
/**
* -C option
*/
@@ -108,7 +113,7 @@ static struct GNUNET_IDENTITY_Operation *delete_op;
/**
* Private key from command line option, or NULL.
*/
-struct GNUNET_CRYPTO_EcdsaPrivateKey pk;
+struct GNUNET_IDENTITY_PrivateKey pk;
/**
* Value to return from #main().
@@ -197,7 +202,7 @@ delete_finished (void *cls,
*/
static void
create_finished (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *pk,
+ const struct GNUNET_IDENTITY_PrivateKey *pk,
const char *emsg)
{
struct GNUNET_IDENTITY_Operation **op = cls;
@@ -212,16 +217,16 @@ create_finished (void *cls,
}
else if (verbose)
{
- struct GNUNET_CRYPTO_EcdsaPublicKey pub;
+ struct GNUNET_IDENTITY_PublicKey pub;
char *pubs;
- GNUNET_CRYPTO_ecdsa_key_get_public (pk, &pub);
- pubs = GNUNET_CRYPTO_ecdsa_public_key_to_string (&pub);
+ GNUNET_IDENTITY_key_get_public (pk, &pub);
+ pubs = GNUNET_IDENTITY_public_key_to_string (&pub);
if (private_keys)
{
char *privs;
- privs = GNUNET_CRYPTO_ecdsa_private_key_to_string (pk);
+ privs = GNUNET_IDENTITY_private_key_to_string (pk);
fprintf (stdout, "%s - %s\n", pubs, privs);
GNUNET_free (privs);
}
@@ -293,7 +298,7 @@ print_ego (void *cls,
void **ctx,
const char *identifier)
{
- struct GNUNET_CRYPTO_EcdsaPublicKey pk;
+ struct GNUNET_IDENTITY_PublicKey pk;
char *s;
char *privs;
@@ -342,8 +347,8 @@ print_ego (void *cls,
set_ego)) )
return;
GNUNET_IDENTITY_ego_get_public_key (ego, &pk);
- s = GNUNET_CRYPTO_ecdsa_public_key_to_string (&pk);
- privs = GNUNET_CRYPTO_ecdsa_private_key_to_string (
+ s = GNUNET_IDENTITY_public_key_to_string (&pk);
+ privs = GNUNET_IDENTITY_private_key_to_string (
GNUNET_IDENTITY_ego_get_private_key (ego));
if ((monitor) || (NULL != identifier))
{
@@ -357,9 +362,16 @@ print_ego (void *cls,
else
{
if (private_keys)
- fprintf (stdout, "%s - %s - %s\n", identifier, s, privs);
+ fprintf (stdout, "%s - %s - %s - %s\n",
+ identifier, s, privs,
+ (ntohl (pk.type) == GNUNET_IDENTITY_TYPE_ECDSA) ?
+ "ECDSA" : "EdDSA");
else
- fprintf (stdout, "%s - %s\n", identifier, s);
+ fprintf (stdout, "%s - %s - %s\n",
+ identifier, s,
+ (ntohl (pk.type) == GNUNET_IDENTITY_TYPE_ECDSA) ?
+ "ECDSA" : "EdDSA");
+
}
}
GNUNET_free (privs);
@@ -407,11 +419,12 @@ run (void *cls,
strlen (privkey_ego),
&pk,
sizeof(struct
- GNUNET_CRYPTO_EcdsaPrivateKey));
+ GNUNET_IDENTITY_PrivateKey));
create_op =
GNUNET_IDENTITY_create (sh,
create_ego,
&pk,
+ 0, // Ignored
&create_finished,
&create_op);
}
@@ -420,6 +433,9 @@ run (void *cls,
GNUNET_IDENTITY_create (sh,
create_ego,
NULL,
+ (type_eddsa) ?
+ GNUNET_IDENTITY_TYPE_EDDSA :
+ GNUNET_IDENTITY_TYPE_ECDSA,
&create_finished,
&create_op);
}
@@ -456,6 +472,11 @@ main (int argc, char *const *argv)
gettext_noop (
"set the private key for the identity to
PRIVATE_KEY (use together with -C)"),
&privkey_ego),
+ GNUNET_GETOPT_option_flag ('X',
+ "eddsa",
+ gettext_noop (
+ "generate an EdDSA identity. (use together
with -C) EXPERIMENTAL"),
+ &type_eddsa),
GNUNET_GETOPT_option_flag ('d',
"display",
gettext_noop ("display all egos"),
diff --git a/src/identity/gnunet-service-identity.c
b/src/identity/gnunet-service-identity.c
index bdacf3ba0..6cdb1c2f7 100644
--- a/src/identity/gnunet-service-identity.c
+++ b/src/identity/gnunet-service-identity.c
@@ -57,7 +57,7 @@ struct Ego
/**
* Private key of the ego.
*/
- struct GNUNET_CRYPTO_EcdsaPrivateKey pk;
+ struct GNUNET_IDENTITY_PrivateKey pk;
/**
* String identifier for the ego.
@@ -538,8 +538,8 @@ handle_get_default_message (void *cls,
* @return 0 if the keys are equal
*/
static int
-key_cmp (const struct GNUNET_CRYPTO_EcdsaPrivateKey *pk1,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *pk2)
+key_cmp (const struct GNUNET_IDENTITY_PrivateKey *pk1,
+ const struct GNUNET_IDENTITY_PrivateKey *pk2)
{
return GNUNET_memcmp (pk1, pk2);
}
@@ -738,10 +738,10 @@ handle_create_message (void *cls,
send_result_code (client, 0, NULL);
fn = get_ego_filename (ego);
(void) GNUNET_DISK_directory_create_for_file (fn);
- if (sizeof(struct GNUNET_CRYPTO_EcdsaPrivateKey) !=
+ if (sizeof(struct GNUNET_IDENTITY_PrivateKey) !=
GNUNET_DISK_fn_write (fn,
&crm->private_key,
- sizeof(struct GNUNET_CRYPTO_EcdsaPrivateKey),
+ sizeof(struct GNUNET_IDENTITY_PrivateKey),
GNUNET_DISK_PERM_USER_READ
| GNUNET_DISK_PERM_USER_WRITE))
GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR, "write", fn);
@@ -1038,6 +1038,67 @@ handle_delete_message (void *cls, const struct
DeleteMessage *dm)
}
+static int
+read_from_file (const char *filename,
+ void *buf,
+ size_t buf_size)
+{
+ int fd;
+ struct stat sb;
+
+ fd = open (filename,
+ O_RDONLY);
+ if (-1 == fd)
+ {
+ memset (buf,
+ 0,
+ buf_size);
+ return GNUNET_SYSERR;
+ }
+ if (0 != fstat (fd,
+ &sb))
+ {
+ GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING,
+ "stat",
+ filename);
+ GNUNET_assert (0 == close (fd));
+ memset (buf,
+ 0,
+ buf_size);
+ return GNUNET_SYSERR;
+ }
+ if (sb.st_size != buf_size)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+ "File `%s' has wrong size (%llu), expected %llu bytes\n",
+ filename,
+ (unsigned long long) sb.st_size,
+ (unsigned long long) buf_size);
+ GNUNET_assert (0 == close (fd));
+ memset (buf,
+ 0,
+ buf_size);
+ return GNUNET_SYSERR;
+ }
+ if (buf_size !=
+ read (fd,
+ buf,
+ buf_size))
+ {
+ GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING,
+ "read",
+ filename);
+ GNUNET_assert (0 == close (fd));
+ memset (buf,
+ 0,
+ buf_size);
+ return GNUNET_SYSERR;
+ }
+ GNUNET_assert (0 == close (fd));
+ return GNUNET_OK;
+}
+
+
/**
* Process the given file from the "EGODIR". Parses the file
* and creates the respective 'struct Ego' in memory.
@@ -1063,9 +1124,9 @@ process_ego_file (void *cls,
}
ego = GNUNET_new (struct Ego);
if (GNUNET_OK !=
- GNUNET_CRYPTO_ecdsa_key_from_file (filename,
- GNUNET_NO,
- &ego->pk))
+ read_from_file (filename,
+ &ego->pk,
+ sizeof (ego->pk)))
{
GNUNET_free (ego);
GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
diff --git a/src/identity/identity.h b/src/identity/identity.h
index ef638fa36..11c5883bc 100644
--- a/src/identity/identity.h
+++ b/src/identity/identity.h
@@ -30,6 +30,44 @@
#include "gnunet_common.h"
+/**
+ * Handle for an ego.
+ */
+struct GNUNET_IDENTITY_Ego
+{
+ /**
+ * Hash of the private key of this ego.
+ */
+ struct GNUNET_HashCode id;
+
+ /**
+ * The identity key pair
+ */
+ struct GNUNET_IDENTITY_PublicKey pub;
+
+ /**
+ * The identity key pair
+ */
+ struct GNUNET_IDENTITY_PrivateKey pk;
+
+ /**
+ * Current name associated with this ego.
+ */
+ char *name;
+
+ /**
+ * Client context associated with this ego.
+ */
+ void *ctx;
+
+ /**
+ * Set to true once @e pub was initialized
+ */
+ bool pub_initialized;
+};
+
+
+
GNUNET_NETWORK_STRUCT_BEGIN
@@ -95,7 +133,7 @@ struct UpdateMessage
/**
* The private key
*/
- struct GNUNET_CRYPTO_EcdsaPrivateKey private_key;
+ struct GNUNET_IDENTITY_PrivateKey private_key;
/* followed by 0-terminated ego name */
};
@@ -151,7 +189,7 @@ struct SetDefaultMessage
/**
* The private key
*/
- struct GNUNET_CRYPTO_EcdsaPrivateKey private_key;
+ struct GNUNET_IDENTITY_PrivateKey private_key;
/* followed by 0-terminated service name */
};
@@ -181,7 +219,7 @@ struct CreateRequestMessage
/**
* The private key
*/
- struct GNUNET_CRYPTO_EcdsaPrivateKey private_key;
+ struct GNUNET_IDENTITY_PrivateKey private_key;
/* followed by 0-terminated identity name */
};
@@ -239,42 +277,5 @@ struct DeleteMessage
GNUNET_NETWORK_STRUCT_END
-/**
- * Handle for an ego.
- */
-struct GNUNET_IDENTITY_Ego
-{
- /**
- * Hash of the private key of this ego.
- */
- struct GNUNET_HashCode id;
-
- /**
- * Private key associated with this ego.
- */
- struct GNUNET_CRYPTO_EcdsaPrivateKey pk;
-
- /**
- * Public key associated with this ego. Initialized on demand.
- * Always use #GNUNET_IDENTITY_ego_get_public_key() to obtain.
- */
- struct GNUNET_CRYPTO_EcdsaPublicKey pub;
-
- /**
- * Current name associated with this ego.
- */
- char *name;
-
- /**
- * Client context associated with this ego.
- */
- void *ctx;
-
- /**
- * Set to true once @e pub was initialized
- */
- bool pub_initialized;
-};
-
#endif
diff --git a/src/identity/identity_api.c b/src/identity/identity_api.c
index f7aca1655..64c088923 100644
--- a/src/identity/identity_api.c
+++ b/src/identity/identity_api.c
@@ -74,7 +74,7 @@ struct GNUNET_IDENTITY_Operation
/**
* Private key to return to @e create_cont, or NULL.
*/
- struct GNUNET_CRYPTO_EcdsaPrivateKey pk;
+ struct GNUNET_IDENTITY_PrivateKey pk;
/**
* Continuation to invoke with the result of the transmission for
@@ -157,13 +157,12 @@ GNUNET_IDENTITY_ego_get_anonymous ()
{
static struct GNUNET_IDENTITY_Ego anon;
static int setup;
- struct GNUNET_CRYPTO_EcdsaPublicKey pub;
if (setup)
return &anon;
- anon.pk = *GNUNET_CRYPTO_ecdsa_key_get_anonymous ();
- GNUNET_CRYPTO_ecdsa_key_get_public (&anon.pk,
- &pub);
+ anon.pk.type = htonl (GNUNET_IDENTITY_TYPE_ECDSA);
+ anon.pub.type = htonl (GNUNET_IDENTITY_TYPE_ECDSA);
+ anon.pk.ecdsa_key = *GNUNET_CRYPTO_ecdsa_key_get_anonymous ();
GNUNET_CRYPTO_hash (&anon.pk,
sizeof(anon.pk),
&anon.id);
@@ -172,6 +171,51 @@ GNUNET_IDENTITY_ego_get_anonymous ()
}
+enum GNUNET_GenericReturnValue
+GNUNET_IDENTITY_key_get_public (const struct
+ GNUNET_IDENTITY_PrivateKey *privkey,
+ struct GNUNET_IDENTITY_PublicKey *key)
+{
+ key->type = privkey->type;
+ switch (ntohl (privkey->type))
+ {
+ case GNUNET_IDENTITY_TYPE_ECDSA:
+ GNUNET_CRYPTO_ecdsa_key_get_public (&privkey->ecdsa_key,
+ &key->ecdsa_key);
+ break;
+ case GNUNET_IDENTITY_TYPE_EDDSA:
+ GNUNET_CRYPTO_eddsa_key_get_public (&privkey->eddsa_key,
+ &key->eddsa_key);
+ break;
+ default:
+ GNUNET_break (0);
+ return GNUNET_SYSERR;
+ }
+ return GNUNET_OK;
+}
+
+
+static int
+private_key_create (enum GNUNET_IDENTITY_KeyType ktype,
+ struct GNUNET_IDENTITY_PrivateKey *key)
+{
+ key->type = htonl (ktype);
+ switch (ktype)
+ {
+ case GNUNET_IDENTITY_TYPE_ECDSA:
+ GNUNET_CRYPTO_ecdsa_key_create (&key->ecdsa_key);
+ break;
+ case GNUNET_IDENTITY_TYPE_EDDSA:
+ GNUNET_CRYPTO_eddsa_key_create (&key->eddsa_key);
+ break;
+ default:
+ GNUNET_break (0);
+ return GNUNET_SYSERR;
+ }
+ return GNUNET_OK;
+}
+
+
/**
* Try again to connect to the identity service.
*
@@ -591,7 +635,7 @@ GNUNET_IDENTITY_connect (const struct
GNUNET_CONFIGURATION_Handle *cfg,
* @param ego the ego
* @return associated ECC key, valid as long as the ego is valid
*/
-const struct GNUNET_CRYPTO_EcdsaPrivateKey *
+const struct GNUNET_IDENTITY_PrivateKey *
GNUNET_IDENTITY_ego_get_private_key (const struct GNUNET_IDENTITY_Ego *ego)
{
return &ego->pk;
@@ -606,12 +650,11 @@ GNUNET_IDENTITY_ego_get_private_key (const struct
GNUNET_IDENTITY_Ego *ego)
*/
void
GNUNET_IDENTITY_ego_get_public_key (struct GNUNET_IDENTITY_Ego *ego,
- struct GNUNET_CRYPTO_EcdsaPublicKey *pk)
+ struct GNUNET_IDENTITY_PublicKey *pk)
{
if (GNUNET_NO == ego->pub_initialized)
{
- GNUNET_CRYPTO_ecdsa_key_get_public (&ego->pk,
- &ego->pub);
+ GNUNET_IDENTITY_key_get_public (&ego->pk, &ego->pub);
ego->pub_initialized = GNUNET_YES;
}
*pk = ego->pub;
@@ -710,20 +753,11 @@ GNUNET_IDENTITY_set (struct GNUNET_IDENTITY_Handle *h,
}
-/**
- * Create a new identity with the given name.
- *
- * @param h identity service to use
- * @param name desired name
- * @param privkey desired private key or NULL to create one
- * @param cont function to call with the result (will only be called once)
- * @param cont_cls closure for @a cont
- * @return handle to abort the operation
- */
struct GNUNET_IDENTITY_Operation *
GNUNET_IDENTITY_create (struct GNUNET_IDENTITY_Handle *h,
const char *name,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *privkey,
+ const struct GNUNET_IDENTITY_PrivateKey *privkey,
+ enum GNUNET_IDENTITY_KeyType ktype,
GNUNET_IDENTITY_CreateContinuation cont,
void *cont_cls)
{
@@ -749,7 +783,10 @@ GNUNET_IDENTITY_create (struct GNUNET_IDENTITY_Handle *h,
crm->name_len = htons (slen);
crm->reserved = htons (0);
if (NULL == privkey)
- GNUNET_CRYPTO_ecdsa_key_create (&crm->private_key);
+ {
+ GNUNET_assert (GNUNET_OK ==
+ private_key_create (ktype, &crm->private_key));
+ }
else
crm->private_key = *privkey;
op->pk = crm->private_key;
@@ -917,4 +954,316 @@ GNUNET_IDENTITY_disconnect (struct GNUNET_IDENTITY_Handle
*h)
}
+ssize_t
+private_key_get_length (const struct GNUNET_IDENTITY_PrivateKey *key)
+{
+ switch (ntohl (key->type))
+ {
+ case GNUNET_IDENTITY_TYPE_ECDSA:
+ return sizeof (key->type) + sizeof (key->ecdsa_key);
+ break;
+ case GNUNET_IDENTITY_TYPE_EDDSA:
+ return sizeof (key->type) + sizeof (key->eddsa_key);
+ break;
+ default:
+ GNUNET_break (0);
+ }
+ return -1;
+}
+
+
+ssize_t
+GNUNET_IDENTITY_key_get_length (const struct GNUNET_IDENTITY_PublicKey *key)
+{
+ switch (ntohl (key->type))
+ {
+ case GNUNET_IDENTITY_TYPE_ECDSA:
+ return sizeof (key->type) + sizeof (key->ecdsa_key);
+ break;
+ case GNUNET_IDENTITY_TYPE_EDDSA:
+ return sizeof (key->type) + sizeof (key->eddsa_key);
+ break;
+ default:
+ GNUNET_break (0);
+ }
+ return -1;
+}
+
+
+ssize_t
+GNUNET_IDENTITY_read_key_from_buffer (struct GNUNET_IDENTITY_PublicKey *key,
+ const void*buffer,
+ size_t len)
+{
+ if (len < sizeof (key->type))
+ return -1;
+ GNUNET_memcpy (&(key->type), buffer, sizeof (key->type));
+ const ssize_t length = GNUNET_IDENTITY_key_get_length (key);
+ if (len < length)
+ return -1;
+ if (length < 0)
+ return -2;
+ GNUNET_memcpy (&(key->ecdsa_key), buffer + sizeof (key->type), length
+ - sizeof (key->type));
+ return length;
+}
+
+
+ssize_t
+GNUNET_IDENTITY_write_key_to_buffer (const struct
+ GNUNET_IDENTITY_PublicKey *key,
+ void*buffer,
+ size_t len)
+{
+ const ssize_t length = GNUNET_IDENTITY_key_get_length (key);
+ if (len < length)
+ return -1;
+ if (length < 0)
+ return -2;
+ GNUNET_memcpy (buffer, key, length);
+ return length;
+}
+
+
+ssize_t
+GNUNET_IDENTITY_signature_get_length (const struct
+ GNUNET_IDENTITY_Signature *sig)
+{
+ switch (ntohl (sig->type))
+ {
+ case GNUNET_IDENTITY_TYPE_ECDSA:
+ return sizeof (sig->type) + sizeof (sig->ecdsa_signature);
+ break;
+ case GNUNET_IDENTITY_TYPE_EDDSA:
+ return sizeof (sig->type) + sizeof (sig->eddsa_signature);
+ break;
+ default:
+ GNUNET_break (0);
+ }
+ return -1;
+}
+
+
+ssize_t
+GNUNET_IDENTITY_read_signature_from_buffer (struct
+ GNUNET_IDENTITY_Signature *sig,
+ const void*buffer,
+ size_t len)
+{
+ if (len < sizeof (sig->type))
+ return -1;
+ GNUNET_memcpy (&(sig->type), buffer, sizeof (sig->type));
+ const ssize_t length = GNUNET_IDENTITY_signature_get_length (sig);
+ if (len < length)
+ return -1;
+ if (length < 0)
+ return -2;
+ GNUNET_memcpy (&(sig->ecdsa_signature), buffer + sizeof (sig->type), length
+ - sizeof (sig->type));
+ return length;
+}
+
+
+ssize_t
+GNUNET_IDENTITY_write_signature_to_buffer (const struct
+ GNUNET_IDENTITY_Signature *sig,
+ void*buffer,
+ size_t len)
+{
+ const ssize_t length = GNUNET_IDENTITY_signature_get_length (sig);
+ if (len < length)
+ return -1;
+ if (length < 0)
+ return -2;
+ GNUNET_memcpy (buffer, &(sig->type), sizeof (sig->type));
+ GNUNET_memcpy (buffer + sizeof (sig->type), &(sig->ecdsa_signature), length
+ - sizeof (sig->type));
+ return length;
+}
+
+
+int
+GNUNET_IDENTITY_sign_ (const struct
+ GNUNET_IDENTITY_PrivateKey *priv,
+ const struct
+ GNUNET_CRYPTO_EccSignaturePurpose *purpose,
+ struct GNUNET_IDENTITY_Signature *sig)
+{
+ sig->type = priv->type;
+ switch (ntohl (priv->type))
+ {
+ case GNUNET_IDENTITY_TYPE_ECDSA:
+ return GNUNET_CRYPTO_ecdsa_sign_ (&(priv->ecdsa_key), purpose,
+ &(sig->ecdsa_signature));
+ break;
+ case GNUNET_IDENTITY_TYPE_EDDSA:
+ return GNUNET_CRYPTO_eddsa_sign_ (&(priv->eddsa_key), purpose,
+ &(sig->eddsa_signature));
+ break;
+ default:
+ GNUNET_break (0);
+ }
+
+ return GNUNET_SYSERR;
+}
+
+
+int
+GNUNET_IDENTITY_signature_verify_ (uint32_t purpose,
+ const struct
+ GNUNET_CRYPTO_EccSignaturePurpose *validate,
+ const struct GNUNET_IDENTITY_Signature *sig,
+ const struct GNUNET_IDENTITY_PublicKey *pub)
+{
+ /* check type matching of 'sig' and 'pub' */
+ GNUNET_assert (ntohl (pub->type) == ntohl (sig->type));
+ switch (ntohl (pub->type))
+ {
+ case GNUNET_IDENTITY_TYPE_ECDSA:
+ return GNUNET_CRYPTO_ecdsa_verify_ (purpose, validate,
+ &(sig->ecdsa_signature),
+ &(pub->ecdsa_key));
+ break;
+ case GNUNET_IDENTITY_TYPE_EDDSA:
+ return GNUNET_CRYPTO_eddsa_verify_ (purpose, validate,
+ &(sig->eddsa_signature),
+ &(pub->eddsa_key));
+ break;
+ default:
+ GNUNET_break (0);
+ }
+
+ return GNUNET_SYSERR;
+}
+
+
+ssize_t
+GNUNET_IDENTITY_encrypt (const void *block,
+ size_t size,
+ const struct GNUNET_IDENTITY_PublicKey *pub,
+ struct GNUNET_CRYPTO_EcdhePublicKey *ecc,
+ void *result)
+{
+ struct GNUNET_CRYPTO_EcdhePrivateKey pk;
+ GNUNET_CRYPTO_ecdhe_key_create (&pk);
+ struct GNUNET_HashCode hash;
+ switch (ntohl (pub->type))
+ {
+ case GNUNET_IDENTITY_TYPE_ECDSA:
+ if (GNUNET_SYSERR == GNUNET_CRYPTO_ecdh_ecdsa (&pk, &(pub->ecdsa_key),
+ &hash))
+ return -1;
+ break;
+ case GNUNET_IDENTITY_TYPE_EDDSA:
+ if (GNUNET_SYSERR == GNUNET_CRYPTO_ecdh_eddsa (&pk, &(pub->eddsa_key),
+ &hash))
+ return -1;
+ break;
+ default:
+ return -1;
+ }
+ GNUNET_CRYPTO_ecdhe_key_get_public (&pk, ecc);
+ GNUNET_CRYPTO_ecdhe_key_clear (&pk);
+ struct GNUNET_CRYPTO_SymmetricSessionKey key;
+ struct GNUNET_CRYPTO_SymmetricInitializationVector iv;
+ GNUNET_CRYPTO_hash_to_aes_key (&hash, &key, &iv);
+ GNUNET_CRYPTO_zero_keys (&hash, sizeof(hash));
+ const ssize_t encrypted = GNUNET_CRYPTO_symmetric_encrypt (block, size, &key,
+ &iv, result);
+ GNUNET_CRYPTO_zero_keys (&key, sizeof(key));
+ GNUNET_CRYPTO_zero_keys (&iv, sizeof(iv));
+ return encrypted;
+}
+
+
+ssize_t
+GNUNET_IDENTITY_decrypt (const void *block,
+ size_t size,
+ const struct GNUNET_IDENTITY_PrivateKey *priv,
+ const struct GNUNET_CRYPTO_EcdhePublicKey *ecc,
+ void *result)
+{
+ struct GNUNET_HashCode hash;
+ switch (ntohl (priv->type))
+ {
+ case GNUNET_IDENTITY_TYPE_ECDSA:
+ if (GNUNET_SYSERR == GNUNET_CRYPTO_ecdsa_ecdh (&(priv->ecdsa_key), ecc,
+ &hash))
+ return -1;
+ break;
+ case GNUNET_IDENTITY_TYPE_EDDSA:
+ if (GNUNET_SYSERR == GNUNET_CRYPTO_eddsa_ecdh (&(priv->eddsa_key), ecc,
+ &hash))
+ return -1;
+ break;
+ default:
+ return -1;
+ }
+ struct GNUNET_CRYPTO_SymmetricSessionKey key;
+ struct GNUNET_CRYPTO_SymmetricInitializationVector iv;
+ GNUNET_CRYPTO_hash_to_aes_key (&hash, &key, &iv);
+ GNUNET_CRYPTO_zero_keys (&hash, sizeof(hash));
+ const ssize_t decrypted = GNUNET_CRYPTO_symmetric_decrypt (block, size, &key,
+ &iv, result);
+ GNUNET_CRYPTO_zero_keys (&key, sizeof(key));
+ GNUNET_CRYPTO_zero_keys (&iv, sizeof(iv));
+ return decrypted;
+}
+
+
+char *
+GNUNET_IDENTITY_public_key_to_string (const struct
+ GNUNET_IDENTITY_PublicKey *key)
+{
+ size_t size = GNUNET_IDENTITY_key_get_length (key);
+ return GNUNET_STRINGS_data_to_string_alloc (key,
+ size);
+}
+
+
+char *
+GNUNET_IDENTITY_private_key_to_string (const struct
+ GNUNET_IDENTITY_PrivateKey *key)
+{
+ size_t size = private_key_get_length (key);
+ return GNUNET_STRINGS_data_to_string_alloc (key,
+ size);
+}
+
+
+enum GNUNET_GenericReturnValue
+GNUNET_IDENTITY_public_key_from_string (const char *str,
+ struct GNUNET_IDENTITY_PublicKey *key)
+{
+ enum GNUNET_GenericReturnValue ret;
+ enum GNUNET_IDENTITY_KeyType ktype;
+ ret = GNUNET_STRINGS_string_to_data (str,
+ strlen (str),
+ key,
+ sizeof (*key));
+ if (GNUNET_OK != ret)
+ return GNUNET_SYSERR;
+ ktype = ntohl (key->type);
+ return (GNUNET_IDENTITY_TYPE_ECDSA == ktype) ? GNUNET_OK : GNUNET_SYSERR; //
FIXME other keys, cleaner way?
+
+}
+
+
+enum GNUNET_GenericReturnValue
+GNUNET_IDENTITY_private_key_from_string (const char *str,
+ struct GNUNET_IDENTITY_PrivateKey
*key)
+{
+ enum GNUNET_GenericReturnValue ret;
+ enum GNUNET_IDENTITY_KeyType ktype;
+ ret = GNUNET_STRINGS_string_to_data (str,
+ strlen (str),
+ key,
+ sizeof (*key));
+ if (GNUNET_OK != ret)
+ return GNUNET_SYSERR;
+ ktype = ntohl (key->type);
+ return (GNUNET_IDENTITY_TYPE_ECDSA == ktype) ? GNUNET_OK : GNUNET_SYSERR; //
FIXME other keys, cleaner way?
+}
+
+
/* end of identity_api.c */
diff --git a/src/identity/identity_api_lookup.c
b/src/identity/identity_api_lookup.c
index 26b1eacd7..51afb2515 100644
--- a/src/identity/identity_api_lookup.c
+++ b/src/identity/identity_api_lookup.c
@@ -127,14 +127,12 @@ handle_identity_update (void *cls, const struct
UpdateMessage *um)
struct GNUNET_IDENTITY_EgoLookup *el = cls;
uint16_t name_len = ntohs (um->name_len);
const char *str = (0 == name_len) ? NULL : (const char *) &um[1];
- struct GNUNET_CRYPTO_EcdsaPublicKey pub;
struct GNUNET_HashCode id;
struct GNUNET_IDENTITY_Ego ego;
memset (&ego, 0, sizeof (ego));
GNUNET_break (GNUNET_YES != ntohs (um->end_of_list));
- GNUNET_CRYPTO_ecdsa_key_get_public (&um->private_key, &pub);
- GNUNET_CRYPTO_hash (&pub, sizeof(pub), &id);
+ GNUNET_CRYPTO_hash (&um->private_key, sizeof(um->private_key), &id);
ego.pk = um->private_key;
ego.name = (char *) str;
ego.id = id;
diff --git a/src/identity/plugin_rest_identity.c
b/src/identity/plugin_rest_identity.c
index d86d29e36..dba1d478d 100644
--- a/src/identity/plugin_rest_identity.c
+++ b/src/identity/plugin_rest_identity.c
@@ -384,7 +384,7 @@ ego_get_for_subsystem (void *cls,
{
struct RequestHandle *handle = cls;
struct MHD_Response *resp;
- struct GNUNET_CRYPTO_EcdsaPublicKey public_key;
+ struct GNUNET_IDENTITY_PublicKey public_key;
json_t *json_root;
char *result_str;
char *public_key_string;
@@ -398,7 +398,7 @@ ego_get_for_subsystem (void *cls,
}
GNUNET_IDENTITY_ego_get_public_key (ego, &public_key);
- public_key_string = GNUNET_CRYPTO_ecdsa_public_key_to_string (&public_key);
+ public_key_string = GNUNET_IDENTITY_public_key_to_string (&public_key);
// create json with subsystem identity
json_root = json_object ();
@@ -496,7 +496,7 @@ ego_get_all (struct GNUNET_REST_RequestHandle *con_handle,
GNUNET_CONTAINER_multihashmap_contains (
handle->rest_handle->url_param_map, &key))
{
- privkey_str = GNUNET_CRYPTO_ecdsa_private_key_to_string (
+ privkey_str = GNUNET_IDENTITY_private_key_to_string (
GNUNET_IDENTITY_ego_get_private_key (ego_entry->ego));
json_object_set_new (json_ego,
GNUNET_REST_IDENTITY_PARAM_PRIVKEY,
@@ -549,7 +549,7 @@ ego_get_response (struct RequestHandle *handle, struct
EgoEntry *ego_entry)
GNUNET_CONTAINER_multihashmap_contains (
handle->rest_handle->url_param_map, &key))
{
- privkey_str = GNUNET_CRYPTO_ecdsa_private_key_to_string (
+ privkey_str = GNUNET_IDENTITY_private_key_to_string (
GNUNET_IDENTITY_ego_get_private_key (ego_entry->ego));
json_object_set_new (json_ego,
GNUNET_REST_IDENTITY_PARAM_PRIVKEY,
@@ -686,7 +686,7 @@ do_finished (void *cls, const char *emsg)
*/
static void
do_finished_create (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *pk,
+ const struct GNUNET_IDENTITY_PrivateKey *pk,
const char *emsg)
{
struct RequestHandle *handle = cls;
@@ -999,8 +999,8 @@ ego_create (struct GNUNET_REST_RequestHandle *con_handle,
json_error_t err;
char *egoname;
char *privkey;
- struct GNUNET_CRYPTO_EcdsaPrivateKey pk;
- struct GNUNET_CRYPTO_EcdsaPrivateKey *pk_ptr;
+ struct GNUNET_IDENTITY_PrivateKey pk;
+ struct GNUNET_IDENTITY_PrivateKey *pk_ptr;
int json_unpack_state;
char term_data[handle->data_size + 1];
@@ -1074,7 +1074,7 @@ ego_create (struct GNUNET_REST_RequestHandle *con_handle,
strlen (privkey),
&pk,
sizeof(struct
- GNUNET_CRYPTO_EcdsaPrivateKey));
+ GNUNET_IDENTITY_PrivateKey));
pk_ptr = &pk;
}
else
@@ -1084,6 +1084,7 @@ ego_create (struct GNUNET_REST_RequestHandle *con_handle,
handle->op = GNUNET_IDENTITY_create (identity_handle,
handle->name,
pk_ptr,
+ GNUNET_IDENTITY_TYPE_ECDSA,
&do_finished_create,
handle);
}
@@ -1208,7 +1209,7 @@ list_ego (void *cls,
const char *identifier)
{
struct EgoEntry *ego_entry;
- struct GNUNET_CRYPTO_EcdsaPublicKey pk;
+ struct GNUNET_IDENTITY_PublicKey pk;
if ((NULL == ego) && (ID_REST_STATE_INIT == state))
{
@@ -1219,7 +1220,7 @@ list_ego (void *cls,
{
ego_entry = GNUNET_new (struct EgoEntry);
GNUNET_IDENTITY_ego_get_public_key (ego, &pk);
- ego_entry->keystring = GNUNET_CRYPTO_ecdsa_public_key_to_string (&pk);
+ ego_entry->keystring = GNUNET_IDENTITY_public_key_to_string (&pk);
ego_entry->ego = ego;
ego_entry->identifier = GNUNET_strdup (identifier);
GNUNET_CONTAINER_DLL_insert_tail (ego_head,
@@ -1245,7 +1246,7 @@ list_ego (void *cls,
/* Add */
ego_entry = GNUNET_new (struct EgoEntry);
GNUNET_IDENTITY_ego_get_public_key (ego, &pk);
- ego_entry->keystring = GNUNET_CRYPTO_ecdsa_public_key_to_string (&pk);
+ ego_entry->keystring = GNUNET_IDENTITY_public_key_to_string (&pk);
ego_entry->ego = ego;
ego_entry->identifier = GNUNET_strdup (identifier);
GNUNET_CONTAINER_DLL_insert_tail (ego_head,
diff --git a/src/identity/test_identity.c b/src/identity/test_identity.c
index 37eeab238..4954fe7be 100644
--- a/src/identity/test_identity.c
+++ b/src/identity/test_identity.c
@@ -253,7 +253,7 @@ success_rename_cont (void *cls, const char *emsg)
*/
static void
create_cb (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *pk,
+ const struct GNUNET_IDENTITY_PrivateKey *pk,
const char *emsg)
{
CHECK (NULL != pk);
@@ -279,7 +279,11 @@ run (void *cls,
GNUNET_SCHEDULER_add_shutdown (&cleanup, NULL);
h = GNUNET_IDENTITY_connect (cfg, ¬ification_cb, NULL);
CHECK (NULL != h);
- op = GNUNET_IDENTITY_create (h, "test-id", NULL, &create_cb, NULL);
+ op = GNUNET_IDENTITY_create (h,
+ "test-id",
+ NULL,
+ GNUNET_IDENTITY_TYPE_ECDSA,
+ &create_cb, NULL);
}
diff --git a/src/identity/test_identity_defaults.c
b/src/identity/test_identity_defaults.c
index 53eec1252..2d5244d1b 100644
--- a/src/identity/test_identity_defaults.c
+++ b/src/identity/test_identity_defaults.c
@@ -241,7 +241,7 @@ notification_cb (void *cls,
*/
static void
create_cb (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *pk,
+ const struct GNUNET_IDENTITY_PrivateKey *pk,
const char *emsg)
{
CHECK (NULL == emsg);
@@ -266,7 +266,11 @@ run_set (void *cls,
GNUNET_SCHEDULER_add_shutdown (&cleanup, NULL);
h = GNUNET_IDENTITY_connect (cfg, ¬ification_cb, NULL);
CHECK (NULL != h);
- op = GNUNET_IDENTITY_create (h, "test-id", NULL, &create_cb, NULL);
+ op = GNUNET_IDENTITY_create (h,
+ "test-id",
+ NULL,
+ GNUNET_IDENTITY_TYPE_ECDSA,
+ &create_cb, NULL);
}
diff --git a/src/include/Makefile.am b/src/include/Makefile.am
index 202abb7ac..fc3d745a6 100644
--- a/src/include/Makefile.am
+++ b/src/include/Makefile.am
@@ -62,6 +62,7 @@ gnunetinclude_HEADERS = \
gnunet_json_lib.h \
gnunet_load_lib.h \
gnunet_cadet_service.h \
+ gnunet_messenger_service.h \
gnunet_mhd_compat.h \
gnunet_microphone_lib.h \
gnunet_mst_lib.h \
diff --git a/src/include/gnunet_buffer_lib.h b/src/include/gnunet_buffer_lib.h
index 0c566df75..7239eccfb 100644
--- a/src/include/gnunet_buffer_lib.h
+++ b/src/include/gnunet_buffer_lib.h
@@ -147,7 +147,8 @@ GNUNET_buffer_write_path (struct GNUNET_Buffer *buf, const
char *str);
* @param ... format arguments
*/
void
-GNUNET_buffer_write_fstr (struct GNUNET_Buffer *buf, const char *fmt, ...);
+GNUNET_buffer_write_fstr (struct GNUNET_Buffer *buf, const char *fmt, ...)
+__attribute__ ((format (printf, 2, 3)));
/**
diff --git a/src/include/gnunet_common.h b/src/include/gnunet_common.h
index fcaae1026..21b87b0f5 100644
--- a/src/include/gnunet_common.h
+++ b/src/include/gnunet_common.h
@@ -488,7 +488,8 @@ void
GNUNET_log_from_nocheck (enum GNUNET_ErrorType kind,
const char *comp,
const char *message,
- ...);
+ ...)
+__attribute__ ((format (printf, 3, 4)));
#if ! defined(GNUNET_CULL_LOGGING)
#define GNUNET_log_from(kind, comp, ...) \
@@ -1445,6 +1446,7 @@ GNUNET_is_zero_ (const void *a,
memcpy (&(arr1) [(len1) - (len2)], _a2, (len2) * sizeof (*arr1)); \
} while (0)
+
/**
* @ingroup memory
* Like snprintf, just aborts if the buffer is of insufficient size.
@@ -1456,7 +1458,11 @@ GNUNET_is_zero_ (const void *a,
* @return number of bytes written to buf or negative value on error
*/
int
-GNUNET_snprintf (char *buf, size_t size, const char *format, ...);
+GNUNET_snprintf (char *buf,
+ size_t size,
+ const char *format,
+ ...)
+__attribute__ ((format (printf, 3, 4)));
/**
@@ -1469,7 +1475,10 @@ GNUNET_snprintf (char *buf, size_t size, const char
*format, ...);
* @return number of bytes in "*buf" excluding 0-termination
*/
int
-GNUNET_asprintf (char **buf, const char *format, ...);
+GNUNET_asprintf (char **buf,
+ const char *format,
+ ...)
+__attribute__ ((format (printf, 2, 3)));
/* ************** internal implementations, use macros above! ************** */
diff --git a/src/include/gnunet_conversation_service.h
b/src/include/gnunet_conversation_service.h
index 4566caad0..be5a81cfb 100644
--- a/src/include/gnunet_conversation_service.h
+++ b/src/include/gnunet_conversation_service.h
@@ -147,7 +147,7 @@ typedef void
struct GNUNET_CONVERSATION_Caller *
caller,
const struct
- GNUNET_CRYPTO_EcdsaPublicKey
*caller_id);
+ GNUNET_IDENTITY_PublicKey *caller_id);
/**
diff --git a/src/include/gnunet_crypto_lib.h b/src/include/gnunet_crypto_lib.h
index 03fb16a43..2bbf2b1e7 100644
--- a/src/include/gnunet_crypto_lib.h
+++ b/src/include/gnunet_crypto_lib.h
@@ -1700,7 +1700,7 @@ GNUNET_CRYPTO_eddsa_sign_ (
*/
#define GNUNET_CRYPTO_eddsa_sign(priv,ps,sig) do { \
/* check size is set correctly */ \
- GNUNET_assert (htonl ((ps)->purpose.size) == sizeof (*ps)); \
+ GNUNET_assert (ntohl ((ps)->purpose.size) == sizeof (*ps)); \
/* check 'ps' begins with the purpose */ \
GNUNET_static_assert (((void*) (ps)) == \
((void*) &(ps)->purpose)); \
@@ -1747,7 +1747,7 @@ GNUNET_CRYPTO_ecdsa_sign_ (
*/
#define GNUNET_CRYPTO_ecdsa_sign(priv,ps,sig) do { \
/* check size is set correctly */ \
- GNUNET_assert (htonl ((ps)->purpose.size) == sizeof (*(ps))); \
+ GNUNET_assert (ntohl ((ps)->purpose.size) == sizeof (*(ps))); \
/* check 'ps' begins with the purpose */ \
GNUNET_static_assert (((void*) (ps)) == \
((void*) &(ps)->purpose)); \
@@ -1853,7 +1853,7 @@ GNUNET_CRYPTO_ecdsa_verify_ (
*/
#define GNUNET_CRYPTO_ecdsa_verify(purp,ps,sig,pub) ({ \
/* check size is set correctly */ \
- GNUNET_assert (htonl ((ps)->purpose.size) == sizeof (*(ps))); \
+ GNUNET_assert (ntohl ((ps)->purpose.size) == sizeof (*(ps))); \
/* check 'ps' begins with the purpose */ \
GNUNET_static_assert (((void*) (ps)) == \
((void*) &(ps)->purpose)); \
diff --git a/src/include/gnunet_gns_service.h b/src/include/gnunet_gns_service.h
index ef81e9a88..3f6c9b9aa 100644
--- a/src/include/gnunet_gns_service.h
+++ b/src/include/gnunet_gns_service.h
@@ -36,6 +36,7 @@
#include "gnunet_util_lib.h"
#include "gnunet_dnsparser_lib.h"
+#include "gnunet_identity_service.h"
#include "gnunet_namestore_service.h"
#ifdef __cplusplus
@@ -139,7 +140,7 @@ enum GNUNET_GNS_LocalOptions
struct GNUNET_GNS_LookupRequest *
GNUNET_GNS_lookup (struct GNUNET_GNS_Handle *handle,
const char *name,
- const struct GNUNET_CRYPTO_EcdsaPublicKey *zone,
+ const struct GNUNET_IDENTITY_PublicKey *zone,
uint32_t type,
enum GNUNET_GNS_LocalOptions options,
GNUNET_GNS_LookupResultProcessor proc,
@@ -163,7 +164,7 @@ GNUNET_GNS_lookup (struct GNUNET_GNS_Handle *handle,
struct GNUNET_GNS_LookupRequest *
GNUNET_GNS_lookup_limited (struct GNUNET_GNS_Handle *handle,
const char *name,
- const struct GNUNET_CRYPTO_EcdsaPublicKey *zone,
+ const struct GNUNET_IDENTITY_PublicKey *zone,
uint32_t type,
enum GNUNET_GNS_LocalOptions options,
uint16_t recursion_depth_limit,
diff --git a/src/include/gnunet_gnsrecord_json_lib.h
b/src/include/gnunet_gnsrecord_json_lib.h
new file mode 100644
index 000000000..966461705
--- /dev/null
+++ b/src/include/gnunet_gnsrecord_json_lib.h
@@ -0,0 +1,73 @@
+/*
+ This file is part of GNUnet
+ Copyright (C) 2012, 2013 GNUnet e.V.
+
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
+ */
+
+/**
+ * @author Martin Schanzenbach
+ *
+ * @file
+ * API that can be used to manipulate JSON GNS record data
+ *
+ * @defgroup gnsrecord GNS Record library
+ * Manipulate GNS record data
+ *
+ * @see [Documentation](https://gnunet.org/gns-plugins)
+ *
+ * @{
+ */
+#ifndef GNUNET_GNSRECORD_JSON_LIB_H
+#define GNUNET_GNSRECORD_JSON_LIB_H
+
+#include "gnunet_gnsrecord_lib.h"
+#include "gnunet_json_lib.h"
+
+#ifdef __cplusplus
+extern "C" {
+#if 0 /* keep Emacsens' auto-indent happy */
+}
+#endif
+#endif
+
+
+/**
+ * JSON Specification for GNS Records.
+ *
+ * @param gnsrecord_object struct of GNUNET_GNSRECORD_Data to fill
+ * @return JSON Specification
+ */
+struct GNUNET_JSON_Specification
+GNUNET_GNSRECORD_JSON_spec_gnsrecord (struct GNUNET_GNSRECORD_Data **rd,
+ unsigned int *rd_count,
+ char **name);
+
+
+/**
+ * Convert GNS record to JSON.
+ *
+ * @param rname name of record
+ * @param rd record data
+ * @return corresponding JSON encoding
+ */
+json_t *
+GNUNET_GNSRECORD_JSON_from_gnsrecord (const char*rname,
+ const struct GNUNET_GNSRECORD_Data *rd,
+ unsigned int rd_count);
+
+
+#endif
diff --git a/src/include/gnunet_gnsrecord_lib.h
b/src/include/gnunet_gnsrecord_lib.h
index 960203fb1..0bf2ceed7 100644
--- a/src/include/gnunet_gnsrecord_lib.h
+++ b/src/include/gnunet_gnsrecord_lib.h
@@ -34,6 +34,8 @@
#ifndef GNUNET_GNSRECORD_LIB_H
#define GNUNET_GNSRECORD_LIB_H
+#include "gnunet_identity_service.h"
+
#ifdef __cplusplus
extern "C" {
#if 0 /* keep Emacsens' auto-indent happy */
@@ -55,7 +57,7 @@ extern "C" {
/**
* Record type for GNS zone transfer ("PKEY").
*/
-#define GNUNET_GNSRECORD_TYPE_PKEY 65536
+#define GNUNET_GNSRECORD_TYPE_PKEY GNUNET_IDENTITY_TYPE_ECDSA
/**
* Record type for GNS nick names ("NICK").
@@ -151,6 +153,11 @@ extern "C" {
*/
#define GNUNET_GNSRECORD_TYPE_RECLAIM_PRESENTATION 65555
+/**
+ * Record type for EDKEY delegations.
+ */
+#define GNUNET_GNSRECORD_TYPE_EDKEY GNUNET_IDENTITY_TYPE_EDDSA
+
/**
* Flags that can be set for a record.
@@ -261,21 +268,20 @@ struct GNUNET_GNSRECORD_PlaceData
/* Followed by struct GNUNET_PeerIdentity relays[relay_count] */
};
-
/**
* Information we have in an encrypted block with record data (i.e. in the
DHT).
*/
-struct GNUNET_GNSRECORD_Block
+struct GNUNET_GNSRECORD_EcdsaBlock
{
/**
- * Signature of the block.
+ * Derived key used for signing; hash of this is the query.
*/
- struct GNUNET_CRYPTO_EcdsaSignature signature;
+ struct GNUNET_CRYPTO_EcdsaPublicKey derived_key;
/**
- * Derived key used for signing; hash of this is the query.
+ * Signature of the block.
*/
- struct GNUNET_CRYPTO_EcdsaPublicKey derived_key;
+ struct GNUNET_CRYPTO_EcdsaSignature signature;
/**
* Number of bytes signed; also specifies the number of bytes
@@ -291,6 +297,17 @@ struct GNUNET_GNSRECORD_Block
/* followed by encrypted data */
};
+struct GNUNET_GNSRECORD_Block
+{
+ uint32_t type;
+
+ union
+ {
+ struct GNUNET_GNSRECORD_EcdsaBlock ecdsa_block;
+ //struct GNUNET_GNSRECORD_EddsaBlock eddsa_block;
+ };
+};
+
/**
* Record type used to box up SRV and TLSA records. For example, a
@@ -335,7 +352,7 @@ struct GNUNET_GNSRECORD_ReverseRecord
/**
* The public key of the namespace the is delegating to our namespace
*/
- struct GNUNET_CRYPTO_EcdsaPublicKey pkey;
+ struct GNUNET_IDENTITY_PublicKey pkey;
/**
* The expiration time of the delegation
@@ -488,7 +505,7 @@ GNUNET_GNSRECORD_string_to_lowercase (const char *src);
* #GNUNET_GNSRECORD_z2s.
*/
const char *
-GNUNET_GNSRECORD_z2s (const struct GNUNET_CRYPTO_EcdsaPublicKey *z);
+GNUNET_GNSRECORD_z2s (const struct GNUNET_IDENTITY_PublicKey *z);
/**
@@ -502,7 +519,7 @@ GNUNET_GNSRECORD_z2s (const struct
GNUNET_CRYPTO_EcdsaPublicKey *z);
* key in an encoding suitable for DNS labels.
*/
const char *
-GNUNET_GNSRECORD_pkey_to_zkey (const struct GNUNET_CRYPTO_EcdsaPublicKey
*pkey);
+GNUNET_GNSRECORD_pkey_to_zkey (const struct GNUNET_IDENTITY_PublicKey *pkey);
/**
@@ -516,7 +533,7 @@ GNUNET_GNSRECORD_pkey_to_zkey (const struct
GNUNET_CRYPTO_EcdsaPublicKey *pkey);
*/
int
GNUNET_GNSRECORD_zkey_to_pkey (const char *zkey,
- struct GNUNET_CRYPTO_EcdsaPublicKey *pkey);
+ struct GNUNET_IDENTITY_PublicKey *pkey);
/**
@@ -528,7 +545,7 @@ GNUNET_GNSRECORD_zkey_to_pkey (const char *zkey,
*/
void
GNUNET_GNSRECORD_query_from_private_key (
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone, const char *label,
+ const struct GNUNET_IDENTITY_PrivateKey *zone, const char *label,
struct GNUNET_HashCode *query);
@@ -541,7 +558,7 @@ GNUNET_GNSRECORD_query_from_private_key (
*/
void
GNUNET_GNSRECORD_query_from_public_key (
- const struct GNUNET_CRYPTO_EcdsaPublicKey *pub, const char *label,
+ const struct GNUNET_IDENTITY_PublicKey *pub, const char *label,
struct GNUNET_HashCode *query);
@@ -555,7 +572,7 @@ GNUNET_GNSRECORD_query_from_public_key (
* @param rd_count number of records in @a rd
*/
struct GNUNET_GNSRECORD_Block *
-GNUNET_GNSRECORD_block_create (const struct GNUNET_CRYPTO_EcdsaPrivateKey *key,
+GNUNET_GNSRECORD_block_create (const struct GNUNET_IDENTITY_PrivateKey *key,
struct GNUNET_TIME_Absolute expire,
const char *label,
const struct GNUNET_GNSRECORD_Data *rd,
@@ -574,7 +591,7 @@ GNUNET_GNSRECORD_block_create (const struct
GNUNET_CRYPTO_EcdsaPrivateKey *key,
* @param rd_count number of records in @a rd
*/
struct GNUNET_GNSRECORD_Block *
-GNUNET_GNSRECORD_block_create2 (const struct GNUNET_CRYPTO_EcdsaPrivateKey
*key,
+GNUNET_GNSRECORD_block_create2 (const struct GNUNET_IDENTITY_PrivateKey *key,
struct GNUNET_TIME_Absolute expire,
const char *label,
const struct GNUNET_GNSRECORD_Data *rd,
@@ -606,7 +623,7 @@ GNUNET_GNSRECORD_block_verify (const struct
GNUNET_GNSRECORD_Block *block);
int
GNUNET_GNSRECORD_block_decrypt (
const struct GNUNET_GNSRECORD_Block *block,
- const struct GNUNET_CRYPTO_EcdsaPublicKey *zone_key, const char *label,
+ const struct GNUNET_IDENTITY_PublicKey *zone_key, const char *label,
GNUNET_GNSRECORD_RecordCallback proc, void *proc_cls);
@@ -636,6 +653,82 @@ GNUNET_GNSRECORD_record_get_expiration_time (
unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd);
+/**
+ * Returns the length of this block in bytes.
+ * Block length strongly depends on the zone type.
+ *
+ * @param block the block.
+ * @return the length of this block in bytes
+ */
+size_t
+GNUNET_GNSRECORD_block_get_size (const struct GNUNET_GNSRECORD_Block *block);
+
+/**
+ * Returns the expiration of a block.
+ *
+ * @param block the block.
+ * @return the block expiration.
+ */
+struct GNUNET_TIME_Absolute
+GNUNET_GNSRECORD_block_get_expiration (const struct GNUNET_GNSRECORD_Block
*block);
+
+
+/**
+ * Builds the query hash from a block.
+ *
+ * @param block the block.
+ * @param query where to write the query hash.
+ * @return GNUNET_SYSERR on error.
+ */
+enum GNUNET_GenericReturnValue
+GNUNET_GNSRECORD_query_from_block (const struct GNUNET_GNSRECORD_Block *block,
+ struct GNUNET_HashCode *query);
+
+
+/**
+ * Build a #GNUNET_GNSRECORD_PublicKey from
+ * zone delegation resource record data.
+ *
+ * @param data the record data-
+ * @param data_size the data size.
+ * @param type the record type
+ * @param key the identity key to store the data in (must be allocated).
+ * @return GNUNET_OK if successful.
+ */
+enum GNUNET_GenericReturnValue
+GNUNET_GNSRECORD_identity_from_data (const char *data,
+ size_t data_size,
+ uint32_t type,
+ struct GNUNET_IDENTITY_PublicKey *key);
+
+
+/**
+ * Create record data and size from an identity key.
+ *
+ * @param key the identity key to use.
+ * @param data the record data (will be allocated)
+ * @param data_size the allocated data size.
+ * @param type the resulting record type
+ * @return GNUNET_OK if successful.
+ */
+enum GNUNET_GenericReturnValue
+GNUNET_GNSRECORD_data_from_identity (const struct GNUNET_IDENTITY_PublicKey
*key,
+ char **data,
+ size_t *data_size,
+ uint32_t *type);
+
+
+/**
+ * Check if this type is one of the supported GNS zone
+ * types.
+ *
+ * @param type the type to check
+ * @return GNUNET_YES if it is one of the supported types.
+ */
+enum GNUNET_GenericReturnValue
+GNUNET_GNSRECORD_is_zonekey_type (uint32_t type);
+
+
#if 0 /* keep Emacsens' auto-indent happy */
{
#endif
diff --git a/src/include/gnunet_identity_service.h
b/src/include/gnunet_identity_service.h
index 94127248e..2974568db 100644
--- a/src/include/gnunet_identity_service.h
+++ b/src/include/gnunet_identity_service.h
@@ -57,6 +57,21 @@ extern "C" {
*/
#define GNUNET_IDENTITY_VERSION 0x00000100
+enum GNUNET_IDENTITY_KeyType
+{
+ /**
+ * The identity type. The value is the same as the
+ * PKEY record type.
+ */
+ GNUNET_IDENTITY_TYPE_ECDSA = 65536,
+
+ /**
+ * EDDSA identity. The value is the same as the EDKEY
+ * record type.
+ */
+ GNUNET_IDENTITY_TYPE_EDDSA = 65556
+};
+
/**
* Handle to access the identity service.
*/
@@ -67,6 +82,88 @@ struct GNUNET_IDENTITY_Handle;
*/
struct GNUNET_IDENTITY_Ego;
+
+/**
+ * A private key for an identity as per LSD0001.
+ */
+struct GNUNET_IDENTITY_PrivateKey
+{
+ /**
+ * Type of public key.
+ * Defined by the GNS zone type value.
+ * In NBO.
+ */
+ uint32_t type;
+
+ union
+ {
+ /**
+ * An ECDSA identity key.
+ */
+ struct GNUNET_CRYPTO_EcdsaPrivateKey ecdsa_key;
+
+ /**
+ * AN EdDSA identtiy key
+ */
+ struct GNUNET_CRYPTO_EddsaPrivateKey eddsa_key;
+ };
+};
+
+
+/**
+ * An identity key as per LSD0001.
+ */
+struct GNUNET_IDENTITY_PublicKey
+{
+ /**
+ * Type of public key.
+ * Defined by the GNS zone type value.
+ * In NBO.
+ */
+ uint32_t type;
+
+ union
+ {
+ /**
+ * An ECDSA identity key.
+ */
+ struct GNUNET_CRYPTO_EcdsaPublicKey ecdsa_key;
+
+ /**
+ * AN EdDSA identtiy key
+ */
+ struct GNUNET_CRYPTO_EddsaPublicKey eddsa_key;
+ };
+};
+
+
+/**
+ * An identity signature as per LSD0001.
+ */
+struct GNUNET_IDENTITY_Signature
+{
+ /**
+ * Type of signature.
+ * Defined by the GNS zone type value.
+ * In NBO.
+ */
+ uint32_t type;
+
+ union
+ {
+ /**
+ * An ECDSA signature
+ */
+ struct GNUNET_CRYPTO_EcdsaSignature ecdsa_signature;
+
+ /**
+ * AN EdDSA signature
+ */
+ struct GNUNET_CRYPTO_EddsaSignature eddsa_signature;
+ };
+};
+
+
/**
* Handle for an operation with the identity service.
*/
@@ -79,7 +176,7 @@ struct GNUNET_IDENTITY_Operation;
* @param ego the ego
* @return associated ECC key, valid as long as the ego is valid
*/
-const struct GNUNET_CRYPTO_EcdsaPrivateKey *
+const struct GNUNET_IDENTITY_PrivateKey *
GNUNET_IDENTITY_ego_get_private_key (const struct GNUNET_IDENTITY_Ego *ego);
@@ -100,7 +197,7 @@ GNUNET_IDENTITY_ego_get_anonymous (void);
*/
void
GNUNET_IDENTITY_ego_get_public_key (struct GNUNET_IDENTITY_Ego *ego,
- struct GNUNET_CRYPTO_EcdsaPublicKey *pk);
+ struct GNUNET_IDENTITY_PublicKey *pk);
/**
@@ -224,7 +321,7 @@ GNUNET_IDENTITY_disconnect (struct GNUNET_IDENTITY_Handle
*h);
typedef void
(*GNUNET_IDENTITY_CreateContinuation) (
void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *pk,
+ const struct GNUNET_IDENTITY_PrivateKey *pk,
const char *emsg);
@@ -234,6 +331,7 @@ typedef void
* @param id identity service to use
* @param name desired name
* @param privkey desired private key or NULL to create one
+ * @param ktype the type of key to create. Ignored if privkey != NULL.
* @param cont function to call with the result (will only be called once)
* @param cont_cls closure for @a cont
* @return handle to abort the operation
@@ -241,7 +339,8 @@ typedef void
struct GNUNET_IDENTITY_Operation *
GNUNET_IDENTITY_create (struct GNUNET_IDENTITY_Handle *id,
const char *name,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *privkey,
+ const struct GNUNET_IDENTITY_PrivateKey *privkey,
+ enum GNUNET_IDENTITY_KeyType ktype,
GNUNET_IDENTITY_CreateContinuation cont,
void *cont_cls);
@@ -292,6 +391,319 @@ void
GNUNET_IDENTITY_cancel (struct GNUNET_IDENTITY_Operation *op);
+/**
+ * Get the compacted length of a #GNUNET_IDENTITY_PublicKey.
+ * Compacted means that it returns the minimum number of bytes this
+ * key is long, as opposed to the union structure inside
+ * #GNUNET_IDENTITY_PublicKey.
+ * Useful for compact serializations.
+ *
+ * @param key the key.
+ * @return -1 on error, else the compacted length of the key.
+ */
+ssize_t
+GNUNET_IDENTITY_key_get_length (const struct GNUNET_IDENTITY_PublicKey *key);
+
+
+/**
+ * Reads a #GNUNET_IDENTITY_PublicKey from a compact buffer.
+ * The buffer has to contain at least the compacted length of
+ * a #GNUNET_IDENTITY_PublicKey in bytes.
+ * If the buffer is too small, the function returns -1 as error.
+ * If the buffer does not contain a valid key, it returns -2 as error.
+ *
+ * @param key the key
+ * @param buffer the buffer
+ * @param len the length of buffer
+ * @return -1 or -2 on error, else the amount of bytes read from the buffer
+ */
+ssize_t
+GNUNET_IDENTITY_read_key_from_buffer (struct GNUNET_IDENTITY_PublicKey *key,
+ const void*buffer,
+ size_t len);
+
+
+/**
+ * Writes a #GNUNET_IDENTITY_PublicKey to a compact buffer.
+ * The buffer requires space for at least the compacted length of
+ * a #GNUNET_IDENTITY_PublicKey in bytes.
+ * If the buffer is too small, the function returns -1 as error.
+ * If the key is not valid, it returns -2 as error.
+ *
+ * @param key the key
+ * @param buffer the buffer
+ * @param len the length of buffer
+ * @return -1 or -2 on error, else the amount of bytes written to the buffer
+ */
+ssize_t
+GNUNET_IDENTITY_write_key_to_buffer (const struct
+ GNUNET_IDENTITY_PublicKey *key,
+ void*buffer,
+ size_t len);
+
+
+/**
+ * Get the compacted length of a #GNUNET_IDENTITY_Signature.
+ * Compacted means that it returns the minimum number of bytes this
+ * signature is long, as opposed to the union structure inside
+ * #GNUNET_IDENTITY_Signature.
+ * Useful for compact serializations.
+ *
+ * @param sig the signature.
+ * @return -1 on error, else the compacted length of the signature.
+ */
+ssize_t
+GNUNET_IDENTITY_signature_get_length (const struct
+ GNUNET_IDENTITY_Signature *sig);
+
+
+/**
+ * Reads a #GNUNET_IDENTITY_Signature from a compact buffer.
+ * The buffer has to contain at least the compacted length of
+ * a #GNUNET_IDENTITY_Signature in bytes.
+ * If the buffer is too small, the function returns -1 as error.
+ * If the buffer does not contain a valid key, it returns -2 as error.
+ *
+ * @param sig the signature
+ * @param buffer the buffer
+ * @param len the length of buffer
+ * @return -1 or -2 on error, else the amount of bytes read from the buffer
+ */
+ssize_t
+GNUNET_IDENTITY_read_signature_from_buffer (struct
+ GNUNET_IDENTITY_Signature *sig,
+ const void*buffer,
+ size_t len);
+
+
+/**
+ * Writes a #GNUNET_IDENTITY_Signature to a compact buffer.
+ * The buffer requires space for at least the compacted length of
+ * a #GNUNET_IDENTITY_Signature in bytes.
+ * If the buffer is too small, the function returns -1 as error.
+ * If the key is not valid, it returns -2 as error.
+ *
+ * @param sig the signature
+ * @param buffer the buffer
+ * @param len the length of buffer
+ * @return -1 or -2 on error, else the amount of bytes written to the buffer
+ */
+ssize_t
+GNUNET_IDENTITY_write_signature_to_buffer (const struct
+ GNUNET_IDENTITY_Signature *sig,
+ void*buffer,
+ size_t len);
+
+
+/**
+ * @brief Sign a given block.
+ *
+ * The @a purpose data is the beginning of the data of which the signature is
+ * to be created. The `size` field in @a purpose must correctly indicate the
+ * number of bytes of the data structure, including its header. If possible,
+ * use #GNUNET_IDENTITY_sign() instead of this function.
+ *
+ * @param priv private key to use for the signing
+ * @param purpose what to sign (size, purpose)
+ * @param[out] sig where to write the signature
+ * @return #GNUNET_SYSERR on error, #GNUNET_OK on success
+ */
+int
+GNUNET_IDENTITY_sign_ (const struct
+ GNUNET_IDENTITY_PrivateKey *priv,
+ const struct
+ GNUNET_CRYPTO_EccSignaturePurpose *purpose,
+ struct GNUNET_IDENTITY_Signature *sig);
+
+
+/**
+ * @brief Sign a given block with #GNUNET_IDENTITY_PrivateKey.
+ *
+ * The @a ps data must be a fixed-size struct for which the signature is to be
+ * created. The `size` field in @a ps->purpose must correctly indicate the
+ * number of bytes of the data structure, including its header.
+ *
+ * @param priv private key to use for the signing
+ * @param ps packed struct with what to sign, MUST begin with a purpose
+ * @param[out] sig where to write the signature
+ */
+#define GNUNET_IDENTITY_sign(priv,ps,sig) do { \
+ /* check size is set correctly */ \
+ GNUNET_assert (ntohl ((ps)->purpose.size) == sizeof (*(ps))); \
+ /* check 'ps' begins with the purpose */ \
+ GNUNET_static_assert (((void*) (ps)) == \
+ ((void*) &(ps)->purpose)); \
+ GNUNET_assert (GNUNET_OK == \
+ GNUNET_IDENTITY_sign_ (priv, \
+ &(ps)->purpose, \
+ sig)); \
+} while (0)
+
+
+/**
+ * @brief Verify a given signature.
+ *
+ * The @a validate data is the beginning of the data of which the signature
+ * is to be verified. The `size` field in @a validate must correctly indicate
+ * the number of bytes of the data structure, including its header. If @a
+ * purpose does not match the purpose given in @a validate (the latter must be
+ * in big endian), signature verification fails. If possible,
+ * use #GNUNET_IDENTITY_signature_verify() instead of this function (only if
@a validate
+ * is not fixed-size, you must use this function directly).
+ *
+ * @param purpose what is the purpose that the signature should have?
+ * @param validate block to validate (size, purpose, data)
+ * @param sig signature that is being validated
+ * @param pub public key of the signer
+ * @returns #GNUNET_OK if ok, #GNUNET_SYSERR if invalid
+ */
+int
+GNUNET_IDENTITY_signature_verify_ (uint32_t purpose,
+ const struct
+ GNUNET_CRYPTO_EccSignaturePurpose *validate,
+ const struct GNUNET_IDENTITY_Signature *sig,
+ const struct
+ GNUNET_IDENTITY_PublicKey *pub);
+
+
+/**
+ * @brief Verify a given signature with #GNUNET_IDENTITY_PublicKey.
+ *
+ * The @a ps data must be a fixed-size struct for which the signature is to be
+ * created. The `size` field in @a ps->purpose must correctly indicate the
+ * number of bytes of the data structure, including its header.
+ *
+ * @param purp purpose of the signature, must match 'ps->purpose.purpose'
+ * (except in host byte order)
+ * @param ps packed struct with what to sign, MUST begin with a purpose
+ * @param sig where to read the signature from
+ * @param pub public key to use for the verifying
+ */
+#define GNUNET_IDENTITY_signature_verify(purp,ps,sig,pub) ({ \
+ /* check size is set correctly */ \
+ GNUNET_assert (ntohl ((ps)->purpose.size) == sizeof (*(ps))); \
+ /* check 'ps' begins with the purpose */ \
+ GNUNET_static_assert (((void*) (ps)) == \
+ ((void*) &(ps)->purpose)); \
+ GNUNET_IDENTITY_signature_verify_ (purp, \
+ &(ps)->purpose, \
+ sig, \
+ pub); \
+ })
+
+
+/**
+ * Encrypt a block with #GNUNET_IDENTITY_PublicKey and derives a
+ * #GNUNET_CRYPTO_EcdhePublicKey which is required for decryption
+ * using ecdh to derive a symmetric key.
+ *
+ * @param block the block to encrypt
+ * @param size the size of the @a block
+ * @param pub public key to use for ecdh
+ * @param ecc where to write the ecc public key
+ * @param result the output parameter in which to store the encrypted result
+ * can be the same or overlap with @c block
+ * @returns the size of the encrypted block, -1 for errors.
+ * Due to the use of CFB and therefore an effective stream cipher,
+ * this size should be the same as @c len.
+ */
+ssize_t
+GNUNET_IDENTITY_encrypt (const void *block,
+ size_t size,
+ const struct GNUNET_IDENTITY_PublicKey *pub,
+ struct GNUNET_CRYPTO_EcdhePublicKey *ecc,
+ void *result);
+
+
+/**
+ * Decrypt a given block with #GNUNET_IDENTITY_PrivateKey and a given
+ * #GNUNET_CRYPTO_EcdhePublicKey using ecdh to derive a symmetric key.
+ *
+ * @param block the data to decrypt, encoded as returned by encrypt
+ * @param size the size of the @a block to decrypt
+ * @param priv private key to use for ecdh
+ * @param ecc the ecc public key
+ * @param result address to store the result at
+ * can be the same or overlap with @c block
+ * @return -1 on failure, size of decrypted block on success.
+ * Due to the use of CFB and therefore an effective stream cipher,
+ * this size should be the same as @c size.
+ */
+ssize_t
+GNUNET_IDENTITY_decrypt (const void *block,
+ size_t size,
+ const struct
+ GNUNET_IDENTITY_PrivateKey *priv,
+ const struct
+ GNUNET_CRYPTO_EcdhePublicKey *ecc,
+ void *result);
+
+
+/**
+ * Creates a (Base32) string representation of the public key.
+ * The resulting string encodes a compacted representation of the key.
+ * See also #GNUNET_IDENTITY_key_get_length.
+ *
+ * @param key the key.
+ * @return the string representation of the key, or NULL on error.
+ */
+char *
+GNUNET_IDENTITY_public_key_to_string (const struct
+ GNUNET_IDENTITY_PublicKey *key);
+
+
+/**
+ * Creates a (Base32) string representation of the private key.
+ * The resulting string encodes a compacted representation of the key.
+ * See also #GNUNET_IDENTITY_key_get_length.
+ *
+ * @param key the key.
+ * @return the string representation of the key, or NULL on error.
+ */
+char *
+GNUNET_IDENTITY_private_key_to_string (const struct
+ GNUNET_IDENTITY_PrivateKey *key);
+
+
+/**
+ * Parses a (Base32) string representation of the public key.
+ * See also #GNUNET_IDENTITY_public_key_to_string.
+ *
+ * @param str the encoded key.
+ * @param key where to write the key.
+ * @return GNUNET_SYSERR on error.
+ */
+enum GNUNET_GenericReturnValue
+GNUNET_IDENTITY_public_key_from_string (const char*str,
+ struct GNUNET_IDENTITY_PublicKey *key);
+
+
+/**
+ * Parses a (Base32) string representation of the private key.
+ * See also #GNUNET_IDENTITY_private_key_to_string.
+ *
+ * @param str the encoded key.
+ * @param key where to write the key.
+ * @return GNUNET_SYSERR on error.
+ */
+enum GNUNET_GenericReturnValue
+GNUNET_IDENTITY_private_key_from_string (const char*str,
+ struct GNUNET_IDENTITY_PrivateKey
*key);
+
+
+/**
+ * Retrieves the public key representation of a private key.
+ *
+ * @param privkey the private key.
+ * @param key the public key result.
+ * @return GNUNET_SYSERR on error.
+ */
+enum GNUNET_GenericReturnValue
+GNUNET_IDENTITY_key_get_public (const struct
+ GNUNET_IDENTITY_PrivateKey *privkey,
+ struct GNUNET_IDENTITY_PublicKey *key);
+
+
/* ************* convenience API to lookup an ego ***************** */
/**
@@ -344,7 +756,7 @@ GNUNET_IDENTITY_ego_lookup_cancel (struct
GNUNET_IDENTITY_EgoLookup *el);
typedef void
(*GNUNET_IDENTITY_EgoSuffixCallback) (
void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv,
+ const struct GNUNET_IDENTITY_PrivateKey *priv,
const char *ego_name);
diff --git a/src/include/gnunet_json_lib.h b/src/include/gnunet_json_lib.h
index 07a14d329..3dc79105e 100644
--- a/src/include/gnunet_json_lib.h
+++ b/src/include/gnunet_json_lib.h
@@ -1,6 +1,6 @@
/*
This file is part of GNUnet
- Copyright (C) 2014, 2015, 2016 GNUnet e.V.
+ Copyright (C) 2014, 2015, 2016, 2020 GNUnet e.V.
GNUnet is free software: you can redistribute it and/or modify it
under the terms of the GNU Affero General Public License as published
@@ -28,7 +28,6 @@
#define GNUNET_JSON_LIB_H
#include "gnunet_util_lib.h"
-#include "gnunet_gnsrecord_lib.h"
#include <jansson.h>
#include <microhttpd.h>
@@ -359,18 +358,6 @@ GNUNET_JSON_spec_rsa_signature (const char *name,
struct GNUNET_CRYPTO_RsaSignature **sig);
-/**
- * JSON Specification for GNS Records.
- *
- * @param gnsrecord_object struct of GNUNET_GNSRECORD_Data to fill
- * @return JSON Specification
- */
-struct GNUNET_JSON_Specification
-GNUNET_JSON_spec_gnsrecord (struct GNUNET_GNSRECORD_Data **rd,
- unsigned int *rd_count,
- char **name);
-
-
/* ****************** Generic generator interface ******************* */
@@ -446,18 +433,6 @@ GNUNET_JSON_from_rsa_public_key (const struct
GNUNET_CRYPTO_RsaPublicKey *pk);
json_t *
GNUNET_JSON_from_rsa_signature (const struct GNUNET_CRYPTO_RsaSignature *sig);
-/**
- * Convert Gns record to JSON.
- *
- * @param rname name of record
- * @param rd record data
- * @return corresponding JSON encoding
- */
-json_t *
-GNUNET_JSON_from_gnsrecord (const char *rname,
- const struct GNUNET_GNSRECORD_Data *rd,
- unsigned int rd_count);
-
/* ******************* Helpers for MHD upload handling ******************* */
/**
diff --git a/src/include/gnunet_messenger_service.h
b/src/include/gnunet_messenger_service.h
new file mode 100644
index 000000000..8f5315c30
--- /dev/null
+++ b/src/include/gnunet_messenger_service.h
@@ -0,0 +1,436 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2020 GNUnet e.V.
+
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @author Tobias Frisch
+ *
+ * @file
+ * MESSENGER service; manages decentralized chat groups
+ *
+ * @defgroup messenger MESSENGER service
+ * Instant messaging based on the CADET subsystem
+ *
+ * @{
+ */
+
+#ifndef GNUNET_MESSENGER_SERVICE_H
+#define GNUNET_MESSENGER_SERVICE_H
+
+#ifdef __cplusplus
+extern "C" {
+#if 0 /* keep Emacsens' auto-indent happy */
+}
+#endif
+#endif
+
+#include "platform.h"
+#include "gnunet_configuration_lib.h"
+#include "gnunet_crypto_lib.h"
+#include "gnunet_identity_service.h"
+#include "gnunet_mq_lib.h"
+#include "gnunet_protocols.h"
+#include "gnunet_scheduler_lib.h"
+#include "gnunet_time_lib.h"
+
+#define GNUNET_MESSENGER_SERVICE_NAME "messenger"
+
+/**
+ * Opaque handle to the messenger
+ */
+struct GNUNET_MESSENGER_Handle;
+
+/**
+ * Opaque handle to a room
+ */
+struct GNUNET_MESSENGER_Room;
+
+/**
+ * Opaque handle to a contact
+ */
+struct GNUNET_MESSENGER_Contact;
+
+/**
+ * Enum for the different supported kinds of messages
+ */
+enum GNUNET_MESSENGER_MessageKind
+{
+ GNUNET_MESSENGER_KIND_INFO = 1,
+
+ GNUNET_MESSENGER_KIND_JOIN = 2,
+ GNUNET_MESSENGER_KIND_LEAVE = 3,
+
+ GNUNET_MESSENGER_KIND_NAME = 4,
+ GNUNET_MESSENGER_KIND_KEY = 5,
+ GNUNET_MESSENGER_KIND_PEER = 6,
+ GNUNET_MESSENGER_KIND_ID = 7,
+
+ GNUNET_MESSENGER_KIND_MISS = 8,
+ GNUNET_MESSENGER_KIND_MERGE = 9,
+ GNUNET_MESSENGER_KIND_REQUEST = 10,
+
+ GNUNET_MESSENGER_KIND_INVITE = 11,
+ GNUNET_MESSENGER_KIND_TEXT = 12,
+ GNUNET_MESSENGER_KIND_FILE = 13,
+
+ GNUNET_MESSENGER_KIND_PRIVATE = 14,
+
+ GNUNET_MESSENGER_KIND_UNKNOWN = 0
+}__attribute__((__packed__));
+
+/**
+ * Get the name of a message <i>kind</i>.
+ *
+ * @param kind Kind of a message
+ * @return Name of that kind
+ */
+const char*
+GNUNET_MESSENGER_name_of_kind (enum GNUNET_MESSENGER_MessageKind kind);
+
+struct GNUNET_MESSENGER_MessageHeader
+{
+ struct GNUNET_IDENTITY_Signature signature;
+
+ struct GNUNET_TIME_AbsoluteNBO timestamp;
+
+ struct GNUNET_ShortHashCode sender_id;
+ struct GNUNET_HashCode previous;
+
+ enum GNUNET_MESSENGER_MessageKind kind;
+};
+
+struct GNUNET_MESSENGER_MessageInfo
+{
+ struct GNUNET_IDENTITY_PublicKey host_key;
+ struct GNUNET_ShortHashCode unique_id;
+};
+
+struct GNUNET_MESSENGER_MessageJoin
+{
+ struct GNUNET_IDENTITY_PublicKey key;
+};
+
+struct GNUNET_MESSENGER_MessageLeave
+{
+};
+
+struct GNUNET_MESSENGER_MessageName
+{
+ char *name;
+};
+
+struct GNUNET_MESSENGER_MessageKey
+{
+ struct GNUNET_IDENTITY_PublicKey key;
+};
+
+struct GNUNET_MESSENGER_MessagePeer
+{
+ struct GNUNET_PeerIdentity peer;
+};
+
+struct GNUNET_MESSENGER_MessageId
+{
+ struct GNUNET_ShortHashCode id;
+};
+
+struct GNUNET_MESSENGER_MessageMiss
+{
+ struct GNUNET_PeerIdentity peer;
+};
+
+struct GNUNET_MESSENGER_MessageMerge
+{
+ struct GNUNET_HashCode previous;
+};
+
+struct GNUNET_MESSENGER_MessageRequest
+{
+ struct GNUNET_HashCode hash;
+};
+
+struct GNUNET_MESSENGER_MessageInvite
+{
+ struct GNUNET_PeerIdentity door;
+ struct GNUNET_HashCode key;
+};
+
+struct GNUNET_MESSENGER_MessageText
+{
+ char *text;
+};
+
+struct GNUNET_MESSENGER_MessageFile
+{
+ struct GNUNET_CRYPTO_SymmetricSessionKey key;
+ struct GNUNET_HashCode hash;
+ char name[NAME_MAX];
+ char *uri;
+};
+
+struct GNUNET_MESSENGER_MessagePrivate
+{
+ struct GNUNET_CRYPTO_EcdhePublicKey key;
+
+ uint16_t length;
+ char *data;
+};
+
+struct GNUNET_MESSENGER_MessageBody
+{
+ union
+ {
+ struct GNUNET_MESSENGER_MessageInfo info;
+
+ struct GNUNET_MESSENGER_MessageJoin join;
+ struct GNUNET_MESSENGER_MessageLeave leave;
+
+ struct GNUNET_MESSENGER_MessageName name;
+ struct GNUNET_MESSENGER_MessageKey key;
+ struct GNUNET_MESSENGER_MessagePeer peer;
+ struct GNUNET_MESSENGER_MessageId id;
+
+ struct GNUNET_MESSENGER_MessageMiss miss;
+ struct GNUNET_MESSENGER_MessageMerge merge;
+ struct GNUNET_MESSENGER_MessageRequest request;
+
+ struct GNUNET_MESSENGER_MessageInvite invite;
+ struct GNUNET_MESSENGER_MessageText text;
+ struct GNUNET_MESSENGER_MessageFile file;
+
+ struct GNUNET_MESSENGER_MessagePrivate private;
+ };
+};
+
+/**
+ * Struct to a message
+ */
+struct GNUNET_MESSENGER_Message
+{
+ struct GNUNET_MESSENGER_MessageHeader header;
+ struct GNUNET_MESSENGER_MessageBody body;
+};
+
+/**
+ * Method called whenever the EGO of a <i>handle</i> changes or if the first
connection fails
+ * to load a valid EGO and the anonymous keypair will be used instead.
+ *
+ * @param cls Closure from <i>GNUNET_MESSENGER_connect</i>
+ * @param handle Messenger handle
+ */
+typedef void
+(*GNUNET_MESSENGER_IdentityCallback) (void *cls, struct
GNUNET_MESSENGER_Handle *handle);
+
+/**
+ * Method called whenever a message is sent or received from a <i>room</i>.
+ *
+ * @param cls Closure from <i>GNUNET_MESSENGER_connect</i>
+ * @param room Room handle
+ * @param message Newly received or sent message
+ * @param hash Hash identifying the message
+ */
+typedef void
+(*GNUNET_MESSENGER_MessageCallback) (void *cls, const struct
GNUNET_MESSENGER_Room *room,
+ const struct GNUNET_MESSENGER_Message
*message, const struct GNUNET_HashCode *hash);
+
+/**
+ * Set up a handle for the messenger related functions and connects to all
necessary services. It will look up the ego
+ * key identified by its <i>name</i> and use it for signing all messages from
the handle.
+ *
+ * @param cfg Configuration to use
+ * @param name Name to look up an ego or NULL to stay anonymous
+ * @param identity_callback Function called when the EGO of the handle changes
+ * @param identity_cls Closure for the <i>identity_callback</i> handler
+ * @param msg_callback Function called when a new message is sent or received
+ * @param msg_cls Closure for the <i>msg_callback</i> handler
+ * @return Messenger handle to use, NULL on error
+ */
+struct GNUNET_MESSENGER_Handle*
+GNUNET_MESSENGER_connect (const struct GNUNET_CONFIGURATION_Handle *cfg, const
char *name,
+ GNUNET_MESSENGER_IdentityCallback identity_callback,
void *identity_cls,
+ GNUNET_MESSENGER_MessageCallback msg_callback, void
*msg_cls);
+
+/**
+ * Update a handle of the messenger to use a different ego key and replace the
old one with a newly generated one. All
+ * participated rooms get informed about the key renewal. The handle requires
a set name for this function to work and
+ * it needs to be unused by other egos.
+ *
+ * Keep in mind that this will fully delete the old ego key (if any is used)
even if any other service wants to use it
+ * as default.
+ *
+ * @param handle Messenger handle to use
+ * @return GNUNET_OK on success, GNUNET_SYSERR on failure
+ */
+int
+GNUNET_MESSENGER_update (struct GNUNET_MESSENGER_Handle *handle);
+
+/**
+ * Disconnect all of the messengers used services and clears up its used
memory.
+ *
+ * @param handle Messenger handle to use
+ */
+void
+GNUNET_MESSENGER_disconnect (struct GNUNET_MESSENGER_Handle *handle);
+
+/**
+ * Get the name (if specified, otherwise NULL) used by the messenger.
+ *
+ * @param handle Messenger handle to use
+ * @return Name used by the messenger or NULL
+ */
+const char*
+GNUNET_MESSENGER_get_name (const struct GNUNET_MESSENGER_Handle *handle);
+
+/**
+ * Set the name for the messenger. This will rename the currently used ego and
move all stored files related to the current
+ * name to its new directory. If anything fails during this process the
function returns GNUNET_NO and the name for
+ * the messenger won't change as specified.
+ *
+ * @param handle Messenger handle to use
+ * @param name Name for the messenger to change to
+ * @return GNUNET_YES on success, GNUNET_NO on failure and GNUNET_SYSERR if
<i>handle</i> is NULL
+ */
+int
+GNUNET_MESSENGER_set_name (struct GNUNET_MESSENGER_Handle *handle, const char
*name);
+
+/**
+ * Get the public key used by the messenger.
+ *
+ * @param handle Messenger handle to use
+ * @return Used ego's public key
+ */
+const struct GNUNET_IDENTITY_PublicKey*
+GNUNET_MESSENGER_get_key (const struct GNUNET_MESSENGER_Handle *handle);
+
+/**
+ * Open a room to send and receive messages. The room will use the specified
<i>key</i> as port for the underlying cadet
+ * service. Opening a room results in opening the port for incoming
connections as possible <b>door</b>.
+ *
+ * Notice that there can only be one room related to a specific <i>key</i>. So
trying to open two rooms with the same
+ * <i>key</i> will result in opening the room once but returning the handle
both times because the room stays open.
+ *
+ * You can also open a room after entering it through a <b>door</b> using
<i>GNUNET_MESSENGER_entry_room(...)</i>. This
+ * will notify all entered <b>doors</b> to list you as new <b>door</b>.
+ *
+ * ( All <b>doors</b> form a ring structured network to shorten the latency
sending and receiving messages. )
+ *
+ * @param handle Messenger handle to use
+ * @param key Hash identifying the port
+ * @return Room handle, NULL on error
+ */
+struct GNUNET_MESSENGER_Room*
+GNUNET_MESSENGER_open_room (struct GNUNET_MESSENGER_Handle *handle, const
struct GNUNET_HashCode *key);
+
+/**
+ * Enter a room to send and receive messages through a <b>door</b> opened
using <i>GNUNET_MESSENGER_open_room(...)</i>.
+ *
+ * Notice that there can only be one room related to a specific <i>key</i>. So
trying to enter two rooms with the same
+ * <i>key</i> will result in entering the room once but returning the handle
both times because the room stays entered.
+ * You can however enter a room through multiple <b>doors</b> in parallel
which results in connecting both ends. But
+ * entering the room through the same <b>door</b> won't have any effect after
the first time.
+ *
+ * You can also enter a room through a <b>door</b> after opening it using
<i>GNUNET_MESSENGER_open_room(...)</i>. But the
+ * <b>door</b> may not be your own peer identity.
+ *
+ * ( All <b>doors</b> form a ring structured network to shorten the latency
sending and receiving messages. )
+ *
+ * @param handle Messenger handle to use
+ * @param door Peer identity of an open <b>door</b>
+ * @param key Hash identifying the port
+ * @return Room handle, NULL on error
+ */
+struct GNUNET_MESSENGER_Room*
+GNUNET_MESSENGER_entry_room (struct GNUNET_MESSENGER_Handle *handle, const
struct GNUNET_PeerIdentity *door,
+ const struct GNUNET_HashCode *key);
+
+/**
+ * Close a room which was entered, opened or both in various order and
variety. Closing a room will destroy all connections
+ * from your peer to another and the other way around.
+ *
+ * ( After a member closes a <b>door</b>, all members entered through that
specific <b>door</b> have to use another one
+ * or open the room on their own. )
+ *
+ * @param room Room handle
+ */
+void
+GNUNET_MESSENGER_close_room (struct GNUNET_MESSENGER_Room *room);
+
+/**
+ * Get the contact of a member in a <i>room</i> identified by their <i>id</i>.
+ *
+ * Notice that contacts are independent of rooms but will be removed if all
rooms containing these contacts get closed.
+ *
+ * @param room Room handle
+ * @param id Hash identifying a member
+ * @return Contact handle, NULL if <i>id</i> is not in use
+ */
+struct GNUNET_MESSENGER_Contact*
+GNUNET_MESSENGER_get_member (const struct GNUNET_MESSENGER_Room *room, const
struct GNUNET_ShortHashCode *id);
+
+/**
+ * Get the name used by the <i>contact</i>.
+ *
+ * @param contact Contact handle
+ * @return Name of <i>contact</i> or NULL
+ */
+const char*
+GNUNET_MESSENGER_contact_get_name (const struct GNUNET_MESSENGER_Contact
*contact);
+
+/**
+ * Get the public key used by the <i>contact</i>.
+ *
+ * @param contact Contact handle
+ * @return Public key of the ego used by <i>contact</i>
+ */
+const struct GNUNET_IDENTITY_PublicKey*
+GNUNET_MESSENGER_contact_get_key (const struct GNUNET_MESSENGER_Contact
*contact);
+
+/**
+ * Send a <i>message</i> into a </i>room</i>. If you opened the <i>room</i>
all entered members will receive the
+ * <i>message</i>. If you entered the <i>room</i> through a <b>door</b> all so
entered <b>doors</b> will receive the
+ * <i>message</i> as well. All members receiving the <i>message</i> will also
propagate this <i>message</i> recursively
+ * as long as the <i>message</i> is unknown to them.
+ *
+ * Notice that all messages sent and received are also stored and can be
propagated to new members entering the room.
+ *
+ * @param room Room handle
+ * @param message New message to send
+ */
+void
+GNUNET_MESSENGER_send_message (struct GNUNET_MESSENGER_Room *room, const
struct GNUNET_MESSENGER_Message *message);
+
+/**
+ * Get the message in a <i>room</i> identified by its <i>hash</i>.
+ *
+ * @param room Room handle
+ * @param hash Hash identifying a message
+ * @return Message struct or NULL if no message with that hash is known
+ */
+const struct GNUNET_MESSENGER_Message*
+GNUNET_MESSENGER_get_message (const struct GNUNET_MESSENGER_Room *room, const
struct GNUNET_HashCode *hash);
+
+#if 0 /* keep Emacsens' auto-indent happy */
+{
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+#endif //GNUNET_MESSENGER_SERVICE_H
+
+/** @} *//* end of group */
diff --git a/src/include/gnunet_namestore_plugin.h
b/src/include/gnunet_namestore_plugin.h
index 443c9e451..9cc8abc6e 100644
--- a/src/include/gnunet_namestore_plugin.h
+++ b/src/include/gnunet_namestore_plugin.h
@@ -58,7 +58,7 @@ typedef void
(*GNUNET_NAMESTORE_RecordIterator) (void *cls,
uint64_t serial,
const struct
- GNUNET_CRYPTO_EcdsaPrivateKey *private_key,
+ GNUNET_IDENTITY_PrivateKey *private_key,
const char *label,
unsigned int rd_count,
const struct GNUNET_GNSRECORD_Data *rd);
@@ -87,7 +87,7 @@ struct GNUNET_NAMESTORE_PluginFunctions
*/
int
(*store_records) (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
+ const struct GNUNET_IDENTITY_PrivateKey *zone,
const char *label,
unsigned int rd_count,
const struct GNUNET_GNSRECORD_Data *rd);
@@ -104,7 +104,7 @@ struct GNUNET_NAMESTORE_PluginFunctions
*/
int
(*lookup_records) (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
+ const struct GNUNET_IDENTITY_PrivateKey *zone,
const char *label,
GNUNET_NAMESTORE_RecordIterator iter,
void *iter_cls);
@@ -126,7 +126,7 @@ struct GNUNET_NAMESTORE_PluginFunctions
*/
int
(*iterate_records) (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
+ const struct GNUNET_IDENTITY_PrivateKey *zone,
uint64_t serial,
uint64_t limit,
GNUNET_NAMESTORE_RecordIterator iter,
@@ -146,8 +146,8 @@ struct GNUNET_NAMESTORE_PluginFunctions
*/
int
(*zone_to_name) (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
- const struct GNUNET_CRYPTO_EcdsaPublicKey *value_zone,
+ const struct GNUNET_IDENTITY_PrivateKey *zone,
+ const struct GNUNET_IDENTITY_PublicKey *value_zone,
GNUNET_NAMESTORE_RecordIterator iter,
void *iter_cls);
};
diff --git a/src/include/gnunet_namestore_service.h
b/src/include/gnunet_namestore_service.h
index bf42c8d34..ca4d2cb52 100644
--- a/src/include/gnunet_namestore_service.h
+++ b/src/include/gnunet_namestore_service.h
@@ -41,6 +41,7 @@
#include "gnunet_util_lib.h"
#include "gnunet_block_lib.h"
#include "gnunet_gnsrecord_lib.h"
+#include "gnunet_identity_service.h"
#ifdef __cplusplus
extern "C"
@@ -127,7 +128,7 @@ typedef void
struct GNUNET_NAMESTORE_QueueEntry *
GNUNET_NAMESTORE_records_store (struct GNUNET_NAMESTORE_Handle *h,
const struct
- GNUNET_CRYPTO_EcdsaPrivateKey *pkey,
+ GNUNET_IDENTITY_PrivateKey *pkey,
const char *label,
unsigned int rd_count,
const struct GNUNET_GNSRECORD_Data *rd,
@@ -147,7 +148,7 @@ GNUNET_NAMESTORE_records_store (struct
GNUNET_NAMESTORE_Handle *h,
typedef void
(*GNUNET_NAMESTORE_RecordMonitor) (void *cls,
const struct
- GNUNET_CRYPTO_EcdsaPrivateKey *zone,
+ GNUNET_IDENTITY_PrivateKey *zone,
const char *label,
unsigned int rd_count,
const struct GNUNET_GNSRECORD_Data *rd);
@@ -170,7 +171,7 @@ typedef void
struct GNUNET_NAMESTORE_QueueEntry *
GNUNET_NAMESTORE_records_lookup (struct GNUNET_NAMESTORE_Handle *h,
const struct
- GNUNET_CRYPTO_EcdsaPrivateKey *pkey,
+ GNUNET_IDENTITY_PrivateKey *pkey,
const char *label,
GNUNET_SCHEDULER_TaskCallback error_cb,
void *error_cb_cls,
@@ -197,9 +198,9 @@ GNUNET_NAMESTORE_records_lookup (struct
GNUNET_NAMESTORE_Handle *h,
*/
struct GNUNET_NAMESTORE_QueueEntry *
GNUNET_NAMESTORE_zone_to_name (struct GNUNET_NAMESTORE_Handle *h,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey
*zone,
+ const struct GNUNET_IDENTITY_PrivateKey *zone,
const struct
- GNUNET_CRYPTO_EcdsaPublicKey *value_zone,
+ GNUNET_IDENTITY_PublicKey *value_zone,
GNUNET_SCHEDULER_TaskCallback error_cb,
void *error_cb_cls,
GNUNET_NAMESTORE_RecordMonitor proc,
@@ -246,7 +247,7 @@ GNUNET_NAMESTORE_cancel (struct GNUNET_NAMESTORE_QueueEntry
*qe);
struct GNUNET_NAMESTORE_ZoneIterator *
GNUNET_NAMESTORE_zone_iteration_start (struct GNUNET_NAMESTORE_Handle *h,
const struct
- GNUNET_CRYPTO_EcdsaPrivateKey *zone,
+ GNUNET_IDENTITY_PrivateKey *zone,
GNUNET_SCHEDULER_TaskCallback error_cb,
void *error_cb_cls,
GNUNET_NAMESTORE_RecordMonitor proc,
@@ -316,7 +317,7 @@ struct GNUNET_NAMESTORE_ZoneMonitor *
GNUNET_NAMESTORE_zone_monitor_start (const struct
GNUNET_CONFIGURATION_Handle *cfg,
const struct
- GNUNET_CRYPTO_EcdsaPrivateKey *zone,
+ GNUNET_IDENTITY_PrivateKey *zone,
int iterate_first,
GNUNET_SCHEDULER_TaskCallback error_cb,
void *error_cb_cls,
diff --git a/src/include/gnunet_pq_lib.h b/src/include/gnunet_pq_lib.h
index ca549f77c..de717526c 100644
--- a/src/include/gnunet_pq_lib.h
+++ b/src/include/gnunet_pq_lib.h
@@ -1,6 +1,6 @@
/*
This file is part of GNUnet
- Copyright (C) 2016, 2017 GNUnet e.V.
+ Copyright (C) 2016, 2017, 2020 GNUnet e.V.
GNUnet is free software: you can redistribute it and/or modify it
under the terms of the GNU Affero General Public License as published
@@ -87,6 +87,7 @@ struct GNUNET_PQ_QueryParam
* Number of parameters eaten by this operation.
*/
unsigned int num_params;
+
};
@@ -99,21 +100,33 @@ struct GNUNET_PQ_QueryParam
}
+/**
+ * Generate query parameter to create a NULL value.
+ *
+ * @return query parameter to use to insert NULL into DB
+ */
+struct GNUNET_PQ_QueryParam
+GNUNET_PQ_query_param_null (void);
+
+
/**
* Generate query parameter for a buffer @a ptr of
* @a ptr_size bytes.
*
* @param ptr pointer to the query parameter to pass
* @oaran ptr_size number of bytes in @a ptr
+ * @return query parameter to use
*/
struct GNUNET_PQ_QueryParam
-GNUNET_PQ_query_param_fixed_size (const void *ptr, size_t ptr_size);
+GNUNET_PQ_query_param_fixed_size (const void *ptr,
+ size_t ptr_size);
/**
* Generate query parameter for a string.
*
* @param ptr pointer to the string query parameter to pass
+ * @return query parameter to use
*/
struct GNUNET_PQ_QueryParam
GNUNET_PQ_query_param_string (const char *ptr);
@@ -124,6 +137,7 @@ GNUNET_PQ_query_param_string (const char *ptr);
* by variable type.
*
* @param x pointer to the query parameter to pass.
+ * @return query parameter to use
*/
#define GNUNET_PQ_query_param_auto_from_type(x) \
GNUNET_PQ_query_param_fixed_size ((x), sizeof(*(x)))
@@ -134,6 +148,7 @@ GNUNET_PQ_query_param_string (const char *ptr);
* database must contain a BLOB type in the respective position.
*
* @param x the query parameter to pass.
+ * @return query parameter to use
*/
struct GNUNET_PQ_QueryParam
GNUNET_PQ_query_param_rsa_public_key (
@@ -145,6 +160,7 @@ GNUNET_PQ_query_param_rsa_public_key (
* database must contain a BLOB type in the respective position.
*
* @param x the query parameter to pass
+ * @return query parameter to use
*/
struct GNUNET_PQ_QueryParam
GNUNET_PQ_query_param_rsa_signature (
@@ -156,6 +172,7 @@ GNUNET_PQ_query_param_rsa_signature (
* The database must store a 64-bit integer.
*
* @param x pointer to the query parameter to pass
+ * @return query parameter to use
*/
struct GNUNET_PQ_QueryParam
GNUNET_PQ_query_param_relative_time (const struct GNUNET_TIME_Relative *x);
@@ -166,6 +183,7 @@ GNUNET_PQ_query_param_relative_time (const struct
GNUNET_TIME_Relative *x);
* The database must store a 64-bit integer.
*
* @param x pointer to the query parameter to pass
+ * @return query parameter to use
*/
struct GNUNET_PQ_QueryParam
GNUNET_PQ_query_param_absolute_time (const struct GNUNET_TIME_Absolute *x);
@@ -176,6 +194,7 @@ GNUNET_PQ_query_param_absolute_time (const struct
GNUNET_TIME_Absolute *x);
* The database must store a 64-bit integer.
*
* @param x pointer to the query parameter to pass
+ * @return query parameter to use
*/
struct GNUNET_PQ_QueryParam
GNUNET_PQ_query_param_absolute_time_nbo (
@@ -186,6 +205,7 @@ GNUNET_PQ_query_param_absolute_time_nbo (
* Generate query parameter for an uint16_t in host byte order.
*
* @param x pointer to the query parameter to pass
+ * @return query parameter to use
*/
struct GNUNET_PQ_QueryParam
GNUNET_PQ_query_param_uint16 (const uint16_t *x);
@@ -195,6 +215,7 @@ GNUNET_PQ_query_param_uint16 (const uint16_t *x);
* Generate query parameter for an uint32_t in host byte order.
*
* @param x pointer to the query parameter to pass
+ * @return query parameter to use
*/
struct GNUNET_PQ_QueryParam
GNUNET_PQ_query_param_uint32 (const uint32_t *x);
@@ -204,6 +225,7 @@ GNUNET_PQ_query_param_uint32 (const uint32_t *x);
* Generate query parameter for an uint16_t in host byte order.
*
* @param x pointer to the query parameter to pass
+ * @return query parameter to use
*/
struct GNUNET_PQ_QueryParam
GNUNET_PQ_query_param_uint64 (const uint64_t *x);
@@ -288,6 +310,20 @@ struct GNUNET_PQ_ResultSpec
* Where to store actual size of the result.
*/
size_t *result_size;
+
+ /**
+ * True if NULL is allowed for a value in the database.
+ */
+ bool is_nullable;
+
+ /**
+ * Points to a location where we should store
+ * "true" if the result found is NULL, and
+ * otherwise "false". Only used if @e is_nullable
+ * is true.
+ */
+ bool *is_null;
+
};
@@ -302,6 +338,21 @@ struct GNUNET_PQ_ResultSpec
}
+/**
+ * Allow NULL value to be found in the database
+ * for the given value.
+ *
+ * @param rs result spec entry to modify
+ * @param[out] is_null location set to 'true' if the
+ * value was indeed NULL, set to 'false' if the
+ * value was non-NULL
+ * @return array entry for the result specification to use
+ */
+struct GNUNET_PQ_ResultSpec
+GNUNET_PQ_result_spec_allow_null (struct GNUNET_PQ_ResultSpec rs,
+ bool *is_null);
+
+
/**
* Variable-size result expected.
*
diff --git a/src/include/gnunet_protocols.h b/src/include/gnunet_protocols.h
index d9821ffe8..3bdebeb50 100644
--- a/src/include/gnunet_protocols.h
+++ b/src/include/gnunet_protocols.h
@@ -1,6 +1,6 @@
/*
This file is part of GNUnet.
- Copyright (C) 2001--2018 GNUnet e.V.
+ Copyright (C) 2001--2020 GNUnet e.V.
GNUnet is free software: you can redistribute it and/or modify it
under the terms of the GNU Affero General Public License as published
@@ -20,6 +20,7 @@
/**
* @author Christian Grothoff
+ * @author Tobias Frisch
*
* @file
* Constants for network protocols
@@ -3518,6 +3519,46 @@ extern "C" {
#define GNUNET_MESSAGE_TYPE_RECLAIM_REFERENCE_RESULT 1501
+/*********************************************************************************/
+/********************************** MESSENGER
**********************************/
+/*********************************************************************************/
+/* MESSENGER: message types 1600-1629
+ * 1600-1609 Connection-level Messages
+ * 1610-1619 Room-level Messages
+ */
+
+/********************************* Connection
**********************************/
+
+#define GNUNET_MESSAGE_TYPE_MESSENGER_CONNECTION_CREATE 1600
+
+#define GNUNET_MESSAGE_TYPE_MESSENGER_CONNECTION_UPDATE 1601
+
+#define GNUNET_MESSAGE_TYPE_MESSENGER_CONNECTION_DESTROY 1602
+
+#define GNUNET_MESSAGE_TYPE_MESSENGER_CONNECTION_GET_NAME 1603
+
+#define GNUNET_MESSAGE_TYPE_MESSENGER_CONNECTION_SET_NAME 1604
+
+#define GNUNET_MESSAGE_TYPE_MESSENGER_CONNECTION_GET_KEY 1605
+
+#define GNUNET_MESSAGE_TYPE_MESSENGER_CONNECTION_MEMBER_ID 1606
+
+/************************************ Room
*************************************/
+
+#define GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_OPEN 1610
+
+#define GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_ENTRY 1611
+
+#define GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_CLOSE 1612
+
+#define GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_SEND_MESSAGE 1614
+
+#define GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_RECV_MESSAGE 1615
+
+#define GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_GET_MESSAGE 1616
+
+/*********************************************************************************/
+
/**
* Type used to match 'all' message types.
*/
diff --git a/src/include/gnunet_reclaim_service.h
b/src/include/gnunet_reclaim_service.h
index 368058f56..8549081a1 100644
--- a/src/include/gnunet_reclaim_service.h
+++ b/src/include/gnunet_reclaim_service.h
@@ -38,6 +38,7 @@ extern "C" {
#endif
#endif
+#include "gnunet_identity_service.h"
#include "gnunet_reclaim_lib.h"
#include "gnunet_util_lib.h"
@@ -69,12 +70,12 @@ struct GNUNET_RECLAIM_Ticket
/**
* The ticket issuer (= the user)
*/
- struct GNUNET_CRYPTO_EcdsaPublicKey identity;
+ struct GNUNET_IDENTITY_PublicKey identity;
/**
* The ticket audience (= relying party)
*/
- struct GNUNET_CRYPTO_EcdsaPublicKey audience;
+ struct GNUNET_IDENTITY_PublicKey audience;
/**
* The ticket random identifier
@@ -129,7 +130,7 @@ typedef void (*GNUNET_RECLAIM_ContinuationWithStatus) (void
*cls,
* @param attr The attribute
*/
typedef void (*GNUNET_RECLAIM_AttributeResult) (
- void *cls, const struct GNUNET_CRYPTO_EcdsaPublicKey *identity,
+ void *cls, const struct GNUNET_IDENTITY_PublicKey *identity,
const struct GNUNET_RECLAIM_Attribute *attr);
/**
@@ -141,7 +142,7 @@ typedef void (*GNUNET_RECLAIM_AttributeResult) (
* @param presentation The presentation for the credential (may be NULL)
*/
typedef void (*GNUNET_RECLAIM_AttributeTicketResult) (
- void *cls, const struct GNUNET_CRYPTO_EcdsaPublicKey *identity,
+ void *cls, const struct GNUNET_IDENTITY_PublicKey *identity,
const struct GNUNET_RECLAIM_Attribute *attr,
const struct GNUNET_RECLAIM_Presentation *presentation);
@@ -155,7 +156,7 @@ typedef void (*GNUNET_RECLAIM_AttributeTicketResult) (
* @param attributes the parsed attributes
*/
typedef void (*GNUNET_RECLAIM_CredentialResult) (
- void *cls, const struct GNUNET_CRYPTO_EcdsaPublicKey *identity,
+ void *cls, const struct GNUNET_IDENTITY_PublicKey *identity,
const struct GNUNET_RECLAIM_Credential *credential);
@@ -184,7 +185,7 @@ GNUNET_RECLAIM_connect (const struct
GNUNET_CONFIGURATION_Handle *cfg);
struct GNUNET_RECLAIM_Operation *
GNUNET_RECLAIM_attribute_store (
struct GNUNET_RECLAIM_Handle *h,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *pkey,
+ const struct GNUNET_IDENTITY_PrivateKey *pkey,
const struct GNUNET_RECLAIM_Attribute *attr,
const struct GNUNET_TIME_Relative *exp_interval,
GNUNET_RECLAIM_ContinuationWithStatus cont, void *cont_cls);
@@ -205,7 +206,7 @@ GNUNET_RECLAIM_attribute_store (
struct GNUNET_RECLAIM_Operation *
GNUNET_RECLAIM_credential_store (
struct GNUNET_RECLAIM_Handle *h,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *pkey,
+ const struct GNUNET_IDENTITY_PrivateKey *pkey,
const struct GNUNET_RECLAIM_Credential *credential,
const struct GNUNET_TIME_Relative *exp_interval,
GNUNET_RECLAIM_ContinuationWithStatus cont,
@@ -226,7 +227,7 @@ GNUNET_RECLAIM_credential_store (
struct GNUNET_RECLAIM_Operation *
GNUNET_RECLAIM_attribute_delete (
struct GNUNET_RECLAIM_Handle *h,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *pkey,
+ const struct GNUNET_IDENTITY_PrivateKey *pkey,
const struct GNUNET_RECLAIM_Attribute *attr,
GNUNET_RECLAIM_ContinuationWithStatus cont, void *cont_cls);
@@ -244,7 +245,7 @@ GNUNET_RECLAIM_attribute_delete (
struct GNUNET_RECLAIM_Operation *
GNUNET_RECLAIM_credential_delete (
struct GNUNET_RECLAIM_Handle *h,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *pkey,
+ const struct GNUNET_IDENTITY_PrivateKey *pkey,
const struct GNUNET_RECLAIM_Credential *cred,
GNUNET_RECLAIM_ContinuationWithStatus cont,
void *cont_cls);
@@ -276,7 +277,7 @@ GNUNET_RECLAIM_credential_delete (
struct GNUNET_RECLAIM_AttributeIterator *
GNUNET_RECLAIM_get_attributes_start (
struct GNUNET_RECLAIM_Handle *h,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity,
+ const struct GNUNET_IDENTITY_PrivateKey *identity,
GNUNET_SCHEDULER_TaskCallback error_cb, void *error_cb_cls,
GNUNET_RECLAIM_AttributeResult proc, void *proc_cls,
GNUNET_SCHEDULER_TaskCallback finish_cb, void *finish_cb_cls);
@@ -332,7 +333,7 @@ GNUNET_RECLAIM_get_attributes_stop (
struct GNUNET_RECLAIM_CredentialIterator *
GNUNET_RECLAIM_get_credentials_start (
struct GNUNET_RECLAIM_Handle *h,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity,
+ const struct GNUNET_IDENTITY_PrivateKey *identity,
GNUNET_SCHEDULER_TaskCallback error_cb,
void *error_cb_cls,
GNUNET_RECLAIM_CredentialResult proc,
@@ -380,8 +381,8 @@ GNUNET_RECLAIM_get_credentials_stop (
struct GNUNET_RECLAIM_Operation *
GNUNET_RECLAIM_ticket_issue (
struct GNUNET_RECLAIM_Handle *h,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *iss,
- const struct GNUNET_CRYPTO_EcdsaPublicKey *rp,
+ const struct GNUNET_IDENTITY_PrivateKey *iss,
+ const struct GNUNET_IDENTITY_PublicKey *rp,
const struct GNUNET_RECLAIM_AttributeList *attrs,
GNUNET_RECLAIM_IssueTicketCallback cb, void *cb_cls);
@@ -402,7 +403,7 @@ GNUNET_RECLAIM_ticket_issue (
struct GNUNET_RECLAIM_Operation *
GNUNET_RECLAIM_ticket_revoke (
struct GNUNET_RECLAIM_Handle *h,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity,
+ const struct GNUNET_IDENTITY_PrivateKey *identity,
const struct GNUNET_RECLAIM_Ticket *ticket,
GNUNET_RECLAIM_ContinuationWithStatus cb, void *cb_cls);
@@ -422,7 +423,7 @@ GNUNET_RECLAIM_ticket_revoke (
struct GNUNET_RECLAIM_Operation *
GNUNET_RECLAIM_ticket_consume (
struct GNUNET_RECLAIM_Handle *h,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity,
+ const struct GNUNET_IDENTITY_PrivateKey *identity,
const struct GNUNET_RECLAIM_Ticket *ticket,
GNUNET_RECLAIM_AttributeTicketResult cb, void *cb_cls);
@@ -447,7 +448,7 @@ GNUNET_RECLAIM_ticket_consume (
struct GNUNET_RECLAIM_TicketIterator *
GNUNET_RECLAIM_ticket_iteration_start (
struct GNUNET_RECLAIM_Handle *h,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity,
+ const struct GNUNET_IDENTITY_PrivateKey *identity,
GNUNET_SCHEDULER_TaskCallback error_cb, void *error_cb_cls,
GNUNET_RECLAIM_TicketCallback proc, void *proc_cls,
GNUNET_SCHEDULER_TaskCallback finish_cb, void *finish_cb_cls);
diff --git a/src/include/gnunet_revocation_service.h
b/src/include/gnunet_revocation_service.h
index 105bb1149..d56116914 100644
--- a/src/include/gnunet_revocation_service.h
+++ b/src/include/gnunet_revocation_service.h
@@ -21,6 +21,8 @@
#ifndef GNUNET_REVOCATION_SERVICE_H_
#define GNUNET_REVOCATION_SERVICE_H_
+#include "gnunet_identity_service.h"
+
/**
* @author Christian Grothoff
*
@@ -50,6 +52,13 @@ extern "C"
*/
#define GNUNET_REVOCATION_VERSION 0x00000001
+/**
+ * Maximum length of a revocation
+ */
+#define GNUNET_REVOCATION_MAX_PROOF_SIZE sizeof(struct GNUNET_REVOCATION_PowP)
+\
+ sizeof(struct
GNUNET_IDENTITY_PublicKey) +\
+ 1024 //FIXME max sig_len
+
/**
* The proof-of-work narrowing factor.
* The number of PoWs that are calculates as part of revocation.
@@ -79,15 +88,7 @@ struct GNUNET_REVOCATION_PowP
*/
uint64_t pow[POW_COUNT] GNUNET_PACKED;
- /**
- * The signature
- */
- struct GNUNET_CRYPTO_EcdsaSignature signature;
-
- /**
- * The revoked public key
- */
- struct GNUNET_CRYPTO_EcdsaPublicKey key;
+ /** followed by the public key type, the key and a signature **/
};
@@ -101,15 +102,12 @@ struct GNUNET_REVOCATION_SignaturePurposePS
*/
struct GNUNET_CRYPTO_EccSignaturePurpose purpose;
- /**
- * The revoked public key
- */
- struct GNUNET_CRYPTO_EcdsaPublicKey key;
-
/**
* The timestamp of the revocation
*/
struct GNUNET_TIME_AbsoluteNBO timestamp;
+
+ /** Followed by the zone public key type and key **/
};
GNUNET_NETWORK_STRUCT_END
@@ -150,7 +148,7 @@ typedef void (*GNUNET_REVOCATION_Callback) (void *cls,
*/
struct GNUNET_REVOCATION_Query *
GNUNET_REVOCATION_query (const struct GNUNET_CONFIGURATION_Handle *cfg,
- const struct GNUNET_CRYPTO_EcdsaPublicKey *key,
+ const struct GNUNET_IDENTITY_PublicKey *key,
GNUNET_REVOCATION_Callback func, void *func_cls);
@@ -217,7 +215,7 @@ GNUNET_REVOCATION_check_pow (const struct
GNUNET_REVOCATION_PowP *pow,
* @param pow the pow object to work with in the calculation.
*/
void
-GNUNET_REVOCATION_pow_init (const struct GNUNET_CRYPTO_EcdsaPrivateKey *key,
+GNUNET_REVOCATION_pow_init (const struct GNUNET_IDENTITY_PrivateKey *key,
struct GNUNET_REVOCATION_PowP *pow);
@@ -256,6 +254,10 @@ GNUNET_REVOCATION_pow_round (struct
GNUNET_REVOCATION_PowCalculationHandle *pc);
void
GNUNET_REVOCATION_pow_stop (struct GNUNET_REVOCATION_PowCalculationHandle *pc);
+size_t
+GNUNET_REVOCATION_proof_get_size (const struct GNUNET_REVOCATION_PowP *pow);
+
+
#if 0 /* keep Emacsens' auto-indent happy */
{
#endif
diff --git a/src/include/gnunet_uri_lib.h b/src/include/gnunet_uri_lib.h
index d428bdd9a..57c9e9316 100644
--- a/src/include/gnunet_uri_lib.h
+++ b/src/include/gnunet_uri_lib.h
@@ -26,12 +26,13 @@
/**
* The struct where the parsed values will be stored:
*
- * scheme ":" [ "//" ] [ username ":" password "@" ] host [ ":" port ] [ "/" ]
[ path ] [ "?" query ]
+ * scheme ":" [ "//" ] [ username ":" password "@" ] host [ ":" port ] [ "/" ]
[ path ] [ "?" query ] [ "#" fragment ]
*
* Note: to make sure that no strings are copied, the first slash "/" in the
* path will be used to null terminate the hostname if no port is supplied.
*/
-struct GNUNET_Uri {
+struct GNUNET_Uri
+{
char *scheme; /* scheme, without ":" and "//" */
char *username; /* username, default: NULL */
char *password; /* password, default: NULL */
@@ -44,7 +45,8 @@ struct GNUNET_Uri {
/* A struct to hold the query string parameter values. */
-struct GNUNET_UriParam {
+struct GNUNET_UriParam
+{
char *key;
char *val;
};
diff --git a/src/json/Makefile.am b/src/json/Makefile.am
index 2ed05c35a..d4ea38adf 100644
--- a/src/json/Makefile.am
+++ b/src/json/Makefile.am
@@ -18,18 +18,15 @@ libgnunetjson_la_SOURCES = \
json.c \
json_mhd.c \
json_generator.c \
- json_helper.c \
- json_gnsrecord.c
+ json_helper.c
libgnunetjson_la_LIBADD = \
$(top_builddir)/src/util/libgnunetutil.la \
- $(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \
-ljansson \
$(MHD_LIBS) \
$(XLIB) \
$(Z_LIBS)
libgnunetjson_la_DEPENDENCIES = \
- $(top_builddir)/src/util/libgnunetutil.la \
- $(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la
+ $(top_builddir)/src/util/libgnunetutil.la
check_PROGRAMS = \
diff --git a/src/json/json.c b/src/json/json.c
index 0631c51bb..503702962 100644
--- a/src/json/json.c
+++ b/src/json/json.c
@@ -56,11 +56,17 @@ GNUNET_JSON_parse (const json_t *root,
if (NULL == spec[i].field)
pos = (json_t *) root;
else
- pos = json_object_get (root, spec[i].field);
- if ((NULL == pos) && (spec[i].is_optional))
+ pos = json_object_get (root,
+ spec[i].field);
+ if ( ( (NULL == pos) ||
+ (json_is_null (pos) ) ) &&
+ (spec[i].is_optional) )
continue;
- if ((NULL == pos) ||
- (GNUNET_OK != spec[i].parser (spec[i].cls, pos, &spec[i])))
+ if ( (NULL == pos) ||
+ (GNUNET_OK !=
+ spec[i].parser (spec[i].cls,
+ pos,
+ &spec[i])) )
{
if (NULL != error_json_name)
*error_json_name = spec[i].field;
diff --git a/src/json/json_generator.c b/src/json/json_generator.c
index 3f82a5f17..5806eb174 100644
--- a/src/json/json_generator.c
+++ b/src/json/json_generator.c
@@ -201,113 +201,5 @@ GNUNET_JSON_from_rsa_signature (const struct
GNUNET_CRYPTO_RsaSignature *sig)
}
-/**
- * Convert GNS record to JSON.
- *
- * @param rname name of record
- * @param rd record data
- * @return corresponding JSON encoding
- */
-json_t *
-GNUNET_JSON_from_gnsrecord (const char*rname,
- const struct GNUNET_GNSRECORD_Data *rd,
- unsigned int rd_count)
-{
- struct GNUNET_TIME_Absolute abs_exp;
- struct GNUNET_TIME_Relative rel_exp;
- const char *expiration_time_str;
- const char *record_type_str;
- char *value_str;
- json_t *data;
- json_t *record;
- json_t *records;
-
- data = json_object ();
- if (NULL == data)
- {
- GNUNET_break (0);
- return NULL;
- }
- if (0 !=
- json_object_set_new (data,
- "record_name",
- json_string (rname)))
- {
- GNUNET_break (0);
- json_decref (data);
- return NULL;
- }
- records = json_array ();
- if (NULL == records)
- {
- GNUNET_break (0);
- json_decref (data);
- return NULL;
- }
- for (int i = 0; i < rd_count; i++)
- {
- value_str = GNUNET_GNSRECORD_value_to_string (rd[i].record_type,
- rd[i].data,
- rd[i].data_size);
- if (GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION & rd[i].flags)
- {
- rel_exp.rel_value_us = rd[i].expiration_time;
- expiration_time_str = GNUNET_STRINGS_relative_time_to_string (rel_exp,
- GNUNET_NO);
- }
- else
- {
- abs_exp.abs_value_us = rd[i].expiration_time;
- expiration_time_str = GNUNET_STRINGS_absolute_time_to_string (abs_exp);
- }
- record_type_str = GNUNET_GNSRECORD_number_to_typename (rd[i].record_type);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Packing %s %s %s %d\n",
- value_str, record_type_str, expiration_time_str, rd[i].flags);
- record = json_pack ("{s:s,s:s,s:s,s:b,s:b,s:b,s:b}",
- "value",
- value_str,
- "record_type",
- record_type_str,
- "expiration_time",
- expiration_time_str,
- "private",
- rd[i].flags & GNUNET_GNSRECORD_RF_PRIVATE,
- "relative_expiration",
- rd[i].flags & GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION,
- "supplemental",
- rd[i].flags & GNUNET_GNSRECORD_RF_SUPPLEMENTAL,
- "shadow",
- rd[i].flags & GNUNET_GNSRECORD_RF_SHADOW_RECORD);
- GNUNET_free (value_str);
- if (NULL == record)
- {
- GNUNET_break (0);
- json_decref (records);
- json_decref (data);
- return NULL;
- }
- if (0 !=
- json_array_append_new (records,
- record))
- {
- GNUNET_break (0);
- json_decref (records);
- json_decref (data);
- return NULL;
- }
- }
- if (0 !=
- json_object_set_new (data,
- "data",
- records))
- {
- GNUNET_break (0);
- json_decref (data);
- return NULL;
- }
- return data;
-}
-
/* End of json/json_generator.c */
diff --git a/src/messenger/.gitignore b/src/messenger/.gitignore
new file mode 100644
index 000000000..9de3fb304
--- /dev/null
+++ b/src/messenger/.gitignore
@@ -0,0 +1,4 @@
+gnunet-service-messenger
+gnunet-messenger
+test_messenger_api
+test_messenger_anonymous
diff --git a/src/messenger/Makefile.am b/src/messenger/Makefile.am
new file mode 100644
index 000000000..ebe08290e
--- /dev/null
+++ b/src/messenger/Makefile.am
@@ -0,0 +1,131 @@
+# This Makefile.am is in the public domain
+AM_CPPFLAGS = -I$(top_srcdir)/src/include
+
+if USE_COVERAGE
+ AM_CFLAGS = --coverage -O0
+ XLIB = -lgcov
+endif
+
+pkgcfgdir= $(pkgdatadir)/config.d/
+
+libexecdir= $(pkglibdir)/libexec/
+
+pkgcfg_DATA = \
+ messenger.conf
+
+plugindir = $(libdir)/gnunet
+
+AM_CLFAGS = -g
+
+libexec_PROGRAMS = \
+ gnunet-service-messenger \
+ $(EXP_LIBEXEC)
+
+bin_PROGRAMS = \
+ gnunet-messenger
+
+lib_LTLIBRARIES = \
+ libgnunetmessenger_common.la \
+ libgnunetmessenger.la \
+ $(EXP_LIB)
+
+libgnunetmessenger_common_la_SOURCES = \
+ messenger_api_ego.h \
+ messenger_api_message.c messenger_api_message.h \
+ messenger_api_list_tunnels.c messenger_api_list_tunnels.h
+libgnunetmessenger_common_la_LIBADD = \
+ $(top_builddir)/src/util/libgnunetutil.la \
+ $(top_builddir)/src/identity/libgnunetidentity.la \
+ $(XLIB) \
+ $(LTLIBINTL)
+libgnunetmessenger_common_la_LDFLAGS = \
+ $(GN_LIB_LDFLAGS) \
+ -version-info 0:0:0
+
+libgnunetmessenger_la_SOURCES = \
+ messenger_api.c \
+ messenger_api_contact.c messenger_api_contact.h \
+ messenger_api_handle.c messenger_api_handle.h \
+ messenger_api_room.c messenger_api_room.h
+libgnunetmessenger_la_LIBADD = \
+ $(top_builddir)/src/util/libgnunetutil.la \
+ $(top_builddir)/src/identity/libgnunetidentity.la \
+ libgnunetmessenger_common.la \
+ $(XLIB) \
+ $(LTLIBINTL)
+libgnunetmessenger_la_LDFLAGS = \
+ $(GN_LIB_LDFLAGS) \
+ -version-info 0:0:0
+
+gnunet_messenger_SOURCES = \
+ gnunet-messenger.c
+gnunet_messenger_LDADD = \
+ libgnunetmessenger_common.la \
+ libgnunetmessenger.la \
+ $(top_builddir)/src/util/libgnunetutil.la
+gnunet_messenger_LDFLAGS = \
+ $(GN_LIBINTL)
+
+gnunet_service_messenger_SOURCES = \
+ gnunet-service-messenger.c gnunet-service-messenger.h \
+ gnunet-service-messenger_service.c gnunet-service-messenger_service.h \
+ gnunet-service-messenger_list_handles.c
gnunet-service-messenger_list_handles.h \
+ gnunet-service-messenger_list_messages.c
gnunet-service-messenger_list_messages.h \
+ gnunet-service-messenger_message_handle.c
gnunet-service-messenger_message_handle.h \
+ gnunet-service-messenger_message_kind.c
gnunet-service-messenger_message_kind.h \
+ gnunet-service-messenger_message_recv.c
gnunet-service-messenger_message_recv.h \
+ gnunet-service-messenger_message_send.c
gnunet-service-messenger_message_send.h \
+ gnunet-service-messenger_message_store.c
gnunet-service-messenger_message_store.h \
+ gnunet-service-messenger_basement.c gnunet-service-messenger_basement.h \
+ gnunet-service-messenger_contact.c gnunet-service-messenger_contact.h \
+ gnunet-service-messenger_handle.c gnunet-service-messenger_handle.h \
+ gnunet-service-messenger_room.c gnunet-service-messenger_room.h \
+ gnunet-service-messenger_tunnel.c gnunet-service-messenger_tunnel.h \
+ gnunet-service-messenger_util.c gnunet-service-messenger_util.h
+gnunet_service_messenger_LDADD = \
+ $(top_builddir)/src/util/libgnunetutil.la \
+ $(top_builddir)/src/cadet/libgnunetcadet.la \
+ $(top_builddir)/src/identity/libgnunetidentity.la \
+ libgnunetmessenger_common.la \
+ libgnunetmessenger.la \
+ $(GN_LIBINTL)
+
+check_PROGRAMS = \
+ test_messenger_api \
+ test_messenger_anonymous \
+ test_messenger_comm0
+
+if ENABLE_TEST_RUN
+AM_TESTS_ENVIRONMENT=export GNUNET_PREFIX=$${GNUNET_PREFIX:-@libdir@};export
PATH=$${GNUNET_PREFIX:-@prefix@}/bin:$$PATH;unset XDG_DATA_HOME;unset
XDG_CONFIG_HOME;
+TESTS = \
+ $(check_PROGRAMS)
+endif
+
+test_messenger_api_SOURCES = \
+ test_messenger.c
+test_messenger_api_LDADD = \
+ libgnunetmessenger_common.la \
+ libgnunetmessenger.la \
+ $(top_builddir)/src/testing/libgnunettesting.la \
+ $(top_builddir)/src/util/libgnunetutil.la
+
+test_messenger_anonymous_SOURCES = \
+ test_messenger_anonymous.c
+test_messenger_anonymous_LDADD = \
+ libgnunetmessenger_common.la \
+ libgnunetmessenger.la \
+ $(top_builddir)/src/testing/libgnunettesting.la \
+ $(top_builddir)/src/util/libgnunetutil.la
+
+test_messenger_comm0_SOURCES = \
+ test_messenger_comm0.c
+test_messenger_comm0_LDADD = \
+ libgnunetmessenger_common.la \
+ libgnunetmessenger.la \
+ $(top_builddir)/src/testbed/libgnunettestbed.la \
+ $(top_builddir)/src/testbed-logger/libgnunettestbedlogger.la \
+ $(top_builddir)/src/testing/libgnunettesting.la \
+ $(top_builddir)/src/util/libgnunetutil.la
+
+EXTRA_DIST = \
+ test_messenger_api.conf
diff --git a/src/messenger/gnunet-messenger.c b/src/messenger/gnunet-messenger.c
new file mode 100644
index 000000000..579e5c3ad
--- /dev/null
+++ b/src/messenger/gnunet-messenger.c
@@ -0,0 +1,306 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2020 GNUnet e.V.
+
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @author Tobias Frisch
+ * @file src/messenger/gnunet-messenger.c
+ * @brief Print information about messenger groups.
+ */
+
+#include <stdio.h>
+
+#include "platform.h"
+#include "gnunet_util_lib.h"
+#include "gnunet_messenger_service.h"
+
+struct GNUNET_MESSENGER_Handle *messenger;
+
+/**
+ * Function called whenever a message is received or sent.
+ *
+ * @param cls Closure
+ * @param room Room
+ * @param message Message
+ * @param hash Hash of message
+ */
+void
+on_message (void *cls, const struct GNUNET_MESSENGER_Room *room, const struct
GNUNET_MESSENGER_Message *message,
+ const struct GNUNET_HashCode *hash)
+{
+ struct GNUNET_MESSENGER_Contact *sender = GNUNET_MESSENGER_get_member (room,
&(message->header.sender_id));
+
+ const char *sender_name = GNUNET_MESSENGER_contact_get_name (sender);
+
+ if (!sender_name)
+ sender_name = "anonymous";
+
+ switch (message->header.kind)
+ {
+ case GNUNET_MESSENGER_KIND_JOIN:
+ {
+ printf ("* '%s' joined the room! [ %u %u %u %u ]\n", sender_name,
message->body.join.key.ecdsa_key.q_y[0],
+ message->body.join.key.ecdsa_key.q_y[1],
message->body.join.key.ecdsa_key.q_y[2],
+ message->body.join.key.ecdsa_key.q_y[3]);
+ break;
+ }
+ case GNUNET_MESSENGER_KIND_LEAVE:
+ {
+ printf ("* '%s' leaves the room!\n", sender_name);
+ break;
+ }
+ case GNUNET_MESSENGER_KIND_PEER:
+ {
+ printf ("* '%s' opened the room on: %s\n", sender_name, GNUNET_i2s_full
(&(message->body.peer.peer)));
+ break;
+ }
+ case GNUNET_MESSENGER_KIND_TEXT:
+ {
+ printf ("* '%s' says: \"%s\"\n", sender_name, message->body.text.text);
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+}
+
+struct GNUNET_SCHEDULER_Task *read_task;
+
+/**
+ * Task to shut down this application.
+ *
+ * @param cls Closure
+ */
+static void
+shutdown_hook (void *cls)
+{
+ struct GNUNET_MESSENGER_Room *room = cls;
+
+ if (read_task)
+ GNUNET_SCHEDULER_cancel (read_task);
+
+ if (room)
+ GNUNET_MESSENGER_close_room (room);
+
+ if (messenger)
+ GNUNET_MESSENGER_disconnect (messenger);
+}
+
+static void
+listen_stdio (void *cls);
+
+#define MAX_BUFFER_SIZE 60000
+
+/**
+ * Task run in stdio mode, after some data is available at stdin.
+ *
+ * @param cls Closure
+ */
+static void
+read_stdio (void *cls)
+{
+ read_task = NULL;
+
+ char buffer[MAX_BUFFER_SIZE];
+ ssize_t length;
+
+ length = read (0, buffer, MAX_BUFFER_SIZE);
+
+ if ((length <= 0) || (length >= MAX_BUFFER_SIZE))
+ {
+ GNUNET_SCHEDULER_shutdown ();
+ return;
+ }
+
+ if (buffer[length - 1] == '\n')
+ buffer[length - 1] = '\0';
+ else
+ buffer[length] = '\0';
+
+ struct GNUNET_MESSENGER_Room *room = cls;
+
+ struct GNUNET_MESSENGER_Message message;
+ message.header.kind = GNUNET_MESSENGER_KIND_TEXT;
+ message.body.text.text = buffer;
+
+ GNUNET_MESSENGER_send_message (room, &message);
+
+ read_task = GNUNET_SCHEDULER_add_now (listen_stdio, cls);
+}
+
+/**
+ * Wait for input on STDIO and send it out over the #ch.
+ *
+ * @param cls Closure
+ */
+static void
+listen_stdio (void *cls)
+{
+ read_task = NULL;
+
+ struct GNUNET_NETWORK_FDSet *rs = GNUNET_NETWORK_fdset_create ();
+
+ GNUNET_NETWORK_fdset_set_native (rs, 0);
+
+ read_task = GNUNET_SCHEDULER_add_select (GNUNET_SCHEDULER_PRIORITY_DEFAULT,
+ GNUNET_TIME_UNIT_FOREVER_REL,
+ rs,
+ NULL,
+ &read_stdio, cls);
+
+ GNUNET_NETWORK_fdset_destroy (rs);
+}
+
+/**
+ * Initial task to startup application.
+ *
+ * @param cls Closure
+ */
+static void
+idle (void *cls)
+{
+ struct GNUNET_MESSENGER_Room *room = cls;
+
+ printf ("* You joined the room.\n");
+
+ read_task = GNUNET_SCHEDULER_add_now (listen_stdio, room);
+}
+
+char *door_id;
+char *ego_name;
+char *room_key;
+
+struct GNUNET_SCHEDULER_Task *shutdown_task;
+
+/**
+ * Function called when an identity is retrieved.
+ *
+ * @param cls Closure
+ * @param handle Handle of messenger service
+ */
+static void
+on_identity (void *cls, struct GNUNET_MESSENGER_Handle *handle)
+{
+ struct GNUNET_HashCode key;
+ memset (&key, 0, sizeof(key));
+
+ if (room_key)
+ GNUNET_CRYPTO_hash (room_key, strlen (room_key), &key);
+
+ struct GNUNET_PeerIdentity *door = NULL;
+
+ if (door_id)
+ {
+ door = GNUNET_new(struct GNUNET_PeerIdentity);
+
+ if (GNUNET_OK != GNUNET_CRYPTO_eddsa_public_key_from_string (door_id,
strlen (door_id), &(door->public_key)))
+ {
+ GNUNET_free(door);
+ door = NULL;
+ }
+ }
+
+ const char *name = GNUNET_MESSENGER_get_name (handle);
+
+ if (!name)
+ name = "anonymous";
+
+ printf ("* Welcome to the messenger, '%s'!\n", name);
+
+ struct GNUNET_MESSENGER_Room *room;
+
+ if (door)
+ {
+ printf ("* You try to entry a room...\n");
+
+ room = GNUNET_MESSENGER_entry_room (messenger, door, &key);
+ }
+ else
+ {
+ printf ("* You try to open a room...\n");
+
+ room = GNUNET_MESSENGER_open_room (messenger, &key);
+ }
+
+ GNUNET_SCHEDULER_cancel (shutdown_task);
+
+ shutdown_task = GNUNET_SCHEDULER_add_shutdown (shutdown_hook, room);
+
+ if (!room)
+ GNUNET_SCHEDULER_shutdown ();
+ else
+ GNUNET_SCHEDULER_add_delayed_with_priority (GNUNET_TIME_relative_get_zero_
(), GNUNET_SCHEDULER_PRIORITY_IDLE, idle,
+ room);
+}
+
+/**
+ * Main function that will be run by the scheduler.
+ *
+ * @param cls closure
+ * @param args remaining command-line arguments
+ * @param cfgfile name of the configuration file used (for saving, can be
NULL!)
+ * @param cfg configuration
+ */
+static void
+run (void *cls, char *const*args, const char *cfgfile, const struct
GNUNET_CONFIGURATION_Handle *cfg)
+{
+ messenger = GNUNET_MESSENGER_connect (cfg, ego_name, &on_identity, NULL,
&on_message, NULL);
+
+ shutdown_task = GNUNET_SCHEDULER_add_shutdown (shutdown_hook, NULL);
+}
+
+/**
+ * The main function to obtain messenger information.
+ *
+ * @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 **argv)
+{
+ const char *description = "Open and connect to rooms using the MESSENGER to
chat.";
+
+ struct GNUNET_GETOPT_CommandLineOption options[] = {
+ GNUNET_GETOPT_option_string ('d',
+ "door",
+ "PEERIDENTITY",
+ "peer identity to entry into the room",
+ &door_id),
+ GNUNET_GETOPT_option_string ('e',
+ "ego",
+ "IDENTITY",
+ "identity to use for messaging",
+ &ego_name),
+ GNUNET_GETOPT_option_string ('r',
+ "room",
+ "ROOMKEY",
+ "key of the room to connect to",
+ &room_key),
+ GNUNET_GETOPT_OPTION_END };
+
+ return (GNUNET_OK == GNUNET_PROGRAM_run (argc,
+ argv,
+ "gnunet-messenger\0",
+ gettext_noop(description),
+ options,
+ &run,
+ NULL) ? EXIT_SUCCESS :
EXIT_FAILURE);
+}
diff --git a/src/messenger/gnunet-service-messenger.c
b/src/messenger/gnunet-service-messenger.c
new file mode 100644
index 000000000..2c92305c4
--- /dev/null
+++ b/src/messenger/gnunet-service-messenger.c
@@ -0,0 +1,306 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2020 GNUnet e.V.
+
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @author Tobias Frisch
+ * @file src/messenger/gnunet-service-messenger.c
+ * @brief GNUnet MESSENGER service
+ */
+
+#include "gnunet-service-messenger.h"
+
+#include "gnunet-service-messenger_service.h"
+#include "messenger_api_message.h"
+
+struct GNUNET_MESSENGER_Client
+{
+ struct GNUNET_SERVICE_Client *client;
+ struct GNUNET_MESSENGER_SrvHandle *handle;
+};
+
+struct GNUNET_MESSENGER_Service *messenger;
+
+static int
+check_create (void *cls, const struct GNUNET_MESSENGER_CreateMessage *msg)
+{
+ GNUNET_MQ_check_zero_termination(msg);
+ return GNUNET_OK;
+}
+
+static void
+handle_create (void *cls, const struct GNUNET_MESSENGER_CreateMessage *msg)
+{
+ struct GNUNET_MESSENGER_Client *msg_client = cls;
+
+ const char *name = ((const char*) msg) + sizeof(*msg);
+
+ GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Handle created with name: %s\n", name);
+
+ setup_handle_name (msg_client->handle, strlen (name) > 0? name : NULL);
+
+ GNUNET_SERVICE_client_continue (msg_client->client);
+}
+
+static void
+handle_update (void *cls, const struct GNUNET_MESSENGER_UpdateMessage *msg)
+{
+ struct GNUNET_MESSENGER_Client *msg_client = cls;
+
+ if (GNUNET_OK != update_handle (msg_client->handle))
+ GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Name is required to update key!\n");
+
+ GNUNET_SERVICE_client_continue (msg_client->client);
+}
+
+static void
+handle_destroy (void *cls, const struct GNUNET_MESSENGER_DestroyMessage *msg)
+{
+ struct GNUNET_MESSENGER_Client *msg_client = cls;
+
+ GNUNET_SERVICE_client_drop (msg_client->client);
+}
+
+static int
+check_set_name (void *cls, const struct GNUNET_MESSENGER_NameMessage *msg)
+{
+ GNUNET_MQ_check_zero_termination(msg);
+ return GNUNET_OK;
+}
+
+static void
+handle_set_name (void *cls, const struct GNUNET_MESSENGER_NameMessage *msg)
+{
+ struct GNUNET_MESSENGER_Client *msg_client = cls;
+
+ const char *name = ((const char*) msg) + sizeof(*msg);
+
+ GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Handles name is now: %s\n", name);
+
+ if (GNUNET_YES != set_handle_name (msg_client->handle, name))
+ GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "No valid name: %s\n", name);
+
+ GNUNET_SERVICE_client_continue (msg_client->client);
+}
+
+static void
+handle_room_open (void *cls, const struct GNUNET_MESSENGER_RoomMessage *msg)
+{
+ struct GNUNET_MESSENGER_Client *msg_client = cls;
+
+ GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Opening room: %s\n",
+ GNUNET_h2s (&(msg->key)));
+
+ if (GNUNET_YES == open_handle_room (msg_client->handle, &(msg->key)))
+ {
+ const struct GNUNET_ShortHashCode* member_id =
get_handle_member_id(msg_client->handle, &(msg->key));
+
+ GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Opening room with member id: %s\n",
+ GNUNET_sh2s (member_id));
+
+ struct GNUNET_MESSENGER_RoomMessage *response;
+ struct GNUNET_MQ_Envelope *env;
+
+ env = GNUNET_MQ_msg(response, GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_OPEN);
+ GNUNET_memcpy(&(response->key), &(msg->key), sizeof(msg->key));
+ GNUNET_MQ_send (msg_client->handle->mq, env);
+ }
+ else
+ GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "Opening room failed: %s\n",
+ GNUNET_h2s (&(msg->key)));
+
+ GNUNET_SERVICE_client_continue (msg_client->client);
+}
+
+static void
+handle_room_entry (void *cls, const struct GNUNET_MESSENGER_RoomMessage *msg)
+{
+ struct GNUNET_MESSENGER_Client *msg_client = cls;
+
+ GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Entering room: %s, %s\n",
+ GNUNET_h2s (&(msg->key)), GNUNET_i2s (&(msg->door)));
+
+ if (GNUNET_YES == entry_handle_room (msg_client->handle, &(msg->door),
&(msg->key)))
+ {
+ const struct GNUNET_ShortHashCode* member_id =
get_handle_member_id(msg_client->handle, &(msg->key));
+
+ GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Entering room with member id: %s\n",
+ GNUNET_sh2s (member_id));
+
+ struct GNUNET_MESSENGER_RoomMessage *response;
+ struct GNUNET_MQ_Envelope *env;
+
+ env = GNUNET_MQ_msg(response, GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_ENTRY);
+ GNUNET_memcpy(&(response->door), &(msg->door), sizeof(msg->door));
+ GNUNET_memcpy(&(response->key), &(msg->key), sizeof(msg->key));
+ GNUNET_MQ_send (msg_client->handle->mq, env);
+ }
+ else
+ GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "Entrance into room failed: %s, %s\n",
+ GNUNET_h2s (&(msg->key)), GNUNET_i2s (&(msg->door)));
+
+ GNUNET_SERVICE_client_continue (msg_client->client);
+}
+
+static void
+handle_room_close (void *cls, const struct GNUNET_MESSENGER_RoomMessage *msg)
+{
+ struct GNUNET_MESSENGER_Client *msg_client = cls;
+
+ GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Closing room: %s\n", GNUNET_h2s
(&(msg->key)));
+
+ if (GNUNET_YES == close_handle_room (msg_client->handle, &(msg->key)))
+ {
+ const struct GNUNET_ShortHashCode* member_id =
get_handle_member_id(msg_client->handle, &(msg->key));
+
+ GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Closing room with member id: %s\n",
+ GNUNET_sh2s (member_id));
+
+ struct GNUNET_MESSENGER_RoomMessage *response;
+ struct GNUNET_MQ_Envelope *env;
+
+ env = GNUNET_MQ_msg(response, GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_CLOSE);
+ GNUNET_memcpy(&(response->key), &(msg->key), sizeof(msg->key));
+ GNUNET_MQ_send (msg_client->handle->mq, env);
+ }
+ else
+ GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "Closing room failed: %s\n",
GNUNET_h2s (&(msg->key)));
+
+ GNUNET_SERVICE_client_continue (msg_client->client);
+}
+
+static int
+check_send_message (void *cls, const struct GNUNET_MESSENGER_SendMessage *msg)
+{
+ const uint16_t full_length = ntohs (msg->header.size) - sizeof(msg->header);
+
+ if (full_length < sizeof(msg->key))
+ return GNUNET_NO;
+
+ const uint16_t length = full_length - sizeof(msg->key);
+ const char *buffer = ((const char*) msg) + sizeof(*msg);
+
+ struct GNUNET_MESSENGER_Message message;
+
+ if (GNUNET_YES != decode_message (&message, length, buffer))
+ return GNUNET_NO;
+
+ return GNUNET_OK;
+}
+
+static void
+handle_send_message (void *cls, const struct GNUNET_MESSENGER_SendMessage *msg)
+{
+ struct GNUNET_MESSENGER_Client *msg_client = cls;
+
+ const struct GNUNET_HashCode *key = &(msg->key);
+ const char *buffer = ((const char*) msg) + sizeof(*msg);
+
+ const uint16_t length = ntohs (msg->header.size) - sizeof(*msg);
+
+ struct GNUNET_MESSENGER_Message message;
+ decode_message (&message, length, buffer);
+
+ GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Sending message: %s to %s\n",
+ GNUNET_MESSENGER_name_of_kind (message.header.kind),
+ GNUNET_h2s (key));
+
+ if (GNUNET_YES != send_handle_message (msg_client->handle, key, &message))
+ GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "Sending message failed: %s to %s\n",
+ GNUNET_MESSENGER_name_of_kind (message.header.kind),
+ GNUNET_h2s (key));
+
+ GNUNET_SERVICE_client_continue (msg_client->client);
+}
+
+static void
+handle_get_message (void *cls, const struct GNUNET_MESSENGER_RecvMessage *msg)
+{
+ struct GNUNET_MESSENGER_Client *msg_client = cls;
+
+ GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Requesting message from room: %s\n",
+ GNUNET_h2s (&(msg->key)));
+
+ struct GNUNET_MESSENGER_SrvRoom *room = get_service_room (messenger,
&(msg->key));
+
+ if (room)
+ get_room_message (room, msg_client->handle, &(msg->hash), GNUNET_YES);
+ else
+ GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "Room not found: %s\n",
+ GNUNET_h2s (&(msg->key)));
+
+ GNUNET_SERVICE_client_continue (msg_client->client);
+}
+
+static void*
+callback_client_connect (void *cls, struct GNUNET_SERVICE_Client *client,
struct GNUNET_MQ_Handle *mq)
+{
+ struct GNUNET_MESSENGER_Client *msg_client = GNUNET_new(struct
GNUNET_MESSENGER_Client);
+
+ msg_client->client = client;
+ msg_client->handle = add_service_handle (messenger, mq);
+
+ return msg_client;
+}
+
+static void
+callback_client_disconnect (void *cls, struct GNUNET_SERVICE_Client *client,
void *internal_cls)
+{
+ struct GNUNET_MESSENGER_Client *msg_client = internal_cls;
+
+ remove_service_handle (messenger, msg_client->handle);
+
+ GNUNET_free(msg_client);
+}
+
+/**
+ * Setup MESSENGER internals.
+ *
+ * @param cls closure
+ * @param config configuration to use
+ * @param service the initialized service
+ */
+static void
+run (void *cls, const struct GNUNET_CONFIGURATION_Handle *config, struct
GNUNET_SERVICE_Handle *service)
+{
+ messenger = create_service (config, service);
+
+ if ((!messenger) || (!messenger->cadet) || (!messenger->identity))
+ GNUNET_SCHEDULER_shutdown ();
+}
+
+/**
+ * Define "main" method using service macro.
+ */
+GNUNET_SERVICE_MAIN(
+ GNUNET_MESSENGER_SERVICE_NAME,
+ GNUNET_SERVICE_OPTION_NONE,
+ &run,
+ &callback_client_connect,
+ &callback_client_disconnect,
+ NULL,
+ GNUNET_MQ_hd_var_size( create,
GNUNET_MESSAGE_TYPE_MESSENGER_CONNECTION_CREATE, struct
GNUNET_MESSENGER_CreateMessage, NULL ),
+ GNUNET_MQ_hd_fixed_size( update,
GNUNET_MESSAGE_TYPE_MESSENGER_CONNECTION_UPDATE, struct
GNUNET_MESSENGER_UpdateMessage, NULL ),
+ GNUNET_MQ_hd_fixed_size( destroy,
GNUNET_MESSAGE_TYPE_MESSENGER_CONNECTION_DESTROY, struct
GNUNET_MESSENGER_DestroyMessage, NULL ),
+ GNUNET_MQ_hd_var_size( set_name,
GNUNET_MESSAGE_TYPE_MESSENGER_CONNECTION_SET_NAME, struct
GNUNET_MESSENGER_NameMessage, NULL ),
+ GNUNET_MQ_hd_fixed_size( room_open,
GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_OPEN, struct GNUNET_MESSENGER_RoomMessage,
NULL ),
+ GNUNET_MQ_hd_fixed_size( room_entry,
GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_ENTRY, struct GNUNET_MESSENGER_RoomMessage,
NULL ),
+ GNUNET_MQ_hd_fixed_size( room_close,
GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_CLOSE, struct GNUNET_MESSENGER_RoomMessage,
NULL ),
+ GNUNET_MQ_hd_var_size( send_message,
GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_SEND_MESSAGE, struct
GNUNET_MESSENGER_SendMessage, NULL ),
+ GNUNET_MQ_hd_fixed_size( get_message,
GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_GET_MESSAGE, struct
GNUNET_MESSENGER_RecvMessage, NULL ),
+ GNUNET_MQ_handler_end());
diff --git a/src/messenger/gnunet-service-messenger.h
b/src/messenger/gnunet-service-messenger.h
new file mode 100644
index 000000000..85a1d2549
--- /dev/null
+++ b/src/messenger/gnunet-service-messenger.h
@@ -0,0 +1,121 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2020 GNUnet e.V.
+
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @author Tobias Frisch
+ * @file src/messenger/gnunet-service-messenger.h
+ * @brief GNUnet MESSENGER service
+ */
+
+#ifndef GNUNET_SERVICE_MESSENGER_H
+#define GNUNET_SERVICE_MESSENGER_H
+
+#include "platform.h"
+#include "gnunet_cadet_service.h"
+#include "gnunet_container_lib.h"
+#include "gnunet_crypto_lib.h"
+#include "gnunet_identity_service.h"
+#include "gnunet_mq_lib.h"
+#include "gnunet_peer_lib.h"
+#include "gnunet_protocols.h"
+#include "gnunet_util_lib.h"
+
+/**
+ * Message to create a handle for a client
+ */
+struct GNUNET_MESSENGER_CreateMessage
+{
+ struct GNUNET_MessageHeader header;
+};
+
+/**
+ * Message to update the handle (its EGO key) for a client
+ */
+struct GNUNET_MESSENGER_UpdateMessage
+{
+ struct GNUNET_MessageHeader header;
+};
+
+/**
+ * Message to destroy the handle for a client
+ */
+struct GNUNET_MESSENGER_DestroyMessage
+{
+ struct GNUNET_MessageHeader header;
+};
+
+/**
+ * Message to receive the current name of a handle
+ */
+struct GNUNET_MESSENGER_NameMessage
+{
+ struct GNUNET_MessageHeader header;
+};
+
+/**
+ * Message to receive the current public key of a handle
+ */
+struct GNUNET_MESSENGER_KeyMessage
+{
+ struct GNUNET_MessageHeader header;
+ struct GNUNET_IDENTITY_PublicKey pubkey;
+};
+
+/**
+ * General message to confirm interaction with a room
+ */
+struct GNUNET_MESSENGER_RoomMessage
+{
+ struct GNUNET_MessageHeader header;
+
+ struct GNUNET_PeerIdentity door;
+ struct GNUNET_HashCode key;
+};
+
+/**
+ * Message to receive the current member id of a handle in room
+ */
+struct GNUNET_MESSENGER_MemberMessage
+{
+ struct GNUNET_MessageHeader header;
+
+ struct GNUNET_HashCode key;
+ struct GNUNET_ShortHashCode id;
+};
+
+/**
+ * Message to send something into a room
+ */
+struct GNUNET_MESSENGER_SendMessage
+{
+ struct GNUNET_MessageHeader header;
+ struct GNUNET_HashCode key;
+};
+
+/**
+ * Message to receive something from a room
+ */
+struct GNUNET_MESSENGER_RecvMessage
+{
+ struct GNUNET_MessageHeader header;
+ struct GNUNET_HashCode key;
+ struct GNUNET_HashCode hash;
+};
+
+#endif //GNUNET_SERVICE_MESSENGER_H
diff --git a/src/messenger/gnunet-service-messenger_basement.c
b/src/messenger/gnunet-service-messenger_basement.c
new file mode 100644
index 000000000..190cf2de5
--- /dev/null
+++ b/src/messenger/gnunet-service-messenger_basement.c
@@ -0,0 +1,58 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2020 GNUnet e.V.
+
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @author Tobias Frisch
+ * @file src/messenger/gnunet-service-messenger_basement.c
+ * @brief GNUnet MESSENGER service
+ */
+
+#include "gnunet-service-messenger_basement.h"
+
+size_t
+count_of_tunnels (const struct GNUNET_MESSENGER_ListTunnels *tunnels)
+{
+ const struct GNUNET_MESSENGER_ListTunnel *element;
+ size_t count = 0;
+
+ for (element = tunnels->head; element; element = element->next)
+ count++;
+
+ return count;
+}
+
+int
+should_connect_tunnel_to (size_t count, size_t src, size_t dst)
+{
+ if ((src + 1) % count == dst % count)
+ return GNUNET_YES;
+
+ return GNUNET_NO;
+}
+
+int
+required_connection_between (size_t count, size_t src, size_t dst)
+{
+ if (GNUNET_YES == should_connect_tunnel_to (count, src, dst))
+ return GNUNET_YES;
+ if (GNUNET_YES == should_connect_tunnel_to (count, dst, src))
+ return GNUNET_YES;
+
+ return GNUNET_NO;
+}
diff --git a/src/messenger/gnunet-service-messenger_basement.h
b/src/messenger/gnunet-service-messenger_basement.h
new file mode 100644
index 000000000..0a1a9b126
--- /dev/null
+++ b/src/messenger/gnunet-service-messenger_basement.h
@@ -0,0 +1,66 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2020 GNUnet e.V.
+
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @author Tobias Frisch
+ * @file src/messenger/gnunet-service-messenger_basement.h
+ * @brief GNUnet MESSENGER service
+ */
+
+#ifndef GNUNET_SERVICE_MESSENGER_BASEMENT_H
+#define GNUNET_SERVICE_MESSENGER_BASEMENT_H
+
+#include "messenger_api_list_tunnels.h"
+
+/**
+ * Returns the count of peers in a list (typically from the basement of a
room).
+ *
+ * @param tunnels List of peer identities
+ * @return Count of the entries in the list
+ */
+size_t
+count_of_tunnels (const struct GNUNET_MESSENGER_ListTunnels *tunnels);
+
+/**
+ * Returns GNUNET_YES or GNUNET_NO to determine if the peer at index
<i>src</i> should
+ * or should not connect outgoing to the peer at index <i>dst</i> to construct
a complete
+ * basement with a given <i>count</i> of peers.
+ *
+ * @param count Count of peers
+ * @param src Source index
+ * @param dst Destination index
+ * @return GNUNET_YES or GNUNET_NO based on topologic requirement
+ */
+int
+should_connect_tunnel_to (size_t count, size_t src, size_t dst);
+
+/**
+ * Returns GNUNET_YES or GNUNET_NO to determine if the peers of index
<i>src</i> and
+ * index <i>dst</i> should be connected in any direction to construct a
complete
+ * basement with a given <i>count</i> of peers.
+ *
+ * @param count Count of peers
+ * @param src Source index
+ * @param dst Destination index
+ * @return GNUNET_YES or GNUNET_NO based on topologic requirement
+ */
+int
+required_connection_between (size_t count, size_t src, size_t dst);
+
+#endif //GNUNET_SERVICE_MESSENGER_BASEMENT_H
diff --git a/src/messenger/gnunet-service-messenger_contact.c
b/src/messenger/gnunet-service-messenger_contact.c
new file mode 100644
index 000000000..1ec125402
--- /dev/null
+++ b/src/messenger/gnunet-service-messenger_contact.c
@@ -0,0 +1,96 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2020 GNUnet e.V.
+
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @author Tobias Frisch
+ * @file src/messenger/gnunet-service-messenger_contact.c
+ * @brief GNUnet MESSENGER service
+ */
+
+#include "gnunet-service-messenger_contact.h"
+
+struct GNUNET_MESSENGER_SrvContact*
+create_contact (const struct GNUNET_IDENTITY_PublicKey *key)
+{
+ struct GNUNET_MESSENGER_SrvContact *contact = GNUNET_new(struct
GNUNET_MESSENGER_SrvContact);
+
+ contact->name = NULL;
+ contact->rc = 0;
+
+ GNUNET_memcpy(&(contact->public_key), key, sizeof(contact->public_key));
+
+ return contact;
+}
+
+void
+destroy_contact (struct GNUNET_MESSENGER_SrvContact *contact)
+{
+ if (contact->name)
+ GNUNET_free(contact->name);
+
+ GNUNET_free(contact);
+}
+
+const char*
+get_contact_name (const struct GNUNET_MESSENGER_SrvContact *contact)
+{
+ return contact->name;
+}
+
+void
+set_contact_name (struct GNUNET_MESSENGER_SrvContact *contact, const char
*name)
+{
+ GNUNET_assert(name);
+
+ if (contact->name)
+ GNUNET_free(contact->name);
+
+ contact->name = GNUNET_strdup(name);
+}
+
+const struct GNUNET_IDENTITY_PublicKey*
+get_contact_key (const struct GNUNET_MESSENGER_SrvContact *contact)
+{
+ return &(contact->public_key);
+}
+
+void
+increase_contact_rc (struct GNUNET_MESSENGER_SrvContact *contact)
+{
+ contact->rc++;
+}
+
+int
+decrease_contact_rc (struct GNUNET_MESSENGER_SrvContact *contact)
+{
+ if (contact->rc > 0)
+ contact->rc--;
+
+ return contact->rc ? GNUNET_NO : GNUNET_YES;
+}
+
+const struct GNUNET_HashCode*
+get_contact_id_from_key (const struct GNUNET_MESSENGER_SrvContact *contact)
+{
+ static struct GNUNET_HashCode id;
+
+ GNUNET_CRYPTO_hash (&(contact->public_key), sizeof(contact->public_key),
&id);
+
+ return &id;
+}
diff --git a/src/messenger/gnunet-service-messenger_contact.h
b/src/messenger/gnunet-service-messenger_contact.h
new file mode 100644
index 000000000..4a4f8bf0f
--- /dev/null
+++ b/src/messenger/gnunet-service-messenger_contact.h
@@ -0,0 +1,112 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2020 GNUnet e.V.
+
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @author Tobias Frisch
+ * @file src/messenger/gnunet-service-messenger_contact.h
+ * @brief GNUnet MESSENGER service
+ */
+
+#ifndef GNUNET_SERVICE_MESSENGER_CONTACT_H
+#define GNUNET_SERVICE_MESSENGER_CONTACT_H
+
+#include "platform.h"
+#include "gnunet_crypto_lib.h"
+#include "gnunet_identity_service.h"
+
+struct GNUNET_MESSENGER_SrvContact
+{
+ char *name;
+ size_t rc;
+
+ struct GNUNET_IDENTITY_PublicKey public_key;
+};
+
+/**
+ * Creates and allocates a new contact with a given public <i>key</i> from an
EGO.
+ *
+ * @param key Public key
+ * @return New contact
+ */
+struct GNUNET_MESSENGER_SrvContact*
+create_contact (const struct GNUNET_IDENTITY_PublicKey *key);
+
+/**
+ * Destroys a contact and frees its memory fully.
+ *
+ * @param contact Contact
+ */
+void
+destroy_contact (struct GNUNET_MESSENGER_SrvContact *contact);
+
+/**
+ * Returns the current name of a given <i>contact</i> or NULL if no valid name
was assigned yet.
+ *
+ * @param contact Contact
+ * @return Name of the contact or NULL
+ */
+const char*
+get_contact_name (const struct GNUNET_MESSENGER_SrvContact *contact);
+
+/**
+ * Changes the current name of a given <i>contact</i> by copying it from the
parameter <i>name</i>.
+ *
+ * @param contact Contact
+ * @param name Valid name (may not be NULL!)
+ */
+void
+set_contact_name (struct GNUNET_MESSENGER_SrvContact *contact, const char
*name);
+
+/**
+ * Returns the public key of a given <i>contact</i>.
+ *
+ * @param contact Contact
+ * @return Public key of the contact
+ */
+const struct GNUNET_IDENTITY_PublicKey*
+get_contact_key (const struct GNUNET_MESSENGER_SrvContact *contact);
+
+/**
+ * Increases the reference counter of a given <i>contact</i> which is zero as
default.
+ *
+ * @param contact Contact
+ */
+void
+increase_contact_rc (struct GNUNET_MESSENGER_SrvContact *contact);
+
+/**
+ * Decreases the reference counter if possible (can not underflow!) of a given
<i>contact</i>
+ * and returns GNUNET_YES if the counter is equal to zero, otherwise GNUNET_NO.
+ *
+ * @param contact Contact
+ * @return GNUNET_YES or GNUNET_NO depending on the reference counter
+ */
+int
+decrease_contact_rc (struct GNUNET_MESSENGER_SrvContact *contact);
+
+/**
+ * Returns the resulting hashcode of the public key from a given
<i>contact</i>.
+ *
+ * @param contact Contact
+ * @return Hash of the contacts public key
+ */
+const struct GNUNET_HashCode*
+get_contact_id_from_key (const struct GNUNET_MESSENGER_SrvContact *contact);
+
+#endif //GNUNET_SERVICE_MESSENGER_CONTACT_H
diff --git a/src/messenger/gnunet-service-messenger_handle.c
b/src/messenger/gnunet-service-messenger_handle.c
new file mode 100644
index 000000000..38ad6fbb4
--- /dev/null
+++ b/src/messenger/gnunet-service-messenger_handle.c
@@ -0,0 +1,503 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2020 GNUnet e.V.
+
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @author Tobias Frisch
+ * @file src/messenger/gnunet-service-messenger_handle.c
+ * @brief GNUnet MESSENGER service
+ */
+
+#include "gnunet-service-messenger_handle.h"
+
+#include "gnunet-service-messenger.h"
+#include "gnunet-service-messenger_message_kind.h"
+
+struct GNUNET_MESSENGER_SrvHandle*
+create_handle (struct GNUNET_MESSENGER_Service *service, struct
GNUNET_MQ_Handle *mq)
+{
+ struct GNUNET_MESSENGER_SrvHandle *handle = GNUNET_new(struct
GNUNET_MESSENGER_SrvHandle);
+
+ handle->service = service;
+ handle->mq = mq;
+
+ handle->name = NULL;
+
+ handle->operation = NULL;
+
+ handle->ego = NULL;
+
+ handle->member_ids = GNUNET_CONTAINER_multihashmap_create (8, GNUNET_NO);
+
+ return handle;
+}
+
+int
+iterate_free_member_ids (void *cls, const struct GNUNET_HashCode *key, void
*value)
+{
+ GNUNET_free(value);
+
+ return GNUNET_YES;
+}
+
+void
+destroy_handle (struct GNUNET_MESSENGER_SrvHandle *handle)
+{
+ if (handle->service->dir)
+ save_handle_configuration(handle);
+
+ if (handle->operation)
+ GNUNET_IDENTITY_cancel (handle->operation);
+
+ if (handle->name)
+ GNUNET_free(handle->name);
+
+ GNUNET_CONTAINER_multihashmap_iterate (handle->member_ids,
iterate_free_member_ids, NULL);
+ GNUNET_CONTAINER_multihashmap_destroy (handle->member_ids);
+
+ GNUNET_free(handle);
+}
+
+void
+get_handle_data_subdir (struct GNUNET_MESSENGER_SrvHandle *handle, const char
*name, char **dir)
+{
+ if (name)
+ GNUNET_asprintf (dir, "%s%s%c%s%c", handle->service->dir, "identities",
+ DIR_SEPARATOR, name, DIR_SEPARATOR);
+ else
+ GNUNET_asprintf (dir, "%s%s%c", handle->service->dir, "anonymous",
+ DIR_SEPARATOR);
+}
+
+static int
+create_handle_member_id (const struct GNUNET_MESSENGER_SrvHandle *handle,
const struct GNUNET_HashCode *key)
+{
+ struct GNUNET_ShortHashCode *random_id = generate_service_new_member_id
(handle->service, key);
+
+ if (!random_id)
+ return GNUNET_NO;
+
+ if (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put (handle->member_ids, key,
random_id,
+
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST))
+ {
+ GNUNET_free(random_id);
+ return GNUNET_NO;
+ }
+
+ GNUNET_log(GNUNET_ERROR_TYPE_INFO, "Created a new member id (%s) for room:
%s\n",
+ GNUNET_sh2s(random_id), GNUNET_h2s(key));
+
+ return GNUNET_YES;
+}
+
+const struct GNUNET_ShortHashCode*
+get_handle_member_id (const struct GNUNET_MESSENGER_SrvHandle *handle, const
struct GNUNET_HashCode *key)
+{
+ return GNUNET_CONTAINER_multihashmap_get (handle->member_ids, key);
+}
+
+void
+change_handle_member_id (struct GNUNET_MESSENGER_SrvHandle *handle, const
struct GNUNET_HashCode *key,
+ const struct GNUNET_ShortHashCode *unique_id)
+{
+ struct GNUNET_ShortHashCode *member_id = GNUNET_CONTAINER_multihashmap_get
(handle->member_ids, key);
+
+ if (member_id)
+ {
+ GNUNET_log(GNUNET_ERROR_TYPE_INFO, "Changed a member id (%s) for room (%s)
",
+ GNUNET_sh2s(member_id), GNUNET_h2s(key));
+ GNUNET_log(GNUNET_ERROR_TYPE_INFO, "into (%s).\n",
+ GNUNET_sh2s(unique_id));
+
+ GNUNET_memcpy(member_id, unique_id, sizeof(*unique_id));
+
+ struct GNUNET_MESSENGER_MemberMessage *msg;
+ struct GNUNET_MQ_Envelope *env;
+
+ env = GNUNET_MQ_msg(msg,
GNUNET_MESSAGE_TYPE_MESSENGER_CONNECTION_MEMBER_ID);
+
+ GNUNET_memcpy(&(msg->key), key, sizeof(*key));
+ GNUNET_memcpy(&(msg->id), member_id, sizeof(*member_id));
+
+ GNUNET_MQ_send (handle->mq, env);
+ }
+ else
+ {
+ member_id = GNUNET_new(struct GNUNET_ShortHashCode);
+ GNUNET_memcpy(member_id, unique_id, sizeof(*member_id));
+
+ if (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put (handle->member_ids,
key, member_id,
+
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST))
+ GNUNET_free(member_id);
+ }
+}
+
+static void
+change_handle_name (struct GNUNET_MESSENGER_SrvHandle *handle, const char
*name)
+{
+ if (handle->name)
+ GNUNET_free(handle->name);
+
+ handle->name = name ? GNUNET_strdup(name) : NULL;
+
+ const uint16_t name_len = handle->name ? strlen (handle->name) : 0;
+
+ struct GNUNET_MESSENGER_NameMessage *msg;
+ struct GNUNET_MQ_Envelope *env;
+
+ env = GNUNET_MQ_msg_extra(msg, name_len + 1,
GNUNET_MESSAGE_TYPE_MESSENGER_CONNECTION_GET_NAME);
+
+ char *extra = ((char*) msg) + sizeof(*msg);
+
+ if (name_len)
+ GNUNET_memcpy(extra, handle->name, name_len);
+
+ extra[name_len] = '\0';
+
+ GNUNET_MQ_send (handle->mq, env);
+}
+
+static void
+change_handle_ego (struct GNUNET_MESSENGER_SrvHandle *handle, struct
GNUNET_MESSENGER_Ego *ego)
+{
+ handle->ego = ego;
+
+ ego = get_handle_ego(handle);
+
+ struct GNUNET_MESSENGER_KeyMessage *msg;
+ struct GNUNET_MQ_Envelope *env;
+
+ env = GNUNET_MQ_msg(msg, GNUNET_MESSAGE_TYPE_MESSENGER_CONNECTION_GET_KEY);
+
+ GNUNET_memcpy(&(msg->pubkey), &(ego->pub), sizeof(ego->pub));
+
+ GNUNET_MQ_send (handle->mq, env);
+}
+
+struct GNUNET_MESSENGER_Ego*
+get_handle_ego (struct GNUNET_MESSENGER_SrvHandle *handle)
+{
+ static struct GNUNET_MESSENGER_Ego anonymous;
+ static int read_keys = 0;
+
+ if (handle->ego)
+ return handle->ego;
+
+ if (!read_keys)
+ {
+ struct GNUNET_IDENTITY_Ego* ego = GNUNET_IDENTITY_ego_get_anonymous ();
+ GNUNET_memcpy(&(anonymous.priv), GNUNET_IDENTITY_ego_get_private_key(ego),
sizeof(anonymous.priv));
+ GNUNET_IDENTITY_ego_get_public_key(ego, &(anonymous.pub));
+ read_keys = 1;
+ }
+
+ return &anonymous;
+}
+
+void
+setup_handle_name (struct GNUNET_MESSENGER_SrvHandle *handle, const char *name)
+{
+ change_handle_name (handle, name);
+ change_handle_ego (handle, handle->name? lookup_service_ego(handle->service,
handle->name) : NULL);
+
+ if (handle->service->dir)
+ load_handle_configuration(handle);
+}
+
+struct GNUNET_MESSENGER_MessageHandle
+{
+ struct GNUNET_MESSENGER_SrvHandle *handle;
+ struct GNUNET_MESSENGER_Message *message;
+};
+
+static int
+iterate_send_message (void *cls, const struct GNUNET_HashCode *key, void
*value)
+{
+ struct GNUNET_MESSENGER_MessageHandle *msg_handle = cls;
+
+ send_handle_message (msg_handle->handle, key, msg_handle->message);
+
+ return GNUNET_YES;
+}
+
+static void
+callback_ego_create (void *cls, const struct GNUNET_IDENTITY_PrivateKey *key,
const char *emsg)
+{
+ struct GNUNET_MESSENGER_SrvHandle *handle = cls;
+
+ handle->operation = NULL;
+
+ if (emsg)
+ GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "%s\n", emsg);
+
+ if (key)
+ {
+ struct GNUNET_MESSENGER_MessageHandle msg_handle;
+
+ msg_handle.handle = handle;
+ msg_handle.message = create_message_key (key);
+
+ GNUNET_CONTAINER_multihashmap_iterate (handle->member_ids,
iterate_send_message, &msg_handle);
+
+ destroy_message (msg_handle.message);
+
+ update_service_ego(handle->service, handle->name, key);
+
+ change_handle_ego (handle, lookup_service_ego(handle->service,
handle->name));
+ }
+}
+
+int
+update_handle (struct GNUNET_MESSENGER_SrvHandle *handle)
+{
+ GNUNET_assert(handle);
+
+ if (!handle->name)
+ return GNUNET_SYSERR;
+
+ struct GNUNET_MESSENGER_Ego *ego = lookup_service_ego(handle->service,
handle->name);
+
+ if (!ego)
+ handle->operation = GNUNET_IDENTITY_create (handle->service->identity,
handle->name, NULL,
+ GNUNET_IDENTITY_TYPE_ECDSA,
callback_ego_create, handle);
+ else
+ change_handle_ego (handle, ego);
+
+ return GNUNET_OK;
+}
+
+int
+set_handle_name (struct GNUNET_MESSENGER_SrvHandle *handle, const char *name)
+{
+ GNUNET_assert(handle);
+
+ if ((name) && (lookup_service_ego(handle->service, name)))
+ return GNUNET_NO;
+
+ struct GNUNET_IDENTITY_Operation *operation = handle->operation;
+
+ if (handle->name)
+ handle->operation = GNUNET_IDENTITY_rename (handle->service->identity,
handle->name, name, NULL, NULL);
+
+ char *old_dir;
+ get_handle_data_subdir (handle, handle->name, &old_dir);
+
+ char *new_dir;
+ get_handle_data_subdir (handle, name, &new_dir);
+
+ int result = 0;
+
+ if (GNUNET_YES == GNUNET_DISK_directory_test (old_dir, GNUNET_YES))
+ {
+ GNUNET_DISK_directory_create_for_file (new_dir);
+
+ result = rename (old_dir, new_dir);
+ }
+ else if (GNUNET_YES == GNUNET_DISK_directory_test (new_dir, GNUNET_NO))
+ result = -1;
+
+ if (0 == result)
+ {
+ struct GNUNET_MESSENGER_MessageHandle msg_handle;
+
+ msg_handle.handle = handle;
+ msg_handle.message = create_message_name (name);
+
+ GNUNET_CONTAINER_multihashmap_iterate (handle->member_ids,
iterate_send_message, &msg_handle);
+
+ destroy_message (msg_handle.message);
+
+ change_handle_name (handle, name);
+
+ if (operation)
+ GNUNET_IDENTITY_cancel (operation);
+ }
+ else
+ {
+ if (handle->operation)
+ {
+ GNUNET_IDENTITY_cancel (handle->operation);
+
+ handle->operation = operation;
+ }
+ }
+
+ GNUNET_free(old_dir);
+ GNUNET_free(new_dir);
+
+ return (result == 0 ? GNUNET_OK : GNUNET_NO);
+}
+
+int
+open_handle_room (struct GNUNET_MESSENGER_SrvHandle *handle, const struct
GNUNET_HashCode *key)
+{
+ if ((!get_handle_member_id (handle, key)) && (GNUNET_YES !=
create_handle_member_id (handle, key)))
+ return GNUNET_NO;
+
+ return open_service_room (handle->service, handle, key);
+}
+
+int
+entry_handle_room (struct GNUNET_MESSENGER_SrvHandle *handle, const struct
GNUNET_PeerIdentity *door,
+ const struct GNUNET_HashCode *key)
+{
+ if ((!get_handle_member_id (handle, key)) && (GNUNET_YES !=
create_handle_member_id (handle, key)))
+ return GNUNET_NO;
+
+ return entry_service_room (handle->service, handle, door, key);
+}
+
+int
+close_handle_room (struct GNUNET_MESSENGER_SrvHandle *handle, const struct
GNUNET_HashCode *key)
+{
+ if (!get_handle_member_id (handle, key))
+ return GNUNET_NO;
+
+ return close_service_room (handle->service, handle, key);
+}
+
+int
+send_handle_message (struct GNUNET_MESSENGER_SrvHandle *handle, const struct
GNUNET_HashCode *key,
+ struct GNUNET_MESSENGER_Message *message)
+{
+ const struct GNUNET_ShortHashCode *id = get_handle_member_id (handle, key);
+
+ if (!id)
+ {
+ GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "It is required to be a member of a
room to send messages!\n");
+ return GNUNET_NO;
+ }
+
+ struct GNUNET_MESSENGER_SrvRoom *room = get_service_room (handle->service,
key);
+
+ if (!room)
+ {
+ GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "The room (%s) is unknown!\n",
GNUNET_h2s (key));
+ return GNUNET_NO;
+ }
+
+ struct GNUNET_HashCode hash;
+
+ GNUNET_memcpy(&(message->header.sender_id), id, sizeof(*id));
+
+ send_room_message (room, handle, message, &hash);
+ return GNUNET_YES;
+}
+
+static int callback_scan_for_rooms(void* cls, const char *filename) {
+ struct GNUNET_MESSENGER_SrvHandle* handle = cls;
+
+ struct GNUNET_CONFIGURATION_Handle* cfg = GNUNET_CONFIGURATION_create();
+
+ if ((GNUNET_YES == GNUNET_DISK_file_test(filename)) &&
+ (GNUNET_OK == GNUNET_CONFIGURATION_parse(cfg, filename)))
+ {
+ struct GNUNET_HashCode key;
+ struct GNUNET_ShortHashCode member_id;
+
+ if ((GNUNET_OK == GNUNET_CONFIGURATION_get_data(cfg, "room", "key", &key,
sizeof(key))) &&
+ (GNUNET_OK == GNUNET_CONFIGURATION_get_data(cfg, "room", "member_id",
&member_id, sizeof(member_id))))
+ change_handle_member_id(handle, &key, &member_id);
+ }
+
+ GNUNET_CONFIGURATION_destroy(cfg);
+ return GNUNET_OK;
+}
+
+void load_handle_configuration(struct GNUNET_MESSENGER_SrvHandle *handle) {
+ char* id_dir;
+ get_handle_data_subdir(handle, handle->name, &id_dir);
+
+ if (GNUNET_YES == GNUNET_DISK_directory_test(id_dir, GNUNET_YES))
+ {
+ char* scan_dir;
+ GNUNET_asprintf(&scan_dir, "%s%s%c", id_dir, "rooms", DIR_SEPARATOR);
+
+ if (GNUNET_OK == GNUNET_DISK_directory_test(scan_dir, GNUNET_YES))
+ GNUNET_DISK_directory_scan(scan_dir, callback_scan_for_rooms, handle);
+
+ GNUNET_free(scan_dir);
+ }
+
+ GNUNET_free(id_dir);
+}
+
+static int
+iterate_save_rooms(void* cls, const struct GNUNET_HashCode* key, void* value)
+{
+ struct GNUNET_MESSENGER_SrvHandle* handle = cls;
+ struct GNUNET_ShortHashCode* member_id = value;
+
+ char* id_dir;
+ get_handle_data_subdir(handle, handle->name, &id_dir);
+
+ char* filename;
+ GNUNET_asprintf(&filename, "%s%s%c%s.cfg",
+ id_dir, "rooms", DIR_SEPARATOR,
+ GNUNET_h2s(key));
+
+ GNUNET_free(id_dir);
+
+ struct GNUNET_CONFIGURATION_Handle* cfg = GNUNET_CONFIGURATION_create();
+
+ char* key_data = GNUNET_STRINGS_data_to_string_alloc(key, sizeof(*key));
+
+ if (key_data)
+ {
+ GNUNET_CONFIGURATION_set_value_string(cfg, "room", "key", key_data);
+
+ GNUNET_free(key_data);
+ }
+
+ char* member_id_data = GNUNET_STRINGS_data_to_string_alloc(member_id,
sizeof(*member_id));
+
+ if (member_id_data)
+ {
+ GNUNET_CONFIGURATION_set_value_string(cfg, "room", "member_id",
member_id_data);
+
+ GNUNET_free(member_id_data);
+ }
+
+ GNUNET_CONFIGURATION_write(cfg, filename);
+ GNUNET_CONFIGURATION_destroy(cfg);
+
+ GNUNET_free(filename);
+
+ return GNUNET_YES;
+}
+
+void save_handle_configuration(struct GNUNET_MESSENGER_SrvHandle *handle)
+{
+ char* id_dir;
+ get_handle_data_subdir(handle, handle->name, &id_dir);
+
+ if ((GNUNET_YES == GNUNET_DISK_directory_test(id_dir, GNUNET_NO)) ||
+ (GNUNET_OK == GNUNET_DISK_directory_create(id_dir)))
+ {
+ char* save_dir;
+ GNUNET_asprintf(&save_dir, "%s%s%c", id_dir, "rooms", DIR_SEPARATOR);
+
+ if ((GNUNET_YES == GNUNET_DISK_directory_test(save_dir, GNUNET_NO)) ||
+ (GNUNET_OK == GNUNET_DISK_directory_create(save_dir)))
+ GNUNET_CONTAINER_multihashmap_iterate(handle->member_ids,
iterate_save_rooms, handle);
+
+ GNUNET_free(save_dir);
+ }
+
+ GNUNET_free(id_dir);
+}
diff --git a/src/messenger/gnunet-service-messenger_handle.h
b/src/messenger/gnunet-service-messenger_handle.h
new file mode 100644
index 000000000..81cf377a8
--- /dev/null
+++ b/src/messenger/gnunet-service-messenger_handle.h
@@ -0,0 +1,216 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2020 GNUnet e.V.
+
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @author Tobias Frisch
+ * @file src/messenger/gnunet-service-messenger_handle.h
+ * @brief GNUnet MESSENGER service
+ */
+
+#ifndef GNUNET_SERVICE_MESSENGER_HANDLE_H
+#define GNUNET_SERVICE_MESSENGER_HANDLE_H
+
+#include "platform.h"
+#include "gnunet_cadet_service.h"
+#include "gnunet_container_lib.h"
+#include "gnunet_crypto_lib.h"
+#include "gnunet_identity_service.h"
+#include "gnunet_peer_lib.h"
+#include "gnunet_mq_lib.h"
+
+#include "gnunet-service-messenger_service.h"
+
+#include "messenger_api_ego.h"
+#include "messenger_api_message.h"
+
+struct GNUNET_MESSENGER_SrvHandle
+{
+ struct GNUNET_MESSENGER_Service *service;
+ struct GNUNET_MQ_Handle *mq;
+
+ char *name;
+
+ struct GNUNET_IDENTITY_Operation *operation;
+
+ struct GNUNET_MESSENGER_Ego *ego;
+
+ struct GNUNET_CONTAINER_MultiHashMap *member_ids;
+};
+
+/**
+ * Creates and allocates a new handle related to a <i>service</i> and using a
given <i>mq</i> (message queue).
+ *
+ * @param service MESSENGER Service
+ * @param mq Message queue
+ * @return New handle
+ */
+struct GNUNET_MESSENGER_SrvHandle*
+create_handle (struct GNUNET_MESSENGER_Service *service, struct
GNUNET_MQ_Handle *mq);
+
+/**
+ * Destroys a handle and frees its memory fully.
+ *
+ * @param handle Handle
+ */
+void
+destroy_handle (struct GNUNET_MESSENGER_SrvHandle *handle);
+
+/**
+ * Writes the path of the directory for a given <i>handle</i> using a specific
<i>name</i> to the parameter
+ * <i>dir</i>. This directory will be used to store data regarding the handle
and its messages.
+ *
+ * @param handle Handle
+ * @param name Potential name of the handle
+ * @param dir[out] Path to store data
+ */
+void
+get_handle_data_subdir (struct GNUNET_MESSENGER_SrvHandle *handle, const char
*name, char **dir);
+
+/**
+ * Returns the member id of a given <i>handle</i> in a specific <i>room</i>.
+ *
+ * If the handle is not a member of the specific <i>room</i>, NULL gets
returned.
+ *
+ * @param handle Handle
+ * @param key Key of a room
+ * @return Member id or NULL
+ */
+const struct GNUNET_ShortHashCode*
+get_handle_member_id (const struct GNUNET_MESSENGER_SrvHandle *handle, const
struct GNUNET_HashCode *key);
+
+/**
+ * Changes the member id of a given <i>handle</i> in a specific <i>room</i> to
match a <i>unique_id</i>.
+ *
+ * The client connected to the <i>handle</i> will be informed afterwards
automatically.
+ *
+ * @param handle Handle
+ * @param key Key of a room
+ * @param unique_id Unique member id
+ */
+void
+change_handle_member_id (struct GNUNET_MESSENGER_SrvHandle *handle, const
struct GNUNET_HashCode *key,
+ const struct GNUNET_ShortHashCode *unique_id);
+
+/**
+ * Returns the EGO used by a given <i>handle</i>.
+ *
+ * @param handle Handle
+ * @return EGO keypair
+ */
+struct GNUNET_MESSENGER_Ego*
+get_handle_ego (struct GNUNET_MESSENGER_SrvHandle *handle);
+
+/**
+ * Tries to set the name and EGO key of a <i>handle</i> initially by looking
up a specific <i>name</i>.
+ *
+ * @param handle Handle
+ * @param name Name (optionally: valid EGO name)
+ */
+void
+setup_handle_name (struct GNUNET_MESSENGER_SrvHandle *handle, const char
*name);
+
+/**
+ * Tries to change the keypair of an EGO of a <i>handle</i> under the same
name and informs all rooms
+ * about the change automatically.
+ *
+ * @param handle Handle
+ * @return GNUNET_OK on success, otherwise GNUNET_SYSERR
+ */
+int
+update_handle (struct GNUNET_MESSENGER_SrvHandle *handle);
+
+/**
+ * Tries to rename the handle which implies renaming the EGO its using and
moving all related data into
+ * the directory fitting to the changed <i>name</i>.
+ *
+ * The client connected to the <i>handle</i> will be informed afterwards
automatically.
+ *
+ * @param handle Handle
+ * @param name New name
+ * @return GNUNET_OK on success, otherwise GNUNET_NO
+ */
+int
+set_handle_name (struct GNUNET_MESSENGER_SrvHandle *handle, const char *name);
+
+/**
+ * Makes a given <i>handle</i> a member of the room using a specific
<i>key</i> and opens the
+ * room from the handles service.
+ *
+ * @param handle Handle
+ * @param key Key of a room
+ * @return GNUNET_YES on success, otherwise GNUNET_NO
+ */
+int
+open_handle_room (struct GNUNET_MESSENGER_SrvHandle *handle, const struct
GNUNET_HashCode *key);
+
+/**
+ * Makes a given <i>handle</i> a member of the room using a specific
<i>key</i> and enters the room
+ * through a tunnel to a peer identified by a given <i>door</i> (peer
identity).
+ *
+ * @param handle Handle
+ * @param door Peer identity
+ * @param key Key of a room
+ * @return GNUNET_YES on success, otherwise GNUNET_NO
+ */
+int
+entry_handle_room (struct GNUNET_MESSENGER_SrvHandle *handle, const struct
GNUNET_PeerIdentity *door,
+ const struct GNUNET_HashCode *key);
+
+/**
+ * Removes the membership of the room using a specific <i>key</i> and closes
it if no other handle
+ * from this service is still a member of it.
+ *
+ * @param handle Handle
+ * @param key Key of a room
+ * @return GNUNET_YES on success, otherwise GNUNET_NO
+ */
+int
+close_handle_room (struct GNUNET_MESSENGER_SrvHandle *handle, const struct
GNUNET_HashCode *key);
+
+/**
+ * Sends a <i>message</i> from a given <i>handle</i> to the room using a
specific <i>key</i>.
+ *
+ * @param handle Handle
+ * @param key Key of a room
+ * @param message Message
+ * @return GNUNET_YES on success, otherwise GNUNET_NO
+ */
+int
+send_handle_message (struct GNUNET_MESSENGER_SrvHandle *handle, const struct
GNUNET_HashCode *key,
+ struct GNUNET_MESSENGER_Message *message);
+
+/**
+ * Loads member ids and other potential configuration from a given
<i>handle</i> which
+ * depends on the given name the <i>handle</i> uses.
+ *
+ * @param handle Handle
+ */
+void
+load_handle_configuration(struct GNUNET_MESSENGER_SrvHandle *handle);
+
+/**
+ * Saves member ids and other potential configuration from a given
<i>handle</i> which
+ * depends on the given name the <i>handle</i> uses.
+ *
+ * @param handle Handle
+ */
+void
+save_handle_configuration(struct GNUNET_MESSENGER_SrvHandle *handle);
+
+#endif //GNUNET_SERVICE_MESSENGER_HANDLE_H
diff --git a/src/messenger/gnunet-service-messenger_list_handles.c
b/src/messenger/gnunet-service-messenger_list_handles.c
new file mode 100644
index 000000000..16a160dea
--- /dev/null
+++ b/src/messenger/gnunet-service-messenger_list_handles.c
@@ -0,0 +1,95 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2020 GNUnet e.V.
+
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @author Tobias Frisch
+ * @file src/messenger/gnunet-service-messenger_list_handles.c
+ * @brief GNUnet MESSENGER service
+ */
+
+#include "gnunet-service-messenger_list_handles.h"
+
+#include "gnunet-service-messenger_handle.h"
+
+void
+init_list_handles (struct GNUNET_MESSENGER_ListHandles *handles)
+{
+ GNUNET_assert(handles);
+
+ handles->head = NULL;
+ handles->tail = NULL;
+}
+
+void
+clear_list_handles (struct GNUNET_MESSENGER_ListHandles *handles)
+{
+ GNUNET_assert(handles);
+
+ while (handles->head)
+ {
+ struct GNUNET_MESSENGER_ListHandle *element = handles->head;
+
+ GNUNET_CONTAINER_DLL_remove(handles->head, handles->tail, element);
+ destroy_handle (element->handle);
+ GNUNET_free(element);
+ }
+
+ handles->head = NULL;
+ handles->tail = NULL;
+}
+
+void
+add_list_handle (struct GNUNET_MESSENGER_ListHandles *handles, void *handle)
+{
+ struct GNUNET_MESSENGER_ListHandle *element = GNUNET_new(struct
GNUNET_MESSENGER_ListHandle);
+
+ element->handle = handle;
+
+ GNUNET_CONTAINER_DLL_insert_tail(handles->head, handles->tail, element);
+}
+
+int
+remove_list_handle (struct GNUNET_MESSENGER_ListHandles *handles, void *handle)
+{
+ struct GNUNET_MESSENGER_ListHandle *element;
+
+ for (element = handles->head; element; element = element->next)
+ if (element->handle == handle)
+ break;
+
+ if (!element)
+ return GNUNET_NO;
+
+ GNUNET_CONTAINER_DLL_remove(handles->head, handles->tail, element);
+ GNUNET_free(element);
+
+ return GNUNET_YES;
+}
+
+void*
+find_list_handle_by_member (struct GNUNET_MESSENGER_ListHandles *handles,
const struct GNUNET_HashCode *key)
+{
+ struct GNUNET_MESSENGER_ListHandle *element;
+
+ for (element = handles->head; element; element = element->next)
+ if (get_handle_member_id ((struct GNUNET_MESSENGER_SrvHandle*)
element->handle, key))
+ return element->handle;
+
+ return NULL;
+}
diff --git a/src/messenger/gnunet-service-messenger_list_handles.h
b/src/messenger/gnunet-service-messenger_list_handles.h
new file mode 100644
index 000000000..fe92cc58a
--- /dev/null
+++ b/src/messenger/gnunet-service-messenger_list_handles.h
@@ -0,0 +1,96 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2020 GNUnet e.V.
+
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @author Tobias Frisch
+ * @file src/messenger/gnunet-service-messenger_list_handles.h
+ * @brief GNUnet MESSENGER service
+ */
+
+#ifndef GNUNET_SERVICE_MESSENGER_LIST_HANDLES_H
+#define GNUNET_SERVICE_MESSENGER_LIST_HANDLES_H
+
+#include "platform.h"
+#include "gnunet_crypto_lib.h"
+#include "gnunet_container_lib.h"
+
+struct GNUNET_MESSENGER_ListHandle
+{
+ struct GNUNET_MESSENGER_ListHandle *prev;
+ struct GNUNET_MESSENGER_ListHandle *next;
+
+ void *handle;
+};
+
+struct GNUNET_MESSENGER_ListHandles
+{
+ struct GNUNET_MESSENGER_ListHandle *head;
+ struct GNUNET_MESSENGER_ListHandle *tail;
+};
+
+/**
+ * Initializes list of handles as empty list.
+ *
+ * @param handles List of handles
+ */
+void
+init_list_handles (struct GNUNET_MESSENGER_ListHandles *handles);
+
+/**
+ * Destroys remaining handles and clears the list.
+ *
+ * @param handles List of handles
+ */
+void
+clear_list_handles (struct GNUNET_MESSENGER_ListHandles *handles);
+
+/**
+ * Adds a specific <i>handle</i> to the end of the list.
+ *
+ * @param handles List of handles
+ * @param handle Handle
+ */
+void
+add_list_handle (struct GNUNET_MESSENGER_ListHandles *handles, void *handle);
+
+/**
+ * Removes the first entry matching with a specific <i>handle</i> from the
list and
+ * returns GNUNET_YES on success or GNUNET_NO on failure.
+ *
+ * @param handles List of handles
+ * @param handle Handle
+ * @return GNUNET_YES on success, otherwise GNUNET_NO
+ */
+int
+remove_list_handle (struct GNUNET_MESSENGER_ListHandles *handles, void
*handle);
+
+/**
+ * Searches linearly through the list of handles for members of a specific room
+ * which is identified by a given <i>key</i>.
+ *
+ * If no handle is found which is a current member, NULL gets returned.
+ *
+ * @param handles List of handles
+ * @param key Common key of a room
+ * @return First handle which is a current member
+ */
+void*
+find_list_handle_by_member (struct GNUNET_MESSENGER_ListHandles *handles,
const struct GNUNET_HashCode *key);
+
+#endif //GNUNET_SERVICE_MESSENGER_LIST_HANDLES_H
diff --git a/src/messenger/gnunet-service-messenger_list_messages.c
b/src/messenger/gnunet-service-messenger_list_messages.c
new file mode 100644
index 000000000..c4f1f7043
--- /dev/null
+++ b/src/messenger/gnunet-service-messenger_list_messages.c
@@ -0,0 +1,76 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2020 GNUnet e.V.
+
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @author Tobias Frisch
+ * @file src/messenger/gnunet-service-messenger_list_messages.c
+ * @brief GNUnet MESSENGER service
+ */
+
+#include "gnunet-service-messenger_list_messages.h"
+
+void
+init_list_messages (struct GNUNET_MESSENGER_ListMessages *messages)
+{
+ GNUNET_assert(messages);
+
+ messages->head = NULL;
+ messages->tail = NULL;
+}
+
+void
+clear_list_messages (struct GNUNET_MESSENGER_ListMessages *messages)
+{
+ GNUNET_assert(messages);
+
+ while (messages->head)
+ {
+ struct GNUNET_MESSENGER_ListMessage *element = messages->head;
+
+ GNUNET_CONTAINER_DLL_remove(messages->head, messages->tail, element);
+ GNUNET_free(element);
+ }
+
+ messages->head = NULL;
+ messages->tail = NULL;
+}
+
+void
+add_to_list_messages (struct GNUNET_MESSENGER_ListMessages *messages, const
struct GNUNET_HashCode *hash)
+{
+ struct GNUNET_MESSENGER_ListMessage *element = GNUNET_new(struct
GNUNET_MESSENGER_ListMessage);
+
+ GNUNET_memcpy(&(element->hash), hash, sizeof(struct GNUNET_HashCode));
+
+ GNUNET_CONTAINER_DLL_insert_tail(messages->head, messages->tail, element);
+}
+
+void
+remove_from_list_messages (struct GNUNET_MESSENGER_ListMessages *messages,
const struct GNUNET_HashCode *hash)
+{
+ struct GNUNET_MESSENGER_ListMessage *element;
+
+ for (element = messages->head; element; element = element->next)
+ if (0 == GNUNET_CRYPTO_hash_cmp (&(element->hash), hash))
+ {
+ GNUNET_CONTAINER_DLL_remove(messages->head, messages->tail, element);
+ GNUNET_free(element);
+ break;
+ }
+}
diff --git a/src/messenger/gnunet-service-messenger_list_messages.h
b/src/messenger/gnunet-service-messenger_list_messages.h
new file mode 100644
index 000000000..266c30ec6
--- /dev/null
+++ b/src/messenger/gnunet-service-messenger_list_messages.h
@@ -0,0 +1,81 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2020 GNUnet e.V.
+
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @author Tobias Frisch
+ * @file src/messenger/gnunet-service-messenger_list_messages.h
+ * @brief GNUnet MESSENGER service
+ */
+
+#ifndef GNUNET_SERVICE_MESSENGER_LIST_MESSAGES_H
+#define GNUNET_SERVICE_MESSENGER_LIST_MESSAGES_H
+
+#include "platform.h"
+#include "gnunet_crypto_lib.h"
+#include "gnunet_container_lib.h"
+
+struct GNUNET_MESSENGER_ListMessage
+{
+ struct GNUNET_MESSENGER_ListMessage *prev;
+ struct GNUNET_MESSENGER_ListMessage *next;
+
+ struct GNUNET_HashCode hash;
+};
+
+struct GNUNET_MESSENGER_ListMessages
+{
+ struct GNUNET_MESSENGER_ListMessage *head;
+ struct GNUNET_MESSENGER_ListMessage *tail;
+};
+
+/**
+ * Initializes list of message hashes as empty list.
+ *
+ * @param messages List of hashes
+ */
+void
+init_list_messages (struct GNUNET_MESSENGER_ListMessages *messages);
+
+/**
+ * Clears the list of message hashes.
+ *
+ * @param messages List of hashes
+ */
+void
+clear_list_messages (struct GNUNET_MESSENGER_ListMessages *messages);
+
+/**
+ * Adds a specific <i>hash</i> from a message to the end of the list.
+ *
+ * @param messages List of hashes
+ * @param hash Hash of message
+ */
+void
+add_to_list_messages (struct GNUNET_MESSENGER_ListMessages *messages, const
struct GNUNET_HashCode *hash);
+
+/**
+ * Removes the first entry with a matching <i>hash</i> from the list.
+ *
+ * @param messages List of hashes
+ * @param hash Hash of message
+ */
+void
+remove_from_list_messages (struct GNUNET_MESSENGER_ListMessages *messages,
const struct GNUNET_HashCode *hash);
+
+#endif //GNUNET_SERVICE_MESSENGER_LIST_MESSAGES_H
diff --git a/src/messenger/gnunet-service-messenger_message_handle.c
b/src/messenger/gnunet-service-messenger_message_handle.c
new file mode 100644
index 000000000..1652435c8
--- /dev/null
+++ b/src/messenger/gnunet-service-messenger_message_handle.c
@@ -0,0 +1,130 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2020 GNUnet e.V.
+
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @author Tobias Frisch
+ * @file src/messenger/gnunet-service-messenger_message_handle.c
+ * @brief GNUnet MESSENGER service
+ */
+
+#include "gnunet-service-messenger_message_handle.h"
+
+void
+handle_message_join (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvTunnel *tunnel,
+ struct GNUNET_MESSENGER_Message *message, const struct
GNUNET_HashCode *hash)
+{
+ struct GNUNET_MESSENGER_SrvContact *contact = get_room_contact (room,
&(message->header.sender_id));
+
+ if (!contact)
+ add_room_contact (room, &(message->header.sender_id),
&(message->body.join.key));
+
+ struct GNUNET_MESSENGER_MemberInfo *info = get_room_member_info (room,
&(message->header.sender_id));
+
+ if (!info)
+ {
+ info = GNUNET_new(struct GNUNET_MESSENGER_MemberInfo);
+
+ info->access = GNUNET_MESSENGER_MEMBER_UNKNOWN;
+ init_list_messages (&(info->session_messages));
+ }
+ else
+ clear_list_messages (&(info->session_messages));
+
+ if (GNUNET_YES == GNUNET_CONTAINER_multishortmap_put (room->member_infos,
&(message->header.sender_id), info,
+
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST))
+ add_to_list_messages (&(info->session_messages), hash);
+}
+
+void
+handle_message_leave (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvTunnel *tunnel,
+ struct GNUNET_MESSENGER_Message *message, const struct
GNUNET_HashCode *hash)
+{
+ struct GNUNET_MESSENGER_MemberInfo *info = get_room_member_info (room,
&(message->header.sender_id));
+
+ if (info)
+ clear_list_messages (&(info->session_messages));
+}
+
+void
+handle_message_name (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvTunnel *tunnel,
+ struct GNUNET_MESSENGER_Message *message, const struct
GNUNET_HashCode *hash)
+{
+ struct GNUNET_MESSENGER_SrvContact *contact = get_room_contact (room,
&(message->header.sender_id));
+
+ if (contact)
+ set_contact_name (contact, message->body.name.name);
+
+ struct GNUNET_MESSENGER_MemberInfo *info = get_room_member_info (room,
&(message->header.sender_id));
+
+ if (info)
+ add_to_list_messages (&(info->session_messages), hash);
+}
+
+void
+handle_message_key (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvTunnel *tunnel,
+ struct GNUNET_MESSENGER_Message *message, const struct
GNUNET_HashCode *hash)
+{
+ struct GNUNET_MESSENGER_SrvContact *contact = get_room_contact (room,
&(message->header.sender_id));
+
+ if (contact)
+ swap_service_contact_by_pubkey (room->service, contact,
&(message->body.key.key));
+
+ struct GNUNET_MESSENGER_MemberInfo *info = get_room_member_info (room,
&(message->header.sender_id));
+
+ if (info)
+ add_to_list_messages (&(info->session_messages), hash);
+}
+
+void
+handle_message_peer (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvTunnel *tunnel,
+ struct GNUNET_MESSENGER_Message *message, const struct
GNUNET_HashCode *hash)
+{
+ if (GNUNET_NO == contains_list_tunnels (&(room->basement),
&(message->body.peer.peer)))
+ add_to_list_tunnels (&(room->basement), &(message->body.peer.peer));
+
+ if (room->peer_message)
+ rebuild_room_basement_structure (room);
+}
+
+void
+handle_message_id (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvTunnel *tunnel,
+ struct GNUNET_MESSENGER_Message *message, const struct
GNUNET_HashCode *hash)
+{
+ struct GNUNET_MESSENGER_MemberInfo *info = get_room_member_info (room,
&(message->header.sender_id));
+
+ if (info)
+ add_to_list_messages (&(info->session_messages), hash);
+
+ switch_room_member_id (room, &(message->header.sender_id),
&(message->body.id.id), hash);
+}
+
+void
+handle_message_miss (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvTunnel *tunnel,
+ struct GNUNET_MESSENGER_Message *message, const struct
GNUNET_HashCode *hash)
+{
+ struct GNUNET_MESSENGER_ListTunnel *element = find_list_tunnels
(&(room->basement), &(message->body.peer.peer), NULL);
+
+ if (!element)
+ return;
+
+ remove_from_list_tunnels (&(room->basement), element);
+
+ if (room->peer_message)
+ rebuild_room_basement_structure (room);
+}
diff --git a/src/messenger/gnunet-service-messenger_message_handle.h
b/src/messenger/gnunet-service-messenger_message_handle.h
new file mode 100644
index 000000000..d091e1d11
--- /dev/null
+++ b/src/messenger/gnunet-service-messenger_message_handle.h
@@ -0,0 +1,128 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2020 GNUnet e.V.
+
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @author Tobias Frisch
+ * @file src/messenger/gnunet-service-messenger_message_handle.h
+ * @brief GNUnet MESSENGER service
+ */
+
+#ifndef GNUNET_SERVICE_MESSENGER_MESSAGE_HANDLE_H
+#define GNUNET_SERVICE_MESSENGER_MESSAGE_HANDLE_H
+
+#include "platform.h"
+#include "gnunet_crypto_lib.h"
+
+#include "gnunet-service-messenger_message_kind.h"
+
+#include "gnunet-service-messenger_tunnel.h"
+#include "messenger_api_message.h"
+
+/**
+ * Handles a received or sent join message to make changes of current member
information.
+ * (add matching member and clear member info)
+ *
+ * @param room Room of the message
+ * @param tunnel Receiving/sending connection (may be NULL)
+ * @param message JOIN-Message
+ * @param hash Hash of the message
+ */
+void
+handle_message_join (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvTunnel *tunnel,
+ struct GNUNET_MESSENGER_Message *message, const struct
GNUNET_HashCode *hash);
+
+/**
+ * Handles a received or sent leave message to make changes of current member
information.
+ * (remove matching member and clear member info)
+ *
+ * @param room Room of the message
+ * @param tunnel Receiving/sending connection (may be NULL)
+ * @param message LEAVE-Message
+ * @param hash Hash of the message
+ */
+void
+handle_message_leave (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvTunnel *tunnel,
+ struct GNUNET_MESSENGER_Message *message, const struct
GNUNET_HashCode *hash);
+
+/**
+ * Handles a received or sent name message to rename a current member.
+ * (change name of matching member)
+ *
+ * @param room Room of the message
+ * @param tunnel Receiving/sending connection (may be NULL)
+ * @param message NAME-Message
+ * @param hash Hash of the message
+ */
+void
+handle_message_name (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvTunnel *tunnel,
+ struct GNUNET_MESSENGER_Message *message, const struct
GNUNET_HashCode *hash);
+
+/**
+ * Handles a received or sent key message to change the key of a member and
rearrange the contacts accordingly.
+ * (move the member in the contacts and change its key)
+ *
+ * @param room Room of the message
+ * @param tunnel Receiving/sending connection (may be NULL)
+ * @param message KEY-Message
+ * @param hash Hash of the message
+ */
+void
+handle_message_key (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvTunnel *tunnel,
+ struct GNUNET_MESSENGER_Message *message, const struct
GNUNET_HashCode *hash);
+
+/**
+ * Handles a received or sent peer message to make changes of the basement in
the room.
+ * (add a new peer to the basement and restructure connections based on
updated list of peers)
+ *
+ * @param room Room of the message
+ * @param tunnel Receiving/sending connection (may be NULL)
+ * @param message PEER-Message
+ * @param hash Hash of the message
+ */
+void
+handle_message_peer (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvTunnel *tunnel,
+ struct GNUNET_MESSENGER_Message *message, const struct
GNUNET_HashCode *hash);
+
+/**
+ * Handles a received or sent id message to change a members id.
+ * (change id of matching member)
+ *
+ * @param room Room of the message
+ * @param tunnel Receiving/sending connection (may be NULL)
+ * @param message ID-Message
+ * @param hash Hash of the message
+ */
+void
+handle_message_id (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvTunnel *tunnel,
+ struct GNUNET_MESSENGER_Message *message, const struct
GNUNET_HashCode *hash);
+
+/**
+ * Handles a received or sent miss message to drop a peer from the basement in
the room.
+ * (remove a peer from the basement and restructure connections based on
updated list of peers)
+ *
+ * @param room Room of the message
+ * @param tunnel Receiving/sending connection (may be NULL)
+ * @param message MISS-Message
+ * @param hash Hash of the message
+ */
+void
+handle_message_miss (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvTunnel *tunnel,
+ struct GNUNET_MESSENGER_Message *message, const struct
GNUNET_HashCode *hash);
+
+#endif //GNUNET_SERVICE_MESSENGER_MESSAGE_HANDLE_H
diff --git a/src/messenger/gnunet-service-messenger_message_kind.c
b/src/messenger/gnunet-service-messenger_message_kind.c
new file mode 100644
index 000000000..9c829fe09
--- /dev/null
+++ b/src/messenger/gnunet-service-messenger_message_kind.c
@@ -0,0 +1,192 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2020 GNUnet e.V.
+
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @author Tobias Frisch
+ * @file src/messenger/gnunet-service-messenger_message_kind.c
+ * @brief GNUnet MESSENGER service
+ */
+
+#include "gnunet-service-messenger_message_kind.h"
+#include "gnunet-service-messenger_util.h"
+
+struct GNUNET_MESSENGER_Message*
+create_message_info (struct GNUNET_MESSENGER_Ego *ego, struct
GNUNET_CONTAINER_MultiShortmap *members)
+{
+ struct GNUNET_MESSENGER_Message *message = create_message
(GNUNET_MESSENGER_KIND_INFO);
+
+ if (!message)
+ return NULL;
+
+ GNUNET_memcpy(&(message->body.info.host_key), &(ego->pub), sizeof(ego->pub));
+
+ if (GNUNET_YES == generate_free_member_id (&(message->body.info.unique_id),
members))
+ return message;
+ else
+ {
+ destroy_message (message);
+ return NULL;
+ }
+}
+
+struct GNUNET_MESSENGER_Message*
+create_message_join (struct GNUNET_MESSENGER_Ego *ego)
+{
+ struct GNUNET_MESSENGER_Message *message = create_message
(GNUNET_MESSENGER_KIND_JOIN);
+
+ if (!message)
+ return NULL;
+
+ GNUNET_memcpy(&(message->body.join.key), &(ego->pub), sizeof(ego->pub));
+
+ return message;
+}
+
+struct GNUNET_MESSENGER_Message*
+create_message_leave ()
+{
+ return create_message (GNUNET_MESSENGER_KIND_LEAVE);
+}
+
+struct GNUNET_MESSENGER_Message*
+create_message_name (const char *name)
+{
+ struct GNUNET_MESSENGER_Message *message = create_message
(GNUNET_MESSENGER_KIND_NAME);
+
+ if (!message)
+ return NULL;
+
+ message->body.name.name = GNUNET_strdup(name);
+ return message;
+}
+
+struct GNUNET_MESSENGER_Message*
+create_message_key (const struct GNUNET_IDENTITY_PrivateKey *key)
+{
+ struct GNUNET_MESSENGER_Message *message = create_message
(GNUNET_MESSENGER_KIND_KEY);
+
+ if (!message)
+ return NULL;
+
+ GNUNET_IDENTITY_key_get_public (key, &(message->body.key.key));
+ return message;
+}
+
+struct GNUNET_MESSENGER_Message*
+create_message_peer (const struct GNUNET_MESSENGER_Service *service)
+{
+ struct GNUNET_MESSENGER_Message *message = create_message
(GNUNET_MESSENGER_KIND_PEER);
+
+ if (!message)
+ return NULL;
+
+ if (GNUNET_OK == get_service_peer_identity (service,
&(message->body.peer.peer)))
+ return message;
+ else
+ {
+ destroy_message (message);
+ return NULL;
+ }
+}
+
+struct GNUNET_MESSENGER_Message*
+create_message_id (const struct GNUNET_ShortHashCode *unique_id)
+{
+ struct GNUNET_MESSENGER_Message *message = create_message
(GNUNET_MESSENGER_KIND_ID);
+
+ if (!message)
+ return NULL;
+
+ GNUNET_memcpy(&(message->body.id.id), unique_id, sizeof(struct
GNUNET_ShortHashCode));
+
+ return message;
+}
+
+struct GNUNET_MESSENGER_Message*
+create_message_miss (const struct GNUNET_PeerIdentity *peer)
+{
+ struct GNUNET_MESSENGER_Message *message = create_message
(GNUNET_MESSENGER_KIND_MISS);
+
+ if (!message)
+ {
+ return NULL;
+ }
+
+ GNUNET_memcpy(&(message->body.miss.peer), peer, sizeof(struct
GNUNET_PeerIdentity));
+
+ return message;
+}
+
+struct GNUNET_MESSENGER_Message*
+create_message_merge (const struct GNUNET_HashCode *previous)
+{
+ struct GNUNET_MESSENGER_Message *message = create_message
(GNUNET_MESSENGER_KIND_MERGE);
+
+ if (!message)
+ return NULL;
+
+ GNUNET_memcpy(&(message->body.merge.previous), previous, sizeof(struct
GNUNET_HashCode));
+
+ return message;
+}
+
+struct GNUNET_MESSENGER_Message*
+create_message_request (const struct GNUNET_HashCode *hash)
+{
+ struct GNUNET_HashCode zero;
+ memset (&zero, 0, sizeof(zero));
+
+ if (0 == GNUNET_CRYPTO_hash_cmp (hash, &zero))
+ return NULL;
+
+ struct GNUNET_MESSENGER_Message *message = create_message
(GNUNET_MESSENGER_KIND_REQUEST);
+
+ if (!message)
+ return NULL;
+
+ GNUNET_memcpy(&(message->body.request.hash), hash, sizeof(struct
GNUNET_HashCode));
+
+ return message;
+}
+
+struct GNUNET_MESSENGER_Message*
+create_message_invite (const struct GNUNET_PeerIdentity *door, const struct
GNUNET_HashCode *key)
+{
+ struct GNUNET_MESSENGER_Message *message = create_message
(GNUNET_MESSENGER_KIND_INVITE);
+
+ if (!message)
+ return NULL;
+
+ GNUNET_memcpy(&(message->body.invite.door), door, sizeof(struct
GNUNET_PeerIdentity));
+ GNUNET_memcpy(&(message->body.invite.key), key, sizeof(struct
GNUNET_HashCode));
+
+ return message;
+}
+
+struct GNUNET_MESSENGER_Message*
+create_message_text (const char *text)
+{
+ struct GNUNET_MESSENGER_Message *message = create_message
(GNUNET_MESSENGER_KIND_TEXT);
+
+ if (!message)
+ return NULL;
+
+ message->body.text.text = GNUNET_strdup(text);
+ return message;
+}
diff --git a/src/messenger/gnunet-service-messenger_message_kind.h
b/src/messenger/gnunet-service-messenger_message_kind.h
new file mode 100644
index 000000000..dd89d0b2f
--- /dev/null
+++ b/src/messenger/gnunet-service-messenger_message_kind.h
@@ -0,0 +1,160 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2020 GNUnet e.V.
+
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @author Tobias Frisch
+ * @file src/messenger/gnunet-service-messenger_message_kind.h
+ * @brief GNUnet MESSENGER service
+ */
+
+#ifndef GNUNET_SERVICE_MESSENGER_MESSAGE_KIND_H
+#define GNUNET_SERVICE_MESSENGER_MESSAGE_KIND_H
+
+#include "platform.h"
+#include "gnunet_container_lib.h"
+#include "gnunet_crypto_lib.h"
+#include "gnunet_identity_service.h"
+
+#include "messenger_api_message.h"
+#include "gnunet-service-messenger_service.h"
+#include "messenger_api_ego.h"
+
+/**
+ * Creates and allocates a new info message containing the hosts public key
and a newly generated unique member id.
+ * (all values are stored as copy)
+ *
+ * @param ego EGO of the host
+ * @param members Map of all assigned member ids
+ * @return New message
+ */
+struct GNUNET_MESSENGER_Message*
+create_message_info (struct GNUNET_MESSENGER_Ego *ego, struct
GNUNET_CONTAINER_MultiShortmap *members);
+
+/**
+ * Creates and allocates a new join message containing the clients public key.
+ * (all values are stored as copy)
+ *
+ * @param ego EGO of the client
+ * @return New message
+ */
+struct GNUNET_MESSENGER_Message*
+create_message_join (struct GNUNET_MESSENGER_Ego *ego);
+
+/**
+ * Creates and allocates a new leave message.
+ *
+ * @return New message
+ */
+struct GNUNET_MESSENGER_Message*
+create_message_leave ();
+
+/**
+ * Creates and allocates a new name message containing the <i>name</i> to
change to.
+ * (all values are stored as copy)
+ *
+ * @param name New name
+ * @return New message
+ */
+struct GNUNET_MESSENGER_Message*
+create_message_name (const char *name);
+
+/**
+ * Creates and allocates a new key message containing the public key to change
to derived
+ * from its private counterpart. (all values are stored as copy)
+ *
+ * @param key Private key of EGO
+ * @return New message
+ */
+struct GNUNET_MESSENGER_Message*
+create_message_key (const struct GNUNET_IDENTITY_PrivateKey *key);
+
+/**
+ * Creates and allocates a new peer message containing a services peer
identity.
+ * (all values are stored as copy)
+ *
+ * @param service Service
+ * @return New message
+ */
+struct GNUNET_MESSENGER_Message*
+create_message_peer (const struct GNUNET_MESSENGER_Service *service);
+
+/**
+ * Creates and allocates a new id message containing the unique member id to
change to.
+ * (all values are stored as copy)
+ *
+ * @param unique_id Unique member id
+ * @return New message
+ */
+struct GNUNET_MESSENGER_Message*
+create_message_id (const struct GNUNET_ShortHashCode *unique_id);
+
+/**
+ * Creates and allocates a new miss message containing the missing peer
identity.
+ * (all values are stored as copy)
+ *
+ * @param peer Missing peer identity
+ * @return New message
+ */
+struct GNUNET_MESSENGER_Message*
+create_message_miss (const struct GNUNET_PeerIdentity *peer);
+
+/**
+ * Creates and allocates a new merge message containing the hash of a second
previous message
+ * besides the regular previous message mentioned in a messages header.
+ * (all values are stored as copy)
+ *
+ * @param previous Hash of message
+ * @return New message
+ */
+struct GNUNET_MESSENGER_Message*
+create_message_merge (const struct GNUNET_HashCode *previous);
+
+/**
+ * Creates and allocates a new request message containing the hash of a
missing message.
+ * (all values are stored as copy)
+ *
+ * @param hash Hash of message
+ * @return New message
+ */
+struct GNUNET_MESSENGER_Message*
+create_message_request (const struct GNUNET_HashCode *hash);
+
+/**
+ * Creates and allocates a new invite message containing the peer identity of
an entrance peer
+ * to a room using a given <i>key</i> as shared secret for communication.
+ * (all values are stored as copy)
+ *
+ * @param door Peer identity
+ * @param key Shared secret of a room
+ * @return New message
+ */
+struct GNUNET_MESSENGER_Message*
+create_message_invite (const struct GNUNET_PeerIdentity *door, const struct
GNUNET_HashCode *key);
+
+/**
+ * Creates and allocates a new text message containing a string representing
text.
+ * (all values are stored as copy)
+ *
+ * @param text Text
+ * @return New message
+ */
+struct GNUNET_MESSENGER_Message*
+create_message_text (const char *text);
+
+#endif //GNUNET_SERVICE_MESSENGER_MESSAGE_KIND_H
diff --git a/src/messenger/gnunet-service-messenger_message_recv.c
b/src/messenger/gnunet-service-messenger_message_recv.c
new file mode 100644
index 000000000..aa28a36ea
--- /dev/null
+++ b/src/messenger/gnunet-service-messenger_message_recv.c
@@ -0,0 +1,204 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2020 GNUnet e.V.
+
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @author Tobias Frisch
+ * @file src/messenger/gnunet-service-messenger_message_recv.c
+ * @brief GNUnet MESSENGER service
+ */
+
+#include "gnunet-service-messenger_message_recv.h"
+#include "gnunet-service-messenger_message_handle.h"
+
+void
+recv_message_info (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvTunnel *tunnel,
+ struct GNUNET_MESSENGER_Message *message, const struct
GNUNET_HashCode *hash)
+{
+ int conflict = GNUNET_CONTAINER_multishortmap_contains (room->members,
&(message->body.info.unique_id));
+
+ if (GNUNET_NO == conflict)
+ {
+ struct GNUNET_MESSENGER_Message *sync_message = create_message_id
(&(message->body.info.unique_id));
+ struct GNUNET_HashCode sync_hash;
+
+ send_room_message_ext (room, room->host, sync_message, &sync_hash, tunnel);
+ destroy_message (sync_message);
+
+ switch_room_member_id (room, get_room_host_id (room),
&(message->body.info.unique_id), NULL);
+
+ change_room_host_id (room, &(message->body.info.unique_id));
+ }
+
+ if (!tunnel->contact_id)
+ tunnel->contact_id = GNUNET_new(struct GNUNET_ShortHashCode);
+
+ GNUNET_memcpy(tunnel->contact_id, &(message->header.sender_id),
sizeof(struct GNUNET_ShortHashCode));
+
+ struct GNUNET_ShortHashCode original_id;
+
+ if (GNUNET_YES == conflict)
+ {
+ GNUNET_memcpy(&original_id, get_room_host_id (room), sizeof(struct
GNUNET_ShortHashCode));
+
+ change_room_host_id (room, &(message->body.info.unique_id));
+ }
+
+ {
+ struct GNUNET_MESSENGER_Message *join_message = create_message_join
(room->host->ego);
+ struct GNUNET_HashCode join_hash;
+
+ send_tunnel_message (tunnel, room->host, join_message, &join_hash);
+ destroy_message (join_message);
+ }
+
+ if ((GNUNET_YES == conflict) && (0 != GNUNET_memcmp(&original_id,
get_room_host_id (room))))
+ {
+ struct GNUNET_MESSENGER_Message *sync_message = create_message_id
(&original_id);
+ struct GNUNET_HashCode sync_hash;
+
+ send_tunnel_message (tunnel, room->host, sync_message, &sync_hash);
+ destroy_message (sync_message);
+ }
+}
+
+struct GNUNET_MESSENGER_MemberInfoSpread
+{
+ struct GNUNET_MESSENGER_SrvRoom *room;
+ struct GNUNET_MESSENGER_SrvTunnel *tunnel;
+};
+
+static int
+iterate_send_member_infos (void *cls, const struct GNUNET_ShortHashCode *key,
void *value)
+{
+ struct GNUNET_MESSENGER_MemberInfo *info = value;
+ struct GNUNET_MESSENGER_MemberInfoSpread *spread = cls;
+
+ struct GNUNET_MESSENGER_ListMessage *element = info->session_messages.head;
+
+ while (element)
+ {
+ const struct GNUNET_MESSENGER_Message *message = get_room_message
(spread->room, spread->room->host,
+
&(element->hash), GNUNET_NO);
+
+ if (message)
+ forward_tunnel_message (spread->tunnel, message, &(element->hash));
+
+ element = element->next;
+ }
+
+ return GNUNET_YES;
+}
+
+void
+recv_message_join (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvTunnel *tunnel,
+ struct GNUNET_MESSENGER_Message *message, const struct
GNUNET_HashCode *hash)
+{
+ const struct GNUNET_MESSENGER_Message *info_msg = get_room_message (room,
room->host, &(message->header.previous),
+
GNUNET_NO);
+
+ if ((info_msg) && (0 == GNUNET_memcmp(&(info_msg->header.sender_id),
get_room_host_id (room)))
+ && (GNUNET_MESSENGER_KIND_INFO == info_msg->header.kind))
+ {
+ struct GNUNET_MESSENGER_MemberInfoSpread spread;
+
+ spread.room = room;
+
+ if ((tunnel) && (tunnel->contact_id) && (0 ==
GNUNET_memcmp(tunnel->contact_id, &(message->header.sender_id))))
+ spread.tunnel = tunnel;
+ else
+ spread.tunnel = find_room_tunnel_to (room, &(message->header.sender_id));
+
+ if (spread.tunnel)
+ GNUNET_CONTAINER_multishortmap_iterate (room->member_infos,
iterate_send_member_infos, &spread);
+ }
+
+ handle_message_join (room, tunnel, message, hash);
+}
+
+void
+recv_message_leave (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvTunnel *tunnel,
+ struct GNUNET_MESSENGER_Message *message, const struct
GNUNET_HashCode *hash)
+{
+ handle_message_leave (room, tunnel, message, hash);
+}
+
+void
+recv_message_name (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvTunnel *tunnel,
+ struct GNUNET_MESSENGER_Message *message, const struct
GNUNET_HashCode *hash)
+{
+ handle_message_name (room, tunnel, message, hash);
+}
+
+void
+recv_message_key (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvTunnel *tunnel,
+ struct GNUNET_MESSENGER_Message *message, const struct
GNUNET_HashCode *hash)
+{
+ handle_message_key (room, tunnel, message, hash);
+}
+
+void
+recv_message_peer (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvTunnel *tunnel,
+ struct GNUNET_MESSENGER_Message *message, const struct
GNUNET_HashCode *hash)
+{
+ struct GNUNET_PeerIdentity peer;
+ GNUNET_PEER_resolve (tunnel->peer, &peer);
+
+ if (0 == GNUNET_memcmp(&peer, &(message->body.peer.peer)))
+ {
+ if (!tunnel->peer_message)
+ tunnel->peer_message = GNUNET_new(struct GNUNET_HashCode);
+
+ GNUNET_memcpy(tunnel->peer_message, hash, sizeof(struct GNUNET_HashCode));
+
+ if (!tunnel->contact_id)
+ tunnel->contact_id = GNUNET_new(struct GNUNET_ShortHashCode);
+
+ GNUNET_memcpy(tunnel->contact_id, &(message->header.sender_id),
sizeof(struct GNUNET_ShortHashCode));
+ }
+
+ handle_message_peer (room, tunnel, message, hash);
+}
+
+void
+recv_message_id (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvTunnel *tunnel,
+ struct GNUNET_MESSENGER_Message *message, const struct
GNUNET_HashCode *hash)
+{
+ if ((tunnel->contact_id) && (0 == GNUNET_memcmp(tunnel->contact_id,
&(message->header.sender_id))))
+ GNUNET_memcpy(tunnel->contact_id, &(message->body.id.id), sizeof(struct
GNUNET_ShortHashCode));
+
+ handle_message_id (room, tunnel, message, hash);
+}
+
+void
+recv_message_miss (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvTunnel *tunnel,
+ struct GNUNET_MESSENGER_Message *message, const struct
GNUNET_HashCode *hash)
+{
+ handle_message_miss (room, tunnel, message, hash);
+}
+
+void
+recv_message_request (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvTunnel *tunnel,
+ struct GNUNET_MESSENGER_Message *message, const struct
GNUNET_HashCode *hash)
+{
+ const struct GNUNET_MESSENGER_Message *msg = get_room_message (room,
room->host, &(message->body.request.hash),
+ GNUNET_NO);
+
+ if (msg)
+ forward_tunnel_message (tunnel, msg, &(message->body.request.hash));
+}
diff --git a/src/messenger/gnunet-service-messenger_message_recv.h
b/src/messenger/gnunet-service-messenger_message_recv.h
new file mode 100644
index 000000000..245612cb0
--- /dev/null
+++ b/src/messenger/gnunet-service-messenger_message_recv.h
@@ -0,0 +1,159 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2020 GNUnet e.V.
+
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @author Tobias Frisch
+ * @file src/messenger/gnunet-service-messenger_message_recv.h
+ * @brief GNUnet MESSENGER service
+ */
+
+#ifndef GNUNET_SERVICE_MESSENGER_MESSAGE_RECV_H
+#define GNUNET_SERVICE_MESSENGER_MESSAGE_RECV_H
+
+#include "platform.h"
+#include "gnunet_crypto_lib.h"
+
+#include "gnunet-service-messenger_tunnel.h"
+#include "messenger_api_message.h"
+
+/**
+ * Handles a received info message to change the current member id to the one
generated by
+ * the host connected to. (all current tunnels will be informed about the id
change)
+ *
+ * @param room Room of the message
+ * @param tunnel Receiving connection
+ * @param message INFO-Message
+ * @param hash Hash of the message
+ */
+void
+recv_message_info (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvTunnel *tunnel,
+ struct GNUNET_MESSENGER_Message *message, const struct
GNUNET_HashCode *hash);
+
+/**
+ * Handles a received join message to forward all member information to the
new member if the message was
+ * the direct reaction to a previous info message from this peer.
+ *
+ * @param room Room of the message
+ * @param tunnel Receiving connection
+ * @param message JOIN-Message
+ * @param hash Hash of the message
+ */
+void
+recv_message_join (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvTunnel *tunnel,
+ struct GNUNET_MESSENGER_Message *message, const struct
GNUNET_HashCode *hash);
+
+/**
+ * Handles a received leave message.
+ * @see handle_message_leave()
+ *
+ * @param room Room of the message
+ * @param tunnel Receiving connection
+ * @param message LEAVE-Message
+ * @param hash Hash of the message
+ */
+void
+recv_message_leave (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvTunnel *tunnel,
+ struct GNUNET_MESSENGER_Message *message, const struct
GNUNET_HashCode *hash);
+
+/**
+ * Handles a received name message.
+ * @see handle_message_name()
+ *
+ * @param room Room of the message
+ * @param tunnel Receiving connection
+ * @param message NAME-Message
+ * @param hash Hash of the message
+ */
+void
+recv_message_name (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvTunnel *tunnel,
+ struct GNUNET_MESSENGER_Message *message, const struct
GNUNET_HashCode *hash);
+
+/**
+ * Handles a received key message.
+ * @see handle_message_key()
+ *
+ * @param room Room of the message
+ * @param tunnel Receiving connection
+ * @param message KEY-Message
+ * @param hash Hash of the message
+ */
+void
+recv_message_key (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvTunnel *tunnel,
+ struct GNUNET_MESSENGER_Message *message, const struct
GNUNET_HashCode *hash);
+
+/**
+ * Handles a received peer message to link it to its origin tunnel if the peer
identity matches.
+ * (the peer message and the member id can potentially be linked to the tunnel)
+ *
+ * TODO: This handling will only check the one given tunnel!
+ *
+ * @param room Room of the message
+ * @param tunnel Receiving connection
+ * @param message PEER-Message
+ * @param hash Hash of the message
+ */
+void
+recv_message_peer (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvTunnel *tunnel,
+ struct GNUNET_MESSENGER_Message *message, const struct
GNUNET_HashCode *hash);
+
+/**
+ * Handles a received id message to change the tunnels linked member id if
necessary.
+ * (the tunnels linked member id will be changed if the sender id is matching)
+ *
+ * TODO: This handling will only check the one given tunnel!
+ *
+ * @param room Room of the message
+ * @param tunnel Receiving connection
+ * @param message ID-Message
+ * @param hash Hash of the message
+ */
+void
+recv_message_id (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvTunnel *tunnel,
+ struct GNUNET_MESSENGER_Message *message, const struct
GNUNET_HashCode *hash);
+
+/**
+ * Handles a received miss message.
+ * @see handle_message_miss()
+ *
+ * @param room Room of the message
+ * @param tunnel Receiving connection
+ * @param message MISS-Message
+ * @param hash Hash of the message
+ */
+void
+recv_message_miss (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvTunnel *tunnel,
+ struct GNUNET_MESSENGER_Message *message, const struct
GNUNET_HashCode *hash);
+
+/**
+ * Handles a received request message by checking for the requested message
and forwarding it back
+ * if the message was found.
+ * (this can also cause this peer to send a new request instead of only
forwarding the received one)
+ *
+ * TODO: Requests can cause exponentially more requests!
+ *
+ * @param room Room of the message
+ * @param tunnel Receiving connection
+ * @param message REQUEST-Message
+ * @param hash Hash of the message
+ */
+void
+recv_message_request (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvTunnel *tunnel,
+ struct GNUNET_MESSENGER_Message *message, const struct
GNUNET_HashCode *hash);
+
+#endif //GNUNET_SERVICE_MESSENGER_MESSAGE_RECV_H
diff --git a/src/messenger/gnunet-service-messenger_message_send.c
b/src/messenger/gnunet-service-messenger_message_send.c
new file mode 100644
index 000000000..86cf9b888
--- /dev/null
+++ b/src/messenger/gnunet-service-messenger_message_send.c
@@ -0,0 +1,118 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2020 GNUnet e.V.
+
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @author Tobias Frisch
+ * @file src/messenger/gnunet-service-messenger_message_send.c
+ * @brief GNUnet MESSENGER service
+ */
+
+#include "gnunet-service-messenger_message_send.h"
+#include "gnunet-service-messenger_message_handle.h"
+
+void
+send_message_info (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvHandle *handle,
+ struct GNUNET_MESSENGER_SrvTunnel *tunnel, struct
GNUNET_MESSENGER_Message *message,
+ const struct GNUNET_HashCode *hash)
+{
+ if (!tunnel->contact_id)
+ {
+ tunnel->contact_id = GNUNET_new(struct GNUNET_ShortHashCode);
+
+ GNUNET_memcpy(tunnel->contact_id, &(message->body.info.unique_id),
sizeof(struct GNUNET_ShortHashCode));
+ }
+ else
+ {
+ disconnect_tunnel (tunnel);
+ }
+}
+
+void
+send_message_join (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvHandle *handle,
+ struct GNUNET_MESSENGER_SrvTunnel *tunnel, struct
GNUNET_MESSENGER_Message *message,
+ const struct GNUNET_HashCode *hash)
+{
+ handle_message_join (room, tunnel, message, hash);
+
+ if (room->peer_message)
+ {
+ const struct GNUNET_MESSENGER_Message *peer_message = get_room_message
(room, handle, room->peer_message,
+
GNUNET_NO);
+
+ if ((peer_message) && (tunnel))
+ {
+ forward_tunnel_message (tunnel, peer_message, room->peer_message);
+ }
+ }
+}
+
+void
+send_message_leave (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvHandle *handle,
+ struct GNUNET_MESSENGER_SrvTunnel *tunnel, struct
GNUNET_MESSENGER_Message *message,
+ const struct GNUNET_HashCode *hash)
+{
+ handle_message_leave (room, tunnel, message, hash);
+}
+
+void
+send_message_name (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvHandle *handle,
+ struct GNUNET_MESSENGER_SrvTunnel *tunnel, struct
GNUNET_MESSENGER_Message *message,
+ const struct GNUNET_HashCode *hash)
+{
+ handle_message_name (room, tunnel, message, hash);
+}
+
+void
+send_message_key (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvHandle *handle,
+ struct GNUNET_MESSENGER_SrvTunnel *tunnel, struct
GNUNET_MESSENGER_Message *message,
+ const struct GNUNET_HashCode *hash)
+{
+ handle_message_key (room, tunnel, message, hash);
+}
+
+void
+send_message_peer (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvHandle *handle,
+ struct GNUNET_MESSENGER_SrvTunnel *tunnel, struct
GNUNET_MESSENGER_Message *message,
+ const struct GNUNET_HashCode *hash)
+{
+ if (!room->peer_message)
+ {
+ room->peer_message = GNUNET_new(struct GNUNET_HashCode);
+ }
+
+ GNUNET_memcpy(room->peer_message, hash, sizeof(struct GNUNET_HashCode));
+
+ handle_message_peer (room, tunnel, message, hash);
+}
+
+void
+send_message_id (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvHandle *handle,
+ struct GNUNET_MESSENGER_SrvTunnel *tunnel, struct
GNUNET_MESSENGER_Message *message,
+ const struct GNUNET_HashCode *hash)
+{
+ handle_message_id (room, tunnel, message, hash);
+}
+
+void
+send_message_miss (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvHandle *handle,
+ struct GNUNET_MESSENGER_SrvTunnel *tunnel, struct
GNUNET_MESSENGER_Message *message,
+ const struct GNUNET_HashCode *hash)
+{
+ handle_message_miss (room, tunnel, message, hash);
+}
diff --git a/src/messenger/gnunet-service-messenger_message_send.h
b/src/messenger/gnunet-service-messenger_message_send.h
new file mode 100644
index 000000000..c1096205a
--- /dev/null
+++ b/src/messenger/gnunet-service-messenger_message_send.h
@@ -0,0 +1,155 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2020 GNUnet e.V.
+
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @author Tobias Frisch
+ * @file src/messenger/gnunet-service-messenger_message_send.h
+ * @brief GNUnet MESSENGER service
+ */
+
+#ifndef GNUNET_SERVICE_MESSENGER_MESSAGE_SEND_H
+#define GNUNET_SERVICE_MESSENGER_MESSAGE_SEND_H
+
+#include "platform.h"
+#include "gnunet_crypto_lib.h"
+
+#include "gnunet-service-messenger_tunnel.h"
+#include "messenger_api_message.h"
+
+/**
+ * Handles a sent info message to setup a tunnels linked member id.
+ * (if a tunnel has already got a member id linked to it, the connection will
be closed)
+ *
+ * @param room Room of the message
+ * @param handle Sending handle
+ * @param tunnel Sending connection (may be NULL)
+ * @param message INFO-Message
+ * @param hash Hash of the message
+ */
+void
+send_message_info (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvHandle *handle,
+ struct GNUNET_MESSENGER_SrvTunnel *tunnel, struct
GNUNET_MESSENGER_Message *message,
+ const struct GNUNET_HashCode *hash);
+
+/**
+ * Handles a sent join message to ensure growth of the decentralized room
structure.
+ * (if the service provides a peer message for this room currently, it will be
forwarded)
+ *
+ * @param room Room of the message
+ * @param handle Sending handle
+ * @param tunnel Sending connection (may be NULL)
+ * @param message JOIN-Message
+ * @param hash Hash of the message
+ */
+void
+send_message_join (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvHandle *handle,
+ struct GNUNET_MESSENGER_SrvTunnel *tunnel, struct
GNUNET_MESSENGER_Message *message,
+ const struct GNUNET_HashCode *hash);
+
+/**
+ * Handles a sent leave message.
+ * @see handle_message_leave()
+ *
+ * @param room Room of the message
+ * @param handle Sending handle
+ * @param tunnel Sending connection (may be NULL)
+ * @param message LEAVE-Message
+ * @param hash Hash of the message
+ */
+void
+send_message_leave (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvHandle *handle,
+ struct GNUNET_MESSENGER_SrvTunnel *tunnel, struct
GNUNET_MESSENGER_Message *message,
+ const struct GNUNET_HashCode *hash);
+
+/**
+ * Handles a sent name message.
+ * @see handle_message_name()
+ *
+ * @param room Room of the message
+ * @param handle Sending handle
+ * @param tunnel Sending connection (may be NULL)
+ * @param message NAME-Message
+ * @param hash Hash of the message
+ */
+void
+send_message_name (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvHandle *handle,
+ struct GNUNET_MESSENGER_SrvTunnel *tunnel, struct
GNUNET_MESSENGER_Message *message,
+ const struct GNUNET_HashCode *hash);
+
+/**
+ * Handles a sent key message.
+ * @see handle_message_key()
+ *
+ * @param room Room of the message
+ * @param handle Sending handle
+ * @param tunnel Sending connection (may be NULL)
+ * @param message KEY-Message
+ * @param hash Hash of the message
+ */
+void
+send_message_key (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvHandle *handle,
+ struct GNUNET_MESSENGER_SrvTunnel *tunnel, struct
GNUNET_MESSENGER_Message *message,
+ const struct GNUNET_HashCode *hash);
+
+/**
+ * Handles a sent peer message to update the rooms peer message of this
service.
+ * (a set peer message indicates this service being a part of the
decentralized room structure)
+ *
+ * @param room Room of the message
+ * @param handle Sending handle
+ * @param tunnel Sending connection (may be NULL)
+ * @param message PEER-Message
+ * @param hash Hash of the message
+ */
+void
+send_message_peer (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvHandle *handle,
+ struct GNUNET_MESSENGER_SrvTunnel *tunnel, struct
GNUNET_MESSENGER_Message *message,
+ const struct GNUNET_HashCode *hash);
+
+/**
+ * Handles a sent id message.
+ * @see handle_message_id()
+ *
+ * @param room Room of the message
+ * @param handle Sending handle
+ * @param tunnel Sending connection (may be NULL)
+ * @param message ID-Message
+ * @param hash Hash of the message
+ */
+void
+send_message_id (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvHandle *handle,
+ struct GNUNET_MESSENGER_SrvTunnel *tunnel, struct
GNUNET_MESSENGER_Message *message,
+ const struct GNUNET_HashCode *hash);
+
+/**
+ * Handles a sent miss message.
+ * @see handle_message_miss()
+ *
+ * @param room Room of the message
+ * @param handle Sending handle
+ * @param tunnel Sending connection (may be NULL)
+ * @param message MISS-Message
+ * @param hash Hash of the message
+ */
+void
+send_message_miss (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvHandle *handle,
+ struct GNUNET_MESSENGER_SrvTunnel *tunnel, struct
GNUNET_MESSENGER_Message *message,
+ const struct GNUNET_HashCode *hash);
+
+#endif //GNUNET_SERVICE_MESSENGER_MESSAGE_SEND_H
diff --git a/src/messenger/gnunet-service-messenger_message_store.c
b/src/messenger/gnunet-service-messenger_message_store.c
new file mode 100644
index 000000000..5933d6390
--- /dev/null
+++ b/src/messenger/gnunet-service-messenger_message_store.c
@@ -0,0 +1,282 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2020 GNUnet e.V.
+
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @author Tobias Frisch
+ * @file src/messenger/gnunet-service-messenger_message_store.c
+ * @brief GNUnet MESSENGER service
+ */
+
+#include "gnunet-service-messenger_message_store.h"
+#include "messenger_api_message.h"
+
+void
+init_message_store (struct GNUNET_MESSENGER_MessageStore *store)
+{
+ store->storage_messages = NULL;
+
+ store->entries = GNUNET_CONTAINER_multihashmap_create (8, GNUNET_NO);
+ store->messages = GNUNET_CONTAINER_multihashmap_create (8, GNUNET_NO);
+}
+
+static int
+iterate_destroy_entries (void *cls, const struct GNUNET_HashCode *key, void
*value)
+{
+ struct GNUNET_MESSENGER_MessageEntry *entry = value;
+
+ GNUNET_free(entry);
+
+ return GNUNET_YES;
+}
+
+static int
+iterate_destroy_messages (void *cls, const struct GNUNET_HashCode *key, void
*value)
+{
+ struct GNUNET_MESSENGER_Message *message = value;
+
+ destroy_message (message);
+
+ return GNUNET_YES;
+}
+
+void
+clear_message_store (struct GNUNET_MESSENGER_MessageStore *store)
+{
+ if (store->storage_messages)
+ {
+ GNUNET_DISK_file_close (store->storage_messages);
+
+ store->storage_messages = NULL;
+ }
+
+ GNUNET_CONTAINER_multihashmap_iterate (store->entries,
iterate_destroy_entries, NULL);
+ GNUNET_CONTAINER_multihashmap_iterate (store->messages,
iterate_destroy_messages, NULL);
+
+ GNUNET_CONTAINER_multihashmap_destroy (store->entries);
+ GNUNET_CONTAINER_multihashmap_destroy (store->messages);
+}
+
+struct GNUNET_MESSENGER_MessageEntryStorage
+{
+ struct GNUNET_HashCode hash;
+ struct GNUNET_MESSENGER_MessageEntry entry;
+};
+
+void
+load_message_store (struct GNUNET_MESSENGER_MessageStore *store, const char
*directory)
+{
+ enum GNUNET_DISK_AccessPermissions permission = (GNUNET_DISK_PERM_USER_READ
| GNUNET_DISK_PERM_USER_WRITE);
+
+ if (store->storage_messages)
+ GNUNET_DISK_file_close (store->storage_messages);
+
+ char *filename;
+ GNUNET_asprintf (&filename, "%s%s", directory, "messages.store");
+
+ if (GNUNET_YES == GNUNET_DISK_file_test (filename))
+ store->storage_messages = GNUNET_DISK_file_open (filename,
GNUNET_DISK_OPEN_READ, permission);
+ else
+ store->storage_messages = NULL;
+
+ GNUNET_free(filename);
+
+ if (!store->storage_messages)
+ return;
+
+ GNUNET_asprintf (&filename, "%s%s", directory, "entries.store");
+
+ if (GNUNET_YES != GNUNET_DISK_file_test (filename))
+ goto free_filename;
+
+ struct GNUNET_DISK_FileHandle *entries = GNUNET_DISK_file_open (filename,
GNUNET_DISK_OPEN_READ, permission);
+
+ if (!entries)
+ goto free_filename;
+
+ struct GNUNET_MESSENGER_MessageEntryStorage storage;
+ struct GNUNET_MESSENGER_MessageEntry *entry;
+
+ do
+ {
+ entry = GNUNET_new(struct GNUNET_MESSENGER_MessageEntry);
+
+ if (GNUNET_DISK_file_read (entries, &storage, sizeof(storage)) ==
sizeof(storage))
+ {
+ GNUNET_memcpy(entry, &(storage.entry), sizeof(*entry));
+
+ if (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put (store->entries,
&(storage.hash), entry,
+
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST))
+ GNUNET_free(entry);
+ }
+ else
+ {
+ GNUNET_free(entry);
+
+ entry = NULL;
+ }
+ }
+ while (entry);
+
+ GNUNET_DISK_file_close (entries);
+
+free_filename:
+ GNUNET_free(filename);
+}
+
+struct GNUNET_MESSENGER_MessageSave
+{
+ struct GNUNET_MESSENGER_MessageStore *store;
+
+ struct GNUNET_DISK_FileHandle *storage_entries;
+};
+
+static int
+iterate_save_messages (void *cls, const struct GNUNET_HashCode *key, void
*value)
+{
+ struct GNUNET_MESSENGER_MessageSave *save = cls;
+
+ if (GNUNET_NO != GNUNET_CONTAINER_multihashmap_contains
(save->store->entries, key))
+ return GNUNET_YES;
+
+ struct GNUNET_MESSENGER_Message *message = value;
+ struct GNUNET_MESSENGER_MessageEntryStorage storage;
+
+ GNUNET_memcpy(&(storage.hash), key, sizeof(storage.hash));
+
+ storage.entry.length = get_message_size (message);
+ storage.entry.offset = GNUNET_DISK_file_seek (save->store->storage_messages,
0, GNUNET_DISK_SEEK_END);
+
+ if ((GNUNET_SYSERR == storage.entry.offset) ||
+ (sizeof(storage) != GNUNET_DISK_file_write (save->storage_entries,
&storage, sizeof(storage))))
+ return GNUNET_YES;
+
+ char *buffer = GNUNET_malloc(storage.entry.length);
+
+ encode_message (message, storage.entry.length, buffer);
+
+ GNUNET_DISK_file_write (save->store->storage_messages, buffer,
storage.entry.length);
+
+ GNUNET_free(buffer);
+
+ return GNUNET_YES;
+}
+
+void
+save_message_store (struct GNUNET_MESSENGER_MessageStore *store, const char
*directory)
+{
+ struct GNUNET_MESSENGER_MessageSave save;
+
+ enum GNUNET_DISK_AccessPermissions permission = (GNUNET_DISK_PERM_USER_READ
| GNUNET_DISK_PERM_USER_WRITE);
+
+ char *filename;
+ GNUNET_asprintf (&filename, "%s%s", directory, "entries.store");
+
+ save.store = store;
+ save.storage_entries = GNUNET_DISK_file_open (filename,
GNUNET_DISK_OPEN_WRITE | GNUNET_DISK_OPEN_CREATE, permission);
+
+ GNUNET_free(filename);
+
+ if (!save.storage_entries)
+ return;
+
+ if (GNUNET_SYSERR == GNUNET_DISK_file_seek (save.storage_entries, 0,
GNUNET_DISK_SEEK_END))
+ goto close_entries;
+
+ if (store->storage_messages)
+ GNUNET_DISK_file_close (store->storage_messages);
+
+ GNUNET_asprintf (&filename, "%s%s", directory, "messages.store");
+
+ store->storage_messages = GNUNET_DISK_file_open (filename,
GNUNET_DISK_OPEN_READWRITE | GNUNET_DISK_OPEN_CREATE,
+ permission);
+
+ GNUNET_free(filename);
+
+ if (store->storage_messages)
+ {
+ GNUNET_CONTAINER_multihashmap_iterate (store->messages,
iterate_save_messages, &save);
+
+ GNUNET_DISK_file_sync (store->storage_messages);
+ GNUNET_DISK_file_sync (save.storage_entries);
+ }
+
+close_entries:
+ GNUNET_DISK_file_close (save.storage_entries);
+}
+
+int
+contains_store_message (struct GNUNET_MESSENGER_MessageStore *store, const
struct GNUNET_HashCode *hash)
+{
+ if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_contains (store->messages,
hash))
+ return GNUNET_YES;
+
+ return GNUNET_CONTAINER_multihashmap_contains (store->entries, hash);
+}
+
+const struct GNUNET_MESSENGER_Message*
+get_store_message (struct GNUNET_MESSENGER_MessageStore *store, const struct
GNUNET_HashCode *hash)
+{
+ struct GNUNET_MESSENGER_Message *message = GNUNET_CONTAINER_multihashmap_get
(store->messages, hash);
+
+ if (message)
+ return message;
+
+ if (!store->storage_messages)
+ return NULL;
+
+ const struct GNUNET_MESSENGER_MessageEntry *entry =
GNUNET_CONTAINER_multihashmap_get (store->entries, hash);
+
+ if (!entry)
+ return NULL;
+
+ if (entry->offset != GNUNET_DISK_file_seek (store->storage_messages,
entry->offset, GNUNET_DISK_SEEK_SET))
+ return message;
+
+ char *buffer = GNUNET_malloc(entry->length);
+
+ if (GNUNET_DISK_file_read (store->storage_messages, buffer, entry->length)
!= entry->length)
+ goto free_buffer;
+
+
+ message = create_message (GNUNET_MESSENGER_KIND_UNKNOWN);
+
+ if ((GNUNET_YES != decode_message (message, entry->length, buffer)) ||
(GNUNET_OK
+ != GNUNET_CONTAINER_multihashmap_put (store->messages, hash, message,
+
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST)))
+ {
+ destroy_message (message);
+
+ message = NULL;
+
+ GNUNET_CONTAINER_multihashmap_remove (store->entries, hash, entry);
+ }
+
+free_buffer:
+ GNUNET_free(buffer);
+
+ return message;
+}
+
+int
+put_store_message (struct GNUNET_MESSENGER_MessageStore *store, const struct
GNUNET_HashCode *hash,
+ struct GNUNET_MESSENGER_Message *message)
+{
+ return GNUNET_CONTAINER_multihashmap_put (store->messages, hash, message,
+
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST);
+}
diff --git a/src/messenger/gnunet-service-messenger_message_store.h
b/src/messenger/gnunet-service-messenger_message_store.h
new file mode 100644
index 000000000..e58459b21
--- /dev/null
+++ b/src/messenger/gnunet-service-messenger_message_store.h
@@ -0,0 +1,120 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2020 GNUnet e.V.
+
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @author Tobias Frisch
+ * @file src/messenger/gnunet-service-messenger_message_store.h
+ * @brief GNUnet MESSENGER service
+ */
+
+#ifndef GNUNET_SERVICE_MESSENGER_MESSAGE_STORE_H
+#define GNUNET_SERVICE_MESSENGER_MESSAGE_STORE_H
+
+#include "platform.h"
+#include "gnunet_container_lib.h"
+#include "gnunet_disk_lib.h"
+
+struct GNUNET_MESSENGER_MessageEntry
+{
+ off_t offset;
+ uint16_t length;
+};
+
+struct GNUNET_MESSENGER_MessageStore
+{
+ struct GNUNET_DISK_FileHandle *storage_messages;
+
+ struct GNUNET_CONTAINER_MultiHashMap *entries;
+ struct GNUNET_CONTAINER_MultiHashMap *messages;
+};
+
+/**
+ * Initializes a message store as fully empty.
+ *
+ * @param store Message store
+ */
+void
+init_message_store (struct GNUNET_MESSENGER_MessageStore *store);
+
+/**
+ * Clears a message store, wipes its content and deallocates its memory.
+ *
+ * @param store Message store
+ */
+void
+clear_message_store (struct GNUNET_MESSENGER_MessageStore *store);
+
+/**
+ * Loads messages from a directory into a message store.
+ *
+ * @param store Message store
+ * @param directory Path to a directory
+ */
+void
+load_message_store (struct GNUNET_MESSENGER_MessageStore *store, const char
*directory);
+
+/**
+ * Saves messages from a message store into a directory.
+ *
+ * @param store Message store
+ * @param directory Path to a directory
+ */
+void
+save_message_store (struct GNUNET_MESSENGER_MessageStore *store, const char
*directory);
+
+/**
+ * Checks if a message matching a given <i>hash</i> is stored in a message
store. The function returns
+ * GNUNET_YES if a match is found, GNUNET_NO otherwise.
+ *
+ * The message has not to be loaded from disk into memory for this check!
+ *
+ * @param store Message store
+ * @param hash Hash of message
+ * @return GNUNET_YES on match, otherwise GNUNET_NO
+ */
+int
+contains_store_message (struct GNUNET_MESSENGER_MessageStore *store, const
struct GNUNET_HashCode *hash);
+
+/**
+ * Returns the message from a message store matching a given <i>hash</i>. If
no matching message is found,
+ * NULL gets returned.
+ *
+ * This function requires the message to be loaded into memory!
+ * @see contains_store_message()
+ *
+ * @param store Message store
+ * @param hash Hash of message
+ * @return Message or NULL
+ */
+const struct GNUNET_MESSENGER_Message*
+get_store_message (struct GNUNET_MESSENGER_MessageStore *store, const struct
GNUNET_HashCode *hash);
+
+/**
+ * Stores a message into the message store. The result indicates if the
operation was successful.
+ *
+ * @param store Message store
+ * @param hash Hash of message
+ * @param message Message
+ * @return GNUNET_OK on success, otherwise GNUNET_NO
+ */
+int
+put_store_message (struct GNUNET_MESSENGER_MessageStore *store, const struct
GNUNET_HashCode *hash,
+ struct GNUNET_MESSENGER_Message *message);
+
+#endif //GNUNET_SERVICE_MESSENGER_MESSAGE_STORE_H
diff --git a/src/messenger/gnunet-service-messenger_room.c
b/src/messenger/gnunet-service-messenger_room.c
new file mode 100644
index 000000000..7383e1d20
--- /dev/null
+++ b/src/messenger/gnunet-service-messenger_room.c
@@ -0,0 +1,1051 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2020 GNUnet e.V.
+
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @author Tobias Frisch
+ * @file src/messenger/gnunet-service-messenger_room.c
+ * @brief GNUnet MESSENGER service
+ */
+
+#include "gnunet-service-messenger_room.h"
+
+#include "gnunet-service-messenger_message_kind.h"
+
+#include "gnunet-service-messenger_service.h"
+#include "gnunet-service-messenger_util.h"
+
+static void
+idle_request_room_messages (void *cls);
+
+struct GNUNET_MESSENGER_SrvRoom*
+create_room (struct GNUNET_MESSENGER_SrvHandle *handle, const struct
GNUNET_HashCode *key)
+{
+ GNUNET_assert((handle) && (key));
+
+ struct GNUNET_MESSENGER_SrvRoom *room = GNUNET_new(struct
GNUNET_MESSENGER_SrvRoom);
+
+ room->service = handle->service;
+ room->host = handle;
+ room->port = NULL;
+
+ GNUNET_memcpy(&(room->key), key, sizeof(struct GNUNET_HashCode));
+
+ room->tunnels = GNUNET_CONTAINER_multipeermap_create (8, GNUNET_NO);
+ room->members = GNUNET_CONTAINER_multishortmap_create (8, GNUNET_NO);
+ room->member_infos = GNUNET_CONTAINER_multishortmap_create (8, GNUNET_NO);
+
+ init_message_store (&(room->store));
+ room->requested = GNUNET_CONTAINER_multihashmap_create (8, GNUNET_NO);
+
+ init_list_tunnels (&(room->basement));
+ init_list_messages (&(room->last_messages));
+
+ room->peer_message = NULL;
+
+ init_list_messages (&(room->handling));
+ room->idle = NULL;
+
+ room->strict_access = GNUNET_NO;
+
+ if (room->service->dir)
+ load_service_room_and_messages (room->service, room);
+
+ room->idle = GNUNET_SCHEDULER_add_with_priority
(GNUNET_SCHEDULER_PRIORITY_IDLE, idle_request_room_messages, room);
+
+ return room;
+}
+
+static int
+iterate_destroy_tunnels (void *cls, const struct GNUNET_PeerIdentity *key,
void *value)
+{
+ struct GNUNET_MESSENGER_SrvTunnel *tunnel = value;
+ destroy_tunnel (tunnel);
+ return GNUNET_YES;
+}
+
+static int
+iterate_clear_members (void *cls, const struct GNUNET_ShortHashCode *key, void
*value)
+{
+ struct GNUNET_MESSENGER_SrvContact *contact = value;
+
+ if (GNUNET_YES == decrease_contact_rc (contact))
+ {
+ struct GNUNET_MESSENGER_SrvRoom *room = cls;
+
+ const struct GNUNET_HashCode *id = get_contact_id_from_key (contact);
+
+ if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_remove
(room->service->contacts, id, contact))
+ destroy_contact (contact);
+ }
+
+ return GNUNET_YES;
+}
+
+static int
+iterate_destroy_member_infos (void *cls, const struct GNUNET_ShortHashCode
*key, void *value)
+{
+ struct GNUNET_MESSENGER_MemberInfo *info = value;
+
+ clear_list_messages (&(info->session_messages));
+
+ GNUNET_free(info);
+ return GNUNET_YES;
+}
+
+void
+destroy_room (struct GNUNET_MESSENGER_SrvRoom *room)
+{
+ GNUNET_assert(room);
+
+ if (room->idle)
+ {
+ GNUNET_SCHEDULER_cancel (room->idle);
+
+ room->idle = NULL;
+ }
+
+ if (room->port)
+ GNUNET_CADET_close_port (room->port);
+
+ merge_room_last_messages (room, room->host);
+
+ GNUNET_CONTAINER_multipeermap_iterate (room->tunnels,
iterate_destroy_tunnels,
+ NULL);
+
+ handle_room_messages (room);
+
+ if (room->service->dir)
+ save_service_room_and_messages (room->service, room);
+
+ GNUNET_CONTAINER_multishortmap_iterate (room->members,
iterate_clear_members, room);
+ GNUNET_CONTAINER_multishortmap_iterate (room->member_infos,
iterate_destroy_member_infos, NULL);
+
+ clear_message_store (&(room->store));
+
+ GNUNET_CONTAINER_multihashmap_destroy (room->requested);
+
+ GNUNET_CONTAINER_multipeermap_destroy (room->tunnels);
+ GNUNET_CONTAINER_multishortmap_destroy (room->members);
+ GNUNET_CONTAINER_multishortmap_destroy (room->member_infos);
+
+ clear_list_tunnels (&(room->basement));
+ clear_list_messages (&(room->last_messages));
+
+ if (room->peer_message)
+ GNUNET_free(room->peer_message);
+
+ GNUNET_free(room);
+}
+
+struct GNUNET_MESSENGER_SrvContact*
+get_room_contact (struct GNUNET_MESSENGER_SrvRoom *room, const struct
GNUNET_ShortHashCode *id)
+{
+ GNUNET_assert((room) && (room->members));
+
+ return GNUNET_CONTAINER_multishortmap_get (room->members, id);
+}
+
+void
+add_room_contact (struct GNUNET_MESSENGER_SrvRoom *room, const struct
GNUNET_ShortHashCode *id,
+ const struct GNUNET_IDENTITY_PublicKey *pubkey)
+{
+ struct GNUNET_MESSENGER_SrvContact *contact = get_service_contact_by_pubkey
(room->service, pubkey);
+
+ if (GNUNET_OK == GNUNET_CONTAINER_multishortmap_put (room->members, id,
contact,
+
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST))
+ increase_contact_rc (contact);
+}
+
+struct GNUNET_MESSENGER_MemberInfo*
+get_room_member_info (struct GNUNET_MESSENGER_SrvRoom *room, const struct
GNUNET_ShortHashCode *id)
+{
+ GNUNET_assert((room) && (room->member_infos));
+
+ return GNUNET_CONTAINER_multishortmap_get (room->member_infos, id);
+}
+
+struct GNUNET_ShortHashCode*
+generate_room_member_id (const struct GNUNET_MESSENGER_SrvRoom *room)
+{
+ struct GNUNET_ShortHashCode *unique_id = GNUNET_new(struct
GNUNET_ShortHashCode);
+
+ GNUNET_assert(room);
+
+ if (GNUNET_YES == generate_free_member_id (unique_id, room->members))
+ return unique_id;
+ else
+ {
+ GNUNET_free(unique_id);
+ return NULL;
+ }
+}
+
+const struct GNUNET_ShortHashCode*
+get_room_host_id (const struct GNUNET_MESSENGER_SrvRoom *room)
+{
+ GNUNET_assert(room);
+
+ return get_handle_member_id (room->host, &(room->key));
+}
+
+void
+change_room_host_id (struct GNUNET_MESSENGER_SrvRoom *room, const struct
GNUNET_ShortHashCode *unique_id)
+{
+ GNUNET_assert(room);
+
+ change_handle_member_id (room->host, &(room->key), unique_id);
+}
+
+static int
+send_room_info (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvHandle *handle,
+ struct GNUNET_MESSENGER_SrvTunnel *tunnel)
+{
+ if (!handle)
+ return GNUNET_NO;
+
+ merge_room_last_messages (room, handle);
+
+ if (!is_tunnel_connected (tunnel))
+ return GNUNET_NO;
+
+ struct GNUNET_MESSENGER_Message *message = create_message_info
(get_handle_ego(handle), room->members);
+
+ if (!message)
+ return GNUNET_NO;
+
+ if ((tunnel->peer_message) && (tunnel->contact_id))
+ {
+ GNUNET_memcpy(&(message->body.info.unique_id), &(tunnel->contact_id),
sizeof(struct GNUNET_ShortHashCode));
+ GNUNET_free(tunnel->contact_id);
+
+ tunnel->contact_id = NULL;
+ }
+
+ struct GNUNET_HashCode hash;
+
+ send_tunnel_message (tunnel, handle, message, &hash);
+ destroy_message (message);
+
+ if (tunnel->contact_id)
+ {
+ GNUNET_free(tunnel->contact_id);
+
+ tunnel->contact_id = NULL;
+ }
+
+ return GNUNET_YES;
+}
+
+static void*
+callback_room_connect (void *cls, struct GNUNET_CADET_Channel *channel, const
struct GNUNET_PeerIdentity *source)
+{
+ struct GNUNET_MESSENGER_SrvRoom *room = cls;
+
+ struct GNUNET_MESSENGER_SrvTunnel *tunnel =
GNUNET_CONTAINER_multipeermap_get (room->tunnels, source);
+
+ if (tunnel)
+ {
+ if (GNUNET_YES == bind_tunnel (tunnel, channel))
+ {
+ if (GNUNET_YES == send_room_info (room, room->host, tunnel))
+ return tunnel;
+ else
+ {
+ disconnect_tunnel (tunnel);
+ return NULL;
+ }
+ }
+ else
+ {
+ delayed_disconnect_channel (channel);
+ return NULL;
+ }
+ }
+ else
+ {
+ tunnel = create_tunnel (room, source);
+
+ if ((GNUNET_YES == bind_tunnel (tunnel, channel)) && (GNUNET_OK
+ == GNUNET_CONTAINER_multipeermap_put (room->tunnels, source, tunnel,
+
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST)))
+ {
+ if (GNUNET_YES == send_room_info (room, room->host, tunnel))
+ return tunnel;
+ else
+ {
+ GNUNET_CONTAINER_multipeermap_remove (room->tunnels, source, tunnel);
+
+ disconnect_tunnel (tunnel);
+ destroy_tunnel (tunnel);
+ return NULL;
+ }
+ }
+ else
+ {
+ tunnel->channel = NULL;
+ destroy_tunnel (tunnel);
+
+ delayed_disconnect_channel (channel);
+ return NULL;
+ }
+ }
+}
+
+static int
+join_room (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvHandle *handle,
+ const struct GNUNET_ShortHashCode *member_id)
+{
+ GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Joining room: %s (%s)\n",
GNUNET_h2s(get_room_key(room)), GNUNET_sh2s(member_id));
+
+ struct GNUNET_MESSENGER_Message *message = create_message_join
(get_handle_ego(handle));
+
+ if (!message)
+ {
+ GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "Your join message could not be
created!\n");
+
+ return GNUNET_NO;
+ }
+
+ struct GNUNET_HashCode hash;
+
+ send_room_message (room, handle, message, &hash);
+ destroy_message (message);
+
+ struct GNUNET_MESSENGER_MemberInfo *info = GNUNET_new(struct
GNUNET_MESSENGER_MemberInfo);
+
+ info->access = GNUNET_MESSENGER_MEMBER_ALLOWED;
+ init_list_messages (&(info->session_messages));
+
+ if (GNUNET_YES == GNUNET_CONTAINER_multishortmap_put (room->member_infos,
member_id, info,
+
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST))
+ {
+ change_handle_member_id (handle, &(room->key), member_id);
+
+ add_to_list_messages (&(info->session_messages), &hash);
+ return GNUNET_YES;
+ }
+ else
+ {
+ GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Your member information could not
be registered!\n");
+
+ GNUNET_free(info);
+ return GNUNET_NO;
+ }
+}
+
+static int
+join_room_locally (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvHandle *handle)
+{
+ const struct GNUNET_ShortHashCode *member_id = get_handle_member_id (handle,
&(room->key));
+
+ struct GNUNET_MESSENGER_MemberInfo *info =
GNUNET_CONTAINER_multishortmap_get (room->member_infos, member_id);
+
+ if ((!info) && (GNUNET_NO == join_room (room, handle, member_id)))
+ return GNUNET_NO;
+
+ return GNUNET_YES;
+}
+
+extern int
+check_tunnel_message (void *cls, const struct GNUNET_MessageHeader *header);
+extern void
+handle_tunnel_message (void *cls, const struct GNUNET_MessageHeader *header);
+
+extern void
+callback_tunnel_disconnect (void *cls, const struct GNUNET_CADET_Channel
*channel);
+
+int
+open_room (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvHandle *handle)
+{
+ if (room->port)
+ return join_room_locally (room, handle);
+
+ struct GNUNET_CADET_Handle *cadet = get_room_cadet (room);
+ struct GNUNET_HashCode *key = get_room_key (room);
+
+ struct GNUNET_MQ_MessageHandler handlers[] = {
GNUNET_MQ_hd_var_size(tunnel_message, GNUNET_MESSAGE_TYPE_CADET_CLI,
+ struct
GNUNET_MessageHeader, NULL),
+ GNUNET_MQ_handler_end() };
+
+ room->port = GNUNET_CADET_open_port (cadet, key, callback_room_connect,
room, NULL,
+ callback_tunnel_disconnect, handlers);
+
+ const struct GNUNET_ShortHashCode *member_id = get_handle_member_id (handle,
&(room->key));
+
+ struct GNUNET_MESSENGER_MemberInfo *info =
GNUNET_CONTAINER_multishortmap_get (room->member_infos, member_id);
+
+ if ((!info) && (GNUNET_NO == join_room (room, handle, member_id)) &&
(room->port))
+ {
+ GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "You could not join the room,
therefore it keeps closed!\n");
+
+ GNUNET_CADET_close_port (room->port);
+ room->port = NULL;
+
+ return GNUNET_NO;
+ }
+
+ struct GNUNET_MESSENGER_Message *message = create_message_peer
(room->service);
+
+ if (message)
+ {
+ struct GNUNET_HashCode hash;
+
+ send_room_message (room, handle, message, &hash);
+ destroy_message (message);
+ }
+
+ return (room->port ? GNUNET_YES : GNUNET_NO);
+}
+
+int
+entry_room_at (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvHandle *handle,
+ const struct GNUNET_PeerIdentity *door)
+{
+ if (room->peer_message)
+ {
+ const struct GNUNET_MESSENGER_Message *msg = get_room_message (room,
handle, room->peer_message, GNUNET_NO);
+
+ if (0 == GNUNET_memcmp(&(msg->body.peer.peer), door))
+ return join_room_locally (room, handle);
+ }
+
+ struct GNUNET_MESSENGER_SrvTunnel *tunnel =
GNUNET_CONTAINER_multipeermap_get (room->tunnels, door);
+
+ if (tunnel)
+ {
+ switch (connect_tunnel (tunnel))
+ {
+ case GNUNET_YES:
+ return GNUNET_YES;
+ case GNUNET_NO:
+ return join_room_locally (room, handle);
+ default:
+ return GNUNET_NO;
+ }
+ }
+
+ tunnel = create_tunnel (room, door);
+
+ if ((GNUNET_YES == connect_tunnel (tunnel)) &&
+ (GNUNET_OK == GNUNET_CONTAINER_multipeermap_put (room->tunnels, door,
tunnel,
+
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST)))
+ return GNUNET_YES;
+ else
+ {
+ GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "You could not connect to that
door!\n");
+
+ destroy_tunnel (tunnel);
+ return GNUNET_NO;
+ }
+}
+
+struct GNUNET_MESSENGER_SrvTunnelFinder
+{
+ const struct GNUNET_ShortHashCode *needle;
+ struct GNUNET_MESSENGER_SrvTunnel *tunnel;
+};
+
+static int
+iterate_find_tunnel (void *cls, const struct GNUNET_PeerIdentity *peer, void
*value)
+{
+ struct GNUNET_MESSENGER_SrvTunnel *tunnel = value;
+ struct GNUNET_MESSENGER_SrvTunnelFinder *finder = cls;
+
+ if ((tunnel->contact_id) && (0 == GNUNET_memcmp(tunnel->contact_id,
finder->needle)))
+ {
+ finder->tunnel = tunnel;
+ return GNUNET_NO;
+ }
+
+ return GNUNET_YES;
+}
+
+struct GNUNET_MESSENGER_SrvTunnel*
+find_room_tunnel_to (struct GNUNET_MESSENGER_SrvRoom *room, const struct
GNUNET_ShortHashCode *contact_id)
+{
+ struct GNUNET_MESSENGER_SrvTunnelFinder finder;
+
+ finder.needle = contact_id;
+ finder.tunnel = NULL;
+
+ GNUNET_CONTAINER_multipeermap_iterate (room->tunnels, iterate_find_tunnel,
&finder);
+
+ return finder.tunnel;
+}
+
+struct GNUNET_MQ_Envelope*
+pack_room_message (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvHandle *handle,
+ struct GNUNET_MESSENGER_Message *message, struct
GNUNET_HashCode *hash, int mode)
+{
+ message->header.timestamp = GNUNET_TIME_absolute_hton
(GNUNET_TIME_absolute_get ());
+
+ const struct GNUNET_ShortHashCode *id = get_handle_member_id (handle,
&(room->key));
+
+ GNUNET_assert(id);
+
+ GNUNET_memcpy(&(message->header.sender_id), id, sizeof(struct
GNUNET_ShortHashCode));
+
+ if (room->last_messages.head)
+ GNUNET_memcpy(&(message->header.previous),
&(room->last_messages.head->hash), sizeof(struct GNUNET_HashCode));
+ else
+ memset (&(message->header.previous), 0, sizeof(struct GNUNET_HashCode));
+
+ return pack_message (message, hash, get_handle_ego (handle), mode);
+}
+
+struct GNUNET_MESSENGER_ClosureSendRoom
+{
+ struct GNUNET_MESSENGER_SrvRoom *room;
+ struct GNUNET_MESSENGER_SrvHandle *handle;
+ struct GNUNET_MESSENGER_SrvTunnel *exclude;
+ struct GNUNET_MESSENGER_Message *message;
+ struct GNUNET_HashCode *hash;
+ int packed;
+};
+
+static int
+iterate_send_room_message (void *cls, const struct GNUNET_PeerIdentity *key,
void *value)
+{
+ struct GNUNET_MESSENGER_SrvTunnel *tunnel = value;
+
+ if ((!is_tunnel_connected (tunnel)) || (!tunnel->contact_id))
+ return GNUNET_YES;
+
+ struct GNUNET_MESSENGER_ClosureSendRoom *closure = cls;
+
+ if (tunnel == closure->exclude)
+ return GNUNET_YES;
+
+ struct GNUNET_MQ_Envelope *env = NULL;
+
+ if (closure->packed == GNUNET_NO)
+ {
+ env = pack_room_message (closure->room, closure->handle, closure->message,
closure->hash,
+ GNUNET_MESSENGER_PACK_MODE_ENVELOPE);
+
+ if (env)
+ {
+ closure->message = copy_message (closure->message);
+ closure->packed = GNUNET_YES;
+ }
+ }
+ else
+ {
+ env = pack_message (closure->message, NULL, NULL,
+ GNUNET_MESSENGER_PACK_MODE_ENVELOPE);
+ }
+
+ if (env)
+ send_tunnel_envelope (tunnel, closure->handle, env, closure->message,
closure->hash);
+
+ return GNUNET_YES;
+}
+
+void
+callback_room_sent (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvHandle *handle, void *cls,
+ struct GNUNET_MESSENGER_Message *message, const struct
GNUNET_HashCode *hash);
+
+void
+send_room_message (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvHandle *handle,
+ struct GNUNET_MESSENGER_Message *message, struct
GNUNET_HashCode *hash)
+{
+ struct GNUNET_MESSENGER_ClosureSendRoom closure;
+
+ closure.room = room;
+ closure.handle = handle;
+ closure.exclude = NULL;
+ closure.message = message;
+ closure.hash = hash;
+ closure.packed = GNUNET_NO;
+
+ GNUNET_CONTAINER_multipeermap_iterate (room->tunnels,
iterate_send_room_message, &closure);
+
+ if ((GNUNET_NO == closure.packed) && (closure.message == message))
+ {
+ pack_room_message (room, handle, message, hash,
+ GNUNET_MESSENGER_PACK_MODE_UNKNOWN);
+
+ callback_room_sent (room, handle, NULL, copy_message (message), hash);
+ }
+}
+
+void
+send_room_message_ext (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvHandle *handle,
+ struct GNUNET_MESSENGER_Message *message, struct
GNUNET_HashCode *hash,
+ struct GNUNET_MESSENGER_SrvTunnel *tunnel)
+{
+ struct GNUNET_MESSENGER_ClosureSendRoom closure;
+
+ closure.room = room;
+ closure.handle = handle;
+ closure.exclude = tunnel;
+ closure.message = message;
+ closure.hash = hash;
+ closure.packed = GNUNET_NO;
+
+ GNUNET_CONTAINER_multipeermap_iterate (room->tunnels,
iterate_send_room_message, &closure);
+
+ if ((GNUNET_NO == closure.packed) && (closure.message == message))
+ {
+ pack_room_message (room, handle, message, hash,
+ GNUNET_MESSENGER_PACK_MODE_UNKNOWN);
+
+ callback_room_sent (room, handle, NULL, copy_message (message), hash);
+ }
+}
+
+void
+forward_room_message (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvTunnel *tunnel,
+ const struct GNUNET_MESSENGER_Message *message, const
struct GNUNET_HashCode *hash)
+{
+ struct GNUNET_MESSENGER_ClosureSendRoom closure;
+ struct GNUNET_HashCode message_hash;
+
+ GNUNET_memcpy(&message_hash, hash, sizeof(struct GNUNET_HashCode));
+
+ closure.room = room;
+ closure.handle = NULL;
+ closure.exclude = tunnel;
+ closure.message = copy_message (message);
+ closure.hash = &message_hash;
+ closure.packed = GNUNET_YES;
+
+ GNUNET_CONTAINER_multipeermap_iterate (room->tunnels,
iterate_send_room_message, &closure);
+}
+
+void
+merge_room_last_messages (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvHandle *handle)
+{
+ if (!handle)
+ return;
+
+ if (!room->last_messages.head)
+ return;
+
+ while (room->last_messages.head != room->last_messages.tail)
+ {
+ struct GNUNET_MESSENGER_ListMessage *element = room->last_messages.tail;
+
+ struct GNUNET_MESSENGER_Message *message = create_message_merge
(&(element->hash));
+
+ if (message)
+ {
+ struct GNUNET_HashCode hash;
+
+ send_room_message (room, handle, message, &hash);
+ destroy_message (message);
+ }
+
+ if (element->prev)
+ GNUNET_CONTAINER_DLL_remove(room->last_messages.head,
room->last_messages.tail, element);
+ }
+}
+
+struct GNUNET_CADET_Handle*
+get_room_cadet (struct GNUNET_MESSENGER_SrvRoom *room)
+{
+ return room->service->cadet;
+}
+
+struct GNUNET_HashCode*
+get_room_key (struct GNUNET_MESSENGER_SrvRoom *room)
+{
+ return &(room->key);
+}
+
+const struct GNUNET_MESSENGER_SrvTunnel*
+get_room_tunnel (struct GNUNET_MESSENGER_SrvRoom *room, const struct
GNUNET_PeerIdentity *peer)
+{
+ return GNUNET_CONTAINER_multipeermap_get (room->tunnels, peer);
+}
+
+const struct GNUNET_MESSENGER_Message*
+get_room_message (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvHandle *handle,
+ const struct GNUNET_HashCode *hash, int request)
+{
+ const struct GNUNET_MESSENGER_Message *message = get_store_message
(&(room->store), hash);
+
+ if ((message) || (!handle) || (GNUNET_YES != request)
+ || (GNUNET_NO != GNUNET_CONTAINER_multihashmap_contains
(room->requested, hash)))
+ return message;
+
+ struct GNUNET_MESSENGER_Message *request_msg = create_message_request (hash);
+
+ if (request_msg)
+ {
+ if (GNUNET_CONTAINER_multihashmap_put (room->requested, hash, NULL,
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST) == GNUNET_OK)
+ {
+ struct GNUNET_HashCode request_hash;
+
+ send_room_message (room, handle, request_msg, &request_hash);
+ }
+
+ destroy_message (request_msg);
+ }
+
+ return message;
+}
+
+void
+callback_room_disconnect (struct GNUNET_MESSENGER_SrvRoom *room, void *cls)
+{
+ struct GNUNET_MESSENGER_SrvTunnel *tunnel = cls;
+
+ if (!room->host)
+ return;
+
+ struct GNUNET_PeerIdentity identity;
+
+ GNUNET_PEER_resolve (tunnel->peer, &identity);
+
+ if (GNUNET_YES == contains_list_tunnels (&(room->basement), &identity))
+ {
+ struct GNUNET_MESSENGER_Message *message = create_message_miss (&identity);
+
+ if (message)
+ {
+ struct GNUNET_HashCode hash;
+
+ send_room_message (room, room->host, message, &hash);
+ destroy_message (message);
+ }
+ }
+}
+
+int
+callback_verify_room_message (struct GNUNET_MESSENGER_SrvRoom *room, void *cls,
+ struct GNUNET_MESSENGER_Message *message, struct
GNUNET_HashCode *hash)
+{
+ if (GNUNET_MESSENGER_KIND_UNKNOWN == message->header.kind)
+ return GNUNET_SYSERR;
+
+ struct GNUNET_MESSENGER_SrvContact *contact =
GNUNET_CONTAINER_multishortmap_get (room->members,
+
&(message->header.sender_id));
+
+ if (!contact)
+ {
+ if (GNUNET_MESSENGER_KIND_INFO == message->header.kind)
+ contact = get_service_contact_by_pubkey (room->service,
&(message->body.info.host_key));
+ else if (GNUNET_MESSENGER_KIND_JOIN == message->header.kind)
+ contact = get_service_contact_by_pubkey (room->service,
&(message->body.join.key));
+ }
+
+ if ((!contact) || (GNUNET_SYSERR == verify_message (message, hash,
get_contact_key (contact))))
+ return GNUNET_SYSERR;
+
+ if (GNUNET_YES == room->strict_access)
+ {
+ struct GNUNET_MESSENGER_MemberInfo *info =
GNUNET_CONTAINER_multishortmap_get (room->member_infos,
+
&(message->header.sender_id));
+
+ if ((info) && (GNUNET_MESSENGER_MEMBER_BLOCKED == info->access))
+ return GNUNET_SYSERR;
+ }
+
+ if (GNUNET_YES == contains_store_message (&(room->store), hash))
+ return GNUNET_NO;
+
+ return GNUNET_YES;
+}
+
+static void
+search_room_for_message (struct GNUNET_MESSENGER_SrvRoom *room, const struct
GNUNET_HashCode *hash)
+{
+ const struct GNUNET_MESSENGER_Message *message = get_room_message (room,
room->host, hash, GNUNET_YES);
+
+ if (!message)
+ return;
+
+ if (GNUNET_MESSENGER_KIND_MERGE == message->header.kind)
+ search_room_for_message (room, &(message->body.merge.previous));
+
+ search_room_for_message (room, &(message->header.previous));
+}
+
+static void
+idle_request_room_messages (void *cls)
+{
+ struct GNUNET_MESSENGER_SrvRoom *room = cls;
+
+ room->idle = NULL;
+
+ struct GNUNET_MESSENGER_ListMessage *element = room->last_messages.head;
+
+ while (element)
+ {
+ search_room_for_message (room, &(element->hash));
+
+ element = element->next;
+ }
+
+ merge_room_last_messages (room, room->host);
+
+ room->idle = GNUNET_SCHEDULER_add_delayed_with_priority
(GNUNET_TIME_relative_get_second_ (),
+
GNUNET_SCHEDULER_PRIORITY_IDLE, idle_request_room_messages,
+ cls);
+}
+
+void
+update_room_last_messages (struct GNUNET_MESSENGER_SrvRoom *room, const struct
GNUNET_MESSENGER_Message *message,
+ const struct GNUNET_HashCode *hash)
+{
+ struct GNUNET_MESSENGER_ListMessage *element = room->last_messages.head;
+ struct GNUNET_MESSENGER_ListMessage *merging = NULL;
+
+ if (GNUNET_MESSENGER_KIND_MERGE == message->header.kind)
+ {
+ merging = room->last_messages.head;
+
+ while (merging)
+ {
+ if (0 == GNUNET_CRYPTO_hash_cmp (&(merging->hash),
&(message->body.merge.previous)))
+ break;
+
+ merging = merging->next;
+ }
+
+ if (merging)
+ element = merging->next;
+ }
+
+ while (element)
+ {
+ if (0 == GNUNET_CRYPTO_hash_cmp (&(element->hash),
&(message->header.previous)))
+ break;
+
+ element = element->next;
+ }
+
+ if ((merging) && (!element))
+ {
+ element = merging;
+ merging = NULL;
+ }
+
+ if (element)
+ {
+ GNUNET_memcpy(&(element->hash), hash, sizeof(struct GNUNET_HashCode));
+
+ if (merging)
+ GNUNET_CONTAINER_DLL_remove(room->last_messages.head,
room->last_messages.tail, merging);
+ }
+ else
+ add_to_list_messages (&(room->last_messages), hash);
+
+ if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_contains (room->requested,
hash))
+ GNUNET_CONTAINER_multihashmap_remove_all (room->requested, hash);
+}
+
+void
+switch_room_member_id (struct GNUNET_MESSENGER_SrvRoom *room, const struct
GNUNET_ShortHashCode *old_id,
+ const struct GNUNET_ShortHashCode *new_id, const struct
GNUNET_HashCode *hash)
+{
+ struct GNUNET_MESSENGER_SrvContact *contact =
GNUNET_CONTAINER_multishortmap_get (room->members, old_id);
+
+ if ((contact) && (GNUNET_YES == GNUNET_CONTAINER_multishortmap_remove
(room->members, old_id, contact)))
+ GNUNET_CONTAINER_multishortmap_put (room->members, new_id, contact,
+
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST);
+
+ struct GNUNET_MESSENGER_MemberInfo *info =
GNUNET_CONTAINER_multishortmap_get (room->member_infos, old_id);
+
+ if ((!info) || (GNUNET_YES != GNUNET_CONTAINER_multishortmap_remove
(room->member_infos, old_id, contact))
+ || (GNUNET_YES != GNUNET_CONTAINER_multishortmap_put
(room->member_infos, new_id, contact,
+
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST)))
+ return;
+
+ if (hash)
+ add_to_list_messages (&(info->session_messages), hash);
+}
+
+void
+rebuild_room_basement_structure (struct GNUNET_MESSENGER_SrvRoom *room)
+{
+ struct GNUNET_PeerIdentity peer;
+ size_t src;
+
+ if ((GNUNET_OK != get_service_peer_identity (room->service, &peer)) ||
(!find_list_tunnels (&(room->basement), &peer,
+
&src)))
+ return;
+
+ size_t count = count_of_tunnels (&(room->basement));
+
+ struct GNUNET_MESSENGER_ListTunnel *element = room->basement.head;
+ struct GNUNET_MESSENGER_SrvTunnel *tunnel;
+
+ size_t dst = 0;
+
+ while (element)
+ {
+ GNUNET_PEER_resolve (element->peer, &peer);
+
+ tunnel = GNUNET_CONTAINER_multipeermap_get (room->tunnels, &peer);
+
+ if (!tunnel)
+ {
+ element = remove_from_list_tunnels (&(room->basement), element);
+ continue;
+ }
+
+ if (GNUNET_YES == required_connection_between (count, src, dst))
+ {
+ if (GNUNET_SYSERR == connect_tunnel (tunnel))
+ {
+ element = remove_from_list_tunnels (&(room->basement), element);
+ continue;
+ }
+ }
+ else
+ disconnect_tunnel (tunnel);
+
+ element = element->next;
+ dst++;
+ }
+}
+
+void
+handle_room_messages (struct GNUNET_MESSENGER_SrvRoom *room)
+{
+ while (room->handling.head)
+ {
+ struct GNUNET_MESSENGER_ListMessage *element = room->handling.head;
+
+ const struct GNUNET_MESSENGER_Message *msg = get_room_message (room,
room->host, &(element->hash), GNUNET_NO);
+
+ if (msg)
+ handle_service_message (room->service, room, msg, &(element->hash));
+
+ GNUNET_CONTAINER_DLL_remove(room->handling.head, room->handling.tail,
element);
+ GNUNET_free(element);
+ }
+}
+
+#include "gnunet-service-messenger_message_recv.h"
+
+void
+callback_room_recv (struct GNUNET_MESSENGER_SrvRoom *room, void *cls, struct
GNUNET_MESSENGER_Message *message,
+ const struct GNUNET_HashCode *hash)
+{
+ struct GNUNET_MESSENGER_SrvTunnel *tunnel = cls;
+
+ if (GNUNET_OK != put_store_message (&(room->store), hash, message))
+ return;
+
+ update_room_last_messages (room, message, hash);
+
+ if (GNUNET_MESSENGER_KIND_INFO != message->header.kind)
+ forward_room_message (room, tunnel, message, hash);
+
+ const int start_handle = room->handling.head ? GNUNET_NO : GNUNET_YES;
+
+ add_to_list_messages (&(room->handling), hash);
+
+ switch (message->header.kind)
+ {
+ case GNUNET_MESSENGER_KIND_INFO:
+ recv_message_info (room, tunnel, message, hash);
+ break;
+ case GNUNET_MESSENGER_KIND_JOIN:
+ recv_message_join (room, tunnel, message, hash);
+ break;
+ case GNUNET_MESSENGER_KIND_LEAVE:
+ recv_message_leave (room, tunnel, message, hash);
+ break;
+ case GNUNET_MESSENGER_KIND_NAME:
+ recv_message_name (room, tunnel, message, hash);
+ break;
+ case GNUNET_MESSENGER_KIND_KEY:
+ recv_message_key (room, tunnel, message, hash);
+ break;
+ case GNUNET_MESSENGER_KIND_PEER:
+ recv_message_peer (room, tunnel, message, hash);
+ break;
+ case GNUNET_MESSENGER_KIND_ID:
+ recv_message_id (room, tunnel, message, hash);
+ break;
+ case GNUNET_MESSENGER_KIND_MISS:
+ recv_message_miss (room, tunnel, message, hash);
+ break;
+ case GNUNET_MESSENGER_KIND_REQUEST:
+ recv_message_request (room, tunnel, message, hash);
+ break;
+ default:
+ break;
+ }
+
+ if (GNUNET_YES == start_handle)
+ handle_room_messages (room);
+}
+
+#include "gnunet-service-messenger_message_send.h"
+
+void
+callback_room_sent (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvHandle *handle, void *cls,
+ struct GNUNET_MESSENGER_Message *message, const struct
GNUNET_HashCode *hash)
+{
+ const struct GNUNET_MESSENGER_Message *old_message = get_room_message (room,
handle, hash, GNUNET_NO);
+
+ if ((old_message) || (GNUNET_OK != put_store_message (&(room->store), hash,
message)))
+ {
+ if (old_message != message)
+ GNUNET_free(message);
+ }
+ else
+ {
+ struct GNUNET_MESSENGER_SrvTunnel *tunnel = cls; // may be NULL
+
+ update_room_last_messages (room, message, hash);
+
+ const int start_handle = room->handling.head ? GNUNET_NO : GNUNET_YES;
+
+ add_to_list_messages (&(room->handling), hash);
+
+ switch (message->header.kind)
+ {
+ case GNUNET_MESSENGER_KIND_INFO:
+ send_message_info (room, handle, tunnel, message, hash);
+ break;
+ case GNUNET_MESSENGER_KIND_JOIN:
+ send_message_join (room, handle, tunnel, message, hash);
+ break;
+ case GNUNET_MESSENGER_KIND_LEAVE:
+ send_message_leave (room, handle, tunnel, message, hash);
+ break;
+ case GNUNET_MESSENGER_KIND_NAME:
+ send_message_name (room, handle, tunnel, message, hash);
+ break;
+ case GNUNET_MESSENGER_KIND_KEY:
+ send_message_key (room, handle, tunnel, message, hash);
+ break;
+ case GNUNET_MESSENGER_KIND_PEER:
+ send_message_peer (room, handle, tunnel, message, hash);
+ break;
+ case GNUNET_MESSENGER_KIND_ID:
+ send_message_id (room, handle, tunnel, message, hash);
+ break;
+ case GNUNET_MESSENGER_KIND_MISS:
+ send_message_miss (room, handle, tunnel, message, hash);
+ break;
+ default:
+ break;
+ }
+
+ if (GNUNET_YES == start_handle)
+ handle_room_messages (room);
+ }
+}
diff --git a/src/messenger/gnunet-service-messenger_room.h
b/src/messenger/gnunet-service-messenger_room.h
new file mode 100644
index 000000000..36c9e8cf5
--- /dev/null
+++ b/src/messenger/gnunet-service-messenger_room.h
@@ -0,0 +1,378 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2020 GNUnet e.V.
+
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @author Tobias Frisch
+ * @file src/messenger/gnunet-service-messenger_room.h
+ * @brief GNUnet MESSENGER service
+ */
+
+#ifndef GNUNET_SERVICE_MESSENGER_ROOM_H
+#define GNUNET_SERVICE_MESSENGER_ROOM_H
+
+#include "platform.h"
+#include "gnunet_cadet_service.h"
+#include "gnunet_container_lib.h"
+#include "gnunet_crypto_lib.h"
+#include "gnunet_identity_service.h"
+#include "gnunet_mq_lib.h"
+
+#include "gnunet-service-messenger_contact.h"
+
+#include "gnunet_messenger_service.h"
+#include "gnunet-service-messenger_basement.h"
+#include "gnunet-service-messenger_handle.h"
+#include "gnunet-service-messenger_tunnel.h"
+
+#include "gnunet-service-messenger_list_messages.h"
+#include "messenger_api_list_tunnels.h"
+
+#include "gnunet-service-messenger_message_store.h"
+#include "messenger_api_ego.h"
+
+enum GNUNET_MESSENGER_MemberAccess
+{
+ GNUNET_MESSENGER_MEMBER_ALLOWED = 1,
+ GNUNET_MESSENGER_MEMBER_BLOCKED = 1,
+
+ GNUNET_MESSENGER_MEMBER_UNKNOWN = 0
+};
+
+struct GNUNET_MESSENGER_MemberInfo
+{
+ enum GNUNET_MESSENGER_MemberAccess access;
+
+ struct GNUNET_MESSENGER_ListMessages session_messages;
+};
+
+struct GNUNET_MESSENGER_SrvRoom
+{
+ struct GNUNET_MESSENGER_Service *service;
+ struct GNUNET_MESSENGER_SrvHandle *host;
+ struct GNUNET_CADET_Port *port;
+
+ struct GNUNET_HashCode key;
+
+ struct GNUNET_CONTAINER_MultiPeerMap *tunnels;
+ struct GNUNET_CONTAINER_MultiShortmap *members;
+ struct GNUNET_CONTAINER_MultiShortmap *member_infos;
+
+ struct GNUNET_MESSENGER_MessageStore store;
+ struct GNUNET_CONTAINER_MultiHashMap *requested;
+
+ struct GNUNET_MESSENGER_ListTunnels basement;
+ struct GNUNET_MESSENGER_ListMessages last_messages;
+
+ struct GNUNET_HashCode *peer_message;
+
+ struct GNUNET_MESSENGER_ListMessages handling;
+ struct GNUNET_SCHEDULER_Task *idle;
+
+ int strict_access;
+};
+
+/**
+ * Creates and allocates a new room for a <i>handle</i> with a given
<i>key</i>.
+ *
+ * @param handle Handle
+ * @param key Key of room
+ * @return New room
+ */
+struct GNUNET_MESSENGER_SrvRoom*
+create_room (struct GNUNET_MESSENGER_SrvHandle *handle, const struct
GNUNET_HashCode *key);
+
+/**
+ * Destroys a room and frees its memory fully.
+ *
+ * @param room Room
+ */
+void
+destroy_room (struct GNUNET_MESSENGER_SrvRoom *room);
+
+/**
+ * Returns the contact of a member in a <i>room</i> identified by a given
<i>id</i>. If the <i>room</i>
+ * does not contain a member with the given <i>id</i>, NULL gets returned.
+ *
+ * @param room Room
+ * @param id Member id
+ * @return Contact or NULL
+ */
+struct GNUNET_MESSENGER_SrvContact*
+get_room_contact (struct GNUNET_MESSENGER_SrvRoom *room, const struct
GNUNET_ShortHashCode *id);
+
+/**
+ * Adds a contact from the service to a <i>room</i> under a specific <i>id</i>
with a given public key.
+ *
+ * @param room Room
+ * @param id Member id
+ * @param pubkey Public key of EGO
+ */
+void
+add_room_contact (struct GNUNET_MESSENGER_SrvRoom *room, const struct
GNUNET_ShortHashCode *id,
+ const struct GNUNET_IDENTITY_PublicKey *pubkey);
+
+/**
+ * Returns the member information of a member in a <i>room</i> identified by a
given <i>id</i>. If the <i>room</i>
+ * does not contain a member with the given <i>id</i>, NULL gets returned.
+ *
+ * @param room Room
+ * @param id Member id
+ * @return Member information or NULL
+ */
+struct GNUNET_MESSENGER_MemberInfo*
+get_room_member_info (struct GNUNET_MESSENGER_SrvRoom *room, const struct
GNUNET_ShortHashCode *id);
+
+/**
+ * Tries to generate and allocate a new unique member id checking all current
members for possible
+ * duplicates. If the function fails, NULL gets returned.
+ *
+ * @param room Room
+ * @return New member id or NULL
+ */
+struct GNUNET_ShortHashCode*
+generate_room_member_id (const struct GNUNET_MESSENGER_SrvRoom *room);
+
+/**
+ * Returns the member id of the member representing the handle currently
hosting this <i>room</i>.
+ *
+ * @param room Room
+ * @return Host member id or NULL
+ */
+const struct GNUNET_ShortHashCode*
+get_room_host_id (const struct GNUNET_MESSENGER_SrvRoom *room);
+
+/**
+ * Changes the member id of the member representing the handle currently
hosting this <i>room</i>.
+ *
+ * @param room Room
+ * @param unique_id Unique member id
+ */
+void
+change_room_host_id (struct GNUNET_MESSENGER_SrvRoom *room, const struct
GNUNET_ShortHashCode *unique_id);
+
+/**
+ * Tries to open a <i>room</i> for a given <i>handle</i>. If the room has
already been opened, the handle
+ * will locally join the room.
+ *
+ * Calling this method should result in joining a room and sending a peer
message as well for this peer.
+ *
+ * If the function returns GNUNET_YES the port for this room is guranteed to
be open for incoming connections.
+ *
+ * @param room Room
+ * @param handle Handle
+ * @return GNUNET_YES on success, GNUNET_NO on failure.
+ */
+int
+open_room (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvHandle *handle);
+
+/**
+ * Connects a tunnel to a hosting peer of a <i>room</i> through a so called
<i>door</i> which is represented by
+ * a peer identity of a hosting peer. During the connection the handle will
join the room as a member, waiting for
+ * an info message from the selected host.
+ *
+ * @param room Room
+ * @param handle Handle
+ * @param door Peer identity
+ * @return GNUNET_YES on success, GNUNET_NO on failure.
+ */
+int
+entry_room_at (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvHandle *handle,
+ const struct GNUNET_PeerIdentity *door);
+
+/**
+ * Returns a tunnel granting a direct connection to a specific member in a
<i>room</i>. The member gets identified
+ * by an <i>id</i>. If no tunnel has been linked to the selected id, NULL gets
returned.
+ *
+ * @param room Room
+ * @param contact_id Member id
+ * @return Tunnel to the member or NULL
+ */
+struct GNUNET_MESSENGER_SrvTunnel*
+find_room_tunnel_to (struct GNUNET_MESSENGER_SrvRoom *room, const struct
GNUNET_ShortHashCode *contact_id);
+
+/**
+ * Packs a <i>message</i> depending on the selected <i>mode</i> into a newly
allocated envelope. It will set the
+ * timestamp of the message, the sender id and the previous messages hash
automatically before packing. The message
+ * will be signed by the handles EGO.
+ *
+ * If the optional <i>hash</i> parameter is a valid pointer, its value will be
overriden by the signed messages hash.
+ *
+ * If <i>mode</i> is set to GNUNET_MESSENGER_PACK_MODE_ENVELOPE, the function
returns a valid envelope to send
+ * through a message queue, otherwise NULL.
+ *
+ * @param room Room
+ * @param handle Handle
+ * @param message Message
+ * @param[out] hash Hash of message
+ * @param mode Packing mode
+ * @return New envelope or NULL
+ */
+struct GNUNET_MQ_Envelope*
+pack_room_message (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvHandle *handle,
+ struct GNUNET_MESSENGER_Message *message, struct
GNUNET_HashCode *hash, int mode);
+
+/**
+ * Sends a <i>message</i> from a given <i>handle</i> into a <i>room</i>. The
<i>hash</i> parameter will be
+ * updated with the hash-value resulting from the sent message.
+ *
+ * The function handles packing the message automatically and will call linked
message-events locally even if
+ * the message won't be sent to another peer.
+ *
+ * @param room Room
+ * @param handle Handle
+ * @param message Message
+ * @param[out] hash Hash of message
+ */
+void
+send_room_message (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvHandle *handle,
+ struct GNUNET_MESSENGER_Message *message, struct
GNUNET_HashCode *hash);
+
+/**
+ * Sends a <i>message</i> from a given <i>handle</i> into a <i>room</i>
excluding one specific <i>tunnel</i>.
+ * The <i>hash</i> parameter will be updated with the hash-value resulting
from the sent message.
+ *
+ * The function handles packing the message automatically and will call linked
message-events locally even if
+ * the message won't be sent to another peer.
+ *
+ * @param room Room
+ * @param handle Handle
+ * @param message Message
+ * @param[out] hash Hash of message
+ * @param tunnel Tunnel
+ */
+void
+send_room_message_ext (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvHandle *handle,
+ struct GNUNET_MESSENGER_Message *message, struct
GNUNET_HashCode *hash,
+ struct GNUNET_MESSENGER_SrvTunnel *tunnel);
+
+/**
+ * Forwards a <i>message</i> with a given <i>hash</i> to a specific
<i>tunnel</i> inside of a <i>room</i>.
+ *
+ * @param room Room
+ * @param tunnel Tunnel
+ * @param message Message
+ * @param hash Hash of message
+ */
+void
+forward_room_message (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvTunnel *tunnel,
+ const struct GNUNET_MESSENGER_Message *message, const
struct GNUNET_HashCode *hash);
+
+/**
+ * Reduces all current forks inside of the message history of a <i>room</i> to
one remaining last message
+ * by merging them down. All merge messages will be sent from a given
<i>handle</i>.
+ *
+ * @param room Room
+ * @param handle Handle
+ */
+void
+merge_room_last_messages (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvHandle *handle);
+
+/**
+ * Returns the CADET handle from a rooms service.
+ *
+ * @param room Room
+ * @return CADET handle
+ */
+struct GNUNET_CADET_Handle*
+get_room_cadet (struct GNUNET_MESSENGER_SrvRoom *room);
+
+/**
+ * Returns the shared secret you need to access a <i>room</i>.
+ *
+ * @param room Room
+ * @return Shared secret
+ */
+struct GNUNET_HashCode*
+get_room_key (struct GNUNET_MESSENGER_SrvRoom *room);
+
+/**
+ * Returns a tunnel inside of a <i>room</i> leading towards a given
<i>peer</i> if such a tunnel exists,
+ * otherwise NULL.
+ *
+ * @param room Room
+ * @param peer Peer identity
+ * @return Tunnel or NULL
+ */
+const struct GNUNET_MESSENGER_SrvTunnel*
+get_room_tunnel (struct GNUNET_MESSENGER_SrvRoom *room, const struct
GNUNET_PeerIdentity *peer);
+
+/**
+ * Returns a message from a <i>room</i> identified by a given <i>hash</i>. If
no matching message is
+ * found and <i>request</i> is set to GNUNET_YES, the <i>handle</i> will
request the missing message
+ * automatically.
+ *
+ * The function uses the optimized check for a message via its hash from the
message store.
+ * @see contains_store_message()
+ *
+ * If a message is missing independent of the following request, NULL gets
returned instead of the
+ * matching message.
+ *
+ * @param room Room
+ * @param handle Handle
+ * @param hash Hash of message
+ * @param request Flag to request a message
+ * @return Message or NULL
+ */
+const struct GNUNET_MESSENGER_Message*
+get_room_message (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvHandle *handle,
+ const struct GNUNET_HashCode *hash, int request);
+
+/**
+ * Updates the last messages of a <i>room</i> by replacing them if the
previous hash of a given <i>message</i>
+ * matches with one of the latest messages.
+ *
+ * @param room Room
+ * @param message Message
+ * @param hash Hash of message
+ */
+void
+update_room_last_messages (struct GNUNET_MESSENGER_SrvRoom *room, const struct
GNUNET_MESSENGER_Message *message,
+ const struct GNUNET_HashCode *hash);
+
+/**
+ * Changes an id of a current member from an old id to a new one and adds
optionally the <i>hash</i> of an
+ * id message to the members information.
+ *
+ * @param room Room
+ * @param old_id Old member id
+ * @param new_id New member id
+ * @param hash Hash of id message
+ */
+void
+switch_room_member_id (struct GNUNET_MESSENGER_SrvRoom *room, const struct
GNUNET_ShortHashCode *old_id,
+ const struct GNUNET_ShortHashCode *new_id, const struct
GNUNET_HashCode *hash);
+
+/**
+ * Rebuilds the decentralized structure for a <i>room</i> by ensuring all
required connections are made
+ * depending on the amount of peers and this peers index in the list of them.
+ *
+ * @param room Room
+ */
+void
+rebuild_room_basement_structure (struct GNUNET_MESSENGER_SrvRoom *room);
+
+/**
+ * Handles all queued up messages of a room to handle in correct order.
+ *
+ * @param room Room
+ */
+void
+handle_room_messages (struct GNUNET_MESSENGER_SrvRoom *room);
+
+#endif //GNUNET_SERVICE_MESSENGER_ROOM_H
diff --git a/src/messenger/gnunet-service-messenger_service.c
b/src/messenger/gnunet-service-messenger_service.c
new file mode 100644
index 000000000..963314fd8
--- /dev/null
+++ b/src/messenger/gnunet-service-messenger_service.c
@@ -0,0 +1,516 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2020 GNUnet e.V.
+
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @author Tobias Frisch
+ * @file src/messenger/gnunet-service-messenger_service.c
+ * @brief GNUnet MESSENGER service
+ */
+
+#include "gnunet-service-messenger_service.h"
+
+#include "gnunet-service-messenger_message_kind.h"
+
+#include "gnunet-service-messenger.h"
+#include "gnunet-service-messenger_util.h"
+
+static void
+callback_shutdown_service (void *cls)
+{
+ struct GNUNET_MESSENGER_Service *service = cls;
+
+ if (service)
+ {
+ service->shutdown = NULL;
+
+ destroy_service (service);
+ }
+}
+
+static void
+callback_update_ego (void *cls,
+ struct GNUNET_IDENTITY_Ego *ego,
+ void **ctx,
+ const char *identifier)
+{
+ if ((!ego) || (!identifier))
+ return;
+
+ struct GNUNET_MESSENGER_Service *service = cls;
+
+ update_service_ego(service, identifier,
GNUNET_IDENTITY_ego_get_private_key(ego));
+}
+
+struct GNUNET_MESSENGER_Service*
+create_service (const struct GNUNET_CONFIGURATION_Handle *config, struct
GNUNET_SERVICE_Handle *service_handle)
+{
+ struct GNUNET_MESSENGER_Service *service = GNUNET_new(struct
GNUNET_MESSENGER_Service);
+
+ service->config = config;
+ service->service = service_handle;
+
+ service->shutdown = GNUNET_SCHEDULER_add_shutdown
(&callback_shutdown_service, service);
+
+ service->dir = NULL;
+
+ if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_filename (service->config,
+ GNUNET_MESSENGER_SERVICE_NAME,
+ "MESSENGER_DIR",
&(service->dir)))
+ {
+ if (service->dir)
+ GNUNET_free(service->dir);
+
+ service->dir = NULL;
+ }
+ else
+ {
+ if ((GNUNET_YES != GNUNET_DISK_directory_test (service->dir, GNUNET_YES))
&& (GNUNET_OK
+ != GNUNET_DISK_directory_create (service->dir)))
+ {
+ GNUNET_free(service->dir);
+
+ service->dir = NULL;
+ }
+ }
+
+ service->cadet = GNUNET_CADET_connect (service->config);
+ service->identity = GNUNET_IDENTITY_connect (service->config,
&callback_update_ego, service);
+
+ service->egos = GNUNET_CONTAINER_multihashmap_create (8, GNUNET_NO);
+
+ init_list_handles (&(service->handles));
+
+ service->contacts = GNUNET_CONTAINER_multihashmap_create (8, GNUNET_NO);
+ service->rooms = GNUNET_CONTAINER_multihashmap_create (8, GNUNET_NO);
+
+ return service;
+}
+
+static int
+iterate_destroy_egos (void *cls, const struct GNUNET_HashCode *key, void
*value)
+{
+ struct GNUNET_MESSENGER_Ego *ego = value;
+ GNUNET_free(ego);
+ return GNUNET_YES;
+}
+
+static int
+iterate_destroy_rooms (void *cls, const struct GNUNET_HashCode *key, void
*value)
+{
+ struct GNUNET_MESSENGER_SrvRoom *room = value;
+ destroy_room (room);
+ return GNUNET_YES;
+}
+
+static int
+iterate_destroy_contacts (void *cls, const struct GNUNET_HashCode *key, void
*value)
+{
+ struct GNUNET_MESSENGER_SrvContact *contact = value;
+ destroy_contact (contact);
+ return GNUNET_YES;
+}
+
+void
+destroy_service (struct GNUNET_MESSENGER_Service *service)
+{
+ if (service->shutdown)
+ {
+ GNUNET_SCHEDULER_cancel (service->shutdown);
+
+ service->shutdown = NULL;
+ }
+
+ GNUNET_CONTAINER_multihashmap_iterate (service->egos, iterate_destroy_egos,
NULL);
+
+ clear_list_handles (&(service->handles));
+
+ GNUNET_CONTAINER_multihashmap_iterate (service->rooms,
iterate_destroy_rooms, NULL);
+ GNUNET_CONTAINER_multihashmap_iterate (service->contacts,
iterate_destroy_contacts, NULL);
+
+ GNUNET_CONTAINER_multihashmap_destroy (service->egos);
+ GNUNET_CONTAINER_multihashmap_destroy (service->rooms);
+ GNUNET_CONTAINER_multihashmap_destroy (service->contacts);
+
+ if (service->cadet)
+ {
+ GNUNET_CADET_disconnect (service->cadet);
+
+ service->cadet = NULL;
+ }
+
+ if (service->identity)
+ {
+ GNUNET_IDENTITY_disconnect (service->identity);
+
+ service->identity = NULL;
+ }
+
+ if (service->dir)
+ {
+ GNUNET_free(service->dir);
+
+ service->dir = NULL;
+ }
+
+ GNUNET_SERVICE_shutdown (service->service);
+
+ GNUNET_free(service);
+}
+
+struct GNUNET_MESSENGER_Ego*
+lookup_service_ego (struct GNUNET_MESSENGER_Service *service, const char
*identifier)
+{
+ GNUNET_assert(identifier);
+
+ struct GNUNET_HashCode hash;
+
+ GNUNET_CRYPTO_hash(identifier, strlen(identifier), &hash);
+ return GNUNET_CONTAINER_multihashmap_get(service->egos, &hash);
+}
+
+void
+update_service_ego (struct GNUNET_MESSENGER_Service *service, const char
*identifier,
+ const struct GNUNET_IDENTITY_PrivateKey* key)
+{
+ GNUNET_assert((identifier) && (key));
+
+ struct GNUNET_HashCode hash;
+
+ GNUNET_CRYPTO_hash(identifier, strlen(identifier), &hash);
+
+ struct GNUNET_MESSENGER_Ego* ego =
GNUNET_CONTAINER_multihashmap_get(service->egos, &hash);
+
+ if (!ego)
+ {
+ ego = GNUNET_new(struct GNUNET_MESSENGER_Ego);
+ GNUNET_CONTAINER_multihashmap_put(service->egos, &hash, ego,
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST);
+ }
+
+ GNUNET_memcpy(&(ego->priv), key, sizeof(*key));
+
+ if (GNUNET_OK != GNUNET_IDENTITY_key_get_public(key, &(ego->pub)))
+ GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Updating invalid ego key
failed!\n");
+}
+
+struct GNUNET_MESSENGER_SrvHandle*
+add_service_handle (struct GNUNET_MESSENGER_Service *service, struct
GNUNET_MQ_Handle *mq)
+{
+ struct GNUNET_MESSENGER_SrvHandle *handle = create_handle (service, mq);
+
+ if (handle)
+ {
+ add_list_handle (&(service->handles), handle);
+ }
+
+ return handle;
+}
+
+void
+remove_service_handle (struct GNUNET_MESSENGER_Service *service, struct
GNUNET_MESSENGER_SrvHandle *handle)
+{
+ if (!handle)
+ return;
+
+ if (GNUNET_YES == remove_list_handle (&(service->handles), handle))
+ destroy_handle (handle);
+}
+
+int
+get_service_peer_identity (const struct GNUNET_MESSENGER_Service *service,
struct GNUNET_PeerIdentity *peer)
+{
+ return GNUNET_CRYPTO_get_peer_identity (service->config, peer);
+}
+
+struct GNUNET_MESSENGER_SrvContact*
+get_service_contact_by_pubkey (struct GNUNET_MESSENGER_Service *service, const
struct GNUNET_IDENTITY_PublicKey *pubkey)
+{
+ struct GNUNET_HashCode hash;
+
+ GNUNET_CRYPTO_hash (pubkey, sizeof(*pubkey), &hash);
+
+ struct GNUNET_MESSENGER_SrvContact *contact =
GNUNET_CONTAINER_multihashmap_get (service->contacts, &hash);
+
+ if (contact)
+ return contact;
+
+ contact = create_contact (pubkey);
+
+ if (GNUNET_OK == GNUNET_CONTAINER_multihashmap_put (service->contacts,
&hash, contact,
+
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST))
+ return contact;
+
+ destroy_contact (contact);
+ return NULL;
+}
+
+void
+swap_service_contact_by_pubkey (struct GNUNET_MESSENGER_Service *service,
struct GNUNET_MESSENGER_SrvContact *contact,
+ const struct GNUNET_IDENTITY_PublicKey *pubkey)
+{
+ const struct GNUNET_HashCode *hash = get_contact_id_from_key (contact);
+
+ if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_remove (service->contacts,
hash, contact))
+ {
+ GNUNET_memcpy(&(contact->public_key), pubkey, sizeof(*pubkey));
+
+ hash = get_contact_id_from_key (contact);
+
+ GNUNET_CONTAINER_multihashmap_put (service->contacts, hash, contact,
+
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST);
+ }
+}
+
+struct GNUNET_ShortHashCode*
+generate_service_new_member_id (struct GNUNET_MESSENGER_Service *service,
const struct GNUNET_HashCode *key)
+{
+ struct GNUNET_MESSENGER_SrvRoom *room = get_service_room (service, key);
+
+ if (room)
+ {
+ return generate_room_member_id (room);
+ }
+ else
+ {
+ struct GNUNET_ShortHashCode *random_id = GNUNET_new(struct
GNUNET_ShortHashCode);
+ generate_free_member_id (random_id, NULL);
+ return random_id;
+ }
+}
+
+struct GNUNET_MESSENGER_SrvRoom*
+get_service_room (struct GNUNET_MESSENGER_Service *service, const struct
GNUNET_HashCode *key)
+{
+ return GNUNET_CONTAINER_multihashmap_get (service->rooms, key);
+}
+
+int
+open_service_room (struct GNUNET_MESSENGER_Service *service, struct
GNUNET_MESSENGER_SrvHandle *handle,
+ const struct GNUNET_HashCode *key)
+{
+ struct GNUNET_MESSENGER_SrvRoom *room = get_service_room (service, key);
+
+ if (room)
+ return open_room (room, handle);
+
+ room = create_room (handle, key);
+
+ if ((GNUNET_YES == open_room (room, handle)) && (GNUNET_OK
+ == GNUNET_CONTAINER_multihashmap_put (service->rooms, key, room,
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST)))
+ return GNUNET_YES;
+
+ destroy_room (room);
+ return GNUNET_NO;
+}
+
+int
+entry_service_room (struct GNUNET_MESSENGER_Service *service, struct
GNUNET_MESSENGER_SrvHandle *handle,
+ const struct GNUNET_PeerIdentity *door, const struct
GNUNET_HashCode *key)
+{
+ struct GNUNET_MESSENGER_SrvRoom *room = get_service_room (service, key);
+
+ if (room)
+ {
+ if (GNUNET_YES == entry_room_at (room, handle, door))
+ return GNUNET_YES;
+ else
+ return GNUNET_NO;
+ }
+
+ room = create_room (handle, key);
+
+ if ((GNUNET_YES == entry_room_at (room, handle, door)) && (GNUNET_OK
+ == GNUNET_CONTAINER_multihashmap_put (service->rooms, key, room,
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST)))
+ {
+ return GNUNET_YES;
+ }
+ else
+ {
+ destroy_room (room);
+ return GNUNET_NO;
+ }
+
+}
+
+int
+close_service_room (struct GNUNET_MESSENGER_Service *service, struct
GNUNET_MESSENGER_SrvHandle *handle,
+ const struct GNUNET_HashCode *key)
+{
+ struct GNUNET_MESSENGER_SrvRoom *room = get_service_room (service, key);
+
+ if (!room)
+ return GNUNET_NO;
+
+ struct GNUNET_MESSENGER_Message *message = create_message_leave ();
+
+ if (message)
+ {
+ struct GNUNET_HashCode hash;
+
+ send_room_message (room, handle, message, &hash);
+ destroy_message (message);
+ }
+
+ const struct GNUNET_ShortHashCode *id = get_handle_member_id (handle, key);
+
+ GNUNET_assert(id);
+
+ if (GNUNET_YES != GNUNET_CONTAINER_multihashmap_remove (handle->member_ids,
key, id))
+ return GNUNET_NO;
+
+ struct GNUNET_MESSENGER_SrvHandle *member_handle = (struct
GNUNET_MESSENGER_SrvHandle*) find_list_handle_by_member (
+ &(service->handles), key);
+
+ if (!member_handle)
+ {
+ if (GNUNET_OK == GNUNET_CONTAINER_multihashmap_remove (service->rooms,
key, room))
+ {
+ destroy_room (room);
+ return GNUNET_YES;
+ }
+ else
+ return GNUNET_NO;
+ }
+
+ if (room->host == handle)
+ room->host = member_handle;
+
+ return GNUNET_YES;
+}
+
+static void
+get_room_data_subdir (struct GNUNET_MESSENGER_Service *service, struct
GNUNET_MESSENGER_SrvRoom *room, char **dir)
+{
+ GNUNET_asprintf (dir, "%s%s%c%s%c", service->dir, "rooms", DIR_SEPARATOR,
GNUNET_h2s (&(room->key)), DIR_SEPARATOR);
+}
+
+void
+load_service_room_and_messages (struct GNUNET_MESSENGER_Service *service,
struct GNUNET_MESSENGER_SrvRoom *room)
+{
+ char *room_dir;
+ get_room_data_subdir (service, room, &room_dir);
+
+ if (GNUNET_YES == GNUNET_DISK_directory_test (room_dir, GNUNET_YES))
+ {
+ load_message_store (&room->store, room_dir);
+
+ char *config_file;
+ GNUNET_asprintf (&config_file, "%s%s", room_dir, "room.cfg");
+
+ struct GNUNET_CONFIGURATION_Handle *cfg = GNUNET_CONFIGURATION_create ();
+
+ if ((GNUNET_YES == GNUNET_DISK_file_test (config_file)) && (GNUNET_OK
+ == GNUNET_CONFIGURATION_parse (cfg, config_file)))
+ {
+ unsigned long long access;
+
+ if (GNUNET_OK == GNUNET_CONFIGURATION_get_value_number (cfg, "room",
"access-rule", &access))
+ room->strict_access = (int) (access);
+
+ char *message_string;
+
+ if ((GNUNET_OK == GNUNET_CONFIGURATION_get_value_string (cfg, "room",
"last-message", &message_string)) && (message_string))
+ {
+ struct GNUNET_HashCode hash;
+
+ GNUNET_CRYPTO_hash_from_string(message_string, &hash);
+
+ const struct GNUNET_MESSENGER_Message *message = get_room_message
(room, room->host, &hash, GNUNET_NO);
+
+ if (message)
+ update_room_last_messages (room, message, &hash);
+
+ GNUNET_free(message_string);
+ }
+ }
+
+ GNUNET_CONFIGURATION_destroy (cfg);
+
+ GNUNET_free(config_file);
+ }
+
+ GNUNET_free(room_dir);
+}
+
+void
+save_service_room_and_messages (struct GNUNET_MESSENGER_Service *service,
struct GNUNET_MESSENGER_SrvRoom *room)
+{
+ if (GNUNET_YES != GNUNET_CONTAINER_multihashmap_contains (service->rooms,
&(room->key)))
+ {
+ return;
+ }
+
+ char *room_dir;
+ get_room_data_subdir (service, room, &room_dir);
+
+ if ((GNUNET_YES == GNUNET_DISK_directory_test (room_dir, GNUNET_NO)) ||
(GNUNET_OK
+ == GNUNET_DISK_directory_create (room_dir)))
+ {
+ save_message_store (&room->store, room_dir);
+
+ char *config_file;
+ GNUNET_asprintf (&config_file, "%s%s", room_dir, "room.cfg");
+
+ struct GNUNET_CONFIGURATION_Handle *cfg = GNUNET_CONFIGURATION_create ();
+
+ GNUNET_CONFIGURATION_set_value_number (cfg, "room", "access-rule",
room->strict_access);
+
+ if (room->last_messages.head)
+ GNUNET_CONFIGURATION_set_value_string (cfg, "room", "last-message",
+ GNUNET_h2s_full
(&(room->last_messages.head->hash)));
+
+ GNUNET_CONFIGURATION_write (cfg, config_file);
+ GNUNET_CONFIGURATION_destroy (cfg);
+
+ GNUNET_free(config_file);
+ }
+
+ GNUNET_free(room_dir);
+}
+
+void
+handle_service_message (struct GNUNET_MESSENGER_Service *service, struct
GNUNET_MESSENGER_SrvRoom *room,
+ const struct GNUNET_MESSENGER_Message *message, const
struct GNUNET_HashCode *hash)
+{
+ struct GNUNET_MESSENGER_ListHandle *element = service->handles.head;
+
+ const uint16_t length = get_message_size (message);
+
+ while (element)
+ {
+ struct GNUNET_MESSENGER_SrvHandle *handle = (struct
GNUNET_MESSENGER_SrvHandle*) element->handle;
+
+ if ((handle->mq) && (get_handle_member_id (handle, &(room->key))))
+ {
+ struct GNUNET_MESSENGER_RecvMessage *msg;
+ struct GNUNET_MQ_Envelope *env;
+
+ env = GNUNET_MQ_msg_extra(msg, length,
GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_RECV_MESSAGE);
+
+ GNUNET_memcpy(&(msg->key), &(room->key), sizeof(room->key));
+ GNUNET_memcpy(&(msg->hash), hash, sizeof(*hash));
+
+ char *buffer = ((char*) msg) + sizeof(*msg);
+ encode_message (message, length, buffer);
+
+ GNUNET_MQ_send (handle->mq, env);
+ }
+
+ element = element->next;
+ }
+}
diff --git a/src/messenger/gnunet-service-messenger_service.h
b/src/messenger/gnunet-service-messenger_service.h
new file mode 100644
index 000000000..246c74771
--- /dev/null
+++ b/src/messenger/gnunet-service-messenger_service.h
@@ -0,0 +1,259 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2020 GNUnet e.V.
+
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @author Tobias Frisch
+ * @file src/messenger/gnunet-service-messenger_service.h
+ * @brief GNUnet MESSENGER service
+ */
+
+#ifndef GNUNET_SERVICE_MESSENGER_SERVICE_H
+#define GNUNET_SERVICE_MESSENGER_SERVICE_H
+
+#include "platform.h"
+#include "gnunet_configuration_lib.h"
+#include "gnunet_crypto_lib.h"
+#include "gnunet_container_lib.h"
+#include "gnunet_disk_lib.h"
+#include "gnunet_identity_service.h"
+
+#include "messenger_api_ego.h"
+
+#include "gnunet-service-messenger_list_handles.h"
+
+#include "gnunet-service-messenger_contact.h"
+#include "gnunet-service-messenger_room.h"
+
+struct GNUNET_MESSENGER_Service
+{
+ const struct GNUNET_CONFIGURATION_Handle *config;
+ struct GNUNET_SERVICE_Handle *service;
+
+ struct GNUNET_SCHEDULER_Task *shutdown;
+
+ char *dir;
+
+ struct GNUNET_CADET_Handle *cadet;
+ struct GNUNET_IDENTITY_Handle *identity;
+
+ struct GNUNET_CONTAINER_MultiHashMap *egos;
+
+ struct GNUNET_MESSENGER_ListHandles handles;
+
+ struct GNUNET_CONTAINER_MultiHashMap *contacts;
+ struct GNUNET_CONTAINER_MultiHashMap *rooms;
+};
+
+/**
+ * Creates and allocates a new service using a given <i>config</i> and a
GNUnet service handle.
+ *
+ * @param config Configuration
+ * @param service_handle GNUnet service handle
+ * @return New service
+ */
+struct GNUNET_MESSENGER_Service*
+create_service (const struct GNUNET_CONFIGURATION_Handle *config, struct
GNUNET_SERVICE_Handle *service_handle);
+
+/**
+ * Destroys a <i>service</i> and frees its memory fully.
+ *
+ * @param service Service
+ */
+void
+destroy_service (struct GNUNET_MESSENGER_Service *service);
+
+/**
+ * Lookups an EGO which was registered to a <i>service</i> under
+ * a specific <i>identifier</i>.
+ *
+ * @param service Service
+ * @param identifier Identifier string
+ * @return EGO or NULL
+ */
+struct GNUNET_MESSENGER_Ego*
+lookup_service_ego (struct GNUNET_MESSENGER_Service *service, const char
*identifier);
+
+/**
+ * Updates the registration of an EGO to a <i>service</i> under
+ * a specific <i>identifier</i> with a new <i>key</i>.
+ *
+ * @param service Service
+ * @param identifier Identifier string
+ * @param key Private EGO key
+ */
+void
+update_service_ego (struct GNUNET_MESSENGER_Service *service, const char
*identifier,
+ const struct GNUNET_IDENTITY_PrivateKey* key);
+
+/**
+ * Creates and adds a new handle to a <i>service</i> using a given message
queue.
+ *
+ * @param service Service
+ * @param mq Message queue
+ * @return New handle
+ */
+struct GNUNET_MESSENGER_SrvHandle*
+add_service_handle (struct GNUNET_MESSENGER_Service *service, struct
GNUNET_MQ_Handle *mq);
+
+/**
+ * Removes a <i>handle</i> from a <i>service</i> and destroys it.
+ *
+ * @param service Service
+ * @param handle Handle
+ */
+void
+remove_service_handle (struct GNUNET_MESSENGER_Service *service, struct
GNUNET_MESSENGER_SrvHandle *handle);
+
+/**
+ * Tries to write the peer identity of the peer running a <i>service</i> on to
the <i>peer</i>
+ * parameter. The functions returns GNUNET_OK on success, otherwise
GNUNET_SYSERR.
+ *
+ * @param service Service
+ * @param[out] peer Peer identity
+ * @return GNUNET_OK on success, otherwise GNUNET_SYSERR
+ */
+int
+get_service_peer_identity (const struct GNUNET_MESSENGER_Service *service,
struct GNUNET_PeerIdentity *peer);
+
+/**
+ * Returns a contact of a <i>service</i> identified by a given public key. If
no matching contact exists,
+ * it will tried to create one with the specific public key. If the function
still fails to do so,
+ * NULL gets returned.
+ *
+ * @param service Service
+ * @param pubkey Public key of EGO
+ * @return Contact
+ */
+struct GNUNET_MESSENGER_SrvContact*
+get_service_contact_by_pubkey (struct GNUNET_MESSENGER_Service *service, const
struct GNUNET_IDENTITY_PublicKey *pubkey);
+
+/**
+ * Changes the public key for a <i>contact</i> known to a <i>service</i> to a
specific public key and
+ * updates local map entries to access the contact by its updated key.
+ *
+ * @param service Service
+ * @param contact Contact
+ * @param pubkey Public key of EGO
+ */
+void
+swap_service_contact_by_pubkey (struct GNUNET_MESSENGER_Service *service,
struct GNUNET_MESSENGER_SrvContact *contact,
+ const struct GNUNET_IDENTITY_PublicKey
*pubkey);
+
+/**
+ * Tries to generate and allocate a new unique member id for a given room of a
service identified by its <i>key</i>.
+ * If the generation fails caused by too many tries of duplicates, it returns
NULL.
+ *
+ * @param service Service
+ * @param key Key of room
+ * @return Newly generated member id or NULL
+ */
+struct GNUNET_ShortHashCode*
+generate_service_new_member_id (struct GNUNET_MESSENGER_Service *service,
const struct GNUNET_HashCode *key);
+
+/**
+ * Returns the room identified by a given <i>key</i> for a <i>service</i>. If
the service doesn't know any room
+ * using the given key, NULL gets returned.
+ *
+ * @param service Service
+ * @param key Key of room
+ * @return Room or NULL
+ */
+struct GNUNET_MESSENGER_SrvRoom*
+get_service_room (struct GNUNET_MESSENGER_Service *service, const struct
GNUNET_HashCode *key);
+
+/**
+ * Tries to open a room using a given <i>key</i> for a <i>service</i> by a
specific <i>handle</i>. The room will be
+ * created if necessary. If the function is successful, it returns GNUNET_YES,
otherwise GNUNET_NO.
+ *
+ * @param service Service
+ * @param handle Handle
+ * @param key Key of room
+ * @return GNUNET_YES on success, otherwise GNUNET_NO
+ */
+int
+open_service_room (struct GNUNET_MESSENGER_Service *service, struct
GNUNET_MESSENGER_SrvHandle *handle,
+ const struct GNUNET_HashCode *key);
+
+/**
+ * Tries to enter a room using a given <i>key</i> for a <i>service</i> by a
specific <i>handle</i>. The room will
+ * be created if necessary. If the function is successful, it returns
GNUNET_YES, otherwise GNUNET_NO.
+ *
+ * The room will be entered through the peer identitied by the peer identity
provided as <i>door</i> parameter and
+ * a new connection will be made.
+ *
+ * @param service Service
+ * @param handle Handle
+ * @param door Peer identity
+ * @param key Key of room
+ * @return GNUNET_YES on success, otherwise GNUNET_NO
+ */
+int
+entry_service_room (struct GNUNET_MESSENGER_Service *service, struct
GNUNET_MESSENGER_SrvHandle *handle,
+ const struct GNUNET_PeerIdentity *door, const struct
GNUNET_HashCode *key);
+
+/**
+ * Tries to close a room using a given <i>key</i> for a <i>service</i> by a
specific <i>handle</i>. The room will
+ * be created if necessary. If the function is successful, it returns
GNUNET_YES, otherwise GNUNET_NO.
+ *
+ * If the specific handle is currently the host of the room for this service,
a new handle which is a member will
+ * take its place. Otherwise the room will be destroyed for this service.
+ *
+ * @param service Service
+ * @param handle Handle
+ * @param key Key of room
+ * @return GNUNET_YES on success, otherwise GNUNET_NO
+ */
+int
+close_service_room (struct GNUNET_MESSENGER_Service *service, struct
GNUNET_MESSENGER_SrvHandle *handle,
+ const struct GNUNET_HashCode *key);
+
+/**
+ * Loads the local configuration for a given <i>room</i> of a <i>service</i>
which contains the last messages hash
+ * and the ruleset for general access of new members.
+ *
+ * @param service Service
+ * @param room Room
+ */
+void
+load_service_room_and_messages (struct GNUNET_MESSENGER_Service *service,
struct GNUNET_MESSENGER_SrvRoom *room);
+
+/**
+ * Saves the configuration for a given <i>room</i> of a <i>service</i> which
contains the last messages hash
+ * and the ruleset for general access of new members locally.
+ *
+ * @param service Service
+ * @param room Room
+ */
+void
+save_service_room_and_messages (struct GNUNET_MESSENGER_Service *service,
struct GNUNET_MESSENGER_SrvRoom *room);
+
+/**
+ * Sends a received or sent <i>message</i> with a given <i>hash</i> to each
handle of a <i>service</i> which
+ * is currently member of a specific <i>room</i> for handling it in the client
API.
+ *
+ * @param service Service
+ * @param room Room
+ * @param message Message
+ * @param hash Hash of message
+ */
+void
+handle_service_message (struct GNUNET_MESSENGER_Service *service, struct
GNUNET_MESSENGER_SrvRoom *room,
+ const struct GNUNET_MESSENGER_Message *message, const
struct GNUNET_HashCode *hash);
+
+#endif //GNUNET_SERVICE_MESSENGER_SERVICE_H
diff --git a/src/messenger/gnunet-service-messenger_tunnel.c
b/src/messenger/gnunet-service-messenger_tunnel.c
new file mode 100644
index 000000000..df9e5c4c7
--- /dev/null
+++ b/src/messenger/gnunet-service-messenger_tunnel.c
@@ -0,0 +1,300 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2020 GNUnet e.V.
+
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @author Tobias Frisch
+ * @file src/messenger/gnunet-service-messenger_tunnel.c
+ * @brief GNUnet MESSENGER service
+ */
+
+#include "gnunet-service-messenger_tunnel.h"
+
+#include "gnunet-service-messenger_handle.h"
+#include "gnunet-service-messenger_util.h"
+
+struct GNUNET_MESSENGER_SrvTunnel*
+create_tunnel (struct GNUNET_MESSENGER_SrvRoom *room, const struct
GNUNET_PeerIdentity *door)
+{
+ GNUNET_assert((room) && (door));
+
+ struct GNUNET_MESSENGER_SrvTunnel *tunnel = GNUNET_new(struct
GNUNET_MESSENGER_SrvTunnel);
+
+ tunnel->room = room;
+ tunnel->channel = NULL;
+
+ tunnel->peer = GNUNET_PEER_intern (door);
+ tunnel->contact_id = NULL;
+
+ tunnel->peer_message = NULL;
+ tunnel->last_message = NULL;
+
+ return tunnel;
+}
+
+void
+destroy_tunnel (struct GNUNET_MESSENGER_SrvTunnel *tunnel)
+{
+ GNUNET_assert(tunnel);
+
+ if (tunnel->channel)
+ GNUNET_CADET_channel_destroy (tunnel->channel);
+
+ GNUNET_PEER_change_rc (tunnel->peer, -1);
+
+ if (tunnel->contact_id)
+ GNUNET_free(tunnel->contact_id);
+
+ if (tunnel->peer_message)
+ GNUNET_free(tunnel->peer_message);
+
+ if (tunnel->last_message)
+ GNUNET_free(tunnel->last_message);
+
+ GNUNET_free(tunnel);
+}
+
+int
+bind_tunnel (struct GNUNET_MESSENGER_SrvTunnel *tunnel, struct
GNUNET_CADET_Channel *channel)
+{
+ GNUNET_assert(tunnel);
+
+ if (tunnel->channel)
+ {
+ if (tunnel->contact_id)
+ return GNUNET_NO;
+
+ delayed_disconnect_channel (tunnel->channel);
+ }
+
+ tunnel->channel = channel;
+
+ return GNUNET_YES;
+}
+
+extern void
+callback_room_disconnect (struct GNUNET_MESSENGER_SrvRoom *room, void *cls);
+
+void
+callback_tunnel_disconnect (void *cls, const struct GNUNET_CADET_Channel
*channel)
+{
+ struct GNUNET_MESSENGER_SrvTunnel *tunnel = cls;
+
+ if (tunnel)
+ {
+ tunnel->channel = NULL;
+
+ callback_room_disconnect (tunnel->room, cls);
+ }
+}
+
+extern int
+callback_verify_room_message (struct GNUNET_MESSENGER_SrvRoom *room, void *cls,
+ struct GNUNET_MESSENGER_Message *message, struct
GNUNET_HashCode *hash);
+
+int
+check_tunnel_message (void *cls, const struct GNUNET_MessageHeader *header)
+{
+ struct GNUNET_MESSENGER_SrvTunnel *tunnel = cls;
+
+ if (!tunnel)
+ return GNUNET_NO;
+
+ const uint16_t length = ntohs (header->size) - sizeof(*header);
+ const char *buffer = (const char*) &header[1];
+
+ struct GNUNET_MESSENGER_Message message;
+
+ if (length < sizeof(message.header))
+ return GNUNET_NO;
+
+ if (GNUNET_YES != decode_message (&message, length, buffer))
+ return GNUNET_NO;
+
+ struct GNUNET_HashCode hash;
+ hash_message (length, buffer, &hash);
+
+ int result = callback_verify_room_message (tunnel->room, cls, &message,
&hash);
+
+ if (GNUNET_MESSENGER_KIND_PEER == message.header.kind)
+ {
+ struct GNUNET_PeerIdentity identity;
+
+ GNUNET_PEER_resolve (tunnel->peer, &identity);
+
+ if (0 == GNUNET_memcmp(&(message.body.peer.peer), &(identity)))
+ {
+ if (tunnel->contact_id)
+ {
+ if (0 != GNUNET_memcmp(tunnel->contact_id,
&(message.header.sender_id)))
+ result = GNUNET_SYSERR;
+ }
+ else
+ {
+ tunnel->contact_id = GNUNET_new(struct GNUNET_ShortHashCode);
+
+ GNUNET_memcpy(tunnel->contact_id, &(message.header.sender_id),
sizeof(struct GNUNET_ShortHashCode));
+ }
+ }
+ }
+
+ return (result == GNUNET_YES ? GNUNET_OK : GNUNET_NO);
+}
+
+extern void
+callback_room_recv (struct GNUNET_MESSENGER_SrvRoom *room, void *cls, struct
GNUNET_MESSENGER_Message *message,
+ const struct GNUNET_HashCode *hash);
+
+void
+handle_tunnel_message (void *cls, const struct GNUNET_MessageHeader *header)
+{
+ struct GNUNET_MESSENGER_SrvTunnel *tunnel = cls;
+
+ const uint16_t length = ntohs (header->size) - sizeof(*header);
+ const char *buffer = (const char*) &header[1];
+
+ struct GNUNET_MESSENGER_Message message;
+ struct GNUNET_HashCode hash;
+
+ decode_message (&message, length, buffer);
+ hash_message (length, buffer, &hash);
+
+ if (tunnel)
+ {
+ if (!tunnel->last_message)
+ tunnel->last_message = GNUNET_new(struct GNUNET_HashCode);
+
+ GNUNET_memcpy(tunnel->last_message, &hash, sizeof(struct GNUNET_HashCode));
+
+ callback_room_recv (tunnel->room, cls, copy_message (&message), &hash);
+ }
+
+ GNUNET_CADET_receive_done (tunnel->channel);
+}
+
+int
+connect_tunnel (struct GNUNET_MESSENGER_SrvTunnel *tunnel)
+{
+ GNUNET_assert(tunnel);
+
+ if (tunnel->channel)
+ return GNUNET_NO;
+
+ const struct GNUNET_PeerIdentity *door = GNUNET_PEER_resolve2 (tunnel->peer);
+
+ struct GNUNET_CADET_Handle *cadet = get_room_cadet (tunnel->room);
+ struct GNUNET_HashCode *key = get_room_key (tunnel->room);
+
+ struct GNUNET_MQ_MessageHandler handlers[] = {
GNUNET_MQ_hd_var_size(tunnel_message, GNUNET_MESSAGE_TYPE_CADET_CLI,
+ struct
GNUNET_MessageHeader, NULL),
+ GNUNET_MQ_handler_end() };
+
+ tunnel->channel = GNUNET_CADET_channel_create (cadet, tunnel, door, key,
NULL, callback_tunnel_disconnect, handlers);
+
+ return GNUNET_YES;
+}
+
+void
+disconnect_tunnel (struct GNUNET_MESSENGER_SrvTunnel *tunnel)
+{
+ if (tunnel->channel)
+ {
+ delayed_disconnect_channel (tunnel->channel);
+
+ tunnel->channel = NULL;
+ }
+}
+
+int
+is_tunnel_connected (const struct GNUNET_MESSENGER_SrvTunnel *tunnel)
+{
+ return (tunnel->channel ? GNUNET_YES : GNUNET_NO);
+}
+
+struct GNUNET_MESSENGER_MessageSent
+{
+ struct GNUNET_MESSENGER_SrvTunnel *tunnel;
+ struct GNUNET_HashCode hash;
+};
+
+extern void
+callback_room_sent (struct GNUNET_MESSENGER_SrvRoom *room, struct
GNUNET_MESSENGER_SrvHandle *handle, void *cls,
+ struct GNUNET_MESSENGER_Message *message, const struct
GNUNET_HashCode *hash);
+
+static void
+callback_tunnel_sent (void *cls)
+{
+ struct GNUNET_MESSENGER_MessageSent *sent = cls;
+
+ if (sent->tunnel)
+ {
+ if (!sent->tunnel->last_message)
+ sent->tunnel->last_message = GNUNET_new(struct GNUNET_HashCode);
+
+ GNUNET_memcpy(sent->tunnel->last_message, &(sent->hash), sizeof(struct
GNUNET_HashCode));
+ }
+
+ GNUNET_free(sent);
+}
+
+void
+send_tunnel_envelope (struct GNUNET_MESSENGER_SrvTunnel *tunnel, void *handle,
struct GNUNET_MQ_Envelope *env,
+ struct GNUNET_MESSENGER_Message *message, const struct
GNUNET_HashCode *hash)
+{
+ struct GNUNET_MQ_Handle *mq = GNUNET_CADET_get_mq (tunnel->channel);
+
+ struct GNUNET_MESSENGER_MessageSent *sent = GNUNET_new(struct
GNUNET_MESSENGER_MessageSent);
+
+ GNUNET_memcpy(&(sent->hash), hash, sizeof(struct GNUNET_HashCode));
+
+ sent->tunnel = tunnel;
+
+ GNUNET_MQ_notify_sent (env, callback_tunnel_sent, sent);
+ GNUNET_MQ_send (mq, env);
+
+ callback_room_sent (tunnel->room, (struct GNUNET_MESSENGER_SrvHandle*)
handle, tunnel, message, hash);
+}
+
+void
+send_tunnel_message (struct GNUNET_MESSENGER_SrvTunnel *tunnel, void *handle,
struct GNUNET_MESSENGER_Message *message,
+ struct GNUNET_HashCode *hash)
+{
+ struct GNUNET_MQ_Envelope *env = pack_room_message (tunnel->room, (struct
GNUNET_MESSENGER_SrvHandle*) handle,
+ message, hash,
+
GNUNET_MESSENGER_PACK_MODE_ENVELOPE);
+
+ if (env)
+ send_tunnel_envelope (tunnel, handle, env, copy_message (message), hash);
+}
+
+void
+forward_tunnel_message (struct GNUNET_MESSENGER_SrvTunnel *tunnel, const
struct GNUNET_MESSENGER_Message *message,
+ const struct GNUNET_HashCode *hash)
+{
+ struct GNUNET_MESSENGER_Message *clone = copy_message (message);
+ struct GNUNET_MQ_Envelope *env = pack_message (clone, NULL, NULL,
GNUNET_MESSENGER_PACK_MODE_ENVELOPE);
+
+ if (env)
+ send_tunnel_envelope (tunnel, NULL, env, clone, hash);
+}
+
+const struct GNUNET_HashCode*
+get_tunnel_peer_message (const struct GNUNET_MESSENGER_SrvTunnel *tunnel)
+{
+ return tunnel->peer_message;
+}
diff --git a/src/messenger/gnunet-service-messenger_tunnel.h
b/src/messenger/gnunet-service-messenger_tunnel.h
new file mode 100644
index 000000000..e6efb226d
--- /dev/null
+++ b/src/messenger/gnunet-service-messenger_tunnel.h
@@ -0,0 +1,155 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2020 GNUnet e.V.
+
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @author Tobias Frisch
+ * @file src/messenger/gnunet-service-messenger_tunnel.h
+ * @brief GNUnet MESSENGER service
+ */
+
+#ifndef GNUNET_SERVICE_MESSENGER_TUNNEL_H
+#define GNUNET_SERVICE_MESSENGER_TUNNEL_H
+
+#include "platform.h"
+#include "gnunet_cadet_service.h"
+#include "gnunet_peer_lib.h"
+#include "gnunet_crypto_lib.h"
+
+#include "gnunet-service-messenger_room.h"
+
+struct GNUNET_MESSENGER_SrvTunnel
+{
+ struct GNUNET_MESSENGER_SrvRoom *room;
+ struct GNUNET_CADET_Channel *channel;
+
+ GNUNET_PEER_Id peer;
+ struct GNUNET_ShortHashCode *contact_id;
+
+ struct GNUNET_HashCode *peer_message;
+ struct GNUNET_HashCode *last_message;
+};
+
+/**
+ * Creates and allocates a tunnel of a <i>room</i> to a specific peer identity.
+ *
+ * @param room Room
+ * @param door Peer identity
+ * @return New tunnel
+ */
+struct GNUNET_MESSENGER_SrvTunnel*
+create_tunnel (struct GNUNET_MESSENGER_SrvRoom *room, const struct
GNUNET_PeerIdentity *door);
+
+/**
+ * Destroys a <i>tunnel</i> and frees its memory fully.
+ *
+ * @param tunnel
+ */
+void
+destroy_tunnel (struct GNUNET_MESSENGER_SrvTunnel *tunnel);
+
+/**
+ * Binds a CADET <i>channel</i> to a <i>tunnel</i> on returns GNUNET_YES only
if
+ * the bounds channel was replaced successfully, otherwise GNUNET_NO gets
returned.
+ *
+ * @param tunnel Tunnel
+ * @param channel CADET channel
+ * @return GNUNET_YES on success, otherwise GNUNET_NO
+ */
+int
+bind_tunnel (struct GNUNET_MESSENGER_SrvTunnel *tunnel, struct
GNUNET_CADET_Channel *channel);
+
+/**
+ * Tries to connect a <i>tunnel</i> by creating a new CADET channel and
binding it.
+ * The function returns GNUNET_YES on success, otherwise GNUNET_NO.
+ *
+ * @param tunnel Tunnel
+ * @return GNUNET_YES on success, otherwise GNUNET_NO
+ */
+int
+connect_tunnel (struct GNUNET_MESSENGER_SrvTunnel *tunnel);
+
+/**
+ * Disconnects and unbinds a channel from a <i>tunnel</i>. The actual
disconnection
+ * will be asynchronous.
+ *
+ * @param tunnel Tunnel
+ */
+void
+disconnect_tunnel (struct GNUNET_MESSENGER_SrvTunnel *tunnel);
+
+/**
+ * Returns the status of a currently bound channel of a <i>tunnel</i>.
+ *
+ * @param tunnel Tunnel
+ * @return GNUNET_YES or GNUNET_NO
+ */
+int
+is_tunnel_connected (const struct GNUNET_MESSENGER_SrvTunnel *tunnel);
+
+/**
+ * Sends an envelope containing a <i>message</i> with a given <i>hash</i>
through
+ * a <i>tunnel</i> by a given <i>handle</i>.
+ *
+ * @param tunnel Tunnel
+ * @param handle Handle
+ * @param env Envelope
+ * @param message Message
+ * @param hash Hash of message
+ */
+void
+send_tunnel_envelope (struct GNUNET_MESSENGER_SrvTunnel *tunnel, void *handle,
struct GNUNET_MQ_Envelope *env,
+ struct GNUNET_MESSENGER_Message *message, const struct
GNUNET_HashCode *hash);
+
+/**
+ * Sends a <i>message</i> by packing it automatically into an envelope and
passing it
+ * through the <i>tunnel</i>. The used <i>handle</i> will sign the message and
+ * the <i>hash</i> will be calculated and stored.
+ *
+ * @param tunnel Tunnel
+ * @param handle Handle
+ * @param[out] message Message
+ * @param[out] hash Hash of message
+ */
+void
+send_tunnel_message (struct GNUNET_MESSENGER_SrvTunnel *tunnel, void *handle,
struct GNUNET_MESSENGER_Message *message,
+ struct GNUNET_HashCode *hash);
+
+/**
+ * Forwards a given <i>message</i> with a known <i>hash</i> through a
<i>tunnel</i>.
+ *
+ * @param tunnel Tunnel
+ * @param message Message
+ * @param hash Hash of message
+ */
+void
+forward_tunnel_message (struct GNUNET_MESSENGER_SrvTunnel *tunnel, const
struct GNUNET_MESSENGER_Message *message,
+ const struct GNUNET_HashCode *hash);
+
+/**
+ * Returns the hash of the latest peer message published through a given
<i>tunnel</i>
+ * and matching the tunnels peer identity. If no peer message has been linked
to the tunnel
+ * yet, NULL gets returned.
+ *
+ * @param tunnel Tunnel
+ * @return Hash of peer message or NULL
+ */
+const struct GNUNET_HashCode*
+get_tunnel_peer_message (const struct GNUNET_MESSENGER_SrvTunnel *tunnel);
+
+#endif //GNUNET_SERVICE_MESSENGER_TUNNEL_H
diff --git a/src/messenger/gnunet-service-messenger_util.c
b/src/messenger/gnunet-service-messenger_util.c
new file mode 100644
index 000000000..94fc9469d
--- /dev/null
+++ b/src/messenger/gnunet-service-messenger_util.c
@@ -0,0 +1,64 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2020 GNUnet e.V.
+
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @author Tobias Frisch
+ * @file src/messenger/gnunet-service-messenger_util.c
+ * @brief GNUnet MESSENGER service
+ */
+
+#include "gnunet-service-messenger_util.h"
+
+static void
+callback_close_channel (void *cls)
+{
+ struct GNUNET_CADET_Channel *channel = cls;
+
+ if (channel)
+ GNUNET_CADET_channel_destroy (channel);
+}
+
+void
+delayed_disconnect_channel (struct GNUNET_CADET_Channel *channel)
+{
+ GNUNET_SCHEDULER_add_delayed_with_priority (GNUNET_TIME_relative_get_zero_
(), GNUNET_SCHEDULER_PRIORITY_URGENT,
+ callback_close_channel, channel);
+}
+
+int
+generate_free_member_id (struct GNUNET_ShortHashCode *id, const struct
GNUNET_CONTAINER_MultiShortmap *members)
+{
+ size_t counter = 1 + (members ? GNUNET_CONTAINER_multishortmap_size
(members) : 0);
+
+ do
+ {
+ GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_STRONG, id,
sizeof(struct GNUNET_ShortHashCode));
+
+ if ((members) && (GNUNET_YES == GNUNET_CONTAINER_multishortmap_contains
(members, id)))
+ counter--;
+ else
+ break;
+ }
+ while (counter > 0);
+
+ if (counter)
+ return GNUNET_YES;
+
+ return GNUNET_NO;
+}
diff --git a/src/messenger/gnunet-service-messenger_util.h
b/src/messenger/gnunet-service-messenger_util.h
new file mode 100644
index 000000000..20f8f0afe
--- /dev/null
+++ b/src/messenger/gnunet-service-messenger_util.h
@@ -0,0 +1,53 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2020 GNUnet e.V.
+
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @author Tobias Frisch
+ * @file src/messenger/gnunet-service-messenger_util.h
+ * @brief GNUnet MESSENGER service
+ */
+
+#ifndef GNUNET_SERVICE_MESSENGER_UTIL_H
+#define GNUNET_SERVICE_MESSENGER_UTIL_H
+
+#include "platform.h"
+#include "gnunet_cadet_service.h"
+#include "gnunet_container_lib.h"
+#include "gnunet_crypto_lib.h"
+
+/**
+ * Starts an urgent task to close a CADET channel asynchronously.
+ *
+ * @param channel Channel
+ */
+void
+delayed_disconnect_channel (struct GNUNET_CADET_Channel *channel);
+
+/**
+ * Tries to generate an unused member id and store it into the <i>id</i>
parameter. A map containing all currently
+ * used member ids is used to check against.
+ *
+ * @param[out] id New member id
+ * @param members Map of member ids
+ * @return GNUNET_YES on success, GNUNET_NO on failure
+ */
+int
+generate_free_member_id (struct GNUNET_ShortHashCode *id, const struct
GNUNET_CONTAINER_MultiShortmap *members);
+
+#endif //GNUNET_SERVICE_MESSENGER_UTIL_H
diff --git a/src/messenger/messenger.conf.in b/src/messenger/messenger.conf.in
new file mode 100644
index 000000000..59e11b166
--- /dev/null
+++ b/src/messenger/messenger.conf.in
@@ -0,0 +1,13 @@
+[messenger]
+START_ON_DEMAND = YES
+PORT = 2097
+HOSTNAME = localhost
+BINARY = gnunet-service-messenger
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-service-messenger.sock
+UNIX_MATCH_UID = NO
+UNIX_MATCH_GID = YES
+
+# Directory to store messages and contacts
+MESSENGER_DIR = $GNUNET_DATA_HOME/messenger/
\ No newline at end of file
diff --git a/src/messenger/messenger_api.c b/src/messenger/messenger_api.c
new file mode 100644
index 000000000..6401b18d7
--- /dev/null
+++ b/src/messenger/messenger_api.c
@@ -0,0 +1,568 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2020 GNUnet e.V.
+
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @author Tobias Frisch
+ * @file src/messenger/messenger_api.c
+ * @brief messenger api: client implementation of GNUnet MESSENGER service
+ */
+
+#include "gnunet_messenger_service.h"
+
+#include "gnunet-service-messenger.h"
+
+#include "messenger_api_handle.h"
+#include "messenger_api_message.h"
+
+const char*
+GNUNET_MESSENGER_name_of_kind (enum GNUNET_MESSENGER_MessageKind kind)
+{
+ switch (kind)
+ {
+ case GNUNET_MESSENGER_KIND_INFO:
+ return "INFO";
+ case GNUNET_MESSENGER_KIND_JOIN:
+ return "JOIN";
+ case GNUNET_MESSENGER_KIND_LEAVE:
+ return "LEAVE";
+ case GNUNET_MESSENGER_KIND_NAME:
+ return "NAME";
+ case GNUNET_MESSENGER_KIND_KEY:
+ return "KEY";
+ case GNUNET_MESSENGER_KIND_PEER:
+ return "PEER";
+ case GNUNET_MESSENGER_KIND_ID:
+ return "ID";
+ case GNUNET_MESSENGER_KIND_MISS:
+ return "MISS";
+ case GNUNET_MESSENGER_KIND_MERGE:
+ return "MERGE";
+ case GNUNET_MESSENGER_KIND_REQUEST:
+ return "REQUEST";
+ case GNUNET_MESSENGER_KIND_INVITE:
+ return "INVITE";
+ case GNUNET_MESSENGER_KIND_TEXT:
+ return "TEXT";
+ case GNUNET_MESSENGER_KIND_FILE:
+ return "FILE";
+ default:
+ return "UNKNOWN";
+ }
+}
+
+static int
+check_get_name (void *cls, const struct GNUNET_MESSENGER_NameMessage *msg)
+{
+ GNUNET_MQ_check_zero_termination(msg);
+ return GNUNET_OK;
+}
+
+static void
+handle_get_name (void *cls, const struct GNUNET_MESSENGER_NameMessage *msg)
+{
+ struct GNUNET_MESSENGER_Handle *handle = cls;
+
+ const char *name = ((const char*) msg) + sizeof(*msg);
+
+ GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Set name of handle: %s\n", name);
+
+ set_handle_name (handle, strlen(name) > 0? name : NULL);
+}
+
+static void
+handle_get_key (void *cls, const struct GNUNET_MESSENGER_KeyMessage *msg)
+{
+ struct GNUNET_MESSENGER_Handle *handle = cls;
+
+ const struct GNUNET_IDENTITY_PublicKey *pubkey = &(msg->pubkey);
+
+ GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Set key of handle: %s\n",
GNUNET_IDENTITY_public_key_to_string (pubkey));
+
+ set_handle_key (handle, pubkey);
+
+ if (handle->identity_callback)
+ handle->identity_callback (handle->identity_cls, handle);
+}
+
+static void
+handle_member_id (void *cls, const struct GNUNET_MESSENGER_MemberMessage *msg)
+{
+ struct GNUNET_MESSENGER_Handle *handle = cls;
+
+ const struct GNUNET_HashCode *key = &(msg->key);
+ const struct GNUNET_ShortHashCode *id = &(msg->id);
+
+ GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Set id of handle in room: %s\n",
GNUNET_h2s (key));
+
+ struct GNUNET_MESSENGER_Room *room = GNUNET_CONTAINER_multihashmap_get
(handle->rooms, key);
+
+ if (room)
+ {
+ if (!room->contact_id)
+ room->contact_id = GNUNET_new(struct GNUNET_ShortHashCode);
+
+ GNUNET_memcpy(room->contact_id, id, sizeof(*id));
+ }
+}
+
+static void
+handle_room_open (void *cls, const struct GNUNET_MESSENGER_RoomMessage *msg)
+{
+ struct GNUNET_MESSENGER_Handle *handle = cls;
+
+ const struct GNUNET_HashCode *key = &(msg->key);
+
+ GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Opened room: %s\n", GNUNET_h2s (key));
+
+ open_handle_room (handle, key);
+}
+
+static void
+handle_room_entry (void *cls, const struct GNUNET_MESSENGER_RoomMessage *msg)
+{
+ struct GNUNET_MESSENGER_Handle *handle = cls;
+
+ const struct GNUNET_PeerIdentity *door = &(msg->door);
+ const struct GNUNET_HashCode *key = &(msg->key);
+
+ GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Entered room: %s\n", GNUNET_h2s (key));
+
+ entry_handle_room_at (handle, door, key);
+}
+
+static void
+handle_room_close (void *cls, const struct GNUNET_MESSENGER_RoomMessage *msg)
+{
+ struct GNUNET_MESSENGER_Handle *handle = cls;
+
+ const struct GNUNET_HashCode *key = &(msg->key);
+
+ GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Closed room: %s\n", GNUNET_h2s (key));
+
+ close_handle_room (handle, key);
+}
+
+static int
+check_recv_message (void *cls, const struct GNUNET_MESSENGER_RecvMessage *msg)
+{
+ const uint16_t full_length = ntohs (msg->header.size) - sizeof(msg->header);
+
+ if (full_length < sizeof(msg->hash))
+ return GNUNET_NO;
+
+ const uint16_t length = full_length - sizeof(msg->hash);
+ const char *buffer = ((const char*) msg) + sizeof(*msg);
+
+ struct GNUNET_MESSENGER_Message message;
+
+ if (length < sizeof(message.header))
+ return GNUNET_NO;
+
+ if (GNUNET_YES != decode_message (&message, length, buffer))
+ return GNUNET_NO;
+
+ return GNUNET_OK;
+}
+
+static void
+handle_recv_message (void *cls, const struct GNUNET_MESSENGER_RecvMessage *msg)
+{
+ struct GNUNET_MESSENGER_Handle *handle = cls;
+
+ const struct GNUNET_HashCode *key = &(msg->key);
+ const struct GNUNET_HashCode *hash = &(msg->hash);
+
+ const char *buffer = ((const char*) msg) + sizeof(*msg);
+
+ const uint16_t length = ntohs (msg->header.size) - sizeof(*msg);
+
+ struct GNUNET_MESSENGER_Message message;
+ decode_message (&message, length, buffer);
+
+ GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Receiving message: %s\n",
GNUNET_MESSENGER_name_of_kind (message.header.kind));
+
+ struct GNUNET_MESSENGER_Room *room = GNUNET_CONTAINER_multihashmap_get
(handle->rooms, key);
+
+ if (room)
+ {
+ handle_room_message (room, &message, hash);
+
+ if (handle->msg_callback)
+ handle->msg_callback (handle->msg_cls, room, &message, hash);
+ }
+ else
+ GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "MESSENGER ERROR: Room not found\n");
+}
+
+static void
+reconnect (struct GNUNET_MESSENGER_Handle *handle);
+
+static void
+send_open_room (struct GNUNET_MESSENGER_Handle *handle, struct
GNUNET_MESSENGER_Room *room)
+{
+ struct GNUNET_MESSENGER_RoomMessage *msg;
+ struct GNUNET_MQ_Envelope *env;
+
+ env = GNUNET_MQ_msg(msg, GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_OPEN);
+ GNUNET_memcpy(&(msg->key), &(room->key), sizeof(room->key));
+ GNUNET_MQ_send (handle->mq, env);
+}
+
+static void
+send_entry_room (struct GNUNET_MESSENGER_Handle *handle, struct
GNUNET_MESSENGER_Room *room,
+ const struct GNUNET_PeerIdentity *door)
+{
+ struct GNUNET_MESSENGER_RoomMessage *msg;
+ struct GNUNET_MQ_Envelope *env;
+
+ env = GNUNET_MQ_msg(msg, GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_ENTRY);
+ GNUNET_memcpy(&(msg->door), door, sizeof(*door));
+ GNUNET_memcpy(&(msg->key), &(room->key), sizeof(room->key));
+ GNUNET_MQ_send (handle->mq, env);
+}
+
+static void
+send_close_room (struct GNUNET_MESSENGER_Handle *handle, struct
GNUNET_MESSENGER_Room *room)
+{
+ struct GNUNET_MESSENGER_RoomMessage *msg;
+ struct GNUNET_MQ_Envelope *env;
+
+ env = GNUNET_MQ_msg(msg, GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_CLOSE);
+ GNUNET_memcpy(&(msg->key), &(room->key), sizeof(room->key));
+ GNUNET_MQ_send (handle->mq, env);
+}
+
+static int
+iterate_reset_room (void *cls, const struct GNUNET_HashCode *key, void *value)
+{
+ struct GNUNET_MESSENGER_Handle *handle = cls;
+ struct GNUNET_MESSENGER_Room *room = value;
+
+ if (GNUNET_YES == room->opened)
+ send_open_room (handle, room);
+
+ struct GNUNET_MESSENGER_ListTunnel *entry = room->entries.head;
+
+ struct GNUNET_PeerIdentity door;
+
+ while (entry)
+ {
+ GNUNET_PEER_resolve (entry->peer, &door);
+
+ send_entry_room (handle, room, &door);
+
+ entry = entry->next;
+ }
+
+ return GNUNET_YES;
+}
+
+static void
+callback_reconnect (void *cls)
+{
+ struct GNUNET_MESSENGER_Handle *handle = cls;
+
+ handle->reconnect_task = NULL;
+ handle->reconnect_time = GNUNET_TIME_STD_BACKOFF(handle->reconnect_time)
+ ;
+
+ reconnect (handle);
+
+ GNUNET_CONTAINER_multihashmap_iterate (handle->rooms, iterate_reset_room,
handle);
+}
+
+static int
+iterate_close_room (void *cls, const struct GNUNET_HashCode *key, void *value)
+{
+ struct GNUNET_MESSENGER_Handle *handle = cls;
+ struct GNUNET_MESSENGER_Room *room = value;
+
+ send_close_room (handle, room);
+
+ return GNUNET_YES;
+}
+
+static void
+callback_mq_error (void *cls, enum GNUNET_MQ_Error error)
+{
+ struct GNUNET_MESSENGER_Handle *handle = cls;
+
+ GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "MQ ERROR: %u\n", error);
+
+ GNUNET_CONTAINER_multihashmap_iterate (handle->rooms, iterate_close_room,
handle);
+
+ if (handle->mq)
+ {
+ GNUNET_MQ_destroy (handle->mq);
+ handle->mq = NULL;
+ }
+
+ handle->reconnect_task = GNUNET_SCHEDULER_add_delayed
(handle->reconnect_time, &callback_reconnect, handle);
+}
+
+static void
+reconnect (struct GNUNET_MESSENGER_Handle *handle)
+{
+ const struct GNUNET_MQ_MessageHandler handlers[] = { GNUNET_MQ_hd_var_size(
+ get_name, GNUNET_MESSAGE_TYPE_MESSENGER_CONNECTION_GET_NAME, struct
GNUNET_MESSENGER_NameMessage, handle),
+ GNUNET_MQ_hd_fixed_size(
+ get_key,
GNUNET_MESSAGE_TYPE_MESSENGER_CONNECTION_GET_KEY,
+ struct
GNUNET_MESSENGER_KeyMessage, handle),
+ GNUNET_MQ_hd_fixed_size(
+ member_id,
+
GNUNET_MESSAGE_TYPE_MESSENGER_CONNECTION_MEMBER_ID,
+ struct
GNUNET_MESSENGER_MemberMessage, handle),
+
GNUNET_MQ_hd_fixed_size(room_open,
+
GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_OPEN,
+
struct GNUNET_MESSENGER_RoomMessage,
+
handle),
+
GNUNET_MQ_hd_fixed_size(room_entry,
+
GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_ENTRY,
+
struct GNUNET_MESSENGER_RoomMessage,
+
handle),
+
GNUNET_MQ_hd_fixed_size(room_close,
+
GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_CLOSE,
+
struct GNUNET_MESSENGER_RoomMessage,
+
handle),
+ GNUNET_MQ_hd_var_size(
+ recv_message,
+
GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_RECV_MESSAGE,
+ struct
GNUNET_MESSENGER_RecvMessage, handle),
+ GNUNET_MQ_handler_end()
};
+
+ handle->mq = GNUNET_CLIENT_connect (handle->cfg,
+ GNUNET_MESSENGER_SERVICE_NAME,
+ handlers, &callback_mq_error, handle);
+}
+
+struct GNUNET_MESSENGER_Handle*
+GNUNET_MESSENGER_connect (const struct GNUNET_CONFIGURATION_Handle *cfg, const
char *name,
+ GNUNET_MESSENGER_IdentityCallback identity_callback,
void *identity_cls,
+ GNUNET_MESSENGER_MessageCallback msg_callback, void
*msg_cls)
+{
+ struct GNUNET_MESSENGER_Handle *handle = create_handle (cfg,
identity_callback, identity_cls, msg_callback, msg_cls);
+
+ reconnect (handle);
+
+ if (handle->mq)
+ {
+ const uint16_t name_len = name ? strlen (name) : 0;
+
+ struct GNUNET_MESSENGER_CreateMessage *msg;
+ struct GNUNET_MQ_Envelope *env;
+
+ env = GNUNET_MQ_msg_extra(msg, name_len + 1,
GNUNET_MESSAGE_TYPE_MESSENGER_CONNECTION_CREATE);
+
+ char *extra = ((char*) msg) + sizeof(*msg);
+
+ if (name_len)
+ GNUNET_memcpy(extra, name, name_len);
+
+ extra[name_len] = '\0';
+
+ GNUNET_MQ_send (handle->mq, env);
+ return handle;
+ }
+ else
+ {
+ destroy_handle (handle);
+ return NULL;
+ }
+}
+
+int
+GNUNET_MESSENGER_update (struct GNUNET_MESSENGER_Handle *handle)
+{
+ if ((!handle) || (!get_handle_name(handle)))
+ return GNUNET_SYSERR;
+
+ struct GNUNET_MESSENGER_UpdateMessage *msg;
+ struct GNUNET_MQ_Envelope *env;
+
+ env = GNUNET_MQ_msg(msg, GNUNET_MESSAGE_TYPE_MESSENGER_CONNECTION_UPDATE);
+ GNUNET_MQ_send (handle->mq, env);
+ return GNUNET_OK;
+}
+
+void
+GNUNET_MESSENGER_disconnect (struct GNUNET_MESSENGER_Handle *handle)
+{
+ if (!handle)
+ return;
+
+ struct GNUNET_MESSENGER_DestroyMessage *msg;
+ struct GNUNET_MQ_Envelope *env;
+
+ env = GNUNET_MQ_msg(msg, GNUNET_MESSAGE_TYPE_MESSENGER_CONNECTION_DESTROY);
+ GNUNET_MQ_send (handle->mq, env);
+
+ destroy_handle (handle);
+}
+
+const char*
+GNUNET_MESSENGER_get_name (const struct GNUNET_MESSENGER_Handle *handle)
+{
+ if (!handle)
+ return NULL;
+
+ return get_handle_name (handle);
+}
+
+int
+GNUNET_MESSENGER_set_name (struct GNUNET_MESSENGER_Handle *handle, const char
*name)
+{
+ if (!handle)
+ return GNUNET_SYSERR;
+
+ const uint16_t name_len = name ? strlen (name) : 0;
+
+ struct GNUNET_MESSENGER_NameMessage *msg;
+ struct GNUNET_MQ_Envelope *env;
+
+ env = GNUNET_MQ_msg_extra(msg, name_len + 1,
GNUNET_MESSAGE_TYPE_MESSENGER_CONNECTION_SET_NAME);
+
+ char *extra = ((char*) msg) + sizeof(*msg);
+
+ if (name_len)
+ GNUNET_memcpy(extra, name, name_len);
+
+ extra[name_len] = '\0';
+
+ GNUNET_MQ_send (handle->mq, env);
+ return GNUNET_YES;
+}
+
+const struct GNUNET_IDENTITY_PublicKey*
+GNUNET_MESSENGER_get_key (const struct GNUNET_MESSENGER_Handle *handle)
+{
+ if (!handle)
+ return NULL;
+
+ return get_handle_key (handle);
+}
+
+struct GNUNET_MESSENGER_Room*
+GNUNET_MESSENGER_open_room (struct GNUNET_MESSENGER_Handle *handle, const
struct GNUNET_HashCode *key)
+{
+ struct GNUNET_MESSENGER_Room *room = GNUNET_CONTAINER_multihashmap_get
(handle->rooms, key);
+
+ if (!room)
+ {
+ room = create_room (handle, key);
+
+ if (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put (handle->rooms, key,
room,
+
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST))
+ {
+ destroy_room (room);
+ return NULL;
+ }
+ }
+
+ send_open_room (handle, room);
+ return room;
+}
+
+struct GNUNET_MESSENGER_Room*
+GNUNET_MESSENGER_entry_room (struct GNUNET_MESSENGER_Handle *handle, const
struct GNUNET_PeerIdentity *door,
+ const struct GNUNET_HashCode *key)
+{
+ struct GNUNET_MESSENGER_Room *room = GNUNET_CONTAINER_multihashmap_get
(handle->rooms, key);
+
+ if (!room)
+ {
+ room = create_room (handle, key);
+
+ if (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put (handle->rooms, key,
room,
+
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST))
+ {
+ destroy_room (room);
+ return NULL;
+ }
+ }
+
+ send_entry_room (handle, room, door);
+ return room;
+}
+
+void
+GNUNET_MESSENGER_close_room (struct GNUNET_MESSENGER_Room *room)
+{
+ send_close_room (room->handle, room);
+}
+
+struct GNUNET_MESSENGER_Contact*
+GNUNET_MESSENGER_get_member (const struct GNUNET_MESSENGER_Room *room, const
struct GNUNET_ShortHashCode *id)
+{
+ return GNUNET_CONTAINER_multishortmap_get (room->members, id);
+}
+
+const char*
+GNUNET_MESSENGER_contact_get_name (const struct GNUNET_MESSENGER_Contact
*contact)
+{
+ if (!contact)
+ return NULL;
+
+ return get_contact_name (contact);
+}
+
+const struct GNUNET_IDENTITY_PublicKey*
+GNUNET_MESSENGER_contact_get_key (const struct GNUNET_MESSENGER_Contact
*contact)
+{
+ if (!contact)
+ return NULL;
+
+ return get_contact_key (contact);
+}
+
+void
+GNUNET_MESSENGER_send_message (struct GNUNET_MESSENGER_Room *room, const
struct GNUNET_MESSENGER_Message *message)
+{
+ const uint16_t length = get_message_size (message);
+
+ struct GNUNET_MESSENGER_SendMessage *msg;
+ struct GNUNET_MQ_Envelope *env;
+
+ env = GNUNET_MQ_msg_extra(msg, length,
GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_SEND_MESSAGE);
+
+ GNUNET_memcpy(&(msg->key), &(room->key), sizeof(room->key));
+
+ char *buffer = ((char*) msg) + sizeof(*msg);
+ encode_message (message, length, buffer);
+
+ GNUNET_MQ_send (room->handle->mq, env);
+}
+
+const struct GNUNET_MESSENGER_Message*
+GNUNET_MESSENGER_get_message (const struct GNUNET_MESSENGER_Room *room, const
struct GNUNET_HashCode *hash)
+{
+ const struct GNUNET_MESSENGER_Message *message = get_room_message (room,
hash);
+
+ if (!message)
+ {
+ struct GNUNET_MESSENGER_RecvMessage *msg;
+ struct GNUNET_MQ_Envelope *env;
+
+ env = GNUNET_MQ_msg(msg, GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_GET_MESSAGE);
+ GNUNET_memcpy(&(msg->key), &(room->key), sizeof(room->key));
+ GNUNET_memcpy(&(msg->hash), hash, sizeof(*hash));
+ GNUNET_MQ_send (room->handle->mq, env);
+ }
+
+ return message;
+}
diff --git a/src/messenger/messenger_api_contact.c
b/src/messenger/messenger_api_contact.c
new file mode 100644
index 000000000..9a242aa00
--- /dev/null
+++ b/src/messenger/messenger_api_contact.c
@@ -0,0 +1,78 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2020 GNUnet e.V.
+
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @author Tobias Frisch
+ * @file src/messenger/messenger_api_contact.c
+ * @brief messenger api: client implementation of GNUnet MESSENGER service
+ */
+
+#include "messenger_api_contact.h"
+
+struct GNUNET_MESSENGER_Contact*
+create_contact (const struct GNUNET_IDENTITY_PublicKey *key)
+{
+ struct GNUNET_MESSENGER_Contact *contact = GNUNET_new(struct
GNUNET_MESSENGER_Contact);
+
+ contact->name = NULL;
+
+ GNUNET_memcpy(&(contact->public_key), key, sizeof(contact->public_key));
+
+ return contact;
+}
+
+void
+destroy_contact (struct GNUNET_MESSENGER_Contact *contact)
+{
+ if (contact->name)
+ GNUNET_free(contact->name);
+
+ GNUNET_free(contact);
+}
+
+const char*
+get_contact_name (const struct GNUNET_MESSENGER_Contact *contact)
+{
+ return contact->name;
+}
+
+void
+set_contact_name (struct GNUNET_MESSENGER_Contact *contact, const char *name)
+{
+ if (contact->name)
+ GNUNET_free(contact->name);
+
+ contact->name = name? GNUNET_strdup(name) : NULL;
+}
+
+const struct GNUNET_IDENTITY_PublicKey*
+get_contact_key (const struct GNUNET_MESSENGER_Contact *contact)
+{
+ return &(contact->public_key);
+}
+
+const struct GNUNET_HashCode*
+get_contact_id_from_key (const struct GNUNET_MESSENGER_Contact *contact)
+{
+ static struct GNUNET_HashCode id;
+
+ GNUNET_CRYPTO_hash (&(contact->public_key), sizeof(contact->public_key),
&id);
+
+ return &id;
+}
diff --git a/src/messenger/messenger_api_contact.h
b/src/messenger/messenger_api_contact.h
new file mode 100644
index 000000000..0673b9b85
--- /dev/null
+++ b/src/messenger/messenger_api_contact.h
@@ -0,0 +1,93 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2020 GNUnet e.V.
+
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @author Tobias Frisch
+ * @file src/messenger/messenger_api_contact.h
+ * @brief messenger api: client implementation of GNUnet MESSENGER service
+ */
+
+#ifndef GNUNET_MESSENGER_API_CONTACT_H
+#define GNUNET_MESSENGER_API_CONTACT_H
+
+#include "platform.h"
+#include "gnunet_crypto_lib.h"
+#include "gnunet_identity_service.h"
+
+struct GNUNET_MESSENGER_Contact
+{
+ char *name;
+
+ struct GNUNET_IDENTITY_PublicKey public_key;
+};
+
+/**
+ * Creates and allocates a new contact with a given public <i>key</i> from an
EGO.
+ *
+ * @param key Public key
+ * @return New contact
+ */
+struct GNUNET_MESSENGER_Contact*
+create_contact (const struct GNUNET_IDENTITY_PublicKey *key);
+
+/**
+ * Destroys a contact and frees its memory fully.
+ *
+ * @param contact Contact
+ */
+void
+destroy_contact (struct GNUNET_MESSENGER_Contact *contact);
+
+/**
+ * Returns the current name of a given <i>contact</i> or NULL if no valid name
was assigned yet.
+ *
+ * @param contact Contact
+ * @return Name of the contact or NULL
+ */
+const char*
+get_contact_name (const struct GNUNET_MESSENGER_Contact *contact);
+
+/**
+ * Changes the current name of a given <i>contact</i> by copying it from the
parameter <i>name</i>.
+ *
+ * @param contact Contact
+ * @param name Valid name (may not be NULL!)
+ */
+void
+set_contact_name (struct GNUNET_MESSENGER_Contact *contact, const char *name);
+
+/**
+ * Returns the public key of a given <i>contact</i>.
+ *
+ * @param contact Contact
+ * @return Public key of the contact
+ */
+const struct GNUNET_IDENTITY_PublicKey*
+get_contact_key (const struct GNUNET_MESSENGER_Contact *contact);
+
+/**
+ * Returns the resulting hashcode of the public key from a given
<i>contact</i>.
+ *
+ * @param contact Contact
+ * @return Hash of the contacts public key
+ */
+const struct GNUNET_HashCode*
+get_contact_id_from_key (const struct GNUNET_MESSENGER_Contact *contact);
+
+#endif //GNUNET_MESSENGER_API_CONTACT_H
diff --git a/src/messenger/messenger_api_ego.h
b/src/messenger/messenger_api_ego.h
new file mode 100644
index 000000000..c60eeac50
--- /dev/null
+++ b/src/messenger/messenger_api_ego.h
@@ -0,0 +1,38 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2020 GNUnet e.V.
+
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @author Tobias Frisch
+ * @file src/messenger/messenger_api_ego.h
+ * @brief GNUnet MESSENGER service
+ */
+
+#ifndef GNUNET_MESSENGER_API_EGO_H
+#define GNUNET_MESSENGER_API_EGO_H
+
+#include "platform.h"
+#include "gnunet_identity_service.h"
+
+struct GNUNET_MESSENGER_Ego
+{
+ struct GNUNET_IDENTITY_PrivateKey priv;
+ struct GNUNET_IDENTITY_PublicKey pub;
+};
+
+#endif //GNUNET_MESSENGER_API_EGO_H
diff --git a/src/messenger/messenger_api_handle.c
b/src/messenger/messenger_api_handle.c
new file mode 100644
index 000000000..20ef77254
--- /dev/null
+++ b/src/messenger/messenger_api_handle.c
@@ -0,0 +1,213 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2020 GNUnet e.V.
+
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @author Tobias Frisch
+ * @file src/messenger/messenger_api_handle.c
+ * @brief messenger api: client implementation of GNUnet MESSENGER service
+ */
+
+#include "messenger_api_handle.h"
+
+struct GNUNET_MESSENGER_Handle*
+create_handle (const struct GNUNET_CONFIGURATION_Handle *cfg,
GNUNET_MESSENGER_IdentityCallback identity_callback,
+ void *identity_cls, GNUNET_MESSENGER_MessageCallback
msg_callback, void *msg_cls)
+{
+ struct GNUNET_MESSENGER_Handle *handle = GNUNET_new(struct
GNUNET_MESSENGER_Handle);
+
+ handle->cfg = cfg;
+ handle->mq = NULL;
+
+ handle->identity_callback = identity_callback;
+ handle->identity_cls = identity_cls;
+
+ handle->msg_callback = msg_callback;
+ handle->msg_cls = msg_cls;
+
+ handle->name = NULL;
+ handle->pubkey = NULL;
+
+ handle->reconnect_time = GNUNET_TIME_relative_get_zero_ ();
+ handle->reconnect_task = NULL;
+
+ handle->rooms = GNUNET_CONTAINER_multihashmap_create (8, GNUNET_NO);
+ handle->contacts = GNUNET_CONTAINER_multihashmap_create (8, GNUNET_NO);
+
+ return handle;
+}
+
+static int
+iterate_destroy_room (void *cls, const struct GNUNET_HashCode *key, void
*value)
+{
+ struct GNUNET_MESSENGER_Room *room = value;
+
+ destroy_room (room);
+
+ return GNUNET_YES;
+}
+
+static int
+iterate_destroy_contact (void *cls, const struct GNUNET_HashCode *key, void
*value)
+{
+ struct GNUNET_MESSENGER_Contact *contact = value;
+
+ destroy_contact (contact);
+
+ return GNUNET_YES;
+}
+
+void
+destroy_handle (struct GNUNET_MESSENGER_Handle *handle)
+{
+ if (handle->reconnect_task)
+ GNUNET_SCHEDULER_cancel (handle->reconnect_task);
+
+ if (handle->mq)
+ GNUNET_MQ_destroy (handle->mq);
+
+ if (handle->name)
+ GNUNET_free(handle->name);
+
+ if (handle->pubkey)
+ GNUNET_free(handle->pubkey);
+
+ if (handle->rooms)
+ {
+ GNUNET_CONTAINER_multihashmap_iterate (handle->rooms,
iterate_destroy_room, NULL);
+
+ GNUNET_CONTAINER_multihashmap_destroy (handle->rooms);
+ }
+
+ if (handle->contacts)
+ {
+ GNUNET_CONTAINER_multihashmap_iterate (handle->contacts,
iterate_destroy_contact, NULL);
+
+ GNUNET_CONTAINER_multihashmap_destroy (handle->contacts);
+ }
+
+ GNUNET_free(handle->name);
+}
+
+void
+set_handle_name (struct GNUNET_MESSENGER_Handle *handle, const char *name)
+{
+ if (handle->name)
+ GNUNET_free(handle->name);
+
+ handle->name = name? GNUNET_strdup(name) : NULL;
+}
+
+const char*
+get_handle_name (const struct GNUNET_MESSENGER_Handle *handle)
+{
+ return handle->name;
+}
+
+void
+set_handle_key (struct GNUNET_MESSENGER_Handle *handle, const struct
GNUNET_IDENTITY_PublicKey *pubkey)
+{
+ if (!handle->pubkey)
+ handle->pubkey = GNUNET_new(struct GNUNET_IDENTITY_PublicKey);
+
+ GNUNET_memcpy(handle->pubkey, pubkey, sizeof(*pubkey));
+}
+
+const struct GNUNET_IDENTITY_PublicKey*
+get_handle_key (const struct GNUNET_MESSENGER_Handle *handle)
+{
+ if (!handle->pubkey)
+ {
+ struct GNUNET_IDENTITY_Ego *anonymous = GNUNET_IDENTITY_ego_get_anonymous
();
+ static struct GNUNET_IDENTITY_PublicKey pubkey;
+
+ GNUNET_IDENTITY_ego_get_public_key (anonymous, &pubkey);
+
+ return &pubkey;
+ }
+
+ return handle->pubkey;
+}
+
+struct GNUNET_MESSENGER_Contact*
+get_handle_contact_by_pubkey (const struct GNUNET_MESSENGER_Handle *handle,
+ const struct GNUNET_IDENTITY_PublicKey *pubkey)
+{
+ struct GNUNET_HashCode hash;
+
+ GNUNET_CRYPTO_hash (pubkey, sizeof(*pubkey), &hash);
+
+ struct GNUNET_MESSENGER_Contact *contact = GNUNET_CONTAINER_multihashmap_get
(handle->contacts, &hash);
+
+ if (contact)
+ return contact;
+
+ contact = create_contact (pubkey);
+
+ if (GNUNET_OK == GNUNET_CONTAINER_multihashmap_put (handle->contacts, &hash,
contact,
+
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST))
+ return contact;
+
+ destroy_contact (contact);
+ return NULL;
+}
+
+void
+swap_handle_contact_by_pubkey (struct GNUNET_MESSENGER_Handle *handle, struct
GNUNET_MESSENGER_Contact *contact,
+ const struct GNUNET_IDENTITY_PublicKey *pubkey)
+{
+ const struct GNUNET_HashCode *hash = get_contact_id_from_key (contact);
+
+ if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_remove (handle->contacts,
hash, contact))
+ {
+ GNUNET_memcpy(&(contact->public_key), pubkey, sizeof(*pubkey));
+
+ hash = get_contact_id_from_key (contact);
+
+ GNUNET_CONTAINER_multihashmap_put (handle->contacts, hash, contact,
+
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST);
+ }
+}
+
+void
+open_handle_room (struct GNUNET_MESSENGER_Handle *handle, const struct
GNUNET_HashCode *key)
+{
+ struct GNUNET_MESSENGER_Room *room = GNUNET_CONTAINER_multihashmap_get
(handle->rooms, key);
+
+ if (room)
+ room->opened = GNUNET_YES;
+}
+
+void
+entry_handle_room_at (struct GNUNET_MESSENGER_Handle *handle, const struct
GNUNET_PeerIdentity *door,
+ const struct GNUNET_HashCode *key)
+{
+ struct GNUNET_MESSENGER_Room *room = GNUNET_CONTAINER_multihashmap_get
(handle->rooms, key);
+
+ if (room)
+ add_to_list_tunnels (&(room->entries), door);
+}
+
+void
+close_handle_room (struct GNUNET_MESSENGER_Handle *handle, const struct
GNUNET_HashCode *key)
+{
+ struct GNUNET_MESSENGER_Room *room = GNUNET_CONTAINER_multihashmap_get
(handle->rooms, key);
+
+ if ((room) && (GNUNET_YES == GNUNET_CONTAINER_multihashmap_remove
(handle->rooms, key, room)))
+ destroy_room (room);
+}
diff --git a/src/messenger/messenger_api_handle.h
b/src/messenger/messenger_api_handle.h
new file mode 100644
index 000000000..d6cde0106
--- /dev/null
+++ b/src/messenger/messenger_api_handle.h
@@ -0,0 +1,174 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2020 GNUnet e.V.
+
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @author Tobias Frisch
+ * @file src/messenger/messenger_api_handle.h
+ * @brief messenger api: client implementation of GNUnet MESSENGER service
+ */
+
+#ifndef GNUNET_MESSENGER_API_HANDLE_H
+#define GNUNET_MESSENGER_API_HANDLE_H
+
+#include "platform.h"
+#include "gnunet_cadet_service.h"
+#include "gnunet_container_lib.h"
+#include "gnunet_crypto_lib.h"
+#include "gnunet_identity_service.h"
+#include "gnunet_peer_lib.h"
+
+#include "gnunet_messenger_service.h"
+
+#include "messenger_api_contact.h"
+#include "messenger_api_room.h"
+
+struct GNUNET_MESSENGER_Handle
+{
+ const struct GNUNET_CONFIGURATION_Handle *cfg;
+
+ struct GNUNET_MQ_Handle *mq;
+
+ GNUNET_MESSENGER_IdentityCallback identity_callback;
+ void *identity_cls;
+
+ GNUNET_MESSENGER_MessageCallback msg_callback;
+ void *msg_cls;
+
+ char *name;
+ struct GNUNET_IDENTITY_PublicKey *pubkey;
+
+ struct GNUNET_TIME_Relative reconnect_time;
+ struct GNUNET_SCHEDULER_Task *reconnect_task;
+
+ struct GNUNET_CONTAINER_MultiHashMap *rooms;
+ struct GNUNET_CONTAINER_MultiHashMap *contacts;
+};
+
+/**
+ * Creates and allocates a new handle using a given configuration and a custom
message callback
+ * with a given closure for the client API.
+ *
+ * @param cfg Configuration
+ * @param msg_callback Message callback
+ * @param msg_cls Closure
+ * @return New handle
+ */
+struct GNUNET_MESSENGER_Handle*
+create_handle (const struct GNUNET_CONFIGURATION_Handle *cfg,
GNUNET_MESSENGER_IdentityCallback identity_callback,
+ void *identity_cls, GNUNET_MESSENGER_MessageCallback
msg_callback, void *msg_cls);
+
+/**
+ * Destroys a <i>handle</i> and frees its memory fully from the client API.
+ *
+ * @param handle Handle
+ */
+void
+destroy_handle (struct GNUNET_MESSENGER_Handle *handle);
+
+/**
+ * Sets the name of a <i>handle</i> to a specific <i>name</i>.
+ *
+ * @param handle Handle
+ * @param name New name
+ */
+void
+set_handle_name (struct GNUNET_MESSENGER_Handle *handle, const char *name);
+
+/**
+ * Returns the current name of a given <i>handle</i> or NULL if no valid name
was assigned yet.
+ *
+ * @param handle Handle
+ * @return Name of the handle or NULL
+ */
+const char*
+get_handle_name (const struct GNUNET_MESSENGER_Handle *handle);
+
+/**
+ * Sets the public key of a given <i>handle</i> to a specific public key.
+ *
+ * @param handle Handle
+ * @param pubkey Public key
+ */
+void
+set_handle_key (struct GNUNET_MESSENGER_Handle *handle, const struct
GNUNET_IDENTITY_PublicKey *pubkey);
+
+/**
+ * Returns the public key of a given <i>handle</i>.
+ *
+ * @param handle Handle
+ * @return Public key of the handle
+ */
+const struct GNUNET_IDENTITY_PublicKey*
+get_handle_key (const struct GNUNET_MESSENGER_Handle *handle);
+
+/**
+ * Returns a contact known to a <i>handle</i> identified by a given public
key. If not matching
+ * contact is found, NULL gets returned.
+ *
+ * @param handle Handle
+ * @param pubkey Public key of EGO
+ * @return Contact or NULL
+ */
+struct GNUNET_MESSENGER_Contact*
+get_handle_contact_by_pubkey (const struct GNUNET_MESSENGER_Handle *handle,
+ const struct GNUNET_IDENTITY_PublicKey *pubkey);
+
+/**
+ * Changes the public key for a <i>contact</i> known to a <i>handle</i> to a
specific public key and
+ * updates local map entries to access the contact by its updated key.
+ *
+ * @param handle Handle
+ * @param contact Contact
+ * @param pubkey Public key of EGO
+ */
+void
+swap_handle_contact_by_pubkey (struct GNUNET_MESSENGER_Handle *handle, struct
GNUNET_MESSENGER_Contact *contact,
+ const struct GNUNET_IDENTITY_PublicKey *pubkey);
+
+/**
+ * Marks a room known to a <i>handle</i> identified by a given <i>key</i> as
open.
+ *
+ * @param handle Handle
+ * @param key Key of room
+ */
+void
+open_handle_room (struct GNUNET_MESSENGER_Handle *handle, const struct
GNUNET_HashCode *key);
+
+/**
+ * Adds a tunnel for a room known to a <i>handle</i> identified by a given
<i>key</i> to a
+ * list of opened connections.
+ *
+ * @param handle Handle
+ * @param door Peer identity
+ * @param key Key of room
+ */
+void
+entry_handle_room_at (struct GNUNET_MESSENGER_Handle *handle, const struct
GNUNET_PeerIdentity *door,
+ const struct GNUNET_HashCode *key);
+
+/**
+ * Destroys and so implicitly closes a room known to a <i>handle</i>
identified by a given <i>key</i>.
+ *
+ * @param handle Handle
+ * @param key Key of room
+ */
+void
+close_handle_room (struct GNUNET_MESSENGER_Handle *handle, const struct
GNUNET_HashCode *key);
+
+#endif //GNUNET_MESSENGER_API_HANDLE_H
diff --git a/src/messenger/messenger_api_list_tunnels.c
b/src/messenger/messenger_api_list_tunnels.c
new file mode 100644
index 000000000..13d8c1906
--- /dev/null
+++ b/src/messenger/messenger_api_list_tunnels.c
@@ -0,0 +1,112 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2020 GNUnet e.V.
+
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @author Tobias Frisch
+ * @file src/messenger/messenger_api_list_tunnels.c
+ * @brief messenger api: client and service implementation of GNUnet MESSENGER
service
+ */
+
+#include "messenger_api_list_tunnels.h"
+
+void
+init_list_tunnels (struct GNUNET_MESSENGER_ListTunnels *tunnels)
+{
+ GNUNET_assert(tunnels);
+
+ tunnels->head = NULL;
+ tunnels->tail = NULL;
+}
+
+void
+clear_list_tunnels (struct GNUNET_MESSENGER_ListTunnels *tunnels)
+{
+ GNUNET_assert(tunnels);
+
+ struct GNUNET_MESSENGER_ListTunnel *element;
+
+ for (element = tunnels->head; element; element = tunnels->head)
+ {
+ GNUNET_CONTAINER_DLL_remove(tunnels->head, tunnels->tail, element);
+ GNUNET_PEER_change_rc (element->peer, -1);
+ GNUNET_free(element);
+ }
+
+ tunnels->head = NULL;
+ tunnels->tail = NULL;
+}
+
+static int
+compare_list_tunnels (void *cls, struct GNUNET_MESSENGER_ListTunnel *element0,
+ struct GNUNET_MESSENGER_ListTunnel *element1)
+{
+ return ((int) element0->peer) - ((int) element1->peer);
+}
+
+void
+add_to_list_tunnels (struct GNUNET_MESSENGER_ListTunnels *tunnels, const
struct GNUNET_PeerIdentity *peer)
+{
+ struct GNUNET_MESSENGER_ListTunnel *element = GNUNET_new(struct
GNUNET_MESSENGER_ListTunnel);
+
+ element->peer = GNUNET_PEER_intern (peer);
+
+ GNUNET_CONTAINER_DLL_insert_sorted(struct GNUNET_MESSENGER_ListTunnel,
compare_list_tunnels, NULL, tunnels->head,
+ tunnels->tail, element);
+}
+
+struct GNUNET_MESSENGER_ListTunnel*
+find_list_tunnels (struct GNUNET_MESSENGER_ListTunnels *tunnels, const struct
GNUNET_PeerIdentity *peer, size_t *index)
+{
+ struct GNUNET_MESSENGER_ListTunnel *element;
+ struct GNUNET_PeerIdentity pid;
+
+ if (index)
+ *index = 0;
+
+ for (element = tunnels->head; element; element = element->next)
+ {
+ GNUNET_PEER_resolve (element->peer, &pid);
+
+ if (0 == GNUNET_memcmp(&pid, peer))
+ return element;
+
+ if (index)
+ (*index) = (*index) + 1;
+ }
+
+ return NULL;
+}
+
+int
+contains_list_tunnels (struct GNUNET_MESSENGER_ListTunnels *tunnels, const
struct GNUNET_PeerIdentity *peer)
+{
+ return find_list_tunnels (tunnels, peer, NULL) != NULL ? GNUNET_YES :
GNUNET_NO;
+}
+
+struct GNUNET_MESSENGER_ListTunnel*
+remove_from_list_tunnels (struct GNUNET_MESSENGER_ListTunnels *tunnels, struct
GNUNET_MESSENGER_ListTunnel *element)
+{
+ struct GNUNET_MESSENGER_ListTunnel *next = element->next;
+
+ GNUNET_CONTAINER_DLL_remove(tunnels->head, tunnels->tail, element);
+ GNUNET_PEER_change_rc (element->peer, -1);
+ GNUNET_free(element);
+
+ return next;
+}
diff --git a/src/messenger/messenger_api_list_tunnels.h
b/src/messenger/messenger_api_list_tunnels.h
new file mode 100644
index 000000000..0240fceb8
--- /dev/null
+++ b/src/messenger/messenger_api_list_tunnels.h
@@ -0,0 +1,112 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2020 GNUnet e.V.
+
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @author Tobias Frisch
+ * @file src/messenger/messenger_api_list_tunnels.h
+ * @brief messenger api: client and service implementation of GNUnet MESSENGER
service
+ */
+
+#ifndef GNUNET_MESSENGER_API_LIST_TUNNELS_H
+#define GNUNET_MESSENGER_API_LIST_TUNNELS_H
+
+#include "platform.h"
+#include "gnunet_peer_lib.h"
+#include "gnunet_container_lib.h"
+
+struct GNUNET_MESSENGER_ListTunnel
+{
+ struct GNUNET_MESSENGER_ListTunnel *prev;
+ struct GNUNET_MESSENGER_ListTunnel *next;
+
+ GNUNET_PEER_Id peer;
+};
+
+struct GNUNET_MESSENGER_ListTunnels
+{
+ struct GNUNET_MESSENGER_ListTunnel *head;
+ struct GNUNET_MESSENGER_ListTunnel *tail;
+};
+
+/**
+ * Initializes list of tunnels peer identities as empty list.
+ *
+ * @param tunnels List of peer identities
+ */
+void
+init_list_tunnels (struct GNUNET_MESSENGER_ListTunnels *tunnels);
+
+/**
+ * Clears the list of tunnels peer identities.
+ *
+ * @param tunnels List of peer identities
+ */
+void
+clear_list_tunnels (struct GNUNET_MESSENGER_ListTunnels *tunnels);
+
+/**
+ * Adds a specific <i>peer</i> from a tunnel to the end of the list.
+ *
+ * @param tunnels List of peer identities
+ * @param peer Peer identity of tunnel
+ */
+void
+add_to_list_tunnels (struct GNUNET_MESSENGER_ListTunnels *tunnels, const
struct GNUNET_PeerIdentity *peer);
+
+/**
+ * Searches linearly through the list of tunnels peer identities for matching a
+ * specific <i>peer</i> identity and returns the matching element of the list.
+ *
+ * If no matching element is found, NULL gets returned.
+ *
+ * If <i>index</i> is not NULL, <i>index</i> will be overriden with the
numeric index of
+ * the found element in the list. If no matching element is found,
<i>index</i> will
+ * contain the total amount of elements in the list.
+ *
+ * @param tunnels List of peer identities
+ * @param peer Peer identity of tunnel
+ * @param[out] index Index of found element (optional)
+ * @return Element in the list with matching peer identity
+ */
+struct GNUNET_MESSENGER_ListTunnel*
+find_list_tunnels (struct GNUNET_MESSENGER_ListTunnels *tunnels, const struct
GNUNET_PeerIdentity *peer, size_t *index);
+
+/**
+ * Tests linearly if the list of tunnels peer identities contains a specific
+ * <i>peer</i> identity and returns GNUNET_YES on success, otherwise GNUNET_NO.
+ *
+ * @param tunnels List of peer identities
+ * @param peer Peer identity of tunnel
+ * @return GNUNET_YES on success, otherwise GNUNET_NO
+ */
+int
+contains_list_tunnels (struct GNUNET_MESSENGER_ListTunnels *tunnels, const
struct GNUNET_PeerIdentity *peer);
+
+/**
+ * Removes a specific <i>element</i> from the list of tunnels peer identities
and returns
+ * the next element in the list.
+ *
+ * @param tunnels List of peer identities
+ * @param element Element of the list
+ * @return Next element in the list
+ */
+struct GNUNET_MESSENGER_ListTunnel*
+remove_from_list_tunnels (struct GNUNET_MESSENGER_ListTunnels *tunnels, struct
GNUNET_MESSENGER_ListTunnel *element);
+
+#endif //GNUNET_MESSENGER_API_LIST_TUNNELS_H
diff --git a/src/messenger/messenger_api_message.c
b/src/messenger/messenger_api_message.c
new file mode 100644
index 000000000..fdab60eef
--- /dev/null
+++ b/src/messenger/messenger_api_message.c
@@ -0,0 +1,602 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2020 GNUnet e.V.
+
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @author Tobias Frisch
+ * @file src/messenger/messenger_api_message.c
+ * @brief messenger api: client and service implementation of GNUnet MESSENGER
service
+ */
+
+#include "messenger_api_message.h"
+
+struct GNUNET_MESSENGER_MessageSignature
+{
+ struct GNUNET_CRYPTO_EccSignaturePurpose purpose;
+ struct GNUNET_HashCode hash;
+};
+
+struct GNUNET_MESSENGER_ShortMessage
+{
+ enum GNUNET_MESSENGER_MessageKind kind;
+ struct GNUNET_MESSENGER_MessageBody body;
+};
+
+struct GNUNET_MESSENGER_Message*
+create_message (enum GNUNET_MESSENGER_MessageKind kind)
+{
+ struct GNUNET_MESSENGER_Message *message = GNUNET_new(struct
GNUNET_MESSENGER_Message);
+
+ message->header.kind = kind;
+
+ switch (message->header.kind)
+ {
+ case GNUNET_MESSENGER_KIND_NAME:
+ message->body.name.name = NULL;
+ break;
+ case GNUNET_MESSENGER_KIND_TEXT:
+ message->body.text.text = NULL;
+ break;
+ case GNUNET_MESSENGER_KIND_FILE:
+ message->body.file.uri = NULL;
+ break;
+ case GNUNET_MESSENGER_KIND_PRIVATE:
+ message->body.private.length = 0;
+ message->body.private.data = NULL;
+ break;
+ default:
+ break;
+ }
+
+ return message;
+}
+
+struct GNUNET_MESSENGER_Message*
+copy_message (const struct GNUNET_MESSENGER_Message *message)
+{
+ struct GNUNET_MESSENGER_Message *copy = GNUNET_new(struct
GNUNET_MESSENGER_Message);
+
+ GNUNET_memcpy(copy, message, sizeof(struct GNUNET_MESSENGER_Message));
+
+ switch (message->header.kind)
+ {
+ case GNUNET_MESSENGER_KIND_NAME:
+ copy->body.name.name = GNUNET_strdup(message->body.name.name);
+ break;
+ case GNUNET_MESSENGER_KIND_TEXT:
+ copy->body.text.text = GNUNET_strdup(message->body.text.text);
+ break;
+ case GNUNET_MESSENGER_KIND_FILE:
+ copy->body.file.uri = GNUNET_strdup(message->body.file.uri);
+ break;
+ case GNUNET_MESSENGER_KIND_PRIVATE:
+ copy->body.private.data = copy->body.private.length ?
GNUNET_malloc(copy->body.private.length) : NULL;
+
+ if (copy->body.private.data)
+ {
+ GNUNET_memcpy(copy->body.private.data, message->body.private.data,
copy->body.private.length);
+ }
+
+ break;
+ default:
+ break;
+ }
+
+ return copy;
+}
+
+static void
+destroy_message_body (enum GNUNET_MESSENGER_MessageKind kind, struct
GNUNET_MESSENGER_MessageBody *body)
+{
+ switch (kind)
+ {
+ case GNUNET_MESSENGER_KIND_NAME:
+ GNUNET_free(body->name.name);
+ break;
+ case GNUNET_MESSENGER_KIND_TEXT:
+ GNUNET_free(body->text.text);
+ break;
+ case GNUNET_MESSENGER_KIND_FILE:
+ GNUNET_free(body->file.uri);
+ break;
+ case GNUNET_MESSENGER_KIND_PRIVATE:
+ GNUNET_free(body->private.data);
+ break;
+ default:
+ break;
+ }
+}
+
+void
+destroy_message (struct GNUNET_MESSENGER_Message *message)
+{
+ destroy_message_body (message->header.kind, &(message->body));
+
+ GNUNET_free(message);
+}
+
+static void
+fold_short_message (const struct GNUNET_MESSENGER_Message *message, struct
GNUNET_MESSENGER_ShortMessage *shortened)
+{
+ shortened->kind = message->header.kind;
+
+ GNUNET_memcpy(&(shortened->body), &(message->body), sizeof(struct
GNUNET_MESSENGER_MessageBody));
+}
+
+static void
+unfold_short_message (struct GNUNET_MESSENGER_ShortMessage *shortened, struct
GNUNET_MESSENGER_Message *message)
+{
+ destroy_message_body (message->header.kind, &(message->body));
+
+ message->header.kind = shortened->kind;
+
+ GNUNET_memcpy(&(message->body), &(shortened->body), sizeof(struct
GNUNET_MESSENGER_MessageBody));
+}
+
+#define member_size(type, member) sizeof(((type*) NULL)->member)
+
+static uint16_t
+get_message_body_kind_size (enum GNUNET_MESSENGER_MessageKind kind)
+{
+ uint16_t length = 0;
+
+ switch (kind)
+ {
+ case GNUNET_MESSENGER_KIND_INFO:
+ length += member_size(struct GNUNET_MESSENGER_Message, body.info.host_key);
+ length += member_size(struct GNUNET_MESSENGER_Message,
body.info.unique_id);
+ break;
+ case GNUNET_MESSENGER_KIND_JOIN:
+ length += member_size(struct GNUNET_MESSENGER_Message, body.join.key);
+ break;
+ case GNUNET_MESSENGER_KIND_LEAVE:
+ break;
+ case GNUNET_MESSENGER_KIND_NAME:
+ break;
+ case GNUNET_MESSENGER_KIND_KEY:
+ length += member_size(struct GNUNET_MESSENGER_Message, body.key.key);
+ break;
+ case GNUNET_MESSENGER_KIND_PEER:
+ length += member_size(struct GNUNET_MESSENGER_Message, body.peer.peer);
+ break;
+ case GNUNET_MESSENGER_KIND_ID:
+ length += member_size(struct GNUNET_MESSENGER_Message, body.id.id);
+ break;
+ case GNUNET_MESSENGER_KIND_MISS:
+ length += member_size(struct GNUNET_MESSENGER_Message, body.miss.peer);
+ break;
+ case GNUNET_MESSENGER_KIND_MERGE:
+ length += member_size(struct GNUNET_MESSENGER_Message,
body.merge.previous);
+ break;
+ case GNUNET_MESSENGER_KIND_REQUEST:
+ length += member_size(struct GNUNET_MESSENGER_Message, body.request.hash);
+ break;
+ case GNUNET_MESSENGER_KIND_INVITE:
+ length += member_size(struct GNUNET_MESSENGER_Message, body.invite.door);
+ length += member_size(struct GNUNET_MESSENGER_Message, body.invite.key);
+ break;
+ case GNUNET_MESSENGER_KIND_TEXT:
+ break;
+ case GNUNET_MESSENGER_KIND_FILE:
+ length += member_size(struct GNUNET_MESSENGER_Message, body.file.key);
+ length += member_size(struct GNUNET_MESSENGER_Message, body.file.hash);
+ length += NAME_MAX;
+ break;
+ case GNUNET_MESSENGER_KIND_PRIVATE:
+ length += member_size(struct GNUNET_MESSENGER_Message, body.private.key);
+ break;
+ default:
+ break;
+ }
+
+ return length;
+}
+
+uint16_t
+get_message_kind_size (enum GNUNET_MESSENGER_MessageKind kind)
+{
+ uint16_t length = 0;
+
+ length += member_size(struct GNUNET_MESSENGER_Message, header.signature);
+ length += member_size(struct GNUNET_MESSENGER_Message, header.timestamp);
+ length += member_size(struct GNUNET_MESSENGER_Message, header.sender_id);
+ length += member_size(struct GNUNET_MESSENGER_Message, header.previous);
+ length += member_size(struct GNUNET_MESSENGER_Message, header.kind);
+
+ return length + get_message_body_kind_size (kind);
+}
+
+static uint16_t
+get_message_body_size (enum GNUNET_MESSENGER_MessageKind kind, const struct
GNUNET_MESSENGER_MessageBody *body)
+{
+ uint16_t length = 0;
+
+ switch (kind)
+ {
+ case GNUNET_MESSENGER_KIND_NAME:
+ length += (body->name.name? strlen (body->name.name) : 0);
+ break;
+ case GNUNET_MESSENGER_KIND_TEXT:
+ length += strlen (body->text.text);
+ break;
+ case GNUNET_MESSENGER_KIND_FILE:
+ length += strlen (body->file.uri);
+ break;
+ case GNUNET_MESSENGER_KIND_PRIVATE:
+ length += body->private.length;
+ break;
+ default:
+ break;
+ }
+
+ return length;
+}
+
+uint16_t
+get_message_size (const struct GNUNET_MESSENGER_Message *message)
+{
+ return get_message_kind_size (message->header.kind) + get_message_body_size
(message->header.kind, &(message->body));
+}
+
+static uint16_t
+get_short_message_size (const struct GNUNET_MESSENGER_ShortMessage *message)
+{
+ if (message)
+ return sizeof(message->kind) + get_message_body_kind_size (message->kind)
+ + get_message_body_size (message->kind, &(message->body));
+ else
+ return sizeof(message->kind);
+}
+
+#define min(x, y) (x < y? x : y)
+
+#define encode_step_ext(dst, offset, src, size) do { \
+ GNUNET_memcpy(dst + offset, src, size); \
+ offset += size; \
+} while (0)
+
+#define encode_step(dst, offset, src) do { \
+ encode_step_ext(dst, offset, src, sizeof(*src)); \
+} while(0)
+
+static void
+encode_message_body (enum GNUNET_MESSENGER_MessageKind kind, const struct
GNUNET_MESSENGER_MessageBody *body,
+ uint16_t length, char *buffer, uint16_t offset)
+{
+ switch (kind)
+ {
+ case GNUNET_MESSENGER_KIND_INFO:
+ encode_step(buffer, offset, &(body->info.host_key));
+ encode_step(buffer, offset, &(body->info.unique_id));
+ break;
+ case GNUNET_MESSENGER_KIND_JOIN:
+ encode_step(buffer, offset, &(body->join.key));
+ break;
+ case GNUNET_MESSENGER_KIND_LEAVE:
+ break;
+ case GNUNET_MESSENGER_KIND_NAME:
+ if (body->name.name)
+ encode_step_ext(buffer, offset, body->name.name, min(length - offset,
strlen(body->name.name)));
+ break;
+ case GNUNET_MESSENGER_KIND_KEY:
+ encode_step(buffer, offset, &(body->key.key));
+ break;
+ case GNUNET_MESSENGER_KIND_PEER:
+ encode_step(buffer, offset, &(body->peer.peer));
+ break;
+ case GNUNET_MESSENGER_KIND_ID:
+ encode_step(buffer, offset, &(body->id.id));
+ break;
+ case GNUNET_MESSENGER_KIND_MISS:
+ encode_step(buffer, offset, &(body->miss.peer));
+ break;
+ case GNUNET_MESSENGER_KIND_MERGE:
+ encode_step(buffer, offset, &(body->merge.previous));
+ break;
+ case GNUNET_MESSENGER_KIND_REQUEST:
+ encode_step(buffer, offset, &(body->request.hash));
+ break;
+ case GNUNET_MESSENGER_KIND_INVITE:
+ encode_step(buffer, offset, &(body->invite.door));
+ encode_step(buffer, offset, &(body->invite.key));
+ break;
+ case GNUNET_MESSENGER_KIND_TEXT:
+ encode_step_ext(buffer, offset, body->text.text, min(length - offset,
strlen(body->text.text)));
+ break;
+ case GNUNET_MESSENGER_KIND_FILE:
+ encode_step(buffer, offset, &(body->file.key));
+ encode_step(buffer, offset, &(body->file.hash));
+ encode_step_ext(buffer, offset, body->file.name, NAME_MAX);
+ encode_step_ext(buffer, offset, body->file.uri, min(length - offset,
strlen(body->file.uri)));
+ break;
+ case GNUNET_MESSENGER_KIND_PRIVATE:
+ encode_step(buffer, offset, &(body->private.key));
+ encode_step_ext(buffer, offset, body->private.data, min(length - offset,
body->private.length));
+ break;
+ default:
+ break;
+ }
+}
+
+void
+encode_message (const struct GNUNET_MESSENGER_Message *message, uint16_t
length, char *buffer)
+{
+ uint16_t offset = 0;
+
+ encode_step(buffer, offset, &(message->header.signature));
+ encode_step(buffer, offset, &(message->header.timestamp));
+ encode_step(buffer, offset, &(message->header.sender_id));
+ encode_step(buffer, offset, &(message->header.previous));
+ encode_step(buffer, offset, &(message->header.kind));
+
+ encode_message_body (message->header.kind, &(message->body), length, buffer,
offset);
+}
+
+static void
+encode_short_message (const struct GNUNET_MESSENGER_ShortMessage *message,
uint16_t length, char *buffer)
+{
+ uint16_t offset = 0;
+
+ encode_step(buffer, offset, &(message->kind));
+
+ encode_message_body (message->kind, &(message->body), length, buffer,
offset);
+}
+
+#define decode_step_ext(src, offset, dst, size) do { \
+ GNUNET_memcpy(dst, src + offset, size); \
+ offset += size; \
+} while (0)
+
+#define decode_step(src, offset, dst) do { \
+ decode_step_ext(src, offset, dst, sizeof(*dst)); \
+} while (0)
+
+#define decode_step_malloc(src, offset, dst, size, zero) do { \
+ dst = GNUNET_malloc(size + zero); \
+ if (zero) dst[size] = 0;
\
+ decode_step_ext(src, offset, dst, size);
\
+} while (0)
+
+static void
+decode_message_body (enum GNUNET_MESSENGER_MessageKind *kind, struct
GNUNET_MESSENGER_MessageBody *body,
+ uint16_t length, const char *buffer, uint16_t offset)
+{
+ switch (*kind)
+ {
+ case GNUNET_MESSENGER_KIND_INFO:
+ decode_step(buffer, offset, &(body->info.host_key));
+ decode_step(buffer, offset, &(body->info.unique_id));
+ break;
+ case GNUNET_MESSENGER_KIND_JOIN:
+ decode_step(buffer, offset, &(body->join.key));
+ break;
+ case GNUNET_MESSENGER_KIND_LEAVE:
+ break;
+ case GNUNET_MESSENGER_KIND_NAME:
+ if (length - offset > 0)
+ decode_step_malloc(buffer, offset, body->name.name, length - offset, 1);
+ else
+ body->name.name = NULL;
+ break;
+ case GNUNET_MESSENGER_KIND_KEY:
+ decode_step(buffer, offset, &(body->key.key));
+ break;
+ case GNUNET_MESSENGER_KIND_PEER:
+ decode_step(buffer, offset, &(body->peer.peer));
+ break;
+ case GNUNET_MESSENGER_KIND_ID:
+ decode_step(buffer, offset, &(body->id.id));
+ break;
+ case GNUNET_MESSENGER_KIND_MISS:
+ decode_step(buffer, offset, &(body->miss.peer));
+ break;
+ case GNUNET_MESSENGER_KIND_MERGE:
+ decode_step(buffer, offset, &(body->merge.previous));
+ break;
+ case GNUNET_MESSENGER_KIND_REQUEST:
+ decode_step(buffer, offset, &(body->request.hash));
+ break;
+ case GNUNET_MESSENGER_KIND_INVITE:
+ decode_step(buffer, offset, &(body->invite.door));
+ decode_step(buffer, offset, &(body->invite.key));
+ break;
+ case GNUNET_MESSENGER_KIND_TEXT:
+ decode_step_malloc(buffer, offset, body->text.text, length - offset, 1);
+ break;
+ case GNUNET_MESSENGER_KIND_FILE:
+ decode_step(buffer, offset, &(body->file.key));
+ decode_step(buffer, offset, &(body->file.hash));
+ decode_step_ext(buffer, offset, body->file.name, NAME_MAX);
+ decode_step_malloc(buffer, offset, body->file.uri, length - offset, 1);
+ break;
+ case GNUNET_MESSENGER_KIND_PRIVATE:
+ decode_step(buffer, offset, &(body->private.key));
+
+ body->private.length = (length - offset);
+ decode_step_malloc(buffer, offset, body->private.data, length - offset, 0);
+ break;
+ default:
+ *kind = GNUNET_MESSENGER_KIND_UNKNOWN;
+ break;
+ }
+}
+
+int
+decode_message (struct GNUNET_MESSENGER_Message *message, uint16_t length,
const char *buffer)
+{
+ uint16_t offset = 0;
+
+ if (length < get_message_kind_size (GNUNET_MESSENGER_KIND_UNKNOWN))
+ return GNUNET_NO;
+
+ decode_step(buffer, offset, &(message->header.signature));
+ decode_step(buffer, offset, &(message->header.timestamp));
+ decode_step(buffer, offset, &(message->header.sender_id));
+ decode_step(buffer, offset, &(message->header.previous));
+ decode_step(buffer, offset, &(message->header.kind));
+
+ if (length < get_message_kind_size (message->header.kind))
+ return GNUNET_NO;
+
+ decode_message_body (&(message->header.kind), &(message->body), length,
buffer, offset);
+
+ return GNUNET_YES;
+}
+
+static int
+decode_short_message (struct GNUNET_MESSENGER_ShortMessage *message, uint16_t
length, const char *buffer)
+{
+ uint16_t offset = 0;
+
+ if (length < get_short_message_size (NULL))
+ return GNUNET_NO;
+
+ decode_step(buffer, offset, &(message->kind));
+
+ if (length < get_short_message_size (message))
+ return GNUNET_NO;
+
+ decode_message_body (&(message->kind), &(message->body), length, buffer,
offset);
+
+ return GNUNET_YES;
+}
+
+void
+hash_message (uint16_t length, const char *buffer, struct GNUNET_HashCode
*hash)
+{
+ GNUNET_CRYPTO_hash (buffer + sizeof(struct GNUNET_CRYPTO_EcdsaSignature),
+ length - sizeof(struct GNUNET_CRYPTO_EcdsaSignature),
hash);
+}
+
+void
+sign_message (struct GNUNET_MESSENGER_Message *message, uint16_t length, char
*buffer,
+ const struct GNUNET_HashCode *hash, const struct
GNUNET_MESSENGER_Ego *ego)
+{
+ struct GNUNET_MESSENGER_MessageSignature signature;
+
+ signature.purpose.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_CHAT_MESSAGE);
+ signature.purpose.size = htonl (sizeof(signature));
+
+ GNUNET_memcpy(&(signature.hash), hash, sizeof(struct GNUNET_HashCode));
+
+ GNUNET_IDENTITY_sign(&(ego->priv), &signature, &(message->header.signature));
+ GNUNET_memcpy(buffer, &(message->header.signature), sizeof(struct
GNUNET_CRYPTO_EcdsaSignature));
+}
+
+int
+verify_message (const struct GNUNET_MESSENGER_Message *message, const struct
GNUNET_HashCode *hash,
+ const struct GNUNET_IDENTITY_PublicKey *key)
+{
+ struct GNUNET_MESSENGER_MessageSignature signature;
+
+ signature.purpose.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_CHAT_MESSAGE);
+ signature.purpose.size = htonl (sizeof(signature));
+
+ GNUNET_memcpy(&(signature.hash), hash, sizeof(struct GNUNET_HashCode));
+
+ return
GNUNET_IDENTITY_signature_verify(GNUNET_SIGNATURE_PURPOSE_CHAT_MESSAGE,
&signature,
+ &(message->header.signature), key);
+}
+
+int
+encrypt_message (struct GNUNET_MESSENGER_Message *message, const struct
GNUNET_IDENTITY_PublicKey *key)
+{
+ struct GNUNET_MESSENGER_ShortMessage shortened;
+
+ fold_short_message (message, &shortened);
+
+ const uint16_t length = get_short_message_size (&shortened);
+
+ message->header.kind = GNUNET_MESSENGER_KIND_PRIVATE;
+ message->body.private.data = GNUNET_malloc(length);
+
+ encode_short_message (&shortened, length, message->body.private.data);
+
+ if (GNUNET_IDENTITY_encrypt (message->body.private.data, length, key,
&(message->body.private.key),
+ message->body.private.data)
+ == length)
+ {
+ destroy_message_body (shortened.kind, &(shortened.body));
+ return GNUNET_YES;
+ }
+ else
+ {
+ unfold_short_message (&shortened, message);
+ return GNUNET_NO;
+ }
+}
+
+int
+decrypt_message (struct GNUNET_MESSENGER_Message *message, const struct
GNUNET_IDENTITY_PrivateKey *key)
+{
+ if (message->body.private.length != GNUNET_IDENTITY_decrypt
(message->body.private.data,
+
message->body.private.length, key,
+
&(message->body.private.key),
+
message->body.private.data))
+ return GNUNET_NO;
+
+ struct GNUNET_MESSENGER_ShortMessage shortened;
+
+ if (GNUNET_YES != decode_short_message (&shortened,
message->body.private.length, message->body.private.data))
+ return GNUNET_NO;
+
+ unfold_short_message (&shortened, message);
+ return GNUNET_YES;
+}
+
+struct GNUNET_MQ_Envelope*
+pack_message (struct GNUNET_MESSENGER_Message *message, struct GNUNET_HashCode
*hash,
+ const struct GNUNET_MESSENGER_Ego *ego, int mode)
+{
+ GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Packing message: %u\n",
message->header.kind);
+
+ struct GNUNET_MessageHeader *header;
+
+ uint16_t length = get_message_size (message);
+
+ struct GNUNET_MQ_Envelope *env;
+ char *buffer;
+
+ if (GNUNET_MESSENGER_PACK_MODE_ENVELOPE == mode)
+ {
+ env = GNUNET_MQ_msg_extra(header, length, GNUNET_MESSAGE_TYPE_CADET_CLI);
+
+ buffer = (char*) &(header[1]);
+ }
+ else
+ {
+ env = NULL;
+
+ buffer = GNUNET_malloc(length);
+ }
+
+ encode_message (message, length, buffer);
+
+ if (hash)
+ {
+ hash_message (length, buffer, hash);
+
+ if (ego)
+ sign_message (message, length, buffer, hash, ego);
+ }
+
+ if (GNUNET_MESSENGER_PACK_MODE_ENVELOPE != mode)
+ GNUNET_free(buffer);
+
+ return env;
+}
diff --git a/src/messenger/messenger_api_message.h
b/src/messenger/messenger_api_message.h
new file mode 100644
index 000000000..0f0a97e9c
--- /dev/null
+++ b/src/messenger/messenger_api_message.h
@@ -0,0 +1,190 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2020 GNUnet e.V.
+
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @author Tobias Frisch
+ * @file src/messenger/messenger_api_message.h
+ * @brief messenger api: client and service implementation of GNUnet MESSENGER
service
+ */
+
+#ifndef GNUNET_MESSENGER_API_MESSAGE_H
+#define GNUNET_MESSENGER_API_MESSAGE_H
+
+#include "platform.h"
+#include "gnunet_crypto_lib.h"
+#include "gnunet_identity_service.h"
+#include "gnunet_mq_lib.h"
+#include "gnunet_signatures.h"
+
+#include "gnunet_messenger_service.h"
+
+#include "messenger_api_ego.h"
+
+/**
+ * Creates and allocates a new message with a specific <i>kind</i>.
+ *
+ * @param kind Kind of message
+ * @return New message
+ */
+struct GNUNET_MESSENGER_Message*
+create_message (enum GNUNET_MESSENGER_MessageKind kind);
+
+/**
+ * Creates and allocates a copy of a given <i>message</i>.
+ *
+ * @param message Message
+ * @return New message
+ */
+struct GNUNET_MESSENGER_Message*
+copy_message (const struct GNUNET_MESSENGER_Message *message);
+
+/**
+ * Destroys a message and frees its memory fully.
+ *
+ * @param message Message
+ */
+void
+destroy_message (struct GNUNET_MESSENGER_Message *message);
+
+/**
+ * Returns the minimal size in bytes to encode a message of a specific
<i>kind</i>.
+ *
+ * @param kind Kind of message
+ * @return Minimal size to encode
+ */
+uint16_t
+get_message_kind_size (enum GNUNET_MESSENGER_MessageKind kind);
+
+/**
+ * Returns the exact size in bytes to encode a given <i>message</i>.
+ *
+ * @param message Message
+ * @return Size to encode
+ */
+uint16_t
+get_message_size (const struct GNUNET_MESSENGER_Message *message);
+
+/**
+ * Encodes a given <i>message</i> into a <i>buffer</i> of a maximal
<i>length</i> in bytes.
+ *
+ * @param message Message
+ * @param length Maximal length to encode
+ * @param[out] buffer Buffer
+ */
+void
+encode_message (const struct GNUNET_MESSENGER_Message *message, uint16_t
length, char *buffer);
+
+/**
+ * Decodes a <i>message</i> from a given <i>buffer</i> of a maximal
<i>length</i> in bytes.
+ *
+ * If the buffer is too small for a message of its decoded kind the function
fails with
+ * resulting GNUNET_NO after decoding only the messages header.
+ *
+ * On success the function returns GNUNET_YES.
+ *
+ * @param[out] message Message
+ * @param length Maximal length to decode
+ * @param buffer Buffer
+ * @return GNUNET_YES on success, otherwise GNUNET_NO
+ */
+int
+decode_message (struct GNUNET_MESSENGER_Message *message, uint16_t length,
const char *buffer);
+
+/**
+ * Calculates a <i>hash</i> of a given <i>buffer</i> of a <i>length</i> in
bytes.
+ *
+ * @param length Length of buffer
+ * @param buffer Buffer
+ * @param[out] hash Hash
+ */
+void
+hash_message (uint16_t length, const char *buffer, struct GNUNET_HashCode
*hash);
+
+/**
+ * Signs the <i>hash</i> of a <i>message</i> with a given <i>ego</i> and
writes the signature
+ * into the <i>buffer</i> as well.
+ *
+ * @param[out] message Message
+ * @param length Length of buffer
+ * @param[out] buffer Buffer
+ * @param hash Hash of message
+ * @param ego EGO
+ */
+void
+sign_message (struct GNUNET_MESSENGER_Message *message, uint16_t length, char
*buffer,
+ const struct GNUNET_HashCode *hash, const struct
GNUNET_MESSENGER_Ego *ego);
+
+/**
+ * Verifies the signature of a given <i>message</i> and its <i>hash</i> with a
specific
+ * public key. The function returns GNUNET_OK if the signature was valid,
otherwise
+ * GNUNET_SYSERR.
+ *
+ * @param message Message
+ * @param hash Hash of message
+ * @param key Public key of EGO
+ * @return GNUNET_OK on success, otherwise GNUNET_SYSERR
+ */
+int
+verify_message (const struct GNUNET_MESSENGER_Message *message, const struct
GNUNET_HashCode *hash,
+ const struct GNUNET_IDENTITY_PublicKey *key);
+
+/**
+ * Encrypts a <i>message</i> using a given public <i>key</i> and replaces its
body
+ * and kind with the now private encrypted <i>message</i>. The function returns
+ * GNUNET_YES if the operation succeeded, otherwise GNUNET_NO.
+ *
+ * @param message Message
+ * @param key Public key of EGO
+ * @return GNUNET_YES on success, otherwise GNUNET_NO
+ */
+int
+encrypt_message (struct GNUNET_MESSENGER_Message *message, const struct
GNUNET_IDENTITY_PublicKey *key);
+
+/**
+ * Decrypts a private <i>message</i> using a given private <i>key</i> and
replaces its body
+ * and kind with the inner encrypted message. The function returns GNUNET_YES
if the
+ * operation succeeded, otherwise GNUNET_NO.
+ *
+ * @param message Message
+ * @param key Private key of EGO
+ * @return GNUNET_YES on success, otherwise GNUNET_NO
+ */
+int
+decrypt_message (struct GNUNET_MESSENGER_Message *message, const struct
GNUNET_IDENTITY_PrivateKey *key);
+
+#define GNUNET_MESSENGER_PACK_MODE_ENVELOPE 0x1
+#define GNUNET_MESSENGER_PACK_MODE_UNKNOWN 0x0
+
+/**
+ * Encodes the <i>message</i> to pack it into a newly allocated envelope if
<i>mode</i>
+ * is equal to GNUNET_MESSENGER_PACK_MODE_ENVELOPE. Independent of the mode
the message
+ * will be hashed if <i>hash</i> is not NULL and it will be signed if the
<i>ego</i> is
+ * not NULL.
+ *
+ * @param[out] message Message
+ * @param[out] hash Hash of message
+ * @param ego EGO to sign
+ * @param mode Mode of packing
+ * @return Envelope or NULL
+ */
+struct GNUNET_MQ_Envelope*
+pack_message (struct GNUNET_MESSENGER_Message *message, struct GNUNET_HashCode
*hash,
+ const struct GNUNET_MESSENGER_Ego *ego, int mode);
+
+#endif //GNUNET_MESSENGER_API_MESSAGE_H
diff --git a/src/messenger/messenger_api_room.c
b/src/messenger/messenger_api_room.c
new file mode 100644
index 000000000..5fedf1a78
--- /dev/null
+++ b/src/messenger/messenger_api_room.c
@@ -0,0 +1,189 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2020 GNUnet e.V.
+
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @author Tobias Frisch
+ * @file src/messenger/messenger_api_room.c
+ * @brief messenger api: client implementation of GNUnet MESSENGER service
+ */
+
+#include "messenger_api_room.h"
+
+#include "messenger_api_handle.h"
+
+struct GNUNET_MESSENGER_Room*
+create_room (struct GNUNET_MESSENGER_Handle *handle, const struct
GNUNET_HashCode *key)
+{
+ struct GNUNET_MESSENGER_Room *room = GNUNET_new(struct
GNUNET_MESSENGER_Room);
+
+ room->handle = handle;
+ GNUNET_memcpy(&(room->key), key, sizeof(*key));
+
+ room->opened = GNUNET_NO;
+ room->contact_id = NULL;
+
+ room->members = GNUNET_CONTAINER_multishortmap_create (8, GNUNET_NO);
+
+ init_list_tunnels (&(room->entries));
+
+ room->messages = GNUNET_CONTAINER_multihashmap_create (8, GNUNET_NO);
+
+ return room;
+}
+
+static int
+iterate_destroy_message (void *cls, const struct GNUNET_HashCode *key, void
*value)
+{
+ struct GNUNET_MESSENGER_Message *message = value;
+
+ destroy_message (message);
+
+ return GNUNET_YES;
+}
+
+void
+destroy_room (struct GNUNET_MESSENGER_Room *room)
+{
+ if (room->members)
+ GNUNET_CONTAINER_multishortmap_destroy (room->members);
+
+ clear_list_tunnels (&(room->entries));
+
+ if (room->messages)
+ {
+ GNUNET_CONTAINER_multihashmap_iterate (room->messages,
iterate_destroy_message, NULL);
+
+ GNUNET_CONTAINER_multihashmap_destroy (room->messages);
+ }
+
+ if (room->contact_id)
+ GNUNET_free(room->contact_id);
+
+ GNUNET_free(room);
+}
+
+const struct GNUNET_MESSENGER_Message*
+get_room_message (const struct GNUNET_MESSENGER_Room *room, const struct
GNUNET_HashCode *hash)
+{
+ return GNUNET_CONTAINER_multihashmap_get (room->messages, hash);
+}
+
+static void
+handle_join_message (struct GNUNET_MESSENGER_Room *room, const struct
GNUNET_MESSENGER_Message *message,
+ const struct GNUNET_HashCode *hash)
+{
+ struct GNUNET_MESSENGER_Contact *contact = get_handle_contact_by_pubkey
(room->handle, &(message->body.join.key));
+
+ if (contact)
+ GNUNET_CONTAINER_multishortmap_put (room->members,
&(message->header.sender_id), contact,
+
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST);
+}
+
+static void
+handle_leave_message (struct GNUNET_MESSENGER_Room *room, const struct
GNUNET_MESSENGER_Message *message,
+ const struct GNUNET_HashCode *hash)
+{
+ GNUNET_CONTAINER_multishortmap_remove_all (room->members,
&(message->header.sender_id));
+}
+
+static void
+handle_name_message (struct GNUNET_MESSENGER_Room *room, const struct
GNUNET_MESSENGER_Message *message,
+ const struct GNUNET_HashCode *hash)
+{
+ struct GNUNET_MESSENGER_Contact *contact =
GNUNET_CONTAINER_multishortmap_get (room->members,
+
&(message->header.sender_id));
+
+ if (contact)
+ set_contact_name (contact, message->body.name.name);
+}
+
+static void
+handle_key_message (struct GNUNET_MESSENGER_Room *room, const struct
GNUNET_MESSENGER_Message *message,
+ const struct GNUNET_HashCode *hash)
+{
+ struct GNUNET_MESSENGER_Contact *contact =
GNUNET_CONTAINER_multishortmap_get (room->members,
+
&(message->header.sender_id));
+
+ if (contact)
+ swap_handle_contact_by_pubkey (room->handle, contact,
&(message->body.key.key));
+}
+
+static void
+handle_id_message (struct GNUNET_MESSENGER_Room *room, const struct
GNUNET_MESSENGER_Message *message,
+ const struct GNUNET_HashCode *hash)
+{
+ struct GNUNET_MESSENGER_Contact *contact =
GNUNET_CONTAINER_multishortmap_get (room->members,
+
&(message->header.sender_id));
+
+ if ((contact) && (GNUNET_OK
+ == GNUNET_CONTAINER_multishortmap_put (room->members,
&(message->body.id.id), contact,
+
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST)))
+ GNUNET_CONTAINER_multishortmap_remove (room->members,
&(message->header.sender_id), contact);
+}
+
+static void
+handle_miss_message (struct GNUNET_MESSENGER_Room *room, const struct
GNUNET_MESSENGER_Message *message,
+ const struct GNUNET_HashCode *hash)
+{
+ if ((room->contact_id) && (0 == GNUNET_memcmp(&(message->header.sender_id),
room->contact_id)))
+ {
+ struct GNUNET_MESSENGER_ListTunnel *match = find_list_tunnels
(&(room->entries), &(message->body.miss.peer), NULL);
+
+ if (match)
+ remove_from_list_tunnels (&(room->entries), match);
+ }
+}
+
+void
+handle_room_message (struct GNUNET_MESSENGER_Room *room, const struct
GNUNET_MESSENGER_Message *message,
+ const struct GNUNET_HashCode *hash)
+{
+ if (GNUNET_NO != GNUNET_CONTAINER_multihashmap_contains (room->messages,
hash))
+ return;
+
+ switch (message->header.kind)
+ {
+ case GNUNET_MESSENGER_KIND_JOIN:
+ handle_join_message (room, message, hash);
+ break;
+ case GNUNET_MESSENGER_KIND_LEAVE:
+ handle_leave_message (room, message, hash);
+ break;
+ case GNUNET_MESSENGER_KIND_NAME:
+ handle_name_message (room, message, hash);
+ break;
+ case GNUNET_MESSENGER_KIND_KEY:
+ handle_key_message (room, message, hash);
+ break;
+ case GNUNET_MESSENGER_KIND_ID:
+ handle_id_message (room, message, hash);
+ break;
+ case GNUNET_MESSENGER_KIND_MISS:
+ handle_miss_message (room, message, hash);
+ break;
+ default:
+ break;
+ }
+
+ struct GNUNET_MESSENGER_Message *clone = copy_message (message);
+
+ if (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put (room->messages, hash,
clone,
+
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST))
+ destroy_message (clone);
+}
diff --git a/src/messenger/messenger_api_room.h
b/src/messenger/messenger_api_room.h
new file mode 100644
index 000000000..0038128d8
--- /dev/null
+++ b/src/messenger/messenger_api_room.h
@@ -0,0 +1,95 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2020 GNUnet e.V.
+
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @author Tobias Frisch
+ * @file src/messenger/messenger_api_room.h
+ * @brief messenger api: client implementation of GNUnet MESSENGER service
+ */
+
+#ifndef GNUNET_MESSENGER_API_ROOM_H
+#define GNUNET_MESSENGER_API_ROOM_H
+
+#include "platform.h"
+#include "gnunet_container_lib.h"
+#include "gnunet_crypto_lib.h"
+
+#include "gnunet_messenger_service.h"
+
+#include "messenger_api_list_tunnels.h"
+#include "messenger_api_contact.h"
+#include "messenger_api_message.h"
+
+struct GNUNET_MESSENGER_Room
+{
+ struct GNUNET_MESSENGER_Handle *handle;
+ struct GNUNET_HashCode key;
+
+ int opened;
+
+ struct GNUNET_ShortHashCode *contact_id;
+
+ struct GNUNET_CONTAINER_MultiShortmap *members;
+ struct GNUNET_MESSENGER_ListTunnels entries;
+
+ struct GNUNET_CONTAINER_MultiHashMap *messages;
+};
+
+/**
+ * Creates and allocates a new room for a <i>handle</i> with a given
<i>key</i> for the client API.
+ *
+ * @param handle Handle
+ * @param key Key of room
+ * @return New room
+ */
+struct GNUNET_MESSENGER_Room*
+create_room (struct GNUNET_MESSENGER_Handle *handle, const struct
GNUNET_HashCode *key);
+
+/**
+ * Destroys a room and frees its memory fully from the client API.
+ *
+ * @param room Room
+ */
+void
+destroy_room (struct GNUNET_MESSENGER_Room *room);
+
+/**
+ * Returns a message locally stored from a map for a given <i>hash</i> in a
<i>room</i>. If no matching
+ * message is found, NULL gets returned.
+ *
+ * @param room Room
+ * @param hash Hash of message
+ * @return Message or NULL
+ */
+const struct GNUNET_MESSENGER_Message*
+get_room_message (const struct GNUNET_MESSENGER_Room *room, const struct
GNUNET_HashCode *hash);
+
+/**
+ * Handles a <i>message</i> with a given <i>hash</i> in a <i>room</i> for the
client API to update
+ * members and its information. The function also stores the message in map
locally for access afterwards.
+ *
+ * @param room Room
+ * @param message Message
+ * @param hash Hash of message
+ */
+void
+handle_room_message (struct GNUNET_MESSENGER_Room *room, const struct
GNUNET_MESSENGER_Message *message,
+ const struct GNUNET_HashCode *hash);
+
+#endif //GNUNET_MESSENGER_API_ROOM_H
diff --git a/src/messenger/test_messenger.c b/src/messenger/test_messenger.c
new file mode 100644
index 000000000..b42dfe6d9
--- /dev/null
+++ b/src/messenger/test_messenger.c
@@ -0,0 +1,187 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2020 GNUnet e.V.
+
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @file messenger/test_messenger.c
+ * @author Tobias Frisch
+ * @brief Test for the messenger service using cadet API.
+ */
+#include <stdio.h>
+#include "platform.h"
+#include "gnunet_util_lib.h"
+#include "gnunet_testing_lib.h"
+#include "gnunet_messenger_service.h"
+
+/**
+ * How long until we really give up on a particular testcase portion?
+ */
+#define TOTAL_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS,
\
+ 60)
+
+/**
+ * How long until we give up on any particular operation (and retry)?
+ */
+#define BASE_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS,
5)
+
+#define TESTER_NAME "tester"
+
+static int status = 1;
+
+static struct GNUNET_SCHEDULER_Task *die_task = NULL;
+static struct GNUNET_SCHEDULER_Task *op_task = NULL;
+
+struct GNUNET_MESSENGER_Handle *messenger = NULL;
+
+static void
+end (void *cls)
+{
+ die_task = NULL;
+
+ if (op_task)
+ {
+ GNUNET_SCHEDULER_cancel (op_task);
+ op_task = NULL;
+ }
+
+ if (messenger)
+ {
+ GNUNET_MESSENGER_disconnect(messenger);
+ messenger = NULL;
+ }
+
+ status = 0;
+}
+
+
+static void
+end_badly (void *cls)
+{
+ fprintf (stderr, "Testcase failed (timeout).\n");
+
+ end (NULL);
+ status = 1;
+}
+
+static void
+end_operation (void *cls)
+{
+ op_task = NULL;
+
+ fprintf (stderr, "Testcase failed (operation: '%s').\n", cls? (const char*)
cls : "unknown");
+
+ if (die_task)
+ GNUNET_SCHEDULER_cancel (die_task);
+
+ end (NULL);
+ status = 1;
+}
+
+static int identity_counter = 0;
+
+/**
+ * Function called when an identity is retrieved.
+ *
+ * @param cls Closure
+ * @param handle Handle of messenger service
+ */
+static void
+on_identity (void *cls, struct GNUNET_MESSENGER_Handle *handle)
+{
+ if (op_task)
+ {
+ GNUNET_SCHEDULER_cancel (op_task);
+ op_task = NULL;
+ }
+
+ const char* name = GNUNET_MESSENGER_get_name(handle);
+
+ if (0 != strcmp(name, TESTER_NAME))
+ {
+ op_task = GNUNET_SCHEDULER_add_now (&end_operation, "name");
+ return;
+ }
+
+ struct GNUNET_IDENTITY_Ego* ego = GNUNET_IDENTITY_ego_get_anonymous();
+ struct GNUNET_IDENTITY_PublicKey anonymous_key;
+
+ GNUNET_IDENTITY_ego_get_public_key(ego, &anonymous_key);
+
+ const struct GNUNET_IDENTITY_PublicKey* key =
GNUNET_MESSENGER_get_key(handle);
+
+ if (((!identity_counter) && (0 != GNUNET_memcmp(key, (&anonymous_key)))) ||
+ ((identity_counter) && (0 == GNUNET_memcmp(key, (&anonymous_key)))))
+ {
+ op_task = GNUNET_SCHEDULER_add_now (&end_operation, "key");
+ return;
+ }
+
+ if (identity_counter) {
+ GNUNET_MESSENGER_disconnect(handle);
+
+ op_task = NULL;
+ messenger = NULL;
+
+ if (die_task)
+ GNUNET_SCHEDULER_cancel (die_task);
+
+ die_task = GNUNET_SCHEDULER_add_now (&end, NULL);
+ return;
+ }
+
+ GNUNET_MESSENGER_update(messenger);
+ identity_counter++;
+}
+
+/**
+ * Main function for testcase.
+ *
+ * @param cls Closure
+ * @param cfg Configuration
+ * @param peer Peer for testing
+ */
+static void
+run (void *cls,
+ const struct GNUNET_CONFIGURATION_Handle *cfg,
+ struct GNUNET_TESTING_Peer *peer)
+{
+ die_task = GNUNET_SCHEDULER_add_delayed (TOTAL_TIMEOUT, &end_badly, NULL);
+
+ identity_counter = 0;
+
+ op_task = GNUNET_SCHEDULER_add_delayed (BASE_TIMEOUT, &end_operation,
"connect");
+ messenger = GNUNET_MESSENGER_connect(cfg, TESTER_NAME, &on_identity, NULL,
NULL, NULL);
+}
+
+/**
+ * The main function.
+ *
+ * @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 **argv)
+{
+ if (0 != GNUNET_TESTING_peer_run("test-messenger",
+ "test_messenger_api.conf",
+ &run, NULL))
+ return 1;
+
+ return status;
+}
diff --git a/src/messenger/test_messenger_anonymous.c
b/src/messenger/test_messenger_anonymous.c
new file mode 100644
index 000000000..e2057acc4
--- /dev/null
+++ b/src/messenger/test_messenger_anonymous.c
@@ -0,0 +1,179 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2020 GNUnet e.V.
+
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @file messenger/test_messenger_anonymous.c
+ * @author Tobias Frisch
+ * @brief Test for the messenger service using cadet API.
+ */
+#include <stdio.h>
+#include "platform.h"
+#include "gnunet_util_lib.h"
+#include "gnunet_testing_lib.h"
+#include "gnunet_messenger_service.h"
+
+/**
+ * How long until we really give up on a particular testcase portion?
+ */
+#define TOTAL_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS,
\
+ 60)
+
+/**
+ * How long until we give up on any particular operation (and retry)?
+ */
+#define BASE_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS,
5)
+
+static int status = 1;
+
+static struct GNUNET_SCHEDULER_Task *die_task = NULL;
+static struct GNUNET_SCHEDULER_Task *op_task = NULL;
+
+struct GNUNET_MESSENGER_Handle *messenger = NULL;
+
+static void
+end (void *cls)
+{
+ die_task = NULL;
+
+ if (op_task)
+ {
+ GNUNET_SCHEDULER_cancel (op_task);
+ op_task = NULL;
+ }
+
+ if (messenger)
+ {
+ GNUNET_MESSENGER_disconnect(messenger);
+ messenger = NULL;
+ }
+
+ status = 0;
+}
+
+
+static void
+end_badly (void *cls)
+{
+ fprintf (stderr, "Testcase failed (timeout).\n");
+
+ end (NULL);
+ status = 1;
+}
+
+static void
+end_operation (void *cls)
+{
+ op_task = NULL;
+
+ fprintf (stderr, "Testcase failed (operation: '%s').\n", cls? (const char*)
cls : "unknown");
+
+ if (die_task)
+ GNUNET_SCHEDULER_cancel (die_task);
+
+ end (NULL);
+ status = 1;
+}
+
+/**
+ * Function called when an identity is retrieved.
+ *
+ * @param cls Closure
+ * @param handle Handle of messenger service
+ */
+static void
+on_identity (void *cls, struct GNUNET_MESSENGER_Handle *handle)
+{
+ if (op_task)
+ {
+ GNUNET_SCHEDULER_cancel (op_task);
+ op_task = NULL;
+ }
+
+ const char* name = GNUNET_MESSENGER_get_name(handle);
+
+ if (NULL != name)
+ {
+ op_task = GNUNET_SCHEDULER_add_now (&end_operation, "name-anonymous");
+ return;
+ }
+
+ if (GNUNET_SYSERR != GNUNET_MESSENGER_update(handle))
+ {
+ op_task = GNUNET_SCHEDULER_add_now (&end_operation, "update-fail");
+ return;
+ }
+
+ struct GNUNET_IDENTITY_Ego* ego = GNUNET_IDENTITY_ego_get_anonymous();
+ struct GNUNET_IDENTITY_PublicKey anonymous_key;
+
+ GNUNET_IDENTITY_ego_get_public_key(ego, &anonymous_key);
+
+ const struct GNUNET_IDENTITY_PublicKey* key =
GNUNET_MESSENGER_get_key(handle);
+
+ if (0 != GNUNET_memcmp(key, (&anonymous_key)))
+ {
+ op_task = GNUNET_SCHEDULER_add_now (&end_operation, "key-anonymous");
+ return;
+ }
+
+ GNUNET_MESSENGER_disconnect(handle);
+
+ messenger = NULL;
+
+ if (die_task)
+ GNUNET_SCHEDULER_cancel (die_task);
+
+ die_task = GNUNET_SCHEDULER_add_now (&end, NULL);
+}
+
+/**
+ * Main function for testcase.
+ *
+ * @param cls Closure
+ * @param cfg Configuration
+ * @param peer Peer for testing
+ */
+static void
+run (void *cls,
+ const struct GNUNET_CONFIGURATION_Handle *cfg,
+ struct GNUNET_TESTING_Peer *peer)
+{
+ die_task = GNUNET_SCHEDULER_add_delayed (TOTAL_TIMEOUT, &end_badly, NULL);
+
+ op_task = GNUNET_SCHEDULER_add_delayed (BASE_TIMEOUT, &end_operation,
"connect");
+ messenger = GNUNET_MESSENGER_connect(cfg, NULL, &on_identity, NULL, NULL,
NULL);
+}
+
+/**
+ * The main function.
+ *
+ * @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 **argv)
+{
+ if (0 != GNUNET_TESTING_peer_run("test-messenger",
+ "test_messenger_api.conf",
+ &run, NULL))
+ return 1;
+
+ return status;
+}
diff --git a/src/messenger/test_messenger_comm0.c
b/src/messenger/test_messenger_comm0.c
new file mode 100644
index 000000000..631b5b2c9
--- /dev/null
+++ b/src/messenger/test_messenger_comm0.c
@@ -0,0 +1,252 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2020 GNUnet e.V.
+
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @file messenger/test_messenger_comm0.c
+ * @author Tobias Frisch
+ * @brief Test for the messenger service using cadet API.
+ */
+#include <stdio.h>
+#include "platform.h"
+#include "gnunet_util_lib.h"
+#include "gnunet_testbed_logger_service.h"
+#include "gnunet_testbed_service.h"
+#include "gnunet_testing_lib.h"
+#include "gnunet_messenger_service.h"
+
+/**
+ * How long until we really give up on a particular testcase portion?
+ */
+#define TOTAL_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS,
\
+ 60)
+
+/**
+ * How long until we give up on any particular operation (and retry)?
+ */
+#define BASE_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS,
5)
+
+static int status = 1;
+
+static struct GNUNET_SCHEDULER_Task *die_task = NULL;
+static struct GNUNET_SCHEDULER_Task *op_task = NULL;
+
+static void
+end (void *cls)
+{
+ die_task = NULL;
+
+ if (op_task)
+ {
+ GNUNET_SCHEDULER_cancel (op_task);
+ op_task = NULL;
+ }
+
+ GNUNET_SCHEDULER_shutdown ();
+ status = 0;
+}
+
+
+static void
+end_badly (void *cls)
+{
+ fprintf (stderr, "Testcase failed (timeout).\n");
+
+ end (NULL);
+ status = 1;
+}
+
+static void
+end_operation (void *cls)
+{
+ op_task = NULL;
+
+ fprintf (stderr, "Testcase failed (operation: '%s').\n", cls? (const char*)
cls : "unknown");
+
+ if (die_task)
+ GNUNET_SCHEDULER_cancel (die_task);
+
+ end (NULL);
+ status = 1;
+}
+
+static void
+end_error (void *cls)
+{
+ op_task = NULL;
+
+ fprintf (stderr, "Testcase failed (error: '%s').\n", cls? (const char*) cls
: "unknown");
+ GNUNET_free(cls);
+
+ if (die_task)
+ GNUNET_SCHEDULER_cancel (die_task);
+
+ end (NULL);
+ status = 1;
+}
+
+/**
+ * Function called whenever a message is received or sent.
+ *
+ * @param cls Closure
+ * @param room Room
+ * @param message Message
+ * @param hash Hash of message
+ */
+static void
+on_message (void *cls, const struct GNUNET_MESSENGER_Room *room, const struct
GNUNET_MESSENGER_Message *message,
+ const struct GNUNET_HashCode *hash)
+{
+ // TODO
+}
+
+/**
+ * Function called when an identity is retrieved.
+ *
+ * @param cls Closure
+ * @param handle Handle of messenger service
+ */
+static void
+on_identity (void *cls, struct GNUNET_MESSENGER_Handle *handle)
+{
+ // TODO
+}
+
+static void
+on_peer (void *cb_cls, struct GNUNET_TESTBED_Operation *op,
+ const struct GNUNET_TESTBED_PeerInformation *pinfo,
+ const char *emsg)
+{
+ if (emsg)
+ {
+ op_task = GNUNET_SCHEDULER_add_now (&end_error, GNUNET_strdup(emsg));
+ return;
+ }
+
+ if (pinfo->pit != GNUNET_TESTBED_PIT_CONFIGURATION)
+ {
+ op_task = GNUNET_SCHEDULER_add_now (&end_operation, "config");
+ return;
+ }
+
+ struct GNUNET_MESSENGER_Handle *handle;
+ struct GNUNET_MESSENGER_Room *room;
+
+ fprintf (stderr, "MSG: connect\n");
+
+ handle = GNUNET_MESSENGER_connect(pinfo->result.cfg, "tester", &on_identity,
NULL, &on_message, NULL);
+
+ struct GNUNET_HashCode hash;
+ GNUNET_CRYPTO_hash("test", 4, &hash);
+
+ fprintf (stderr, "MSG: open\n");
+
+ room = GNUNET_MESSENGER_open_room(handle, &hash);
+
+ fprintf (stderr, "MSG: close\n");
+
+ GNUNET_MESSENGER_close_room(room);
+
+ fprintf (stderr, "MSG: disconnect\n");
+
+ GNUNET_MESSENGER_disconnect(handle);
+
+ GNUNET_TESTBED_operation_done(op);
+
+}
+
+/**
+ * Main function for a peer of the testcase.
+ *
+ * @param cls Closure
+ * @param event Information about the event
+ */
+static void
+run (void *cls, const struct GNUNET_TESTBED_EventInformation *event)
+{
+ if (GNUNET_TESTBED_ET_PEER_START != event->type)
+ {
+ op_task = GNUNET_SCHEDULER_add_now (&end_operation, "start");
+ return;
+ }
+
+ GNUNET_TESTBED_peer_get_information(event->details.peer_start.peer,
+ GNUNET_TESTBED_PIT_CONFIGURATION,
+ on_peer, event->details.peer_start.peer);
+
+ fprintf (stderr, "MSG: barrier\n");
+
+ GNUNET_TESTBED_barrier_wait("exit", NULL, NULL);
+
+ fprintf (stderr, "MSG: exit\n");
+}
+
+static void
+exit_status (void *cls, const char *name,
+ struct GNUNET_TESTBED_Barrier *barrier,
+ enum GNUNET_TESTBED_BarrierStatus status,
+ const char *emsg)
+{
+ if (emsg)
+ {
+ op_task = GNUNET_SCHEDULER_add_now (&end_error, GNUNET_strdup(emsg));
+ return;
+ }
+
+ if (GNUNET_TESTBED_BARRIERSTATUS_ERROR == status)
+ {
+ op_task = GNUNET_SCHEDULER_add_now (&end_operation, "exit");
+ return;
+ }
+ else if (GNUNET_TESTBED_BARRIERSTATUS_CROSSED == status)
+ GNUNET_SCHEDULER_add_now(&end, NULL);
+}
+
+static void
+init (void *cls, struct GNUNET_TESTBED_RunHandle *h, unsigned int num_peers,
+ struct GNUNET_TESTBED_Peer **peers, unsigned int links_succeeded,
+ unsigned int links_failed)
+{
+ die_task = GNUNET_SCHEDULER_add_delayed (TOTAL_TIMEOUT, &end_badly, NULL);
+
+ struct GNUNET_TESTBED_Controller *controller;
+
+ controller = GNUNET_TESTBED_run_get_controller_handle(h);
+
+ GNUNET_TESTBED_barrier_init(controller, "exit", num_peers, exit_status,
NULL);
+}
+
+/**
+ * The main function.
+ *
+ * @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 **argv)
+{
+ if (GNUNET_OK != GNUNET_TESTBED_test_run("test-messenger-comm0",
+ "test_messenger_api.conf",
+ 2, 0,
+ &run, NULL,
+ &init, NULL))
+ return 1;
+
+ return status;
+}
diff --git a/src/my/my_query_helper.c b/src/my/my_query_helper.c
index 526e57b8b..97ea04fd1 100644
--- a/src/my/my_query_helper.c
+++ b/src/my/my_query_helper.c
@@ -280,14 +280,14 @@ my_conv_rsa_public_key (void *cls,
MYSQL_BIND *qbind)
{
const struct GNUNET_CRYPTO_RsaPublicKey *rsa = qp->data;
- char *buf;
+ void *buf;
size_t buf_size;
(void) cls;
GNUNET_assert (1 == qp->num_params);
buf_size = GNUNET_CRYPTO_rsa_public_key_encode (rsa,
&buf);
- qbind->buffer = (void *) buf;
+ qbind->buffer = buf;
qbind->buffer_length = buf_size;
qbind->buffer_type = MYSQL_TYPE_BLOB;
return 1;
@@ -332,14 +332,14 @@ my_conv_rsa_signature (void *cls,
MYSQL_BIND *qbind)
{
const struct GNUNET_CRYPTO_RsaSignature *sig = qp->data;
- char *buf;
+ void *buf;
size_t buf_size;
(void) cls;
GNUNET_assert (1 == qp->num_params);
buf_size = GNUNET_CRYPTO_rsa_signature_encode (sig,
&buf);
- qbind->buffer = (void *) buf;
+ qbind->buffer = buf;
qbind->buffer_length = buf_size;
qbind->buffer_type = MYSQL_TYPE_BLOB;
return 1;
diff --git a/src/namecache/Makefile.am b/src/namecache/Makefile.am
index 5e80ea4c5..836a6b5d9 100644
--- a/src/namecache/Makefile.am
+++ b/src/namecache/Makefile.am
@@ -65,6 +65,7 @@ libgnunetnamecache_la_SOURCES = \
namecache.h
libgnunetnamecache_la_LIBADD = \
$(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \
+ $(top_builddir)/src/identity/libgnunetidentity.la \
$(top_builddir)/src/util/libgnunetutil.la \
$(GN_LIBINTL)
libgnunetnamecache_la_LDFLAGS = \
@@ -82,6 +83,7 @@ gnunet_namecache_SOURCES = \
gnunet-namecache.c
gnunet_namecache_LDADD = \
$(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \
+ $(top_builddir)/src/identity/libgnunetidentity.la \
$(top_builddir)/src/util/libgnunetutil.la \
libgnunetnamecache.la \
$(GN_LIBINTL)
@@ -91,6 +93,7 @@ gnunet_service_namecache_SOURCES = \
gnunet_service_namecache_LDADD = \
$(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \
+ $(top_builddir)/src/identity/libgnunetidentity.la \
$(top_builddir)/src/statistics/libgnunetstatistics.la \
$(top_builddir)/src/util/libgnunetutil.la \
libgnunetnamecache.la \
@@ -107,6 +110,8 @@ libgnunet_plugin_namecache_flat_la_SOURCES = \
libgnunet_plugin_namecache_flat_la_LIBADD = \
libgnunetnamecache.la \
$(top_builddir)/src/statistics/libgnunetstatistics.la \
+ $(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \
+ $(top_builddir)/src/identity/libgnunetidentity.la \
$(top_builddir)/src/util/libgnunetutil.la $(XLIBS) \
$(LTLIBINTL)
libgnunet_plugin_namecache_flat_la_LDFLAGS = \
@@ -118,6 +123,8 @@ libgnunet_plugin_namecache_sqlite_la_LIBADD = \
libgnunetnamecache.la \
$(top_builddir)/src/sq/libgnunetsq.la \
$(top_builddir)/src/statistics/libgnunetstatistics.la \
+ $(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \
+ $(top_builddir)/src/identity/libgnunetidentity.la \
$(top_builddir)/src/util/libgnunetutil.la $(XLIBS) -lsqlite3 \
$(LTLIBINTL)
libgnunet_plugin_namecache_sqlite_la_LDFLAGS = \
@@ -130,6 +137,8 @@ libgnunet_plugin_namecache_postgres_la_LIBADD = \
libgnunetnamecache.la \
$(top_builddir)/src/pq/libgnunetpq.la \
$(top_builddir)/src/statistics/libgnunetstatistics.la \
+ $(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \
+ $(top_builddir)/src/identity/libgnunetidentity.la \
$(top_builddir)/src/util/libgnunetutil.la $(XLIBS) -lpq \
$(LTLIBINTL)
libgnunet_plugin_namecache_postgres_la_LDFLAGS = \
diff --git a/src/namecache/gnunet-namecache.c b/src/namecache/gnunet-namecache.c
index 2e3c733e6..19f2a5766 100644
--- a/src/namecache/gnunet-namecache.c
+++ b/src/namecache/gnunet-namecache.c
@@ -51,7 +51,7 @@ static char *name;
/**
* Public key of the zone to look in.
*/
-static struct GNUNET_CRYPTO_EcdsaPublicKey pubkey;
+static struct GNUNET_IDENTITY_PublicKey pubkey;
/**
* Public key of the zone to look in, in ASCII.
@@ -177,7 +177,7 @@ run (void *cls,
}
if (GNUNET_OK !=
- GNUNET_CRYPTO_ecdsa_public_key_from_string (pkey, strlen (pkey),
&pubkey))
+ GNUNET_IDENTITY_public_key_from_string (pkey, &pubkey))
{
fprintf (stderr, _ ("Invalid public key for zone `%s'\n"), pkey);
GNUNET_SCHEDULER_shutdown ();
diff --git a/src/namecache/gnunet-service-namecache.c
b/src/namecache/gnunet-service-namecache.c
index 7cf216ce3..07bf30de9 100644
--- a/src/namecache/gnunet-service-namecache.c
+++ b/src/namecache/gnunet-service-namecache.c
@@ -184,40 +184,24 @@ handle_lookup_block_it (void *cls,
struct LookupBlockContext *lnc = cls;
struct GNUNET_MQ_Envelope *env;
struct LookupBlockResponseMessage *r;
- size_t esize;
size_t bsize;
- bsize = ntohl (block->purpose.size);
- if (bsize <
- (sizeof(struct GNUNET_CRYPTO_EccSignaturePurpose) + sizeof(struct
-
GNUNET_TIME_AbsoluteNBO)))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
- "Malformed block.");
- lnc->status = GNUNET_SYSERR;
- return;
- }
- esize = ntohl (block->purpose.size)
- - sizeof(struct GNUNET_CRYPTO_EccSignaturePurpose)
- - sizeof(struct GNUNET_TIME_AbsoluteNBO);
+ bsize = GNUNET_GNSRECORD_block_get_size (block);
env = GNUNET_MQ_msg_extra (r,
- esize,
+ bsize,
GNUNET_MESSAGE_TYPE_NAMECACHE_LOOKUP_BLOCK_RESPONSE);
r->gns_header.r_id = htonl (lnc->request_id);
- r->expire = block->expiration_time;
- r->signature = block->signature;
- r->derived_key = block->derived_key;
GNUNET_memcpy (&r[1],
- &block[1],
- esize);
+ block,
+ bsize);
GNUNET_STATISTICS_update (statistics,
"blocks found in cache",
1,
GNUNET_NO);
+ r->expire = GNUNET_TIME_absolute_hton (
+ GNUNET_GNSRECORD_block_get_expiration (block));
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Sending NAMECACHE_LOOKUP_BLOCK_RESPONSE message with expiration
time %s\n",
- GNUNET_STRINGS_absolute_time_to_string (
- GNUNET_TIME_absolute_ntoh (r->expire)));
+ "Sending NAMECACHE_LOOKUP_BLOCK_RESPONSE message\n");
GNUNET_MQ_send (lnc->nc->mq,
env);
}
@@ -314,20 +298,11 @@ handle_block_cache (void *cls,
GNUNET_NO);
esize = ntohs (rp_msg->gns_header.header.size) - sizeof(struct
BlockCacheMessage);
- block = GNUNET_malloc (sizeof(struct GNUNET_GNSRECORD_Block) + esize);
- block->signature = rp_msg->signature;
- block->derived_key = rp_msg->derived_key;
- block->purpose.size = htonl (sizeof(struct GNUNET_CRYPTO_EccSignaturePurpose)
- + sizeof(struct GNUNET_TIME_AbsoluteNBO)
- + esize);
- block->expiration_time = rp_msg->expire;
+ block = GNUNET_malloc (esize);
+ memcpy (block, &rp_msg[1], esize);
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Received NAMECACHE_BLOCK_CACHE message with expiration time
%s\n",
- GNUNET_STRINGS_absolute_time_to_string (
- GNUNET_TIME_absolute_ntoh (block->expiration_time)));
- GNUNET_memcpy (&block[1],
- &rp_msg[1],
- esize);
+ "Received NAMECACHE_BLOCK_CACHE message with type %u\n",
+ htonl (block->type));
res = GSN_database->cache_block (GSN_database->cls,
block);
GNUNET_free (block);
diff --git a/src/namecache/namecache.h b/src/namecache/namecache.h
index 1657662c2..43c8cf85f 100644
--- a/src/namecache/namecache.h
+++ b/src/namecache/namecache.h
@@ -92,7 +92,7 @@ struct LookupBlockResponseMessage
/**
* Derived public key.
*/
- struct GNUNET_CRYPTO_EcdsaPublicKey derived_key;
+ struct GNUNET_IDENTITY_PublicKey derived_key;
/* follwed by encrypted block data */
};
@@ -121,7 +121,7 @@ struct BlockCacheMessage
/**
* Derived public key.
*/
- struct GNUNET_CRYPTO_EcdsaPublicKey derived_key;
+ struct GNUNET_IDENTITY_PublicKey derived_key;
/* follwed by encrypted block data */
};
diff --git a/src/namecache/namecache_api.c b/src/namecache/namecache_api.c
index 0c904c9ed..fdbf142a7 100644
--- a/src/namecache/namecache_api.c
+++ b/src/namecache/namecache_api.c
@@ -225,19 +225,11 @@ handle_lookup_block_response (void *cls,
size = ntohs (msg->gns_header.header.size)
- sizeof(struct LookupBlockResponseMessage);
{
- char buf[size + sizeof(struct GNUNET_GNSRECORD_Block)] GNUNET_ALIGN;
+ char buf[size] GNUNET_ALIGN;
struct GNUNET_GNSRECORD_Block *block;
block = (struct GNUNET_GNSRECORD_Block *) buf;
- block->signature = msg->signature;
- block->derived_key = msg->derived_key;
- block->purpose.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_GNS_RECORD_SIGN);
- block->purpose.size = htonl (size
- + sizeof(struct GNUNET_TIME_AbsoluteNBO)
- + sizeof(struct
- GNUNET_CRYPTO_EccSignaturePurpose));
- block->expiration_time = msg->expire;
- GNUNET_memcpy (&block[1],
+ GNUNET_memcpy (block,
&msg[1],
size);
if (GNUNET_OK !=
@@ -483,11 +475,7 @@ GNUNET_NAMECACHE_block_cache (struct
GNUNET_NAMECACHE_Handle *h,
if (NULL == h->mq)
return NULL;
- blen = ntohl (block->purpose.size);
- GNUNET_assert (blen > (sizeof(struct GNUNET_TIME_AbsoluteNBO)
- + sizeof(struct GNUNET_CRYPTO_EccSignaturePurpose)));
- blen -= (sizeof(struct GNUNET_TIME_AbsoluteNBO)
- + sizeof(struct GNUNET_CRYPTO_EccSignaturePurpose));
+ blen = GNUNET_GNSRECORD_block_get_size (block);
rid = get_op_id (h);
qe = GNUNET_new (struct GNUNET_NAMECACHE_QueueEntry);
qe->nsh = h;
@@ -502,11 +490,8 @@ GNUNET_NAMECACHE_block_cache (struct
GNUNET_NAMECACHE_Handle *h,
blen,
GNUNET_MESSAGE_TYPE_NAMECACHE_BLOCK_CACHE);
msg->gns_header.r_id = htonl (rid);
- msg->expire = block->expiration_time;
- msg->signature = block->signature;
- msg->derived_key = block->derived_key;
GNUNET_memcpy (&msg[1],
- &block[1],
+ block,
blen);
GNUNET_MQ_send (h->mq,
env);
diff --git a/src/namecache/plugin_namecache_flat.c
b/src/namecache/plugin_namecache_flat.c
index 24f4f2570..eb7800051 100644
--- a/src/namecache/plugin_namecache_flat.c
+++ b/src/namecache/plugin_namecache_flat.c
@@ -207,10 +207,7 @@ store_and_free_entries (void *cls,
struct GNUNET_CRYPTO_HashAsciiEncoded query;
size_t block_size;
- block_size = ntohl (entry->block->purpose.size)
- + sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey)
- + sizeof(struct GNUNET_CRYPTO_EcdsaSignature);
-
+ block_size = GNUNET_GNSRECORD_block_get_size (entry->block);
GNUNET_STRINGS_base64_encode ((char *) entry->block,
block_size,
&block_b64);
@@ -277,7 +274,7 @@ expire_blocks (void *cls,
struct GNUNET_TIME_Absolute expiration;
now = GNUNET_TIME_absolute_get ();
- expiration = GNUNET_TIME_absolute_ntoh (entry->block->expiration_time);
+ expiration = GNUNET_GNSRECORD_block_get_expiration (entry->block);
if (0 == GNUNET_TIME_absolute_get_difference (now,
expiration).rel_value_us)
@@ -319,12 +316,9 @@ namecache_cache_block (void *cls,
size_t block_size;
namecache_expire_blocks (plugin);
- GNUNET_CRYPTO_hash (&block->derived_key,
- sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey),
- &query);
- block_size = ntohl (block->purpose.size)
- + sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey)
- + sizeof(struct GNUNET_CRYPTO_EcdsaSignature);
+ GNUNET_GNSRECORD_query_from_block (block,
+ &query);
+ block_size = GNUNET_GNSRECORD_block_get_size (block);
if (block_size > 64 * 65536)
{
GNUNET_break (0);
diff --git a/src/namecache/plugin_namecache_postgres.c
b/src/namecache/plugin_namecache_postgres.c
index 0e947e9c5..ae0f71a1f 100644
--- a/src/namecache/plugin_namecache_postgres.c
+++ b/src/namecache/plugin_namecache_postgres.c
@@ -64,15 +64,13 @@ database_setup (struct Plugin *plugin)
" query BYTEA NOT NULL DEFAULT '',"
" block BYTEA NOT NULL DEFAULT '',"
" expiration_time BIGINT NOT NULL DEFAULT 0"
- ")"
- "WITH OIDS");
+ ")");
struct GNUNET_PQ_ExecuteStatement es_default =
GNUNET_PQ_make_execute ("CREATE TABLE IF NOT EXISTS ns096blocks ("
" query BYTEA NOT NULL DEFAULT '',"
" block BYTEA NOT NULL DEFAULT '',"
" expiration_time BIGINT NOT NULL DEFAULT 0"
- ")"
- "WITH OIDS");
+ ")");
const struct GNUNET_PQ_ExecuteStatement *cr;
if (GNUNET_YES ==
@@ -155,11 +153,11 @@ namecache_postgres_expire_blocks (struct Plugin *plugin)
static void
delete_old_block (struct Plugin *plugin,
const struct GNUNET_HashCode *query,
- struct GNUNET_TIME_AbsoluteNBO expiration_time)
+ struct GNUNET_TIME_Absolute expiration_time)
{
struct GNUNET_PQ_QueryParam params[] = {
GNUNET_PQ_query_param_auto_from_type (query),
- GNUNET_PQ_query_param_absolute_time_nbo (&expiration_time),
+ GNUNET_PQ_query_param_absolute_time (&expiration_time),
GNUNET_PQ_query_param_end
};
enum GNUNET_DB_QueryStatus res;
@@ -184,21 +182,20 @@ namecache_postgres_cache_block (void *cls,
{
struct Plugin *plugin = cls;
struct GNUNET_HashCode query;
- size_t block_size = ntohl (block->purpose.size)
- + sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey)
- + sizeof(struct GNUNET_CRYPTO_EcdsaSignature);
+ size_t block_size = GNUNET_GNSRECORD_block_get_size (block);
+ struct GNUNET_TIME_Absolute exp;
+ exp = GNUNET_GNSRECORD_block_get_expiration (block);
struct GNUNET_PQ_QueryParam params[] = {
GNUNET_PQ_query_param_auto_from_type (&query),
GNUNET_PQ_query_param_fixed_size (block, block_size),
- GNUNET_PQ_query_param_absolute_time_nbo (&block->expiration_time),
+ GNUNET_PQ_query_param_absolute_time (&exp),
GNUNET_PQ_query_param_end
};
enum GNUNET_DB_QueryStatus res;
namecache_postgres_expire_blocks (plugin);
- GNUNET_CRYPTO_hash (&block->derived_key,
- sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey),
- &query);
+ GNUNET_GNSRECORD_query_from_block (block,
+ &query);
if (block_size > 64 * 65536)
{
GNUNET_break (0);
@@ -206,7 +203,7 @@ namecache_postgres_cache_block (void *cls,
}
delete_old_block (plugin,
&query,
- block->expiration_time);
+ exp);
res = GNUNET_PQ_eval_prepared_non_select (plugin->dbh,
"cache_block",
@@ -265,10 +262,7 @@ namecache_postgres_lookup_block (void *cls,
"Ending iteration (no more results)\n");
return GNUNET_NO;
}
- if ((bsize < sizeof(*block)) ||
- (bsize != ntohl (block->purpose.size)
- + sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey)
- + sizeof(struct GNUNET_CRYPTO_EcdsaSignature)))
+ if ((bsize < sizeof(*block)))
{
GNUNET_break (0);
LOG (GNUNET_ERROR_TYPE_DEBUG,
diff --git a/src/namecache/plugin_namecache_sqlite.c
b/src/namecache/plugin_namecache_sqlite.c
index c9d79ba2d..82008c837 100644
--- a/src/namecache/plugin_namecache_sqlite.c
+++ b/src/namecache/plugin_namecache_sqlite.c
@@ -332,9 +332,7 @@ namecache_sqlite_cache_block (void *cls,
struct Plugin *plugin = cls;
struct GNUNET_HashCode query;
struct GNUNET_TIME_Absolute expiration;
- size_t block_size = ntohl (block->purpose.size)
- + sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey)
- + sizeof(struct GNUNET_CRYPTO_EcdsaSignature);
+ size_t block_size = GNUNET_GNSRECORD_block_get_size (block);
struct GNUNET_SQ_QueryParam del_params[] = {
GNUNET_SQ_query_param_auto_from_type (&query),
GNUNET_SQ_query_param_absolute_time (&expiration),
@@ -356,10 +354,9 @@ namecache_sqlite_cache_block (void *cls,
last_expire = GNUNET_TIME_absolute_get ();
namecache_sqlite_expire_blocks (plugin);
}
- GNUNET_CRYPTO_hash (&block->derived_key,
- sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey),
- &query);
- expiration = GNUNET_TIME_absolute_ntoh (block->expiration_time);
+ GNUNET_assert (GNUNET_OK ==
+ GNUNET_GNSRECORD_query_from_block (block, &query));
+ expiration = GNUNET_GNSRECORD_block_get_expiration (block);
GNUNET_log (GNUNET_ERROR_TYPE_INFO,
"Caching new version of block %s (expires %s)\n",
GNUNET_h2s (&query),
@@ -498,10 +495,7 @@ namecache_sqlite_lookup_block (void *cls,
GNUNET_break (0);
ret = GNUNET_SYSERR;
}
- else if ((block_size < sizeof(struct GNUNET_GNSRECORD_Block)) ||
- (ntohl (block->purpose.size)
- + sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey)
- + sizeof(struct GNUNET_CRYPTO_EcdsaSignature) != block_size))
+ else if ((block_size < sizeof(struct GNUNET_GNSRECORD_Block)))
{
GNUNET_break (0);
GNUNET_SQ_cleanup_result (rs);
diff --git a/src/namecache/test_namecache_api_cache_block.c
b/src/namecache/test_namecache_api_cache_block.c
index 12b72d93b..310c4de42 100644
--- a/src/namecache/test_namecache_api_cache_block.c
+++ b/src/namecache/test_namecache_api_cache_block.c
@@ -39,9 +39,9 @@ static struct GNUNET_NAMECACHE_Handle *nsh;
static struct GNUNET_SCHEDULER_Task *endbadly_task;
-static struct GNUNET_CRYPTO_EcdsaPrivateKey privkey;
+static struct GNUNET_IDENTITY_PrivateKey privkey;
-static struct GNUNET_CRYPTO_EcdsaPublicKey pubkey;
+static struct GNUNET_IDENTITY_PublicKey pubkey;
static int res;
@@ -172,23 +172,13 @@ run (void *cls,
{
struct GNUNET_GNSRECORD_Data rd;
struct GNUNET_GNSRECORD_Block *block;
- char *hostkey_file;
const char *name = "dummy.dummy.gnunet";
endbadly_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT,
&endbadly, NULL);
- GNUNET_asprintf (&hostkey_file,
- "zonefiles%s%s",
- DIR_SEPARATOR_STR,
-
"N0UJMP015AFUNR2BTNM3FKPBLG38913BL8IDMCO2H0A1LIB81960.zkey");
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Using zonekey file `%s' \n",
- hostkey_file);
- GNUNET_assert (GNUNET_SYSERR !=
- GNUNET_CRYPTO_ecdsa_key_from_file (hostkey_file,
- GNUNET_YES,
- &privkey));
- GNUNET_free (hostkey_file);
- GNUNET_CRYPTO_ecdsa_key_get_public (&privkey, &pubkey);
+ privkey.type = htonl (GNUNET_GNSRECORD_TYPE_PKEY);
+ GNUNET_CRYPTO_ecdsa_key_create (&privkey.ecdsa_key);
+ GNUNET_IDENTITY_key_get_public (&privkey, &pubkey);
rd.expiration_time = GNUNET_TIME_absolute_get ().abs_value_us + 10000000000;
diff --git a/src/namestore/Makefile.am b/src/namestore/Makefile.am
index 40ac64197..3a92f98c9 100644
--- a/src/namestore/Makefile.am
+++ b/src/namestore/Makefile.am
@@ -131,6 +131,7 @@ libgnunet_plugin_rest_namestore_la_LIBADD = \
$(top_builddir)/src/identity/libgnunetidentity.la \
$(top_builddir)/src/json/libgnunetjson.la \
$(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \
+ $(top_builddir)/src/gnsrecord/libgnunetgnsrecordjson.la \
$(top_builddir)/src/util/libgnunetutil.la $(XLIBS) \
$(LTLIBINTL) -ljansson $(MHD_LIBS)
libgnunet_plugin_rest_namestore_la_LDFLAGS = \
@@ -144,6 +145,7 @@ libgnunetnamestore_la_SOURCES = \
namestore.h
libgnunetnamestore_la_LIBADD = \
$(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \
+ $(top_builddir)/src/identity/libgnunetidentity.la \
$(top_builddir)/src/statistics/libgnunetstatistics.la \
$(top_builddir)/src/util/libgnunetutil.la \
$(GN_LIBINTL)
@@ -190,6 +192,7 @@ gnunet_service_namestore_SOURCES = \
gnunet_service_namestore_LDADD = \
$(top_builddir)/src/namecache/libgnunetnamecache.la \
$(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \
+ $(top_builddir)/src/identity/libgnunetidentity.la \
$(top_builddir)/src/statistics/libgnunetstatistics.la \
$(top_builddir)/src/util/libgnunetutil.la \
libgnunetnamestore.la \
@@ -200,7 +203,8 @@ gnunet_service_namestore_LDADD = \
libgnunet_plugin_namestore_flat_la_SOURCES = \
plugin_namestore_flat.c
libgnunet_plugin_namestore_flat_la_LIBADD = \
- $(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \
+ $(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \
+ $(top_builddir)/src/identity/libgnunetidentity.la \
$(top_builddir)/src/statistics/libgnunetstatistics.la \
$(top_builddir)/src/util/libgnunetutil.la $(XLIBS) \
$(LTLIBINTL)
@@ -212,6 +216,7 @@ libgnunet_plugin_namestore_sqlite_la_SOURCES = \
plugin_namestore_sqlite.c
libgnunet_plugin_namestore_sqlite_la_LIBADD = \
$(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \
+ $(top_builddir)/src/identity/libgnunetidentity.la \
$(top_builddir)/src/sq/libgnunetsq.la \
$(top_builddir)/src/statistics/libgnunetstatistics.la \
$(top_builddir)/src/util/libgnunetutil.la $(XLIBS) -lsqlite3 \
@@ -223,6 +228,7 @@ libgnunet_plugin_namestore_postgres_la_SOURCES = \
plugin_namestore_postgres.c
libgnunet_plugin_namestore_postgres_la_LIBADD = \
$(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \
+ $(top_builddir)/src/identity/libgnunetidentity.la \
$(top_builddir)/src/pq/libgnunetpq.la \
$(top_builddir)/src/statistics/libgnunetstatistics.la \
$(top_builddir)/src/util/libgnunetutil.la $(XLIBS) -lpq \
@@ -236,6 +242,7 @@ test_namestore_api_store_flat_LDADD = \
$(top_builddir)/src/testing/libgnunettesting.la \
$(top_builddir)/src/util/libgnunetutil.la \
$(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \
+ $(top_builddir)/src/identity/libgnunetidentity.la \
libgnunetnamestore.la
test_namestore_api_store_sqlite_SOURCES = \
@@ -244,6 +251,7 @@ test_namestore_api_store_sqlite_LDADD = \
$(top_builddir)/src/testing/libgnunettesting.la \
$(top_builddir)/src/util/libgnunetutil.la \
$(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \
+ $(top_builddir)/src/identity/libgnunetidentity.la \
libgnunetnamestore.la
test_namestore_api_store_postgres_SOURCES = \
@@ -252,6 +260,7 @@ test_namestore_api_store_postgres_LDADD = \
$(top_builddir)/src/testing/libgnunettesting.la \
$(top_builddir)/src/util/libgnunetutil.la \
$(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \
+ $(top_builddir)/src/identity/libgnunetidentity.la \
libgnunetnamestore.la
test_namestore_api_store_update_flat_SOURCES = \
diff --git a/src/namestore/gnunet-namestore-fcfsd.c
b/src/namestore/gnunet-namestore-fcfsd.c
index 34641d22e..22d108067 100644
--- a/src/namestore/gnunet-namestore-fcfsd.c
+++ b/src/namestore/gnunet-namestore-fcfsd.c
@@ -164,7 +164,7 @@ struct Request
*/
char public_key[128];
- struct GNUNET_CRYPTO_EcdsaPublicKey pub;
+ struct GNUNET_IDENTITY_PublicKey pub;
};
/**
@@ -211,7 +211,7 @@ static struct GNUNET_NAMESTORE_Handle *ns;
/**
* Private key for the fcfsd zone.
*/
-static struct GNUNET_CRYPTO_EcdsaPrivateKey fcfs_zone_pkey;
+static struct GNUNET_IDENTITY_PrivateKey fcfs_zone_pkey;
/**
* Connection to identity service.
@@ -306,7 +306,6 @@ zone_iteration_end (void *cls)
/* return static form */
GNUNET_asprintf (&full_page,
ZONEINFO_PAGE,
- zr->zoneinfo,
zr->zoneinfo);
response = MHD_create_response_from_buffer (strlen (full_page),
(void *) full_page,
@@ -332,7 +331,7 @@ zone_iteration_end (void *cls)
*/
static void
iterate_cb (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone_key,
+ const struct GNUNET_IDENTITY_PrivateKey *zone_key,
const char *name,
unsigned int rd_len,
const struct GNUNET_GNSRECORD_Data *rd)
@@ -350,7 +349,8 @@ iterate_cb (void *cls,
return;
}
- if (GNUNET_GNSRECORD_TYPE_PKEY != rd->record_type)
+ if ((GNUNET_GNSRECORD_TYPE_PKEY != rd->record_type) &&
+ (GNUNET_GNSRECORD_TYPE_EDKEY != rd->record_type))
{
GNUNET_NAMESTORE_zone_iterator_next (zr->list_it,
1);
@@ -615,13 +615,14 @@ zone_to_name_error (void *cls)
*/
static void
zone_to_name_cb (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone_key,
+ const struct GNUNET_IDENTITY_PrivateKey *zone_key,
const char *name,
unsigned int rd_count,
const struct GNUNET_GNSRECORD_Data *rd)
{
struct Request *request = cls;
struct GNUNET_GNSRECORD_Data r;
+ char *rdata;
(void) rd;
(void) zone_key;
@@ -636,10 +637,21 @@ zone_to_name_cb (void *cls,
run_httpd_now ();
return;
}
- r.data = &request->pub;
- r.data_size = sizeof(request->pub);
+ if (GNUNET_OK != GNUNET_GNSRECORD_data_from_identity (&request->pub,
+ &rdata,
+ &r.data_size,
+ &r.record_type))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+ _ ("Error creating record data.\n"));
+ request->phase = RP_FAIL;
+ MHD_resume_connection (request->con);
+ run_httpd_now ();
+ return;
+ }
+
+ r.data = rdata;
r.expiration_time = UINT64_MAX;
- r.record_type = GNUNET_GNSRECORD_TYPE_PKEY;
r.flags = GNUNET_GNSRECORD_RF_NONE;
request->qe = GNUNET_NAMESTORE_records_store (ns,
&fcfs_zone_pkey,
@@ -647,6 +659,7 @@ zone_to_name_cb (void *cls,
1, &r,
&put_continuation,
request);
+ GNUNET_free (rdata);
}
@@ -677,7 +690,7 @@ lookup_it_error (void *cls)
*/
static void
lookup_it_processor (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zonekey,
+ const struct GNUNET_IDENTITY_PrivateKey *zonekey,
const char *label,
unsigned int rd_count,
const struct GNUNET_GNSRECORD_Data *rd)
@@ -712,9 +725,8 @@ lookup_it_finished (void *cls)
return;
}
if (GNUNET_OK !=
- GNUNET_CRYPTO_ecdsa_public_key_from_string (request->public_key,
- strlen (request->public_key),
- &request->pub))
+ GNUNET_IDENTITY_public_key_from_string (request->public_key,
+ &request->pub))
{
GNUNET_break (0);
request->phase = RP_FAIL;
@@ -767,7 +779,7 @@ create_response (void *cls,
{
struct MHD_Response *response;
struct Request *request;
- struct GNUNET_CRYPTO_EcdsaPublicKey pub;
+ struct GNUNET_IDENTITY_PublicKey pub;
MHD_RESULT ret;
(void) cls;
@@ -822,10 +834,8 @@ create_response (void *cls,
request->pp = NULL;
}
if (GNUNET_OK !=
- GNUNET_CRYPTO_ecdsa_public_key_from_string (request->public_key,
- strlen (
- request->public_key),
- &pub))
+ GNUNET_IDENTITY_public_key_from_string (request->public_key,
+ &pub))
{
/* parse error */
return fill_s_reply ("Failed to parse given public key",
@@ -1211,7 +1221,8 @@ main (int argc,
options,
&run, NULL)) ? 0 : 1;
GNUNET_free_nz ((void *) argv);
- GNUNET_CRYPTO_ecdsa_key_clear (&fcfs_zone_pkey);
+ // FIXME
+ // GNUNET_CRYPTO_ecdsa_key_clear (&fcfs_zone_pkey);
return ret;
}
diff --git a/src/namestore/gnunet-namestore.c b/src/namestore/gnunet-namestore.c
index 07d045b90..92d2cf627 100644
--- a/src/namestore/gnunet-namestore.c
+++ b/src/namestore/gnunet-namestore.c
@@ -59,7 +59,7 @@ static struct GNUNET_NAMESTORE_Handle *ns;
/**
* Private key for the our zone.
*/
-static struct GNUNET_CRYPTO_EcdsaPrivateKey zone_pkey;
+static struct GNUNET_IDENTITY_PrivateKey zone_pkey;
/**
* Handle to identity lookup.
@@ -496,7 +496,7 @@ display_record (const char *rname,
*/
static void
display_record_iterator (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone_key,
+ const struct GNUNET_IDENTITY_PrivateKey *zone_key,
const char *rname,
unsigned int rd_len,
const struct GNUNET_GNSRECORD_Data *rd)
@@ -519,7 +519,7 @@ display_record_iterator (void *cls,
*/
static void
display_record_monitor (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone_key,
+ const struct GNUNET_IDENTITY_PrivateKey *zone_key,
const char *rname,
unsigned int rd_len,
const struct GNUNET_GNSRECORD_Data *rd)
@@ -542,7 +542,7 @@ display_record_monitor (void *cls,
*/
static void
display_record_lookup (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone_key,
+ const struct GNUNET_IDENTITY_PrivateKey *zone_key,
const char *rname,
unsigned int rd_len,
const struct GNUNET_GNSRECORD_Data *rd)
@@ -622,7 +622,7 @@ add_error_cb (void *cls)
*/
static void
get_existing_record (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone_key,
+ const struct GNUNET_IDENTITY_PrivateKey *zone_key,
const char *rec_name,
unsigned int rd_count,
const struct GNUNET_GNSRECORD_Data *rd)
@@ -661,11 +661,11 @@ get_existing_record (void *cls,
return;
case GNUNET_GNSRECORD_TYPE_PKEY:
+ case GNUNET_GNSRECORD_TYPE_EDKEY:
fprintf (
stderr,
_ (
- "A %s record exists already under `%s', no other records can be
added.\n"),
- "PKEY",
+ "A zone key record exists already under `%s', no other records can
be added.\n"),
rec_name);
ret = 1;
test_finished ();
@@ -703,13 +703,13 @@ get_existing_record (void *cls,
break;
case GNUNET_GNSRECORD_TYPE_PKEY:
+ case GNUNET_GNSRECORD_TYPE_EDKEY:
if (0 != rd_count)
{
fprintf (stderr,
_ (
- "Records already exist under `%s', cannot add `%s'
record.\n"),
- rec_name,
- "PKEY");
+ "Records already exist under `%s', cannot add record.\n"),
+ rec_name);
ret = 1;
test_finished ();
return;
@@ -781,7 +781,7 @@ reverse_error_cb (void *cls)
*/
static void
handle_reverse_lookup (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
+ const struct GNUNET_IDENTITY_PrivateKey *zone,
const char *label,
unsigned int rd_count,
const struct GNUNET_GNSRECORD_Data *rd)
@@ -826,7 +826,7 @@ del_lookup_error_cb (void *cls)
*/
static void
del_monitor (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
+ const struct GNUNET_IDENTITY_PrivateKey *zone,
const char *label,
unsigned int rd_count,
const struct GNUNET_GNSRECORD_Data *rd)
@@ -1187,12 +1187,11 @@ run_with_zone_pkey (const struct
GNUNET_CONFIGURATION_Handle *cfg)
}
if (NULL != reverse_pkey)
{
- struct GNUNET_CRYPTO_EcdsaPublicKey pubkey;
+ struct GNUNET_IDENTITY_PublicKey pubkey;
if (GNUNET_OK !=
- GNUNET_CRYPTO_ecdsa_public_key_from_string (reverse_pkey,
- strlen (reverse_pkey),
- &pubkey))
+ GNUNET_IDENTITY_public_key_from_string (reverse_pkey,
+ &pubkey))
{
fprintf (stderr,
_ ("Invalid public key for reverse lookup `%s'\n"),
@@ -1211,12 +1210,12 @@ run_with_zone_pkey (const struct
GNUNET_CONFIGURATION_Handle *cfg)
{
char sh[105];
char sname[64];
- struct GNUNET_CRYPTO_EcdsaPublicKey pkey;
+ struct GNUNET_IDENTITY_PublicKey pkey;
GNUNET_STRINGS_utf8_tolower (uri, uri);
if ((2 != (sscanf (uri, "gnunet://gns/%52s/%63s", sh, sname))) ||
(GNUNET_OK !=
- GNUNET_CRYPTO_ecdsa_public_key_from_string (sh, strlen (sh), &pkey)))
+ GNUNET_IDENTITY_public_key_from_string (sh, &pkey)))
{
fprintf (stderr, _ ("Invalid URI `%s'\n"), uri);
GNUNET_SCHEDULER_shutdown ();
@@ -1242,8 +1241,8 @@ run_with_zone_pkey (const struct
GNUNET_CONFIGURATION_Handle *cfg)
}
memset (&rd, 0, sizeof(rd));
rd.data = &pkey;
- rd.data_size = sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey);
- rd.record_type = GNUNET_GNSRECORD_TYPE_PKEY;
+ rd.data_size = GNUNET_IDENTITY_key_get_length (&pkey);
+ rd.record_type = ntohl (pkey.type);
rd.expiration_time = etime;
if (GNUNET_YES == etime_is_rel)
rd.flags |= GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION;
@@ -1704,11 +1703,13 @@ main (int argc, char *const *argv)
NULL)))
{
GNUNET_free_nz ((void *) argv);
- GNUNET_CRYPTO_ecdsa_key_clear (&zone_pkey);
+ //FIXME
+ //GNUNET_CRYPTO_ecdsa_key_clear (&zone_pkey);
return lret;
}
GNUNET_free_nz ((void *) argv);
- GNUNET_CRYPTO_ecdsa_key_clear (&zone_pkey);
+ //FIXME
+ //GNUNET_CRYPTO_ecdsa_key_clear (&zone_pkey);
return ret;
}
diff --git a/src/namestore/gnunet-service-namestore.c
b/src/namestore/gnunet-service-namestore.c
index b24bb2952..d6774b37b 100644
--- a/src/namestore/gnunet-service-namestore.c
+++ b/src/namestore/gnunet-service-namestore.c
@@ -82,7 +82,7 @@ struct ZoneIteration
/**
* Key of the zone we are iterating over.
*/
- struct GNUNET_CRYPTO_EcdsaPrivateKey zone;
+ struct GNUNET_IDENTITY_PrivateKey zone;
/**
* Last sequence number in the zone iteration used to address next
@@ -174,7 +174,7 @@ struct ZoneMonitor
/**
* Private key of the zone.
*/
- struct GNUNET_CRYPTO_EcdsaPrivateKey zone;
+ struct GNUNET_IDENTITY_PrivateKey zone;
/**
* Task active during initial iteration.
@@ -314,7 +314,7 @@ struct NickCache
/**
* Zone the cache entry is for.
*/
- struct GNUNET_CRYPTO_EcdsaPrivateKey zone;
+ struct GNUNET_IDENTITY_PrivateKey zone;
/**
* Cached record data.
@@ -336,7 +336,7 @@ static struct NickCache nick_cache[NC_SIZE];
/**
* Public key of all zeros.
*/
-static const struct GNUNET_CRYPTO_EcdsaPrivateKey zero;
+static const struct GNUNET_IDENTITY_PrivateKey zero;
/**
* Configuration handle.
@@ -481,7 +481,7 @@ free_store_activity (struct StoreActivity *sa)
static void
lookup_nick_it (void *cls,
uint64_t seq,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *private_key,
+ const struct GNUNET_IDENTITY_PrivateKey *private_key,
const char *label,
unsigned int rd_count,
const struct GNUNET_GNSRECORD_Data *rd)
@@ -521,7 +521,7 @@ lookup_nick_it (void *cls,
* @param nick nick entry to cache
*/
static void
-cache_nick (const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
+cache_nick (const struct GNUNET_IDENTITY_PrivateKey *zone,
const struct GNUNET_GNSRECORD_Data *nick)
{
struct NickCache *oldest;
@@ -564,9 +564,9 @@ cache_nick (const struct GNUNET_CRYPTO_EcdsaPrivateKey
*zone,
* @return NULL if no NICK record was found
*/
static struct GNUNET_GNSRECORD_Data *
-get_nick_record (const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone)
+get_nick_record (const struct GNUNET_IDENTITY_PrivateKey *zone)
{
- struct GNUNET_CRYPTO_EcdsaPublicKey pub;
+ struct GNUNET_IDENTITY_PublicKey pub;
struct GNUNET_GNSRECORD_Data *nick;
int res;
@@ -606,7 +606,7 @@ get_nick_record (const struct GNUNET_CRYPTO_EcdsaPrivateKey
*zone)
__LINE__);
if (1 == do_log)
{
- GNUNET_CRYPTO_ecdsa_key_get_public (zone, &pub);
+ GNUNET_IDENTITY_key_get_public (zone, &pub);
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG | GNUNET_ERROR_TYPE_BULK,
"No nick name set for zone `%s'\n",
GNUNET_GNSRECORD_z2s (&pub));
@@ -720,7 +720,7 @@ merge_with_nick_records (const struct GNUNET_GNSRECORD_Data
*nick_rd,
static void
send_lookup_response (struct NamestoreClient *nc,
uint32_t request_id,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone_key,
+ const struct GNUNET_IDENTITY_PrivateKey *zone_key,
const char *name,
unsigned int rd_count,
const struct GNUNET_GNSRECORD_Data *rd)
@@ -899,14 +899,14 @@ static void
refresh_block (struct NamestoreClient *nc,
struct ZoneIteration *zi,
uint32_t rid,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone_key,
+ const struct GNUNET_IDENTITY_PrivateKey *zone_key,
const char *name,
unsigned int rd_count,
const struct GNUNET_GNSRECORD_Data *rd)
{
struct GNUNET_GNSRECORD_Block *block;
struct CacheOperation *cop;
- struct GNUNET_CRYPTO_EcdsaPublicKey pkey;
+ struct GNUNET_IDENTITY_PublicKey pkey;
struct GNUNET_GNSRECORD_Data *nick;
struct GNUNET_GNSRECORD_Data *res;
unsigned int res_count;
@@ -946,7 +946,7 @@ refresh_block (struct NamestoreClient *nc,
block =
GNUNET_GNSRECORD_block_create (zone_key, exp_time, name, res, res_count);
GNUNET_assert (NULL != block);
- GNUNET_CRYPTO_ecdsa_key_get_public (zone_key, &pkey);
+ GNUNET_IDENTITY_key_get_public (zone_key, &pkey);
GNUNET_log (
GNUNET_ERROR_TYPE_DEBUG,
"Caching block for label `%s' with %u records and expiration %s in zone
`%s' in namecache\n",
@@ -1214,7 +1214,7 @@ struct RecordLookupContext
static void
lookup_it (void *cls,
uint64_t seq,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *private_key,
+ const struct GNUNET_IDENTITY_PrivateKey *private_key,
const char *label,
unsigned int rd_count,
const struct GNUNET_GNSRECORD_Data *rd)
@@ -1605,7 +1605,7 @@ struct ZoneToNameCtx
static void
handle_zone_to_name_it (void *cls,
uint64_t seq,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone_key,
+ const struct GNUNET_IDENTITY_PrivateKey *zone_key,
const char *name,
unsigned int rd_count,
const struct GNUNET_GNSRECORD_Data *rd)
@@ -1738,7 +1738,7 @@ struct ZoneIterationProcResult
static void
zone_iterate_proc (void *cls,
uint64_t seq,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone_key,
+ const struct GNUNET_IDENTITY_PrivateKey *zone_key,
const char *name,
unsigned int rd_count,
const struct GNUNET_GNSRECORD_Data *rd)
@@ -2009,7 +2009,7 @@ monitor_iteration_next (void *cls);
static void
monitor_iterate_cb (void *cls,
uint64_t seq,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone_key,
+ const struct GNUNET_IDENTITY_PrivateKey *zone_key,
const char *name,
unsigned int rd_count,
const struct GNUNET_GNSRECORD_Data *rd)
diff --git a/src/namestore/gnunet-zoneimport.c
b/src/namestore/gnunet-zoneimport.c
index 5b4e41475..ce62b52d5 100644
--- a/src/namestore/gnunet-zoneimport.c
+++ b/src/namestore/gnunet-zoneimport.c
@@ -96,7 +96,7 @@ struct Zone
/**
* Private key of the zone.
*/
- struct GNUNET_CRYPTO_EcdsaPrivateKey key;
+ struct GNUNET_IDENTITY_PrivateKey key;
};
@@ -1405,7 +1405,7 @@ ns_lookup_error_cb (void *cls)
*/
static void
ns_lookup_result_cb (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *key,
+ const struct GNUNET_IDENTITY_PrivateKey *key,
const char *label,
unsigned int rd_count,
const struct GNUNET_GNSRECORD_Data *rd)
diff --git a/src/namestore/namestore.h b/src/namestore/namestore.h
index 6f45ab1c1..fd9a8ed47 100644
--- a/src/namestore/namestore.h
+++ b/src/namestore/namestore.h
@@ -90,7 +90,7 @@ struct RecordStoreMessage
/**
* The private key of the authority.
*/
- struct GNUNET_CRYPTO_EcdsaPrivateKey private_key;
+ struct GNUNET_IDENTITY_PrivateKey private_key;
/* followed by:
* name with length name_len
@@ -134,7 +134,7 @@ struct LabelLookupMessage
/**
* The private key of the zone to look up in
*/
- struct GNUNET_CRYPTO_EcdsaPrivateKey zone;
+ struct GNUNET_IDENTITY_PrivateKey zone;
/* followed by:
* name with length name_len
@@ -176,7 +176,7 @@ struct LabelLookupResponseMessage
/**
* The private key of the authority.
*/
- struct GNUNET_CRYPTO_EcdsaPrivateKey private_key;
+ struct GNUNET_IDENTITY_PrivateKey private_key;
/* followed by:
* name with length name_len
@@ -198,12 +198,12 @@ struct ZoneToNameMessage
/**
* The private key of the zone to look up in
*/
- struct GNUNET_CRYPTO_EcdsaPrivateKey zone;
+ struct GNUNET_IDENTITY_PrivateKey zone;
/**
* The public key of the target zone
*/
- struct GNUNET_CRYPTO_EcdsaPublicKey value_zone;
+ struct GNUNET_IDENTITY_PublicKey value_zone;
};
@@ -241,7 +241,7 @@ struct ZoneToNameResponseMessage
/**
* The private key of the zone that contained the name.
*/
- struct GNUNET_CRYPTO_EcdsaPrivateKey zone;
+ struct GNUNET_IDENTITY_PrivateKey zone;
/* followed by:
* name with length name_len
@@ -283,7 +283,7 @@ struct RecordResultMessage
/**
* The private key of the authority.
*/
- struct GNUNET_CRYPTO_EcdsaPrivateKey private_key;
+ struct GNUNET_IDENTITY_PrivateKey private_key;
/* followed by:
* name with length name_len
@@ -311,7 +311,7 @@ struct ZoneMonitorStartMessage
/**
* Zone key.
*/
- struct GNUNET_CRYPTO_EcdsaPrivateKey zone;
+ struct GNUNET_IDENTITY_PrivateKey zone;
};
@@ -352,7 +352,7 @@ struct ZoneIterationStartMessage
/**
* Zone key. All zeros for "all zones".
*/
- struct GNUNET_CRYPTO_EcdsaPrivateKey zone;
+ struct GNUNET_IDENTITY_PrivateKey zone;
};
diff --git a/src/namestore/namestore_api.c b/src/namestore/namestore_api.c
index f383f8b4a..c845b5019 100644
--- a/src/namestore/namestore_api.c
+++ b/src/namestore/namestore_api.c
@@ -174,7 +174,7 @@ struct GNUNET_NAMESTORE_ZoneIterator
/**
* Private key of the zone.
*/
- struct GNUNET_CRYPTO_EcdsaPrivateKey zone;
+ struct GNUNET_IDENTITY_PrivateKey zone;
/**
* The operation id this zone iteration operation has
@@ -493,7 +493,7 @@ handle_lookup_result (void *cls, const struct
LabelLookupResponseMessage *msg)
static int
check_record_result (void *cls, const struct RecordResultMessage *msg)
{
- static struct GNUNET_CRYPTO_EcdsaPrivateKey priv_dummy;
+ static struct GNUNET_IDENTITY_PrivateKey priv_dummy;
const char *name;
size_t msg_len;
size_t name_len;
@@ -981,7 +981,7 @@ warn_delay (void *cls)
struct GNUNET_NAMESTORE_QueueEntry *
GNUNET_NAMESTORE_records_store (
struct GNUNET_NAMESTORE_Handle *h,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *pkey,
+ const struct GNUNET_IDENTITY_PrivateKey *pkey,
const char *label,
unsigned int rd_count,
const struct GNUNET_GNSRECORD_Data *rd,
@@ -1080,7 +1080,7 @@ GNUNET_NAMESTORE_records_store (
struct GNUNET_NAMESTORE_QueueEntry *
GNUNET_NAMESTORE_records_lookup (
struct GNUNET_NAMESTORE_Handle *h,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *pkey,
+ const struct GNUNET_IDENTITY_PrivateKey *pkey,
const char *label,
GNUNET_SCHEDULER_TaskCallback error_cb,
void *error_cb_cls,
@@ -1140,8 +1140,8 @@ GNUNET_NAMESTORE_records_lookup (
struct GNUNET_NAMESTORE_QueueEntry *
GNUNET_NAMESTORE_zone_to_name (
struct GNUNET_NAMESTORE_Handle *h,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
- const struct GNUNET_CRYPTO_EcdsaPublicKey *value_zone,
+ const struct GNUNET_IDENTITY_PrivateKey *zone,
+ const struct GNUNET_IDENTITY_PublicKey *value_zone,
GNUNET_SCHEDULER_TaskCallback error_cb,
void *error_cb_cls,
GNUNET_NAMESTORE_RecordMonitor proc,
@@ -1196,7 +1196,7 @@ GNUNET_NAMESTORE_zone_to_name (
struct GNUNET_NAMESTORE_ZoneIterator *
GNUNET_NAMESTORE_zone_iteration_start (
struct GNUNET_NAMESTORE_Handle *h,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
+ const struct GNUNET_IDENTITY_PrivateKey *zone,
GNUNET_SCHEDULER_TaskCallback error_cb,
void *error_cb_cls,
GNUNET_NAMESTORE_RecordMonitor proc,
diff --git a/src/namestore/namestore_api_monitor.c
b/src/namestore/namestore_api_monitor.c
index 9dc955544..6670e54ce 100644
--- a/src/namestore/namestore_api_monitor.c
+++ b/src/namestore/namestore_api_monitor.c
@@ -82,7 +82,7 @@ struct GNUNET_NAMESTORE_ZoneMonitor
/**
* Monitored zone.
*/
- struct GNUNET_CRYPTO_EcdsaPrivateKey zone;
+ struct GNUNET_IDENTITY_PrivateKey zone;
/**
* Do we first iterate over all existing records?
@@ -302,7 +302,7 @@ reconnect (struct GNUNET_NAMESTORE_ZoneMonitor *zm)
struct GNUNET_NAMESTORE_ZoneMonitor *
GNUNET_NAMESTORE_zone_monitor_start (
const struct GNUNET_CONFIGURATION_Handle *cfg,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
+ const struct GNUNET_IDENTITY_PrivateKey *zone,
int iterate_first,
GNUNET_SCHEDULER_TaskCallback error_cb,
void *error_cb_cls,
diff --git a/src/namestore/perf_namestore_api_zone_iteration.c
b/src/namestore/perf_namestore_api_zone_iteration.c
index c1012de62..f46a1c523 100644
--- a/src/namestore/perf_namestore_api_zone_iteration.c
+++ b/src/namestore/perf_namestore_api_zone_iteration.c
@@ -64,7 +64,7 @@ static struct GNUNET_SCHEDULER_Task *timeout_task;
static struct GNUNET_SCHEDULER_Task *t;
-static struct GNUNET_CRYPTO_EcdsaPrivateKey privkey;
+static struct GNUNET_IDENTITY_PrivateKey privkey;
static struct GNUNET_NAMESTORE_ZoneIterator *zi;
@@ -188,7 +188,7 @@ fail_cb (void *cls)
static void
zone_proc (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
+ const struct GNUNET_IDENTITY_PrivateKey *zone,
const char *label,
unsigned int rd_count,
const struct GNUNET_GNSRECORD_Data *rd)
@@ -341,7 +341,8 @@ run (void *cls,
NULL);
nsh = GNUNET_NAMESTORE_connect (cfg);
GNUNET_assert (NULL != nsh);
- GNUNET_CRYPTO_ecdsa_key_create (&privkey);
+ privkey.type = htonl (GNUNET_GNSRECORD_TYPE_PKEY);
+ GNUNET_CRYPTO_ecdsa_key_create (&privkey.ecdsa_key);
start = GNUNET_TIME_absolute_get ();
t = GNUNET_SCHEDULER_add_now (&publish_record,
NULL);
diff --git a/src/namestore/plugin_namestore_flat.c
b/src/namestore/plugin_namestore_flat.c
index 60b24df67..9ccc90cfd 100644
--- a/src/namestore/plugin_namestore_flat.c
+++ b/src/namestore/plugin_namestore_flat.c
@@ -54,7 +54,7 @@ struct FlatFileEntry
/**
* Entry zone
*/
- struct GNUNET_CRYPTO_EcdsaPrivateKey private_key;
+ struct GNUNET_IDENTITY_PrivateKey private_key;
/**
* Record cound
@@ -86,7 +86,7 @@ struct FlatFileEntry
* @param h[out] initialized hash
*/
static void
-hash_pkey_and_label (const struct GNUNET_CRYPTO_EcdsaPrivateKey *pkey,
+hash_pkey_and_label (const struct GNUNET_IDENTITY_PrivateKey *pkey,
const char *label,
struct GNUNET_HashCode *h)
{
@@ -95,14 +95,14 @@ hash_pkey_and_label (const struct
GNUNET_CRYPTO_EcdsaPrivateKey *pkey,
size_t key_len;
label_len = strlen (label);
- key_len = label_len + sizeof(struct GNUNET_CRYPTO_EcdsaPrivateKey);
+ key_len = label_len + sizeof(struct GNUNET_IDENTITY_PrivateKey);
key = GNUNET_malloc (key_len);
GNUNET_memcpy (key,
label,
label_len);
GNUNET_memcpy (key + label_len,
pkey,
- sizeof(struct GNUNET_CRYPTO_EcdsaPrivateKey));
+ sizeof(struct GNUNET_IDENTITY_PrivateKey));
GNUNET_CRYPTO_hash (key,
key_len,
h);
@@ -296,7 +296,7 @@ database_setup (struct Plugin *plugin)
GNUNET_free (record_data);
{
- struct GNUNET_CRYPTO_EcdsaPrivateKey *private_key;
+ struct GNUNET_IDENTITY_PrivateKey *private_key;
GNUNET_STRINGS_base64_decode (zone_private_key,
strlen (zone_private_key),
@@ -345,7 +345,7 @@ store_and_free_entries (void *cls,
(void) key;
GNUNET_STRINGS_base64_encode (&entry->private_key,
- sizeof(struct GNUNET_CRYPTO_EcdsaPrivateKey),
+ sizeof(struct GNUNET_IDENTITY_PrivateKey),
&zone_private_key);
data_size = GNUNET_GNSRECORD_records_get_size (entry->record_count,
entry->record_data);
@@ -452,7 +452,7 @@ database_shutdown (struct Plugin *plugin)
static int
namestore_flat_store_records (void *cls,
const struct
- GNUNET_CRYPTO_EcdsaPrivateKey *zone_key,
+ GNUNET_IDENTITY_PrivateKey *zone_key,
const char *label,
unsigned int rd_count,
const struct GNUNET_GNSRECORD_Data *rd)
@@ -482,7 +482,7 @@ namestore_flat_store_records (void *cls,
strlen (label));
GNUNET_memcpy (&entry->private_key,
zone_key,
- sizeof(struct GNUNET_CRYPTO_EcdsaPrivateKey));
+ sizeof(struct GNUNET_IDENTITY_PrivateKey));
entry->rvalue = rvalue;
entry->record_count = rd_count;
entry->record_data = GNUNET_new_array (rd_count,
@@ -517,7 +517,7 @@ namestore_flat_store_records (void *cls,
*/
static int
namestore_flat_lookup_records (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey
*zone,
+ const struct GNUNET_IDENTITY_PrivateKey *zone,
const char *label,
GNUNET_NAMESTORE_RecordIterator iter,
void *iter_cls)
@@ -574,7 +574,7 @@ struct IterateContext
/**
* Target zone.
*/
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone;
+ const struct GNUNET_IDENTITY_PrivateKey *zone;
/**
* Function to call on each record.
@@ -647,7 +647,7 @@ iterate_zones (void *cls,
static int
namestore_flat_iterate_records (void *cls,
const struct
- GNUNET_CRYPTO_EcdsaPrivateKey *zone,
+ GNUNET_IDENTITY_PrivateKey *zone,
uint64_t serial,
uint64_t limit,
GNUNET_NAMESTORE_RecordIterator iter,
@@ -674,8 +674,8 @@ namestore_flat_iterate_records (void *cls,
*/
struct ZoneToNameContext
{
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone;
- const struct GNUNET_CRYPTO_EcdsaPublicKey *value_zone;
+ const struct GNUNET_IDENTITY_PrivateKey *zone;
+ const struct GNUNET_IDENTITY_PublicKey *value_zone;
GNUNET_NAMESTORE_RecordIterator iter;
void *iter_cls;
@@ -698,11 +698,14 @@ zone_to_name (void *cls,
for (unsigned int i = 0; i < entry->record_count; i++)
{
- if (GNUNET_GNSRECORD_TYPE_PKEY != entry->record_data[i].record_type)
+ if (GNUNET_NO ==
+ GNUNET_GNSRECORD_is_zonekey_type (entry->record_data[i].record_type))
+ continue;
+ if (ztn->value_zone->type != entry->record_data[i].record_type)
continue;
if (0 == memcmp (ztn->value_zone,
entry->record_data[i].data,
- sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey)))
+ entry->record_data[i].data_size))
{
ztn->iter (ztn->iter_cls,
i + 1, /* zero is illegal! */
@@ -730,9 +733,9 @@ zone_to_name (void *cls,
*/
static int
namestore_flat_zone_to_name (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
+ const struct GNUNET_IDENTITY_PrivateKey *zone,
const struct
- GNUNET_CRYPTO_EcdsaPublicKey *value_zone,
+ GNUNET_IDENTITY_PublicKey *value_zone,
GNUNET_NAMESTORE_RecordIterator iter,
void *iter_cls)
{
diff --git a/src/namestore/plugin_namestore_postgres.c
b/src/namestore/plugin_namestore_postgres.c
index 01dddde9e..bdbaf96b3 100644
--- a/src/namestore/plugin_namestore_postgres.c
+++ b/src/namestore/plugin_namestore_postgres.c
@@ -73,8 +73,7 @@ database_setup (struct Plugin *plugin)
" record_data BYTEA NOT NULL DEFAULT '',"
" label TEXT NOT NULL DEFAULT '',"
" CONSTRAINT zl UNIQUE (zone_private_key,label)"
- ")"
- "WITH OIDS");
+ ")");
struct GNUNET_PQ_ExecuteStatement es_default =
GNUNET_PQ_make_execute ("CREATE TABLE IF NOT EXISTS ns098records ("
" seq BIGSERIAL PRIMARY KEY,"
@@ -85,8 +84,7 @@ database_setup (struct Plugin *plugin)
" record_data BYTEA NOT NULL DEFAULT '',"
" label TEXT NOT NULL DEFAULT '',"
" CONSTRAINT zl UNIQUE (zone_private_key,label)"
- ")"
- "WITH OIDS");
+ ")");
const struct GNUNET_PQ_ExecuteStatement *cr;
struct GNUNET_PQ_ExecuteStatement sc = GNUNET_PQ_EXECUTE_STATEMENT_END;
@@ -182,13 +180,13 @@ database_setup (struct Plugin *plugin)
static int
namestore_postgres_store_records (void *cls,
const struct
- GNUNET_CRYPTO_EcdsaPrivateKey *zone_key,
+ GNUNET_IDENTITY_PrivateKey *zone_key,
const char *label,
unsigned int rd_count,
const struct GNUNET_GNSRECORD_Data *rd)
{
struct Plugin *plugin = cls;
- struct GNUNET_CRYPTO_EcdsaPublicKey pkey;
+ struct GNUNET_IDENTITY_PublicKey pkey;
uint64_t rvalue;
uint32_t rd_count32 = (uint32_t) rd_count;
ssize_t data_size;
@@ -197,13 +195,14 @@ namestore_postgres_store_records (void *cls,
0,
sizeof(pkey));
for (unsigned int i = 0; i < rd_count; i++)
- if (GNUNET_GNSRECORD_TYPE_PKEY == rd[i].record_type)
+ if (GNUNET_YES ==
+ GNUNET_GNSRECORD_is_zonekey_type (rd[i].record_type))
{
- GNUNET_break (sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey) ==
- rd[i].data_size);
- GNUNET_memcpy (&pkey,
- rd[i].data,
- rd[i].data_size);
+ GNUNET_break (GNUNET_OK ==
+ GNUNET_GNSRECORD_identity_from_data (rd[i].data,
+ rd[i].data_size,
+ rd[i].record_type,
+ &pkey));
break;
}
rvalue = GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK,
@@ -298,7 +297,7 @@ struct ParserContext
/**
* Zone key, NULL if part of record.
*/
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone_key;
+ const struct GNUNET_IDENTITY_PrivateKey *zone_key;
/**
* Number of results still to return (counted down by
@@ -332,7 +331,7 @@ parse_result_call_iterator (void *cls,
size_t data_size;
uint32_t record_count;
char *label;
- struct GNUNET_CRYPTO_EcdsaPrivateKey zk;
+ struct GNUNET_IDENTITY_PrivateKey zk;
struct GNUNET_PQ_ResultSpec rs_with_zone[] = {
GNUNET_PQ_result_spec_uint64 ("seq", &serial),
GNUNET_PQ_result_spec_uint32 ("record_count", &record_count),
@@ -409,7 +408,7 @@ parse_result_call_iterator (void *cls,
static int
namestore_postgres_lookup_records (void *cls,
const struct
- GNUNET_CRYPTO_EcdsaPrivateKey *zone,
+ GNUNET_IDENTITY_PrivateKey *zone,
const char *label,
GNUNET_NAMESTORE_RecordIterator iter,
void *iter_cls)
@@ -459,7 +458,7 @@ namestore_postgres_lookup_records (void *cls,
static int
namestore_postgres_iterate_records (void *cls,
const struct
- GNUNET_CRYPTO_EcdsaPrivateKey *zone,
+ GNUNET_IDENTITY_PrivateKey *zone,
uint64_t serial,
uint64_t limit,
GNUNET_NAMESTORE_RecordIterator iter,
@@ -526,9 +525,9 @@ namestore_postgres_iterate_records (void *cls,
static int
namestore_postgres_zone_to_name (void *cls,
const struct
- GNUNET_CRYPTO_EcdsaPrivateKey *zone,
+ GNUNET_IDENTITY_PrivateKey *zone,
const struct
- GNUNET_CRYPTO_EcdsaPublicKey *value_zone,
+ GNUNET_IDENTITY_PublicKey *value_zone,
GNUNET_NAMESTORE_RecordIterator iter,
void *iter_cls)
{
diff --git a/src/namestore/plugin_namestore_sqlite.c
b/src/namestore/plugin_namestore_sqlite.c
index 45fb782f7..7cb9b7ed0 100644
--- a/src/namestore/plugin_namestore_sqlite.c
+++ b/src/namestore/plugin_namestore_sqlite.c
@@ -314,14 +314,14 @@ database_shutdown (struct Plugin *plugin)
static int
namestore_sqlite_store_records (void *cls,
const struct
- GNUNET_CRYPTO_EcdsaPrivateKey *zone_key,
+ GNUNET_IDENTITY_PrivateKey *zone_key,
const char *label,
unsigned int rd_count,
const struct GNUNET_GNSRECORD_Data *rd)
{
struct Plugin *plugin = cls;
int n;
- struct GNUNET_CRYPTO_EcdsaPublicKey pkey;
+ struct GNUNET_IDENTITY_PublicKey pkey;
uint64_t rvalue;
ssize_t data_size;
@@ -329,13 +329,13 @@ namestore_sqlite_store_records (void *cls,
0,
sizeof(pkey));
for (unsigned int i = 0; i < rd_count; i++)
- if (GNUNET_GNSRECORD_TYPE_PKEY == rd[i].record_type)
+ if (GNUNET_YES == GNUNET_GNSRECORD_is_zonekey_type (rd[i].record_type))
{
- GNUNET_break (sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey) ==
- rd[i].data_size);
- GNUNET_memcpy (&pkey,
- rd[i].data,
- rd[i].data_size);
+ GNUNET_break (GNUNET_YES ==
+ GNUNET_GNSRECORD_identity_from_data (rd[i].data,
+ rd[i].data_size,
+ rd[i].record_type,
+ &pkey));
break;
}
rvalue = GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK,
@@ -461,7 +461,7 @@ static int
get_records_and_call_iterator (struct Plugin *plugin,
sqlite3_stmt *stmt,
const struct
- GNUNET_CRYPTO_EcdsaPrivateKey *zone_key,
+ GNUNET_IDENTITY_PrivateKey *zone_key,
uint64_t limit,
GNUNET_NAMESTORE_RecordIterator iter,
void *iter_cls)
@@ -496,7 +496,7 @@ get_records_and_call_iterator (struct Plugin *plugin,
size_t data_size;
void *data;
char *label;
- struct GNUNET_CRYPTO_EcdsaPrivateKey zk;
+ struct GNUNET_IDENTITY_PrivateKey zk;
struct GNUNET_SQ_ResultSpec rs[] = {
GNUNET_SQ_result_spec_uint64 (&seq),
GNUNET_SQ_result_spec_uint32 (&record_count),
@@ -578,7 +578,7 @@ get_records_and_call_iterator (struct Plugin *plugin,
static int
namestore_sqlite_lookup_records (void *cls,
const struct
- GNUNET_CRYPTO_EcdsaPrivateKey *zone,
+ GNUNET_IDENTITY_PrivateKey *zone,
const char *label,
GNUNET_NAMESTORE_RecordIterator iter,
void *iter_cls)
@@ -629,7 +629,7 @@ namestore_sqlite_lookup_records (void *cls,
static int
namestore_sqlite_iterate_records (void *cls,
const struct
- GNUNET_CRYPTO_EcdsaPrivateKey *zone,
+ GNUNET_IDENTITY_PrivateKey *zone,
uint64_t serial,
uint64_t limit,
GNUNET_NAMESTORE_RecordIterator iter,
@@ -695,9 +695,9 @@ namestore_sqlite_iterate_records (void *cls,
*/
static int
namestore_sqlite_zone_to_name (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey
*zone,
+ const struct GNUNET_IDENTITY_PrivateKey *zone,
const struct
- GNUNET_CRYPTO_EcdsaPublicKey *value_zone,
+ GNUNET_IDENTITY_PublicKey *value_zone,
GNUNET_NAMESTORE_RecordIterator iter,
void *iter_cls)
{
diff --git a/src/namestore/plugin_rest_namestore.c
b/src/namestore/plugin_rest_namestore.c
index 9354b9896..edcbeb874 100644
--- a/src/namestore/plugin_rest_namestore.c
+++ b/src/namestore/plugin_rest_namestore.c
@@ -30,7 +30,7 @@
#include "gnunet_namestore_service.h"
#include "gnunet_identity_service.h"
#include "gnunet_rest_lib.h"
-#include "gnunet_json_lib.h"
+#include "gnunet_gnsrecord_json_lib.h"
#include "microhttpd.h"
#include <jansson.h>
@@ -214,7 +214,7 @@ struct RequestHandle
/**
* Private key for the zone
*/
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone_pkey;
+ const struct GNUNET_IDENTITY_PrivateKey *zone_pkey;
/**
* IDENTITY Operation
@@ -510,7 +510,7 @@ namestore_list_finished (void *cls)
*/
static void
namestore_list_iteration (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone_key,
+ const struct GNUNET_IDENTITY_PrivateKey *zone_key,
const char *rname,
unsigned int rd_len,
const struct GNUNET_GNSRECORD_Data *rd)
@@ -535,9 +535,9 @@ namestore_list_iteration (void *cls,
/** Only add if not empty **/
if (j > 0)
{
- record_obj = GNUNET_JSON_from_gnsrecord (rname,
- rd_filtered,
- j);
+ record_obj = GNUNET_GNSRECORD_JSON_from_gnsrecord (rname,
+ rd_filtered,
+ j);
json_array_append_new (handle->resp_object, record_obj);
}
GNUNET_NAMESTORE_zone_iterator_next (handle->list_it, 1);
@@ -561,7 +561,7 @@ ns_lookup_error_cb (void *cls)
static void
ns_get_lookup_cb (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
+ const struct GNUNET_IDENTITY_PrivateKey *zone,
const char *label,
unsigned int rd_len,
const struct GNUNET_GNSRECORD_Data *rd)
@@ -587,9 +587,9 @@ ns_get_lookup_cb (void *cls,
/** Only add if not empty **/
if (j > 0)
{
- record_obj = GNUNET_JSON_from_gnsrecord (label,
- rd_filtered,
- j);
+ record_obj = GNUNET_GNSRECORD_JSON_from_gnsrecord (label,
+ rd_filtered,
+ j);
json_array_append_new (handle->resp_object, record_obj);
}
GNUNET_SCHEDULER_add_now (&namestore_list_finished, handle);
@@ -689,7 +689,7 @@ namestore_get (struct GNUNET_REST_RequestHandle *con_handle,
static void
ns_lookup_cb (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
+ const struct GNUNET_IDENTITY_PrivateKey *zone,
const char *label,
unsigned int rd_count,
const struct GNUNET_GNSRECORD_Data *rd)
@@ -755,7 +755,7 @@ namestore_add_or_update (struct GNUNET_REST_RequestHandle
*con_handle,
handle->rest_handle->data_size);
data_js = json_loads (term_data, JSON_DECODE_ANY, &err);
struct GNUNET_JSON_Specification gnsspec[] =
- { GNUNET_JSON_spec_gnsrecord (&handle->rd, &handle->rd_count,
+ { GNUNET_GNSRECORD_JSON_spec_gnsrecord (&handle->rd, &handle->rd_count,
&handle->record_name),
GNUNET_JSON_spec_end () };
if (GNUNET_OK != GNUNET_JSON_parse (data_js, gnsspec, NULL, NULL))
@@ -946,7 +946,7 @@ list_ego (void *cls,
const char *identifier)
{
struct EgoEntry *ego_entry;
- struct GNUNET_CRYPTO_EcdsaPublicKey pk;
+ struct GNUNET_IDENTITY_PublicKey pk;
if ((NULL == ego) && (ID_REST_STATE_INIT == state))
{
@@ -957,7 +957,7 @@ list_ego (void *cls,
{
ego_entry = GNUNET_new (struct EgoEntry);
GNUNET_IDENTITY_ego_get_public_key (ego, &pk);
- ego_entry->keystring = GNUNET_CRYPTO_ecdsa_public_key_to_string (&pk);
+ ego_entry->keystring = GNUNET_IDENTITY_public_key_to_string (&pk);
ego_entry->ego = ego;
ego_entry->identifier = GNUNET_strdup (identifier);
GNUNET_CONTAINER_DLL_insert_tail (ego_head,
@@ -983,7 +983,7 @@ list_ego (void *cls,
/* Add */
ego_entry = GNUNET_new (struct EgoEntry);
GNUNET_IDENTITY_ego_get_public_key (ego, &pk);
- ego_entry->keystring = GNUNET_CRYPTO_ecdsa_public_key_to_string (&pk);
+ ego_entry->keystring = GNUNET_IDENTITY_public_key_to_string (&pk);
ego_entry->ego = ego;
ego_entry->identifier = GNUNET_strdup (identifier);
GNUNET_CONTAINER_DLL_insert_tail (ego_head,
diff --git a/src/namestore/test_namestore_api_lookup_nick.c
b/src/namestore/test_namestore_api_lookup_nick.c
index 14fe7fc70..6ce969c9b 100644
--- a/src/namestore/test_namestore_api_lookup_nick.c
+++ b/src/namestore/test_namestore_api_lookup_nick.c
@@ -41,9 +41,9 @@ static struct GNUNET_NAMESTORE_Handle *nsh;
static struct GNUNET_SCHEDULER_Task *endbadly_task;
-static struct GNUNET_CRYPTO_EcdsaPrivateKey privkey;
+static struct GNUNET_IDENTITY_PrivateKey privkey;
-static struct GNUNET_CRYPTO_EcdsaPublicKey pubkey;
+static struct GNUNET_IDENTITY_PublicKey pubkey;
static int res;
@@ -98,7 +98,7 @@ end (void *cls)
static void
lookup_it (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
+ const struct GNUNET_IDENTITY_PrivateKey *zone,
const char *label,
unsigned int rd_count,
const struct GNUNET_GNSRECORD_Data *rd)
@@ -288,8 +288,9 @@ run (void *cls,
endbadly_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT,
&endbadly,
NULL);
- GNUNET_CRYPTO_ecdsa_key_create (&privkey);
- GNUNET_CRYPTO_ecdsa_key_get_public (&privkey,
+ privkey.type = htonl (GNUNET_GNSRECORD_TYPE_PKEY);
+ GNUNET_CRYPTO_ecdsa_key_create (&privkey.ecdsa_key);
+ GNUNET_IDENTITY_key_get_public (&privkey,
&pubkey);
nsh = GNUNET_NAMESTORE_connect (cfg);
diff --git a/src/namestore/test_namestore_api_lookup_private.c
b/src/namestore/test_namestore_api_lookup_private.c
index d0ad726cc..67cf54582 100644
--- a/src/namestore/test_namestore_api_lookup_private.c
+++ b/src/namestore/test_namestore_api_lookup_private.c
@@ -38,9 +38,9 @@ static struct GNUNET_NAMESTORE_Handle *nsh;
static struct GNUNET_SCHEDULER_Task *endbadly_task;
-static struct GNUNET_CRYPTO_EcdsaPrivateKey privkey;
+static struct GNUNET_IDENTITY_PrivateKey privkey;
-static struct GNUNET_CRYPTO_EcdsaPublicKey pubkey;
+static struct GNUNET_IDENTITY_PublicKey pubkey;
static int res;
@@ -91,7 +91,7 @@ end (void *cls)
static void
lookup_it (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
+ const struct GNUNET_IDENTITY_PrivateKey *zone,
const char *label,
unsigned int rd_count,
const struct GNUNET_GNSRECORD_Data *rd)
@@ -187,8 +187,9 @@ run (void *cls,
endbadly_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT,
&endbadly,
NULL);
- GNUNET_CRYPTO_ecdsa_key_create (&privkey);
- GNUNET_CRYPTO_ecdsa_key_get_public (&privkey, &pubkey);
+ privkey.type = htonl (GNUNET_GNSRECORD_TYPE_PKEY);
+ GNUNET_CRYPTO_ecdsa_key_create (&privkey.ecdsa_key);
+ GNUNET_IDENTITY_key_get_public (&privkey, &pubkey);
rd.expiration_time = GNUNET_TIME_absolute_get ().abs_value_us;
rd.record_type = TEST_RECORD_TYPE;
diff --git a/src/namestore/test_namestore_api_lookup_public.c
b/src/namestore/test_namestore_api_lookup_public.c
index 039c7cbf6..5e3e7bbd8 100644
--- a/src/namestore/test_namestore_api_lookup_public.c
+++ b/src/namestore/test_namestore_api_lookup_public.c
@@ -42,9 +42,9 @@ static struct GNUNET_NAMECACHE_Handle *nch;
static struct GNUNET_SCHEDULER_Task *endbadly_task;
-static struct GNUNET_CRYPTO_EcdsaPrivateKey privkey;
+static struct GNUNET_IDENTITY_PrivateKey privkey;
-static struct GNUNET_CRYPTO_EcdsaPublicKey pubkey;
+static struct GNUNET_IDENTITY_PublicKey pubkey;
static int res;
@@ -163,7 +163,7 @@ put_cont (void *cls, int32_t success, const char *emsg)
{
const char *name = cls;
struct GNUNET_HashCode derived_hash;
- struct GNUNET_CRYPTO_EcdsaPublicKey pubkey;
+ struct GNUNET_IDENTITY_PublicKey pubkey;
nsqe = NULL;
GNUNET_assert (NULL != cls);
@@ -173,8 +173,8 @@ put_cont (void *cls, int32_t success, const char *emsg)
(success == GNUNET_OK) ? "SUCCESS" : "FAIL");
/* Create derived hash */
- GNUNET_CRYPTO_ecdsa_key_get_public (&privkey,
- &pubkey);
+ GNUNET_IDENTITY_key_get_public (&privkey,
+ &pubkey);
GNUNET_GNSRECORD_query_from_public_key (&pubkey, name, &derived_hash);
ncqe = GNUNET_NAMECACHE_lookup_block (nch, &derived_hash,
@@ -193,9 +193,10 @@ run (void *cls,
endbadly_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT,
&endbadly,
NULL);
- GNUNET_CRYPTO_ecdsa_key_create (&privkey);
- GNUNET_CRYPTO_ecdsa_key_get_public (&privkey,
- &pubkey);
+ privkey.type = htonl (GNUNET_GNSRECORD_TYPE_PKEY);
+ GNUNET_CRYPTO_ecdsa_key_create (&privkey.ecdsa_key);
+ GNUNET_IDENTITY_key_get_public (&privkey,
+ &pubkey);
rd.expiration_time = GNUNET_TIME_absolute_get ().abs_value_us + 1000000000;
rd.record_type = TEST_RECORD_TYPE;
diff --git a/src/namestore/test_namestore_api_lookup_shadow.c
b/src/namestore/test_namestore_api_lookup_shadow.c
index d399d903a..79fa4c9c6 100644
--- a/src/namestore/test_namestore_api_lookup_shadow.c
+++ b/src/namestore/test_namestore_api_lookup_shadow.c
@@ -44,9 +44,9 @@ static struct GNUNET_NAMECACHE_Handle *nch;
static struct GNUNET_SCHEDULER_Task *endbadly_task;
-static struct GNUNET_CRYPTO_EcdsaPrivateKey privkey;
+static struct GNUNET_IDENTITY_PrivateKey privkey;
-static struct GNUNET_CRYPTO_EcdsaPublicKey pubkey;
+static struct GNUNET_IDENTITY_PublicKey pubkey;
static int res;
@@ -195,7 +195,7 @@ put_cont (void *cls, int32_t success, const char *emsg)
{
const char *name = cls;
struct GNUNET_HashCode derived_hash;
- struct GNUNET_CRYPTO_EcdsaPublicKey pubkey;
+ struct GNUNET_IDENTITY_PublicKey pubkey;
nsqe = NULL;
GNUNET_assert (NULL != cls);
@@ -205,8 +205,8 @@ put_cont (void *cls, int32_t success, const char *emsg)
(success == GNUNET_OK) ? "SUCCESS" : "FAIL");
/* Create derived hash */
- GNUNET_CRYPTO_ecdsa_key_get_public (&privkey,
- &pubkey);
+ GNUNET_IDENTITY_key_get_public (&privkey,
+ &pubkey);
GNUNET_GNSRECORD_query_from_public_key (&pubkey,
name,
&derived_hash);
@@ -228,9 +228,10 @@ run (void *cls,
endbadly_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT,
&endbadly,
NULL);
- GNUNET_CRYPTO_ecdsa_key_create (&privkey);
- GNUNET_CRYPTO_ecdsa_key_get_public (&privkey,
- &pubkey);
+ privkey.type = htonl (GNUNET_GNSRECORD_TYPE_PKEY);
+ GNUNET_CRYPTO_ecdsa_key_create (&privkey.ecdsa_key);
+ GNUNET_IDENTITY_key_get_public (&privkey,
+ &pubkey);
rd.expiration_time = GNUNET_TIME_absolute_get ().abs_value_us + 1000000000;
rd.record_type = TEST_RECORD_TYPE;
rd.data_size = TEST_RECORD_DATALEN;
diff --git a/src/namestore/test_namestore_api_lookup_shadow_filter.c
b/src/namestore/test_namestore_api_lookup_shadow_filter.c
index 40dbeb90f..4fc197750 100644
--- a/src/namestore/test_namestore_api_lookup_shadow_filter.c
+++ b/src/namestore/test_namestore_api_lookup_shadow_filter.c
@@ -48,9 +48,9 @@ static struct GNUNET_SCHEDULER_Task *endbadly_task;
static struct GNUNET_SCHEDULER_Task *delayed_lookup_task;
-static struct GNUNET_CRYPTO_EcdsaPrivateKey privkey;
+static struct GNUNET_IDENTITY_PrivateKey privkey;
-static struct GNUNET_CRYPTO_EcdsaPublicKey pubkey;
+static struct GNUNET_IDENTITY_PublicKey pubkey;
static int res;
@@ -66,7 +66,7 @@ static struct GNUNET_TIME_Absolute record_expiration;
static struct GNUNET_HashCode derived_hash;
-static struct GNUNET_CRYPTO_EcdsaPublicKey pubkey;
+static struct GNUNET_IDENTITY_PublicKey pubkey;
static void
@@ -267,8 +267,8 @@ put_cont (void *cls, int32_t success, const char *emsg)
(success == GNUNET_OK) ? "SUCCESS" : "FAIL");
/* Create derived hash */
- GNUNET_CRYPTO_ecdsa_key_get_public (&privkey,
- &pubkey);
+ GNUNET_IDENTITY_key_get_public (&privkey,
+ &pubkey);
GNUNET_GNSRECORD_query_from_public_key (&pubkey, TEST_NAME, &derived_hash);
if (0 == GNUNET_TIME_absolute_get_remaining (record_expiration).rel_value_us)
@@ -297,9 +297,10 @@ run (void *cls,
endbadly_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT,
&endbadly,
NULL);
- GNUNET_CRYPTO_ecdsa_key_create (&privkey);
- GNUNET_CRYPTO_ecdsa_key_get_public (&privkey,
- &pubkey);
+ privkey.type = htonl (GNUNET_GNSRECORD_TYPE_PKEY);
+ GNUNET_CRYPTO_ecdsa_key_create (&privkey.ecdsa_key);
+ GNUNET_IDENTITY_key_get_public (&privkey,
+ &pubkey);
record_expiration = GNUNET_TIME_absolute_add (GNUNET_TIME_absolute_get (),
EXPIRATION);
diff --git a/src/namestore/test_namestore_api_monitoring.c
b/src/namestore/test_namestore_api_monitoring.c
index 3f1be1403..df0c38608 100644
--- a/src/namestore/test_namestore_api_monitoring.c
+++ b/src/namestore/test_namestore_api_monitoring.c
@@ -37,9 +37,9 @@ static struct GNUNET_NAMESTORE_Handle *nsh;
static struct GNUNET_SCHEDULER_Task *endbadly_task;
-static struct GNUNET_CRYPTO_EcdsaPrivateKey privkey;
+static struct GNUNET_IDENTITY_PrivateKey privkey;
-static struct GNUNET_CRYPTO_EcdsaPrivateKey privkey2;
+static struct GNUNET_IDENTITY_PrivateKey privkey2;
static struct GNUNET_NAMESTORE_ZoneMonitor *zm;
@@ -133,7 +133,7 @@ end (void *cls)
static void
zone_proc (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone_key,
+ const struct GNUNET_IDENTITY_PrivateKey *zone_key,
const char *name,
unsigned int rd_count,
const struct GNUNET_GNSRECORD_Data *rd)
@@ -273,7 +273,8 @@ run (void *cls,
struct GNUNET_TESTING_Peer *peer)
{
res = 1;
- GNUNET_CRYPTO_ecdsa_key_create (&privkey);
+ privkey.type = htonl (GNUNET_GNSRECORD_TYPE_PKEY);
+ GNUNET_CRYPTO_ecdsa_key_create (&privkey.ecdsa_key);
/* Start monitoring */
zm = GNUNET_NAMESTORE_zone_monitor_start (cfg,
&privkey,
@@ -304,7 +305,8 @@ run (void *cls,
return;
}
- GNUNET_CRYPTO_ecdsa_key_create (&privkey2);
+ privkey2.type = htonl (GNUNET_GNSRECORD_TYPE_PKEY);
+ GNUNET_CRYPTO_ecdsa_key_create (&privkey2.ecdsa_key);
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Created record 3\n");
diff --git a/src/namestore/test_namestore_api_monitoring_existing.c
b/src/namestore/test_namestore_api_monitoring_existing.c
index 728fcc25e..366f5739f 100644
--- a/src/namestore/test_namestore_api_monitoring_existing.c
+++ b/src/namestore/test_namestore_api_monitoring_existing.c
@@ -38,9 +38,9 @@ static struct GNUNET_NAMESTORE_Handle *nsh;
static struct GNUNET_SCHEDULER_Task *endbadly_task;
-static struct GNUNET_CRYPTO_EcdsaPrivateKey privkey;
+static struct GNUNET_IDENTITY_PrivateKey privkey;
-static struct GNUNET_CRYPTO_EcdsaPrivateKey privkey2;
+static struct GNUNET_IDENTITY_PrivateKey privkey2;
static struct GNUNET_NAMESTORE_ZoneMonitor *zm;
@@ -129,7 +129,7 @@ end (void *cls)
static void
zone_proc (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone_key,
+ const struct GNUNET_IDENTITY_PrivateKey *zone_key,
const char *name,
unsigned int rd_count,
const struct GNUNET_GNSRECORD_Data *rd)
@@ -302,8 +302,10 @@ run (void *cls,
struct GNUNET_TESTING_Peer *peer)
{
res = 1;
- GNUNET_CRYPTO_ecdsa_key_create (&privkey);
- GNUNET_CRYPTO_ecdsa_key_create (&privkey2);
+ privkey.type = htonl (GNUNET_GNSRECORD_TYPE_PKEY);
+ privkey2.type = htonl (GNUNET_GNSRECORD_TYPE_PKEY);
+ GNUNET_CRYPTO_ecdsa_key_create (&privkey.ecdsa_key);
+ GNUNET_CRYPTO_ecdsa_key_create (&privkey2.ecdsa_key);
cfg = mycfg;
GNUNET_SCHEDULER_add_shutdown (&end,
diff --git a/src/namestore/test_namestore_api_remove.c
b/src/namestore/test_namestore_api_remove.c
index e575821e8..b6254e531 100644
--- a/src/namestore/test_namestore_api_remove.c
+++ b/src/namestore/test_namestore_api_remove.c
@@ -39,9 +39,9 @@ static struct GNUNET_NAMESTORE_Handle *nsh;
static struct GNUNET_SCHEDULER_Task *endbadly_task;
-static struct GNUNET_CRYPTO_EcdsaPrivateKey privkey;
+static struct GNUNET_IDENTITY_PrivateKey privkey;
-static struct GNUNET_CRYPTO_EcdsaPublicKey pubkey;
+static struct GNUNET_IDENTITY_PublicKey pubkey;
static int res;
@@ -158,9 +158,10 @@ run (void *cls,
endbadly_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT,
&endbadly,
NULL);
- GNUNET_CRYPTO_ecdsa_key_create (&privkey);
- GNUNET_CRYPTO_ecdsa_key_get_public (&privkey,
- &pubkey);
+ privkey.type = htonl (GNUNET_GNSRECORD_TYPE_PKEY);
+ GNUNET_CRYPTO_ecdsa_key_create (&privkey.ecdsa_key);
+ GNUNET_IDENTITY_key_get_public (&privkey,
+ &pubkey);
removed = GNUNET_NO;
diff --git a/src/namestore/test_namestore_api_remove_not_existing_record.c
b/src/namestore/test_namestore_api_remove_not_existing_record.c
index 75e1cc3ed..e66992909 100644
--- a/src/namestore/test_namestore_api_remove_not_existing_record.c
+++ b/src/namestore/test_namestore_api_remove_not_existing_record.c
@@ -38,9 +38,9 @@ static struct GNUNET_NAMESTORE_Handle *nsh;
static struct GNUNET_SCHEDULER_Task *endbadly_task;
-static struct GNUNET_CRYPTO_EcdsaPrivateKey privkey;
+static struct GNUNET_IDENTITY_PrivateKey privkey;
-static struct GNUNET_CRYPTO_EcdsaPublicKey pubkey;
+static struct GNUNET_IDENTITY_PublicKey pubkey;
static int res;
@@ -132,8 +132,9 @@ run (void *cls,
endbadly_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT,
&endbadly,
NULL);
- GNUNET_CRYPTO_ecdsa_key_create (&privkey);
- GNUNET_CRYPTO_ecdsa_key_get_public (&privkey, &pubkey);
+ privkey.type = htonl (GNUNET_GNSRECORD_TYPE_PKEY);
+ GNUNET_CRYPTO_ecdsa_key_create (&privkey.ecdsa_key);
+ GNUNET_IDENTITY_key_get_public (&privkey, &pubkey);
nsh = GNUNET_NAMESTORE_connect (cfg);
GNUNET_break (NULL != nsh);
diff --git a/src/namestore/test_namestore_api_store.c
b/src/namestore/test_namestore_api_store.c
index 9223b56a3..e0b7daa5d 100644
--- a/src/namestore/test_namestore_api_store.c
+++ b/src/namestore/test_namestore_api_store.c
@@ -39,9 +39,9 @@ static struct GNUNET_NAMESTORE_Handle *nsh;
static struct GNUNET_SCHEDULER_Task *endbadly_task;
-static struct GNUNET_CRYPTO_EcdsaPrivateKey privkey;
+static struct GNUNET_IDENTITY_PrivateKey privkey;
-static struct GNUNET_CRYPTO_EcdsaPublicKey pubkey;
+static struct GNUNET_IDENTITY_PublicKey pubkey;
static int res;
@@ -113,8 +113,9 @@ run (void *cls,
endbadly_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT,
&endbadly, NULL);
- GNUNET_CRYPTO_ecdsa_key_create (&privkey);
- GNUNET_CRYPTO_ecdsa_key_get_public (&privkey, &pubkey);
+ privkey.type = htonl (GNUNET_GNSRECORD_TYPE_PKEY);
+ GNUNET_CRYPTO_ecdsa_key_create (&privkey.ecdsa_key);
+ GNUNET_IDENTITY_key_get_public (&privkey, &pubkey);
rd.expiration_time = GNUNET_TIME_absolute_get ().abs_value_us;
diff --git a/src/namestore/test_namestore_api_store_update.c
b/src/namestore/test_namestore_api_store_update.c
index 7a5a69a6c..5c169734a 100644
--- a/src/namestore/test_namestore_api_store_update.c
+++ b/src/namestore/test_namestore_api_store_update.c
@@ -48,9 +48,9 @@ static struct GNUNET_NAMECACHE_Handle *nch;
static struct GNUNET_SCHEDULER_Task *endbadly_task;
-static struct GNUNET_CRYPTO_EcdsaPrivateKey privkey;
+static struct GNUNET_IDENTITY_PrivateKey privkey;
-static struct GNUNET_CRYPTO_EcdsaPublicKey pubkey;
+static struct GNUNET_IDENTITY_PublicKey pubkey;
static int res;
@@ -246,9 +246,10 @@ run (void *cls,
endbadly_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT,
&endbadly,
NULL);
- GNUNET_CRYPTO_ecdsa_key_create (&privkey);
- GNUNET_CRYPTO_ecdsa_key_get_public (&privkey,
- &pubkey);
+ memset (&privkey, 0, sizeof (privkey));
+ privkey.type = htonl (GNUNET_GNSRECORD_TYPE_PKEY);
+ GNUNET_CRYPTO_ecdsa_key_create (&privkey.ecdsa_key);
+ GNUNET_IDENTITY_key_get_public (&privkey, &pubkey);
rd.flags = GNUNET_GNSRECORD_RF_NONE;
rd.expiration_time = GNUNET_TIME_absolute_get ().abs_value_us + 1000000000;
rd.record_type = TEST_RECORD_TYPE;
@@ -291,7 +292,7 @@ main (int argc,
SETUP_CFG (plugin_name, cfg_name);
res = 1;
if (0 !=
- GNUNET_TESTING_peer_run ("test-namestore-api-store-update",
+ GNUNET_TESTING_peer_run ("test--store-update",
cfg_name,
&run,
NULL))
diff --git a/src/namestore/test_namestore_api_zone_iteration.c
b/src/namestore/test_namestore_api_zone_iteration.c
index 5d02b9e49..55ca901e2 100644
--- a/src/namestore/test_namestore_api_zone_iteration.c
+++ b/src/namestore/test_namestore_api_zone_iteration.c
@@ -37,9 +37,9 @@ static struct GNUNET_NAMESTORE_Handle *nsh;
static struct GNUNET_SCHEDULER_Task *endbadly_task;
-static struct GNUNET_CRYPTO_EcdsaPrivateKey privkey;
+static struct GNUNET_IDENTITY_PrivateKey privkey;
-static struct GNUNET_CRYPTO_EcdsaPrivateKey privkey2;
+static struct GNUNET_IDENTITY_PrivateKey privkey2;
static struct GNUNET_NAMESTORE_ZoneIterator *zi;
@@ -142,7 +142,7 @@ fail_cb (void *cls)
static void
zone_proc (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
+ const struct GNUNET_IDENTITY_PrivateKey *zone,
const char *label,
unsigned int rd_count,
const struct GNUNET_GNSRECORD_Data *rd)
@@ -331,7 +331,7 @@ create_record (unsigned int count)
*/
static void
empty_zone_proc (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
+ const struct GNUNET_IDENTITY_PrivateKey *zone,
const char *label,
unsigned int rd_count,
const struct GNUNET_GNSRECORD_Data *rd)
@@ -362,34 +362,11 @@ empty_zone_proc (void *cls,
static void
empty_zone_end (void *cls)
{
- char *hostkey_file;
-
zi = NULL;
- GNUNET_asprintf (&hostkey_file,
- "zonefiles%s%s",
- DIR_SEPARATOR_STR,
-
"N0UJMP015AFUNR2BTNM3FKPBLG38913BL8IDMCO2H0A1LIB81960.zkey");
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Using zonekey file `%s' \n",
- hostkey_file);
- GNUNET_assert (GNUNET_SYSERR !=
- GNUNET_CRYPTO_ecdsa_key_from_file (hostkey_file,
- GNUNET_YES,
- &privkey));
- GNUNET_free (hostkey_file);
-
- GNUNET_asprintf (&hostkey_file,
- "zonefiles%s%s",
- DIR_SEPARATOR_STR,
-
"HGU0A0VCU334DN7F2I9UIUMVQMM7JMSD142LIMNUGTTV9R0CF4EG.zkey");
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Using zonekey file `%s' \n",
- hostkey_file);
- GNUNET_assert (GNUNET_SYSERR !=
- GNUNET_CRYPTO_ecdsa_key_from_file (hostkey_file,
- GNUNET_YES,
- &privkey2));
- GNUNET_free (hostkey_file);
+ privkey.type = htonl (GNUNET_GNSRECORD_TYPE_PKEY);
+ privkey2.type = htonl (GNUNET_GNSRECORD_TYPE_PKEY);
+ GNUNET_CRYPTO_ecdsa_key_create (&privkey.ecdsa_key);
+ GNUNET_CRYPTO_ecdsa_key_create (&privkey2.ecdsa_key);
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Created record 1\n");
diff --git a/src/namestore/test_namestore_api_zone_iteration_nick.c
b/src/namestore/test_namestore_api_zone_iteration_nick.c
index 4e54a05d2..c203a63a6 100644
--- a/src/namestore/test_namestore_api_zone_iteration_nick.c
+++ b/src/namestore/test_namestore_api_zone_iteration_nick.c
@@ -38,9 +38,9 @@
static struct GNUNET_NAMESTORE_Handle *nsh;
-static struct GNUNET_CRYPTO_EcdsaPrivateKey privkey;
+static struct GNUNET_IDENTITY_PrivateKey privkey;
-static struct GNUNET_CRYPTO_EcdsaPrivateKey privkey2;
+static struct GNUNET_IDENTITY_PrivateKey privkey2;
static struct GNUNET_NAMESTORE_ZoneIterator *zi;
@@ -153,7 +153,7 @@ zone_proc_end (void *cls)
static void
zone_proc (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
+ const struct GNUNET_IDENTITY_PrivateKey *zone,
const char *label,
unsigned int rd_count,
const struct GNUNET_GNSRECORD_Data *rd)
@@ -345,7 +345,7 @@ nick_1_cont (void *cls, int32_t success, const char *emsg)
*/
static void
empty_zone_proc (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
+ const struct GNUNET_IDENTITY_PrivateKey *zone,
const char *label,
unsigned int rd_count,
const struct GNUNET_GNSRECORD_Data *rd)
@@ -379,8 +379,10 @@ empty_zone_end (void *cls)
struct GNUNET_GNSRECORD_Data rd;
zi = NULL;
- GNUNET_CRYPTO_ecdsa_key_create (&privkey);
- GNUNET_CRYPTO_ecdsa_key_create (&privkey2);
+ privkey.type = htonl (GNUNET_GNSRECORD_TYPE_PKEY);
+ privkey2.type = htonl (GNUNET_GNSRECORD_TYPE_PKEY);
+ GNUNET_CRYPTO_ecdsa_key_create (&privkey.ecdsa_key);
+ GNUNET_CRYPTO_ecdsa_key_create (&privkey2.ecdsa_key);
memset (&rd, 0, sizeof(rd));
rd.data = ZONE_NICK_1;
diff --git a/src/namestore/test_namestore_api_zone_iteration_specific_zone.c
b/src/namestore/test_namestore_api_zone_iteration_specific_zone.c
index 30920713f..70097a69e 100644
--- a/src/namestore/test_namestore_api_zone_iteration_specific_zone.c
+++ b/src/namestore/test_namestore_api_zone_iteration_specific_zone.c
@@ -38,9 +38,9 @@ static struct GNUNET_NAMESTORE_Handle *nsh;
static struct GNUNET_SCHEDULER_Task *endbadly_task;
-static struct GNUNET_CRYPTO_EcdsaPrivateKey privkey;
+static struct GNUNET_IDENTITY_PrivateKey privkey;
-static struct GNUNET_CRYPTO_EcdsaPrivateKey privkey2;
+static struct GNUNET_IDENTITY_PrivateKey privkey2;
static struct GNUNET_NAMESTORE_ZoneIterator *zi;
@@ -124,7 +124,7 @@ fail_cb (void *cls)
static void
zone_proc (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
+ const struct GNUNET_IDENTITY_PrivateKey *zone,
const char *label,
unsigned int rd_count,
const struct GNUNET_GNSRECORD_Data *rd)
@@ -309,7 +309,7 @@ create_record (unsigned int count)
*/
static void
empty_zone_proc (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
+ const struct GNUNET_IDENTITY_PrivateKey *zone,
const char *label,
unsigned int rd_count,
const struct GNUNET_GNSRECORD_Data *rd)
@@ -341,8 +341,10 @@ static void
empty_zone_proc_end (void *cls)
{
zi = NULL;
- GNUNET_CRYPTO_ecdsa_key_create (&privkey);
- GNUNET_CRYPTO_ecdsa_key_create (&privkey2);
+ privkey.type = htonl (GNUNET_GNSRECORD_TYPE_PKEY);
+ privkey2.type = htonl (GNUNET_GNSRECORD_TYPE_PKEY);
+ GNUNET_CRYPTO_ecdsa_key_create (&privkey.ecdsa_key);
+ GNUNET_CRYPTO_ecdsa_key_create (&privkey2.ecdsa_key);
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Created record 1\n");
GNUNET_asprintf (&s_name_1,
diff --git a/src/namestore/test_namestore_api_zone_iteration_stop.c
b/src/namestore/test_namestore_api_zone_iteration_stop.c
index bdcdd1706..71b36ba09 100644
--- a/src/namestore/test_namestore_api_zone_iteration_stop.c
+++ b/src/namestore/test_namestore_api_zone_iteration_stop.c
@@ -34,9 +34,9 @@
static struct GNUNET_NAMESTORE_Handle *nsh;
-static struct GNUNET_CRYPTO_EcdsaPrivateKey privkey;
+static struct GNUNET_IDENTITY_PrivateKey privkey;
-static struct GNUNET_CRYPTO_EcdsaPrivateKey privkey2;
+static struct GNUNET_IDENTITY_PrivateKey privkey2;
static struct GNUNET_NAMESTORE_ZoneIterator *zi;
@@ -112,7 +112,7 @@ fail_cb (void *cls)
static void
zone_proc (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
+ const struct GNUNET_IDENTITY_PrivateKey *zone,
const char *label,
unsigned int rd_count,
const struct GNUNET_GNSRECORD_Data *rd)
@@ -318,7 +318,7 @@ create_record (unsigned int count)
*/
static void
empty_zone_proc (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
+ const struct GNUNET_IDENTITY_PrivateKey *zone,
const char *label,
unsigned int rd_count,
const struct GNUNET_GNSRECORD_Data *rd)
@@ -347,34 +347,13 @@ empty_zone_proc (void *cls,
static void
empty_zone_proc_end (void *cls)
{
- char *hostkey_file;
-
GNUNET_assert (nsh == cls);
zi = NULL;
- GNUNET_asprintf (&hostkey_file,
- "zonefiles%s%s",
- DIR_SEPARATOR_STR,
-
"N0UJMP015AFUNR2BTNM3FKPBLG38913BL8IDMCO2H0A1LIB81960.zkey");
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Using zonekey file `%s' \n",
- hostkey_file);
- GNUNET_assert (GNUNET_SYSERR
- != GNUNET_CRYPTO_ecdsa_key_from_file (hostkey_file,
- GNUNET_YES,
- &privkey));
- GNUNET_free (hostkey_file);
- GNUNET_asprintf (&hostkey_file,
- "zonefiles%s%s",
- DIR_SEPARATOR_STR,
-
"HGU0A0VCU334DN7F2I9UIUMVQMM7JMSD142LIMNUGTTV9R0CF4EG.zkey");
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Using zonekey file `%s'\n",
- hostkey_file);
- GNUNET_assert (GNUNET_SYSERR !=
- GNUNET_CRYPTO_ecdsa_key_from_file (hostkey_file,
- GNUNET_YES,
- &privkey2));
- GNUNET_free (hostkey_file);
+ privkey.type = htonl (GNUNET_GNSRECORD_TYPE_PKEY);
+ privkey2.type = htonl (GNUNET_GNSRECORD_TYPE_PKEY);
+ GNUNET_CRYPTO_ecdsa_key_create (&privkey.ecdsa_key);
+ GNUNET_CRYPTO_ecdsa_key_create (&privkey2.ecdsa_key);
+
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Created record 1\n");
diff --git a/src/namestore/test_namestore_api_zone_to_name.c
b/src/namestore/test_namestore_api_zone_to_name.c
index 94cc5c285..3fd10e4a1 100644
--- a/src/namestore/test_namestore_api_zone_to_name.c
+++ b/src/namestore/test_namestore_api_zone_to_name.c
@@ -42,11 +42,11 @@ static struct GNUNET_NAMESTORE_Handle *nsh;
static struct GNUNET_SCHEDULER_Task *endbadly_task;
-static struct GNUNET_CRYPTO_EcdsaPrivateKey privkey;
+static struct GNUNET_IDENTITY_PrivateKey privkey;
-static struct GNUNET_CRYPTO_EcdsaPublicKey pubkey;
+static struct GNUNET_IDENTITY_PublicKey pubkey;
-static struct GNUNET_CRYPTO_EcdsaPublicKey s_zone_value;
+static struct GNUNET_IDENTITY_PublicKey s_zone_value;
static char *s_name;
@@ -92,7 +92,7 @@ end (void *cls)
static void
zone_to_name_proc (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone_key,
+ const struct GNUNET_IDENTITY_PrivateKey *zone_key,
const char *n,
unsigned int rd_count,
const struct GNUNET_GNSRECORD_Data *rd)
@@ -203,20 +203,22 @@ run (void *cls,
GNUNET_SCHEDULER_add_shutdown (&end,
NULL);
GNUNET_asprintf (&s_name, "dummy");
- GNUNET_CRYPTO_ecdsa_key_create (&privkey);
+ privkey.type = htonl (GNUNET_GNSRECORD_TYPE_PKEY);
+ GNUNET_CRYPTO_ecdsa_key_create (&privkey.ecdsa_key);
/* get public key */
- GNUNET_CRYPTO_ecdsa_key_get_public (&privkey,
- &pubkey);
+ GNUNET_IDENTITY_key_get_public (&privkey,
+ &pubkey);
GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_WEAK,
&s_zone_value,
sizeof(s_zone_value));
+ s_zone_value.type = htonl (GNUNET_GNSRECORD_TYPE_PKEY);
{
struct GNUNET_GNSRECORD_Data rd;
rd.expiration_time = GNUNET_TIME_absolute_get ().abs_value_us;
rd.record_type = GNUNET_GNSRECORD_TYPE_PKEY;
- rd.data_size = sizeof(s_zone_value);
+ rd.data_size = GNUNET_IDENTITY_key_get_length (&s_zone_value);
rd.data = &s_zone_value;
rd.flags = 0;
diff --git a/src/namestore/test_plugin_namestore.c
b/src/namestore/test_plugin_namestore.c
index 0f9ce97e4..baea0e444 100644
--- a/src/namestore/test_plugin_namestore.c
+++ b/src/namestore/test_plugin_namestore.c
@@ -85,14 +85,14 @@ load_plugin (const struct GNUNET_CONFIGURATION_Handle *cfg)
static void
test_record (void *cls,
uint64_t seq,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *private_key,
+ const struct GNUNET_IDENTITY_PrivateKey *private_key,
const char *label,
unsigned int rd_count,
const struct GNUNET_GNSRECORD_Data *rd)
{
int *idp = cls;
int id = *idp;
- struct GNUNET_CRYPTO_EcdsaPrivateKey tzone_private_key;
+ struct GNUNET_IDENTITY_PrivateKey tzone_private_key;
char tname[64];
unsigned int trd_count = 1 + (id % 1024);
@@ -123,7 +123,7 @@ get_record (struct GNUNET_NAMESTORE_PluginFunctions *nsp,
int id)
static void
put_record (struct GNUNET_NAMESTORE_PluginFunctions *nsp, int id)
{
- struct GNUNET_CRYPTO_EcdsaPrivateKey zone_private_key;
+ struct GNUNET_IDENTITY_PrivateKey zone_private_key;
char label[64];
unsigned int rd_count = 1 + (id % 1024);
struct GNUNET_GNSRECORD_Data rd[GNUNET_NZL (rd_count)];
diff --git a/src/namestore/test_plugin_rest_namestore.sh
b/src/namestore/test_plugin_rest_namestore.sh
index 12a7fa50c..8a45cebf5 100755
--- a/src/namestore/test_plugin_rest_namestore.sh
+++ b/src/namestore/test_plugin_rest_namestore.sh
@@ -84,14 +84,15 @@ gnunet-identity -C $TEST_ID -c test_namestore_api.conf
test="$(gnunet-namestore -D -z $TEST_ID -c test_namestore_api.conf)"
name=$TEST_ID
public="$(gnunet-identity -d -c test_namestore_api.conf | grep $TEST_ID | awk
'NR==1{print $3}')"
-gnunet-namestore -z $name -p -a -n "test_entry" -e "1d" -V
"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG" -t "PKEY" -c
test_namestore_api.conf
+echo "$name $public"
+valgrind gnunet-namestore -z $name -p -a -n "test_entry" -e "1d" -V
"000G006WVZ8HQ5YTVFNX09HK0VJVVQ9ZCBYDSCH3ERT04N5ZRBKEB82EP8" -t "PKEY" -c
test_namestore_api.conf
#curl_get "${namestore_link}" "HTTP/1.1 200 OK"
curl_get "${namestore_link}/$name" "HTTP/1.1 200 OK"
curl_get "${namestore_link}/$public" "error"
gnunet-namestore -z $name -d -n "test_entry" -c test_namestore_api.conf
#Test POST with NAME
-curl_post "${namestore_link}/$name" '{"data":
[{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG",
"record_type":"PKEY", "expiration_time":"1d","private": false,
"relative_expiration": false, "supplemental": false, "shadow":
false}],"record_name":"test_entry"}' "HTTP/1.1 204 No Content"
+curl_post "${namestore_link}/$name" '{"data":
[{"value":"000G006WVZ8HQ5YTVFNX09HK0VJVVQ9ZCBYDSCH3ERT04N5ZRBKEB82EP8",
"record_type":"PKEY", "expiration_time":"1d","private": false,
"relative_expiration": false, "supplemental": false, "shadow":
false}],"record_name":"test_entry"}' "HTTP/1.1 204 No Content"
gnunet-namestore -z $name -d -n "test_entry" -c test_namestore_api.conf >
/dev/null 2>&1
# invalid values
@@ -106,29 +107,29 @@ curl_post "${namestore_link}/$name" '{"data":
[{"record_type":"PKEY", "expiratio
gnunet-namestore -z $name -d -n "test_entry" -c test_namestore_api.conf >
/dev/null 2>&1
#expirations
-curl_post "${namestore_link}/$name" '{"data":
[{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG",
"record_type":"PKEY", "expiration_time":"0d","private": false,
"relative_expiration": true, "supplemental": false, "shadow":
false}],"record_name":"test_entry"}' "HTTP/1.1 204"
+curl_post "${namestore_link}/$name" '{"data":
[{"value":"000G006WVZ8HQ5YTVFNX09HK0VJVVQ9ZCBYDSCH3ERT04N5ZRBKEB82EP8",
"record_type":"PKEY", "expiration_time":"0d","private": false,
"relative_expiration": true, "supplemental": false, "shadow":
false}],"record_name":"test_entry"}' "HTTP/1.1 204"
gnunet-namestore -z $name -d -n "test_entry" -c test_namestore_api.conf >
/dev/null 2>&1
-curl_post "${namestore_link}/$name" '{"data":
[{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG",
"record_type":"PKEY", "expiration_time":"10000d","private": false,
"relative_expiration": true, "supplemental": false, "shadow":
false}],"record_name":"test_entry"}' "HTTP/1.1 204"
+curl_post "${namestore_link}/$name" '{"data":
[{"value":"000G006WVZ8HQ5YTVFNX09HK0VJVVQ9ZCBYDSCH3ERT04N5ZRBKEB82EP8",
"record_type":"PKEY", "expiration_time":"10000d","private": false,
"relative_expiration": true, "supplemental": false, "shadow":
false}],"record_name":"test_entry"}' "HTTP/1.1 204"
gnunet-namestore -z $name -d -n "test_entry" -c test_namestore_api.conf >
/dev/null 2>&1
-curl_post "${namestore_link}/$name" '{"data":
[{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG",
"record_type":"PKEY", "expiration_time":"now","private": false,
"relative_expiration": false, "supplemental": false, "shadow":
false}],"record_name":"test_entry"}' "error"
+curl_post "${namestore_link}/$name" '{"data":
[{"value":"000G006WVZ8HQ5YTVFNX09HK0VJVVQ9ZCBYDSCH3ERT04N5ZRBKEB82EP8",
"record_type":"PKEY", "expiration_time":"now","private": false,
"relative_expiration": false, "supplemental": false, "shadow":
false}],"record_name":"test_entry"}' "error"
gnunet-namestore -z $name -d -n "test_entry" -c test_namestore_api.conf >
/dev/null 2>&1
-curl_post "${namestore_link}/$name" '{"data":
[{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG",
"record_type":"PKEY", "expiration_time_missing":"1d","private": false,
"relative_expiration": false, "supplemental": false, "shadow":
false}],"record_name":"test_entry"}' "error"
+curl_post "${namestore_link}/$name" '{"data":
[{"value":"000G006WVZ8HQ5YTVFNX09HK0VJVVQ9ZCBYDSCH3ERT04N5ZRBKEB82EP8",
"record_type":"PKEY", "expiration_time_missing":"1d","private": false,
"relative_expiration": false, "supplemental": false, "shadow":
false}],"record_name":"test_entry"}' "error"
gnunet-namestore -z $name -d -n "test_entry" -c test_namestore_api.conf >
/dev/null 2>&1
#record_name
-curl_post "${namestore_link}/$name" '{"data":
[{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG",
"record_type":"PKEY", "expiration_time":"1d","private": false,
"relative_expiration": false, "supplemental": false, "shadow":
false}],"record_name":""}' "error"
+curl_post "${namestore_link}/$name" '{"data":
[{"value":"000G006WVZ8HQ5YTVFNX09HK0VJVVQ9ZCBYDSCH3ERT04N5ZRBKEB82EP8",
"record_type":"PKEY", "expiration_time":"1d","private": false,
"relative_expiration": false, "supplemental": false, "shadow":
false}],"record_name":""}' "error"
gnunet-namestore -z $name -d -n "test_entry" -c test_namestore_api.conf >
/dev/null 2>&1
-curl_post "${namestore_link}/$name" '{"data":
[{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG",
"record_type":"PKEY", "expiration_time":"1d","private": false,
"relative_expiration": false, "supplemental": false, "shadow":
false}],"record_name_missing":"test_entry"}' "error"
+curl_post "${namestore_link}/$name" '{"data":
[{"value":"000G006WVZ8HQ5YTVFNX09HK0VJVVQ9ZCBYDSCH3ERT04N5ZRBKEB82EP8",
"record_type":"PKEY", "expiration_time":"1d","private": false,
"relative_expiration": false, "supplemental": false, "shadow":
false}],"record_name_missing":"test_entry"}' "error"
gnunet-namestore -z $name -d -n "test_entry" -c test_namestore_api.conf >
/dev/null 2>&1
#Test DELETE
-gnunet-namestore -z $name -p -a -n "test_entry" -e "1d" -V
"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG" -t "PKEY" -c
test_namestore_api.conf
+gnunet-namestore -z $name -p -a -n "test_entry" -e "1d" -V
"000G006WVZ8HQ5YTVFNX09HK0VJVVQ9ZCBYDSCH3ERT04N5ZRBKEB82EP8" -t "PKEY" -c
test_namestore_api.conf
curl_delete "${namestore_link}/$name/test_entry" "HTTP/1.1 204"
curl_delete "${namestore_link}/$name/test_entry" "error"
-gnunet-namestore -z $name -p -a -n "test_entry" -e "1d" -V
"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG" -t "PKEY" -c
test_namestore_api.conf
+gnunet-namestore -z $name -p -a -n "test_entry" -e "1d" -V
"000G006WVZ8HQ5YTVFNX09HK0VJVVQ9ZCBYDSCH3ERT04N5ZRBKEB82EP8" -t "PKEY" -c
test_namestore_api.conf
curl_delete "${namestore_link}/$public/test_entry" "error"
gnunet-arm -e -c test_namestore_api.conf
diff --git a/src/nse/gnunet-nse-profiler.c b/src/nse/gnunet-nse-profiler.c
index 81a16b245..f653a716e 100644
--- a/src/nse/gnunet-nse-profiler.c
+++ b/src/nse/gnunet-nse-profiler.c
@@ -317,7 +317,7 @@ handle_estimate (void *cls,
}
size = GNUNET_snprintf (output_buffer,
sizeof(output_buffer),
- "%p %llu %llu %f %f %f\n",
+ "%p %u %llu %f %f %f\n",
peer,
peers_running,
(unsigned long long) timestamp.abs_value_us,
diff --git a/src/peerinfo-tool/gnunet-peerinfo.c
b/src/peerinfo-tool/gnunet-peerinfo.c
index 739249a93..987c7c3a0 100644
--- a/src/peerinfo-tool/gnunet-peerinfo.c
+++ b/src/peerinfo-tool/gnunet-peerinfo.c
@@ -338,9 +338,9 @@ print_address (void *cls,
ar->pc = pc;
ar->expiration = expiration;
GNUNET_asprintf (&ar->result,
- "%s:%u:%u",
+ "%s:%lu:%u",
address->transport_name,
- address->address_length,
+ (unsigned long) address->address_length,
address->local_info);
ar->atsc = GNUNET_TRANSPORT_address_to_string (cfg,
address,
diff --git a/src/peerinfo-tool/plugin_rest_peerinfo.c
b/src/peerinfo-tool/plugin_rest_peerinfo.c
index 99cec7e58..4bbc7442e 100644
--- a/src/peerinfo-tool/plugin_rest_peerinfo.c
+++ b/src/peerinfo-tool/plugin_rest_peerinfo.c
@@ -554,9 +554,9 @@ print_address (void *cls,
ar->pc = pc;
ar->expiration = expiration;
GNUNET_asprintf (&ar->result,
- "%s:%u:%u",
+ "%s:%lu:%u",
address->transport_name,
- address->address_length,
+ (unsigned long) address->address_length,
address->local_info);
ar->atsc = GNUNET_TRANSPORT_address_to_string (cfg,
address,
diff --git a/src/pq/pq.c b/src/pq/pq.c
index eca097e58..e9c960e33 100644
--- a/src/pq/pq.c
+++ b/src/pq/pq.c
@@ -1,6 +1,6 @@
/*
This file is part of GNUnet
- Copyright (C) 2014, 2015, 2016, 2017, 2019 GNUnet e.V.
+ Copyright (C) 2014, 2015, 2016, 2017, 2019, 2020 GNUnet e.V.
GNUnet is free software: you can redistribute it and/or modify it
under the terms of the GNU Affero General Public License as published
@@ -27,14 +27,7 @@
#include "platform.h"
#include "pq.h"
-/**
- * Execute a prepared statement.
- *
- * @param db database handle
- * @param name name of the prepared statement
- * @param params parameters to the statement
- * @return postgres result
- */
+
PGresult *
GNUNET_PQ_exec_prepared (struct GNUNET_PQ_Context *db,
const char *name,
@@ -120,12 +113,6 @@ GNUNET_PQ_exec_prepared (struct GNUNET_PQ_Context *db,
}
-/**
- * Free all memory that was allocated in @a rs during
- * #GNUNET_PQ_extract_result().
- *
- * @param rs reult specification to clean up
- */
void
GNUNET_PQ_cleanup_result (struct GNUNET_PQ_ResultSpec *rs)
{
@@ -136,17 +123,6 @@ GNUNET_PQ_cleanup_result (struct GNUNET_PQ_ResultSpec *rs)
}
-/**
- * Extract results from a query result according to the given
- * specification.
- *
- * @param result result to process
- * @param[in,out] rs result specification to extract for
- * @param row row from the result to extract
- * @return
- * #GNUNET_YES if all results could be extracted
- * #GNUNET_SYSERR if a result was invalid (non-existing field)
- */
int
GNUNET_PQ_extract_result (PGresult *result,
struct GNUNET_PQ_ResultSpec *rs,
@@ -160,6 +136,23 @@ GNUNET_PQ_extract_result (PGresult *result,
int ret;
spec = &rs[i];
+ if (spec->is_nullable)
+ {
+ int fnum;
+
+ fnum = PQfnumber (result,
+ spec->fname);
+ if (PQgetisnull (result,
+ row,
+ fnum))
+ {
+ if (NULL != spec->is_null)
+ *spec->is_null = true;
+ continue;
+ }
+ if (NULL != spec->is_null)
+ *spec->is_null = false;
+ }
ret = spec->conv (spec->cls,
result,
row,
diff --git a/src/pq/pq_eval.c b/src/pq/pq_eval.c
index 5bcf8ca0e..8d8b5b0f2 100644
--- a/src/pq/pq_eval.c
+++ b/src/pq/pq_eval.c
@@ -263,6 +263,7 @@ GNUNET_PQ_eval_prepared_singleton_select (struct
GNUNET_PQ_Context *db,
{
PGresult *result;
enum GNUNET_DB_QueryStatus qs;
+ int ntuples;
result = GNUNET_PQ_exec_prepared (db,
statement_name,
@@ -277,12 +278,13 @@ GNUNET_PQ_eval_prepared_singleton_select (struct
GNUNET_PQ_Context *db,
PQclear (result);
return qs;
}
- if (0 == PQntuples (result))
+ ntuples = PQntuples (result);
+ if (0 == ntuples)
{
PQclear (result);
return GNUNET_DB_STATUS_SUCCESS_NO_RESULTS;
}
- if (1 != PQntuples (result))
+ if (1 != ntuples)
{
/* more than one result, but there must be at most one */
GNUNET_break (0);
diff --git a/src/pq/pq_query_helper.c b/src/pq/pq_query_helper.c
index a36848f3a..cee84d203 100644
--- a/src/pq/pq_query_helper.c
+++ b/src/pq/pq_query_helper.c
@@ -1,6 +1,6 @@
/*
This file is part of GNUnet
- Copyright (C) 2014, 2015, 2016 GNUnet e.V.
+ Copyright (C) 2014, 2015, 2016, 2020 GNUnet e.V.
GNUnet is free software: you can redistribute it and/or modify it
under the terms of the GNU Affero General Public License as published
@@ -27,6 +27,56 @@
#include "gnunet_pq_lib.h"
+/**
+ * Function called to convert input argument into SQL parameters.
+ *
+ * @param cls closure
+ * @param data pointer to input argument
+ * @param data_len number of bytes in @a data (if applicable)
+ * @param[out] param_values SQL data to set
+ * @param[out] param_lengths SQL length data to set
+ * @param[out] param_formats SQL format data to set
+ * @param param_length number of entries available in the @a param_values, @a
param_lengths and @a param_formats arrays
+ * @param[out] scratch buffer for dynamic allocations (to be done via
#GNUNET_malloc()
+ * @param scratch_length number of entries left in @a scratch
+ * @return -1 on error, number of offsets used in @a scratch otherwise
+ */
+static int
+qconv_null (void *cls,
+ const void *data,
+ size_t data_len,
+ void *param_values[],
+ int param_lengths[],
+ int param_formats[],
+ unsigned int param_length,
+ void *scratch[],
+ unsigned int scratch_length)
+{
+ (void) scratch;
+ (void) scratch_length;
+ (void) data;
+ (void) data_len;
+ GNUNET_break (NULL == cls);
+ if (1 != param_length)
+ return -1;
+ param_values[0] = NULL;
+ param_lengths[0] = 0;
+ param_formats[0] = 1;
+ return 0;
+}
+
+
+struct GNUNET_PQ_QueryParam
+GNUNET_PQ_query_param_null (void)
+{
+ struct GNUNET_PQ_QueryParam res = {
+ &qconv_null, NULL, NULL, 0, 1
+ };
+
+ return res;
+}
+
+
/**
* Function called to convert input argument into SQL parameters.
*
@@ -64,33 +114,23 @@ qconv_fixed (void *cls,
}
-/**
- * Generate query parameter for a buffer @a ptr of
- * @a ptr_size bytes.
- *
- * @param ptr pointer to the query parameter to pass
- * @oaran ptr_size number of bytes in @a ptr
- */
struct GNUNET_PQ_QueryParam
GNUNET_PQ_query_param_fixed_size (const void *ptr,
size_t ptr_size)
{
- struct GNUNET_PQ_QueryParam res =
- { &qconv_fixed, NULL, ptr, ptr_size, 1 };
+ struct GNUNET_PQ_QueryParam res = {
+ &qconv_fixed, NULL, ptr, ptr_size, 1
+ };
return res;
}
-/**
- * Generate query parameter for a string.
- *
- * @param ptr pointer to the string query parameter to pass
- */
struct GNUNET_PQ_QueryParam
GNUNET_PQ_query_param_string (const char *ptr)
{
- return GNUNET_PQ_query_param_fixed_size (ptr, strlen (ptr));
+ return GNUNET_PQ_query_param_fixed_size (ptr,
+ strlen (ptr));
}
@@ -137,11 +177,6 @@ qconv_uint16 (void *cls,
}
-/**
- * Generate query parameter for an uint16_t in host byte order.
- *
- * @param x pointer to the query parameter to pass
- */
struct GNUNET_PQ_QueryParam
GNUNET_PQ_query_param_uint16 (const uint16_t *x)
{
@@ -195,11 +230,6 @@ qconv_uint32 (void *cls,
}
-/**
- * Generate query parameter for an uint32_t in host byte order.
- *
- * @param x pointer to the query parameter to pass
- */
struct GNUNET_PQ_QueryParam
GNUNET_PQ_query_param_uint32 (const uint32_t *x)
{
@@ -253,11 +283,6 @@ qconv_uint64 (void *cls,
}
-/**
- * Generate query parameter for an uint64_t in host byte order.
- *
- * @param x pointer to the query parameter to pass
- */
struct GNUNET_PQ_QueryParam
GNUNET_PQ_query_param_uint64 (const uint64_t *x)
{
@@ -310,13 +335,6 @@ qconv_rsa_public_key (void *cls,
}
-/**
- * Generate query parameter for an RSA public key. The
- * database must contain a BLOB type in the respective position.
- *
- * @param x the query parameter to pass
- * @return array entry for the query parameters to use
- */
struct GNUNET_PQ_QueryParam
GNUNET_PQ_query_param_rsa_public_key (const struct
GNUNET_CRYPTO_RsaPublicKey *x)
@@ -370,13 +388,6 @@ qconv_rsa_signature (void *cls,
}
-/**
- * Generate query parameter for an RSA signature. The
- * database must contain a BLOB type in the respective position.
- *
- * @param x the query parameter to pass
- * @return array entry for the query parameters to use
- */
struct GNUNET_PQ_QueryParam
GNUNET_PQ_query_param_rsa_signature (const struct GNUNET_CRYPTO_RsaSignature
*x)
{
@@ -432,13 +443,6 @@ qconv_rel_time (void *cls,
}
-/**
- * Generate query parameter for a relative time value.
- * The database must store a 64-bit integer.
- *
- * @param x pointer to the query parameter to pass
- * @return array entry for the query parameters to use
- */
struct GNUNET_PQ_QueryParam
GNUNET_PQ_query_param_relative_time (const struct GNUNET_TIME_Relative *x)
{
@@ -494,29 +498,17 @@ qconv_abs_time (void *cls,
}
-/**
- * Generate query parameter for an absolute time value.
- * The database must store a 64-bit integer.
- *
- * @param x pointer to the query parameter to pass
- * @return array entry for the query parameters to use
- */
struct GNUNET_PQ_QueryParam
GNUNET_PQ_query_param_absolute_time (const struct GNUNET_TIME_Absolute *x)
{
- struct GNUNET_PQ_QueryParam res =
- { &qconv_abs_time, NULL, x, sizeof(*x), 1 };
+ struct GNUNET_PQ_QueryParam res = {
+ &qconv_abs_time, NULL, x, sizeof(*x), 1
+ };
return res;
}
-/**
- * Generate query parameter for an absolute time value.
- * The database must store a 64-bit integer.
- *
- * @param x pointer to the query parameter to pass
- */
struct GNUNET_PQ_QueryParam
GNUNET_PQ_query_param_absolute_time_nbo (const struct
GNUNET_TIME_AbsoluteNBO *x)
diff --git a/src/pq/pq_result_helper.c b/src/pq/pq_result_helper.c
index f764593b0..546822e45 100644
--- a/src/pq/pq_result_helper.c
+++ b/src/pq/pq_result_helper.c
@@ -1,6 +1,6 @@
/*
This file is part of GNUnet
- Copyright (C) 2014, 2015, 2016 GNUnet e.V.
+ Copyright (C) 2014, 2015, 2016, 2020 GNUnet e.V.
GNUnet is free software: you can redistribute it and/or modify it
under the terms of the GNU Affero General Public License as published
@@ -27,6 +27,19 @@
#include "gnunet_pq_lib.h"
+struct GNUNET_PQ_ResultSpec
+GNUNET_PQ_result_spec_allow_null (struct GNUNET_PQ_ResultSpec rs,
+ bool *is_null)
+{
+ struct GNUNET_PQ_ResultSpec rsr;
+
+ rsr = rs;
+ rsr.is_nullable = true;
+ rsr.is_null = is_null;
+ return rsr;
+}
+
+
/**
* Function called to clean up memory allocated
* by a #GNUNET_PQ_ResultConverter.
@@ -112,14 +125,6 @@ extract_varsize_blob (void *cls,
}
-/**
- * Variable-size result expected.
- *
- * @param name name of the field in the table
- * @param[out] dst where to store the result, allocated
- * @param[out] sptr where to store the size of @a dst
- * @return array entry for the result specification to use
- */
struct GNUNET_PQ_ResultSpec
GNUNET_PQ_result_spec_variable_size (const char *name,
void **dst,
@@ -196,14 +201,6 @@ extract_fixed_blob (void *cls,
}
-/**
- * Fixed-size result expected.
- *
- * @param name name of the field in the table
- * @param[out] dst where to store the result
- * @param dst_size number of bytes in @a dst
- * @return array entry for the result specification to use
- */
struct GNUNET_PQ_ResultSpec
GNUNET_PQ_result_spec_fixed_size (const char *name,
void *dst,
@@ -301,13 +298,6 @@ clean_rsa_public_key (void *cls,
}
-/**
- * RSA public key expected.
- *
- * @param name name of the field in the table
- * @param[out] rsa where to store the result
- * @return array entry for the result specification to use
- */
struct GNUNET_PQ_ResultSpec
GNUNET_PQ_result_spec_rsa_public_key (const char *name,
struct GNUNET_CRYPTO_RsaPublicKey **rsa)
@@ -405,13 +395,6 @@ clean_rsa_signature (void *cls,
}
-/**
- * RSA signature expected.
- *
- * @param name name of the field in the table
- * @param[out] sig where to store the result;
- * @return array entry for the result specification to use
- */
struct GNUNET_PQ_ResultSpec
GNUNET_PQ_result_spec_rsa_signature (const char *name,
struct GNUNET_CRYPTO_RsaSignature **sig)
@@ -509,13 +492,6 @@ clean_string (void *cls,
}
-/**
- * 0-terminated string expected.
- *
- * @param name name of the field in the table
- * @param[out] dst where to store the result, allocated
- * @return array entry for the result specification to use
- */
struct GNUNET_PQ_ResultSpec
GNUNET_PQ_result_spec_string (const char *name,
char **dst)
@@ -595,13 +571,6 @@ extract_rel_time (void *cls,
}
-/**
- * Relative time expected.
- *
- * @param name name of the field in the table
- * @param[out] at where to store the result
- * @return array entry for the result specification to use
- */
struct GNUNET_PQ_ResultSpec
GNUNET_PQ_result_spec_relative_time (const char *name,
struct GNUNET_TIME_Relative *rt)
@@ -685,13 +654,6 @@ extract_abs_time (void *cls,
}
-/**
- * Absolute time expected.
- *
- * @param name name of the field in the table
- * @param[out] at where to store the result
- * @return array entry for the result specification to use
- */
struct GNUNET_PQ_ResultSpec
GNUNET_PQ_result_spec_absolute_time (const char *name,
struct GNUNET_TIME_Absolute *at)
@@ -706,13 +668,6 @@ GNUNET_PQ_result_spec_absolute_time (const char *name,
}
-/**
- * Absolute time in network byte order expected.
- *
- * @param name name of the field in the table
- * @param[out] at where to store the result
- * @return array entry for the result specification to use
- */
struct GNUNET_PQ_ResultSpec
GNUNET_PQ_result_spec_absolute_time_nbo (const char *name,
struct GNUNET_TIME_AbsoluteNBO *at)
@@ -786,13 +741,6 @@ extract_uint16 (void *cls,
}
-/**
- * uint16_t expected.
- *
- * @param name name of the field in the table
- * @param[out] u16 where to store the result
- * @return array entry for the result specification to use
- */
struct GNUNET_PQ_ResultSpec
GNUNET_PQ_result_spec_uint16 (const char *name,
uint16_t *u16)
@@ -869,13 +817,6 @@ extract_uint32 (void *cls,
}
-/**
- * uint32_t expected.
- *
- * @param name name of the field in the table
- * @param[out] u32 where to store the result
- * @return array entry for the result specification to use
- */
struct GNUNET_PQ_ResultSpec
GNUNET_PQ_result_spec_uint32 (const char *name,
uint32_t *u32)
@@ -952,22 +893,16 @@ extract_uint64 (void *cls,
}
-/**
- * uint64_t expected.
- *
- * @param name name of the field in the table
- * @param[out] u64 where to store the result
- * @return array entry for the result specification to use
- */
struct GNUNET_PQ_ResultSpec
GNUNET_PQ_result_spec_uint64 (const char *name,
uint64_t *u64)
{
- struct GNUNET_PQ_ResultSpec res =
- { &extract_uint64,
+ struct GNUNET_PQ_ResultSpec res = {
+ &extract_uint64,
NULL,
NULL,
- (void *) u64, sizeof(*u64), (name), NULL };
+ (void *) u64, sizeof(*u64), (name), NULL
+ };
return res;
}
diff --git a/src/pq/test_pq.c b/src/pq/test_pq.c
index b09354af8..e588da45d 100644
--- a/src/pq/test_pq.c
+++ b/src/pq/test_pq.c
@@ -47,10 +47,11 @@ postgres_prepare (struct GNUNET_PQ_Context *db)
",u16"
",u32"
",u64"
+ ",unn"
") VALUES "
"($1, $2, $3, $4, $5, $6,"
- "$7, $8, $9);",
- 9),
+ "$7, $8, $9, $10);",
+ 10),
GNUNET_PQ_make_prepare ("test_select",
"SELECT"
" pub"
@@ -62,6 +63,7 @@ postgres_prepare (struct GNUNET_PQ_Context *db)
",u16"
",u32"
",u64"
+ ",unn"
" FROM test_pq"
" ORDER BY abs_time DESC "
" LIMIT 1;",
@@ -106,7 +108,8 @@ run_queries (struct GNUNET_PQ_Context *db)
uint32_t u322;
uint64_t u64;
uint64_t u642;
-
+ uint64_t uzzz = 42;
+
priv = GNUNET_CRYPTO_rsa_private_key_create (1024);
pub = GNUNET_CRYPTO_rsa_private_key_get_public (priv);
memset (&hmsg, 42, sizeof(hmsg));
@@ -127,11 +130,13 @@ run_queries (struct GNUNET_PQ_Context *db)
GNUNET_PQ_query_param_uint16 (&u16),
GNUNET_PQ_query_param_uint32 (&u32),
GNUNET_PQ_query_param_uint64 (&u64),
+ GNUNET_PQ_query_param_null (),
GNUNET_PQ_query_param_end
};
struct GNUNET_PQ_QueryParam params_select[] = {
GNUNET_PQ_query_param_end
};
+ bool got_null = false;
struct GNUNET_PQ_ResultSpec results_select[] = {
GNUNET_PQ_result_spec_rsa_public_key ("pub", &pub2),
GNUNET_PQ_result_spec_rsa_signature ("sig", &sig2),
@@ -142,6 +147,9 @@ run_queries (struct GNUNET_PQ_Context *db)
GNUNET_PQ_result_spec_uint16 ("u16", &u162),
GNUNET_PQ_result_spec_uint32 ("u32", &u322),
GNUNET_PQ_result_spec_uint64 ("u64", &u642),
+ GNUNET_PQ_result_spec_allow_null (
+ GNUNET_PQ_result_spec_uint64 ("unn", &uzzz),
+ &got_null),
GNUNET_PQ_result_spec_end
};
@@ -197,6 +205,8 @@ run_queries (struct GNUNET_PQ_Context *db)
GNUNET_break (16 == u162);
GNUNET_break (32 == u322);
GNUNET_break (64 == u642);
+ GNUNET_break (42 == uzzz);
+ GNUNET_break (got_null);
GNUNET_PQ_cleanup_result (results_select);
PQclear (result);
}
@@ -225,6 +235,7 @@ main (int argc,
",u16 INT2 NOT NULL"
",u32 INT4 NOT NULL"
",u64 INT8 NOT NULL"
+ ",unn INT8"
")"),
GNUNET_PQ_EXECUTE_STATEMENT_END
};
diff --git a/src/pt/test_gns_vpn.c b/src/pt/test_gns_vpn.c
index cf0455477..7b4abaec2 100644
--- a/src/pt/test_gns_vpn.c
+++ b/src/pt/test_gns_vpn.c
@@ -560,7 +560,7 @@ identity_cb (void *cls,
void **ctx,
const char *name)
{
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone_key;
+ const struct GNUNET_IDENTITY_PrivateKey *zone_key;
struct GNUNET_GNSRECORD_Data rd;
char *rd_string;
char *peername;
diff --git a/src/reclaim/Makefile.am b/src/reclaim/Makefile.am
index a58127abf..9463f19d9 100644
--- a/src/reclaim/Makefile.am
+++ b/src/reclaim/Makefile.am
@@ -103,6 +103,7 @@ gnunet_service_reclaim_SOURCES = \
gnunet-service-reclaim_tickets.h
gnunet_service_reclaim_LDADD = \
$(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \
+ $(top_builddir)/src/identity/libgnunetidentity.la \
$(top_builddir)/src/util/libgnunetutil.la \
$(top_builddir)/src/namestore/libgnunetnamestore.la \
$(top_builddir)/src/statistics/libgnunetstatistics.la \
diff --git a/src/reclaim/gnunet-reclaim.c b/src/reclaim/gnunet-reclaim.c
index b9306b802..cefb66b8f 100644
--- a/src/reclaim/gnunet-reclaim.c
+++ b/src/reclaim/gnunet-reclaim.c
@@ -152,12 +152,12 @@ static struct GNUNET_RECLAIM_TicketIterator
*ticket_iterator;
/**
* ego private key
*/
-static const struct GNUNET_CRYPTO_EcdsaPrivateKey *pkey;
+static const struct GNUNET_IDENTITY_PrivateKey *pkey;
/**
* rp public key
*/
-static struct GNUNET_CRYPTO_EcdsaPublicKey rp_key;
+static struct GNUNET_IDENTITY_PublicKey rp_key;
/**
* Ticket to consume
@@ -261,7 +261,7 @@ store_cont (void *cls, int32_t success, const char *emsg)
static void
process_attrs (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPublicKey *identity,
+ const struct GNUNET_IDENTITY_PublicKey *identity,
const struct GNUNET_RECLAIM_Attribute *attr,
const struct GNUNET_RECLAIM_Presentation *presentation)
{
@@ -346,7 +346,7 @@ ticket_iter (void *cls, const struct GNUNET_RECLAIM_Ticket
*ticket)
aud =
GNUNET_STRINGS_data_to_string_alloc (&ticket->audience,
sizeof(struct
- GNUNET_CRYPTO_EcdsaPublicKey));
+ GNUNET_IDENTITY_PublicKey));
ref = GNUNET_STRINGS_data_to_string_alloc (&ticket->rnd,
sizeof(ticket->rnd));
tkt =
GNUNET_STRINGS_data_to_string_alloc (ticket,
@@ -511,7 +511,7 @@ iter_finished (void *cls)
static void
iter_cb (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPublicKey *identity,
+ const struct GNUNET_IDENTITY_PublicKey *identity,
const struct GNUNET_RECLAIM_Attribute *attr)
{
struct GNUNET_RECLAIM_AttributeListEntry *le;
@@ -653,7 +653,7 @@ cred_iter_finished (void *cls)
static void
cred_iter_cb (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPublicKey *identity,
+ const struct GNUNET_IDENTITY_PublicKey *identity,
const struct GNUNET_RECLAIM_Credential *cred)
{
char *cred_str;
@@ -734,7 +734,7 @@ start_process ()
if ((NULL != rp) &&
(GNUNET_OK !=
- GNUNET_CRYPTO_ecdsa_public_key_from_string (rp, strlen (rp), &rp_key)) )
+ GNUNET_IDENTITY_public_key_from_string (rp, &rp_key)) )
{
fprintf (stderr, "%s is not a public key!\n", rp);
cleanup_task = GNUNET_SCHEDULER_add_now (&do_cleanup, NULL);
diff --git a/src/reclaim/gnunet-service-reclaim.c
b/src/reclaim/gnunet-service-reclaim.c
index d2cdc62a2..0774fecea 100644
--- a/src/reclaim/gnunet-service-reclaim.c
+++ b/src/reclaim/gnunet-service-reclaim.c
@@ -110,7 +110,7 @@ struct Iterator
/**
* Key of the zone we are iterating over.
*/
- struct GNUNET_CRYPTO_EcdsaPrivateKey identity;
+ struct GNUNET_IDENTITY_PrivateKey identity;
/**
* Namestore iterator
@@ -266,7 +266,7 @@ struct AttributeDeleteHandle
/**
* Identity
*/
- struct GNUNET_CRYPTO_EcdsaPrivateKey identity;
+ struct GNUNET_IDENTITY_PrivateKey identity;
/**
@@ -334,12 +334,12 @@ struct AttributeStoreHandle
/**
* Identity
*/
- struct GNUNET_CRYPTO_EcdsaPrivateKey identity;
+ struct GNUNET_IDENTITY_PrivateKey identity;
/**
* Identity pubkey
*/
- struct GNUNET_CRYPTO_EcdsaPublicKey identity_pkey;
+ struct GNUNET_IDENTITY_PublicKey identity_pkey;
/**
* QueueEntry
@@ -862,7 +862,7 @@ handle_revoke_ticket_message (void *cls, const struct
RevokeTicketMessage *rm)
*/
static void
consume_result_cb (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPublicKey *identity,
+ const struct GNUNET_IDENTITY_PublicKey *identity,
const struct GNUNET_RECLAIM_AttributeList *attrs,
const struct GNUNET_RECLAIM_PresentationList *presentations,
int32_t success,
@@ -1082,7 +1082,7 @@ handle_attribute_store_message (void *cls,
ash->r_id = ntohl (sam->id);
ash->identity = sam->identity;
ash->exp.rel_value_us = GNUNET_ntohll (sam->exp);
- GNUNET_CRYPTO_ecdsa_key_get_public (&sam->identity, &ash->identity_pkey);
+ GNUNET_IDENTITY_key_get_public (&sam->identity, &ash->identity_pkey);
GNUNET_SERVICE_client_continue (idp->client);
ash->client = idp;
@@ -1157,7 +1157,7 @@ cred_error (void *cls)
*/
static void
cred_add_cb (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
+ const struct GNUNET_IDENTITY_PrivateKey *zone,
const char *label,
unsigned int rd_count,
const struct GNUNET_GNSRECORD_Data *rd)
@@ -1266,7 +1266,7 @@ handle_credential_store_message (void *cls,
ash->r_id = ntohl (sam->id);
ash->identity = sam->identity;
ash->exp.rel_value_us = GNUNET_ntohll (sam->exp);
- GNUNET_CRYPTO_ecdsa_key_get_public (&sam->identity, &ash->identity_pkey);
+ GNUNET_IDENTITY_key_get_public (&sam->identity, &ash->identity_pkey);
GNUNET_SERVICE_client_continue (idp->client);
ash->client = idp;
@@ -1311,7 +1311,7 @@ send_delete_response (struct AttributeDeleteHandle *adh,
int32_t success)
*/
static void
ticket_iter (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
+ const struct GNUNET_IDENTITY_PrivateKey *zone,
const char *label,
unsigned int rd_count,
const struct GNUNET_GNSRECORD_Data *rd)
@@ -1739,7 +1739,7 @@ attr_iter_error (void *cls)
*/
static void
attr_iter_cb (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
+ const struct GNUNET_IDENTITY_PrivateKey *zone,
const char *label,
unsigned int rd_count,
const struct GNUNET_GNSRECORD_Data *rd)
@@ -1764,7 +1764,7 @@ attr_iter_cb (void *cls,
GNUNET_MESSAGE_TYPE_RECLAIM_ATTRIBUTE_RESULT);
arm->id = htonl (ai->request_id);
arm->attr_len = htons (rd->data_size);
- GNUNET_CRYPTO_ecdsa_key_get_public (zone, &arm->identity);
+ GNUNET_IDENTITY_key_get_public (zone, &arm->identity);
data_tmp = (char *) &arm[1];
GNUNET_memcpy (data_tmp, rd->data, rd->data_size);
GNUNET_MQ_send (ai->client->mq, env);
@@ -1923,7 +1923,7 @@ cred_iter_error (void *cls)
*/
static void
cred_iter_cb (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
+ const struct GNUNET_IDENTITY_PrivateKey *zone,
const char *label,
unsigned int rd_count,
const struct GNUNET_GNSRECORD_Data *rd)
@@ -1948,7 +1948,7 @@ cred_iter_cb (void *cls,
GNUNET_MESSAGE_TYPE_RECLAIM_CREDENTIAL_RESULT);
arm->id = htonl (ai->request_id);
arm->credential_len = htons (rd->data_size);
- GNUNET_CRYPTO_ecdsa_key_get_public (zone, &arm->identity);
+ GNUNET_IDENTITY_key_get_public (zone, &arm->identity);
data_tmp = (char *) &arm[1];
GNUNET_memcpy (data_tmp, rd->data, rd->data_size);
diff --git a/src/reclaim/gnunet-service-reclaim_tickets.c
b/src/reclaim/gnunet-service-reclaim_tickets.c
index 4dd8100f9..0b1730bec 100644
--- a/src/reclaim/gnunet-service-reclaim_tickets.c
+++ b/src/reclaim/gnunet-service-reclaim_tickets.c
@@ -86,12 +86,12 @@ struct RECLAIM_TICKETS_ConsumeHandle
/**
* Audience Key
*/
- struct GNUNET_CRYPTO_EcdsaPrivateKey identity;
+ struct GNUNET_IDENTITY_PrivateKey identity;
/**
* Audience Key
*/
- struct GNUNET_CRYPTO_EcdsaPublicKey identity_pub;
+ struct GNUNET_IDENTITY_PublicKey identity_pub;
/**
* Lookup DLL
@@ -180,7 +180,7 @@ struct TicketIssueHandle
/**
* Issuer Key
*/
- struct GNUNET_CRYPTO_EcdsaPrivateKey identity;
+ struct GNUNET_IDENTITY_PrivateKey identity;
/**
* Ticket to issue
@@ -263,7 +263,7 @@ struct RECLAIM_TICKETS_RevokeHandle
/**
* Issuer Key
*/
- struct GNUNET_CRYPTO_EcdsaPrivateKey identity;
+ struct GNUNET_IDENTITY_PrivateKey identity;
/**
* Callback
@@ -490,7 +490,7 @@ rvk_ticket_update_finished (void *cls)
*/
static void
rvk_ticket_update (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
+ const struct GNUNET_IDENTITY_PrivateKey *zone,
const char *label,
unsigned int rd_count,
const struct GNUNET_GNSRECORD_Data *rd)
@@ -665,7 +665,7 @@ move_attr_finished (void *cls, int32_t success, const char
*emsg)
*/
static void
rvk_move_attr_cb (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
+ const struct GNUNET_IDENTITY_PrivateKey *zone,
const char *label,
unsigned int rd_count,
const struct GNUNET_GNSRECORD_Data *rd)
@@ -850,7 +850,7 @@ remove_ticket_cont (void *cls, int32_t success, const char
*emsg)
*/
static void
revoke_attrs_cb (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
+ const struct GNUNET_IDENTITY_PrivateKey *zone,
const char *label,
unsigned int rd_count,
const struct GNUNET_GNSRECORD_Data *rd)
@@ -913,7 +913,7 @@ rvk_attrs_err_cb (void *cls)
*/
struct RECLAIM_TICKETS_RevokeHandle *
RECLAIM_TICKETS_revoke (const struct GNUNET_RECLAIM_Ticket *ticket,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity,
+ const struct GNUNET_IDENTITY_PrivateKey *identity,
RECLAIM_TICKETS_RevokeCallback cb,
void *cb_cls)
{
@@ -925,7 +925,7 @@ RECLAIM_TICKETS_revoke (const struct GNUNET_RECLAIM_Ticket
*ticket,
rvk->cb_cls = cb_cls;
rvk->identity = *identity;
rvk->ticket = *ticket;
- GNUNET_CRYPTO_ecdsa_key_get_public (&rvk->identity, &rvk->ticket.identity);
+ GNUNET_IDENTITY_key_get_public (&rvk->identity, &rvk->ticket.identity);
/** Get shared attributes **/
label = GNUNET_STRINGS_data_to_string_alloc (&ticket->rnd,
sizeof(ticket->rnd));
@@ -1184,7 +1184,7 @@ lookup_authz_cb (void *cls,
* @return handle to the operation
*/
struct RECLAIM_TICKETS_ConsumeHandle *
-RECLAIM_TICKETS_consume (const struct GNUNET_CRYPTO_EcdsaPrivateKey *id,
+RECLAIM_TICKETS_consume (const struct GNUNET_IDENTITY_PrivateKey *id,
const struct GNUNET_RECLAIM_Ticket *ticket,
RECLAIM_TICKETS_ConsumeCallback cb,
void *cb_cls)
@@ -1195,7 +1195,7 @@ RECLAIM_TICKETS_consume (const struct
GNUNET_CRYPTO_EcdsaPrivateKey *id,
cth = GNUNET_new (struct RECLAIM_TICKETS_ConsumeHandle);
cth->identity = *id;
- GNUNET_CRYPTO_ecdsa_key_get_public (&cth->identity, &cth->identity_pub);
+ GNUNET_IDENTITY_key_get_public (&cth->identity, &cth->identity_pub);
cth->attrs = GNUNET_new (struct GNUNET_RECLAIM_AttributeList);
cth->presentations = GNUNET_new (struct GNUNET_RECLAIM_PresentationList);
cth->ticket = *ticket;
@@ -1453,7 +1453,7 @@ filter_tickets_error_cb (void *cls)
*/
static void
filter_tickets_cb (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
+ const struct GNUNET_IDENTITY_PrivateKey *zone,
const char *label,
unsigned int rd_count,
const struct GNUNET_GNSRECORD_Data *rd)
@@ -1489,7 +1489,7 @@ filter_tickets_cb (void *cls,
// cmp audience
if (0 == memcmp (&tih->ticket.audience,
&ticket->audience,
- sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey)))
+ sizeof(struct GNUNET_IDENTITY_PublicKey)))
{
tih->ticket = *ticket;
continue;
@@ -1602,7 +1602,7 @@ filter_tickets_finished_cb (void *cls)
{
struct TicketIssueHandle *tih = cls;
- GNUNET_CRYPTO_ecdsa_key_get_public (&tih->identity, &tih->ticket.identity);
+ GNUNET_IDENTITY_key_get_public (&tih->identity, &tih->ticket.identity);
GNUNET_RECLAIM_id_generate (&tih->ticket.rnd);
issue_ticket (tih);
}
@@ -1620,9 +1620,9 @@ filter_tickets_finished_cb (void *cls)
* FIXME: Return handle??
*/
void
-RECLAIM_TICKETS_issue (const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity,
+RECLAIM_TICKETS_issue (const struct GNUNET_IDENTITY_PrivateKey *identity,
const struct GNUNET_RECLAIM_AttributeList *attrs,
- const struct GNUNET_CRYPTO_EcdsaPublicKey *audience,
+ const struct GNUNET_IDENTITY_PublicKey *audience,
RECLAIM_TICKETS_TicketResult cb,
void *cb_cls)
{
@@ -1680,7 +1680,7 @@ cleanup_iter (struct RECLAIM_TICKETS_Iterator *iter)
*/
static void
collect_tickets_cb (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
+ const struct GNUNET_IDENTITY_PrivateKey *zone,
const char *label,
unsigned int rd_count,
const struct GNUNET_GNSRECORD_Data *rd)
@@ -1765,7 +1765,7 @@ RECLAIM_TICKETS_iteration_stop (struct
RECLAIM_TICKETS_Iterator *iter)
*/
struct RECLAIM_TICKETS_Iterator *
RECLAIM_TICKETS_iteration_start (
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity,
+ const struct GNUNET_IDENTITY_PrivateKey *identity,
RECLAIM_TICKETS_TicketIter cb,
void *cb_cls)
{
diff --git a/src/reclaim/gnunet-service-reclaim_tickets.h
b/src/reclaim/gnunet-service-reclaim_tickets.h
index 0dd790fc7..9c31a6143 100644
--- a/src/reclaim/gnunet-service-reclaim_tickets.h
+++ b/src/reclaim/gnunet-service-reclaim_tickets.h
@@ -138,7 +138,7 @@ typedef void (*RECLAIM_TICKETS_TicketResult) (
*/
typedef void (*RECLAIM_TICKETS_ConsumeCallback) (
void *cls,
- const struct GNUNET_CRYPTO_EcdsaPublicKey *identity,
+ const struct GNUNET_IDENTITY_PublicKey *identity,
const struct GNUNET_RECLAIM_AttributeList *attributes,
const struct GNUNET_RECLAIM_PresentationList *presentations,
int32_t success,
@@ -167,7 +167,7 @@ typedef void (*RECLAIM_TICKETS_RevokeCallback) (void *cls,
int32_t success);
*/
struct RECLAIM_TICKETS_RevokeHandle *
RECLAIM_TICKETS_revoke (const struct GNUNET_RECLAIM_Ticket *ticket,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity,
+ const struct GNUNET_IDENTITY_PrivateKey *identity,
RECLAIM_TICKETS_RevokeCallback cb,
void *cb_cls);
@@ -193,7 +193,7 @@ RECLAIM_TICKETS_revoke_cancel (struct
RECLAIM_TICKETS_RevokeHandle *rh);
* @return handle to the operation
*/
struct RECLAIM_TICKETS_ConsumeHandle *
-RECLAIM_TICKETS_consume (const struct GNUNET_CRYPTO_EcdsaPrivateKey *id,
+RECLAIM_TICKETS_consume (const struct GNUNET_IDENTITY_PrivateKey *id,
const struct GNUNET_RECLAIM_Ticket *ticket,
RECLAIM_TICKETS_ConsumeCallback cb,
void *cb_cls);
@@ -220,9 +220,9 @@ RECLAIM_TICKETS_consume_cancel (struct
RECLAIM_TICKETS_ConsumeHandle *cth);
* FIXME: Return handle??
*/
void
-RECLAIM_TICKETS_issue (const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity,
+RECLAIM_TICKETS_issue (const struct GNUNET_IDENTITY_PrivateKey *identity,
const struct GNUNET_RECLAIM_AttributeList *attrs,
- const struct GNUNET_CRYPTO_EcdsaPublicKey *audience,
+ const struct GNUNET_IDENTITY_PublicKey *audience,
RECLAIM_TICKETS_TicketResult cb,
void *cb_cls);
@@ -255,7 +255,7 @@ RECLAIM_TICKETS_iteration_stop (struct
RECLAIM_TICKETS_Iterator *iter);
*/
struct RECLAIM_TICKETS_Iterator *
RECLAIM_TICKETS_iteration_start (
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity,
+ const struct GNUNET_IDENTITY_PrivateKey *identity,
RECLAIM_TICKETS_TicketIter cb,
void *cb_cls);
diff --git a/src/reclaim/oidc_helper.c b/src/reclaim/oidc_helper.c
index b307a358c..c6d56e02d 100644
--- a/src/reclaim/oidc_helper.c
+++ b/src/reclaim/oidc_helper.c
@@ -154,10 +154,12 @@ fix_base64 (char *str)
replace_char (str, '/', '_');
}
+
static json_t*
-generate_userinfo_json(const struct GNUNET_CRYPTO_EcdsaPublicKey *sub_key,
- const struct GNUNET_RECLAIM_AttributeList *attrs,
- const struct GNUNET_RECLAIM_PresentationList
*presentations)
+generate_userinfo_json (const struct GNUNET_IDENTITY_PublicKey *sub_key,
+ const struct GNUNET_RECLAIM_AttributeList *attrs,
+ const struct
+ GNUNET_RECLAIM_PresentationList *presentations)
{
struct GNUNET_RECLAIM_AttributeListEntry *le;
struct GNUNET_RECLAIM_PresentationListEntry *ple;
@@ -180,7 +182,7 @@ generate_userinfo_json(const struct
GNUNET_CRYPTO_EcdsaPublicKey *sub_key,
subject =
GNUNET_STRINGS_data_to_string_alloc (sub_key,
sizeof(struct
- GNUNET_CRYPTO_EcdsaPublicKey));
+ GNUNET_IDENTITY_PublicKey));
body = json_object ();
aggr_names = json_object ();
aggr_sources = json_object ();
@@ -206,7 +208,8 @@ generate_userinfo_json(const struct
GNUNET_CRYPTO_EcdsaPublicKey *sub_key,
ple->presentation->data,
ple->presentation->data_size);
json_object_set_new (aggr_sources_jwt,
- GNUNET_RECLAIM_presentation_number_to_typename
(ple->presentation->type),
+ GNUNET_RECLAIM_presentation_number_to_typename (
+ ple->presentation->type),
json_string (pres_val_str) );
json_object_set_new (aggr_sources, source_name, aggr_sources_jwt);
GNUNET_free (pres_val_str);
@@ -286,6 +289,7 @@ generate_userinfo_json(const struct
GNUNET_CRYPTO_EcdsaPublicKey *sub_key,
return body;
}
+
/**
* Generate userinfo JSON as string
*
@@ -295,14 +299,15 @@ generate_userinfo_json(const struct
GNUNET_CRYPTO_EcdsaPublicKey *sub_key,
* @return Userinfo JSON
*/
char *
-OIDC_generate_userinfo (const struct GNUNET_CRYPTO_EcdsaPublicKey *sub_key,
+OIDC_generate_userinfo (const struct GNUNET_IDENTITY_PublicKey *sub_key,
const struct GNUNET_RECLAIM_AttributeList *attrs,
- const struct GNUNET_RECLAIM_PresentationList
*presentations)
+ const struct
+ GNUNET_RECLAIM_PresentationList *presentations)
{
char *body_str;
- json_t* body = generate_userinfo_json (sub_key,
- attrs,
- presentations);
+ json_t*body = generate_userinfo_json (sub_key,
+ attrs,
+ presentations);
body_str = json_dumps (body, JSON_INDENT (0) | JSON_COMPACT);
json_decref (body);
return body_str;
@@ -321,10 +326,11 @@ OIDC_generate_userinfo (const struct
GNUNET_CRYPTO_EcdsaPublicKey *sub_key,
* @return a new base64-encoded JWT string.
*/
char *
-OIDC_generate_id_token (const struct GNUNET_CRYPTO_EcdsaPublicKey *aud_key,
- const struct GNUNET_CRYPTO_EcdsaPublicKey *sub_key,
+OIDC_generate_id_token (const struct GNUNET_IDENTITY_PublicKey *aud_key,
+ const struct GNUNET_IDENTITY_PublicKey *sub_key,
const struct GNUNET_RECLAIM_AttributeList *attrs,
- const struct GNUNET_RECLAIM_PresentationList
*presentations,
+ const struct
+ GNUNET_RECLAIM_PresentationList *presentations,
const struct GNUNET_TIME_Relative *expiration_time,
const char *nonce,
const char *secret_key)
@@ -356,11 +362,11 @@ OIDC_generate_id_token (const struct
GNUNET_CRYPTO_EcdsaPublicKey *aud_key,
subject =
GNUNET_STRINGS_data_to_string_alloc (sub_key,
sizeof(struct
- GNUNET_CRYPTO_EcdsaPublicKey));
+ GNUNET_IDENTITY_PublicKey));
audience =
GNUNET_STRINGS_data_to_string_alloc (aud_key,
sizeof(struct
- GNUNET_CRYPTO_EcdsaPublicKey));
+ GNUNET_IDENTITY_PublicKey));
header = create_jwt_header ();
// aud REQUIRED public key client_id must be there
@@ -438,10 +444,11 @@ OIDC_generate_id_token (const struct
GNUNET_CRYPTO_EcdsaPublicKey *aud_key,
* @return a new authorization code (caller must free)
*/
char *
-OIDC_build_authz_code (const struct GNUNET_CRYPTO_EcdsaPrivateKey *issuer,
+OIDC_build_authz_code (const struct GNUNET_IDENTITY_PrivateKey *issuer,
const struct GNUNET_RECLAIM_Ticket *ticket,
const struct GNUNET_RECLAIM_AttributeList *attrs,
- const struct GNUNET_RECLAIM_PresentationList
*presentations,
+ const struct
+ GNUNET_RECLAIM_PresentationList *presentations,
const char *nonce_str,
const char *code_challenge)
{
@@ -525,7 +532,7 @@ OIDC_build_authz_code (const struct
GNUNET_CRYPTO_EcdsaPrivateKey *issuer,
// Get length
code_payload_len = sizeof(struct GNUNET_CRYPTO_EccSignaturePurpose)
+ payload_len + sizeof(struct
- GNUNET_CRYPTO_EcdsaSignature);
+ GNUNET_IDENTITY_Signature);
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Length of data to encode: %lu\n",
code_payload_len);
@@ -544,10 +551,10 @@ OIDC_build_authz_code (const struct
GNUNET_CRYPTO_EcdsaPrivateKey *issuer,
buf_ptr += payload_len;
// Sign and store signature
if (GNUNET_SYSERR ==
- GNUNET_CRYPTO_ecdsa_sign_ (issuer,
- purpose,
- (struct GNUNET_CRYPTO_EcdsaSignature *)
- buf_ptr))
+ GNUNET_IDENTITY_sign_ (issuer,
+ purpose,
+ (struct GNUNET_IDENTITY_Signature *)
+ buf_ptr))
{
GNUNET_break (0);
GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Unable to sign code\n");
@@ -576,7 +583,7 @@ OIDC_build_authz_code (const struct
GNUNET_CRYPTO_EcdsaPrivateKey *issuer,
* @return GNUNET_OK if successful, else GNUNET_SYSERR
*/
int
-OIDC_parse_authz_code (const struct GNUNET_CRYPTO_EcdsaPublicKey *audience,
+OIDC_parse_authz_code (const struct GNUNET_IDENTITY_PublicKey *audience,
const char *code,
const char *code_verifier,
struct GNUNET_RECLAIM_Ticket *ticket,
@@ -593,7 +600,7 @@ OIDC_parse_authz_code (const struct
GNUNET_CRYPTO_EcdsaPublicKey *audience,
char *code_challenge;
char *code_verifier_hash;
struct GNUNET_CRYPTO_EccSignaturePurpose *purpose;
- struct GNUNET_CRYPTO_EcdsaSignature *signature;
+ struct GNUNET_IDENTITY_Signature *signature;
uint32_t code_challenge_len;
uint32_t attrs_ser_len;
uint32_t pres_ser_len;
@@ -609,7 +616,7 @@ OIDC_parse_authz_code (const struct
GNUNET_CRYPTO_EcdsaPublicKey *audience,
(void **) &code_payload);
if (code_payload_len < sizeof(struct GNUNET_CRYPTO_EccSignaturePurpose)
+ sizeof(struct OIDC_Parameters)
- + sizeof(struct GNUNET_CRYPTO_EcdsaSignature))
+ + sizeof(struct GNUNET_IDENTITY_Signature))
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Authorization code malformed\n");
GNUNET_free (code_payload);
@@ -620,10 +627,10 @@ OIDC_parse_authz_code (const struct
GNUNET_CRYPTO_EcdsaPublicKey *audience,
plaintext_len = code_payload_len;
plaintext_len -= sizeof(struct GNUNET_CRYPTO_EccSignaturePurpose);
ptr = (char *) &purpose[1];
- plaintext_len -= sizeof(struct GNUNET_CRYPTO_EcdsaSignature);
+ plaintext_len -= sizeof(struct GNUNET_IDENTITY_Signature);
plaintext = ptr;
ptr += plaintext_len;
- signature = (struct GNUNET_CRYPTO_EcdsaSignature *) ptr;
+ signature = (struct GNUNET_IDENTITY_Signature *) ptr;
params = (struct OIDC_Parameters *) plaintext;
// cmp code_challenge code_verifier
@@ -684,10 +691,11 @@ OIDC_parse_authz_code (const struct
GNUNET_CRYPTO_EcdsaPublicKey *audience,
return GNUNET_SYSERR;
}
if (GNUNET_OK !=
- GNUNET_CRYPTO_ecdsa_verify_ (GNUNET_SIGNATURE_PURPOSE_RECLAIM_CODE_SIGN,
- purpose,
- signature,
- &ticket->identity))
+ GNUNET_IDENTITY_signature_verify_ (
+ GNUNET_SIGNATURE_PURPOSE_RECLAIM_CODE_SIGN,
+ purpose,
+ signature,
+ &(ticket->identity)))
{
GNUNET_free (code_payload);
if (NULL != *nonce_str)
@@ -840,7 +848,8 @@ OIDC_check_scopes_for_claim_request (const char*scopes,
}
}
- } else if (0 == strcmp (attr, scope_variable))
+ }
+ else if (0 == strcmp (attr, scope_variable))
{
/** attribute matches requested scope **/
GNUNET_free (scope_variables);
diff --git a/src/reclaim/oidc_helper.h b/src/reclaim/oidc_helper.h
index 10a6f3d1f..eb1022423 100644
--- a/src/reclaim/oidc_helper.h
+++ b/src/reclaim/oidc_helper.h
@@ -50,8 +50,8 @@
* @return a new base64-encoded JWT string.
*/
char*
-OIDC_generate_id_token (const struct GNUNET_CRYPTO_EcdsaPublicKey *aud_key,
- const struct GNUNET_CRYPTO_EcdsaPublicKey *sub_key,
+OIDC_generate_id_token (const struct GNUNET_IDENTITY_PublicKey *aud_key,
+ const struct GNUNET_IDENTITY_PublicKey *sub_key,
const struct GNUNET_RECLAIM_AttributeList *attrs,
const struct GNUNET_RECLAIM_PresentationList *presentations,
const struct GNUNET_TIME_Relative *expiration_time,
@@ -71,7 +71,7 @@ OIDC_generate_id_token (const struct
GNUNET_CRYPTO_EcdsaPublicKey *aud_key,
* @return a new authorization code (caller must free)
*/
char*
-OIDC_build_authz_code (const struct GNUNET_CRYPTO_EcdsaPrivateKey *issuer,
+OIDC_build_authz_code (const struct GNUNET_IDENTITY_PrivateKey *issuer,
const struct GNUNET_RECLAIM_Ticket *ticket,
const struct GNUNET_RECLAIM_AttributeList *attrs,
const struct GNUNET_RECLAIM_PresentationList
*presentations,
@@ -93,7 +93,7 @@ OIDC_build_authz_code (const struct
GNUNET_CRYPTO_EcdsaPrivateKey *issuer,
* @return GNUNET_OK if successful, else GNUNET_SYSERR
*/
int
-OIDC_parse_authz_code (const struct GNUNET_CRYPTO_EcdsaPublicKey *ecdsa_pub,
+OIDC_parse_authz_code (const struct GNUNET_IDENTITY_PublicKey *ecdsa_pub,
const char *code,
const char *code_verifier,
struct GNUNET_RECLAIM_Ticket *ticket,
@@ -152,7 +152,7 @@ OIDC_check_scopes_for_claim_request (const char *scopes,
* @return Userinfo JSON
*/
char *
-OIDC_generate_userinfo (const struct GNUNET_CRYPTO_EcdsaPublicKey *sub_key,
+OIDC_generate_userinfo (const struct GNUNET_IDENTITY_PublicKey *sub_key,
const struct GNUNET_RECLAIM_AttributeList *attrs,
const struct GNUNET_RECLAIM_PresentationList
*presentations);
diff --git a/src/reclaim/plugin_rest_openid_connect.c
b/src/reclaim/plugin_rest_openid_connect.c
index 5b0bb2b6f..7a8a886bd 100644
--- a/src/reclaim/plugin_rest_openid_connect.c
+++ b/src/reclaim/plugin_rest_openid_connect.c
@@ -300,7 +300,7 @@ struct OIDC_Variables
/**
* The RP client public key
*/
- struct GNUNET_CRYPTO_EcdsaPublicKey client_pkey;
+ struct GNUNET_IDENTITY_PublicKey client_pkey;
/**
* The OIDC client id of the RP
@@ -411,7 +411,7 @@ struct RequestHandle
/**
* Pointer to ego private key
*/
- struct GNUNET_CRYPTO_EcdsaPrivateKey priv_key;
+ struct GNUNET_IDENTITY_PrivateKey priv_key;
/**
* OIDC variables
@@ -972,7 +972,7 @@ oidc_ticket_issue_cb (void *cls,
(NULL != handle->tld))
{
GNUNET_asprintf (&redirect_uri,
- "%s.%s/%s?%s=%s&state=%s",
+ "%s.%s/%s%s%s=%s&state=%s",
handle->redirect_prefix,
handle->tld,
handle->redirect_suffix,
@@ -1087,7 +1087,7 @@ oidc_cred_collect_finished_cb (void *cls)
*/
static void
oidc_cred_collect (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPublicKey *identity,
+ const struct GNUNET_IDENTITY_PublicKey *identity,
const struct GNUNET_RECLAIM_Credential *cred)
{
struct RequestHandle *handle = cls;
@@ -1211,7 +1211,7 @@ attr_in_userinfo_request (struct RequestHandle *handle,
*/
static void
oidc_attr_collect (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPublicKey *identity,
+ const struct GNUNET_IDENTITY_PublicKey *identity,
const struct GNUNET_RECLAIM_Attribute *attr)
{
struct RequestHandle *handle = cls;
@@ -1260,8 +1260,8 @@ code_redirect (void *cls)
struct RequestHandle *handle = cls;
struct GNUNET_TIME_Absolute current_time;
struct GNUNET_TIME_Absolute *relog_time;
- struct GNUNET_CRYPTO_EcdsaPublicKey pubkey;
- struct GNUNET_CRYPTO_EcdsaPublicKey ego_pkey;
+ struct GNUNET_IDENTITY_PublicKey pubkey;
+ struct GNUNET_IDENTITY_PublicKey ego_pkey;
struct GNUNET_HashCode cache_key;
char *identity_cookie;
@@ -1281,11 +1281,8 @@ code_redirect (void *cls)
if (current_time.abs_value_us <= relog_time->abs_value_us)
{
if (GNUNET_OK !=
- GNUNET_CRYPTO_ecdsa_public_key_from_string (handle->oidc
+ GNUNET_IDENTITY_public_key_from_string (handle->oidc
->login_identity,
- strlen (
- handle->oidc
- ->login_identity),
&pubkey))
{
handle->emsg = GNUNET_strdup (OIDC_ERROR_KEY_INVALID_COOKIE);
@@ -1376,7 +1373,7 @@ lookup_redirect_uri_result (void *cls,
char *tmp;
char *tmp_key_str;
char *pos;
- struct GNUNET_CRYPTO_EcdsaPublicKey redirect_zone;
+ struct GNUNET_IDENTITY_PublicKey redirect_zone;
handle->gns_op = NULL;
if (0 == rd_count)
@@ -1608,10 +1605,10 @@ static void
tld_iter (void *cls, const char *section, const char *option, const char
*value)
{
struct RequestHandle *handle = cls;
- struct GNUNET_CRYPTO_EcdsaPublicKey pkey;
+ struct GNUNET_IDENTITY_PublicKey pkey;
if (GNUNET_OK !=
- GNUNET_CRYPTO_ecdsa_public_key_from_string (value, strlen (value),
&pkey))
+ GNUNET_IDENTITY_public_key_from_string (value, &pkey))
{
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Skipping non key %s\n", value);
return;
@@ -1635,8 +1632,8 @@ authorize_endpoint (struct GNUNET_REST_RequestHandle
*con_handle,
{
struct RequestHandle *handle = cls;
struct EgoEntry *tmp_ego;
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv_key;
- struct GNUNET_CRYPTO_EcdsaPublicKey pkey;
+ const struct GNUNET_IDENTITY_PrivateKey *priv_key;
+ struct GNUNET_IDENTITY_PublicKey pkey;
cookie_identity_interpretation (handle);
@@ -1664,9 +1661,7 @@ authorize_endpoint (struct GNUNET_REST_RequestHandle
*con_handle,
}
if (GNUNET_OK !=
- GNUNET_CRYPTO_ecdsa_public_key_from_string (handle->oidc->client_id,
- strlen (
- handle->oidc->client_id),
+ GNUNET_IDENTITY_public_key_from_string (handle->oidc->client_id,
&handle->oidc->client_pkey))
{
handle->emsg = GNUNET_strdup (OIDC_ERROR_KEY_UNAUTHORIZED_CLIENT);
@@ -1682,7 +1677,7 @@ authorize_endpoint (struct GNUNET_REST_RequestHandle
*con_handle,
for (tmp_ego = ego_head; NULL != tmp_ego; tmp_ego = tmp_ego->next)
{
priv_key = GNUNET_IDENTITY_ego_get_private_key (tmp_ego->ego);
- GNUNET_CRYPTO_ecdsa_key_get_public (priv_key, &pkey);
+ GNUNET_IDENTITY_key_get_public (priv_key, &pkey);
if (0 == GNUNET_memcmp (&pkey, &handle->oidc->client_pkey))
{
handle->tld = GNUNET_strdup (tmp_ego->identifier);
@@ -1865,7 +1860,7 @@ parse_credentials_post_body (struct RequestHandle *handle,
static int
check_authorization (struct RequestHandle *handle,
- struct GNUNET_CRYPTO_EcdsaPublicKey *cid)
+ struct GNUNET_IDENTITY_PublicKey *cid)
{
char *expected_pass;
char *received_cid;
@@ -1902,7 +1897,7 @@ check_authorization (struct RequestHandle *handle,
GNUNET_STRINGS_string_to_data (received_cid,
strlen (received_cid),
cid,
- sizeof(struct
GNUNET_CRYPTO_EcdsaPublicKey));
+ sizeof(struct GNUNET_IDENTITY_PublicKey));
GNUNET_free (received_cid);
return GNUNET_OK;
@@ -1948,7 +1943,7 @@ check_authorization (struct RequestHandle *handle,
GNUNET_STRINGS_string_to_data (received_cid,
strlen (received_cid),
cid,
- sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey));
+ sizeof(struct GNUNET_IDENTITY_PublicKey));
GNUNET_free (received_cpw);
GNUNET_free (received_cid);
@@ -1958,10 +1953,10 @@ check_authorization (struct RequestHandle *handle,
const struct EgoEntry *
find_ego (struct RequestHandle *handle,
- struct GNUNET_CRYPTO_EcdsaPublicKey *test_key)
+ struct GNUNET_IDENTITY_PublicKey *test_key)
{
struct EgoEntry *ego_entry;
- struct GNUNET_CRYPTO_EcdsaPublicKey pub_key;
+ struct GNUNET_IDENTITY_PublicKey pub_key;
for (ego_entry = ego_head; NULL != ego_entry;
ego_entry = ego_entry->next)
@@ -1992,7 +1987,7 @@ token_endpoint (struct GNUNET_REST_RequestHandle
*con_handle,
struct GNUNET_RECLAIM_AttributeList *cl = NULL;
struct GNUNET_RECLAIM_PresentationList *pl = NULL;
struct GNUNET_RECLAIM_Ticket ticket;
- struct GNUNET_CRYPTO_EcdsaPublicKey cid;
+ struct GNUNET_IDENTITY_PublicKey cid;
struct GNUNET_HashCode cache_key;
struct MHD_Response *resp;
char *grant_type;
@@ -2145,7 +2140,7 @@ token_endpoint (struct GNUNET_REST_RequestHandle
*con_handle,
*/
static void
consume_ticket (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPublicKey *identity,
+ const struct GNUNET_IDENTITY_PublicKey *identity,
const struct GNUNET_RECLAIM_Attribute *attr,
const struct GNUNET_RECLAIM_Presentation *pres)
{
@@ -2225,7 +2220,7 @@ userinfo_endpoint (struct GNUNET_REST_RequestHandle
*con_handle,
char *authorization_type;
char *authorization_access_token;
const struct EgoEntry *aud_ego;
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *privkey;
+ const struct GNUNET_IDENTITY_PrivateKey *privkey;
GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Getting userinfo\n");
GNUNET_CRYPTO_hash (OIDC_AUTHORIZATION_HEADER_KEY,
@@ -2349,7 +2344,7 @@ list_ego (void *cls,
const char *identifier)
{
struct EgoEntry *ego_entry;
- struct GNUNET_CRYPTO_EcdsaPublicKey pk;
+ struct GNUNET_IDENTITY_PublicKey pk;
if ((NULL == ego) && (ID_REST_STATE_INIT == state))
{
@@ -2362,7 +2357,7 @@ list_ego (void *cls,
{
ego_entry = GNUNET_new (struct EgoEntry);
GNUNET_IDENTITY_ego_get_public_key (ego, &pk);
- ego_entry->keystring = GNUNET_CRYPTO_ecdsa_public_key_to_string (&pk);
+ ego_entry->keystring = GNUNET_IDENTITY_public_key_to_string (&pk);
ego_entry->ego = ego;
ego_entry->identifier = GNUNET_strdup (identifier);
GNUNET_CONTAINER_DLL_insert_tail (ego_head,
@@ -2389,7 +2384,7 @@ list_ego (void *cls,
/* Add */
ego_entry = GNUNET_new (struct EgoEntry);
GNUNET_IDENTITY_ego_get_public_key (ego, &pk);
- ego_entry->keystring = GNUNET_CRYPTO_ecdsa_public_key_to_string (&pk);
+ ego_entry->keystring = GNUNET_IDENTITY_public_key_to_string (&pk);
ego_entry->ego = ego;
ego_entry->identifier = GNUNET_strdup (identifier);
GNUNET_CONTAINER_DLL_insert_tail (ego_head,
diff --git a/src/reclaim/plugin_rest_reclaim.c
b/src/reclaim/plugin_rest_reclaim.c
index ff11d2a56..022744c82 100644
--- a/src/reclaim/plugin_rest_reclaim.c
+++ b/src/reclaim/plugin_rest_reclaim.c
@@ -172,7 +172,7 @@ struct RequestHandle
/**
* Pointer to ego private key
*/
- struct GNUNET_CRYPTO_EcdsaPrivateKey priv_key;
+ struct GNUNET_IDENTITY_PrivateKey priv_key;
/**
* Rest connection
@@ -440,14 +440,14 @@ ticket_collect (void *cls, const struct
GNUNET_RECLAIM_Ticket *ticket)
tmp =
GNUNET_STRINGS_data_to_string_alloc (&ticket->identity,
sizeof(struct
- GNUNET_CRYPTO_EcdsaPublicKey));
+ GNUNET_IDENTITY_PublicKey));
value = json_string (tmp);
json_object_set_new (json_resource, "issuer", value);
GNUNET_free (tmp);
tmp =
GNUNET_STRINGS_data_to_string_alloc (&ticket->audience,
sizeof(struct
- GNUNET_CRYPTO_EcdsaPublicKey));
+ GNUNET_IDENTITY_PublicKey));
value = json_string (tmp);
json_object_set_new (json_resource, "audience", value);
GNUNET_free (tmp);
@@ -465,7 +465,7 @@ add_credential_cont (struct GNUNET_REST_RequestHandle
*con_handle,
void *cls)
{
struct RequestHandle *handle = cls;
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity_priv;
+ const struct GNUNET_IDENTITY_PrivateKey *identity_priv;
const char *identity;
struct EgoEntry *ego_entry;
struct GNUNET_RECLAIM_Credential *attribute;
@@ -545,7 +545,7 @@ add_credential_cont (struct GNUNET_REST_RequestHandle
*con_handle,
*/
static void
cred_collect (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPublicKey *identity,
+ const struct GNUNET_IDENTITY_PublicKey *identity,
const struct GNUNET_RECLAIM_Credential *cred)
{
struct RequestHandle *handle = cls;
@@ -631,7 +631,7 @@ list_credential_cont (struct GNUNET_REST_RequestHandle
*con_handle,
void *cls)
{
struct RequestHandle *handle = cls;
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv_key;
+ const struct GNUNET_IDENTITY_PrivateKey *priv_key;
struct EgoEntry *ego_entry;
char *identity;
@@ -688,7 +688,7 @@ delete_credential_cont (struct GNUNET_REST_RequestHandle
*con_handle,
void *cls)
{
struct RequestHandle *handle = cls;
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv_key;
+ const struct GNUNET_IDENTITY_PrivateKey *priv_key;
struct GNUNET_RECLAIM_Credential attr;
struct EgoEntry *ego_entry;
char *identity_id_str;
@@ -754,7 +754,7 @@ list_tickets_cont (struct GNUNET_REST_RequestHandle
*con_handle,
const char *url,
void *cls)
{
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv_key;
+ const struct GNUNET_IDENTITY_PrivateKey *priv_key;
struct RequestHandle *handle = cls;
struct EgoEntry *ego_entry;
char *identity;
@@ -801,7 +801,7 @@ add_attribute_cont (struct GNUNET_REST_RequestHandle
*con_handle,
const char *url,
void *cls)
{
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity_priv;
+ const struct GNUNET_IDENTITY_PrivateKey *identity_priv;
const char *identity;
struct RequestHandle *handle = cls;
struct EgoEntry *ego_entry;
@@ -949,7 +949,7 @@ parse_jwt (const struct GNUNET_RECLAIM_Credential *cred,
*/
static void
attr_collect (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPublicKey *identity,
+ const struct GNUNET_IDENTITY_PublicKey *identity,
const struct GNUNET_RECLAIM_Attribute *attr)
{
struct RequestHandle *handle = cls;
@@ -996,7 +996,7 @@ list_attribute_cont (struct GNUNET_REST_RequestHandle
*con_handle,
const char *url,
void *cls)
{
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv_key;
+ const struct GNUNET_IDENTITY_PrivateKey *priv_key;
struct RequestHandle *handle = cls;
struct EgoEntry *ego_entry;
char *identity;
@@ -1050,7 +1050,7 @@ delete_attribute_cont (struct GNUNET_REST_RequestHandle
*con_handle,
const char *url,
void *cls)
{
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv_key;
+ const struct GNUNET_IDENTITY_PrivateKey *priv_key;
struct RequestHandle *handle = cls;
struct GNUNET_RECLAIM_Attribute attr;
struct EgoEntry *ego_entry;
@@ -1108,11 +1108,11 @@ revoke_ticket_cont (struct GNUNET_REST_RequestHandle
*con_handle,
const char *url,
void *cls)
{
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity_priv;
+ const struct GNUNET_IDENTITY_PrivateKey *identity_priv;
struct RequestHandle *handle = cls;
struct EgoEntry *ego_entry;
struct GNUNET_RECLAIM_Ticket *ticket = NULL;
- struct GNUNET_CRYPTO_EcdsaPublicKey tmp_pk;
+ struct GNUNET_IDENTITY_PublicKey tmp_pk;
char term_data[handle->rest_handle->data_size + 1];
json_t *data_json;
json_error_t err;
@@ -1156,7 +1156,7 @@ revoke_ticket_cont (struct GNUNET_REST_RequestHandle
*con_handle,
GNUNET_IDENTITY_ego_get_public_key (ego_entry->ego, &tmp_pk);
if (0 == memcmp (&ticket->identity,
&tmp_pk,
- sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey)))
+ sizeof(struct GNUNET_IDENTITY_PublicKey)))
break;
}
if (NULL == ego_entry)
@@ -1178,7 +1178,7 @@ revoke_ticket_cont (struct GNUNET_REST_RequestHandle
*con_handle,
static void
consume_cont (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPublicKey *identity,
+ const struct GNUNET_IDENTITY_PublicKey *identity,
const struct GNUNET_RECLAIM_Attribute *attr,
const struct GNUNET_RECLAIM_Presentation *pres)
{
@@ -1215,11 +1215,11 @@ consume_ticket_cont (struct GNUNET_REST_RequestHandle
*con_handle,
const char *url,
void *cls)
{
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity_priv;
+ const struct GNUNET_IDENTITY_PrivateKey *identity_priv;
struct RequestHandle *handle = cls;
struct EgoEntry *ego_entry;
struct GNUNET_RECLAIM_Ticket *ticket;
- struct GNUNET_CRYPTO_EcdsaPublicKey tmp_pk;
+ struct GNUNET_IDENTITY_PublicKey tmp_pk;
char term_data[handle->rest_handle->data_size + 1];
json_t *data_json;
json_error_t err;
@@ -1259,7 +1259,7 @@ consume_ticket_cont (struct GNUNET_REST_RequestHandle
*con_handle,
GNUNET_IDENTITY_ego_get_public_key (ego_entry->ego, &tmp_pk);
if (0 == memcmp (&ticket->audience,
&tmp_pk,
- sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey)))
+ sizeof(struct GNUNET_IDENTITY_PublicKey)))
break;
}
if (NULL == ego_entry)
@@ -1343,7 +1343,7 @@ list_ego (void *cls,
const char *identifier)
{
struct EgoEntry *ego_entry;
- struct GNUNET_CRYPTO_EcdsaPublicKey pk;
+ struct GNUNET_IDENTITY_PublicKey pk;
if ((NULL == ego) && (ID_REST_STATE_INIT == state))
{
@@ -1354,7 +1354,7 @@ list_ego (void *cls,
{
ego_entry = GNUNET_new (struct EgoEntry);
GNUNET_IDENTITY_ego_get_public_key (ego, &pk);
- ego_entry->keystring = GNUNET_CRYPTO_ecdsa_public_key_to_string (&pk);
+ ego_entry->keystring = GNUNET_IDENTITY_public_key_to_string (&pk);
ego_entry->ego = ego;
ego_entry->identifier = GNUNET_strdup (identifier);
GNUNET_CONTAINER_DLL_insert_tail (ego_head,
@@ -1380,7 +1380,7 @@ list_ego (void *cls,
/* Add */
ego_entry = GNUNET_new (struct EgoEntry);
GNUNET_IDENTITY_ego_get_public_key (ego, &pk);
- ego_entry->keystring = GNUNET_CRYPTO_ecdsa_public_key_to_string (&pk);
+ ego_entry->keystring = GNUNET_IDENTITY_public_key_to_string (&pk);
ego_entry->ego = ego;
ego_entry->identifier = GNUNET_strdup (identifier);
GNUNET_CONTAINER_DLL_insert_tail (ego_head,
diff --git a/src/reclaim/reclaim.h b/src/reclaim/reclaim.h
index bc7f34365..aae8ee89a 100644
--- a/src/reclaim/reclaim.h
+++ b/src/reclaim/reclaim.h
@@ -29,7 +29,7 @@
#define RECLAIM_H
#include "gnunet_common.h"
-
+#include "gnunet_identity_service.h"
GNUNET_NETWORK_STRUCT_BEGIN
@@ -62,7 +62,7 @@ struct AttributeStoreMessage
/**
* Identity
*/
- struct GNUNET_CRYPTO_EcdsaPrivateKey identity;
+ struct GNUNET_IDENTITY_PrivateKey identity;
/* followed by the serialized attribute */
};
@@ -91,7 +91,7 @@ struct AttributeDeleteMessage
/**
* Identity
*/
- struct GNUNET_CRYPTO_EcdsaPrivateKey identity;
+ struct GNUNET_IDENTITY_PrivateKey identity;
/* followed by the serialized attribute */
};
@@ -151,7 +151,7 @@ struct AttributeResultMessage
/**
* The public key of the identity.
*/
- struct GNUNET_CRYPTO_EcdsaPublicKey identity;
+ struct GNUNET_IDENTITY_PublicKey identity;
/* followed by:
* serialized attribute data
@@ -186,7 +186,7 @@ struct CredentialResultMessage
/**
* The public key of the identity.
*/
- struct GNUNET_CRYPTO_EcdsaPublicKey identity;
+ struct GNUNET_IDENTITY_PublicKey identity;
/* followed by:
* serialized credential data
@@ -212,7 +212,7 @@ struct AttributeIterationStartMessage
/**
* Identity.
*/
- struct GNUNET_CRYPTO_EcdsaPrivateKey identity;
+ struct GNUNET_IDENTITY_PrivateKey identity;
};
@@ -251,7 +251,7 @@ struct CredentialIterationStartMessage
/**
* Identity.
*/
- struct GNUNET_CRYPTO_EcdsaPrivateKey identity;
+ struct GNUNET_IDENTITY_PrivateKey identity;
};
@@ -323,7 +323,7 @@ struct TicketIterationStartMessage
/**
* Identity.
*/
- struct GNUNET_CRYPTO_EcdsaPrivateKey identity;
+ struct GNUNET_IDENTITY_PrivateKey identity;
};
@@ -379,12 +379,12 @@ struct IssueTicketMessage
/**
* Identity.
*/
- struct GNUNET_CRYPTO_EcdsaPrivateKey identity;
+ struct GNUNET_IDENTITY_PrivateKey identity;
/**
* Requesting party.
*/
- struct GNUNET_CRYPTO_EcdsaPublicKey rp;
+ struct GNUNET_IDENTITY_PublicKey rp;
/**
* length of serialized attribute list
@@ -412,7 +412,7 @@ struct RevokeTicketMessage
/**
* Identity.
*/
- struct GNUNET_CRYPTO_EcdsaPrivateKey identity;
+ struct GNUNET_IDENTITY_PrivateKey identity;
/**
* length of serialized attribute list
@@ -493,7 +493,7 @@ struct ConsumeTicketMessage
/**
* Identity.
*/
- struct GNUNET_CRYPTO_EcdsaPrivateKey identity;
+ struct GNUNET_IDENTITY_PrivateKey identity;
/**
* The ticket to consume
@@ -539,7 +539,7 @@ struct ConsumeTicketResultMessage
/**
* The public key of the identity.
*/
- struct GNUNET_CRYPTO_EcdsaPublicKey identity;
+ struct GNUNET_IDENTITY_PublicKey identity;
/* followed by:
* serialized attributes data
diff --git a/src/reclaim/reclaim_api.c b/src/reclaim/reclaim_api.c
index 1e0251519..f4f2b946a 100644
--- a/src/reclaim/reclaim_api.c
+++ b/src/reclaim/reclaim_api.c
@@ -235,7 +235,7 @@ struct GNUNET_RECLAIM_AttributeIterator
/**
* Private key of the zone.
*/
- struct GNUNET_CRYPTO_EcdsaPrivateKey identity;
+ struct GNUNET_IDENTITY_PrivateKey identity;
/**
* The operation id this zone iteration operation has
@@ -302,7 +302,7 @@ struct GNUNET_RECLAIM_CredentialIterator
/**
* Private key of the zone.
*/
- struct GNUNET_CRYPTO_EcdsaPrivateKey identity;
+ struct GNUNET_IDENTITY_PrivateKey identity;
/**
* The operation id this zone iteration operation has
@@ -704,7 +704,7 @@ check_attribute_result (void *cls, const struct
AttributeResultMessage *msg)
static void
handle_attribute_result (void *cls, const struct AttributeResultMessage *msg)
{
- static struct GNUNET_CRYPTO_EcdsaPrivateKey identity_dummy;
+ static struct GNUNET_IDENTITY_PrivateKey identity_dummy;
struct GNUNET_RECLAIM_Handle *h = cls;
struct GNUNET_RECLAIM_AttributeIterator *it;
struct GNUNET_RECLAIM_Operation *op;
@@ -806,7 +806,7 @@ static void
handle_credential_result (void *cls, const struct
CredentialResultMessage *msg)
{
- static struct GNUNET_CRYPTO_EcdsaPrivateKey identity_dummy;
+ static struct GNUNET_IDENTITY_PrivateKey identity_dummy;
struct GNUNET_RECLAIM_Handle *h = cls;
struct GNUNET_RECLAIM_CredentialIterator *it;
struct GNUNET_RECLAIM_Operation *op;
@@ -1134,7 +1134,7 @@ GNUNET_RECLAIM_disconnect (struct GNUNET_RECLAIM_Handle
*h)
struct GNUNET_RECLAIM_Operation *
GNUNET_RECLAIM_attribute_store (
struct GNUNET_RECLAIM_Handle *h,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *pkey,
+ const struct GNUNET_IDENTITY_PrivateKey *pkey,
const struct GNUNET_RECLAIM_Attribute *attr,
const struct GNUNET_TIME_Relative *exp_interval,
GNUNET_RECLAIM_ContinuationWithStatus cont,
@@ -1181,7 +1181,7 @@ GNUNET_RECLAIM_attribute_store (
struct GNUNET_RECLAIM_Operation *
GNUNET_RECLAIM_attribute_delete (
struct GNUNET_RECLAIM_Handle *h,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *pkey,
+ const struct GNUNET_IDENTITY_PrivateKey *pkey,
const struct GNUNET_RECLAIM_Attribute *attr,
GNUNET_RECLAIM_ContinuationWithStatus cont,
void *cont_cls)
@@ -1226,7 +1226,7 @@ GNUNET_RECLAIM_attribute_delete (
struct GNUNET_RECLAIM_Operation *
GNUNET_RECLAIM_credential_store (
struct GNUNET_RECLAIM_Handle *h,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *pkey,
+ const struct GNUNET_IDENTITY_PrivateKey *pkey,
const struct GNUNET_RECLAIM_Credential *attr,
const struct GNUNET_TIME_Relative *exp_interval,
GNUNET_RECLAIM_ContinuationWithStatus cont,
@@ -1273,7 +1273,7 @@ GNUNET_RECLAIM_credential_store (
struct GNUNET_RECLAIM_Operation *
GNUNET_RECLAIM_credential_delete (
struct GNUNET_RECLAIM_Handle *h,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *pkey,
+ const struct GNUNET_IDENTITY_PrivateKey *pkey,
const struct GNUNET_RECLAIM_Credential *attr,
GNUNET_RECLAIM_ContinuationWithStatus cont,
void *cont_cls)
@@ -1330,7 +1330,7 @@ GNUNET_RECLAIM_credential_delete (
struct GNUNET_RECLAIM_AttributeIterator *
GNUNET_RECLAIM_get_attributes_start (
struct GNUNET_RECLAIM_Handle *h,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity,
+ const struct GNUNET_IDENTITY_PrivateKey *identity,
GNUNET_SCHEDULER_TaskCallback error_cb,
void *error_cb_cls,
GNUNET_RECLAIM_AttributeResult proc,
@@ -1439,7 +1439,7 @@ GNUNET_RECLAIM_get_attributes_stop (struct
GNUNET_RECLAIM_AttributeIterator *it)
struct GNUNET_RECLAIM_CredentialIterator *
GNUNET_RECLAIM_get_credentials_start (
struct GNUNET_RECLAIM_Handle *h,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity,
+ const struct GNUNET_IDENTITY_PrivateKey *identity,
GNUNET_SCHEDULER_TaskCallback error_cb,
void *error_cb_cls,
GNUNET_RECLAIM_CredentialResult proc,
@@ -1541,8 +1541,8 @@ GNUNET_RECLAIM_get_credentials_stop (struct
struct GNUNET_RECLAIM_Operation *
GNUNET_RECLAIM_ticket_issue (
struct GNUNET_RECLAIM_Handle *h,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *iss,
- const struct GNUNET_CRYPTO_EcdsaPublicKey *rp,
+ const struct GNUNET_IDENTITY_PrivateKey *iss,
+ const struct GNUNET_IDENTITY_PublicKey *rp,
const struct GNUNET_RECLAIM_AttributeList *attrs,
GNUNET_RECLAIM_IssueTicketCallback cb,
void *cb_cls)
@@ -1590,7 +1590,7 @@ GNUNET_RECLAIM_ticket_issue (
struct GNUNET_RECLAIM_Operation *
GNUNET_RECLAIM_ticket_consume (
struct GNUNET_RECLAIM_Handle *h,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity,
+ const struct GNUNET_IDENTITY_PrivateKey *identity,
const struct GNUNET_RECLAIM_Ticket *ticket,
GNUNET_RECLAIM_AttributeTicketResult cb,
void *cb_cls)
@@ -1636,7 +1636,7 @@ GNUNET_RECLAIM_ticket_consume (
struct GNUNET_RECLAIM_TicketIterator *
GNUNET_RECLAIM_ticket_iteration_start (
struct GNUNET_RECLAIM_Handle *h,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity,
+ const struct GNUNET_IDENTITY_PrivateKey *identity,
GNUNET_SCHEDULER_TaskCallback error_cb,
void *error_cb_cls,
GNUNET_RECLAIM_TicketCallback proc,
@@ -1731,7 +1731,7 @@ GNUNET_RECLAIM_ticket_iteration_stop (struct
GNUNET_RECLAIM_TicketIterator *it)
struct GNUNET_RECLAIM_Operation *
GNUNET_RECLAIM_ticket_revoke (
struct GNUNET_RECLAIM_Handle *h,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity,
+ const struct GNUNET_IDENTITY_PrivateKey *identity,
const struct GNUNET_RECLAIM_Ticket *ticket,
GNUNET_RECLAIM_ContinuationWithStatus cb,
void *cb_cls)
diff --git a/src/reclaim/test_reclaim_attribute.c
b/src/reclaim/test_reclaim_attribute.c
index f71d86b56..f8faf8021 100644
--- a/src/reclaim/test_reclaim_attribute.c
+++ b/src/reclaim/test_reclaim_attribute.c
@@ -9,12 +9,10 @@ main (int argc, char *argv[])
struct GNUNET_RECLAIM_AttributeList *al;
struct GNUNET_RECLAIM_AttributeList *al_two;
struct GNUNET_RECLAIM_AttributeListEntry *ale;
- struct GNUNET_RECLAIM_Attribute *attr;
char attrname[100];
char attrdata[100];
size_t ser_len_claimed;
size_t ser_len_actual;
- ssize_t deser_len;
char *ser_data;
int count = 0;
diff --git a/src/regex/regex_block_lib.c b/src/regex/regex_block_lib.c
index a309c2305..159e8bf8a 100644
--- a/src/regex/regex_block_lib.c
+++ b/src/regex/regex_block_lib.c
@@ -352,14 +352,14 @@ REGEX_BLOCK_iterate (const struct RegexBlock *block,
}
off = len;
LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Start iterating block of size %u, proof %u, off %u edges %u\n",
- size, len, off, n);
+ "Start iterating block of size %lu, proof %u, off %lu edges %u\n",
+ (unsigned long) size, len, (unsigned long) off, n);
/* &aux[off] always points to our token */
for (n = 0; n < num_edges; n++)
{
LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Edge %u/%u, off %u tokenlen %u (%.*s)\n",
- n + 1, num_edges, off,
+ "Edge %u/%u, off %lu tokenlen %u (%.*s)\n",
+ n + 1, num_edges, (unsigned long) off,
ntohs (edges[n].token_length), ntohs (edges[n].token_length),
&aux[off]);
if (NULL != iterator)
diff --git a/src/regex/regex_internal_dht.c b/src/regex/regex_internal_dht.c
index d2c69f131..39d7cd847 100644
--- a/src/regex/regex_internal_dht.c
+++ b/src/regex/regex_internal_dht.c
@@ -427,8 +427,7 @@ regex_find_path (const struct GNUNET_HashCode *key,
LOG (GNUNET_ERROR_TYPE_DEBUG,
"Accept state found, now searching for paths to %s\n",
- GNUNET_h2s (key),
- (unsigned int) ctx->position);
+ GNUNET_h2s (key));
get_h = GNUNET_DHT_get_start (ctx->info->dht, /* handle */
GNUNET_BLOCK_TYPE_REGEX_ACCEPT, /* type */
key, /* key to search */
@@ -534,8 +533,8 @@ regex_result_iterator (void *cls,
return GNUNET_YES; // We found an accept state!
}
LOG (GNUNET_ERROR_TYPE_DEBUG,
- "* %u, %u, [%u]\n",
- ctx->position,
+ "* %lu, %lu, [%u]\n",
+ (unsigned long) ctx->position,
strlen (ctx->info->description),
GNUNET_BLOCK_is_accepting (block, result->size));
regex_next_edge (block, result->size, ctx);
@@ -729,7 +728,7 @@ REGEX_INTERNAL_search (struct GNUNET_DHT_Handle *dht,
"Initial key for `%s' is %s (based on `%.*s')\n",
string,
GNUNET_h2s (&key),
- size,
+ (int) size,
string);
ctx = GNUNET_new (struct RegexSearchContext);
ctx->position = size;
diff --git a/src/regex/regex_test_graph.c b/src/regex/regex_test_graph.c
index 8e1e00fd4..c8efae772 100644
--- a/src/regex/regex_test_graph.c
+++ b/src/regex/regex_test_graph.c
@@ -177,8 +177,7 @@ REGEX_TEST_automaton_save_graph_step (void *cls, unsigned
int count,
}
else
{
- GNUNET_asprintf (&s_acc, "\"%s\" [shape=doublecircle];\n", name,
- s->scc_id);
+ GNUNET_asprintf (&s_acc, "\"%s\" [shape=doublecircle];\n", name);
}
}
else if (GNUNET_YES == ctx->coloring)
@@ -189,7 +188,7 @@ REGEX_TEST_automaton_save_graph_step (void *cls, unsigned
int count,
}
else
{
- GNUNET_asprintf (&s_acc, "\"%s\" [shape=circle];\n", name, s->scc_id);
+ GNUNET_asprintf (&s_acc, "\"%s\" [shape=circle];\n", name);
}
GNUNET_assert (NULL != s_acc);
@@ -228,7 +227,7 @@ REGEX_TEST_automaton_save_graph_step (void *cls, unsigned
int count,
else
{
GNUNET_asprintf (&s_tran, "\"%s\" -> \"%s\" [label = \"ε\"];\n", name,
- to_name, s->scc_id);
+ to_name);
}
}
else
@@ -242,7 +241,7 @@ REGEX_TEST_automaton_save_graph_step (void *cls, unsigned
int count,
else
{
GNUNET_asprintf (&s_tran, "\"%s\" -> \"%s\" [label = \"%s\"];\n", name,
- to_name, ctran->label, s->scc_id);
+ to_name, ctran->label);
}
}
diff --git a/src/revocation/Makefile.am b/src/revocation/Makefile.am
index 9d98502a6..b1a079a0d 100644
--- a/src/revocation/Makefile.am
+++ b/src/revocation/Makefile.am
@@ -30,6 +30,7 @@ libgnunet_plugin_block_revocation_la_LIBADD = \
$(top_builddir)/src/block/libgnunetblockgroup.la \
$(top_builddir)/src/block/libgnunetblock.la \
$(top_builddir)/src/util/libgnunetutil.la \
+ $(top_builddir)/src/identity/libgnunetidentity.la \
$(LTLIBINTL)
libgnunet_plugin_block_revocation_la_DEPENDENCIES = \
libgnunetrevocation.la \
@@ -63,6 +64,7 @@ libgnunetrevocation_la_SOURCES = \
revocation_api.c revocation.h
libgnunetrevocation_la_LIBADD = \
$(top_builddir)/src/util/libgnunetutil.la \
+ $(top_builddir)/src/identity/libgnunetidentity.la \
$(LIBGCRYPT_LIBS) \
$(GN_LIBINTL) $(XLIB) -lgcrypt
libgnunetrevocation_la_LDFLAGS = \
@@ -80,6 +82,7 @@ gnunet_service_revocation_LDADD = \
$(top_builddir)/src/core/libgnunetcore.la \
$(top_builddir)/src/setu/libgnunetsetu.la \
$(top_builddir)/src/statistics/libgnunetstatistics.la \
+ $(top_builddir)/src/identity/libgnunetidentity.la \
$(top_builddir)/src/util/libgnunetutil.la \
-lm \
$(GN_LIBINTL)
diff --git a/src/revocation/gnunet-revocation-tvg.c
b/src/revocation/gnunet-revocation-tvg.c
index 29df1bb4d..cb5e31fcd 100644
--- a/src/revocation/gnunet-revocation-tvg.c
+++ b/src/revocation/gnunet-revocation-tvg.c
@@ -65,25 +65,34 @@ run (void *cls,
const char *cfgfile,
const struct GNUNET_CONFIGURATION_Handle *cfg)
{
- struct GNUNET_CRYPTO_EcdsaPrivateKey id_priv;
- struct GNUNET_CRYPTO_EcdsaPublicKey id_pub;
- struct GNUNET_REVOCATION_PowP pow;
+ struct GNUNET_IDENTITY_PrivateKey id_priv;
+ struct GNUNET_IDENTITY_PublicKey id_pub;
+ struct GNUNET_REVOCATION_PowP *pow;
struct GNUNET_REVOCATION_PowCalculationHandle *ph;
struct GNUNET_TIME_Relative exp;
-
- GNUNET_CRYPTO_ecdsa_key_create (&id_priv);
- GNUNET_CRYPTO_ecdsa_key_get_public (&id_priv,
- &id_pub);
- fprintf (stdout, "Zone private key (d, little-endian scalar):\n");
- print_bytes (&id_priv, sizeof(id_priv), 0);
+ char ztld[128];
+
+ id_priv.type = htonl (GNUNET_IDENTITY_TYPE_ECDSA);
+ GNUNET_CRYPTO_ecdsa_key_create (&id_priv.ecdsa_key);
+ GNUNET_IDENTITY_key_get_public (&id_priv,
+ &id_pub);
+ GNUNET_STRINGS_data_to_string (&id_pub,
+ GNUNET_IDENTITY_key_get_length (&id_pub),
+ ztld,
+ sizeof (ztld));
+ fprintf (stdout, "Zone private key (d, little-endian scalar, with ztype
prepended):\n");
+ print_bytes (&id_priv, sizeof(id_priv), 8);
+ fprintf (stdout, "\n");
+ fprintf (stdout, "Zone identifier (zid):\n");
+ print_bytes (&id_pub, GNUNET_IDENTITY_key_get_length (&id_pub), 8);
fprintf (stdout, "\n");
- fprintf (stdout, "Zone public key (zk):\n");
- print_bytes (&id_pub, sizeof(id_pub), 0);
+ fprintf (stdout, "Encoded zone identifier (zkl = zTLD):\n");
+ fprintf (stdout, "%s\n", ztld);
fprintf (stdout, "\n");
- memset (&pow, 0, sizeof (pow));
+ pow = GNUNET_malloc (GNUNET_REVOCATION_MAX_PROOF_SIZE);
GNUNET_REVOCATION_pow_init (&id_priv,
- &pow);
- ph = GNUNET_REVOCATION_pow_start (&pow,
+ pow);
+ ph = GNUNET_REVOCATION_pow_start (pow,
TEST_EPOCHS,
TEST_DIFFICULTY);
fprintf (stdout, "Difficulty (%d base difficulty + %d epochs): %d\n\n",
@@ -97,12 +106,12 @@ run (void *cls,
}
exp = GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_YEARS,
TEST_EPOCHS);
- GNUNET_assert (GNUNET_OK == GNUNET_REVOCATION_check_pow (&pow,
+ GNUNET_assert (GNUNET_OK == GNUNET_REVOCATION_check_pow (pow,
TEST_DIFFICULTY,
exp));
fprintf (stdout, "Proof:\n");
- print_bytes (&pow,
- sizeof (pow),
+ print_bytes (pow,
+ GNUNET_REVOCATION_proof_get_size (pow),
8);
}
diff --git a/src/revocation/gnunet-revocation.c
b/src/revocation/gnunet-revocation.c
index 0e1e482ab..d59ea7c81 100644
--- a/src/revocation/gnunet-revocation.c
+++ b/src/revocation/gnunet-revocation.c
@@ -101,7 +101,7 @@ static struct GNUNET_SCHEDULER_Task *pow_task;
/**
* Proof-of-work object
*/
-static struct GNUNET_REVOCATION_PowP proof_of_work;
+static struct GNUNET_REVOCATION_PowP *proof_of_work;
/**
* Function run if the user aborts with CTRL-C.
@@ -213,7 +213,7 @@ static void
perform_revocation ()
{
h = GNUNET_REVOCATION_revoke (cfg,
- &proof_of_work,
+ proof_of_work,
&print_revocation_result,
NULL);
}
@@ -228,11 +228,12 @@ perform_revocation ()
static void
sync_pow ()
{
+ size_t psize = GNUNET_REVOCATION_proof_get_size (proof_of_work);
if ((NULL != filename) &&
- (sizeof(struct GNUNET_REVOCATION_PowP) !=
+ (psize !=
GNUNET_DISK_fn_write (filename,
- &proof_of_work,
- sizeof(struct GNUNET_REVOCATION_PowP),
+ proof_of_work,
+ psize,
GNUNET_DISK_PERM_USER_READ
| GNUNET_DISK_PERM_USER_WRITE)))
GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR, "write", filename);
@@ -269,6 +270,7 @@ static void
calculate_pow (void *cls)
{
struct GNUNET_REVOCATION_PowCalculationHandle *ph = cls;
+ size_t psize;
/* store temporary results */
pow_task = NULL;
@@ -277,11 +279,12 @@ calculate_pow (void *cls)
/* actually do POW calculation */
if (GNUNET_OK == GNUNET_REVOCATION_pow_round (ph))
{
+ psize = GNUNET_REVOCATION_proof_get_size (proof_of_work);
if ((NULL != filename) &&
- (sizeof(struct GNUNET_REVOCATION_PowP) !=
+ (psize !=
GNUNET_DISK_fn_write (filename,
- &proof_of_work,
- sizeof(struct GNUNET_REVOCATION_PowP),
+ proof_of_work,
+ psize,
GNUNET_DISK_PERM_USER_READ
| GNUNET_DISK_PERM_USER_WRITE)))
GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR, "write", filename);
@@ -325,9 +328,10 @@ calculate_pow (void *cls)
static void
ego_callback (void *cls, struct GNUNET_IDENTITY_Ego *ego)
{
- struct GNUNET_CRYPTO_EcdsaPublicKey key;
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *privkey;
+ struct GNUNET_IDENTITY_PublicKey key;
+ const struct GNUNET_IDENTITY_PrivateKey *privkey;
struct GNUNET_REVOCATION_PowCalculationHandle *ph = NULL;
+ size_t psize;
el = NULL;
if (NULL == ego)
@@ -338,12 +342,15 @@ ego_callback (void *cls, struct GNUNET_IDENTITY_Ego *ego)
}
GNUNET_IDENTITY_ego_get_public_key (ego, &key);
privkey = GNUNET_IDENTITY_ego_get_private_key (ego);
- memset (&proof_of_work, 0, sizeof (proof_of_work));
+ proof_of_work = GNUNET_malloc (GNUNET_REVOCATION_MAX_PROOF_SIZE);
if ((NULL != filename) && (GNUNET_YES == GNUNET_DISK_file_test (filename)) &&
- (sizeof(proof_of_work) ==
- GNUNET_DISK_fn_read (filename, &proof_of_work, sizeof(proof_of_work))))
+ (0 < (psize =
+ GNUNET_DISK_fn_read (filename, proof_of_work,
+ GNUNET_REVOCATION_MAX_PROOF_SIZE))))
{
- if (0 != GNUNET_memcmp (&proof_of_work.key, &key))
+ size_t ksize = GNUNET_IDENTITY_key_get_length (&key);
+ if (((psize - sizeof (*proof_of_work)) < ksize) || // Key too small
+ (0 != memcmp (&proof_of_work[1], &key, ksize))) // Keys do not match
{
fprintf (stderr,
_ ("Error: revocation certificate in `%s' is not for `%s'\n"),
@@ -352,7 +359,7 @@ ego_callback (void *cls, struct GNUNET_IDENTITY_Ego *ego)
return;
}
if (GNUNET_YES ==
- GNUNET_REVOCATION_check_pow (&proof_of_work,
+ GNUNET_REVOCATION_check_pow (proof_of_work,
(unsigned int) matching_bits,
epoch_duration))
{
@@ -369,7 +376,7 @@ ego_callback (void *cls, struct GNUNET_IDENTITY_Ego *ego)
fprintf (stderr,
"%s",
_ ("Continuing calculation where left off...\n"));
- ph = GNUNET_REVOCATION_pow_start (&proof_of_work,
+ ph = GNUNET_REVOCATION_pow_start (proof_of_work,
epochs,
matching_bits);
}
@@ -379,8 +386,8 @@ ego_callback (void *cls, struct GNUNET_IDENTITY_Ego *ego)
if (NULL == ph)
{
GNUNET_REVOCATION_pow_init (privkey,
- &proof_of_work);
- ph = GNUNET_REVOCATION_pow_start (&proof_of_work,
+ proof_of_work);
+ ph = GNUNET_REVOCATION_pow_start (proof_of_work,
epochs, /* Epochs */
matching_bits);
}
@@ -403,15 +410,15 @@ run (void *cls,
const char *cfgfile,
const struct GNUNET_CONFIGURATION_Handle *c)
{
- struct GNUNET_CRYPTO_EcdsaPublicKey pk;
+ struct GNUNET_IDENTITY_PublicKey pk;
+ size_t psize;
cfg = c;
if (NULL != test_ego)
{
if (GNUNET_OK !=
- GNUNET_CRYPTO_ecdsa_public_key_from_string (test_ego,
- strlen (test_ego),
- &pk))
+ GNUNET_IDENTITY_public_key_from_string (test_ego,
+ &pk))
{
fprintf (stderr, _ ("Public key `%s' malformed\n"), test_ego);
return;
@@ -463,23 +470,33 @@ run (void *cls,
}
if ((NULL != filename) && (perform))
{
- if (sizeof(proof_of_work) != GNUNET_DISK_fn_read (filename,
- &proof_of_work,
- sizeof(proof_of_work)))
+ size_t bread;
+ proof_of_work = GNUNET_malloc (GNUNET_REVOCATION_MAX_PROOF_SIZE);
+ if (0 < (bread = GNUNET_DISK_fn_read (filename,
+ proof_of_work,
+ GNUNET_REVOCATION_MAX_PROOF_SIZE)))
{
fprintf (stderr,
_ ("Failed to read revocation certificate from `%s'\n"),
filename);
return;
}
+ psize = GNUNET_REVOCATION_proof_get_size (proof_of_work);
+ if (bread != psize)
+ {
+ fprintf (stderr,
+ _ ("Revocation certificate corrupted in `%s'\n"),
+ filename);
+ return;
+ }
GNUNET_SCHEDULER_add_shutdown (&do_shutdown, NULL);
if (GNUNET_YES !=
- GNUNET_REVOCATION_check_pow (&proof_of_work,
+ GNUNET_REVOCATION_check_pow (proof_of_work,
(unsigned int) matching_bits,
epoch_duration))
{
struct GNUNET_REVOCATION_PowCalculationHandle *ph;
- ph = GNUNET_REVOCATION_pow_start (&proof_of_work,
+ ph = GNUNET_REVOCATION_pow_start (proof_of_work,
epochs, /* Epochs */
matching_bits);
diff --git a/src/revocation/gnunet-service-revocation.c
b/src/revocation/gnunet-service-revocation.c
index ddebb38ad..0fa92f4a6 100644
--- a/src/revocation/gnunet-service-revocation.c
+++ b/src/revocation/gnunet-service-revocation.c
@@ -172,7 +172,8 @@ new_peer_entry (const struct GNUNET_PeerIdentity *peer)
static int
verify_revoke_message (const struct RevokeMessage *rm)
{
- if (GNUNET_YES != GNUNET_REVOCATION_check_pow (&rm->proof_of_work,
+ struct GNUNET_REVOCATION_PowP *pow = (struct GNUNET_REVOCATION_PowP *)
&rm[1];
+ if (GNUNET_YES != GNUNET_REVOCATION_check_pow (pow,
(unsigned
int)
revocation_work_required,
epoch_duration))
@@ -236,7 +237,7 @@ handle_query_message (void *cls,
int res;
GNUNET_CRYPTO_hash (&qm->key,
- sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey),
+ sizeof(struct GNUNET_IDENTITY_PublicKey),
&hc);
res = GNUNET_CONTAINER_multihashmap_contains (revocation_map,
&hc);
@@ -276,9 +277,11 @@ do_flood (void *cls,
return GNUNET_OK; /* peer connected to us via SET,
but we have no direct CORE
connection for flooding */
- e = GNUNET_MQ_msg (cp,
+ e = GNUNET_MQ_msg_extra (cp,
+ htonl (rm->pow_size),
GNUNET_MESSAGE_TYPE_REVOCATION_REVOKE);
*cp = *rm;
+ memcpy (&cp[1], &rm[1], htonl (rm->pow_size));
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Flooding revocation to `%s'\n",
GNUNET_i2s (target));
@@ -303,9 +306,12 @@ publicize_rm (const struct RevokeMessage *rm)
struct RevokeMessage *cp;
struct GNUNET_HashCode hc;
struct GNUNET_SETU_Element e;
+ const struct GNUNET_IDENTITY_PublicKey *pk;
- GNUNET_CRYPTO_hash (&rm->proof_of_work.key,
- sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey),
+ struct GNUNET_REVOCATION_PowP *pow = (struct GNUNET_REVOCATION_PowP *)
&rm[1];
+ pk = (const struct GNUNET_IDENTITY_PublicKey *) &pow[1];
+ GNUNET_CRYPTO_hash (pk,
+ GNUNET_IDENTITY_key_get_length (pk),
&hc);
if (GNUNET_YES ==
GNUNET_CONTAINER_multihashmap_contains (revocation_map,
@@ -371,6 +377,23 @@ publicize_rm (const struct RevokeMessage *rm)
}
+static int
+check_revoke_message (void *cls,
+ const struct RevokeMessage *rm)
+{
+ uint16_t size;
+
+ size = ntohs (rm->header.size);
+ if (size <= sizeof(struct RevokeMessage))
+ {
+ GNUNET_break (0);
+ return GNUNET_SYSERR;
+ }
+ return GNUNET_OK;
+
+}
+
+
/**
* Handle REVOKE message from client.
*
@@ -403,6 +426,23 @@ handle_revoke_message (void *cls,
}
+static int
+check_p2p_revoke (void *cls,
+ const struct RevokeMessage *rm)
+{
+ uint16_t size;
+
+ size = ntohs (rm->header.size);
+ if (size <= sizeof(struct RevokeMessage))
+ {
+ GNUNET_break (0);
+ return GNUNET_SYSERR;
+ }
+ return GNUNET_OK;
+
+}
+
+
/**
* Core handler for flooded revocation messages.
*
@@ -784,16 +824,17 @@ run (void *cls,
struct GNUNET_SERVICE_Handle *service)
{
struct GNUNET_MQ_MessageHandler core_handlers[] = {
- GNUNET_MQ_hd_fixed_size (p2p_revoke,
- GNUNET_MESSAGE_TYPE_REVOCATION_REVOKE,
- struct RevokeMessage,
- NULL),
+ GNUNET_MQ_hd_var_size (p2p_revoke,
+ GNUNET_MESSAGE_TYPE_REVOCATION_REVOKE,
+ struct RevokeMessage,
+ NULL),
GNUNET_MQ_handler_end ()
};
char *fn;
uint64_t left;
struct RevokeMessage *rm;
struct GNUNET_HashCode hc;
+ const struct GNUNET_IDENTITY_PublicKey *pk;
GNUNET_CRYPTO_hash ("revocation-set-union-application-id",
strlen ("revocation-set-union-application-id"),
@@ -892,9 +933,11 @@ run (void *cls,
GNUNET_free (fn);
return;
}
- GNUNET_break (0 == ntohl (rm->reserved));
- GNUNET_CRYPTO_hash (&rm->proof_of_work.key,
- sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey),
+ struct GNUNET_REVOCATION_PowP *pow = (struct
+ GNUNET_REVOCATION_PowP *) &rm[1];
+ pk = (const struct GNUNET_IDENTITY_PublicKey *) &pow[1];
+ GNUNET_CRYPTO_hash (pk,
+ GNUNET_IDENTITY_key_get_length (pk),
&hc);
GNUNET_break (GNUNET_OK ==
GNUNET_CONTAINER_multihashmap_put (revocation_map,
@@ -939,10 +982,10 @@ GNUNET_SERVICE_MAIN
GNUNET_MESSAGE_TYPE_REVOCATION_QUERY,
struct QueryMessage,
NULL),
- GNUNET_MQ_hd_fixed_size (revoke_message,
- GNUNET_MESSAGE_TYPE_REVOCATION_REVOKE,
- struct RevokeMessage,
- NULL),
+ GNUNET_MQ_hd_var_size (revoke_message,
+ GNUNET_MESSAGE_TYPE_REVOCATION_REVOKE,
+ struct RevokeMessage,
+ NULL),
GNUNET_MQ_handler_end ());
diff --git a/src/revocation/plugin_block_revocation.c
b/src/revocation/plugin_block_revocation.c
index 291c56f70..3c9344a49 100644
--- a/src/revocation/plugin_block_revocation.c
+++ b/src/revocation/plugin_block_revocation.c
@@ -143,16 +143,18 @@ block_plugin_revocation_evaluate (void *cls,
GNUNET_break_op (0);
return GNUNET_BLOCK_EVALUATION_RESULT_INVALID;
}
- if (0 >=
- GNUNET_REVOCATION_check_pow (&rm->proof_of_work,
- ic->matching_bits,
- ic->epoch_duration))
+ struct GNUNET_REVOCATION_PowP *pow = (struct GNUNET_REVOCATION_PowP *)
&rm[1];
+ const struct GNUNET_IDENTITY_PublicKey *pk;
+ pk = (const struct GNUNET_IDENTITY_PublicKey *) &pow[1];
+ if (GNUNET_YES != GNUNET_REVOCATION_check_pow (pow,
+ ic->matching_bits,
+ ic->epoch_duration))
{
GNUNET_break_op (0);
return GNUNET_BLOCK_EVALUATION_RESULT_INVALID;
}
- GNUNET_CRYPTO_hash (&rm->proof_of_work.key,
- sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey),
+ GNUNET_CRYPTO_hash (pk,
+ GNUNET_IDENTITY_key_get_length (pk),
&chash);
if (GNUNET_YES ==
GNUNET_BLOCK_GROUP_bf_test_and_set (group,
@@ -182,13 +184,16 @@ block_plugin_revocation_get_key (void *cls,
{
const struct RevokeMessage *rm = block;
- if (block_size != sizeof(*rm))
+ if (block_size <= sizeof(*rm))
{
GNUNET_break_op (0);
return GNUNET_SYSERR;
}
- GNUNET_CRYPTO_hash (&rm->proof_of_work.key,
- sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey),
+ struct GNUNET_REVOCATION_PowP *pow = (struct GNUNET_REVOCATION_PowP *)
&rm[1];
+ const struct GNUNET_IDENTITY_PublicKey *pk;
+ pk = (const struct GNUNET_IDENTITY_PublicKey *) &pow[1];
+ GNUNET_CRYPTO_hash (pk,
+ GNUNET_IDENTITY_key_get_length (pk),
key);
return GNUNET_OK;
}
diff --git a/src/revocation/revocation.h b/src/revocation/revocation.h
index 635c56cfc..c3a9c9e6b 100644
--- a/src/revocation/revocation.h
+++ b/src/revocation/revocation.h
@@ -49,7 +49,7 @@ struct QueryMessage
/**
* Key to check.
*/
- struct GNUNET_CRYPTO_EcdsaPublicKey key;
+ struct GNUNET_IDENTITY_PublicKey key;
};
@@ -85,14 +85,11 @@ struct RevokeMessage
struct GNUNET_MessageHeader header;
/**
- * For alignment.
+ * Length of PoW with signature.
*/
- uint32_t reserved GNUNET_PACKED;
+ uint32_t pow_size GNUNET_PACKED;
- /**
- * Number that causes a hash collision with the @e public_key.
- */
- struct GNUNET_REVOCATION_PowP proof_of_work;
+ /** Followed by the PoW **/
};
diff --git a/src/revocation/revocation_api.c b/src/revocation/revocation_api.c
index 75cfd8761..791c3d008 100644
--- a/src/revocation/revocation_api.c
+++ b/src/revocation/revocation_api.c
@@ -160,7 +160,7 @@ handle_revocation_query_response (void *cls,
*/
struct GNUNET_REVOCATION_Query *
GNUNET_REVOCATION_query (const struct GNUNET_CONFIGURATION_Handle *cfg,
- const struct GNUNET_CRYPTO_EcdsaPublicKey *key,
+ const struct GNUNET_IDENTITY_PublicKey *key,
GNUNET_REVOCATION_Callback func,
void *func_cls)
{
@@ -359,10 +359,12 @@ GNUNET_REVOCATION_revoke (const struct
GNUNET_CONFIGURATION_Handle *cfg,
}
h->func = func;
h->func_cls = func_cls;
- env = GNUNET_MQ_msg (rm,
- GNUNET_MESSAGE_TYPE_REVOCATION_REVOKE);
- rm->reserved = htonl (0);
- rm->proof_of_work = *pow;
+ size_t extra_len = GNUNET_REVOCATION_proof_get_size (pow);
+ env = GNUNET_MQ_msg_extra (rm,
+ extra_len,
+ GNUNET_MESSAGE_TYPE_REVOCATION_REVOKE);
+ rm->pow_size = htonl (extra_len);
+ memcpy (&rm[1], pow, extra_len);
GNUNET_MQ_send (h->mq,
env);
return h;
@@ -420,6 +422,51 @@ calculate_score (const struct
GNUNET_REVOCATION_PowCalculationHandle *ph)
}
+enum GNUNET_GenericReturnValue
+check_signature_identity (const struct GNUNET_REVOCATION_PowP *pow,
+ const struct GNUNET_IDENTITY_PublicKey *key)
+{
+ struct GNUNET_REVOCATION_SignaturePurposePS *spurp;
+ struct GNUNET_IDENTITY_Signature *sig;
+ const struct GNUNET_IDENTITY_PublicKey *pk;
+ size_t ksize;
+
+ pk = (const struct GNUNET_IDENTITY_PublicKey *) &pow[1];
+ ksize = GNUNET_IDENTITY_key_get_length (pk);
+
+ spurp = GNUNET_malloc (sizeof (*spurp) + ksize);
+ spurp->timestamp = pow->timestamp;
+ spurp->purpose.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_REVOCATION);
+ spurp->purpose.size = htonl (sizeof(*spurp) + ksize);
+ GNUNET_IDENTITY_write_key_to_buffer (pk,
+ (char*) &spurp[1],
+ ksize);
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Expected signature payload len: %u\n",
+ ntohl (spurp->purpose.size));
+ sig = (struct GNUNET_IDENTITY_Signature *) ((char*) &pow[1] + ksize);
+ if (GNUNET_OK !=
+ GNUNET_IDENTITY_signature_verify_ (GNUNET_SIGNATURE_PURPOSE_REVOCATION,
+ &spurp->purpose,
+ sig,
+ key))
+ {
+ return GNUNET_SYSERR;
+ }
+ return GNUNET_OK;
+}
+
+
+enum GNUNET_GenericReturnValue
+check_signature (const struct GNUNET_REVOCATION_PowP *pow)
+{
+ const struct GNUNET_IDENTITY_PublicKey *pk;
+
+ pk = (const struct GNUNET_IDENTITY_PublicKey *) &pow[1];
+ return check_signature_identity (pow, pk);
+}
+
+
/**
* Check if the given proof-of-work is valid.
*
@@ -433,10 +480,9 @@ GNUNET_REVOCATION_check_pow (const struct
GNUNET_REVOCATION_PowP *pow,
unsigned int difficulty,
struct GNUNET_TIME_Relative epoch_duration)
{
- char buf[sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey)
+ char buf[sizeof(struct GNUNET_IDENTITY_PublicKey)
+ sizeof (struct GNUNET_TIME_AbsoluteNBO)
+ sizeof (uint64_t)] GNUNET_ALIGN;
- struct GNUNET_REVOCATION_SignaturePurposePS spurp;
struct GNUNET_HashCode result;
struct GNUNET_TIME_Absolute ts;
struct GNUNET_TIME_Absolute exp;
@@ -446,25 +492,18 @@ GNUNET_REVOCATION_check_pow (const struct
GNUNET_REVOCATION_PowP *pow,
unsigned int tmp_score = 0;
unsigned int epochs;
uint64_t pow_val;
+ const struct GNUNET_IDENTITY_PublicKey *pk;
+
+ pk = (const struct GNUNET_IDENTITY_PublicKey *) &pow[1];
/**
* Check if signature valid
*/
- spurp.key = pow->key;
- spurp.timestamp = pow->timestamp;
- spurp.purpose.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_REVOCATION);
- spurp.purpose.size = htonl (sizeof(struct GNUNET_CRYPTO_EccSignaturePurpose)
- + sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey)
- + sizeof (struct GNUNET_TIME_AbsoluteNBO));
- if (GNUNET_OK !=
- GNUNET_CRYPTO_ecdsa_verify_ (GNUNET_SIGNATURE_PURPOSE_REVOCATION,
- &spurp.purpose,
- &pow->signature,
- &pow->key))
+ if (GNUNET_OK != check_signature (pow))
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Proof of work signature invalid!\n");
- return GNUNET_NO;
+ return GNUNET_SYSERR;
}
/**
@@ -479,8 +518,8 @@ GNUNET_REVOCATION_check_pow (const struct
GNUNET_REVOCATION_PowP *pow,
&pow->timestamp,
sizeof (uint64_t));
GNUNET_memcpy (&buf[sizeof(uint64_t) * 2],
- &pow->key,
- sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey));
+ pk,
+ GNUNET_IDENTITY_key_get_length (pk));
for (unsigned int i = 0; i < POW_COUNT; i++)
{
pow_val = GNUNET_ntohll (pow->pow[i]);
@@ -529,18 +568,15 @@ GNUNET_REVOCATION_check_pow (const struct
GNUNET_REVOCATION_PowP *pow,
}
-/**
- * Initializes a fresh PoW computation.
- *
- * @param key the key to calculate the PoW for.
- * @param[out] pow starting point for PoW calculation (not yet valid)
- */
-void
-GNUNET_REVOCATION_pow_init (const struct GNUNET_CRYPTO_EcdsaPrivateKey *key,
- struct GNUNET_REVOCATION_PowP *pow)
+enum GNUNET_GenericReturnValue
+sign_pow_identity (const struct GNUNET_IDENTITY_PrivateKey *key,
+ struct GNUNET_REVOCATION_PowP *pow)
{
struct GNUNET_TIME_Absolute ts = GNUNET_TIME_absolute_get ();
- struct GNUNET_REVOCATION_SignaturePurposePS rp;
+ struct GNUNET_REVOCATION_SignaturePurposePS *rp;
+ const struct GNUNET_IDENTITY_PublicKey *pk;
+ size_t ksize;
+ char *sig;
/**
* Predate the validity period to prevent rejections due to
@@ -548,19 +584,53 @@ GNUNET_REVOCATION_pow_init (const struct
GNUNET_CRYPTO_EcdsaPrivateKey *key,
*/
ts = GNUNET_TIME_absolute_subtract (ts,
GNUNET_TIME_UNIT_WEEKS);
-
+ pk = (const struct GNUNET_IDENTITY_PublicKey *) &pow[1];
+ ksize = GNUNET_IDENTITY_key_get_length (pk);
pow->timestamp = GNUNET_TIME_absolute_hton (ts);
- rp.timestamp = pow->timestamp;
- rp.purpose.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_REVOCATION);
- rp.purpose.size = htonl (sizeof(struct GNUNET_CRYPTO_EccSignaturePurpose)
- + sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey)
- + sizeof (struct GNUNET_TIME_AbsoluteNBO));
- GNUNET_CRYPTO_ecdsa_key_get_public (key, &pow->key);
- rp.key = pow->key;
- GNUNET_assert (GNUNET_OK ==
- GNUNET_CRYPTO_ecdsa_sign_ (key,
- &rp.purpose,
- &pow->signature));
+ rp = GNUNET_malloc (sizeof (*rp) + ksize);
+ rp->timestamp = pow->timestamp;
+ rp->purpose.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_REVOCATION);
+ rp->purpose.size = htonl (sizeof(*rp) + ksize);
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Signature payload len: %u\n",
+ ntohl (rp->purpose.size));
+ GNUNET_IDENTITY_write_key_to_buffer (pk,
+ ((char*) &rp[1]),
+ ksize);
+ sig = ((char*) &pow[1]) + ksize;
+ int result = GNUNET_IDENTITY_sign_ (key,
+ &rp->purpose,
+ (void*) sig);
+ if (result == GNUNET_SYSERR)
+ return GNUNET_NO;
+ else
+ return result;
+}
+
+
+enum GNUNET_GenericReturnValue
+sign_pow (const struct GNUNET_IDENTITY_PrivateKey *key,
+ struct GNUNET_REVOCATION_PowP *pow)
+{
+ struct GNUNET_IDENTITY_PublicKey *pk;
+
+ pk = (struct GNUNET_IDENTITY_PublicKey *) &pow[1];
+ GNUNET_IDENTITY_key_get_public (key, pk);
+ return sign_pow_identity (key, pow);
+}
+
+
+/**
+ * Initializes a fresh PoW computation.
+ *
+ * @param key the key to calculate the PoW for.
+ * @param[out] pow starting point for PoW calculation (not yet valid)
+ */
+void
+GNUNET_REVOCATION_pow_init (const struct GNUNET_IDENTITY_PrivateKey *key,
+ struct GNUNET_REVOCATION_PowP *pow)
+{
+ GNUNET_assert (GNUNET_OK == sign_pow (key, pow));
}
@@ -622,15 +692,17 @@ cmp_pow_value (const void *a, const void *b)
enum GNUNET_GenericReturnValue
GNUNET_REVOCATION_pow_round (struct GNUNET_REVOCATION_PowCalculationHandle *pc)
{
- char buf[sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey)
+ char buf[sizeof(struct GNUNET_IDENTITY_PublicKey)
+ sizeof (uint64_t)
+ sizeof (uint64_t)] GNUNET_ALIGN;
struct GNUNET_HashCode result;
+ const struct GNUNET_IDENTITY_PublicKey *pk;
unsigned int zeros;
int ret;
uint64_t pow_nbo;
pc->current_pow++;
+ pk = (const struct GNUNET_IDENTITY_PublicKey *) &(pc->pow[1]);
/**
* Do not try duplicates
@@ -644,8 +716,8 @@ GNUNET_REVOCATION_pow_round (struct
GNUNET_REVOCATION_PowCalculationHandle *pc)
&pc->pow->timestamp,
sizeof (uint64_t));
GNUNET_memcpy (&buf[sizeof(uint64_t) * 2],
- &pc->pow->key,
- sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey));
+ pk,
+ GNUNET_IDENTITY_key_get_length (pk));
GNUNET_CRYPTO_pow_hash (&salt,
buf,
sizeof(buf),
@@ -690,4 +762,22 @@ GNUNET_REVOCATION_pow_stop (struct
GNUNET_REVOCATION_PowCalculationHandle *pc)
}
+size_t
+GNUNET_REVOCATION_proof_get_size (const struct GNUNET_REVOCATION_PowP *pow)
+{
+ size_t size;
+ size_t ksize;
+ const struct GNUNET_IDENTITY_PublicKey *pk;
+ const struct GNUNET_IDENTITY_Signature *sig;
+
+ size = sizeof (struct GNUNET_REVOCATION_PowP);
+ pk = (const struct GNUNET_IDENTITY_PublicKey *) &pow[1];
+ ksize = GNUNET_IDENTITY_key_get_length (pk);
+ size += ksize;
+ sig = (struct GNUNET_IDENTITY_Signature *) ((char*) &pow[1] + ksize);
+ size += GNUNET_IDENTITY_signature_get_length (sig);
+ return size;
+}
+
+
/* end of revocation_api.c */
diff --git a/src/revocation/test_revocation.c b/src/revocation/test_revocation.c
index b65567d79..c6457016f 100644
--- a/src/revocation/test_revocation.c
+++ b/src/revocation/test_revocation.c
@@ -38,8 +38,8 @@ struct TestPeer
struct GNUNET_TESTBED_Operation *core_op;
struct GNUNET_IDENTITY_Handle *idh;
const struct GNUNET_CONFIGURATION_Handle *cfg;
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *privkey;
- struct GNUNET_CRYPTO_EcdsaPublicKey pubkey;
+ const struct GNUNET_IDENTITY_PrivateKey *privkey;
+ struct GNUNET_IDENTITY_PublicKey pubkey;
struct GNUNET_CRYPTO_EcdsaSignature sig;
struct GNUNET_IDENTITY_Operation *create_id_op;
struct GNUNET_IDENTITY_EgoLookup *ego_lookup;
@@ -142,13 +142,13 @@ revocation_cb (void *cls, enum GNUNET_GenericReturnValue
is_valid)
}
-static struct GNUNET_REVOCATION_PowP proof_of_work;
+static struct GNUNET_REVOCATION_PowP *proof_of_work;
static void
ego_cb (void *cls, struct GNUNET_IDENTITY_Ego *ego)
{
static int completed = 0;
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *privkey;
+ const struct GNUNET_IDENTITY_PrivateKey *privkey;
if ((NULL != ego) && (cls == &testpeers[0]))
{
@@ -164,10 +164,10 @@ ego_cb (void *cls, struct GNUNET_IDENTITY_Ego *ego)
GNUNET_IDENTITY_ego_get_public_key (ego, &testpeers[1].pubkey);
GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Calculating proof of work...\n");
privkey = GNUNET_IDENTITY_ego_get_private_key (ego);
- memset (&proof_of_work, 0, sizeof (proof_of_work));
+ proof_of_work = GNUNET_malloc (GNUNET_REVOCATION_MAX_PROOF_SIZE);
GNUNET_REVOCATION_pow_init (privkey,
- &proof_of_work);
- testpeers[1].pow = GNUNET_REVOCATION_pow_start (&proof_of_work,
+ proof_of_work);
+ testpeers[1].pow = GNUNET_REVOCATION_pow_start (proof_of_work,
1,
5);
int res =
@@ -184,7 +184,7 @@ ego_cb (void *cls, struct GNUNET_IDENTITY_Ego *ego)
{
GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Egos retrieved\n");
testpeers[1].revok_handle = GNUNET_REVOCATION_revoke (testpeers[1].cfg,
- &proof_of_work,
+ proof_of_work,
&revocation_cb,
NULL);
GNUNET_REVOCATION_pow_stop (testpeers[1].pow);
@@ -194,7 +194,7 @@ ego_cb (void *cls, struct GNUNET_IDENTITY_Ego *ego)
static void
identity_create_cb (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *pk,
+ const struct GNUNET_IDENTITY_PrivateKey *pk,
const char *emsg)
{
static int completed = 0;
@@ -238,11 +238,13 @@ identity_completion_cb (void *cls,
testpeers[0].create_id_op = GNUNET_IDENTITY_create (testpeers[0].idh,
"client",
NULL,
+
GNUNET_IDENTITY_TYPE_ECDSA,
&identity_create_cb,
&testpeers[0]);
testpeers[1].create_id_op = GNUNET_IDENTITY_create (testpeers[1].idh,
"toberevoked",
NULL,
+
GNUNET_IDENTITY_TYPE_ECDSA,
&identity_create_cb,
&testpeers[1]);
}
diff --git a/src/set/gnunet-service-set_union.c
b/src/set/gnunet-service-set_union.c
index 87c6faf98..931d7e753 100644
--- a/src/set/gnunet-service-set_union.c
+++ b/src/set/gnunet-service-set_union.c
@@ -563,8 +563,8 @@ prepare_ibf_iterator (void *cls,
struct IBF_Key salted_key;
LOG (GNUNET_ERROR_TYPE_DEBUG,
- "[OP %x] inserting %lx (hash %s) into ibf\n",
- (void *) op,
+ "[OP %p] inserting %lx (hash %s) into ibf\n",
+ op,
(unsigned long) ke->ibf_key.key_val,
GNUNET_h2s (&ke->element->element_hash));
salt_key (&ke->ibf_key,
@@ -929,7 +929,7 @@ handle_union_p2p_strata_estimator (void *cls,
(0 == other_size))
{
LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Deciding to go for full set transmission (diff=%d, own set=%u)\n",
+ "Deciding to go for full set transmission (diff=%d, own set=%llu)\n",
diff,
op->state->initial_size);
GNUNET_STATISTICS_update (_GSS_statistics,
@@ -1004,8 +1004,8 @@ send_offers_iterator (void *cls,
GNUNET_assert (NULL != ev);
*(struct GNUNET_HashCode *) &mh[1] = ke->element->element_hash;
LOG (GNUNET_ERROR_TYPE_DEBUG,
- "[OP %x] sending element offer (%s) to peer\n",
- (void *) op,
+ "[OP %p] sending element offer (%s) to peer\n",
+ op,
GNUNET_h2s (&ke->element->element_hash));
GNUNET_MQ_send (op->mq, ev);
return GNUNET_YES;
@@ -2004,8 +2004,8 @@ handle_union_p2p_demand (void *cls,
emsg->reserved = htons (0);
emsg->element_type = htons (ee->element.element_type);
LOG (GNUNET_ERROR_TYPE_DEBUG,
- "[OP %x] Sending demanded element (size %u, hash %s) to peer\n",
- (void *) op,
+ "[OP %p] Sending demanded element (size %u, hash %s) to peer\n",
+ op,
(unsigned int) ee->element.size,
GNUNET_h2s (&ee->element_hash));
GNUNET_MQ_send (op->mq, ev);
@@ -2120,8 +2120,8 @@ handle_union_p2p_offer (void *cls,
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST));
LOG (GNUNET_ERROR_TYPE_DEBUG,
- "[OP %x] Requesting element (hash %s)\n",
- (void *) op, GNUNET_h2s (hash));
+ "[OP %p] Requesting element (hash %s)\n",
+ op, GNUNET_h2s (hash));
ev = GNUNET_MQ_msg_header_extra (demands,
sizeof(struct GNUNET_HashCode),
GNUNET_MESSAGE_TYPE_SET_UNION_P2P_DEMAND);
diff --git a/src/set/set_api.c b/src/set/set_api.c
index ce4b1c965..a082c23c1 100644
--- a/src/set/set_api.c
+++ b/src/set/set_api.c
@@ -630,8 +630,7 @@ create_internal (const struct GNUNET_CONFIGURATION_Handle
*cfg,
else
{
LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Creating new set (lazy copy)\n",
- op);
+ "Creating new set (lazy copy)\n");
mqm = GNUNET_MQ_msg (copy_msg,
GNUNET_MESSAGE_TYPE_SET_COPY_LAZY_CONNECT);
copy_msg->cookie = *cookie;
diff --git a/src/setu/gnunet-service-setu.c b/src/setu/gnunet-service-setu.c
index 326589186..d00303ca7 100644
--- a/src/setu/gnunet-service-setu.c
+++ b/src/setu/gnunet-service-setu.c
@@ -1049,8 +1049,8 @@ prepare_ibf_iterator (void *cls,
struct IBF_Key salted_key;
LOG (GNUNET_ERROR_TYPE_DEBUG,
- "[OP %x] inserting %lx (hash %s) into ibf\n",
- (void *) op,
+ "[OP %p] inserting %lx (hash %s) into ibf\n",
+ op,
(unsigned long) ke->ibf_key.key_val,
GNUNET_h2s (&ke->element->element_hash));
salt_key (&ke->ibf_key,
@@ -1429,7 +1429,7 @@ handle_union_p2p_strata_estimator (void *cls,
(0 == other_size))
{
LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Deciding to go for full set transmission (diff=%d, own set=%u)\n",
+ "Deciding to go for full set transmission (diff=%d, own set=%llu)\n",
diff,
op->initial_size);
GNUNET_STATISTICS_update (_GSS_statistics,
@@ -1504,8 +1504,8 @@ send_offers_iterator (void *cls,
GNUNET_assert (NULL != ev);
*(struct GNUNET_HashCode *) &mh[1] = ke->element->element_hash;
LOG (GNUNET_ERROR_TYPE_DEBUG,
- "[OP %x] sending element offer (%s) to peer\n",
- (void *) op,
+ "[OP %p] sending element offer (%s) to peer\n",
+ op,
GNUNET_h2s (&ke->element->element_hash));
GNUNET_MQ_send (op->mq, ev);
return GNUNET_YES;
@@ -2403,8 +2403,8 @@ handle_union_p2p_demand (void *cls,
emsg->reserved = htons (0);
emsg->element_type = htons (ee->element.element_type);
LOG (GNUNET_ERROR_TYPE_DEBUG,
- "[OP %x] Sending demanded element (size %u, hash %s) to peer\n",
- (void *) op,
+ "[OP %p] Sending demanded element (size %u, hash %s) to peer\n",
+ op,
(unsigned int) ee->element.size,
GNUNET_h2s (&ee->element_hash));
GNUNET_MQ_send (op->mq, ev);
@@ -2502,8 +2502,8 @@ handle_union_p2p_offer (void *cls,
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST));
LOG (GNUNET_ERROR_TYPE_DEBUG,
- "[OP %x] Requesting element (hash %s)\n",
- (void *) op, GNUNET_h2s (hash));
+ "[OP %p] Requesting element (hash %s)\n",
+ op, GNUNET_h2s (hash));
ev = GNUNET_MQ_msg_header_extra (demands,
sizeof(struct GNUNET_HashCode),
GNUNET_MESSAGE_TYPE_SETU_P2P_DEMAND);
@@ -2787,8 +2787,6 @@ check_incoming_msg (void *cls,
*
* @param cls the operation state
* @param msg the received message
- * @return #GNUNET_OK if the channel should be kept alive,
- * #GNUNET_SYSERR to destroy the channel
*/
static void
handle_incoming_msg (void *cls,
diff --git a/src/statistics/statistics_api.c b/src/statistics/statistics_api.c
index 12c09b7d2..bf0a90b45 100644
--- a/src/statistics/statistics_api.c
+++ b/src/statistics/statistics_api.c
@@ -472,7 +472,7 @@ handle_statistics_value (void *cls,
LOG (GNUNET_ERROR_TYPE_DEBUG,
"Received valid statistic on `%s:%s': %llu\n",
service, name,
- GNUNET_ntohll (smsg->value));
+ (unsigned long long) GNUNET_ntohll (smsg->value));
if (GNUNET_OK !=
h->current->proc (h->current->cls,
service,
diff --git a/src/testbed-logger/gnunet-service-testbed-logger.c
b/src/testbed-logger/gnunet-service-testbed-logger.c
index 81652fa4f..bc2f0abe0 100644
--- a/src/testbed-logger/gnunet-service-testbed-logger.c
+++ b/src/testbed-logger/gnunet-service-testbed-logger.c
@@ -198,7 +198,7 @@ logger_run (void *cls,
GNUNET_asprintf (&fn,
"%s/%.*s_%jd.dat",
dir,
- hname_len,
+ (int) hname_len,
hname,
(intmax_t) pid);
GNUNET_free (hname);
diff --git a/src/testbed/gnunet-service-testbed_cpustatus.c
b/src/testbed/gnunet-service-testbed_cpustatus.c
index 70b865c73..440f2c24f 100644
--- a/src/testbed/gnunet-service-testbed_cpustatus.c
+++ b/src/testbed/gnunet-service-testbed_cpustatus.c
@@ -608,7 +608,7 @@ GST_stats_init (const struct GNUNET_CONFIGURATION_Handle
*cfg)
return;
}
fn = NULL;
- (void) GNUNET_asprintf (&fn, "%s/%.*s-%jd.dat", stats_dir, len,
+ (void) GNUNET_asprintf (&fn, "%s/%.*s-%jd.dat", stats_dir, (int)len,
hostname, (intmax_t) getpid ());
GNUNET_free (stats_dir);
GNUNET_free (hostname);
diff --git a/src/testbed/test_testbed_api_template.conf
b/src/testbed/test_testbed_api_template.conf
index 255c1b766..ae0368a8b 100644
--- a/src/testbed/test_testbed_api_template.conf
+++ b/src/testbed/test_testbed_api_template.conf
@@ -32,7 +32,7 @@ WAN_QUOTA_IN = 3932160
USE_EPHEMERAL_KEYS = NO
IMMEDIATE_START = YES
-[transport-udp]
+[transport-tcp]
TIMEOUT = 300 s
[PATHS]
diff --git a/src/testbed/testbed_api.c b/src/testbed/testbed_api.c
index 697783d96..09752ba28 100644
--- a/src/testbed/testbed_api.c
+++ b/src/testbed/testbed_api.c
@@ -448,7 +448,7 @@ handle_opsuccess (
uint64_t op_id;
op_id = GNUNET_ntohll (msg->operation_id);
- LOG_DEBUG ("Operation %lu successful\n", op_id);
+ LOG_DEBUG ("Operation %llu successful\n", op_id);
if (NULL == (opc = find_opc (c, op_id)))
{
LOG_DEBUG ("Operation not found\n");
diff --git a/src/testbed/testbed_api_topology.c
b/src/testbed/testbed_api_topology.c
index 1d765af92..a9a340e99 100644
--- a/src/testbed/testbed_api_topology.c
+++ b/src/testbed/testbed_api_topology.c
@@ -1089,7 +1089,7 @@ gen_topo_from_file (struct TopologyContext *tc,
if (tc->num_peers <= peer_id)
{
LOG (GNUNET_ERROR_TYPE_ERROR,
- _ ("Topology file needs more peers than given ones\n"), filename);
+ _ ("Topology file needs more peers than given ones\n"));
goto _exit;
}
state = OTHER_PEER_INDEX;
@@ -1114,7 +1114,7 @@ gen_topo_from_file (struct TopologyContext *tc,
if (tc->num_peers <= other_peer_id)
{
LOG (GNUNET_ERROR_TYPE_ERROR,
- _ ("Topology file needs more peers than given ones\n"), filename);
+ _ ("Topology file needs more peers than given ones\n"));
goto _exit;
}
if (peer_id != other_peer_id)
@@ -1150,7 +1150,7 @@ gen_topo_from_file (struct TopologyContext *tc,
}
else
LOG (GNUNET_ERROR_TYPE_WARNING,
- _ ("Ignoring to connect peer %u to peer %u\n"),
+ _ ("Ignoring to connect peer %lu to peer %lu\n"),
peer_id,
other_peer_id);
while (('\n' != data[offset]) && ('|' != data[offset]) && (offset < fs))
diff --git a/src/transport/gnunet-communicator-udp.c
b/src/transport/gnunet-communicator-udp.c
index 5ca5a4e86..e967e8e9a 100644
--- a/src/transport/gnunet-communicator-udp.c
+++ b/src/transport/gnunet-communicator-udp.c
@@ -75,6 +75,9 @@
*/
#define ADDRESS_VALIDITY_PERIOD GNUNET_TIME_UNIT_HOURS
+#define WORKING_QUEUE_INTERVALL \
+ GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MICROSECONDS,1)
+
/**
* AES key size.
*/
@@ -90,6 +93,8 @@
*/
#define GCM_TAG_SIZE (128 / 8)
+#define GENERATE_AT_ONCE 2
+
/**
* If we fall below this number of available KCNs,
* we generate additional ACKs until we reach
@@ -129,7 +134,7 @@
* sense. Might make sense to adapt to RTT if we had
* a good measurement...
*/
-#define MAX_SECRETS 128
+#define MAX_SECRETS 128000
/**
* How often do we rekey based on number of bytes transmitted?
@@ -250,6 +255,12 @@ struct UDPAck
*/
uint32_t sequence_max GNUNET_PACKED;
+ /**
+ * Sequence acknowledgement limit. Specifies current maximum sequence
+ * number supported by receiver.
+ */
+ uint32_t acks_available GNUNET_PACKED;
+
/**
* CMAC of the base key being acknowledged.
*/
@@ -499,6 +510,12 @@ struct SenderAddress
*/
unsigned int num_secrets;
+ /**
+ * Number of BOX keys from ACKs we have currently
+ * available for this sender.
+ */
+ unsigned int acks_available;
+
/**
* Which network type does this queue use?
*/
@@ -653,6 +670,15 @@ struct BroadcastInterface
int found;
};
+/**
+ * Timeout for this receiver address.
+ */
+struct GNUNET_TIME_Absolute *rekey_timeout;
+
+/**
+ * Shared secret we finished the last kce working queue for.
+ */
+struct SharedSecret *ss_finished;
/**
* Cache of pre-generated key IDs.
@@ -669,6 +695,16 @@ static struct GNUNET_SCHEDULER_Task *read_task;
*/
static struct GNUNET_SCHEDULER_Task *timeout_task;
+/**
+ * ID of kce working queue task
+ */
+static struct GNUNET_SCHEDULER_Task *kce_task;
+
+/**
+ * Is the kce_task finished?
+ */
+static int kce_task_finished = GNUNET_NO;
+
/**
* ID of master broadcast task
*/
@@ -847,6 +883,7 @@ kce_destroy (struct KeyCacheEntry *kce)
struct SharedSecret *ss = kce->ss;
ss->active_kce_count--;
+ ss->sender->acks_available--;
GNUNET_CONTAINER_DLL_remove (ss->kce_head, ss->kce_tail, kce);
GNUNET_assert (GNUNET_YES == GNUNET_CONTAINER_multishortmap_remove
(key_cache,
&kce->kid,
@@ -902,6 +939,7 @@ kce_generate (struct SharedSecret *ss, uint32_t seq)
get_kid (&ss->master, seq, &kce->kid);
GNUNET_CONTAINER_DLL_insert (ss->kce_head, ss->kce_tail, kce);
ss->active_kce_count++;
+ ss->sender->acks_available++;
(void) GNUNET_CONTAINER_multishortmap_put (
key_cache,
&kce->kid,
@@ -920,12 +958,20 @@ kce_generate (struct SharedSecret *ss, uint32_t seq)
* @param ss shared secret to destroy
*/
static void
-secret_destroy (struct SharedSecret *ss)
+secret_destroy (struct SharedSecret *ss, int withoutKce)
{
struct SenderAddress *sender;
struct ReceiverAddress *receiver;
struct KeyCacheEntry *kce;
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "secret destroy %u %u\n",
+ withoutKce,
+ ss->sequence_allowed);
+
+ if (withoutKce && (ss->sequence_allowed > 0))
+ return;
+
if (NULL != (sender = ss->sender))
{
GNUNET_CONTAINER_DLL_remove (sender->ss_head, sender->ss_tail, ss);
@@ -935,7 +981,9 @@ secret_destroy (struct SharedSecret *ss)
{
GNUNET_CONTAINER_DLL_remove (receiver->ss_head, receiver->ss_tail, ss);
receiver->num_secrets--;
+ // Uncomment this for alternativ 1 of backchannel functionality
receiver->acks_available -= (ss->sequence_allowed - ss->sequence_used);
+ // Until here for alternativ 1
}
while (NULL != (kce = ss->kce_head))
kce_destroy (kce);
@@ -1284,8 +1332,11 @@ handle_ack (void *cls, const struct GNUNET_PeerIdentity
*pid, void *value)
{
const struct UDPAck *ack = cls;
struct ReceiverAddress *receiver = value;
+ struct SharedSecret *pos;
+
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"in handle ack\n");
+ struct SharedSecret *ss_to_destroy;
(void) pid;
for (struct SharedSecret *ss = receiver->ss_head; NULL != ss; ss = ss->next)
@@ -1301,9 +1352,12 @@ handle_ack (void *cls, const struct GNUNET_PeerIdentity
*pid, void *value)
if (allowed > ss->sequence_allowed)
{
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "%u > %u (%u)\n", allowed, ss->sequence_allowed,
- receiver->acks_available);
-
+ "%u > %u (%u %u) for secrect %s\n", allowed,
+ ss->sequence_allowed,
+ receiver->acks_available,
+ ack->acks_available,
+ GNUNET_h2s (&ss->master));
+ // Uncomment this for alternativ 1 of backchannel functionality
receiver->acks_available += (allowed - ss->sequence_allowed);
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Tell transport we have more acks!\n");
@@ -1312,11 +1366,33 @@ handle_ack (void *cls, const struct GNUNET_PeerIdentity
*pid, void *value)
(allowed
- ss->sequence_allowed),
1);
+ // Until here for alternativ 1
ss->sequence_allowed = allowed;
/* move ss to head to avoid discarding it anytime soon! */
GNUNET_CONTAINER_DLL_remove (receiver->ss_head, receiver->ss_tail, ss);
GNUNET_CONTAINER_DLL_insert (receiver->ss_head, receiver->ss_tail, ss);
+ pos = receiver->ss_head;
+ while ( NULL != pos)
+ {
+ ss_to_destroy = pos;
+ pos = pos->next;
+
+ secret_destroy (ss_to_destroy, GNUNET_YES);
+ }
}
+
+ // Uncomment this for alternativ 2 of backchannel functionality
+ /*if (receiver->acks_available != ack->acks_available)
+ {
+ receiver->acks_available = ack->acks_available;
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Tell transport we have different number of acks!\n");
+ GNUNET_TRANSPORT_communicator_mq_update (ch,
+ receiver->d_qh,
+ receiver->acks_available,
+ 1);
+ }*/
+ // Until here for alternativ 2
return GNUNET_NO;
}
}
@@ -1370,6 +1446,36 @@ try_handle_plaintext (struct SenderAddress *sender,
}
}
+static void
+kce_generate_cb (void *cls)
+{
+ struct SharedSecret *ss = cls;
+
+
+
+ if (ss->sender->acks_available < KCN_TARGET)
+ {
+
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Precomputing keys\n");
+
+ for (int i = 0; i < GENERATE_AT_ONCE; i++)
+ kce_generate (ss, ++ss->sequence_allowed);
+
+ kce_task = GNUNET_SCHEDULER_add_delayed (WORKING_QUEUE_INTERVALL,
+ kce_generate_cb,
+ ss);
+ }
+ else
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "We have enough keys.\n");
+ ss_finished = ss;
+ kce_task_finished = GNUNET_YES;
+ }
+
+
+}
/**
* We established a shared secret with a sender. We should try to send
@@ -1378,21 +1484,81 @@ try_handle_plaintext (struct SenderAddress *sender,
* recently).
*
* @param ss shared secret to generate ACKs for
+ * @param intial The SharedSecret came with initial KX.
*/
static void
-consider_ss_ack (struct SharedSecret *ss)
+consider_ss_ack (struct SharedSecret *ss, int initial)
{
+ struct SharedSecret *ss_to_destroy;
+ struct SharedSecret *pos;
+
GNUNET_assert (NULL != ss->sender);
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Considering SS UDPAck %s\n",
GNUNET_i2s_full (&ss->sender->target));
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "We have %u acks available.\n",
+ ss->sender->acks_available);
/* drop ancient KeyCacheEntries */
while ((NULL != ss->kce_head) &&
(MAX_SQN_DELTA <
ss->kce_head->sequence_number - ss->kce_tail->sequence_number))
kce_destroy (ss->kce_tail);
- if (ss->active_kce_count < KCN_THRESHOLD)
+
+
+ if (GNUNET_NO == initial)
+ kce_generate (ss, ++ss->sequence_allowed);
+
+ /*if (0 == ss->sender->acks_available)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Generating keys\n");
+ while (ss->active_kce_count < KCN_TARGET)
+ kce_generate (ss, ++ss->sequence_allowed);
+ }*/
+
+ if (((NULL != kce_task) && kce_task_finished) || (GNUNET_NO == initial))
+ {
+ struct UDPAck ack;
+
+ ack.header.type = htons (GNUNET_MESSAGE_TYPE_COMMUNICATOR_UDP_ACK);
+ ack.header.size = htons (sizeof(ack));
+ ack.sequence_max = htonl (ss_finished->sequence_allowed);
+ ack.acks_available = ss->sender->acks_available;
+ ack.cmac = ss_finished->cmac;
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Notifying transport of UDPAck %s with intial %u\n",
+ GNUNET_i2s_full (&ss_finished->sender->target),
+ initial);
+ GNUNET_TRANSPORT_communicator_notify (ch,
+ &ss_finished->sender->target,
+ COMMUNICATOR_ADDRESS_PREFIX,
+ &ack.header);
+ pos = ss->sender->ss_head;
+ while ( NULL != pos)
+ {
+ ss_to_destroy = pos;
+ pos = pos->next;
+ secret_destroy (ss_to_destroy, GNUNET_YES);
+ }
+ kce_task = NULL;
+ }
+ else if (((NULL == kce_task) && (KCN_THRESHOLD >
+ ss->sender->acks_available)) ||
+ (ss->sender->num_secrets > MAX_SECRETS) )
+ {
+
+ // kce_generate (ss, ++ss->sequence_allowed);
+ // kce_generate (ss, ++ss->sequence_allowed);
+ kce_task = GNUNET_SCHEDULER_add_delayed (WORKING_QUEUE_INTERVALL,
+ kce_generate_cb,
+ ss);
+
+ }
+
+
+ /*if (ss->active_kce_count < KCN_THRESHOLD)
{
struct UDPAck ack;
@@ -1402,11 +1568,13 @@ consider_ss_ack (struct SharedSecret *ss)
* For the initial KX (active_kce_count==0),
* we only generate a single KCE to prevent
* unnecessary overhead.
- */
- if (0 < ss->active_kce_count) {
+
+ if (0 < ss->active_kce_count)
+ {
while (ss->active_kce_count < KCN_TARGET)
kce_generate (ss, ++ss->sequence_allowed);
- } else {
+ }
+ else {
kce_generate (ss, ++ss->sequence_allowed);
}
ack.header.type = htons (GNUNET_MESSAGE_TYPE_COMMUNICATOR_UDP_ACK);
@@ -1420,7 +1588,7 @@ consider_ss_ack (struct SharedSecret *ss)
&ss->sender->target,
COMMUNICATOR_ADDRESS_PREFIX,
&ack.header);
- }
+ }*/
}
@@ -1459,8 +1627,11 @@ decrypt_box (const struct UDPBox *box,
"# bytes decrypted with BOX",
sizeof(out_buf),
GNUNET_NO);
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "decrypted UDPBox with kid %s\n",
+ GNUNET_sh2s (&box->kid));
try_handle_plaintext (ss->sender, out_buf, sizeof(out_buf));
- consider_ss_ack (ss);
+ consider_ss_ack (ss, GNUNET_NO);
}
@@ -1530,8 +1701,8 @@ setup_sender (const struct GNUNET_PeerIdentity *target,
{
struct SenderAddress *sender;
struct SearchContext sc = { .address = address,
- .address_len = address_len,
- .sender = NULL };
+ .address_len = address_len,
+ .sender = NULL };
GNUNET_CONTAINER_multipeermap_get_multiple (senders,
target,
@@ -1547,10 +1718,10 @@ setup_sender (const struct GNUNET_PeerIdentity *target,
sender->address = GNUNET_memdup (address, address_len);
sender->address_len = address_len;
(void) GNUNET_CONTAINER_multipeermap_put (
- senders,
- &sender->target,
- sender,
-
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
+ senders,
+ &sender->target,
+ sender,
+ GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
GNUNET_STATISTICS_set (stats,
"# senders active",
GNUNET_CONTAINER_multipeermap_size (receivers),
@@ -1587,10 +1758,10 @@ verify_confirmation (const struct
GNUNET_CRYPTO_EcdhePublicKey *ephemeral,
uhs.ephemeral = *ephemeral;
uhs.monotonic_time = uc->monotonic_time;
return GNUNET_CRYPTO_eddsa_verify (
-
GNUNET_SIGNATURE_COMMUNICATOR_UDP_HANDSHAKE,
- &uhs,
- &uc->sender_sig,
- &uc->sender.public_key);
+ GNUNET_SIGNATURE_COMMUNICATOR_UDP_HANDSHAKE,
+ &uhs,
+ &uc->sender_sig,
+ &uc->sender.public_key);
}
@@ -1610,22 +1781,22 @@ sockaddr_to_udpaddr_string (const struct sockaddr
*address,
switch (address->sa_family)
{
- case AF_INET:
- GNUNET_asprintf (&ret,
- "%s-%s",
- COMMUNICATOR_ADDRESS_PREFIX,
- GNUNET_a2s (address, address_len));
- break;
+ case AF_INET:
+ GNUNET_asprintf (&ret,
+ "%s-%s",
+ COMMUNICATOR_ADDRESS_PREFIX,
+ GNUNET_a2s (address, address_len));
+ break;
- case AF_INET6:
- GNUNET_asprintf (&ret,
- "%s-%s",
- COMMUNICATOR_ADDRESS_PREFIX,
- GNUNET_a2s (address, address_len));
- break;
+ case AF_INET6:
+ GNUNET_asprintf (&ret,
+ "%s-%s",
+ COMMUNICATOR_ADDRESS_PREFIX,
+ GNUNET_a2s (address, address_len));
+ break;
- default:
- GNUNET_assert (0);
+ default:
+ GNUNET_assert (0);
}
return ret;
}
@@ -1744,10 +1915,10 @@ sock_read (void *cls)
"Unable to decrypt tag, dropping...\n");
GNUNET_free (ss);
GNUNET_STATISTICS_update (
- stats,
- "# messages dropped (no kid, AEAD decryption
failed)",
- 1,
- GNUNET_NO);
+ stats,
+ "# messages dropped (no kid, AEAD decryption failed)",
+ 1,
+ GNUNET_NO);
return;
}
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
@@ -1778,9 +1949,9 @@ sock_read (void *cls)
1,
GNUNET_NO);
try_handle_plaintext (sender, &uc[1], sizeof(pbuf) - sizeof(*uc));
- consider_ss_ack (ss);
- if (sender->num_secrets > MAX_SECRETS)
- secret_destroy (sender->ss_tail);
+ consider_ss_ack (ss, GNUNET_YES);
+ /*if (sender->num_secrets > MAX_SECRETS)
+ secret_destroy (sender->ss_tail);*/
}
}
@@ -1859,9 +2030,9 @@ udp_address_to_sockaddr (const char *bindto, socklen_t
*sock_len)
else
{
GNUNET_log (
- GNUNET_ERROR_TYPE_ERROR,
- "BINDTO specification `%s' invalid: last ':' not followed by
number\n",
- bindto);
+ GNUNET_ERROR_TYPE_ERROR,
+ "BINDTO specification `%s' invalid: last ':' not followed by number\n",
+ bindto);
GNUNET_free (cp);
return NULL;
}
@@ -1939,8 +2110,8 @@ do_pad (gcry_cipher_hd_t out_cipher, char *dgram, size_t
pad_size)
memcpy (pad, &hdr, sizeof(hdr));
}
GNUNET_assert (
- 0 ==
- gcry_cipher_encrypt (out_cipher, dgram, sizeof(pad), pad,
sizeof(pad)));
+ 0 ==
+ gcry_cipher_encrypt (out_cipher, dgram, sizeof(pad), pad, sizeof(pad)));
}
@@ -1967,6 +2138,19 @@ mq_send_kx (struct GNUNET_MQ_Handle *mq,
size_t dpos;
gcry_cipher_hd_t out_cipher;
struct SharedSecret *ss;
+ struct SharedSecret *ss_to_destroy;
+ struct SharedSecret *pos;
+
+ if (receiver->num_secrets > MAX_SECRETS)
+ {
+ pos = receiver->ss_head;
+ while ( NULL != pos)
+ {
+ ss_to_destroy = pos;
+ pos = pos->next;
+ secret_destroy (ss_to_destroy, GNUNET_YES);
+ }
+ }
GNUNET_assert (mq == receiver->kx_mq);
@@ -2007,13 +2191,13 @@ mq_send_kx (struct GNUNET_MQ_Handle *mq,
dpos += sizeof(uc);
/* Append encrypted payload to dgram */
GNUNET_assert (
- 0 == gcry_cipher_encrypt (out_cipher, &dgram[dpos], msize,
msg, msize));
+ 0 == gcry_cipher_encrypt (out_cipher, &dgram[dpos], msize, msg, msize));
dpos += msize;
do_pad (out_cipher, &dgram[dpos], sizeof(dgram) - dpos);
/* Datagram starts with kx */
kx.ephemeral = uhs.ephemeral;
GNUNET_assert (
- 0 == gcry_cipher_gettag (out_cipher, kx.gcm_tag,
sizeof(kx.gcm_tag)));
+ 0 == gcry_cipher_gettag (out_cipher, kx.gcm_tag, sizeof(kx.gcm_tag)));
gcry_cipher_close (out_cipher);
memcpy (dgram, &kx, sizeof(kx));
if (-1 == GNUNET_NETWORK_socket_sendto (udp_sock,
@@ -2044,6 +2228,8 @@ mq_send_d (struct GNUNET_MQ_Handle *mq,
{
struct ReceiverAddress *receiver = impl_state;
uint16_t msize = ntohs (msg->size);
+ struct GNUNET_TIME_Relative rt;
+ struct SharedSecret *pos;
GNUNET_assert (mq == receiver->d_mq);
if ((msize > receiver->d_mtu) ||
@@ -2058,7 +2244,18 @@ mq_send_d (struct GNUNET_MQ_Handle *mq,
/* begin "BOX" encryption method, scan for ACKs from tail! */
for (struct SharedSecret *ss = receiver->ss_tail; NULL != ss; ss = ss->prev)
{
+ if (0 < ss->sequence_used)
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Trying to send UDPBox with shared secrect %s sequence_used
%u and ss->sequence_allowed %u\n",
+ GNUNET_h2s (&ss->master),
+ ss->sequence_used,
+ ss->sequence_allowed);
+ // Uncomment this for alternativ 1 of backchannel functionality
if (ss->sequence_used >= ss->sequence_allowed)
+ // Until here for alternativ 1
+ // Uncomment this for alternativ 2 of backchannel functionality
+ // if (0 == ss->sequence_allowed)
+ // Until here for alternativ 2
{
continue;
}
@@ -2074,7 +2271,7 @@ mq_send_d (struct GNUNET_MQ_Handle *mq,
/* Append encrypted payload to dgram */
dpos = sizeof(struct UDPBox);
GNUNET_assert (
- 0 == gcry_cipher_encrypt (out_cipher, &dgram[dpos], msize,
msg, msize));
+ 0 == gcry_cipher_encrypt (out_cipher, &dgram[dpos], msize, msg, msize));
dpos += msize;
do_pad (out_cipher, &dgram[dpos], sizeof(dgram) - dpos);
GNUNET_assert (0 == gcry_cipher_gettag (out_cipher,
@@ -2087,14 +2284,43 @@ mq_send_d (struct GNUNET_MQ_Handle *mq,
receiver->address,
receiver->address_len))
GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "send");
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Sending UDPBox to %s\n", GNUNET_a2s (receiver->address,
+ receiver->address_len));
GNUNET_MQ_impl_send_continue (mq);
- receiver->acks_available--;
+ // receiver->acks_available--;
if (0 == receiver->acks_available)
{
/* We have no more ACKs */
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"No more acks\n");
}
+
+ /* (NULL == rekey_timeout)
+ rekey_timeout = GNUNET_TIME_relative_to_absolute (REKEY_TIME_INTERVAL);
+ else
+ {
+ rt = GNUNET_TIME_absolute_get_remaining (rekey_timeout);
+ if (0 == rt.rel_value_us)
+ {
+ rekey_timeout = NULL;
+ pos = receiver->ss_head;
+ while ( NULL != pos)
+ {
+ ss_to_destroy = pos;
+ pos = pos->next;
+ secret_destroy (ss_to_destroy, GNUNET_NO);
+ }
+ if (0 != receiver->acks_available)
+ GNUNET_TRANSPORT_communicator_mq_update (ch,
+ receiver->d_qh,
+ // TODO We can not do this.
But how can we signal this queue is not able to handle a message. Test code
interprets q-len as additional length.
+ -receiver->acks_available,
+ 1);
+ }
+ }*/
+
+
return;
}
}
@@ -2205,25 +2431,25 @@ setup_receiver_mq (struct ReceiverAddress *receiver)
// GNUNET_assert (NULL == receiver->mq);
switch (receiver->address->sa_family)
{
- case AF_INET:
- base_mtu = 1480 /* Ethernet MTU, 1500 - Ethernet header - VLAN tag */
- - sizeof(struct GNUNET_TUN_IPv4Header) /* 20 */
- - sizeof(struct GNUNET_TUN_UdpHeader) /* 8 */;
- break;
+ case AF_INET:
+ base_mtu = 1480 /* Ethernet MTU, 1500 - Ethernet header - VLAN tag */
+ - sizeof(struct GNUNET_TUN_IPv4Header) /* 20 */
+ - sizeof(struct GNUNET_TUN_UdpHeader) /* 8 */;
+ break;
- case AF_INET6:
- base_mtu = 1280 /* Minimum MTU required by IPv6 */
- - sizeof(struct GNUNET_TUN_IPv6Header) /* 40 */
- - sizeof(struct GNUNET_TUN_UdpHeader) /* 8 */;
- break;
+ case AF_INET6:
+ base_mtu = 1280 /* Minimum MTU required by IPv6 */
+ - sizeof(struct GNUNET_TUN_IPv6Header) /* 40 */
+ - sizeof(struct GNUNET_TUN_UdpHeader) /* 8 */;
+ break;
- default:
- GNUNET_assert (0);
- break;
+ default:
+ GNUNET_assert (0);
+ break;
}
/* MTU based on full KX messages */
receiver->kx_mtu = base_mtu - sizeof(struct InitialKX) /* 48 */
- - sizeof(struct UDPConfirmation); /* 104 */
+ - sizeof(struct UDPConfirmation); /* 104 */
/* MTU based on BOXed messages */
receiver->d_mtu = base_mtu - sizeof(struct UDPBox);
@@ -2314,10 +2540,10 @@ mq_init (void *cls, const struct GNUNET_PeerIdentity
*peer, const char *address)
receiver->target = *peer;
receiver->nt = GNUNET_NT_scanner_get_type (is, in, in_len);
(void) GNUNET_CONTAINER_multipeermap_put (
- receivers,
- &receiver->target,
- receiver,
-
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
+ receivers,
+ &receiver->target,
+ receiver,
+ GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Added %s to receivers\n",
GNUNET_i2s_full (&receiver->target));
@@ -2553,55 +2779,55 @@ ifc_broadcast (void *cls)
switch (bi->sa->sa_family)
{
- case AF_INET: {
- static int yes = 1;
- static int no = 0;
- ssize_t sent;
-
- if (GNUNET_OK != GNUNET_NETWORK_socket_setsockopt
(udp_sock,
-
SOL_SOCKET,
-
SO_BROADCAST,
- &yes,
-
sizeof(int)))
- GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING,
"setsockopt");
- sent = GNUNET_NETWORK_socket_sendto (udp_sock,
- &bi->bcm,
- sizeof(bi->bcm),
- bi->ba,
- bi->salen);
- if (-1 == sent)
- GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING,
"sendto");
- if (GNUNET_OK != GNUNET_NETWORK_socket_setsockopt
(udp_sock,
-
SOL_SOCKET,
-
SO_BROADCAST,
- &no,
-
sizeof(int)))
- GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING,
"setsockopt");
- break;
- }
-
- case AF_INET6: {
- ssize_t sent;
- struct sockaddr_in6 dst;
-
- dst.sin6_family = AF_INET6;
- dst.sin6_port = htons (my_port);
- dst.sin6_addr = bi->mcreq.ipv6mr_multiaddr;
- dst.sin6_scope_id = ((struct sockaddr_in6 *)
bi->ba)->sin6_scope_id;
-
- sent = GNUNET_NETWORK_socket_sendto (udp_sock,
- &bi->bcm,
- sizeof(bi->bcm),
- (const struct
sockaddr *) &dst,
- sizeof(dst));
- if (-1 == sent)
- GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING,
"sendto");
- break;
- }
-
- default:
- GNUNET_break (0);
- break;
+ case AF_INET: {
+ static int yes = 1;
+ static int no = 0;
+ ssize_t sent;
+
+ if (GNUNET_OK != GNUNET_NETWORK_socket_setsockopt (udp_sock,
+ SOL_SOCKET,
+ SO_BROADCAST,
+ &yes,
+ sizeof(int)))
+ GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "setsockopt");
+ sent = GNUNET_NETWORK_socket_sendto (udp_sock,
+ &bi->bcm,
+ sizeof(bi->bcm),
+ bi->ba,
+ bi->salen);
+ if (-1 == sent)
+ GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "sendto");
+ if (GNUNET_OK != GNUNET_NETWORK_socket_setsockopt (udp_sock,
+ SOL_SOCKET,
+ SO_BROADCAST,
+ &no,
+ sizeof(int)))
+ GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "setsockopt");
+ break;
+ }
+
+ case AF_INET6: {
+ ssize_t sent;
+ struct sockaddr_in6 dst;
+
+ dst.sin6_family = AF_INET6;
+ dst.sin6_port = htons (my_port);
+ dst.sin6_addr = bi->mcreq.ipv6mr_multiaddr;
+ dst.sin6_scope_id = ((struct sockaddr_in6 *) bi->ba)->sin6_scope_id;
+
+ sent = GNUNET_NETWORK_socket_sendto (udp_sock,
+ &bi->bcm,
+ sizeof(bi->bcm),
+ (const struct sockaddr *) &dst,
+ sizeof(dst));
+ if (-1 == sent)
+ GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "sendto");
+ break;
+ }
+
+ default:
+ GNUNET_break (0);
+ break;
}
}
@@ -2683,7 +2909,7 @@ iface_proc (void *cls,
(const struct sockaddr_in6 *) broadcast_addr;
GNUNET_assert (
- 1 == inet_pton (AF_INET6, "FF05::13B",
&bi->mcreq.ipv6mr_multiaddr));
+ 1 == inet_pton (AF_INET6, "FF05::13B", &bi->mcreq.ipv6mr_multiaddr));
/* http://tools.ietf.org/html/rfc2553#section-5.2:
*
@@ -2820,17 +3046,17 @@ run (void *cls,
GNUNET_a2s ((const struct sockaddr *) &in_sto, sto_len));
switch (in->sa_family)
{
- case AF_INET:
- my_port = ntohs (((struct sockaddr_in *) in)->sin_port);
- break;
+ case AF_INET:
+ my_port = ntohs (((struct sockaddr_in *) in)->sin_port);
+ break;
- case AF_INET6:
- my_port = ntohs (((struct sockaddr_in6 *) in)->sin6_port);
- break;
+ case AF_INET6:
+ my_port = ntohs (((struct sockaddr_in6 *) in)->sin6_port);
+ break;
- default:
- GNUNET_break (0);
- my_port = 0;
+ default:
+ GNUNET_break (0);
+ my_port = 0;
}
stats = GNUNET_STATISTICS_create ("C-UDP", cfg);
senders = GNUNET_CONTAINER_multipeermap_create (32, GNUNET_YES);
@@ -2845,9 +3071,9 @@ run (void *cls,
if (NULL == my_private_key)
{
GNUNET_log (
- GNUNET_ERROR_TYPE_ERROR,
- _ (
- "Transport service is lacking key configuration settings.
Exiting.\n"));
+ GNUNET_ERROR_TYPE_ERROR,
+ _ (
+ "Transport service is lacking key configuration settings.
Exiting.\n"));
GNUNET_SCHEDULER_shutdown ();
return;
}
@@ -2923,8 +3149,8 @@ main (int argc, char *const *argv)
options,
&run,
NULL))
- ? 0
- : 1;
+ ? 0
+ : 1;
GNUNET_free_nz ((void *) argv);
return ret;
}
diff --git a/src/transport/gnunet-service-transport.c
b/src/transport/gnunet-service-transport.c
index 207c17f2f..92e37a91c 100644
--- a/src/transport/gnunet-service-transport.c
+++ b/src/transport/gnunet-service-transport.c
@@ -700,6 +700,7 @@ handle_send_transmit_continuation (void *cls,
delay = GNUNET_TIME_absolute_get_duration (stcc->send_time);
addr = GST_neighbour_get_current_address (&stcc->target);
+#ifdef ENABLE_TTD
if (delay.rel_value_us > GNUNET_CONSTANTS_LATENCY_WARN.rel_value_us)
GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
"It took us %s to send %u/%u bytes to %s (%d, %s)\n",
@@ -718,6 +719,7 @@ handle_send_transmit_continuation (void *cls,
GNUNET_i2s (&stcc->target),
success,
(NULL != addr) ? addr->transport_name : "%");
+#endif
if (GNUNET_NO == stcc->down)
{
diff --git a/src/transport/plugin_transport_http_client.c
b/src/transport/plugin_transport_http_client.c
index 92ed2fe52..219fae57b 100644
--- a/src/transport/plugin_transport_http_client.c
+++ b/src/transport/plugin_transport_http_client.c
@@ -769,10 +769,10 @@ http_client_plugin_send (void *cls,
char *stat_txt;
LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Session %p/request %p: Sending message with %u to peer `%s' \n",
+ "Session %p/request %p: Sending message with %lu to peer `%s' \n",
s,
s->put.easyhandle,
- msgbuf_size,
+ (unsigned long) msgbuf_size,
GNUNET_i2s (&s->address->peer));
/* create new message and schedule */
@@ -1087,11 +1087,10 @@ client_send_cb (void *stream,
if (msg->pos == msg->size)
{
LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Session %p/request %p: sent message with %u bytes sent, removing
message from queue\n",
+ "Session %p/request %p: sent message with %lu bytes sent, removing
message from queue\n",
s,
s->put.easyhandle,
- msg->size,
- msg->pos);
+ (unsigned long) msg->size);
/* Calling transmit continuation */
GNUNET_CONTAINER_DLL_remove (s->msg_head,
s->msg_tail,
@@ -1249,10 +1248,10 @@ client_receive (void *stream,
size_t len = size * nmemb;
LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Session %p / request %p: Received %u bytes from peer `%s'\n",
+ "Session %p / request %p: Received %lu bytes from peer `%s'\n",
s,
s->get.easyhandle,
- len,
+ (unsigned long) len,
GNUNET_i2s (&s->address->peer));
now = GNUNET_TIME_absolute_get ();
if (now.abs_value_us < s->next_receive.abs_value_us)
@@ -1346,7 +1345,7 @@ client_run (void *cls)
/* Log status of terminated request */
if ((0 != msg->data.result) || (http_statuscode != 200))
LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Session %p/request %p: %s request to `%s' ended with status %i
reason %i: `%s'\n",
+ "Session %p/request %p: %s request to `%s' ended with status %li
reason %i: `%s'\n",
s, msg->easy_handle,
(GNUNET_YES == put_request) ? "PUT" : "GET",
GNUNET_i2s (&s->address->peer),
diff --git a/src/transport/plugin_transport_http_common.c
b/src/transport/plugin_transport_http_common.c
index d81d6db9c..0e3778837 100644
--- a/src/transport/plugin_transport_http_common.c
+++ b/src/transport/plugin_transport_http_common.c
@@ -629,7 +629,7 @@ http_common_plugin_address_to_string (const char *plugin,
if (addr_str[ntohl (address->urlen) - 1] != '\0')
return NULL;
GNUNET_asprintf (&res, "%s.%u.%s", plugin, ntohl (address->options),
- &address[1]);
+ (char*)&address[1]);
if (strlen (res) + 1 < 500)
{
GNUNET_memcpy (rbuf, res, strlen (res) + 1);
diff --git a/src/transport/plugin_transport_http_server.c
b/src/transport/plugin_transport_http_server.c
index d1b21ba9c..6e95ca00c 100644
--- a/src/transport/plugin_transport_http_server.c
+++ b/src/transport/plugin_transport_http_server.c
@@ -745,10 +745,10 @@ http_server_plugin_send (void *cls,
char *stat_txt;
LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Session %p/request %p: Sending message with %u to peer `%s'\n",
+ "Session %p/request %p: Sending message with %lu to peer `%s'\n",
session,
session->server_send,
- msgbuf_size,
+ (unsigned long) msgbuf_size,
GNUNET_i2s (&session->target));
/* create new message and schedule */
@@ -1270,8 +1270,8 @@ server_parse_url (struct HTTP_Server_Plugin *plugin,
if (hash_length != plugin->peer_id_length)
{
LOG (GNUNET_ERROR_TYPE_DEBUG,
- "URL target is %u bytes, expecting %u\n",
- hash_length, plugin->peer_id_length);
+ "URL target is %lu bytes, expecting %u\n",
+ (unsigned long) hash_length, plugin->peer_id_length);
return GNUNET_SYSERR;
}
if (GNUNET_OK !=
@@ -1616,8 +1616,8 @@ server_send_callback (void *cls,
{
sc->connected = GNUNET_YES;
LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Sent %u bytes to peer `%s' with session %p \n",
- bytes_read,
+ "Sent %lu bytes to peer `%s' with session %p \n",
+ (unsigned long) bytes_read,
GNUNET_i2s (&s->target),
s);
GNUNET_asprintf (&stat_txt,
@@ -1761,14 +1761,14 @@ server_access_cb (void *cls,
LOG (GNUNET_ERROR_TYPE_DEBUG,
_ (
- "Access from connection %p (%u of %u) for `%s' `%s' url `%s' with
upload data size %u\n"),
+ "Access from connection %p (%u of %u) for `%s' `%s' url `%s' with
upload data size %lu\n"),
sc,
plugin->cur_request,
plugin->max_request,
method,
version,
url,
- (*upload_data_size));
+ (unsigned long) (*upload_data_size));
if (NULL == sc)
{
/* CORS pre-flight request */
@@ -1868,19 +1868,19 @@ server_access_cb (void *cls,
/* (*upload_data_size > 0) for every segment received */
LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Session %p / Connection %p: Peer `%s' PUT on address `%s' received
%u bytes\n",
+ "Session %p / Connection %p: Peer `%s' PUT on address `%s' received
%lu bytes\n",
s, sc,
GNUNET_i2s (&s->target),
http_common_plugin_address_to_string (plugin->protocol,
s->address->address,
s->address->address_length),
- *upload_data_size);
+ (unsigned long) *upload_data_size);
delay = GNUNET_TIME_absolute_get_remaining (s->next_receive);
if (0 == delay.rel_value_us)
{
LOG (GNUNET_ERROR_TYPE_DEBUG,
- "PUT with %u bytes forwarded to MST\n",
- *upload_data_size);
+ "PUT with %lu bytes forwarded to MST\n",
+ (unsigned long) *upload_data_size);
if (s->msg_tk == NULL)
{
s->msg_tk = GNUNET_MST_create (&server_receive_mst_cb,
diff --git a/src/transport/plugin_transport_tcp.c
b/src/transport/plugin_transport_tcp.c
index e3bc21543..8378a64dd 100644
--- a/src/transport/plugin_transport_tcp.c
+++ b/src/transport/plugin_transport_tcp.c
@@ -2010,8 +2010,8 @@ do_transmit (void *cls, size_t size, void *buf)
GNUNET_assert (pos->message_size <= session->bytes_in_queue);
session->bytes_in_queue -= pos->message_size;
LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Failed to transmit %u byte message to `%s'.\n",
- pos->message_size,
+ "Failed to transmit %lu byte message to `%s'.\n",
+ (unsigned long) pos->message_size,
GNUNET_i2s (&session->target));
ret += pos->message_size;
GNUNET_CONTAINER_DLL_insert_after (hd, tl, tl, pos);
@@ -2067,9 +2067,9 @@ do_transmit (void *cls, size_t size, void *buf)
session->bytes_in_queue -= pos->message_size;
GNUNET_assert (size >= pos->message_size);
LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Transmitting message of type %u size %u to peer %s at %s\n",
+ "Transmitting message of type %u size %lu to peer %s at %s\n",
ntohs (((struct GNUNET_MessageHeader *) pos->msg)->type),
- pos->message_size,
+ (unsigned long) pos->message_size,
GNUNET_i2s (&session->target),
tcp_plugin_address_to_string (session->plugin,
session->address->address,
@@ -2192,8 +2192,8 @@ tcp_plugin_send (void *cls,
pm->transmit_cont_cls = cont_cls;
LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Asked to transmit %u bytes to `%s', added message to list.\n",
- msgbuf_size,
+ "Asked to transmit %lu bytes to `%s', added message to list.\n",
+ (unsigned long) msgbuf_size,
GNUNET_i2s (&session->target));
if (GNUNET_YES ==
diff --git a/src/transport/plugin_transport_udp.c
b/src/transport/plugin_transport_udp.c
index ec3a0edd8..49e84dfe7 100644
--- a/src/transport/plugin_transport_udp.c
+++ b/src/transport/plugin_transport_udp.c
@@ -1821,7 +1821,8 @@ enqueue_fragment (void *cls, const struct
GNUNET_MessageHeader *msg)
struct GNUNET_ATS_Session *session = frag_ctx->session;
size_t msg_len = ntohs (msg->size);
- LOG (GNUNET_ERROR_TYPE_DEBUG, "Enqueuing fragment with %u bytes\n", msg_len);
+ LOG (GNUNET_ERROR_TYPE_DEBUG, "Enqueuing fragment with %lu bytes\n",
+ (unsigned long) msg_len);
udpw = GNUNET_malloc (sizeof(struct UDP_MessageWrapper) + msg_len);
udpw->session = session;
udpw->msg_buf = (char *) &udpw[1];
@@ -1996,8 +1997,8 @@ udp_plugin_send (void *cls,
return GNUNET_SYSERR;
}
LOG (GNUNET_ERROR_TYPE_DEBUG,
- "UDP transmits %u-byte message to `%s' using address `%s'\n",
- udpmlen,
+ "UDP transmits %lu-byte message to `%s' using address `%s'\n",
+ (unsigned long) udpmlen,
GNUNET_i2s (&s->target),
udp_address_to_string (plugin,
s->address->address,
@@ -3113,18 +3114,18 @@ remove_timeout_messages_and_select (struct Plugin
*plugin,
{
/* this message is not delayed */
LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Message for peer `%s' (%u bytes) is not delayed \n",
+ "Message for peer `%s' (%lu bytes) is not delayed \n",
GNUNET_i2s (&udpw->session->target),
- udpw->payload_size);
+ (unsigned long) udpw->payload_size);
break; /* Found message to send, break */
}
else
{
/* Message is delayed, try next */
LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Message for peer `%s' (%u bytes) is delayed for %s\n",
+ "Message for peer `%s' (%lu bytes) is delayed for %s\n",
GNUNET_i2s (&udpw->session->target),
- udpw->payload_size,
+ (unsigned long) udpw->payload_size,
GNUNET_STRINGS_relative_time_to_string (remaining, GNUNET_YES));
udpw = udpw->next;
}
diff --git a/src/transport/plugin_transport_unix.c
b/src/transport/plugin_transport_unix.c
index 9d3e7d354..2324914c9 100644
--- a/src/transport/plugin_transport_unix.c
+++ b/src/transport/plugin_transport_unix.c
@@ -1304,8 +1304,8 @@ unix_plugin_send (void *cls,
return GNUNET_SYSERR;
}
LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Sending %u bytes with session for peer `%s' `%s'\n",
- msgbuf_size,
+ "Sending %lu bytes with session for peer `%s' `%s'\n",
+ (unsigned long) msgbuf_size,
GNUNET_i2s (&session->target),
unix_plugin_address_to_string (NULL,
session->address->address,
diff --git a/src/transport/tcp_connection_legacy.c
b/src/transport/tcp_connection_legacy.c
index 3e173b8a4..924362ef2 100644
--- a/src/transport/tcp_connection_legacy.c
+++ b/src/transport/tcp_connection_legacy.c
@@ -1142,9 +1142,9 @@ RETRY:
return;
}
LOG (GNUNET_ERROR_TYPE_DEBUG,
- "receive_ready read %u/%u bytes from `%s' (%p)!\n",
- (unsigned int) ret,
- connection->max,
+ "receive_ready read %lu/%lu bytes from `%s' (%p)!\n",
+ (unsigned long) ret,
+ (unsigned long) connection->max,
GNUNET_a2s (connection->addr, connection->addrlen),
connection);
GNUNET_assert (NULL != (receiver = connection->receiver));
@@ -1327,8 +1327,8 @@ connect_error (void *cls)
GNUNET_CONNECTION_TransmitReadyNotify notify;
LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Transmission request of size %u fails (%s/%u), connection failed
(%p).\n",
- connection->nth.notify_size,
+ "Transmission request of size %lu fails (%s/%u), connection failed
(%p).\n",
+ (unsigned long) connection->nth.notify_size,
connection->hostname,
connection->port,
connection);
@@ -1423,9 +1423,9 @@ RETRY:
return;
}
LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Connection transmitted %u/%u bytes to `%s' (%p)\n",
- (unsigned int) ret,
- have,
+ "Connection transmitted %lu/%lu bytes to `%s' (%p)\n",
+ (unsigned long) ret,
+ (unsigned long) have,
GNUNET_a2s (connection->addr, connection->addrlen),
connection);
connection->write_buffer_pos += ret;
diff --git a/src/transport/tcp_service_legacy.c
b/src/transport/tcp_service_legacy.c
index 12dce3993..8606b353b 100644
--- a/src/transport/tcp_service_legacy.c
+++ b/src/transport/tcp_service_legacy.c
@@ -1433,7 +1433,7 @@ LEGACY_SERVICE_run (int argc,
{
clock_offset = skew_offset - skew_variance;
GNUNET_TIME_set_offset (clock_offset);
- LOG (GNUNET_ERROR_TYPE_DEBUG, "Skewing clock by %dll ms\n", clock_offset);
+ LOG (GNUNET_ERROR_TYPE_DEBUG, "Skewing clock by %lld ms\n", clock_offset);
}
/* actually run service */
err = 0;
diff --git a/src/transport/test_communicator_basic.c
b/src/transport/test_communicator_basic.c
index e3573ac2c..8251a5169 100644
--- a/src/transport/test_communicator_basic.c
+++ b/src/transport/test_communicator_basic.c
@@ -82,6 +82,11 @@ static struct
GNUNET_TRANSPORT_TESTING_TransportCommunicatorHandle *my_tc;
static unsigned int iterations_left = TOTAL_ITERATIONS;
+#define TIMEOUT_MULTIPLIER 1
+
+#define DELAY \
+ GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MICROSECONDS,50)
+
#define SHORT_BURST_WINDOW \
GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS,2)
@@ -97,13 +102,21 @@ enum TestPhase
};
-static size_t num_sent = 0;
+static size_t num_sent_short = 0;
+
+static size_t num_sent_long = 0;
+
+static size_t num_sent_size = 0;
static uint32_t ack = 0;
static enum TestPhase phase;
-static size_t num_received = 0;
+static size_t num_received_short = 0;
+
+static size_t num_received_long = 0;
+
+static size_t num_received_size = 0;
static uint64_t avg_latency = 0;
@@ -230,6 +243,10 @@ make_payload (size_t payload_size)
static void
latency_timeout (void *cls)
{
+
+ size_t num_sent = 0;
+ size_t num_received = 0;
+
to_task = NULL;
if (GNUNET_TIME_absolute_get_remaining (timeout).rel_value_us > 0)
{
@@ -239,6 +256,21 @@ latency_timeout (void *cls)
return;
}
+ switch (phase)
+ {
+ case TP_BURST_SHORT:
+ num_sent = num_sent_short;
+ num_received = num_received_short;
+ break;
+ case TP_BURST_LONG:
+ num_sent = num_sent_long;
+ num_received = num_received_long;
+ break;
+ case TP_SIZE_CHECK:
+ num_sent = num_sent_size;
+ num_received = num_received_size;
+ break;
+ }
LOG (GNUNET_ERROR_TYPE_ERROR,
"Latency too high. Test failed. (Phase: %d. Sent: %lu, Received:
%lu)\n",
phase, num_sent, num_received);
@@ -246,6 +278,8 @@ latency_timeout (void *cls)
GNUNET_SCHEDULER_shutdown ();
}
+/*static void
+ size_test (void *cls);*/
static void
size_test (void *cls)
@@ -253,6 +287,9 @@ size_test (void *cls)
char *payload;
size_t max_size = 64000;
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "size_test_cb %u\n",
+ num_sent_size);
GNUNET_assert (TP_SIZE_CHECK == phase);
if (LONG_MESSAGE_SIZE != long_message_size)
max_size = long_message_size;
@@ -260,7 +297,7 @@ size_test (void *cls)
return; /* Leave some room for our protocol, so not 2^16 exactly */
ack += 10;
payload = make_payload (ack);
- num_sent++;
+ num_sent_size++;
GNUNET_TRANSPORT_TESTING_transport_communicator_send (my_tc,
(ack < max_size)
? &size_test
@@ -269,47 +306,98 @@ size_test (void *cls)
payload,
ack);
GNUNET_free (payload);
- timeout = GNUNET_TIME_relative_to_absolute (GNUNET_TIME_UNIT_SECONDS);
+ timeout = GNUNET_TIME_relative_to_absolute (GNUNET_TIME_relative_multiply (
+ GNUNET_TIME_UNIT_SECONDS,
+ TIMEOUT_MULTIPLIER));
}
+/*static void
+size_test (void *cls)
+{
+ GNUNET_SCHEDULER_add_delayed (DELAY,
+ &size_test_cb,
+ NULL);
+ }*/
+
+static void
+long_test (void *cls);
static void
-long_test (void *cls)
+long_test_cb (void *cls)
{
char *payload;
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "long_test_cb %u/%u\n",
+ num_sent_long,
+ num_received_long);
payload = make_payload (long_message_size);
- num_sent++;
+ num_sent_long++;
GNUNET_TRANSPORT_TESTING_transport_communicator_send (my_tc,
- (BURST_PACKETS ==
- num_sent)
+ ((BURST_PACKETS
+ * 0.91 ==
+ num_received_long) ||
+ (BURST_PACKETS ==
+ num_sent_long))
? NULL
: &long_test,
NULL,
payload,
long_message_size);
GNUNET_free (payload);
- timeout = GNUNET_TIME_relative_to_absolute (GNUNET_TIME_UNIT_SECONDS);
+ timeout = GNUNET_TIME_relative_to_absolute (GNUNET_TIME_relative_multiply (
+ GNUNET_TIME_UNIT_SECONDS,
+ TIMEOUT_MULTIPLIER));
}
+static void
+long_test (void *cls)
+{
+ /*LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "long_test %u\n",
+ num_sent_long);*/
+ GNUNET_SCHEDULER_add_delayed (DELAY,
+ &long_test_cb,
+ NULL);
+}
static void
-short_test (void *cls)
+short_test (void *cls);
+
+static void
+short_test_cb (void *cls)
{
char *payload;
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "short_test_cb %u/%u\n",
+ num_sent_short,
+ num_received_short);
payload = make_payload (SHORT_MESSAGE_SIZE);
- num_sent++;
+ num_sent_short++;
GNUNET_TRANSPORT_TESTING_transport_communicator_send (my_tc,
- (BURST_PACKETS ==
- num_sent)
+ ((BURST_PACKETS
+ * 0.91 ==
+ num_received_short)
||
+ (BURST_PACKETS ==
+ num_sent_short))
? NULL
: &short_test,
NULL,
payload,
SHORT_MESSAGE_SIZE);
GNUNET_free (payload);
- timeout = GNUNET_TIME_relative_to_absolute (GNUNET_TIME_UNIT_SECONDS);
+ timeout = GNUNET_TIME_relative_to_absolute (GNUNET_TIME_relative_multiply (
+ GNUNET_TIME_UNIT_SECONDS,
+ TIMEOUT_MULTIPLIER));
+}
+
+static void
+short_test (void *cls)
+{
+ GNUNET_SCHEDULER_add_delayed (DELAY,
+ &short_test_cb,
+ NULL);
}
@@ -373,12 +461,17 @@ add_queue_cb (void *cls,
else
long_message_size = LONG_MESSAGE_SIZE;
phase = TP_BURST_SHORT;
- timeout = GNUNET_TIME_relative_to_absolute (GNUNET_TIME_UNIT_MINUTES);
+ timeout = GNUNET_TIME_relative_to_absolute (GNUNET_TIME_relative_multiply (
+ GNUNET_TIME_UNIT_SECONDS,
+ TIMEOUT_MULTIPLIER));
GNUNET_assert (NULL == to_task);
- to_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_MINUTES,
+ to_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply (
+ GNUNET_TIME_UNIT_SECONDS,
+ TIMEOUT_MULTIPLIER),
&latency_timeout,
NULL);
- prepare_test (NULL);
+ // prepare_test (NULL);
+ short_test (NULL);
}
@@ -388,10 +481,26 @@ update_avg_latency (const char*payload)
struct GNUNET_TIME_AbsoluteNBO *ts_n;
struct GNUNET_TIME_Absolute ts;
struct GNUNET_TIME_Relative latency;
+ size_t num_received = 0;
ts_n = (struct GNUNET_TIME_AbsoluteNBO *) payload;
ts = GNUNET_TIME_absolute_ntoh (*ts_n);
latency = GNUNET_TIME_absolute_get_duration (ts);
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Latency of received packet: %u\n",
+ latency);
+ switch (phase)
+ {
+ case TP_BURST_SHORT:
+ num_received = num_received_short;
+ break;
+ case TP_BURST_LONG:
+ num_received = num_received_long;
+ break;
+ case TP_SIZE_CHECK:
+ num_received = num_received_size;
+ break;
+ }
if (1 >= num_received)
avg_latency = latency.rel_value_us;
else
@@ -400,7 +509,6 @@ update_avg_latency (const char*payload)
}
-
/**
* @brief Handle an incoming message
*
@@ -412,7 +520,8 @@ update_avg_latency (const char*payload)
*/
static void
incoming_message_cb (void *cls,
- struct
GNUNET_TRANSPORT_TESTING_TransportCommunicatorHandle
+ struct
+ GNUNET_TRANSPORT_TESTING_TransportCommunicatorHandle
*tc_h,
const char*payload,
size_t payload_len)
@@ -424,7 +533,9 @@ incoming_message_cb (void *cls,
return;
}
/* Reset timeout */
- timeout = GNUNET_TIME_relative_to_absolute (GNUNET_TIME_UNIT_SECONDS);
+ timeout = GNUNET_TIME_relative_to_absolute (GNUNET_TIME_relative_multiply (
+ GNUNET_TIME_UNIT_SECONDS,
+ TIMEOUT_MULTIPLIER));
switch (phase)
{
case TP_INIT:
@@ -433,30 +544,31 @@ incoming_message_cb (void *cls,
case TP_BURST_SHORT:
{
GNUNET_assert (SHORT_MESSAGE_SIZE == payload_len);
- num_received++;
+ num_received_short++;
duration = GNUNET_TIME_absolute_get_duration (start_short);
update_avg_latency (payload);
- if (num_received == BURST_PACKETS)
+ if (num_received_short == BURST_PACKETS * 0.91)
{
LOG (GNUNET_ERROR_TYPE_MESSAGE,
"Short size packet test done.\n");
char *goodput = GNUNET_STRINGS_byte_size_fancy ((SHORT_MESSAGE_SIZE
- * num_received * 1000
+ * num_received_short
+ * 1000
* 1000)
/
duration.rel_value_us);
LOG (GNUNET_ERROR_TYPE_MESSAGE,
"%lu/%lu packets in %llu us (%s/s) -- avg latency: %llu us\n",
- (unsigned long) num_received,
- (unsigned long) num_sent,
+ (unsigned long) num_received_short,
+ (unsigned long) num_sent_short,
(unsigned long long) duration.rel_value_us,
goodput,
(unsigned long long) avg_latency);
GNUNET_free (goodput);
start_long = GNUNET_TIME_absolute_get ();
phase = TP_BURST_LONG;
- num_sent = 0;
+ // num_sent_short = 0;
avg_latency = 0;
- num_received = 0;
+ // num_received = 0;
long_test (NULL);
}
break;
@@ -467,32 +579,34 @@ incoming_message_cb (void *cls,
{
LOG (GNUNET_ERROR_TYPE_WARNING,
"Ignoring packet with wrong length\n");
- return; // Ignore
+ return; // Ignore
}
- num_received++;
+ num_received_long++;
duration = GNUNET_TIME_absolute_get_duration (start_long);
update_avg_latency (payload);
- if (num_received == BURST_PACKETS)
+ if (num_received_long == BURST_PACKETS * 0.91)
{
LOG (GNUNET_ERROR_TYPE_MESSAGE,
"Long size packet test done.\n");
char *goodput = GNUNET_STRINGS_byte_size_fancy ((long_message_size
- * num_received * 1000
+ * num_received_long
+ * 1000
* 1000)
- /
duration.rel_value_us);
+ / duration.
+ rel_value_us);
LOG (GNUNET_ERROR_TYPE_MESSAGE,
"%lu/%lu packets in %llu us (%s/s) -- avg latency: %llu us\n",
- (unsigned long) num_received,
- (unsigned long) num_sent,
+ (unsigned long) num_received_long,
+ (unsigned long) num_sent_long,
(unsigned long long) duration.rel_value_us,
goodput,
(unsigned long long) avg_latency);
GNUNET_free (goodput);
ack = 0;
phase = TP_SIZE_CHECK;
- num_received = 0;
- num_sent = 0;
+ // num_received = 0;
+ // num_sent_long = 0;
avg_latency = 0;
size_test (NULL);
}
@@ -505,25 +619,29 @@ incoming_message_cb (void *cls,
GNUNET_assert (TP_SIZE_CHECK == phase);
if (LONG_MESSAGE_SIZE != long_message_size)
max_size = long_message_size;
- num_received++;
+ num_received_size++;
update_avg_latency (payload);
- if (num_received >= (max_size) / 10)
+ if (num_received_size >= (max_size) / 10)
{
LOG (GNUNET_ERROR_TYPE_MESSAGE,
"Size packet test done.\n");
LOG (GNUNET_ERROR_TYPE_MESSAGE,
"%lu/%lu packets -- avg latency: %llu us\n",
- (unsigned long) num_received,
- (unsigned long) num_sent,
+ (unsigned long) num_received_size,
+ (unsigned long) num_sent_size,
(unsigned long long) avg_latency);
- num_received = 0;
- num_sent = 0;
+ num_received_size = 0;
+ num_sent_size = 0;
avg_latency = 0;
iterations_left--;
if (0 != iterations_left)
{
start_short = GNUNET_TIME_absolute_get ();
phase = TP_BURST_SHORT;
+ num_sent_short = 0;
+ num_sent_long = 0;
+ num_received_short = 0;
+ num_received_long = 0;
short_test (NULL);
break;
}
@@ -561,8 +679,8 @@ static void
run (void *cls)
{
ret = 0;
- num_received = 0;
- num_sent = 0;
+ // num_received = 0;
+ // num_sent = 0;
for (unsigned int i = 0; i < NUM_PEERS; i++)
{
tc_hs[i] = GNUNET_TRANSPORT_TESTING_transport_communicator_service_start (
diff --git a/src/transport/transport-testing2.c
b/src/transport/transport-testing2.c
index 98cfd5e29..076fbf331 100644
--- a/src/transport/transport-testing2.c
+++ b/src/transport/transport-testing2.c
@@ -553,7 +553,12 @@ handle_update_queue_message (void *cls,
tc_queue->mtu = ntohl (msg->mtu);
tc_queue->cs = msg->cs;
tc_queue->priority = ntohl (msg->priority);
+ // Uncomment this for alternativ 1 of backchannel functionality
tc_queue->q_len += GNUNET_ntohll (msg->q_len);
+ // Until here for alternativ 1
+ // Uncomment this for alternativ 2 of backchannel functionality
+ // tc_queue->q_len = GNUNET_ntohll (msg->q_len);
+ // Until here for alternativ 2
GNUNET_SERVICE_client_continue (client->client);
}
@@ -1130,8 +1135,10 @@ GNUNET_TRANSPORT_TESTING_transport_communicator_send
}
}
GNUNET_assert (NULL != tc_queue);
+ // Uncomment this for alternativ 1 of backchannel functionality
if (tc_queue->q_len != GNUNET_TRANSPORT_QUEUE_LENGTH_UNLIMITED)
tc_queue->q_len--;
+ // Until here for alternativ 1
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Sending message\n");
inbox_size = sizeof (struct GNUNET_MessageHeader) + payload_size;
diff --git a/src/util/bio.c b/src/util/bio.c
index 39050bb87..43a2abc89 100644
--- a/src/util/bio.c
+++ b/src/util/bio.c
@@ -356,10 +356,10 @@ GNUNET_BIO_read_string (struct GNUNET_BIO_ReadHandle *h,
if (big > max_length)
{
GNUNET_asprintf (&h->emsg,
- _ ("String `%s' longer than allowed (%u > %u)"),
+ _ ("String `%s' longer than allowed (%u > %lu)"),
what,
big,
- max_length);
+ (unsigned long) max_length);
return GNUNET_SYSERR;
}
buf = GNUNET_malloc (big);
diff --git a/src/util/client.c b/src/util/client.c
index 86dabe664..2df439175 100644
--- a/src/util/client.c
+++ b/src/util/client.c
@@ -654,7 +654,7 @@ try_connect_using_address (void *cls,
"Trying to connect using address `%s:%u'\n",
GNUNET_a2s (addr,
addrlen),
- cstate->port);
+ (unsigned int) cstate->port);
ap = GNUNET_malloc (sizeof(struct AddressProbe) + addrlen);
ap->addr = (const struct sockaddr *) &ap[1];
GNUNET_memcpy (&ap[1],
diff --git a/src/util/configuration_loader.c b/src/util/configuration_loader.c
index b9e5cb67f..a59477b25 100644
--- a/src/util/configuration_loader.c
+++ b/src/util/configuration_loader.c
@@ -47,7 +47,8 @@ GNUNET_CONFIGURATION_load (struct GNUNET_CONFIGURATION_Handle
*cfg,
base_config_varname = GNUNET_OS_project_data_get ()->base_config_varname;
- if (NULL != (baseconfig = getenv (base_config_varname)))
+ if (NULL != base_config_varname
+ && NULL != (baseconfig = getenv (base_config_varname)))
{
baseconfig = GNUNET_strdup (baseconfig);
}
@@ -62,14 +63,16 @@ GNUNET_CONFIGURATION_load (struct
GNUNET_CONFIGURATION_Handle *cfg,
GNUNET_free (ipath);
}
- if (GNUNET_SYSERR ==
- GNUNET_CONFIGURATION_load_from (cfg,
- baseconfig))
+ char *dname = GNUNET_STRINGS_filename_expand (baseconfig);
+ GNUNET_free (baseconfig);
+
+ if (GNUNET_YES == GNUNET_DISK_directory_test (dname, GNUNET_YES) &&
+ GNUNET_SYSERR == GNUNET_CONFIGURATION_load_from (cfg, dname))
{
- GNUNET_free (baseconfig);
+ GNUNET_free (dname);
return GNUNET_SYSERR; /* no configuration at all found */
}
- GNUNET_free (baseconfig);
+ GNUNET_free (dname);
if ((NULL != filename) &&
(GNUNET_OK != GNUNET_CONFIGURATION_parse (cfg, filename)))
{
diff --git a/src/util/os_installation.c b/src/util/os_installation.c
index 34b88d761..1f2dd2e5b 100644
--- a/src/util/os_installation.c
+++ b/src/util/os_installation.c
@@ -150,6 +150,8 @@ get_path_from_proc_maps ()
FILE *f;
char *lgu;
+ if (NULL == current_pd->libname)
+ return NULL;
GNUNET_snprintf (fn, sizeof(fn), "/proc/%u/maps", getpid ());
if (NULL == (f = fopen (fn, "r")))
return NULL;
diff --git a/src/util/program.c b/src/util/program.c
index 8bda34b4f..b5484855c 100644
--- a/src/util/program.c
+++ b/src/util/program.c
@@ -232,15 +232,20 @@ GNUNET_PROGRAM_run2 (int argc,
sizeof(struct GNUNET_GETOPT_CommandLineOption),
&cmd_sorter);
loglev = NULL;
- xdg = getenv ("XDG_CONFIG_HOME");
- if (NULL != xdg)
- GNUNET_asprintf (&cfg_fn,
- "%s%s%s",
- xdg,
- DIR_SEPARATOR_STR,
- pd->config_file);
+ if (NULL != pd->config_file && NULL != pd->user_config_file)
+ {
+ xdg = getenv ("XDG_CONFIG_HOME");
+ if (NULL != xdg)
+ GNUNET_asprintf (&cfg_fn,
+ "%s%s%s",
+ xdg,
+ DIR_SEPARATOR_STR,
+ pd->config_file);
+ else
+ cfg_fn = GNUNET_strdup (pd->user_config_file);
+ }
else
- cfg_fn = GNUNET_strdup (pd->user_config_file);
+ cfg_fn = NULL;
lpfx = GNUNET_strdup (binaryName);
if (NULL != (spc = strstr (lpfx, " ")))
*spc = '\0';
@@ -269,7 +274,7 @@ GNUNET_PROGRAM_run2 (int argc,
}
else
{
- if (GNUNET_YES == GNUNET_DISK_file_test (cfg_fn))
+ if (NULL != cfg_fn && GNUNET_YES == GNUNET_DISK_file_test (cfg_fn))
{
if (GNUNET_SYSERR == GNUNET_CONFIGURATION_load (cfg, cfg_fn))
{
@@ -284,7 +289,7 @@ GNUNET_PROGRAM_run2 (int argc,
goto cleanup;
}
}
- else
+ else if (NULL != cfg_fn)
{
GNUNET_free (cfg_fn);
cfg_fn = NULL;
diff --git a/src/util/service.c b/src/util/service.c
index ddd31181d..4c647430d 100644
--- a/src/util/service.c
+++ b/src/util/service.c
@@ -2120,7 +2120,9 @@ GNUNET_SERVICE_run_ (int argc,
{
clock_offset = skew_offset - skew_variance;
GNUNET_TIME_set_offset (clock_offset);
- LOG (GNUNET_ERROR_TYPE_DEBUG, "Skewing clock by %dll ms\n", clock_offset);
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Skewing clock by %lld ms\n",
+ (long long) clock_offset);
}
GNUNET_RESOLVER_connect (sh.cfg);
diff --git a/src/util/strings.c b/src/util/strings.c
index 9d6f4039e..0fb6eaf0c 100644
--- a/src/util/strings.c
+++ b/src/util/strings.c
@@ -176,7 +176,7 @@ GNUNET_STRINGS_buffer_tokenize (const char *buffer,
char *
GNUNET_STRINGS_byte_size_fancy (unsigned long long size)
{
- const char *unit = _ (/* size unit */ "b");
+ const char *unit = /* size unit */ "b";
char *ret;
if (size > 5 * 1024)
@@ -703,43 +703,44 @@ GNUNET_STRINGS_relative_time_to_string (struct
GNUNET_TIME_Relative delta,
int do_round)
{
static GNUNET_THREAD_LOCAL char buf[128];
- const char *unit = _ (/* time unit */ "µs");
+ const char *unit = /* time unit */ "µs";
uint64_t dval = delta.rel_value_us;
if (GNUNET_TIME_UNIT_FOREVER_REL.rel_value_us == delta.rel_value_us)
- return _ ("forever");
+ return "forever";
if (0 == delta.rel_value_us)
- return _ ("0 ms");
+ return "0 ms";
if (((GNUNET_YES == do_round) && (dval > 5 * 1000)) || (0 == (dval % 1000)))
{
dval = dval / 1000;
- unit = _ (/* time unit */ "ms");
+ unit = /* time unit */ "ms";
if (((GNUNET_YES == do_round) && (dval > 5 * 1000)) || (0 == (dval %
1000)))
{
dval = dval / 1000;
- unit = _ (/* time unit */ "s");
+ unit = /* time unit */ "s";
if (((GNUNET_YES == do_round) && (dval > 5 * 60)) || (0 == (dval % 60)))
{
dval = dval / 60;
- unit = _ (/* time unit */ "m");
+ unit = /* time unit */ "m";
if (((GNUNET_YES == do_round) && (dval > 5 * 60)) || (0 == (dval %
60)))
{
dval = dval / 60;
- unit = _ (/* time unit */ "h");
+ unit = /* time unit */ "h";
if (((GNUNET_YES == do_round) && (dval > 5 * 24)) ||
(0 == (dval % 24)))
{
dval = dval / 24;
if (1 == dval)
- unit = _ (/* time unit */ "day");
+ unit = /* time unit */ "day";
else
- unit = _ (/* time unit */ "days");
+ unit = /* time unit */ "days";
}
}
}
}
}
- GNUNET_snprintf (buf, sizeof(buf), "%llu %s", dval, unit);
+ GNUNET_snprintf (buf, sizeof(buf), "%llu %s",
+ (unsigned long long) dval, unit);
return buf;
}
@@ -761,7 +762,7 @@ GNUNET_STRINGS_absolute_time_to_string (struct
GNUNET_TIME_Absolute t)
struct tm *tp;
if (t.abs_value_us == GNUNET_TIME_UNIT_FOREVER_ABS.abs_value_us)
- return _ ("end of time");
+ return "end of time";
tt = t.abs_value_us / 1000LL / 1000LL;
tp = localtime (&tt);
/* This is hacky, but i don't know a way to detect libc character encoding.
diff --git a/src/zonemaster/Makefile.am b/src/zonemaster/Makefile.am
index 3d248efd8..f2d569c75 100644
--- a/src/zonemaster/Makefile.am
+++ b/src/zonemaster/Makefile.am
@@ -24,6 +24,7 @@ gnunet_service_zonemaster_SOURCES = \
gnunet_service_zonemaster_LDADD = \
$(top_builddir)/src/dht/libgnunetdht.la \
$(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \
+ $(top_builddir)/src/identity/libgnunetidentity.la \
$(top_builddir)/src/statistics/libgnunetstatistics.la \
$(top_builddir)/src/util/libgnunetutil.la \
$(top_builddir)/src/namestore/libgnunetnamestore.la \
@@ -32,10 +33,10 @@ gnunet_service_zonemaster_LDADD = \
gnunet_service_zonemaster_monitor_SOURCES = \
gnunet-service-zonemaster-monitor.c
-
gnunet_service_zonemaster_monitor_LDADD = \
$(top_builddir)/src/dht/libgnunetdht.la \
$(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \
+ $(top_builddir)/src/identity/libgnunetidentity.la \
$(top_builddir)/src/statistics/libgnunetstatistics.la \
$(top_builddir)/src/util/libgnunetutil.la \
$(top_builddir)/src/namestore/libgnunetnamestore.la \
diff --git a/src/zonemaster/gnunet-service-zonemaster-monitor.c
b/src/zonemaster/gnunet-service-zonemaster-monitor.c
index 4a368048e..c6dd2b6ca 100644
--- a/src/zonemaster/gnunet-service-zonemaster-monitor.c
+++ b/src/zonemaster/gnunet-service-zonemaster-monitor.c
@@ -240,7 +240,7 @@ convert_records_for_export (const struct
GNUNET_GNSRECORD_Data *rd,
* @return DHT PUT handle, NULL on error
*/
static struct GNUNET_DHT_PutHandle *
-perform_dht_put (const struct GNUNET_CRYPTO_EcdsaPrivateKey *key,
+perform_dht_put (const struct GNUNET_IDENTITY_PrivateKey *key,
const char *label,
const struct GNUNET_GNSRECORD_Data *rd_public,
unsigned int rd_public_count,
@@ -271,9 +271,7 @@ perform_dht_put (const struct GNUNET_CRYPTO_EcdsaPrivateKey
*key,
GNUNET_break (0);
return NULL; /* whoops */
}
- block_size = ntohl (block->purpose.size)
- + sizeof(struct GNUNET_CRYPTO_EcdsaSignature)
- + sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey);
+ block_size = GNUNET_GNSRECORD_block_get_size (block);
GNUNET_GNSRECORD_query_from_private_key (key,
label,
&query);
@@ -314,7 +312,7 @@ perform_dht_put (const struct GNUNET_CRYPTO_EcdsaPrivateKey
*key,
*/
static void
handle_monitor_event (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
+ const struct GNUNET_IDENTITY_PrivateKey *zone,
const char *label,
unsigned int rd_count,
const struct GNUNET_GNSRECORD_Data *rd)
diff --git a/src/zonemaster/gnunet-service-zonemaster.c
b/src/zonemaster/gnunet-service-zonemaster.c
index c5aab8d92..11fa9921d 100644
--- a/src/zonemaster/gnunet-service-zonemaster.c
+++ b/src/zonemaster/gnunet-service-zonemaster.c
@@ -579,7 +579,7 @@ convert_records_for_export (const struct
GNUNET_GNSRECORD_Data *rd,
* @return DHT PUT handle, NULL on error
*/
static struct GNUNET_DHT_PutHandle *
-perform_dht_put (const struct GNUNET_CRYPTO_EcdsaPrivateKey *key,
+perform_dht_put (const struct GNUNET_IDENTITY_PrivateKey *key,
const char *label,
const struct GNUNET_GNSRECORD_Data *rd_public,
unsigned int rd_public_count,
@@ -610,9 +610,7 @@ perform_dht_put (const struct GNUNET_CRYPTO_EcdsaPrivateKey
*key,
GNUNET_break (0);
return NULL; /* whoops */
}
- block_size = ntohl (block->purpose.size)
- + sizeof(struct GNUNET_CRYPTO_EcdsaSignature)
- + sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey);
+ block_size = GNUNET_GNSRECORD_block_get_size (block);
GNUNET_GNSRECORD_query_from_private_key (key,
label,
&query);
@@ -725,7 +723,7 @@ zone_iteration_finished (void *cls)
*/
static void
put_gns_record (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *key,
+ const struct GNUNET_IDENTITY_PrivateKey *key,
const char *label,
unsigned int rd_count,
const struct GNUNET_GNSRECORD_Data *rd)
--
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.