gnunet

Main GNUnet Logic
Log | Files | Refs | Submodules | README | LICENSE

commit 3611a5295f95fad5d9e1fdb3866e7db9ecf8f47e
parent cc90f1df695ccee3d35fe00fa179a856e4128009
Author: xrs <xrs@mail36.net>
Date:   Tue,  2 Jan 2018 17:12:39 +0100

Merge branch 'master' of ssh://gnunet.org/gnunet

Diffstat:
MMakefile.am | 3++-
AREADME.1st | 245+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mconfigure.ac | 6++----
Mcontrib/packages/guix/gnunet-doc.scm | 2+-
Mcontrib/packages/guix/gnunet.scm | 2+-
Mcontrib/packages/guix/guix-env.scm | 2+-
Mdoc/Makefile.am | 4+---
Adoc/documentation/.gitignore | 2++
Mdoc/documentation/Makefile.am | 55++++++++++++++++++++++++++++---------------------------
Mdoc/documentation/chapters/contributing.texi | 14+-------------
Mdoc/documentation/chapters/developer.texi | 2+-
Mdoc/documentation/chapters/philosophy.texi | 128+++++++++++++++++++++++++++++++++++++++++--------------------------------------
Mdoc/documentation/gnunet.texi | 23+++++++++++++----------
Mpo/POTFILES.in | 1-
Mpo/de.po | 910++++++++++++++++++++++++++++++++++++++++++-------------------------------------
Mpo/es.po | 910++++++++++++++++++++++++++++++++++++++++++-------------------------------------
Mpo/fr.po | 885++++++++++++++++++++++++++++++++++++++++++-------------------------------------
Mpo/sv.po | 915++++++++++++++++++++++++++++++++++++++++++-------------------------------------
Mpo/vi.po | 919++++++++++++++++++++++++++++++++++++++++++-------------------------------------
Mpo/zh_CN.po | 908++++++++++++++++++++++++++++++++++++++++++-------------------------------------
Msrc/Makefile.am | 1-
Msrc/auction/Makefile.am | 5+++++
Msrc/cadet/cadet_api.c | 7+++++++
Msrc/cadet/cadet_test_lib.c | 1+
Msrc/cadet/gnunet-service-cadet_core.c | 9++++++++-
Msrc/cadet/gnunet-service-cadet_paths.c | 155++++++++++++++++++++++++++++++-------------------------------------------------
Msrc/cadet/gnunet-service-cadet_peer.c | 2+-
Msrc/cadet/gnunet-service-cadet_tunnels.c | 4+++-
Msrc/cadet/test_cadet.c | 117+++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------------
Msrc/conversation/gnunet-helper-audio-playback-gst.c | 5+++++
Msrc/conversation/gnunet-helper-audio-playback.c | 5+++++
Msrc/conversation/gnunet_gst.c | 5+++++
Msrc/conversation/microphone.c | 4+++-
Msrc/core/gnunet-service-core.c | 3+++
Msrc/core/gnunet-service-core_kx.c | 5++++-
Msrc/core/gnunet-service-core_sessions.c | 19++++---------------
Msrc/dht/Makefile.am | 1+
Msrc/dht/gnunet-service-dht.c | 1-
Msrc/fs/fs_dirmetascan.c | 3+++
Msrc/fs/test_fs_download_persistence.c | 1-
Msrc/fs/test_fs_publish_persistence.c | 1-
Msrc/identity-provider/Makefile.am | 5++++-
Msrc/include/Makefile.am | 7+++++++
Msrc/include/gnunet_common.h | 15++++++++++++---
Msrc/include/gnunet_mst_lib.h | 4+++-
Msrc/include/gnunet_network_lib.h | 6+++---
Msrc/include/gnunet_protocols.h | 30+++++++++++++++++++-----------
Msrc/include/gnunet_rest_lib.h | 2+-
Msrc/include/gnunet_scheduler_lib.h | 44++++++++++++++++++++++++++------------------
Msrc/include/gnunet_service_lib.h | 7++++++-
Msrc/jsonapi/Makefile.am | 2+-
Msrc/multicast/Makefile.am | 2+-
Msrc/multicast/gnunet-service-multicast.c | 248++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------------
Msrc/multicast/multicast_api.c | 51++++++++++++++++++++++++---------------------------
Msrc/multicast/test_multicast_multipeer.c | 312++++++++++++++++++++++++++++++++++++++++---------------------------------------
Msrc/psyc/gnunet-service-psyc.c | 131++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------------
Msrc/psyc/psyc_api.c | 103++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------------
Msrc/psyc/test_psyc.c | 28+++++++++++++++++++++-------
Msrc/psyc/test_psyc.conf | 54++++++++++--------------------------------------------
Msrc/psycstore/psycstore_api.c | 10+++++-----
Msrc/rest/Makefile.am | 2++
Msrc/rps/.gitignore | 4++--
Msrc/rps/Makefile.am | 9---------
Msrc/rps/gnunet-service-rps.c | 1778+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
Dsrc/rps/gnunet-service-rps_peers.c | 1698-------------------------------------------------------------------------------
Dsrc/rps/gnunet-service-rps_peers.h | 437-------------------------------------------------------------------------------
Msrc/rps/rps.h | 96+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/rps/test_rps.c | 58+++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
Dsrc/rps/test_service_rps_peers.c | 137-------------------------------------------------------------------------------
Msrc/set/Makefile.am | 2+-
Msrc/set/gnunet-service-set_union.c | 4++--
Msrc/social/gnunet-service-social.c | 774++++++++++++++++++++++++++++++++++++++++++-------------------------------------
Msrc/social/gnunet-social.c | 26+++++++++++++-------------
Msrc/social/social_api.c | 292++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------------
Msrc/social/test_social.c | 268++++++++++++++++++++++++++++++++++++++++++++++---------------------------------
Msrc/social/test_social.conf | 19+++++++++++++++++++
Msrc/statistics/gnunet-service-statistics.c | 4+++-
Msrc/testbed/Makefile.am | 2+-
Msrc/testbed/gnunet-helper-testbed.c | 7++++---
Msrc/transport/Makefile.am | 9++++++---
Msrc/transport/gnunet-helper-transport-wlan-dummy.c | 6++++++
Msrc/transport/plugin_transport_http_server.c | 2+-
Msrc/util/client.c | 41+++++++++++++++++++++++++++++++++++------
Msrc/util/mq.c | 22++++++++++++++++++++++
Msrc/util/mst.c | 27++++++++++++++++++++++-----
Msrc/util/network.c | 6+++---
Msrc/util/program.c | 12+++++++++++-
Msrc/util/scheduler.c | 1557++++++++++++++++++++++++++++++++++++++++++++++---------------------------------
Msrc/util/service.c | 31++++++++++++++++++++++++++++++-
Msrc/util/time.c | 2+-
Msrc/vpn/gnunet-service-vpn.c | 3+++
91 files changed, 7806 insertions(+), 6880 deletions(-)

diff --git a/Makefile.am b/Makefile.am @@ -15,7 +15,8 @@ EXTRA_DIST = \ ABOUT-NLS \ config.rpath \ install-sh \ - acinclude.m4 + acinclude.m4 \ + README.1st gnunetincludedir = $(includedir)/gnunet gnunetinclude_HEADERS = gnunet_config.h diff --git a/README.1st b/README.1st @@ -0,0 +1,245 @@ +The following is a list of issues with GNUnet 0.11.0 that will need to +be addressed before we might consider GNUnet usable. Please keep this +list in mind when trying out GNUnet 0.11.0! Help would of course be +welcome, an estimate of how much work is needed and the main impact +are given with each item. + + +ats: +* We currently select one transport per peer, but we should allow the +use of multiple channels concurrently (i.e. UDP + TCP at the same +time). Neither ATS nor transport support this today, and this requires +a major change in the ATS plugins and the ATS API and the overall +ATS/transport logic. [6-12 PM, robustness, performance] + +* The current proportional ATS heuristic does not devalue increasing +the number of connections once we have reached saturation point, +possibly resulting in an excessive number of connections. +[1-3 PM, performance] + +* The mlp/ril ATS heuristics are highly unstable and keep crashing or +worse, and have horrific code quality. [3-12 PM, stability, +performance] + + +transport: [12-48 PM overall] +* We should move plugins into separate processes to break an overly +complicated subsystem into more manageable bits. [maintainability] + +* Transport plugins are currently expected to be bi-directional; the +API should be changed to make them uni-directional, so we could have +say UDP for sending but receive via say SMTP, simply because NAT +punching and other transports (especially SAT) simply are not +bi-directional. Fragmentation and ACKs should then not be done in UDP +plugin but at transport level. This should result in significantly: +- better NAT traversal +- faster transports (especially with the multi-transport of ATS) +- simplified transport plugins +[stability, robustness, performance] + +* Transport currently does not encrypt. This has the disadvantage that +TCP/UDP traffic is easily identified as "GNUnet"-traffic. It would be +better to_also use a simple cipher (ECDHE+AEAD) in a plugin-specific +way (i.e. HTTPS is fine already) to minimize information leakage, even +if for efficiency that cipher is is not replay-protected at this level +(and leave true replay-protected OTR to CORE). [privacy, censorship-resistance] + +* transport's 'manipulation' functions should be moved into +a plugin-proxy, simplifying the code. This may have +modest implications for testbed due to the API change. +[maintainability, security] + +* testcases are plenty but insufficiently systematic, the changes +described above should also enable us to create more systematic tests. +[maintainability, correctness] + + +hello: +* The current code may leak LAN IPs (in particular IPv6 with +MAC) globally. We have started to put in some privisions to tag +addresses as loopback/LAN/WAN, but need to systemtically ensure +that addresses are only propagated in a useful scope and avoid +leaking "sensitive" address data globally. +[3-6 PM, privacy] + + +core: +* core needs to be able to communicate to other peers whether this +peer is high-bandwidth or on battery and thus either great for +relaying or really bad for relaying. Higher-level subsystems +could then bias their peer selection to more capable peers -- +this is key for going on battery-operated systems. +[1-3 PM, performance] + +* we currently use timestamps (based on roughly-synchronized clocks), +challenge-response AND sequence numbers to protect against +replay-protection. This is overkill, and the use of timestamps +causes issues on OpenWRT where RTCs are often unavailable. We +might want to increase the nonce for challenges and get rid of +the roughly-synchronized clocks assumption, at least for CORE +(we can't avoid it for NSE). [1-3 PM, usability] + +* once transport encrypts (ECDH+AES), we should simplify CORE level +encryption to use ECDH+Twofish(+SHA512) instead of the current +ECDH+AES+Twofish double-encryption. + +* Mobile peers currently allow adversaries to track their users as the +peer's identity does not change with locations. We need a mechanism to +notify a mobile peer about a location change and then systematically +change the public key we use depending on our location. [6-12 PM, +privacy] + + +cadet: +* needs more systematic testing, ideally with a mock up of DHT +and core. [6-12 PM, correctness] + +* flow and congestion control implementation remains incomplete; +should borrow more from net2o [3-6 PM, performance] + +* Various optimizations, such as key material pre-computation +and avoiding unnecessary DHT queries should be implemented. +[3-9 PM, performance] + +* Once transport/core use AES/Twofish for encryption, we should +switch CADET to use KECCAK-AEAD. + +* Generally needs more benchmarking to identify performance +bottlenecks tune accordingly. [3-12 PM, performance] + + +nat: +* many known NAT traversal methods are not yet supported +[6-12 PM, connectivity, usability] + + +dv: +* dv is still not working, but currently based on SET and we +should simplify the design to not use SET. [3-6 PM, connectivity, +correctness] + + +util: +* Event loop instantiations for various event loops (like glib, +libev, libevent, etc.) should be created (and tested). This +will applications to be built with GNUnet using those various +styles of event loop handling. General support for abstracting +the event loop is new in 0.11.0, we just need to make broader use +of it. [1-3 PM, performance, usability] + +* gnunet-service-resolver should use asynchronous DNS queries if +available. This will ensure that name resolution is not super-slow +when GNUnet makes various parallel DNS queries (rare, but DNS +queries can happen to resolve peer IP addresses for visualization). +[1 PM, performance, usability] + + +dht: +* various minor tweaks should be explored, but first we need to +define and find a good benchmark to see where our performance +bottlenecks really are today; datacache (IO subsystem) might +be one of them. Here, picking appropriate transaction scopes +and isolation levels should be an easy way to boost performance, +but we also need more benchmarking logic. [3-12 PM, performance] + + +set: +* Current implementation is not yet Byzantine fault-tolerant +against stuffing attack. [1-3 PM, fault-tolerance] + + +topology: +* quite a few different functions are squished together in one +subsystem here, will require some changes to address changes +to transport and hello discussed above [1-3 PM, correctness] + +* there are more robust known ways for maintaining a random mesh, we +might want to explore using those [3-6 PM, robustness] + + +fs: +* The service should be split into two, one for user-specific and one +for system-specific components [3-6 PM, security, usability] + +* Currently, data and files are stored in a disassociated way, +resulting in search results that then fail to download; need OR/RPS +(see below) before we can think about fixing this properly. [6-18 PM, +usability] + +* datastore (IO subsystem) is bad at keeping the database within the + quota set by the user. [1-3 PM, correctness] + + +conversation: +* dropping 'silence' on large-buffers during replay should be +used to avoid accumulating latency (standard VoIP technique, +crucial to get it to work for real calls) [1-3 PM, usability] + +* needs ring tones [1 PM, usability] + + +gns: +* should support hijacking arbitrary gtlds [1 PM, usability] + +* should import ".fr" ccTLD and ensure implementation performs [3-6 PM] + + +multicast: +* implementation currently trivial and under-tested + +* still uses old NTR-style API, needs to transition to MQ API + + +psyc: +* implementation under-tested, database performance likely in +need for optimization [3-12 PM] + + +social: +* code in need for clean up and more systematic testing [6-12 PM] + + +rps: +* Open research, still experimental. [3-24 PM] + + +xolotl/lake/or: +* Open research, still non-existent. Symmetric cipher should +be CHACHA. [48-120 PM] + + +No serious problems are known in: +* statistics +* nse +* curl +* revocation +* scalarproduct +* tun +* testbed +* block +* fragmentation +* consensus +* secretsharing +* pt +* vpn +* gns +* gnsrecord +* arm +* dns +* exit +* identity +* json +* sq +* my +* namecache +* namestore +* testing +* hostlist +* zonemaster + + +We reserve judgement (due to lack of data) on: +* identity-provider +* rest + + diff --git a/configure.ac b/configure.ac @@ -1,5 +1,5 @@ # This file is part of GNUnet. -# (C) 2001--2017 GNUnet e.V. +# (C) 2001--2018 GNUnet e.V. # # GNUnet is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published @@ -22,7 +22,7 @@ # AC_PREREQ(2.61) # Checks for programs. -AC_INIT([gnunet], [0.10.1], [bug-gnunet@gnu.org]) +AC_INIT([gnunet], [0.11.0], [bug-gnunet@gnu.org]) AC_CANONICAL_TARGET AC_CANONICAL_HOST @@ -1559,8 +1559,6 @@ src/dht/Makefile src/dht/dht.conf src/dns/Makefile src/dns/dns.conf -src/dv/Makefile -src/dv/dv.conf src/exit/Makefile src/fragmentation/Makefile src/fs/Makefile diff --git a/contrib/packages/guix/gnunet-doc.scm b/contrib/packages/guix/gnunet-doc.scm @@ -141,7 +141,7 @@ (for-each (lambda (f) (chmod f #o755)) (find-files "po" "")) (zero? (system* "sh" "bootstrap")))) - (replace 'build + (add-after 'build 'run-gendocs (lambda _ (chdir "doc/documentation") ;;(zero? (system* "make" "dev-build")))) diff --git a/contrib/packages/guix/gnunet.scm b/contrib/packages/guix/gnunet.scm @@ -107,7 +107,7 @@ ("mysql" ,mysql) ("zlib" ,zlib) ("perl" ,perl) - ("python" ,python) ; tests and gnunet-qr + ("python-2" ,python-2) ; tests and gnunet-qr ("jansson" ,jansson) ("nss" ,nss) ("glib" ,glib "bin") diff --git a/contrib/packages/guix/guix-env.scm b/contrib/packages/guix/guix-env.scm @@ -129,7 +129,7 @@ ("mysql" ,mysql) ("zlib" ,zlib) ("perl" ,perl) - ("python" ,python) ; tests and gnunet-qr + ("python-2" ,python-2) ; tests and gnunet-qr ("jansson" ,jansson) ("nss" ,nss) ("glib" ,glib "bin") diff --git a/doc/Makefile.am b/doc/Makefile.am @@ -2,6 +2,4 @@ SUBDIRS = man doxygen documentation EXTRA_DIST = \ - outdated-and-old-installation-instructions.txt \ - gnunet-c-tutorial-v1.pdf \ - README.txt + outdated-and-old-installation-instructions.txt diff --git a/doc/documentation/.gitignore b/doc/documentation/.gitignore @@ -0,0 +1,2 @@ +stamp-1 +version2.texi diff --git a/doc/documentation/Makefile.am b/doc/documentation/Makefile.am @@ -76,34 +76,35 @@ dist_infoimage_DATA = \ # $(top_srcdir)/%D%/images/coreutils-size-map.eps # dvi-local: ps-local + gnunet_tutorial_examples = \ - 001.c \ - 002.c \ - 003.c \ - 004.c \ - 005.c \ - 006.c \ - 007.c \ - 008.c \ - 009.c \ - 010.c \ - 011.c \ - 012.c \ - 013.c \ - 013.1.c \ - 014.c \ - 015.c \ - 016.c \ - 017.c \ - 018.c \ - 019.c \ - 020.c \ - 021.c \ - 022.c \ - 023.c \ - 024.c \ - 025.c \ - 026.c + tutorial-examples/001.c \ + tutorial-examples/002.c \ + tutorial-examples/003.c \ + tutorial-examples/004.c \ + tutorial-examples/005.c \ + tutorial-examples/006.c \ + tutorial-examples/007.c \ + tutorial-examples/008.c \ + tutorial-examples/009.c \ + tutorial-examples/010.c \ + tutorial-examples/011.c \ + tutorial-examples/012.c \ + tutorial-examples/013.c \ + tutorial-examples/013.1.c \ + tutorial-examples/014.c \ + tutorial-examples/015.c \ + tutorial-examples/016.c \ + tutorial-examples/017.c \ + tutorial-examples/018.c \ + tutorial-examples/019.c \ + tutorial-examples/020.c \ + tutorial-examples/021.c \ + tutorial-examples/022.c \ + tutorial-examples/023.c \ + tutorial-examples/024.c \ + tutorial-examples/025.c \ + tutorial-examples/026.c info_TEXINFOS = \ gnunet.texi \ diff --git a/doc/documentation/chapters/contributing.texi b/doc/documentation/chapters/contributing.texi @@ -65,16 +65,7 @@ URLs break in the PDF output when they contain linebreaks. @item Do not use tab characters (see chapter 2.1 texinfo manual) -@item Use neutral language and third person perspective in the text - -@item So, when you refer to a user in general or addressing the user, -refer to (1). -@itemize @bullet -@item Unsolved exceptions for canonical reasons: When refering to Alice, -use "she". When refering to Bob, use "he". These are long established -examples and they should either be replaced (avoid Alice and Bob -examples when you can) or followed. -@end itemize +@item Write texts in the third person perspective. @c FIXME: This is questionable, it feels like bike shed painging to do @c this for several k lines. It only helps to jump between sentences in @@ -96,7 +87,4 @@ footnote on a collected footnote-page. In a 200+ pages handbook it's better to have footnotes accessible without having to skip over to the end. -@item Avoid unnecessary footnotes, keep the text self-explanatory and -in a simple language where possible/necessary. - @end itemize diff --git a/doc/documentation/chapters/developer.texi b/doc/documentation/chapters/developer.texi @@ -460,7 +460,7 @@ stacked together to construct complex buildings and it is generally easy to swap one block for a different one that has the same shape. GNUnet's architecture is based on LEGOs: -@c images here +@c @image{images/service_lego_block,5in,,picture of a LEGO block stack - 3 APIs as connectors upon Network Protocol on top of a Service} This chapter documents the GNUnet LEGO system, also known as GNUnet's system architecture. diff --git a/doc/documentation/chapters/philosophy.texi b/doc/documentation/chapters/philosophy.texi @@ -6,18 +6,20 @@ @c for secushare, showing some of the relations and functionalities @c of GNUnet. The foremost goal of the GNUnet project is to become a widely used, -reliable, open, non-discriminating, egalitarian, unfettered and +reliable, open, non-discriminating, egalitarian, unconstrained and censorship-resistant system of free information exchange. We value free speech above state secrets, law-enforcement or intellectual property. GNUnet is supposed to be an anarchistic network, where the only -limitation for peers is that they must contribute enough back to -the network such that their resource consumption does not have -a significant impact on other users. +limitation for participants (devices or people making use of the +network, in the following sometimes called peers) is +that they must contribute enough back to the network such that +their resource consumption does not have a significant impact +on other users. GNUnet should be more than just another file-sharing network. The plan is to offer many other services and in particular to serve as a development platform for the next generation of -decentralized Internet protocols. +Internet Protocols. @menu * Design Goals:: @@ -40,13 +42,15 @@ These are the core GNUnet design goals, in order of relative importance: @c To footnote or not to footnote, that's the question. @footnote{This means that you you have the four essential freedoms: to run the program, to study and change the program in source code form, -to redistribute exact copies, and to distribute modified versions.} +to redistribute exact copies, and to distribute modified versions. +Refer to @uref{https://www.gnu.org/philosophy/free-sw.html, https://www.gnu.org/philosophy/free-sw.html}} @item GNUnet must only disclose the minimal amount of information necessary. -@item GNUnet must be decentralised and survive Byzantine failures in any -position in the network. -@item GNUnet must make it explicit to the user which entities must be -trustworthy when establishing secured communications. +@c TODO: Explain 'fully' in the terminology section. +@item GNUnet must be fully distributed and survive Byzantine failures +at any position in the network. +@item GNUnet must make it explicit to the user which entities are +considered to be trustworthy when establishing secured communications. @item GNUnet must use compartmentalization to protect sensitive information. @item GNUnet must be open and permit new peers to join. @@ -73,17 +77,17 @@ find out what is happening on the network or to disrupt operations. @section Versatility We call GNUnet a peer-to-peer framework because we want to support many -different forms of peer-to-peer applications. GNUnet uses a plugin +different forms of peer-to-peer applications. GNUnet uses a plugin architecture to make the system extensible and to encourage code reuse. While the first versions of the system only supported anonymous file-sharing, other applications are being worked on and more will hopefully follow in the future. A powerful synergy regarding anonymity services is created by a large community utilizing many diverse applications over the same software -infrastructure. The reason is that link encryption hides the specifics -of the traffic for non-participating observers. This way, anonymity can +infrastructure. The reason is that link encryption hides the specifics +of the traffic for non-participating observers. This way, anonymity can get stronger with additional (GNUnet) traffic, even if the additional -traffic is not related to anonymous communication. Increasing anonymity +traffic is not related to anonymous communication. Increasing anonymity is the primary reason why GNUnet is developed to become a peer-to-peer framework where many applications share the lower layers of an increasingly complex protocol stack. @@ -96,22 +100,22 @@ and a few shared libraries. @section Practicality GNUnet allows participants to trade various amounts of security in -exchange for increased efficiency. However, it is not possible for any +exchange for increased efficiency. However, it is not possible for any user's security and efficiency requirements to compromise the security and efficiency of any other user. -For GNUnet, efficiency is not paramount. If there is a more secure and +For GNUnet, efficiency is not paramount. If there were a more secure and still practical approach, we would choose to take the more secure alternative. @command{telnet} is more efficient than @command{ssh}, yet it is obsolete. -Hardware gets faster, and code can be optimized. Fixing security issues +Hardware gets faster, and code can be optimized. Fixing security issues as an afterthought is much harder. While security is paramount, practicability is still a requirement. The most secure system is always the one that nobody can use. Similarly, any anonymous system that is extremely inefficient will only find few users. -However, good anonymity requires a large and diverse user base. Since +However, good anonymity requires a large and diverse user base. Since individual security requirements may vary, the only good solution here is to allow individuals to trade-off security and efficiency. The primary challenge in allowing this is to ensure that the economic @@ -154,9 +158,9 @@ The second part describes concepts specific to anonymous file-sharing. @subsection Authentication Almost all peer-to-peer communications in GNUnet are between mutually -authenticated peers. The authentication works by using ECDHE, that is a +authenticated peers. The authentication works by using ECDHE, that is a DH (Diffie---Hellman) key exchange using ephemeral eliptic curve -cryptography. The ephemeral ECC (Eliptic Curve Cryptography) keys are +cryptography. The ephemeral ECC (Eliptic Curve Cryptography) keys are signed using ECDSA (@uref{http://en.wikipedia.org/wiki/ECDSA, ECDSA}). The shared secret from ECDHE is used to create a pair of session keys @c FIXME: LOng word for HKDF @@ -165,23 +169,23 @@ two peers using both 256-bit AES (Advanced Encryption Standard) and 256-bit Twofish (with independently derived secret keys). As only the two participating hosts know the shared secret, this authenticates each packet -without requiring signatures each time. GNUnet uses SHA-512 +without requiring signatures each time. GNUnet uses SHA-512 (Secure Hash Algorithm) hash codes to verify the integrity of messages. -In GNUnet, the identity of a host is its public key. For that reason, +In GNUnet, the identity of a host is its public key. For that reason, @c FIXME: is it clear to the average reader what a man-in-the-middle @c attack is? man-in-the-middle attacks will not break the authentication or accounting -goals. Essentially, for GNUnet, the IP of the host has nothing to do with -the identity of the host. As the public key is the only thing that truly +goals. Essentially, for GNUnet, the IP of the host has nothing to do with +the identity of the host. As the public key is the only thing that truly matters, faking an IP, a port or any other property of the underlying -transport protocol is irrelevant. In fact, GNUnet peers can use +transport protocol is irrelevant. In fact, GNUnet peers can use multiple IPs (IPv4 and IPv6) on multiple ports --- or even not use the IP protocol at all (by running directly on layer 2). @c NOTE: For consistency we will use @code{HELLO}s throughout this Manual. GNUnet uses a special type of message to communicate a binding between -public (ECC) keys to their current network address. These messages are +public (ECC) keys to their current network address. These messages are commonly called @code{HELLO}s or peer advertisements. They contain the public key of the peer and its current network addresses for various transport services. @@ -191,7 +195,7 @@ peers. For the UDP and TCP transport services, a network address is an IP and a port. GNUnet can also use other transports (HTTP, HTTPS, WLAN, etc.) which use -various other forms of addresses. Note that any node can have many +various other forms of addresses. Note that any node can have many different active transport services at the same time, and each of these can have a different addresses. Binding messages expire after at most a week (the timeout can be @@ -202,7 +206,7 @@ outdated advertisements. A Transport Layer Abstraction for Peer-to-Peer Networks Proceedings of the 3rd International Symposium on Cluster Computing and the Grid (GRID 2003), 2003. -(@uref{https://gnunet.org/git/bibliography.git/plain/docs/transport.pdf, pdf})} +(@uref{https://gnunet.org/git/bibliography.git/plain/docs/transport.pdf, https://gnunet.org/git/bibliography.git/plain/docs/transport.pdf})} @cindex Accounting to Encourage Resource Sharing @node Accounting to Encourage Resource Sharing @@ -218,27 +222,26 @@ with queries that are, in the worst case, multiplied by the network. In order to ensure that freeloaders or attackers have a minimal impact on the network, GNUnet's file-sharing implementation tries to distinguish -good (contributing) nodes from malicious (freeloading) nodes. In GNUnet, +good (contributing) nodes from malicious (freeloading) nodes. In GNUnet, every file-sharing node keeps track of the behavior of every other node it -has been in contact with. Many requests (depending on the application) +has been in contact with. Many requests (depending on the application) are transmitted with a priority (or importance) level. That priority is used to establish how important the sender believes -this request is. If a peer responds to an important request, the +this request is. If a peer responds to an important request, the recipient will increase its trust in the responder: the responder contributed resources. If a peer is too busy to answer all requests, it needs to prioritize. -@c FIXME: 'peers to not take' -> 'peers do not take' would make more sense -For that, peers to not take the priorities of the requests received at +For that, peers do not take the priorities of the requests received at face value. First, they check how much they trust the sender, and depending on that amount of trust they assign the request a (possibly lower) effective -priority. Then, they drop the requests with the lowest effective priority -to satisfy their resource constraints. This way, GNUnet's economic model +priority. Then, they drop the requests with the lowest effective priority +to satisfy their resource constraints. This way, GNUnet's economic model ensures that nodes that are not currently considered to have a surplus in contributions will not be served if the network load is high. @footnote{Christian Grothoff. An Excess-Based Economic Model for Resource Allocation in Peer-to-Peer Networks. Wirtschaftsinformatik, June 2003. -(@uref{https://gnunet.org/git/bibliography.git/plain/docs/ebe.pdf, pdf})} +(@uref{https://gnunet.org/git/bibliography.git/plain/docs/ebe.pdf, https://gnunet.org/git/bibliography.git/plain/docs/ebe.pdf})} @c 2009? @cindex Confidentiality @@ -246,7 +249,7 @@ Allocation in Peer-to-Peer Networks. Wirtschaftsinformatik, June 2003. @subsection Confidentiality Adversaries outside of GNUnet are not supposed to know what kind of -actions a peer is involved in. Only the specific neighbor of a peer that +actions a peer is involved in. Only the specific neighbor of a peer that is the corresponding sender or recipient of a message may know its contents, and even then application protocols may place further restrictions on that knowledge. @@ -254,7 +257,7 @@ In order to ensure confidentiality, GNUnet uses link encryption, that is each message exchanged between two peers is encrypted using a pair of keys only known to these two peers. Encrypting traffic like this makes any kind of traffic analysis much -harder. Naturally, for some applications, it may still be desirable if +harder. Naturally, for some applications, it may still be desirable if even neighbors cannot determine the concrete contents of a message. In GNUnet, this problem is addressed by the specific application-level protocols (see for example, deniability and anonymity in anonymous file @@ -269,13 +272,13 @@ sharing). @end menu Providing anonymity for users is the central goal for the anonymous -file-sharing application. Many other design decisions follow in the +file-sharing application. Many other design decisions follow in the footsteps of this requirement. -Anonymity is never absolute. While there are various +Anonymity is never absolute. While there are various scientific metrics@footnote{Claudia Díaz, Stefaan Seys, Joris Claessens, and Bart Preneel. Towards measuring anonymity. 2002. -(@uref{https://gnunet.org/git/bibliography.git/plain/docs/article-89.pdf, pdf})} +(@uref{https://gnunet.org/git/bibliography.git/plain/docs/article-89.pdf, https://gnunet.org/git/bibliography.git/plain/docs/article-89.pdf})} that can help quantify the level of anonymity that a given mechanism provides, there is no such thing as complete anonymity. GNUnet's file-sharing implementation allows users to select for each @@ -287,7 +290,7 @@ given in scientific metrics@footnote{likewise}, it is probably the best metric available to a peer with a purely local view of the world that does not rely on unreliable external information. The default anonymity level is 1, which uses anonymous routing but -imposes no minimal requirements on cover traffic. It is possible +imposes no minimal requirements on cover traffic. It is possible to forego anonymity when this is not required. The anonymity level of 0 allows GNUnet to use more efficient, non-anonymous routing. @@ -297,12 +300,12 @@ allows GNUnet to use more efficient, non-anonymous routing. Contrary to other designs, we do not believe that users achieve strong anonymity just because their requests are obfuscated by a couple of -indirections. This is not sufficient if the adversary uses traffic +indirections. This is not sufficient if the adversary uses traffic analysis. The threat model used for anonymous file sharing in GNUnet assumes that the adversary is quite powerful. In particular, we assume that the adversary can see all the traffic on -the Internet. And while we assume that the adversary +the Internet. And while we assume that the adversary can not break our encryption, we assume that the adversary has many participating nodes in the network and that it can thus see many of the node-to-node interactions since it controls some of the nodes. @@ -312,10 +315,10 @@ anonymous if they can hide their actions in the traffic created by other users. Hiding actions in the traffic of other users requires participating in the traffic, bringing back the traditional technique of using indirection and -source rewriting. Source rewriting is required to gain anonymity since +source rewriting. Source rewriting is required to gain anonymity since otherwise an adversary could tell if a message originated from a host by -looking at the source address. If all packets look like they originate -from a node, the adversary can not tell which ones originate from that +looking at the source address. If all packets look like they originate +from one node, the adversary can not tell which ones originate from that node and which ones were routed. Note that in this mindset, any node can decide to break the source-rewriting paradigm without violating the protocol, as this @@ -336,14 +339,14 @@ This increases the efficiency of the network as we can indirect less under higher load.@footnote{Krista Bennett and Christian Grothoff. GAP --- practical anonymous networking. In Proceedings of Designing Privacy Enhancing Technologies, 2003. -(@uref{https://gnunet.org/git/bibliography.git/plain/docs/aff.pdf, pdf})} +(@uref{https://gnunet.org/git/bibliography.git/plain/docs/aff.pdf, https://gnunet.org/git/bibliography.git/plain/docs/aff.pdf})} @cindex Deniability @node Deniability @subsection Deniability Even if the user that downloads data and the server that provides data are -anonymous, the intermediaries may still be targets. In particular, if the +anonymous, the intermediaries may still be targets. In particular, if the intermediaries can find out which queries or which content they are processing, a strong adversary could try to force them to censor certain materials. @@ -362,14 +365,14 @@ by @command{gnunet-publish}, @command{gnunet-download}, and Jussi T. Lindgren. An Encoding for Censorship-Resistant Sharing. 2009. -(@uref{https://gnunet.org/git/bibliography.git/plain/docs/ecrs.pdf, pdf})} +(@uref{https://gnunet.org/git/bibliography.git/plain/docs/ecrs.pdf, https://gnunet.org/git/bibliography.git/plain/docs/ecrs.pdf})} @cindex Peer Identities @node Peer Identities @subsection Peer Identities Peer identities are used to identify peers in the network and are unique -for each peer. The identity for a peer is simply its public key, which is +for each peer. The identity for a peer is simply its public key, which is generated along with a private key the peer is started for the first time. While the identity is binary data, it is often expressed as ASCII string. For example, the following is a peer identity as you might see it in @@ -392,21 +395,22 @@ GNS@footnote{Matthias Wachs, Martin Schanzenbach, and Christian Grothoff. A Censorship-Resistant, Privacy-Enhancing and Fully Decentralized Name System. In proceedings of 13th International Conference on Cryptology and Network Security (CANS 2014). 2014. -@uref{https://gnunet.org/git/bibliography.git/plain/docs/gns2014wachs.pdf, pdf}} +@uref{https://gnunet.org/git/bibliography.git/plain/docs/gns2014wachs.pdf, https://gnunet.org/git/bibliography.git/plain/docs/gns2014wachs.pdf}} zones are similar to those of DNS zones, but instead of a hierarchy of authorities to governing their use, GNS zones are controlled by a private key. When you create a record in a DNS zone, that information stored in your -nameserver. Anyone trying to resolve your domain then gets pointed +nameserver. Anyone trying to resolve your domain then gets pointed (hopefully) by the centralised authority to your nameserver. -Whereas GNS, being decentralised by design, stores that information in -DHT. The validity of the records is assured cryptographically, by +Whereas GNS, being fully decentralized by design, stores that information +in DHT. The validity of the records is assured cryptographically, by signing them with the private key of the respective zone. -Anyone trying to resolve records in a zone your domain can then verify the -signature on the records they get from the DHT and be assured that they -are indeed from the respective zone. To make this work, there is a 1:1 -correspondence between zones and their public-private key pairs. +Anyone trying to resolve records in a zone of your domain can then verify +the signature of the records they get from the DHT and be assured that +they are indeed from the respective zone. +To make this work, there is a 1:1 correspondence between zones and +their public-private key pairs. So when we talk about the owner of a GNS zone, that's really the owner of the private key. And a user accessing a zone needs to somehow specify the corresponding @@ -416,8 +420,8 @@ public key first. @node Egos @subsection Egos -Egos are your "identities" in GNUnet. Any user can assume multiple -identities, for example to separate their activities online. Egos can -correspond to pseudonyms or real-world identities. Technically, an +Egos are your "identities" in GNUnet. Any user can assume multiple +identities, for example to separate their activities online. Egos can +correspond to pseudonyms or real-world identities. Technically, an ego is first of all a public-private key pair. diff --git a/doc/documentation/gnunet.texi b/doc/documentation/gnunet.texi @@ -71,10 +71,10 @@ This document is the Reference Manual for GNUnet version @value{VERSION}. @menu * Philosophy:: About GNUnet -* Vocabulary:: Vocabulary +@c * Vocabulary:: Vocabulary * GNUnet Installation Handbook:: How to install GNUnet * Using GNUnet:: Using GNUnet -* Configuration Handbook:: Configuring GNUnet +@c * Configuration Handbook:: Configuring GNUnet * GNUnet Contributors Handbook:: Contributing to GNUnet * GNUnet Developer Handbook:: Developing GNUnet * GNU Free Documentation License:: The license of this manual @@ -103,11 +103,11 @@ Philosophy * Backup of Identities and Egos:: * Revocation:: -Vocabulary - -* Definitions abbreviations and acronyms:: -* Words and characters:: -* Technical Assumptions:: +@c Vocabulary +@c +@c * Definitions abbreviations and acronyms:: +@c * Words and characters:: +@c * Technical Assumptions:: GNUnet Installation Handbook @@ -136,7 +136,7 @@ Using GNUnet * The GNU Name System:: * Using the Virtual Public Network:: -Configuration Handbook +@c Configuration Handbook GNUnet Contributors Handbook @@ -191,7 +191,8 @@ GNUnet Developer Handbook @include chapters/philosophy.texi @c ********************************************************************* -@include chapters/vocabulary.texi +@c WIP: +@c @include chapters/vocabulary.texi @c ********************************************************************* @include chapters/installation.texi @@ -201,12 +202,14 @@ GNUnet Developer Handbook @include chapters/user.texi @c ********************************************************************* -@include chapters/configuration.texi +@c WIP: +@c @include chapters/configuration.texi @include chapters/contributing.texi @c ********************************************************************* @include chapters/developer.texi +@c For now in its own Book: @c @include gnunet-c-tutorial.texi @c ********************************************************************* diff --git a/po/POTFILES.in b/po/POTFILES.in @@ -306,7 +306,6 @@ src/revocation/revocation_api.c src/rps/gnunet-rps.c src/rps/gnunet-service-rps.c src/rps/gnunet-service-rps_custommap.c -src/rps/gnunet-service-rps_peers.c src/rps/gnunet-service-rps_sampler.c src/rps/gnunet-service-rps_sampler_elem.c src/rps/gnunet-service-rps_view.c diff --git 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: 2017-03-31 19:22-0500\n" +"POT-Creation-Date: 2018-01-02 02:33+0100\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" @@ -244,14 +244,14 @@ msgid "Require valid port number for service `%s' in configuration!\n" msgstr "" #: src/arm/gnunet-service-arm.c:430 src/transport/plugin_transport_tcp.c:1176 -#: src/transport/tcp_service_legacy.c:613 src/util/client.c:480 +#: src/transport/tcp_service_legacy.c:613 src/util/client.c:505 #: src/util/service.c:682 #, c-format msgid "UNIXPATH `%s' too long, maximum length is %llu\n" msgstr "" #: src/arm/gnunet-service-arm.c:434 src/transport/plugin_transport_tcp.c:1180 -#: src/transport/tcp_service_legacy.c:617 src/util/client.c:485 +#: src/transport/tcp_service_legacy.c:617 src/util/client.c:510 #: src/util/service.c:687 #, c-format msgid "Using `%s' instead\n" @@ -272,7 +272,7 @@ msgid "Have neither PORT nor UNIXPATH for service `%s', but one is required\n" msgstr "" #: src/arm/gnunet-service-arm.c:513 -#: src/transport/plugin_transport_http_server.c:2621 +#: src/transport/plugin_transport_http_server.c:2684 #: src/transport/plugin_transport_tcp.c:1259 #: src/transport/tcp_service_legacy.c:696 src/util/service.c:782 #, c-format @@ -280,7 +280,7 @@ msgid "Failed to resolve `%s': %s\n" msgstr "»%s« konnte nicht aufgelöst werden: %s\n" #: src/arm/gnunet-service-arm.c:532 -#: src/transport/plugin_transport_http_server.c:2639 +#: src/transport/plugin_transport_http_server.c:2702 #: src/transport/plugin_transport_tcp.c:1278 #: src/transport/tcp_service_legacy.c:715 src/util/service.c:802 #, fuzzy, c-format @@ -374,13 +374,11 @@ msgid "" "%llu\n" msgstr "" -#: src/ats/gnunet-ats-solver-eval.c:3294 -#: src/ats-tests/gnunet-solver-eval.c:939 +#: src/ats/gnunet-ats-solver-eval.c:3294 src/ats-tests/gnunet-solver-eval.c:939 msgid "solver to use" msgstr "" -#: src/ats/gnunet-ats-solver-eval.c:3299 -#: src/ats-tests/gnunet-solver-eval.c:945 +#: src/ats/gnunet-ats-solver-eval.c:3299 src/ats-tests/gnunet-solver-eval.c:945 #: src/ats-tests/gnunet-solver-eval.c:950 msgid "experiment to use" msgstr "" @@ -670,58 +668,58 @@ msgstr "Hilfetext" msgid "Invalid peer ID `%s'\n" msgstr "Ungültige Antwort auf `%s'.\n" -#: src/cadet/gnunet-cadet.c:702 +#: src/cadet/gnunet-cadet.c:703 #, fuzzy, c-format msgid "Invalid tunnel owner `%s'\n" msgstr "Ungültiger Parameter: `%s'\n" -#: src/cadet/gnunet-cadet.c:775 +#: src/cadet/gnunet-cadet.c:776 msgid "Extra arguments are not applicable in combination with this option.\n" msgstr "" -#: src/cadet/gnunet-cadet.c:866 +#: src/cadet/gnunet-cadet.c:867 #, fuzzy, c-format msgid "Invalid target `%s'\n" msgstr "Ungültiger Parameter: `%s'\n" -#: src/cadet/gnunet-cadet.c:903 +#: src/cadet/gnunet-cadet.c:904 #, fuzzy msgid "No action requested\n" msgstr " Verbindung fehlgeschlagen\n" -#: src/cadet/gnunet-cadet.c:928 +#: src/cadet/gnunet-cadet.c:929 #, fuzzy msgid "Provide information about a particular connection" msgstr "Informationen über andere GNUnet Knoten ausgeben." -#: src/cadet/gnunet-cadet.c:933 +#: src/cadet/gnunet-cadet.c:934 msgid "Activate echo mode" msgstr "" -#: src/cadet/gnunet-cadet.c:938 +#: src/cadet/gnunet-cadet.c:939 msgid "Dump debug information to STDERR" msgstr "" -#: src/cadet/gnunet-cadet.c:944 +#: src/cadet/gnunet-cadet.c:945 msgid "Listen for connections using a shared secret among sender and recipient" msgstr "" -#: src/cadet/gnunet-cadet.c:951 +#: src/cadet/gnunet-cadet.c:952 #, fuzzy msgid "Provide information about a patricular peer" msgstr "Informationen über andere GNUnet Knoten ausgeben." -#: src/cadet/gnunet-cadet.c:957 +#: src/cadet/gnunet-cadet.c:958 #, fuzzy msgid "Provide information about all peers" msgstr "Informationen über andere GNUnet Knoten ausgeben." -#: src/cadet/gnunet-cadet.c:963 +#: src/cadet/gnunet-cadet.c:964 #, fuzzy msgid "Provide information about a particular tunnel" msgstr "Informationen über andere GNUnet Knoten ausgeben." -#: src/cadet/gnunet-cadet.c:969 +#: src/cadet/gnunet-cadet.c:970 #, fuzzy msgid "Provide information about all tunnels" msgstr "Informationen über andere GNUnet Knoten ausgeben." @@ -1049,7 +1047,7 @@ msgid "" msgstr "" #: src/conversation/gnunet_gst.c:622 -#: src/conversation/gnunet-helper-audio-playback-gst.c:356 +#: src/conversation/gnunet-helper-audio-playback-gst.c:361 #, c-format msgid "Read error from STDIN: %d %s\n" msgstr "Fehler beim Lesen aus STDIN: %d %s\n" @@ -1059,60 +1057,60 @@ msgstr "Fehler beim Lesen aus STDIN: %d %s\n" msgid "pa_stream_write() failed: %s\n" msgstr "pa_stream_write() fehlgeschlagen: %s\n" -#: src/conversation/gnunet-helper-audio-playback.c:607 +#: src/conversation/gnunet-helper-audio-playback.c:612 msgid "gnunet-helper-audio-playback - Got signal, exiting\n" msgstr "gnunet-helper-audio-playback - Signal erhalten, wird abgebrochen\n" -#: src/conversation/gnunet-helper-audio-playback.c:632 +#: src/conversation/gnunet-helper-audio-playback.c:637 #: src/conversation/gnunet-helper-audio-record.c:545 #, fuzzy msgid "Connection established.\n" msgstr " Verbindung fehlgeschlagen\n" -#: src/conversation/gnunet-helper-audio-playback.c:637 +#: src/conversation/gnunet-helper-audio-playback.c:642 #: src/conversation/gnunet-helper-audio-record.c:550 #, c-format msgid "pa_stream_new() failed: %s\n" msgstr "pa_stream_new() fehlgeschlagen: %s\n" -#: src/conversation/gnunet-helper-audio-playback.c:651 +#: src/conversation/gnunet-helper-audio-playback.c:656 #, c-format msgid "pa_stream_connect_playback() failed: %s\n" msgstr "pa_stream_connect_playback() fehlgeschlagen: %s\n" -#: src/conversation/gnunet-helper-audio-playback.c:664 +#: src/conversation/gnunet-helper-audio-playback.c:669 #: src/conversation/gnunet-helper-audio-record.c:576 #, c-format msgid "Connection failure: %s\n" msgstr "Verbindung fehlgeschlagen: %s\n" -#: src/conversation/gnunet-helper-audio-playback.c:685 +#: src/conversation/gnunet-helper-audio-playback.c:690 #: src/conversation/gnunet-helper-audio-record.c:599 msgid "Wrong Spec\n" msgstr "" -#: src/conversation/gnunet-helper-audio-playback.c:691 +#: src/conversation/gnunet-helper-audio-playback.c:696 #: src/conversation/gnunet-helper-audio-record.c:605 msgid "pa_mainloop_new() failed.\n" msgstr "pa_mainloop_new() fehlgeschlagen.\n" -#: src/conversation/gnunet-helper-audio-playback.c:705 +#: src/conversation/gnunet-helper-audio-playback.c:710 #: src/conversation/gnunet-helper-audio-record.c:620 msgid "pa_context_new() failed.\n" msgstr "pa_context_new() fehlgeschlagen.\n" -#: src/conversation/gnunet-helper-audio-playback.c:712 +#: src/conversation/gnunet-helper-audio-playback.c:717 #: src/conversation/gnunet-helper-audio-record.c:626 #, c-format msgid "pa_context_connect() failed: %s\n" msgstr "pa_context_connect() fehlgeschlagen: %s\n" -#: src/conversation/gnunet-helper-audio-playback.c:718 +#: src/conversation/gnunet-helper-audio-playback.c:723 #: src/conversation/gnunet-helper-audio-record.c:632 msgid "pa_mainloop_run() failed.\n" msgstr "pa_mainloop_run() fehlgeschlagen.\n" -#: src/conversation/gnunet-helper-audio-playback.c:790 +#: src/conversation/gnunet-helper-audio-playback.c:795 #, c-format msgid "Read error from STDIN: %s\n" msgstr "Fehler beim Lesen aus STDIN: %s\n" @@ -1174,7 +1172,12 @@ msgstr "ogg_stream_init() fehlgeschlagen.\n" msgid "Failed to allocate %u bytes for second packet\n" msgstr "UDP-Sockets können nicht geöffnet werden\n" -#: src/conversation/microphone.c:119 +#: src/conversation/gnunet-service-conversation.c:1276 +#, fuzzy, c-format +msgid "Could not open line, port %s already in use!\n" +msgstr "Verbindung zum %s-Dienst ist fehlgeschlagen!\n" + +#: src/conversation/microphone.c:121 msgid "Could not start record audio helper\n" msgstr "" @@ -1262,25 +1265,25 @@ msgstr "# gap Anfragen verworfen: Kollision in RT" msgid "# dequeuing CAR (duplicate request)" msgstr "" -#: src/core/gnunet-service-core.c:440 +#: src/core/gnunet-service-core.c:443 #, fuzzy, c-format msgid "# bytes of messages of type %u received" msgstr "# Bytes Rauschen empfangen" -#: src/core/gnunet-service-core.c:538 +#: src/core/gnunet-service-core.c:541 msgid "# messages discarded (session disconnected)" msgstr "" -#: src/core/gnunet-service-core.c:876 +#: src/core/gnunet-service-core.c:879 #, fuzzy, c-format msgid "# messages of type %u discarded (client busy)" msgstr "# Bytes Rauschen empfangen" -#: src/core/gnunet-service-core.c:985 +#: src/core/gnunet-service-core.c:988 msgid "Core service is lacking HOSTKEY configuration setting. Exiting.\n" msgstr "" -#: src/core/gnunet-service-core.c:1006 +#: src/core/gnunet-service-core.c:1009 #, fuzzy, c-format msgid "Core service of `%s' ready.\n" msgstr "Dienst »%s« wird neu gestartet.\n" @@ -1293,141 +1296,141 @@ msgstr "# Bytes verschlüsselt" msgid "# bytes decrypted" msgstr "# Bytes entschlüsselt" -#: src/core/gnunet-service-core_kx.c:725 +#: src/core/gnunet-service-core_kx.c:728 msgid "# PAYLOAD dropped (out of order)" msgstr "" -#: src/core/gnunet-service-core_kx.c:775 +#: src/core/gnunet-service-core_kx.c:778 msgid "# key exchanges initiated" msgstr "" -#: src/core/gnunet-service-core_kx.c:837 +#: src/core/gnunet-service-core_kx.c:840 msgid "# key exchanges stopped" msgstr "" -#: src/core/gnunet-service-core_kx.c:871 +#: src/core/gnunet-service-core_kx.c:874 #, fuzzy msgid "# PING messages transmitted" msgstr "# PING Nachrichten erstellt" -#: src/core/gnunet-service-core_kx.c:938 +#: src/core/gnunet-service-core_kx.c:941 msgid "# old ephemeral keys ignored" msgstr "" -#: src/core/gnunet-service-core_kx.c:945 +#: src/core/gnunet-service-core_kx.c:948 #, fuzzy msgid "# ephemeral keys received" msgstr "# verschlüsselter PONG Nachrichten empfangen" -#: src/core/gnunet-service-core_kx.c:984 +#: src/core/gnunet-service-core_kx.c:987 #, 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 "" -#: src/core/gnunet-service-core_kx.c:995 +#: src/core/gnunet-service-core_kx.c:998 #, fuzzy msgid "# EPHEMERAL_KEY messages received" msgstr "# verschlüsselter PONG Nachrichten empfangen" -#: src/core/gnunet-service-core_kx.c:1091 -#: src/transport/gnunet-service-transport_validation.c:1119 +#: src/core/gnunet-service-core_kx.c:1094 +#: src/transport/gnunet-service-transport_validation.c:1128 #, fuzzy msgid "# PING messages received" msgstr "# PING Nachrichten erstellt" -#: src/core/gnunet-service-core_kx.c:1100 +#: src/core/gnunet-service-core_kx.c:1103 #, fuzzy msgid "# PING messages dropped (out of order)" msgstr "# PING Nachrichten erstellt" -#: src/core/gnunet-service-core_kx.c:1158 +#: src/core/gnunet-service-core_kx.c:1161 #, fuzzy msgid "# PONG messages created" msgstr "# PING Nachrichten erstellt" -#: src/core/gnunet-service-core_kx.c:1184 +#: src/core/gnunet-service-core_kx.c:1187 msgid "# sessions terminated by timeout" msgstr "" -#: src/core/gnunet-service-core_kx.c:1197 +#: src/core/gnunet-service-core_kx.c:1200 #, fuzzy msgid "# keepalive messages sent" msgstr "# Klartext PING Nachrichten gesendet" -#: src/core/gnunet-service-core_kx.c:1261 -#: src/transport/gnunet-service-transport_validation.c:1442 +#: src/core/gnunet-service-core_kx.c:1264 +#: src/transport/gnunet-service-transport_validation.c:1461 #, fuzzy msgid "# PONG messages received" msgstr "# verschlüsselter PONG Nachrichten empfangen" -#: src/core/gnunet-service-core_kx.c:1268 +#: src/core/gnunet-service-core_kx.c:1271 msgid "# PONG messages dropped (connection down)" msgstr "" -#: src/core/gnunet-service-core_kx.c:1273 +#: src/core/gnunet-service-core_kx.c:1276 #, fuzzy msgid "# PONG messages dropped (out of order)" msgstr "# PING Nachrichten erstellt" -#: src/core/gnunet-service-core_kx.c:1308 +#: src/core/gnunet-service-core_kx.c:1311 #, fuzzy msgid "# PONG messages decrypted" msgstr "# PING Nachrichten erstellt" -#: src/core/gnunet-service-core_kx.c:1346 +#: src/core/gnunet-service-core_kx.c:1349 #, fuzzy msgid "# session keys confirmed via PONG" msgstr "# Knotenankündigungen empfangen" -#: src/core/gnunet-service-core_kx.c:1357 +#: src/core/gnunet-service-core_kx.c:1360 #, fuzzy msgid "# timeouts prevented via PONG" msgstr "# Bytes empfangen über TCP" -#: src/core/gnunet-service-core_kx.c:1364 +#: src/core/gnunet-service-core_kx.c:1367 #, fuzzy msgid "# rekey operations confirmed via PONG" msgstr "# Knotenankündigungen empfangen" -#: src/core/gnunet-service-core_kx.c:1518 +#: src/core/gnunet-service-core_kx.c:1521 msgid "# DATA message dropped (out of order)" msgstr "" -#: src/core/gnunet-service-core_kx.c:1526 +#: src/core/gnunet-service-core_kx.c:1529 #, c-format msgid "" "Session to peer `%s' went down due to key expiration (should not happen)\n" msgstr "" -#: src/core/gnunet-service-core_kx.c:1529 +#: src/core/gnunet-service-core_kx.c:1532 msgid "# sessions terminated by key expiration" msgstr "" -#: src/core/gnunet-service-core_kx.c:1590 -#: src/core/gnunet-service-core_kx.c:1616 +#: src/core/gnunet-service-core_kx.c:1593 +#: src/core/gnunet-service-core_kx.c:1619 #, fuzzy msgid "# bytes dropped (duplicates)" msgstr "# Bytes verworfen von TCP (ausgehend)" -#: src/core/gnunet-service-core_kx.c:1603 +#: src/core/gnunet-service-core_kx.c:1606 #, fuzzy msgid "# bytes dropped (out of sequence)" msgstr "# Bytes verworfen von TCP (ausgehend)" -#: src/core/gnunet-service-core_kx.c:1645 +#: src/core/gnunet-service-core_kx.c:1648 #, fuzzy msgid "# bytes dropped (ancient message)" msgstr "# Bytes verworfen von TCP (ausgehend)" -#: src/core/gnunet-service-core_kx.c:1653 +#: src/core/gnunet-service-core_kx.c:1656 #, fuzzy msgid "# bytes of payload decrypted" msgstr "# Bytes entschlüsselt" -#: src/core/gnunet-service-core_sessions.c:266 -#: src/core/gnunet-service-core_sessions.c:356 +#: src/core/gnunet-service-core_sessions.c:260 +#: src/core/gnunet-service-core_sessions.c:350 #: src/dht/gnunet-service-dht_neighbours.c:733 #: src/dht/gnunet-service-dht_neighbours.c:795 #: src/fs/gnunet-service-fs_cp.c:615 src/fs/gnunet-service-fs_cp.c:1520 @@ -1438,17 +1441,17 @@ msgstr "# Bytes entschlüsselt" msgid "# peers connected" msgstr "# verbundener Knoten" -#: src/core/gnunet-service-core_sessions.c:302 +#: src/core/gnunet-service-core_sessions.c:296 #, fuzzy msgid "# type map refreshes sent" msgstr "# p2p Trace-Antworten gesendet" -#: src/core/gnunet-service-core_sessions.c:422 +#: src/core/gnunet-service-core_sessions.c:416 #, fuzzy msgid "# outdated typemap confirmations received" msgstr "# Bytes empfangen über TCP" -#: src/core/gnunet-service-core_sessions.c:439 +#: src/core/gnunet-service-core_sessions.c:433 #, fuzzy msgid "# valid typemap confirmations received" msgstr "# Bytes empfangen über TCP" @@ -1464,7 +1467,7 @@ msgid "# updates to my type map" msgstr "" #: src/datacache/datacache.c:119 src/datacache/datacache.c:294 -#: src/datastore/gnunet-service-datastore.c:775 +#: src/datastore/gnunet-service-datastore.c:757 msgid "# bytes stored" msgstr "# gespeicherte Bytes" @@ -1506,13 +1509,11 @@ msgstr "" #: src/datacache/plugin_datacache_sqlite.c:113 #: src/datacache/plugin_datacache_sqlite.c:122 -#: src/datastore/plugin_datastore_mysql.c:980 +#: src/datastore/plugin_datastore_mysql.c:892 #: src/datastore/plugin_datastore_sqlite.c:58 #: src/datastore/plugin_datastore_sqlite.c:66 src/my/my.c:80 src/my/my.c:92 #: src/mysql/mysql.c:42 src/mysql/mysql.c:49 -#: src/namecache/plugin_namecache_postgres.c:53 #: src/namecache/plugin_namecache_sqlite.c:53 -#: src/namestore/plugin_namestore_postgres.c:53 #: src/namestore/plugin_namestore_sqlite.c:53 #: src/peerstore/plugin_peerstore_sqlite.c:52 #: src/psycstore/plugin_psycstore_mysql.c:62 @@ -1521,14 +1522,14 @@ msgstr "" #: src/testbed/gnunet-daemon-testbed-underlay.c:56 #: src/testbed/testbed_api_hosts.c:69 src/util/crypto_ecc.c:52 #: src/util/crypto_ecc_setup.c:41 src/util/crypto_mpi.c:39 -#: src/include/gnunet_common.h:720 src/include/gnunet_common.h:729 +#: src/include/gnunet_common.h:735 src/include/gnunet_common.h:744 #: src/scalarproduct/scalarproduct.h:35 #, c-format msgid "`%s' failed at %s:%d with error: %s\n" msgstr "»%s« schlug bei %s:%d mit dem Fehler %s fehl\n" #: src/datacache/plugin_datacache_sqlite.c:817 -#: src/datastore/plugin_datastore_sqlite.c:475 +#: src/datastore/plugin_datastore_sqlite.c:456 #: src/namecache/plugin_namecache_sqlite.c:296 #: src/namestore/plugin_namestore_sqlite.c:355 msgid "Tried to close sqlite without finalizing all prepared statements.\n" @@ -1553,7 +1554,7 @@ msgstr "" msgid "# queue entries created" msgstr "# PING Nachrichten erstellt" -#: src/datastore/datastore_api.c:740 +#: src/datastore/datastore_api.c:760 msgid "# status messages received" msgstr "# empfangene Statusmeldungen" @@ -1561,58 +1562,109 @@ msgstr "# empfangene Statusmeldungen" msgid "# Results received" msgstr "# empfangene Ergebnisse" -#: src/datastore/datastore_api.c:941 +#: src/datastore/datastore_api.c:920 msgid "# datastore connections (re)created" msgstr "" -#: src/datastore/datastore_api.c:1055 +#: src/datastore/datastore_api.c:1034 #, fuzzy msgid "# PUT requests executed" msgstr "# dht Anfragen weitergeleitet" -#: src/datastore/datastore_api.c:1116 +#: src/datastore/datastore_api.c:1095 #, fuzzy msgid "# RESERVE requests executed" msgstr "# dht Anfragen weitergeleitet" -#: src/datastore/datastore_api.c:1181 +#: src/datastore/datastore_api.c:1160 msgid "# RELEASE RESERVE requests executed" msgstr "" -#: src/datastore/datastore_api.c:1259 +#: src/datastore/datastore_api.c:1238 #, fuzzy msgid "# REMOVE requests executed" msgstr "# dht Anfragen weitergeleitet" -#: src/datastore/datastore_api.c:1319 +#: src/datastore/datastore_api.c:1298 msgid "# GET REPLICATION requests executed" msgstr "" -#: src/datastore/datastore_api.c:1381 +#: src/datastore/datastore_api.c:1360 msgid "# GET ZERO ANONYMITY requests executed" msgstr "" -#: src/datastore/datastore_api.c:1462 +#: src/datastore/datastore_api.c:1441 msgid "# GET requests executed" msgstr "# ausgeführte GET-Anfragen" -#: src/datastore/gnunet-datastore.c:113 +#: src/datastore/gnunet-datastore.c:189 +#, c-format +msgid "Dumped %<PRIu64> records\n" +msgstr "" + +#: src/datastore/gnunet-datastore.c:217 src/datastore/gnunet-datastore.c:229 +#, c-format +msgid "Short write to file: %zd bytes expecting %zd\n" +msgstr "" + +#: src/datastore/gnunet-datastore.c:261 +#, fuzzy +msgid "Error queueing datastore GET operation\n" +msgstr "Fehler beim Anlegen des Benutzers" + +#: src/datastore/gnunet-datastore.c:287 src/datastore/gnunet-datastore.c:412 +#, fuzzy, c-format +msgid "Unable to open dump file: %s\n" +msgstr "Zustellung der Nachricht `%s' fehlgeschlagen.\n" + +#: src/datastore/gnunet-datastore.c:326 #, c-format msgid "Failed to store item: %s, aborting\n" msgstr "Objekt konnte nicht gespeichert werden: %s, Abbruch\n" -#: src/datastore/gnunet-datastore.c:209 +#: src/datastore/gnunet-datastore.c:340 #, c-format -msgid "Cannot use the same configuration for source and destination\n" +msgid "Inserted %<PRIu64> records\n" msgstr "" -#: src/datastore/gnunet-datastore.c:256 -msgid "" -"specifies the configuration to use to access an alternative datastore; will " -"merge that datastore into our current datastore" +#: src/datastore/gnunet-datastore.c:349 src/datastore/gnunet-datastore.c:363 +#, c-format +msgid "Short read from file: %zd bytes expecting %zd\n" +msgstr "" + +#: src/datastore/gnunet-datastore.c:389 +#, fuzzy +msgid "Error queueing datastore PUT operation\n" +msgstr "Fehler beim Anlegen des Benutzers" + +#: src/datastore/gnunet-datastore.c:432 +msgid "Input file is not of a supported format\n" msgstr "" -#: src/datastore/gnunet-datastore.c:265 +#: src/datastore/gnunet-datastore.c:458 +#, fuzzy +msgid "Failed connecting to the datastore.\n" +msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden." + +#: src/datastore/gnunet-datastore.c:470 +#, c-format +msgid "Please choose at least one operation: %s, %s\n" +msgstr "" + +#: src/datastore/gnunet-datastore.c:493 +msgid "Dump all records from the datastore" +msgstr "" + +#: src/datastore/gnunet-datastore.c:497 +#, fuzzy +msgid "Insert records into the datastore" +msgstr "# bytes in der Datenbank" + +#: src/datastore/gnunet-datastore.c:502 +msgid "File to dump or insert" +msgstr "" + +#: src/datastore/gnunet-datastore.c:511 #, fuzzy msgid "Manipulate GNUnet datastore" msgstr "sqlite Datenspeicher" @@ -1655,8 +1707,8 @@ msgstr "" #: src/datastore/gnunet-service-datastore.c:634 #: src/datastore/gnunet-service-datastore.c:689 -#: src/datastore/gnunet-service-datastore.c:977 -#: src/datastore/gnunet-service-datastore.c:1633 +#: src/datastore/gnunet-service-datastore.c:837 +#: src/datastore/gnunet-service-datastore.c:1469 msgid "# reserved" msgstr "" @@ -1664,147 +1716,148 @@ msgstr "" msgid "Could not find matching reservation" msgstr "" -#: src/datastore/gnunet-service-datastore.c:792 +#: src/datastore/gnunet-service-datastore.c:773 #, c-format msgid "Need %llu bytes more space (%llu allowed, using %llu)\n" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1026 +#: src/datastore/gnunet-service-datastore.c:876 #, fuzzy msgid "# GET requests received" msgstr "# Client Trace-Anfragen empfangen" -#: src/datastore/gnunet-service-datastore.c:1058 +#: src/datastore/gnunet-service-datastore.c:907 #, fuzzy msgid "# GET KEY requests received" msgstr "# Client Trace-Anfragen empfangen" -#: src/datastore/gnunet-service-datastore.c:1071 +#: src/datastore/gnunet-service-datastore.c:920 msgid "# requests filtered by bloomfilter" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1108 +#: src/datastore/gnunet-service-datastore.c:956 #, fuzzy msgid "# GET REPLICATION requests received" msgstr "# Client Trace-Anfragen empfangen" -#: src/datastore/gnunet-service-datastore.c:1141 +#: src/datastore/gnunet-service-datastore.c:989 #, fuzzy msgid "# GET ZERO ANONYMITY requests received" msgstr "# Client Trace-Anfragen empfangen" -#: src/datastore/gnunet-service-datastore.c:1190 +#: src/datastore/gnunet-service-datastore.c:1036 msgid "Content not found" msgstr "Kein Inhalt gefunden" -#: src/datastore/gnunet-service-datastore.c:1199 +#: src/datastore/gnunet-service-datastore.c:1043 msgid "# bytes removed (explicit request)" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1246 +#: src/datastore/gnunet-service-datastore.c:1088 #, fuzzy msgid "# REMOVE requests received" msgstr "# Client Trace-Anfragen empfangen" -#: src/datastore/gnunet-service-datastore.c:1301 +#: src/datastore/gnunet-service-datastore.c:1137 #, c-format msgid "" "Datastore payload must have been inaccurate (%lld < %lld). Recomputing it.\n" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1307 -#: src/datastore/gnunet-service-datastore.c:1482 +#: src/datastore/gnunet-service-datastore.c:1143 +#: src/datastore/gnunet-service-datastore.c:1318 #, c-format msgid "New payload: %lld\n" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1361 +#: src/datastore/gnunet-service-datastore.c:1197 #, c-format msgid "Loading `%s' datastore plugin\n" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1373 +#: src/datastore/gnunet-service-datastore.c:1209 #, fuzzy, c-format msgid "Failed to load datastore plugin for `%s'\n" msgstr "Anwendung `%s' konnte nicht initialisiert werden.\n" -#: src/datastore/gnunet-service-datastore.c:1433 +#: src/datastore/gnunet-service-datastore.c:1269 msgid "Bloomfilter construction complete.\n" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1489 +#: src/datastore/gnunet-service-datastore.c:1325 msgid "Rebuilding bloomfilter. Please be patient.\n" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1500 +#: src/datastore/gnunet-service-datastore.c:1336 msgid "Plugin does not support get_keys function. Please fix!\n" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1670 +#: src/datastore/gnunet-service-datastore.c:1506 #, fuzzy, c-format msgid "# bytes used in file-sharing datastore `%s'" msgstr "# bytes erlaubt in der Datenbank" -#: src/datastore/gnunet-service-datastore.c:1686 +#: src/datastore/gnunet-service-datastore.c:1522 msgid "# quota" msgstr "# Kontingent" -#: src/datastore/gnunet-service-datastore.c:1691 +#: src/datastore/gnunet-service-datastore.c:1527 msgid "# cache size" msgstr "# Zwischenspeichergröße" -#: src/datastore/gnunet-service-datastore.c:1707 +#: src/datastore/gnunet-service-datastore.c:1543 #, c-format msgid "Could not use specified filename `%s' for bloomfilter.\n" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1725 -#: src/datastore/gnunet-service-datastore.c:1741 +#: src/datastore/gnunet-service-datastore.c:1561 +#: src/datastore/gnunet-service-datastore.c:1577 #, fuzzy, c-format msgid "Failed to remove bogus bloomfilter file `%s'\n" msgstr "Datei wurde als `%s' gespeichert.\n" -#: src/datastore/gnunet-service-datastore.c:1773 +#: src/datastore/gnunet-service-datastore.c:1609 msgid "Failed to initialize bloomfilter.\n" msgstr "Bloomfilter konnte nicht initialisiert werden.\n" -#: src/datastore/plugin_datastore_heap.c:769 +#: src/datastore/plugin_datastore_heap.c:893 msgid "Heap database running\n" msgstr "Heap-Datenbank läuft\n" -#: src/datastore/plugin_datastore_mysql.c:377 -#: src/datastore/plugin_datastore_sqlite.c:590 +#: src/datastore/plugin_datastore_mysql.c:371 +#: src/datastore/plugin_datastore_mysql.c:423 +#: src/datastore/plugin_datastore_mysql.c:1075 +msgid "MySQL statement run failure" +msgstr "" + +#: src/datastore/plugin_datastore_mysql.c:410 +#: src/datastore/plugin_datastore_sqlite.c:626 #, fuzzy msgid "Data too large" msgstr "Anzahl der Werte" -#: src/datastore/plugin_datastore_mysql.c:393 -msgid "MySQL statement run failure" -msgstr "" - -#: src/datastore/plugin_datastore_mysql.c:936 +#: src/datastore/plugin_datastore_mysql.c:848 #, fuzzy, c-format msgid "`%s' for `%s' failed at %s:%d with error: %s\n" msgstr "`%s' an `%s' schlug fehl bei %s:%d mit dem Fehler: %s\n" -#: src/datastore/plugin_datastore_mysql.c:1208 +#: src/datastore/plugin_datastore_mysql.c:1180 #: src/psycstore/plugin_psycstore_mysql.c:1936 msgid "Mysql database running\n" msgstr "MySQL-Datenbank läuft\n" -#: src/datastore/plugin_datastore_postgres.c:345 +#: src/datastore/plugin_datastore_postgres.c:274 +#: src/datastore/plugin_datastore_postgres.c:891 msgid "Postgress exec failure" msgstr "" -#: src/datastore/plugin_datastore_postgres.c:866 +#: src/datastore/plugin_datastore_postgres.c:852 #, fuzzy msgid "Failed to drop table from database.\n" msgstr "Fehler beim Binden an UDP Port %d.\n" -#: src/datastore/plugin_datastore_postgres.c:903 -#: src/namecache/plugin_namecache_postgres.c:398 -#: src/namestore/plugin_namestore_postgres.c:571 -#: src/psycstore/plugin_psycstore_postgres.c:1721 +#: src/datastore/plugin_datastore_postgres.c:950 +#: src/psycstore/plugin_psycstore_postgres.c:1506 msgid "Postgres database running\n" msgstr "PostgreSQL-Datenbank läuft\n" @@ -1816,7 +1869,7 @@ msgstr "PostgreSQL-Datenbank läuft\n" msgid "`%s' failed at %s:%u with error: %s" msgstr "`%s' schlug bei %s:%d mit dem Fehler %s fehl\n" -#: src/datastore/plugin_datastore_sqlite.c:281 +#: src/datastore/plugin_datastore_sqlite.c:271 #: src/namecache/plugin_namecache_sqlite.c:194 #: src/namestore/plugin_namestore_sqlite.c:222 #: src/peerstore/plugin_peerstore_sqlite.c:535 @@ -1825,24 +1878,28 @@ msgstr "`%s' schlug bei %s:%d mit dem Fehler %s fehl\n" msgid "Unable to initialize SQLite: %s.\n" msgstr "SQLite-Datenbank konnte nicht initialisiert werden: %s.\n" -#: src/datastore/plugin_datastore_sqlite.c:1234 +#: src/datastore/plugin_datastore_sqlite.c:577 +msgid "sqlite bind failure" +msgstr "" + +#: src/datastore/plugin_datastore_sqlite.c:1259 msgid "sqlite version to old to determine size, assuming zero\n" msgstr "" -#: src/datastore/plugin_datastore_sqlite.c:1268 +#: src/datastore/plugin_datastore_sqlite.c:1293 #, c-format msgid "" "Using sqlite page utilization to estimate payload (%llu pages of size %llu " "bytes)\n" msgstr "" -#: src/datastore/plugin_datastore_sqlite.c:1312 +#: src/datastore/plugin_datastore_sqlite.c:1337 #: src/namecache/plugin_namecache_sqlite.c:603 #: src/namestore/plugin_namestore_sqlite.c:802 msgid "Sqlite database running\n" msgstr "Sqlite-Datenbank läuft\n" -#: src/datastore/plugin_datastore_template.c:259 +#: src/datastore/plugin_datastore_template.c:253 msgid "Template database running\n" msgstr "" @@ -1903,8 +1960,7 @@ msgstr "" msgid "Prints all packets that go through the DHT." msgstr "" -#: src/dht/gnunet_dht_profiler.c:1161 -#: src/testbed/gnunet-testbed-profiler.c:255 +#: src/dht/gnunet_dht_profiler.c:1161 src/testbed/gnunet-testbed-profiler.c:253 #, c-format msgid "Exiting as the number of peers is %u\n" msgstr "" @@ -1921,7 +1977,7 @@ msgid "" msgstr "" #: src/dht/gnunet_dht_profiler.c:1200 src/nse/gnunet-nse-profiler.c:853 -#: src/testbed/gnunet-testbed-profiler.c:305 +#: src/testbed/gnunet-testbed-profiler.c:304 msgid "name of the file with the login information for the testbed" msgstr "" @@ -2546,7 +2602,7 @@ msgstr "" msgid "No useful service enabled. Exiting.\n" msgstr "" -#: src/exit/gnunet-daemon-exit.c:3969 +#: src/exit/gnunet-daemon-exit.c:3970 msgid "Daemon to run to provide an IP exit node for the VPN" msgstr "" @@ -2759,7 +2815,7 @@ msgstr "Fehler beim Empfangen der Antwort von gnunetd auf die `%s' Nachricht\n" msgid "Failed to not connect to `%s' service.\n" msgstr "`%s' Dienst konnte nicht initialisiert werden.\n" -#: src/fs/fs_misc.c:126 +#: src/fs/fs_misc.c:128 #, fuzzy, c-format msgid "Did not find mime type `%s' in extension list.\n" msgstr "Knoten `%s' konnte nicht in der Routing Tabelle gefunden werden!\n" @@ -3995,7 +4051,7 @@ msgstr "" msgid "Failed to connect to identity service\n" msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n" -#: src/gns/gnunet-gns-import.c:489 +#: src/gns/gnunet-gns-import.c:452 msgid "This program will import some GNS authorities into your GNS namestore." msgstr "" @@ -4014,109 +4070,109 @@ msgstr "" msgid "%s failed at %s:%d: `%s'\n" msgstr "»%s« schlug fehl bei %s:%d mit dem Fehler: »%s«.\n" -#: src/gns/gnunet-gns-proxy.c:878 +#: src/gns/gnunet-gns-proxy.c:887 #, c-format msgid "Unsupported CURL SSL backend %d\n" msgstr "" -#: src/gns/gnunet-gns-proxy.c:901 +#: src/gns/gnunet-gns-proxy.c:910 #, fuzzy, c-format msgid "Failed to fetch CN from cert: %s\n" msgstr "Fehler beim Lesen der Freunde-Liste von `%s'\n" -#: src/gns/gnunet-gns-proxy.c:924 +#: src/gns/gnunet-gns-proxy.c:933 #, fuzzy, c-format msgid "Failed to initialize DANE: %s\n" msgstr "SQLite Datenbank konnte nicht initialisiert werden.\n" -#: src/gns/gnunet-gns-proxy.c:937 +#: src/gns/gnunet-gns-proxy.c:946 #, fuzzy, c-format msgid "Failed to parse DANE record: %s\n" msgstr "Dateiformat fehlerhaft (kein GNUnet Verzeichnis?)\n" -#: src/gns/gnunet-gns-proxy.c:952 +#: src/gns/gnunet-gns-proxy.c:961 #, fuzzy, c-format msgid "Failed to verify TLS connection using DANE: %s\n" msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n" -#: src/gns/gnunet-gns-proxy.c:962 +#: src/gns/gnunet-gns-proxy.c:971 #, c-format msgid "Failed DANE verification failed with GnuTLS verify status code: %u\n" msgstr "" -#: src/gns/gnunet-gns-proxy.c:986 +#: src/gns/gnunet-gns-proxy.c:995 #, c-format msgid "SSL certificate subject name (%s) does not match `%s'\n" msgstr "" -#: src/gns/gnunet-gns-proxy.c:1095 +#: src/gns/gnunet-gns-proxy.c:1104 #, c-format msgid "Cookie domain `%s' supplied by server is invalid\n" msgstr "" -#: src/gns/gnunet-gns-proxy.c:1699 +#: src/gns/gnunet-gns-proxy.c:1709 #, fuzzy, c-format msgid "Unsupported HTTP method `%s'\n" msgstr "Kommando `%s' wird nicht unterstützt. Vorgang wird abgebrochen.\n" -#: src/gns/gnunet-gns-proxy.c:2162 +#: src/gns/gnunet-gns-proxy.c:2172 #, fuzzy, c-format msgid "Unable to import private key from file `%s'\n" msgstr "Fehler beim Speichern der Konfigurationsdatei `%s':" -#: src/gns/gnunet-gns-proxy.c:2192 +#: src/gns/gnunet-gns-proxy.c:2202 #, fuzzy, c-format msgid "Unable to import certificate %s\n" msgstr "SQLite Datenbank konnte nicht initialisiert werden: %s.\n" -#: src/gns/gnunet-gns-proxy.c:2365 +#: src/gns/gnunet-gns-proxy.c:2375 #, fuzzy, c-format msgid "Failed to start HTTPS server for `%s'\n" msgstr "Der Transportdienst auf Port %d konnte nicht gestartet werden.\n" -#: src/gns/gnunet-gns-proxy.c:2384 src/rest/gnunet-rest-server.c:533 +#: src/gns/gnunet-gns-proxy.c:2394 src/rest/gnunet-rest-server.c:533 #, fuzzy msgid "Failed to pass client to MHD\n" msgstr "Fehler beim Starten der Collection.\n" -#: src/gns/gnunet-gns-proxy.c:2704 +#: src/gns/gnunet-gns-proxy.c:2716 #, c-format msgid "Unsupported socks version %d\n" msgstr "" -#: src/gns/gnunet-gns-proxy.c:2733 +#: src/gns/gnunet-gns-proxy.c:2745 #, fuzzy, c-format msgid "Unsupported socks command %d\n" msgstr "Kommando `%s' wird nicht unterstützt. Vorgang wird abgebrochen.\n" -#: src/gns/gnunet-gns-proxy.c:2751 src/gns/gnunet-gns-proxy.c:2780 +#: src/gns/gnunet-gns-proxy.c:2763 src/gns/gnunet-gns-proxy.c:2792 msgid "SSL connection to plain IPv4 address requested\n" msgstr "" -#: src/gns/gnunet-gns-proxy.c:2830 +#: src/gns/gnunet-gns-proxy.c:2842 #, c-format msgid "Unsupported socks address type %d\n" msgstr "" -#: src/gns/gnunet-gns-proxy.c:3165 src/gns/gnunet-service-gns.c:403 +#: src/gns/gnunet-gns-proxy.c:3177 src/gns/gnunet-service-gns.c:403 #, c-format msgid "No ego configured for `%s`\n" msgstr "" -#: src/gns/gnunet-gns-proxy.c:3226 +#: src/gns/gnunet-gns-proxy.c:3238 #, fuzzy, c-format msgid "Failed to load SSL/TLS key and certificate from `%s'\n" msgstr "Fehler beim Lesen der Freunde-Liste von `%s'\n" -#: src/gns/gnunet-gns-proxy.c:3269 +#: src/gns/gnunet-gns-proxy.c:3281 msgid "listen on specified port (default: 7777)" msgstr "" -#: src/gns/gnunet-gns-proxy.c:3275 +#: src/gns/gnunet-gns-proxy.c:3287 msgid "pem file to use as CA" msgstr "" -#: src/gns/gnunet-gns-proxy.c:3300 +#: src/gns/gnunet-gns-proxy.c:3312 msgid "GNUnet GNS proxy" msgstr "" @@ -4126,7 +4182,7 @@ msgid "Failed to connect to the namecache!\n" msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n" #: src/gns/gnunet-service-gns.c:461 -#: src/zonemaster/gnunet-service-zonemaster.c:741 +#: src/zonemaster/gnunet-service-zonemaster.c:742 #, fuzzy msgid "Could not connect to DHT!\n" msgstr "Verbindung zu gnunetd konnte nicht hergestellt werden.\n" @@ -4331,34 +4387,34 @@ msgstr "PID konnte nicht in Datei `%s' geschrieben werden: %s.\n" msgid "Modified %u addresses, wrote %u bytes\n" msgstr "" -#: src/hello/hello.c:1103 +#: src/hello/hello.c:1110 msgid "Failed to parse HELLO message: missing expiration time\n" msgstr "" -#: src/hello/hello.c:1112 +#: src/hello/hello.c:1119 msgid "Failed to parse HELLO message: invalid expiration time\n" msgstr "" -#: src/hello/hello.c:1122 +#: src/hello/hello.c:1129 #, fuzzy msgid "Failed to parse HELLO message: malformed\n" msgstr "Fehler beim Senden der `%s' Nachricht an gnunetd\n" -#: src/hello/hello.c:1133 +#: src/hello/hello.c:1140 msgid "Failed to parse HELLO message: missing transport plugin\n" msgstr "" -#: src/hello/hello.c:1151 +#: src/hello/hello.c:1158 #, fuzzy, c-format msgid "Plugin `%s' not found, skipping address\n" msgstr "Kommando `%s' wurde nicht gefunden!\n" -#: src/hello/hello.c:1159 +#: src/hello/hello.c:1166 #, c-format msgid "Plugin `%s' does not support URIs yet\n" msgstr "" -#: src/hello/hello.c:1174 +#: src/hello/hello.c:1181 #, fuzzy, c-format msgid "Failed to parse `%s' as an address for plugin `%s'\n" msgstr "Fehler beim Aktualisieren der Daten des Moduls `%s'\n" @@ -4612,7 +4668,7 @@ msgid "# hostlist advertisements send" msgstr "# Bekanntmachungen von anderen übertragen" #: src/hostlist/gnunet-daemon-hostlist_server.c:679 -#: src/transport/gnunet-service-transport.c:2803 +#: src/transport/gnunet-service-transport.c:2815 #, fuzzy msgid "Could not access PEERINFO service. Exiting.\n" msgstr "Auf die Namespace Informationen konnte nicht zugegriffen werden.\n" @@ -4870,12 +4926,6 @@ msgstr "Zustellung der Nachricht `%s' fehlgeschlagen.\n" msgid "flat plugin running\n" msgstr "Sqlite-Datenbank läuft\n" -#: src/namecache/plugin_namecache_postgres.c:90 -#: src/namestore/plugin_namestore_postgres.c:97 -#, fuzzy -msgid "Failed to create indices\n" -msgstr "Zustellung der Nachricht `%s' fehlgeschlagen.\n" - #: src/namestore/gnunet-namestore.c:301 #, c-format msgid "Adding record failed: %s\n" @@ -4974,8 +5024,7 @@ msgstr "" msgid "Invalid public key for reverse lookup `%s'\n" msgstr "" -#: src/namestore/gnunet-namestore.c:979 -#: src/peerinfo-tool/gnunet-peerinfo.c:775 +#: src/namestore/gnunet-namestore.c:979 src/peerinfo-tool/gnunet-peerinfo.c:775 #, fuzzy, c-format msgid "Invalid URI `%s'\n" msgstr "Ungültiger Parameter: `%s'\n" @@ -5112,7 +5161,7 @@ msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n" msgid "GNU Name System First Come First Serve name registration service" msgstr "" -#: src/namestore/gnunet-service-namestore.c:612 +#: src/namestore/gnunet-service-namestore.c:615 #, c-format msgid "Failed to replicate block in namecache: %s\n" msgstr "" @@ -5445,7 +5494,7 @@ msgid "Measure quality and performance of the NSE service." msgstr "" #: src/nse/gnunet-service-nse.c:1534 -#: src/revocation/gnunet-service-revocation.c:838 src/util/gnunet-scrypt.c:276 +#: src/revocation/gnunet-service-revocation.c:840 src/util/gnunet-scrypt.c:276 msgid "Value is too large.\n" msgstr "" @@ -5487,17 +5536,17 @@ msgstr "==> Verzeichnis `%s':\n" msgid "Still no peers found in `%s'!\n" msgstr "Dienst `%s' konnte nicht ordentlich entladen werden!\n" -#: src/peerinfo/gnunet-service-peerinfo.c:1076 +#: src/peerinfo/gnunet-service-peerinfo.c:1080 #, fuzzy, c-format msgid "Cleaning up directory `%s'\n" msgstr "==> Verzeichnis `%s':\n" -#: src/peerinfo/gnunet-service-peerinfo.c:1405 +#: src/peerinfo/gnunet-service-peerinfo.c:1409 #, c-format msgid "Importing HELLOs from `%s'\n" msgstr "" -#: src/peerinfo/gnunet-service-peerinfo.c:1418 +#: src/peerinfo/gnunet-service-peerinfo.c:1422 msgid "Skipping import of included HELLOs\n" msgstr "" @@ -5644,15 +5693,10 @@ msgstr "" msgid "Unable to create indices: %s.\n" msgstr "Zustellung der Nachricht `%s' fehlgeschlagen.\n" -#: src/postgres/postgres.c:67 +#: src/pq/pq_prepare.c:80 #, fuzzy, c-format -msgid "`%s:%s' failed at %s:%d with error: %s\n" -msgstr "`%s' schlug bei %s:%d mit dem Fehler %s fehl\n" - -#: src/postgres/postgres.c:192 -#, fuzzy, c-format -msgid "Unable to connect to Postgres database '%s': %s\n" -msgstr "Fehler beim Anlegen des Benutzerkontos:" +msgid "PQprepare (`%s' as `%s') failed with error: %s\n" +msgstr "`%s' an `%s' schlug fehl bei %s:%d mit dem Fehler: %s\n" #: src/psycstore/gnunet-service-psycstore.c:249 #, fuzzy @@ -5832,56 +5876,56 @@ msgstr "" msgid "Daemon to announce regular expressions for the peer using cadet." msgstr "" -#: src/regex/gnunet-regex-profiler.c:1314 +#: src/regex/gnunet-regex-profiler.c:1386 msgid "No configuration file given. Exiting\n" msgstr "Keine Konfigurationsdatei angegeben. Abbruch\n" -#: src/regex/gnunet-regex-profiler.c:1355 +#: src/regex/gnunet-regex-profiler.c:1427 #: src/regex/gnunet-regex-simulation-profiler.c:630 #, c-format msgid "No policy directory specified on command line. Exiting.\n" msgstr "" -#: src/regex/gnunet-regex-profiler.c:1361 +#: src/regex/gnunet-regex-profiler.c:1433 #: src/regex/gnunet-regex-simulation-profiler.c:638 #, c-format msgid "Specified policies directory does not exist. Exiting.\n" msgstr "" -#: src/regex/gnunet-regex-profiler.c:1368 +#: src/regex/gnunet-regex-profiler.c:1440 #, c-format msgid "No files found in `%s'\n" msgstr "Keine Dateien in »%s« gefunden\n" -#: src/regex/gnunet-regex-profiler.c:1377 +#: src/regex/gnunet-regex-profiler.c:1449 msgid "No search strings file given. Exiting.\n" msgstr "" -#: src/regex/gnunet-regex-profiler.c:1397 +#: src/regex/gnunet-regex-profiler.c:1469 msgid "Error loading search strings. Exiting.\n" msgstr "" -#: src/regex/gnunet-regex-profiler.c:1485 +#: src/regex/gnunet-regex-profiler.c:1557 msgid "name of the file for writing statistics" msgstr "" -#: src/regex/gnunet-regex-profiler.c:1491 +#: src/regex/gnunet-regex-profiler.c:1563 msgid "wait TIMEOUT before ending the experiment" msgstr "" -#: src/regex/gnunet-regex-profiler.c:1497 +#: src/regex/gnunet-regex-profiler.c:1569 msgid "directory with policy files" msgstr "" -#: src/regex/gnunet-regex-profiler.c:1504 +#: src/regex/gnunet-regex-profiler.c:1576 msgid "name of file with input strings" msgstr "" -#: src/regex/gnunet-regex-profiler.c:1510 +#: src/regex/gnunet-regex-profiler.c:1582 msgid "name of file with hosts' names" msgstr "" -#: src/regex/gnunet-regex-profiler.c:1523 +#: src/regex/gnunet-regex-profiler.c:1595 msgid "Profiler for regex" msgstr "" @@ -6041,12 +6085,12 @@ msgstr " Verbindung fehlgeschlagen\n" msgid "# revocation set unions completed" msgstr "# Klartext PONG Nachrichten empfangen" -#: src/revocation/gnunet-service-revocation.c:524 -#: src/revocation/gnunet-service-revocation.c:771 +#: src/revocation/gnunet-service-revocation.c:525 +#: src/revocation/gnunet-service-revocation.c:773 msgid "SET service crashed, terminating revocation service\n" msgstr "" -#: src/revocation/gnunet-service-revocation.c:862 +#: src/revocation/gnunet-service-revocation.c:864 #, fuzzy msgid "Could not open revocation database file!" msgstr "Knoten `%s' konnte nicht in der Routing Tabelle gefunden werden!\n" @@ -6110,9 +6154,9 @@ msgstr "" msgid "Calculate the Vectorproduct with a GNUnet peer." msgstr "" -#: src/scalarproduct/gnunet-service-scalarproduct_alice.c:1407 +#: src/scalarproduct/gnunet-service-scalarproduct_alice.c:1401 #: src/scalarproduct/gnunet-service-scalarproduct_bob.c:1345 -#: src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c:1180 +#: src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c:1172 #: src/scalarproduct/gnunet-service-scalarproduct-ecc_bob.c:1063 #, fuzzy msgid "Connect to CADET failed\n" @@ -6138,7 +6182,7 @@ msgstr "" msgid "also profile decryption" msgstr "" -#: src/set/gnunet-service-set.c:1948 +#: src/set/gnunet-service-set.c:1989 #, fuzzy msgid "Could not connect to CADET service\n" msgstr "Verbindung zum %s-Dienst ist fehlgeschlagen!\n" @@ -6198,113 +6242,113 @@ msgstr "" msgid "say good-bye and leave somebody else's place" msgstr "" -#: src/social/gnunet-social.c:1227 src/social/gnunet-social.c:1232 +#: src/social/gnunet-social.c:1227 msgid "create a place" msgstr "" -#: src/social/gnunet-social.c:1237 +#: src/social/gnunet-social.c:1232 msgid "destroy a place we were hosting" msgstr "" -#: src/social/gnunet-social.c:1242 +#: src/social/gnunet-social.c:1237 msgid "enter somebody else's place" msgstr "" -#: src/social/gnunet-social.c:1248 +#: src/social/gnunet-social.c:1243 msgid "find state matching name prefix" msgstr "" -#: src/social/gnunet-social.c:1253 +#: src/social/gnunet-social.c:1248 msgid "replay history of messages up to the given --limit" msgstr "" -#: src/social/gnunet-social.c:1258 +#: src/social/gnunet-social.c:1253 msgid "reconnect to a previously created place" msgstr "" -#: src/social/gnunet-social.c:1263 +#: src/social/gnunet-social.c:1258 msgid "publish something to a place we are hosting" msgstr "" -#: src/social/gnunet-social.c:1268 +#: src/social/gnunet-social.c:1263 msgid "reconnect to a previously entered place" msgstr "" -#: src/social/gnunet-social.c:1273 +#: src/social/gnunet-social.c:1268 msgid "search for state matching exact name" msgstr "" -#: src/social/gnunet-social.c:1278 +#: src/social/gnunet-social.c:1273 msgid "submit something to somebody's place" msgstr "" -#: src/social/gnunet-social.c:1283 +#: src/social/gnunet-social.c:1278 msgid "list of egos and subscribed places" msgstr "" -#: src/social/gnunet-social.c:1288 +#: src/social/gnunet-social.c:1283 msgid "extract and replay history between message IDs --start and --until" msgstr "" -#: src/social/gnunet-social.c:1297 +#: src/social/gnunet-social.c:1292 msgid "application ID to use when connecting" msgstr "" -#: src/social/gnunet-social.c:1303 +#: src/social/gnunet-social.c:1298 msgid "message body or state value" msgstr "" -#: src/social/gnunet-social.c:1309 +#: src/social/gnunet-social.c:1304 #, fuzzy msgid "name or public key of ego" msgstr "Ungültiger Parameter: `%s'\n" -#: src/social/gnunet-social.c:1314 +#: src/social/gnunet-social.c:1309 msgid "wait for incoming messages" msgstr "" -#: src/social/gnunet-social.c:1320 +#: src/social/gnunet-social.c:1315 msgid "GNS name" msgstr "" -#: src/social/gnunet-social.c:1326 +#: src/social/gnunet-social.c:1321 msgid "peer ID for --guest-enter" msgstr "" -#: src/social/gnunet-social.c:1332 +#: src/social/gnunet-social.c:1327 msgid "name (key) to query from state" msgstr "" -#: src/social/gnunet-social.c:1338 +#: src/social/gnunet-social.c:1333 msgid "method name" msgstr "" -#: src/social/gnunet-social.c:1344 +#: src/social/gnunet-social.c:1339 #, fuzzy msgid "number of messages to replay from history" msgstr "Anzahl an Durchläufen" -#: src/social/gnunet-social.c:1350 +#: src/social/gnunet-social.c:1345 msgid "key address of place" msgstr "" -#: src/social/gnunet-social.c:1356 +#: src/social/gnunet-social.c:1351 msgid "start message ID for history replay" msgstr "" -#: src/social/gnunet-social.c:1361 +#: src/social/gnunet-social.c:1356 msgid "respond to entry requests by admitting all guests" msgstr "" -#: src/social/gnunet-social.c:1367 +#: src/social/gnunet-social.c:1362 msgid "end message ID for history replay" msgstr "" -#: src/social/gnunet-social.c:1372 +#: src/social/gnunet-social.c:1367 msgid "respond to entry requests by refusing all guests" msgstr "" -#: src/social/gnunet-social.c:1382 +#: src/social/gnunet-social.c:1377 msgid "" "gnunet-social - Interact with the social service: enter/leave, send/receive " "messages, access history and state.\n" @@ -6330,7 +6374,7 @@ msgstr "" msgid "Wrote %llu bytes of statistics to `%s'\n" msgstr "Dateien aus dem GNUnet herunterladen." -#: src/statistics/gnunet-service-statistics.c:1084 +#: src/statistics/gnunet-service-statistics.c:1086 #, fuzzy, c-format msgid "Loading %llu bytes of statistics from `%s'\n" msgstr "Dateien aus dem GNUnet herunterladen." @@ -6458,7 +6502,7 @@ msgid "Invalid argument `%s'; expecting unsigned int\n" msgstr "Ungültiger Parameter für `%s' bei %s:%d.\n" #: src/testbed/generate-underlay-topology.c:342 -#: src/testbed/gnunet-testbed-profiler.c:284 +#: src/testbed/gnunet-testbed-profiler.c:283 msgid "create COUNT number of peers" msgstr "" @@ -6496,13 +6540,13 @@ msgid "" "deployments" msgstr "" -#: src/testbed/gnunet-daemon-testbed-underlay.c:231 src/testing/list-keys.c:46 -#: src/testing/testing.c:288 src/util/gnunet-ecc.c:298 +#: src/testbed/gnunet-daemon-testbed-underlay.c:233 src/testing/list-keys.c:46 +#: src/testing/testing.c:288 src/util/gnunet-ecc.c:306 #, c-format msgid "Incorrect hostkey file format: %s\n" msgstr "" -#: src/testbed/gnunet-daemon-testbed-underlay.c:469 +#: src/testbed/gnunet-daemon-testbed-underlay.c:471 msgid "Daemon to restrict underlay network in testbed deployments" msgstr "" @@ -6579,11 +6623,11 @@ msgstr "" msgid "Spawning process `%s'\n" msgstr "Ungültige Antwort auf `%s'.\n" -#: src/testbed/gnunet-testbed-profiler.c:290 +#: src/testbed/gnunet-testbed-profiler.c:289 msgid "tolerate COUNT number of continious timeout failures" msgstr "" -#: src/testbed/gnunet-testbed-profiler.c:295 +#: src/testbed/gnunet-testbed-profiler.c:294 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 " @@ -6890,43 +6934,43 @@ msgstr "" msgid "# messages dropped due to slow client" msgstr "" -#: src/transport/gnunet-service-transport.c:809 +#: src/transport/gnunet-service-transport.c:818 msgid "# bytes payload dropped (other peer was not connected)" msgstr "" -#: src/transport/gnunet-service-transport.c:1539 +#: src/transport/gnunet-service-transport.c:1551 msgid "# bytes payload discarded due to not connected peer" msgstr "" -#: src/transport/gnunet-service-transport.c:1699 +#: src/transport/gnunet-service-transport.c:1711 msgid "# bytes total received" msgstr "# Bytes insgesamt empfangen" -#: src/transport/gnunet-service-transport.c:1796 +#: src/transport/gnunet-service-transport.c:1808 msgid "# bytes payload received" msgstr "# Bytes Nutzdaten empfangen" -#: src/transport/gnunet-service-transport.c:2113 -#: src/transport/gnunet-service-transport.c:2585 +#: src/transport/gnunet-service-transport.c:2125 +#: src/transport/gnunet-service-transport.c:2597 msgid "# disconnects due to blacklist" msgstr "" -#: src/transport/gnunet-service-transport.c:2589 +#: src/transport/gnunet-service-transport.c:2601 #, 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:2697 +#: src/transport/gnunet-service-transport.c:2709 #, c-format msgid "Adding blacklisting entry for peer `%s'\n" msgstr "" -#: src/transport/gnunet-service-transport.c:2706 +#: src/transport/gnunet-service-transport.c:2718 #, c-format msgid "Adding blacklisting entry for peer `%s':`%s'\n" msgstr "" -#: src/transport/gnunet-service-transport.c:2771 +#: src/transport/gnunet-service-transport.c:2783 msgid "Transport service is lacking key configuration settings. Exiting.\n" msgstr "" @@ -7067,74 +7111,74 @@ msgstr "# PING Nachrichten erstellt" msgid "SYN request from peer `%s' ignored due impending shutdown\n" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:2620 +#: src/transport/gnunet-service-transport_neighbours.c:2623 msgid "# Attempts to switch addresses" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:3102 +#: src/transport/gnunet-service-transport_neighbours.c:3105 #, fuzzy msgid "# SYN_ACK messages received" msgstr "# SESSION_ACK-Meldungen empfangen" -#: src/transport/gnunet-service-transport_neighbours.c:3110 +#: src/transport/gnunet-service-transport_neighbours.c:3113 #, fuzzy msgid "# unexpected SYN_ACK messages (no peer)" msgstr "# verschlüsselter PONG Nachrichten gesendet" -#: src/transport/gnunet-service-transport_neighbours.c:3128 -#: src/transport/gnunet-service-transport_neighbours.c:3152 +#: src/transport/gnunet-service-transport_neighbours.c:3131 +#: src/transport/gnunet-service-transport_neighbours.c:3155 #, fuzzy msgid "# unexpected SYN_ACK messages (not ready)" msgstr "# verschlüsselter PONG Nachrichten gesendet" -#: src/transport/gnunet-service-transport_neighbours.c:3164 +#: src/transport/gnunet-service-transport_neighbours.c:3167 #, fuzzy msgid "# unexpected SYN_ACK messages (waiting on ATS)" msgstr "# verschlüsselter PONG Nachrichten gesendet" -#: src/transport/gnunet-service-transport_neighbours.c:3189 +#: src/transport/gnunet-service-transport_neighbours.c:3192 msgid "# Successful attempts to switch addresses" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:3202 +#: src/transport/gnunet-service-transport_neighbours.c:3205 #, fuzzy msgid "# unexpected SYN_ACK messages (disconnecting)" msgstr "# verschlüsselter PONG Nachrichten gesendet" -#: src/transport/gnunet-service-transport_neighbours.c:3374 +#: src/transport/gnunet-service-transport_neighbours.c:3377 #, fuzzy msgid "# ACK messages received" msgstr "# CONNECT_ACK-Meldungen empfangen" -#: src/transport/gnunet-service-transport_neighbours.c:3410 +#: src/transport/gnunet-service-transport_neighbours.c:3413 #, fuzzy msgid "# unexpected ACK messages" msgstr "# verschlüsselter PONG Nachrichten gesendet" -#: src/transport/gnunet-service-transport_neighbours.c:3498 +#: src/transport/gnunet-service-transport_neighbours.c:3501 #, fuzzy msgid "# quota messages ignored (malformed)" msgstr "# gap Anfragen verworfen: Kollision in RT" -#: src/transport/gnunet-service-transport_neighbours.c:3505 +#: src/transport/gnunet-service-transport_neighbours.c:3508 #, fuzzy msgid "# QUOTA messages received" msgstr "# verschlüsselter PONG Nachrichten empfangen" -#: src/transport/gnunet-service-transport_neighbours.c:3545 +#: src/transport/gnunet-service-transport_neighbours.c:3548 msgid "# disconnect messages ignored (malformed)" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:3552 +#: src/transport/gnunet-service-transport_neighbours.c:3555 #, fuzzy msgid "# DISCONNECT messages received" msgstr "# verschlüsselter PONG Nachrichten empfangen" -#: src/transport/gnunet-service-transport_neighbours.c:3563 +#: src/transport/gnunet-service-transport_neighbours.c:3566 msgid "# disconnect messages ignored (timestamp)" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:3697 +#: src/transport/gnunet-service-transport_neighbours.c:3700 msgid "# disconnected from peer upon explicit request" msgstr "" @@ -7168,8 +7212,8 @@ msgstr "" #: src/transport/gnunet-service-transport_validation.c:491 #: src/transport/gnunet-service-transport_validation.c:677 -#: src/transport/gnunet-service-transport_validation.c:988 -#: src/transport/gnunet-service-transport_validation.c:1590 +#: src/transport/gnunet-service-transport_validation.c:997 +#: src/transport/gnunet-service-transport_validation.c:1609 #, fuzzy msgid "# validations running" msgstr "Sqlite-Datenbank läuft\n" @@ -7196,58 +7240,58 @@ msgstr "" msgid "# address revalidations started" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1114 +#: src/transport/gnunet-service-transport_validation.c:1123 #, fuzzy msgid "# PING message for different peer received" msgstr "# PING Nachrichten erstellt" -#: src/transport/gnunet-service-transport_validation.c:1165 +#: src/transport/gnunet-service-transport_validation.c:1174 #, c-format msgid "Plugin `%s' not available, cannot confirm having this address\n" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1178 +#: src/transport/gnunet-service-transport_validation.c:1187 msgid "# failed address checks during validation" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1181 +#: src/transport/gnunet-service-transport_validation.c:1190 #, c-format msgid "Address `%s' is not one of my addresses, not confirming PING\n" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1189 +#: src/transport/gnunet-service-transport_validation.c:1198 msgid "# successful address checks during validation" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1202 +#: src/transport/gnunet-service-transport_validation.c:1211 #, c-format msgid "" "Not confirming PING from peer `%s' with address `%s' since I cannot confirm " "having this address.\n" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1257 +#: src/transport/gnunet-service-transport_validation.c:1266 #, c-format msgid "Failed to create PONG signature for peer `%s'\n" msgstr "PONG-Signatur für Knoten »%s« konnte nicht erstellt werden\n" -#: src/transport/gnunet-service-transport_validation.c:1308 +#: src/transport/gnunet-service-transport_validation.c:1317 msgid "# PONGs unicast via reliable transport" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1317 +#: src/transport/gnunet-service-transport_validation.c:1326 msgid "# PONGs multicast to all available addresses" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1480 +#: src/transport/gnunet-service-transport_validation.c:1499 msgid "# PONGs dropped, no matching pending validation" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1498 +#: src/transport/gnunet-service-transport_validation.c:1517 msgid "# PONGs dropped, signature expired" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1553 +#: src/transport/gnunet-service-transport_validation.c:1572 msgid "# validations succeeded" msgstr "" @@ -7429,8 +7473,8 @@ msgid "message size to use" msgstr "" #: src/transport/plugin_transport_http_client.c:1474 -#: src/transport/plugin_transport_http_server.c:2249 -#: src/transport/plugin_transport_http_server.c:3463 +#: src/transport/plugin_transport_http_server.c:2312 +#: src/transport/plugin_transport_http_server.c:3526 #: src/transport/plugin_transport_tcp.c:3890 #: src/transport/plugin_transport_tcp.c:3897 msgid "TCP_STEALTH not supported on this platform.\n" @@ -7442,13 +7486,13 @@ msgid "Could not initialize curl multi handle, failed to start %s plugin!\n" msgstr "" #: src/transport/plugin_transport_http_client.c:2164 -#: src/transport/plugin_transport_http_server.c:3178 +#: src/transport/plugin_transport_http_server.c:3241 #, fuzzy, c-format msgid "Shutting down plugin `%s'\n" msgstr "Collection `%s' begonnen.\n" #: src/transport/plugin_transport_http_client.c:2181 -#: src/transport/plugin_transport_http_server.c:3248 +#: src/transport/plugin_transport_http_server.c:3311 #, fuzzy, c-format msgid "Shutdown for plugin `%s' complete\n" msgstr "GNUnet wurde erfolgreich heruntergefahren.\n" @@ -7458,103 +7502,103 @@ msgstr "GNUnet wurde erfolgreich heruntergefahren.\n" msgid "Maximum number of requests is %u\n" msgstr "Maximale Anzahl der Verbindungen ist %u\n" -#: src/transport/plugin_transport_http_server.c:1727 +#: src/transport/plugin_transport_http_server.c:1756 #, c-format msgid "" "Access from connection %p (%u of %u) for `%s' `%s' url `%s' with upload data " "size %u\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:1967 +#: src/transport/plugin_transport_http_server.c:2028 #, c-format msgid "Accepting connection (%u of %u) from `%s'\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:1975 +#: src/transport/plugin_transport_http_server.c:2036 #, c-format msgid "" "Server reached maximum number connections (%u), rejecting new connection\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:2125 +#: src/transport/plugin_transport_http_server.c:2186 msgid "" "Could not create a new TLS certificate, program `gnunet-transport-" "certificate-creation' could not be started!\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:2148 +#: src/transport/plugin_transport_http_server.c:2209 #, c-format msgid "No usable TLS certificate found and creating one at `%s/%s' failed!\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:2275 +#: src/transport/plugin_transport_http_server.c:2338 msgid "Could not load or create server certificate! Loading plugin failed!\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:2587 +#: src/transport/plugin_transport_http_server.c:2650 msgid "Require valid port number for service in configuration!\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:2752 +#: src/transport/plugin_transport_http_server.c:2815 #, c-format msgid "Found %u addresses to report to NAT service\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:2838 +#: src/transport/plugin_transport_http_server.c:2901 #: src/transport/plugin_transport_udp.c:3622 msgid "Disabling IPv6 since it is not supported on this system!\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:2944 +#: src/transport/plugin_transport_http_server.c:3007 #, c-format msgid "IPv4 support is %s\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:2959 +#: src/transport/plugin_transport_http_server.c:3022 #, c-format msgid "IPv6 support is %s\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:2965 +#: src/transport/plugin_transport_http_server.c:3028 msgid "Neither IPv4 nor IPv6 are enabled! Fix in configuration\n" msgstr "" "Weder IPv4 noch IPv6 sind aktiviert! Bearbeiten Sie die Konfiguration\n" -#: src/transport/plugin_transport_http_server.c:2976 +#: src/transport/plugin_transport_http_server.c:3039 msgid "Port is required! Fix in configuration\n" msgstr "Port ist erforderlich! Bearbeiten Sie die Konfiguration\n" -#: src/transport/plugin_transport_http_server.c:2982 +#: src/transport/plugin_transport_http_server.c:3045 #, c-format msgid "Using port %u\n" msgstr "Port %u wird verwendet\n" -#: src/transport/plugin_transport_http_server.c:3001 +#: src/transport/plugin_transport_http_server.c:3064 #, c-format msgid "Specific IPv4 address `%s' in configuration file is invalid!\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:3036 +#: src/transport/plugin_transport_http_server.c:3099 #, c-format msgid "Specific IPv6 address `%s' in configuration file is invalid!\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:3111 +#: src/transport/plugin_transport_http_server.c:3174 #, c-format msgid "Using external hostname `%s'\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:3132 +#: src/transport/plugin_transport_http_server.c:3195 #, fuzzy, c-format msgid "Notifying transport only about hostname `%s'\n" msgstr "Teste Transport(e) %s\n" -#: src/transport/plugin_transport_http_server.c:3149 +#: src/transport/plugin_transport_http_server.c:3212 #, c-format msgid "Maximum number of connections is %u\n" msgstr "Maximale Anzahl der Verbindungen ist %u\n" -#: src/transport/plugin_transport_http_server.c:3475 +#: src/transport/plugin_transport_http_server.c:3538 msgid "Unable to compile URL regex\n" msgstr "" @@ -7875,7 +7919,7 @@ msgid "" "`GNUNET_SERVER_receive_done' after %s\n" msgstr "" -#: src/transport/tcp_service_legacy.c:339 src/util/service.c:2337 +#: src/transport/tcp_service_legacy.c:339 src/util/service.c:2346 #, c-format msgid "Unknown address family %d\n" msgstr "" @@ -7920,51 +7964,51 @@ msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n" msgid "Service `%s' runs at %s\n" msgstr "Dienst »%s« läuft auf %s\n" -#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:1501 +#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:1500 msgid "Service process failed to initialize\n" msgstr "" -#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:1505 +#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:1504 msgid "Service process could not initialize server function\n" msgstr "" -#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:1509 +#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:1508 msgid "Service process failed to report status\n" msgstr "" #: src/transport/tcp_service_legacy.c:1313 src/util/disk.c:1488 -#: src/util/service.c:1379 +#: src/util/service.c:1378 #, fuzzy, c-format msgid "Cannot obtain information about user `%s': %s\n" msgstr "Fehler beim Speichern der Konfigurationsdatei: `%s': %s.\n" -#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1381 +#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1380 msgid "No such user" msgstr "" -#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1400 +#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1399 #, c-format msgid "Cannot change user/group to `%s': %s\n" msgstr "Benutzer/Gruppe kann nicht zu »%s« geändert werden: %s\n" -#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:1728 +#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:1727 msgid "do daemonize (detach from terminal)" msgstr "" -#: src/transport/tcp_service_legacy.c:1448 src/util/program.c:244 -#: src/util/service.c:1791 +#: src/transport/tcp_service_legacy.c:1448 src/util/program.c:255 +#: src/util/service.c:1790 #, fuzzy, c-format msgid "Malformed configuration file `%s', exit ...\n" msgstr "Konfigurationsdatei `%s' wurde erzeugt.\n" -#: src/transport/tcp_service_legacy.c:1458 src/util/program.c:261 -#: src/util/service.c:1802 +#: src/transport/tcp_service_legacy.c:1458 src/util/program.c:272 +#: src/util/service.c:1801 #, fuzzy msgid "Malformed configuration, exit ...\n" msgstr "GNUnet Konfiguration" -#: src/transport/tcp_service_legacy.c:1463 src/util/program.c:256 -#: src/util/service.c:1808 +#: src/transport/tcp_service_legacy.c:1463 src/util/program.c:267 +#: src/util/service.c:1807 #, fuzzy, c-format msgid "Could not access configuration file `%s'\n" msgstr "Konfigurationsdatei `%s' konnte nicht geparst werden.\n" @@ -8003,60 +8047,60 @@ msgstr "" msgid "Metadata `%s' failed to deserialize" msgstr "" -#: src/util/client.c:882 +#: src/util/client.c:911 #, c-format msgid "Need a non-empty hostname for service `%s'.\n" msgstr "" -#: src/util/common_logging.c:256 src/util/common_logging.c:1129 +#: src/util/common_logging.c:259 src/util/common_logging.c:1132 msgid "DEBUG" msgstr "DEBUG" -#: src/util/common_logging.c:258 src/util/common_logging.c:1127 +#: src/util/common_logging.c:261 src/util/common_logging.c:1130 msgid "INFO" msgstr "INFO" -#: src/util/common_logging.c:260 src/util/common_logging.c:1125 +#: src/util/common_logging.c:263 src/util/common_logging.c:1128 msgid "MESSAGE" msgstr "" -#: src/util/common_logging.c:262 src/util/common_logging.c:1123 +#: src/util/common_logging.c:265 src/util/common_logging.c:1126 msgid "WARNING" msgstr "WARNUNG" -#: src/util/common_logging.c:264 src/util/common_logging.c:1121 +#: src/util/common_logging.c:267 src/util/common_logging.c:1124 msgid "ERROR" msgstr "FEHLER" -#: src/util/common_logging.c:266 src/util/common_logging.c:1131 +#: src/util/common_logging.c:269 src/util/common_logging.c:1134 msgid "NONE" msgstr "" -#: src/util/common_logging.c:879 +#: src/util/common_logging.c:882 #, c-format msgid "Message `%.*s' repeated %u times in the last %s\n" msgstr "" -#: src/util/common_logging.c:1132 +#: src/util/common_logging.c:1135 msgid "INVALID" msgstr "" -#: src/util/common_logging.c:1302 +#: src/util/common_logging.c:1326 msgid "unknown address" msgstr "Unbekannte Adresse" -#: src/util/common_logging.c:1344 +#: src/util/common_logging.c:1368 msgid "invalid address" msgstr "Ungültige Adresse" -#: src/util/common_logging.c:1362 +#: src/util/common_logging.c:1386 #, fuzzy, c-format msgid "Configuration fails to specify option `%s' in section `%s'!\n" msgstr "" "Die Konfigurationsdatei muss in der Sektion `%s' unter `%s' ein Verzeichnis " "angeben, in dem FS Daten gespeichert werden.\n" -#: src/util/common_logging.c:1383 +#: src/util/common_logging.c:1407 #, fuzzy, c-format msgid "" "Configuration specifies invalid value for option `%s' in section `%s': %s\n" @@ -8064,34 +8108,34 @@ msgstr "" "Die Konfigurationsdatei muss in der Sektion `%s' unter `%s' ein Verzeichnis " "angeben, in dem FS Daten gespeichert werden.\n" -#: src/util/configuration.c:286 +#: src/util/configuration.c:296 #, fuzzy, c-format msgid "Syntax error while deserializing in line %u\n" msgstr "Syntaxfehler in Konfigurationsdatei `%s' in Zeile %d.\n" -#: src/util/configuration.c:344 +#: src/util/configuration.c:355 #, fuzzy, c-format msgid "Error while reading file `%s'\n" msgstr "Konfigurationsdatei `%s' konnte nicht geöffnet werden.\n" -#: src/util/configuration.c:1017 +#: src/util/configuration.c:1034 #, c-format msgid "" "Configuration value '%s' for '%s' in section '%s' is not in set of legal " "choices\n" msgstr "" -#: src/util/configuration.c:1136 +#: src/util/configuration.c:1153 #, c-format msgid "Recursive expansion suspected, aborting $-expansion for term `%s'\n" msgstr "" -#: src/util/configuration.c:1169 +#: src/util/configuration.c:1186 #, c-format msgid "Missing closing `%s' in option `%s'\n" msgstr "" -#: src/util/configuration.c:1237 +#: src/util/configuration.c:1254 #, c-format msgid "" "Failed to expand `%s' in `%s' as it is neither found in [PATHS] nor defined " @@ -8105,52 +8149,52 @@ msgid "" "%llu)\n" msgstr "" -#: src/util/crypto_ecc.c:777 +#: src/util/crypto_ecc.c:810 #, fuzzy, c-format msgid "ECC signing failed at %s:%d: %s\n" msgstr "`%s' schlug fehl bei %s:%d mit dem Fehler: `%s'.\n" -#: src/util/crypto_ecc.c:827 +#: src/util/crypto_ecc.c:860 #, fuzzy, c-format msgid "EdDSA signing failed at %s:%d: %s\n" msgstr "`%s' schlug fehl bei %s:%d mit dem Fehler: `%s'.\n" -#: src/util/crypto_ecc.c:901 +#: src/util/crypto_ecc.c:934 #, fuzzy, c-format msgid "ECDSA signature verification failed at %s:%d: %s\n" msgstr "RSA Signaturüberprüfung fehlgeschlagen bei %s:%d: %s\n" -#: src/util/crypto_ecc.c:958 +#: src/util/crypto_ecc.c:991 #, fuzzy, c-format msgid "EdDSA signature verification failed at %s:%d: %s\n" msgstr "RSA Signaturüberprüfung fehlgeschlagen bei %s:%d: %s\n" -#: src/util/crypto_ecc_setup.c:122 src/util/crypto_ecc_setup.c:160 -#: src/util/crypto_ecc_setup.c:278 src/util/crypto_ecc_setup.c:316 +#: src/util/crypto_ecc_setup.c:122 src/util/crypto_ecc_setup.c:161 +#: src/util/crypto_ecc_setup.c:279 src/util/crypto_ecc_setup.c:317 #, fuzzy, c-format msgid "Could not acquire lock on file `%s': %s...\n" msgstr "PID konnte nicht in Datei `%s' geschrieben werden: %s.\n" -#: src/util/crypto_ecc_setup.c:127 src/util/crypto_ecc_setup.c:283 +#: src/util/crypto_ecc_setup.c:128 src/util/crypto_ecc_setup.c:284 #, fuzzy msgid "Creating a new private key. This may take a while.\n" msgstr "Ein neuer Hostkey wird erzeugt (dies kann eine Weile dauern).\n" -#: src/util/crypto_ecc_setup.c:164 src/util/crypto_ecc_setup.c:320 +#: src/util/crypto_ecc_setup.c:165 src/util/crypto_ecc_setup.c:322 msgid "This may be ok if someone is currently generating a private key.\n" msgstr "" -#: src/util/crypto_ecc_setup.c:194 src/util/crypto_ecc_setup.c:350 +#: src/util/crypto_ecc_setup.c:195 src/util/crypto_ecc_setup.c:352 #, c-format msgid "" "When trying to read key file `%s' I found %u bytes but I need at least %u.\n" msgstr "" -#: src/util/crypto_ecc_setup.c:198 src/util/crypto_ecc_setup.c:354 +#: src/util/crypto_ecc_setup.c:199 src/util/crypto_ecc_setup.c:356 msgid "This may be ok if someone is currently generating a key.\n" msgstr "" -#: src/util/crypto_ecc_setup.c:413 +#: src/util/crypto_ecc_setup.c:415 #, fuzzy msgid "Could not load peer's private key\n" msgstr "Anwendung `%s' konnte nicht initialisiert werden.\n" @@ -8344,22 +8388,22 @@ msgstr "" msgid "Manipulate GNUnet configuration files" msgstr "GNUnet-Konfigurationsdateien bearbeiten" -#: src/util/gnunet-ecc.c:84 +#: src/util/gnunet-ecc.c:94 #, c-format msgid "Failed to open `%s': %s\n" msgstr "»%s« kann nicht geöffnet werden: %s\n" -#: src/util/gnunet-ecc.c:120 +#: src/util/gnunet-ecc.c:130 #, c-format msgid "Generating %u keys like %s, please wait" msgstr "" -#: src/util/gnunet-ecc.c:133 +#: src/util/gnunet-ecc.c:143 #, c-format msgid "Generating %u keys, please wait" msgstr "" -#: src/util/gnunet-ecc.c:174 +#: src/util/gnunet-ecc.c:184 #, c-format msgid "" "\n" @@ -8368,7 +8412,7 @@ msgstr "" "\n" "Schreiben in »%s« nicht möglich: %s\n" -#: src/util/gnunet-ecc.c:184 +#: src/util/gnunet-ecc.c:194 #, c-format msgid "" "\n" @@ -8377,53 +8421,61 @@ msgstr "" "\n" "Abgeschlossen!\n" -#: src/util/gnunet-ecc.c:187 +#: src/util/gnunet-ecc.c:197 #, c-format msgid "" "\n" "Error, %u keys not generated\n" msgstr "" -#: src/util/gnunet-ecc.c:280 +#: src/util/gnunet-ecc.c:288 #, fuzzy, c-format msgid "Hostkeys file `%s' not found\n" msgstr "Kommando `%s' wurde nicht gefunden!\n" -#: src/util/gnunet-ecc.c:291 +#: src/util/gnunet-ecc.c:299 #, c-format msgid "Hostkeys file `%s' is empty\n" msgstr "" -#: src/util/gnunet-ecc.c:313 +#: src/util/gnunet-ecc.c:321 #, fuzzy, c-format msgid "Could not read hostkey file: %s\n" msgstr "PID konnte nicht in Datei `%s' geschrieben werden: %s.\n" -#: src/util/gnunet-ecc.c:364 +#: src/util/gnunet-ecc.c:372 msgid "No hostkey file specified on command line\n" msgstr "" -#: src/util/gnunet-ecc.c:416 +#: src/util/gnunet-ecc.c:437 msgid "list keys included in a file (for testing)" msgstr "" -#: src/util/gnunet-ecc.c:421 +#: src/util/gnunet-ecc.c:442 msgid "number of keys to list included in a file (for testing)" msgstr "" -#: src/util/gnunet-ecc.c:426 +#: src/util/gnunet-ecc.c:447 msgid "create COUNT public-private key pairs (for testing)" msgstr "" -#: src/util/gnunet-ecc.c:430 +#: src/util/gnunet-ecc.c:451 msgid "print the public key in ASCII format" msgstr "" -#: src/util/gnunet-ecc.c:434 +#: src/util/gnunet-ecc.c:455 +msgid "print the private key in ASCII format" +msgstr "" + +#: src/util/gnunet-ecc.c:459 +msgid "print the public key in HEX format" +msgstr "" + +#: src/util/gnunet-ecc.c:463 msgid "print examples of ECC operations (used for compatibility testing)" msgstr "" -#: src/util/gnunet-ecc.c:449 +#: src/util/gnunet-ecc.c:479 msgid "Manipulate GNUnet private ECC key files" msgstr "" @@ -8515,7 +8567,7 @@ msgstr "Verbindung zu %u.%u.%u.%u:%u fehlgeschlagen: %s\n" msgid "Unable to shorten unix path `%s' while keeping name unique\n" msgstr "" -#: src/util/network.c:1793 src/util/network.c:1969 +#: src/util/network.c:1793 src/util/network.c:1977 #, c-format msgid "" "Fatal internal logic error, process hangs in `%s' (abort with CTRL-C)!\n" @@ -8569,7 +8621,7 @@ 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/resolver_api.c:204 +#: src/util/resolver_api.c:203 #, c-format msgid "" "Missing `%s' for `%s' in configuration, DNS resolution will be unavailable.\n" @@ -8584,33 +8636,33 @@ msgstr "" "Sie müssen für `%s' in der Sektion `%s' der Konfigurationsdatei eine " "positive Zahl angeben.\n" -#: src/util/resolver_api.c:815 +#: src/util/resolver_api.c:827 #, fuzzy, c-format msgid "Timeout trying to resolve hostname `%s'.\n" msgstr "Fehler beim Lesen der Freunde-Liste von `%s'\n" -#: src/util/resolver_api.c:827 +#: src/util/resolver_api.c:840 #, c-format msgid "Timeout trying to resolve IP address `%s'.\n" msgstr "" -#: src/util/resolver_api.c:1004 +#: src/util/resolver_api.c:1024 #, fuzzy msgid "Resolver not configured correctly.\n" msgstr "Standarddienst »%s« ist nicht korrekt eingerichtet!\n" -#: src/util/resolver_api.c:1086 src/util/resolver_api.c:1107 -#: src/util/resolver_api.c:1121 +#: src/util/resolver_api.c:1110 src/util/resolver_api.c:1133 +#: src/util/resolver_api.c:1147 #, fuzzy, c-format msgid "Could not resolve our FQDN: %s\n" msgstr "`%s' konnte nicht aufgelöst werden: %s\n" -#: src/util/service.c:1306 +#: src/util/service.c:1305 msgid "" "Could not bind to any of the ports I was supposed to, refusing to run!\n" msgstr "" -#: src/util/service.c:2082 +#: src/util/service.c:2091 #, c-format msgid "" "Processing code for message of type %u did not call " @@ -8685,63 +8737,63 @@ msgstr "Tage" msgid "end of time" msgstr "" -#: src/util/strings.c:1269 +#: src/util/strings.c:1270 msgid "IPv6 address did not start with `['\n" msgstr "IPv6-Adresse beginnt nicht mit »[«\n" -#: src/util/strings.c:1277 +#: src/util/strings.c:1278 msgid "IPv6 address did contain ':' to separate port number\n" msgstr "IPv6-Adresse enthält kein »:« zur Abtrennung der Portnummer\n" -#: src/util/strings.c:1283 +#: src/util/strings.c:1284 msgid "IPv6 address did contain ']' before ':' to separate port number\n" msgstr "IPv6-Adresse enthält kein »]« vor »:« zur Abtrennung der Portnummer\n" -#: src/util/strings.c:1290 +#: src/util/strings.c:1291 msgid "IPv6 address did contain a valid port number after the last ':'\n" msgstr "IPv6-Adresse enthält keine gültige Portnummer nach dem letzten »:«\n" -#: src/util/strings.c:1299 +#: src/util/strings.c:1300 #, fuzzy, c-format msgid "Invalid IPv6 address `%s': %s\n" msgstr "Ungültige Antwort auf `%s' von `%s'\n" -#: src/util/strings.c:1571 src/util/strings.c:1587 +#: src/util/strings.c:1572 src/util/strings.c:1588 msgid "Port not in range\n" msgstr "Port außerhalb des Bereichs\n" -#: src/util/strings.c:1596 +#: src/util/strings.c:1597 #, c-format msgid "Malformed port policy `%s'\n" msgstr "" -#: src/util/strings.c:1679 src/util/strings.c:1710 src/util/strings.c:1758 -#: src/util/strings.c:1779 +#: src/util/strings.c:1680 src/util/strings.c:1711 src/util/strings.c:1759 +#: src/util/strings.c:1780 #, c-format msgid "Invalid format for IP: `%s'\n" msgstr "Ungültiges Format für IP: »%s«\n" -#: src/util/strings.c:1736 +#: src/util/strings.c:1737 #, c-format msgid "Invalid network notation ('/%d' is not legal in IPv4 CIDR)." msgstr "Ungültige Netzwerk-Notation ('/%d ist nicht gültig in IPv4 CIDR)." -#: src/util/strings.c:1788 +#: src/util/strings.c:1789 #, fuzzy, c-format msgid "Invalid format: `%s'\n" msgstr "Ungültiges Format für IP: `%s'\n" -#: src/util/strings.c:1840 +#: src/util/strings.c:1841 #, c-format msgid "Invalid network notation (does not end with ';': `%s')\n" msgstr "Ungültige Netzwerk-Notation (endet nicht mit »;«: »%s«)\n" -#: src/util/strings.c:1890 +#: src/util/strings.c:1891 #, fuzzy, c-format msgid "Wrong format `%s' for netmask\n" msgstr "Falsches Format `%s' für Netzmaske: %s\n" -#: src/util/strings.c:1921 +#: src/util/strings.c:1922 #, fuzzy, c-format msgid "Wrong format `%s' for network\n" msgstr "Falsches Format `%s' für Netzwerk: %s\n" @@ -8793,65 +8845,65 @@ msgstr "" msgid "# ICMPv6 packets dropped (not allowed)" msgstr "" -#: src/vpn/gnunet-service-vpn.c:2232 +#: src/vpn/gnunet-service-vpn.c:2235 #, fuzzy msgid "# Packets received from TUN interface" msgstr "" "Die Formatüberprüfung des Pakets, das von %s:%d (UDP6) empfangen wurde, " "schlug fehl." -#: src/vpn/gnunet-service-vpn.c:2265 src/vpn/gnunet-service-vpn.c:2301 +#: src/vpn/gnunet-service-vpn.c:2268 src/vpn/gnunet-service-vpn.c:2304 #, c-format msgid "Packet received for unmapped destination `%s' (dropping it)\n" msgstr "" -#: src/vpn/gnunet-service-vpn.c:2311 +#: src/vpn/gnunet-service-vpn.c:2314 msgid "Received IPv4 packet with options (dropping it)\n" msgstr "" -#: src/vpn/gnunet-service-vpn.c:2325 +#: src/vpn/gnunet-service-vpn.c:2328 #, c-format msgid "Received packet of unknown protocol %d from TUN (dropping it)\n" msgstr "" -#: src/vpn/gnunet-service-vpn.c:2364 +#: src/vpn/gnunet-service-vpn.c:2367 msgid "Failed to find unallocated IPv4 address in VPN's range\n" msgstr "" -#: src/vpn/gnunet-service-vpn.c:2419 +#: src/vpn/gnunet-service-vpn.c:2422 #, fuzzy msgid "Failed to find unallocated IPv6 address in VPN's range\n" msgstr "Die öffentliche IPv6-Adresse konnte nicht ermittelt werden!\n" -#: src/vpn/gnunet-service-vpn.c:2461 src/vpn/gnunet-service-vpn.c:2683 +#: src/vpn/gnunet-service-vpn.c:2464 src/vpn/gnunet-service-vpn.c:2686 msgid "# Active destinations" msgstr "" -#: src/vpn/gnunet-service-vpn.c:2732 +#: src/vpn/gnunet-service-vpn.c:2735 msgid "Failed to allocate IP address for new destination\n" msgstr "" -#: src/vpn/gnunet-service-vpn.c:2995 +#: src/vpn/gnunet-service-vpn.c:2998 msgid "Must specify valid IPv6 address" msgstr "" -#: src/vpn/gnunet-service-vpn.c:3019 +#: src/vpn/gnunet-service-vpn.c:3022 msgid "Must specify valid IPv6 mask" msgstr "" -#: src/vpn/gnunet-service-vpn.c:3027 +#: src/vpn/gnunet-service-vpn.c:3030 msgid "IPv6 support disabled as this system does not support IPv6\n" msgstr "" -#: src/vpn/gnunet-service-vpn.c:3040 +#: src/vpn/gnunet-service-vpn.c:3043 msgid "Must specify valid IPv4 address" msgstr "" -#: src/vpn/gnunet-service-vpn.c:3053 +#: src/vpn/gnunet-service-vpn.c:3056 msgid "Must specify valid IPv4 mask" msgstr "" -#: src/vpn/gnunet-service-vpn.c:3063 +#: src/vpn/gnunet-service-vpn.c:3066 msgid "IPv4 support disabled as this system does not support IPv4\n" msgstr "" @@ -8920,28 +8972,40 @@ msgstr "Dienst wird über UDP angeboten" msgid "Setup tunnels via VPN." msgstr "Tunnel über VPN einrichten." -#: src/zonemaster/gnunet-service-zonemaster.c:705 +#: src/zonemaster/gnunet-service-zonemaster.c:706 #, fuzzy msgid "Failed to connect to the namestore!\n" msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n" -#: src/include/gnunet_common.h:674 src/include/gnunet_common.h:681 -#: src/include/gnunet_common.h:691 src/include/gnunet_common.h:699 +#: src/include/gnunet_common.h:689 src/include/gnunet_common.h:696 +#: src/include/gnunet_common.h:706 src/include/gnunet_common.h:714 #, fuzzy, c-format msgid "Assertion failed at %s:%d.\n" msgstr "`%s' schlug fehl bei %s:%d mit dem Fehler: `%s'.\n" -#: src/include/gnunet_common.h:711 +#: src/include/gnunet_common.h:726 #, fuzzy, c-format msgid "External protocol violation detected at %s:%d.\n" msgstr "Protokollverletzung auf Socket. Kommando erwartet.\n" -#: src/include/gnunet_common.h:738 src/include/gnunet_common.h:747 +#: src/include/gnunet_common.h:753 src/include/gnunet_common.h:762 #, fuzzy, c-format msgid "`%s' failed on file `%s' at %s:%d with error: %s\n" msgstr "`%s' schlug bei Datei `%s' fehl. Ort: %s:%d. Fehler: %s\n" #, fuzzy +#~ msgid "Failed to create indices\n" +#~ msgstr "Zustellung der Nachricht `%s' fehlgeschlagen.\n" + +#, fuzzy +#~ msgid "`%s:%s' failed at %s:%d with error: %s\n" +#~ msgstr "`%s' schlug bei %s:%d mit dem Fehler %s fehl\n" + +#, fuzzy +#~ msgid "Unable to connect to Postgres database '%s': %s\n" +#~ msgstr "Fehler beim Anlegen des Benutzerkontos:" + +#, fuzzy #~ msgid "Misconfiguration (can not connect to the ARM service)" #~ msgstr "" #~ "Konfiguration oder die GNUnet Version hat sich geändert. Sie müssen `%s' " @@ -9054,10 +9118,6 @@ msgstr "`%s' schlug bei Datei `%s' fehl. Ort: %s:%d. Fehler: %s\n" #~ msgstr "# Klartext PONG Nachrichten empfangen" #, fuzzy -#~ msgid "# bytes sent to datastore" -#~ msgstr "# bytes in der Datenbank" - -#, fuzzy #~ msgid "Failed to receive status response from database." #~ msgstr "" #~ "\n" @@ -9282,10 +9342,6 @@ msgstr "`%s' schlug bei Datei `%s' fehl. Ort: %s:%d. Fehler: %s\n" #~ msgstr "Fehler beim Senden einer `%s' Anfrage an den SMTP Server.\n" #, fuzzy -#~ msgid "Error reading sensor version\n" -#~ msgstr "Fehler beim Anlegen des Benutzers" - -#, fuzzy #~ msgid "Error reading sensor category\n" #~ msgstr "Fehler beim Anlegen des Benutzers" diff --git a/po/es.po b/po/es.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: gnunet 0.9.5a\n" "Report-Msgid-Bugs-To: gnunet-developers@mail.gnu.org\n" -"POT-Creation-Date: 2017-03-31 19:22-0500\n" +"POT-Creation-Date: 2018-01-02 02:33+0100\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" @@ -255,7 +255,7 @@ msgstr "" "configuración!\n" #: src/arm/gnunet-service-arm.c:430 src/transport/plugin_transport_tcp.c:1176 -#: src/transport/tcp_service_legacy.c:613 src/util/client.c:480 +#: src/transport/tcp_service_legacy.c:613 src/util/client.c:505 #: src/util/service.c:682 #, c-format msgid "UNIXPATH `%s' too long, maximum length is %llu\n" @@ -263,7 +263,7 @@ msgstr "" "La ruta tipo UNIX «%s» es demasiado larga, la longitud máxima es %llu\n" #: src/arm/gnunet-service-arm.c:434 src/transport/plugin_transport_tcp.c:1180 -#: src/transport/tcp_service_legacy.c:617 src/util/client.c:485 +#: src/transport/tcp_service_legacy.c:617 src/util/client.c:510 #: src/util/service.c:687 #, c-format msgid "Using `%s' instead\n" @@ -288,7 +288,7 @@ msgstr "" "uno es necesario\n" #: src/arm/gnunet-service-arm.c:513 -#: src/transport/plugin_transport_http_server.c:2621 +#: src/transport/plugin_transport_http_server.c:2684 #: src/transport/plugin_transport_tcp.c:1259 #: src/transport/tcp_service_legacy.c:696 src/util/service.c:782 #, c-format @@ -296,7 +296,7 @@ msgid "Failed to resolve `%s': %s\n" msgstr "Se produjo un fallo al resolver «%s»: %s\n" #: src/arm/gnunet-service-arm.c:532 -#: src/transport/plugin_transport_http_server.c:2639 +#: src/transport/plugin_transport_http_server.c:2702 #: src/transport/plugin_transport_tcp.c:1278 #: src/transport/tcp_service_legacy.c:715 src/util/service.c:802 #, c-format @@ -403,14 +403,12 @@ 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:3294 -#: src/ats-tests/gnunet-solver-eval.c:939 +#: src/ats/gnunet-ats-solver-eval.c:3294 src/ats-tests/gnunet-solver-eval.c:939 #, fuzzy msgid "solver to use" msgstr "valor a establecer" -#: src/ats/gnunet-ats-solver-eval.c:3299 -#: src/ats-tests/gnunet-solver-eval.c:945 +#: src/ats/gnunet-ats-solver-eval.c:3299 src/ats-tests/gnunet-solver-eval.c:945 #: src/ats-tests/gnunet-solver-eval.c:950 msgid "experiment to use" msgstr "" @@ -730,58 +728,58 @@ msgstr "texto de ayuda" msgid "Invalid peer ID `%s'\n" msgstr "URI no válida: «%s»\n" -#: src/cadet/gnunet-cadet.c:702 +#: src/cadet/gnunet-cadet.c:703 #, fuzzy, c-format msgid "Invalid tunnel owner `%s'\n" msgstr "Formato de tiempo no válido «%s»\n" -#: src/cadet/gnunet-cadet.c:775 +#: src/cadet/gnunet-cadet.c:776 msgid "Extra arguments are not applicable in combination with this option.\n" msgstr "" -#: src/cadet/gnunet-cadet.c:866 +#: src/cadet/gnunet-cadet.c:867 #, fuzzy, c-format msgid "Invalid target `%s'\n" msgstr "Parámetro no válido «%s»\n" -#: src/cadet/gnunet-cadet.c:903 +#: src/cadet/gnunet-cadet.c:904 #, fuzzy msgid "No action requested\n" msgstr "Colección detenida.\n" -#: src/cadet/gnunet-cadet.c:928 +#: src/cadet/gnunet-cadet.c:929 #, fuzzy msgid "Provide information about a particular connection" msgstr "proveer información acerca de un túnel en particular" -#: src/cadet/gnunet-cadet.c:933 +#: src/cadet/gnunet-cadet.c:934 msgid "Activate echo mode" msgstr "" -#: src/cadet/gnunet-cadet.c:938 +#: src/cadet/gnunet-cadet.c:939 msgid "Dump debug information to STDERR" msgstr "" -#: src/cadet/gnunet-cadet.c:944 +#: src/cadet/gnunet-cadet.c:945 msgid "Listen for connections using a shared secret among sender and recipient" msgstr "" -#: src/cadet/gnunet-cadet.c:951 +#: src/cadet/gnunet-cadet.c:952 #, fuzzy msgid "Provide information about a patricular peer" msgstr "proveer información acerca de un túnel en particular" -#: src/cadet/gnunet-cadet.c:957 +#: src/cadet/gnunet-cadet.c:958 #, fuzzy msgid "Provide information about all peers" msgstr "proveer información acerca de un túnel en particular" -#: src/cadet/gnunet-cadet.c:963 +#: src/cadet/gnunet-cadet.c:964 #, fuzzy msgid "Provide information about a particular tunnel" msgstr "proveer información acerca de un túnel en particular" -#: src/cadet/gnunet-cadet.c:969 +#: src/cadet/gnunet-cadet.c:970 #, fuzzy msgid "Provide information about all tunnels" msgstr "proveer información acerca de un túnel en particular" @@ -1115,7 +1113,7 @@ msgid "" msgstr "" #: src/conversation/gnunet_gst.c:622 -#: src/conversation/gnunet-helper-audio-playback-gst.c:356 +#: src/conversation/gnunet-helper-audio-playback-gst.c:361 #, c-format msgid "Read error from STDIN: %d %s\n" msgstr "" @@ -1125,64 +1123,64 @@ msgstr "" msgid "pa_stream_write() failed: %s\n" msgstr "stadísticas (%s) falló: %s\n" -#: src/conversation/gnunet-helper-audio-playback.c:607 +#: src/conversation/gnunet-helper-audio-playback.c:612 msgid "gnunet-helper-audio-playback - Got signal, exiting\n" msgstr "" -#: src/conversation/gnunet-helper-audio-playback.c:632 +#: src/conversation/gnunet-helper-audio-playback.c:637 #: src/conversation/gnunet-helper-audio-record.c:545 #, fuzzy msgid "Connection established.\n" msgstr "Colección detenida.\n" -#: src/conversation/gnunet-helper-audio-playback.c:637 +#: src/conversation/gnunet-helper-audio-playback.c:642 #: src/conversation/gnunet-helper-audio-record.c:550 #, fuzzy, c-format msgid "pa_stream_new() failed: %s\n" msgstr "stadísticas (%s) falló: %s\n" -#: src/conversation/gnunet-helper-audio-playback.c:651 +#: src/conversation/gnunet-helper-audio-playback.c:656 #, c-format msgid "pa_stream_connect_playback() failed: %s\n" msgstr "" -#: src/conversation/gnunet-helper-audio-playback.c:664 +#: src/conversation/gnunet-helper-audio-playback.c:669 #: src/conversation/gnunet-helper-audio-record.c:576 #, fuzzy, c-format msgid "Connection failure: %s\n" msgstr "'%s' falló en %s: %d con error: '%s'.\n" -#: src/conversation/gnunet-helper-audio-playback.c:685 +#: src/conversation/gnunet-helper-audio-playback.c:690 #: src/conversation/gnunet-helper-audio-record.c:599 #, fuzzy msgid "Wrong Spec\n" msgstr "Servicio principal (CORE) erróneo\n" -#: src/conversation/gnunet-helper-audio-playback.c:691 +#: src/conversation/gnunet-helper-audio-playback.c:696 #: src/conversation/gnunet-helper-audio-record.c:605 #, fuzzy msgid "pa_mainloop_new() failed.\n" msgstr "La operación ha fallado.\n" -#: src/conversation/gnunet-helper-audio-playback.c:705 +#: src/conversation/gnunet-helper-audio-playback.c:710 #: src/conversation/gnunet-helper-audio-record.c:620 #, fuzzy msgid "pa_context_new() failed.\n" msgstr "La operación ha fallado.\n" -#: src/conversation/gnunet-helper-audio-playback.c:712 +#: src/conversation/gnunet-helper-audio-playback.c:717 #: src/conversation/gnunet-helper-audio-record.c:626 #, fuzzy, c-format msgid "pa_context_connect() failed: %s\n" msgstr "# reconexiones rápidas fallidas" -#: src/conversation/gnunet-helper-audio-playback.c:718 +#: src/conversation/gnunet-helper-audio-playback.c:723 #: src/conversation/gnunet-helper-audio-record.c:632 #, fuzzy msgid "pa_mainloop_run() failed.\n" msgstr "La operación ha fallado.\n" -#: src/conversation/gnunet-helper-audio-playback.c:790 +#: src/conversation/gnunet-helper-audio-playback.c:795 #, c-format msgid "Read error from STDIN: %s\n" msgstr "" @@ -1247,7 +1245,12 @@ msgid "Failed to allocate %u bytes for second packet\n" msgstr "" "Se produjo un fallo al alojar las direcciones IP para el nuevo destino\n" -#: src/conversation/microphone.c:119 +#: src/conversation/gnunet-service-conversation.c:1276 +#, fuzzy, c-format +msgid "Could not open line, port %s already in use!\n" +msgstr "¡No se pudo conectar al servicio %s!\n" + +#: src/conversation/microphone.c:121 #, fuzzy msgid "Could not start record audio helper\n" msgstr "No se pudo empezar la operación de desindexado.\n" @@ -1340,27 +1343,27 @@ msgstr "# peticiones de envío descartadas (desconectado)" msgid "# dequeuing CAR (duplicate request)" msgstr "" -#: src/core/gnunet-service-core.c:440 +#: src/core/gnunet-service-core.c:443 #, c-format msgid "# bytes of messages of type %u received" msgstr "# bytes de mensajes del tipo %u recibidos" -#: src/core/gnunet-service-core.c:538 +#: src/core/gnunet-service-core.c:541 msgid "# messages discarded (session disconnected)" msgstr "# mensajes descartados (sesión desconectada)" -#: src/core/gnunet-service-core.c:876 +#: src/core/gnunet-service-core.c:879 #, fuzzy, c-format msgid "# messages of type %u discarded (client busy)" msgstr "# bytes de mensajes del tipo %u recibidos" -#: src/core/gnunet-service-core.c:985 +#: src/core/gnunet-service-core.c:988 msgid "Core service is lacking HOSTKEY configuration setting. Exiting.\n" msgstr "" "Al servicio principal le falta la configuración de la clave de máquina " "(HOSTKEY). Saliendo.\n" -#: src/core/gnunet-service-core.c:1006 +#: src/core/gnunet-service-core.c:1009 #, fuzzy, c-format msgid "Core service of `%s' ready.\n" msgstr "El servicio principal de «%4s» está listo.\n" @@ -1373,134 +1376,134 @@ msgstr "# bytes cifrados" msgid "# bytes decrypted" msgstr "# bytes descifrados" -#: src/core/gnunet-service-core_kx.c:725 +#: src/core/gnunet-service-core_kx.c:728 #, fuzzy msgid "# PAYLOAD dropped (out of order)" msgstr "# bytes omitidos (fuera de secuencia)" -#: src/core/gnunet-service-core_kx.c:775 +#: src/core/gnunet-service-core_kx.c:778 msgid "# key exchanges initiated" msgstr "# intercambio de claves iniciados" -#: src/core/gnunet-service-core_kx.c:837 +#: src/core/gnunet-service-core_kx.c:840 msgid "# key exchanges stopped" msgstr "# intercambio de claves parados" -#: src/core/gnunet-service-core_kx.c:871 +#: src/core/gnunet-service-core_kx.c:874 #, fuzzy msgid "# PING messages transmitted" msgstr "# mensajes PONG creados" -#: src/core/gnunet-service-core_kx.c:938 +#: src/core/gnunet-service-core_kx.c:941 msgid "# old ephemeral keys ignored" msgstr "" -#: src/core/gnunet-service-core_kx.c:945 +#: src/core/gnunet-service-core_kx.c:948 #, fuzzy msgid "# ephemeral keys received" msgstr "# mapas de tipos recibidos" -#: src/core/gnunet-service-core_kx.c:984 +#: src/core/gnunet-service-core_kx.c:987 #, 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 "" -#: src/core/gnunet-service-core_kx.c:995 +#: src/core/gnunet-service-core_kx.c:998 #, fuzzy msgid "# EPHEMERAL_KEY messages received" msgstr "# mensajes «SET_KEY» descifrados" -#: src/core/gnunet-service-core_kx.c:1091 -#: src/transport/gnunet-service-transport_validation.c:1119 +#: src/core/gnunet-service-core_kx.c:1094 +#: src/transport/gnunet-service-transport_validation.c:1128 msgid "# PING messages received" msgstr "# mensajes PING recibidos" -#: src/core/gnunet-service-core_kx.c:1100 +#: src/core/gnunet-service-core_kx.c:1103 #, fuzzy msgid "# PING messages dropped (out of order)" msgstr "# Mensajes P2P omitidos debido a saturación de la cola" -#: src/core/gnunet-service-core_kx.c:1158 +#: src/core/gnunet-service-core_kx.c:1161 msgid "# PONG messages created" msgstr "# mensajes PONG creados" -#: src/core/gnunet-service-core_kx.c:1184 +#: src/core/gnunet-service-core_kx.c:1187 msgid "# sessions terminated by timeout" msgstr "# sesiones terminadas por plazo de expiración" -#: src/core/gnunet-service-core_kx.c:1197 +#: src/core/gnunet-service-core_kx.c:1200 msgid "# keepalive messages sent" msgstr "# mensajes «keepalive» enviados" -#: src/core/gnunet-service-core_kx.c:1261 -#: src/transport/gnunet-service-transport_validation.c:1442 +#: src/core/gnunet-service-core_kx.c:1264 +#: src/transport/gnunet-service-transport_validation.c:1461 msgid "# PONG messages received" msgstr "# mensajes PONG recibidos" -#: src/core/gnunet-service-core_kx.c:1268 +#: src/core/gnunet-service-core_kx.c:1271 #, fuzzy msgid "# PONG messages dropped (connection down)" msgstr "# mensajes PONG recibidos" -#: src/core/gnunet-service-core_kx.c:1273 +#: src/core/gnunet-service-core_kx.c:1276 #, fuzzy msgid "# PONG messages dropped (out of order)" msgstr "# Mensajes P2P omitidos debido a saturación de la cola" -#: src/core/gnunet-service-core_kx.c:1308 +#: src/core/gnunet-service-core_kx.c:1311 msgid "# PONG messages decrypted" msgstr "# mensajes PONG descifrados" -#: src/core/gnunet-service-core_kx.c:1346 +#: src/core/gnunet-service-core_kx.c:1349 msgid "# session keys confirmed via PONG" msgstr "# claves de sesión confirmadas vía PONG" -#: src/core/gnunet-service-core_kx.c:1357 +#: src/core/gnunet-service-core_kx.c:1360 #, fuzzy msgid "# timeouts prevented via PONG" msgstr "# bytes recibidos vía TCP" -#: src/core/gnunet-service-core_kx.c:1364 +#: src/core/gnunet-service-core_kx.c:1367 msgid "# rekey operations confirmed via PONG" msgstr "# operaciones de cambio de clave confirmadas vía PONG" -#: src/core/gnunet-service-core_kx.c:1518 +#: src/core/gnunet-service-core_kx.c:1521 #, fuzzy msgid "# DATA message dropped (out of order)" msgstr "# bytes omitidos (fuera de secuencia)" -#: src/core/gnunet-service-core_kx.c:1526 +#: src/core/gnunet-service-core_kx.c:1529 #, c-format msgid "" "Session to peer `%s' went down due to key expiration (should not happen)\n" msgstr "" -#: src/core/gnunet-service-core_kx.c:1529 +#: src/core/gnunet-service-core_kx.c:1532 #, fuzzy msgid "# sessions terminated by key expiration" msgstr "# sesiones terminadas por plazo de expiración" -#: src/core/gnunet-service-core_kx.c:1590 -#: src/core/gnunet-service-core_kx.c:1616 +#: src/core/gnunet-service-core_kx.c:1593 +#: src/core/gnunet-service-core_kx.c:1619 msgid "# bytes dropped (duplicates)" msgstr "# bytes omitidos (duplicados)" -#: src/core/gnunet-service-core_kx.c:1603 +#: src/core/gnunet-service-core_kx.c:1606 msgid "# bytes dropped (out of sequence)" msgstr "# bytes omitidos (fuera de secuencia)" -#: src/core/gnunet-service-core_kx.c:1645 +#: src/core/gnunet-service-core_kx.c:1648 msgid "# bytes dropped (ancient message)" msgstr "# bytes omitidos (mensaje antiguo)" -#: src/core/gnunet-service-core_kx.c:1653 +#: src/core/gnunet-service-core_kx.c:1656 msgid "# bytes of payload decrypted" msgstr "# bytes de «payload» descifrados" -#: src/core/gnunet-service-core_sessions.c:266 -#: src/core/gnunet-service-core_sessions.c:356 +#: src/core/gnunet-service-core_sessions.c:260 +#: src/core/gnunet-service-core_sessions.c:350 #: src/dht/gnunet-service-dht_neighbours.c:733 #: src/dht/gnunet-service-dht_neighbours.c:795 #: src/fs/gnunet-service-fs_cp.c:615 src/fs/gnunet-service-fs_cp.c:1520 @@ -1511,16 +1514,16 @@ msgstr "# bytes de «payload» descifrados" msgid "# peers connected" msgstr "# pares conectados" -#: src/core/gnunet-service-core_sessions.c:302 +#: src/core/gnunet-service-core_sessions.c:296 msgid "# type map refreshes sent" msgstr "# envíos de refrescos del mapa de tipos" -#: src/core/gnunet-service-core_sessions.c:422 +#: src/core/gnunet-service-core_sessions.c:416 #, fuzzy msgid "# outdated typemap confirmations received" msgstr "Se produjo un fallo al encolar una confirmación de recepción\n" -#: src/core/gnunet-service-core_sessions.c:439 +#: src/core/gnunet-service-core_sessions.c:433 #, fuzzy msgid "# valid typemap confirmations received" msgstr "Se produjo un fallo al encolar una confirmación de recepción\n" @@ -1535,7 +1538,7 @@ msgid "# updates to my type map" msgstr "# actualizaciones de mi mapa de tipos" #: src/datacache/datacache.c:119 src/datacache/datacache.c:294 -#: src/datastore/gnunet-service-datastore.c:775 +#: src/datastore/gnunet-service-datastore.c:757 msgid "# bytes stored" msgstr "# bytes almacenados" @@ -1578,13 +1581,11 @@ msgstr "Caché de datos de montículo (heap) ejecutándose\n" #: src/datacache/plugin_datacache_sqlite.c:113 #: src/datacache/plugin_datacache_sqlite.c:122 -#: src/datastore/plugin_datastore_mysql.c:980 +#: src/datastore/plugin_datastore_mysql.c:892 #: src/datastore/plugin_datastore_sqlite.c:58 #: src/datastore/plugin_datastore_sqlite.c:66 src/my/my.c:80 src/my/my.c:92 #: src/mysql/mysql.c:42 src/mysql/mysql.c:49 -#: src/namecache/plugin_namecache_postgres.c:53 #: src/namecache/plugin_namecache_sqlite.c:53 -#: src/namestore/plugin_namestore_postgres.c:53 #: src/namestore/plugin_namestore_sqlite.c:53 #: src/peerstore/plugin_peerstore_sqlite.c:52 #: src/psycstore/plugin_psycstore_mysql.c:62 @@ -1593,14 +1594,14 @@ msgstr "Caché de datos de montículo (heap) ejecutándose\n" #: src/testbed/gnunet-daemon-testbed-underlay.c:56 #: src/testbed/testbed_api_hosts.c:69 src/util/crypto_ecc.c:52 #: src/util/crypto_ecc_setup.c:41 src/util/crypto_mpi.c:39 -#: src/include/gnunet_common.h:720 src/include/gnunet_common.h:729 +#: src/include/gnunet_common.h:735 src/include/gnunet_common.h:744 #: src/scalarproduct/scalarproduct.h:35 #, c-format msgid "`%s' failed at %s:%d with error: %s\n" msgstr "«%s» falló en %s: %d con el error: %s\n" #: src/datacache/plugin_datacache_sqlite.c:817 -#: src/datastore/plugin_datastore_sqlite.c:475 +#: src/datastore/plugin_datastore_sqlite.c:456 #: src/namecache/plugin_namecache_sqlite.c:296 #: src/namestore/plugin_namestore_sqlite.c:355 msgid "Tried to close sqlite without finalizing all prepared statements.\n" @@ -1625,7 +1626,7 @@ msgstr "# desbordamientos de la cola" msgid "# queue entries created" msgstr "# entradas creadas en la cola" -#: src/datastore/datastore_api.c:740 +#: src/datastore/datastore_api.c:760 msgid "# status messages received" msgstr "# mensajes de estado recibidos" @@ -1633,55 +1634,107 @@ msgstr "# mensajes de estado recibidos" msgid "# Results received" msgstr "# Resultados recibidos" -#: src/datastore/datastore_api.c:941 +#: src/datastore/datastore_api.c:920 msgid "# datastore connections (re)created" msgstr "# conexiones a almacenes de datos (re)creadas" -#: src/datastore/datastore_api.c:1055 +#: src/datastore/datastore_api.c:1034 msgid "# PUT requests executed" msgstr "# peticiones «PUT» ejecutadas" -#: src/datastore/datastore_api.c:1116 +#: src/datastore/datastore_api.c:1095 msgid "# RESERVE requests executed" msgstr "# peticiones «RESERVE» ejecutadas" -#: src/datastore/datastore_api.c:1181 +#: src/datastore/datastore_api.c:1160 msgid "# RELEASE RESERVE requests executed" msgstr "# Peticiones «RELEASE RESERVE» ejecutadas" -#: src/datastore/datastore_api.c:1259 +#: src/datastore/datastore_api.c:1238 msgid "# REMOVE requests executed" msgstr "# peticiones «REMOVE» ejecutadas" -#: src/datastore/datastore_api.c:1319 +#: src/datastore/datastore_api.c:1298 msgid "# GET REPLICATION requests executed" msgstr "# peticiones «GET REPLICATION» ejecutadas" -#: src/datastore/datastore_api.c:1381 +#: src/datastore/datastore_api.c:1360 msgid "# GET ZERO ANONYMITY requests executed" msgstr "# peticiones «GET ZERO ANONYMITY» ejecutadas" -#: src/datastore/datastore_api.c:1462 +#: src/datastore/datastore_api.c:1441 msgid "# GET requests executed" msgstr "# peticiones «GET» ejecutadas" -#: src/datastore/gnunet-datastore.c:113 +#: src/datastore/gnunet-datastore.c:189 +#, c-format +msgid "Dumped %<PRIu64> records\n" +msgstr "" + +#: src/datastore/gnunet-datastore.c:217 src/datastore/gnunet-datastore.c:229 +#, c-format +msgid "Short write to file: %zd bytes expecting %zd\n" +msgstr "" + +#: src/datastore/gnunet-datastore.c:261 +#, fuzzy +msgid "Error queueing datastore GET operation\n" +msgstr "Error leyendo «%s»: %s" + +#: src/datastore/gnunet-datastore.c:287 src/datastore/gnunet-datastore.c:412 +#, fuzzy, c-format +msgid "Unable to open dump file: %s\n" +msgstr "Se produjo un fallo al crear los índices\n" + +#: src/datastore/gnunet-datastore.c:326 #, fuzzy, c-format msgid "Failed to store item: %s, aborting\n" msgstr "Se produjo un fallo al abrir «%s» para escritura" -#: src/datastore/gnunet-datastore.c:209 +#: src/datastore/gnunet-datastore.c:340 +#, fuzzy, c-format +msgid "Inserted %<PRIu64> records\n" +msgstr "establece registros de clase A" + +#: src/datastore/gnunet-datastore.c:349 src/datastore/gnunet-datastore.c:363 #, c-format -msgid "Cannot use the same configuration for source and destination\n" +msgid "Short read from file: %zd bytes expecting %zd\n" msgstr "" -#: src/datastore/gnunet-datastore.c:256 -msgid "" -"specifies the configuration to use to access an alternative datastore; will " -"merge that datastore into our current datastore" +#: src/datastore/gnunet-datastore.c:389 +#, fuzzy +msgid "Error queueing datastore PUT operation\n" +msgstr "Error leyendo «%s»: %s" + +#: src/datastore/gnunet-datastore.c:432 +msgid "Input file is not of a supported format\n" msgstr "" -#: src/datastore/gnunet-datastore.c:265 +#: src/datastore/gnunet-datastore.c:458 +#, fuzzy +msgid "Failed connecting to the datastore.\n" +msgstr "Se produjo un fallo al conectar con el almacén de datos." + +#: src/datastore/gnunet-datastore.c:470 +#, fuzzy, c-format +msgid "Please choose at least one operation: %s, %s\n" +msgstr "Por favor, seleccione una operación: %s o %s o %s o %s o %s\n" + +#: src/datastore/gnunet-datastore.c:493 +#, fuzzy +msgid "Dump all records from the datastore" +msgstr "Buscar el registro para el nombre dado" + +#: src/datastore/gnunet-datastore.c:497 +#, fuzzy +msgid "Insert records into the datastore" +msgstr "# bytes mandados al almacén de datos" + +#: src/datastore/gnunet-datastore.c:502 +msgid "File to dump or insert" +msgstr "" + +#: src/datastore/gnunet-datastore.c:511 #, fuzzy msgid "Manipulate GNUnet datastore" msgstr "Manipular ficheros de configuración de GNUnet" @@ -1730,8 +1783,8 @@ msgstr "Espacio insuficiente para satisfacer la petición" #: src/datastore/gnunet-service-datastore.c:634 #: src/datastore/gnunet-service-datastore.c:689 -#: src/datastore/gnunet-service-datastore.c:977 -#: src/datastore/gnunet-service-datastore.c:1633 +#: src/datastore/gnunet-service-datastore.c:837 +#: src/datastore/gnunet-service-datastore.c:1469 msgid "# reserved" msgstr "# reservado" @@ -1739,47 +1792,47 @@ msgstr "# reservado" msgid "Could not find matching reservation" msgstr "No se pudo encontrar una reserva coincidente" -#: src/datastore/gnunet-service-datastore.c:792 +#: src/datastore/gnunet-service-datastore.c:773 #, c-format msgid "Need %llu bytes more space (%llu allowed, using %llu)\n" msgstr "" "Se necesitan %llu bytes más de espacio (%llu permitidos, usando %llu)\n" -#: src/datastore/gnunet-service-datastore.c:1026 +#: src/datastore/gnunet-service-datastore.c:876 msgid "# GET requests received" msgstr "# peticiones «GET» recibidas" -#: src/datastore/gnunet-service-datastore.c:1058 +#: src/datastore/gnunet-service-datastore.c:907 #, fuzzy msgid "# GET KEY requests received" msgstr "# peticiones «GET» recibidas" -#: src/datastore/gnunet-service-datastore.c:1071 +#: src/datastore/gnunet-service-datastore.c:920 msgid "# requests filtered by bloomfilter" msgstr "# peticiones filtradas por el «bloomfilter»" -#: src/datastore/gnunet-service-datastore.c:1108 +#: src/datastore/gnunet-service-datastore.c:956 msgid "# GET REPLICATION requests received" msgstr "# peticiones «GET REPLICATION» recibidas" -#: src/datastore/gnunet-service-datastore.c:1141 +#: src/datastore/gnunet-service-datastore.c:989 msgid "# GET ZERO ANONYMITY requests received" msgstr "# peticiones «GET ZERO ANONYMITY» recibidas" -#: src/datastore/gnunet-service-datastore.c:1190 +#: src/datastore/gnunet-service-datastore.c:1036 msgid "Content not found" msgstr "Contenido no encontrado" -#: src/datastore/gnunet-service-datastore.c:1199 +#: src/datastore/gnunet-service-datastore.c:1043 msgid "# bytes removed (explicit request)" msgstr "# bytes eliminados (petición explícita)" -#: src/datastore/gnunet-service-datastore.c:1246 +#: src/datastore/gnunet-service-datastore.c:1088 msgid "# REMOVE requests received" msgstr "# peticiones «REMOVE» recibidas" # Miguel: ¿Cómo traducir «payload»? ¿Código cargado? -#: src/datastore/gnunet-service-datastore.c:1301 +#: src/datastore/gnunet-service-datastore.c:1137 #, fuzzy, c-format msgid "" "Datastore payload must have been inaccurate (%lld < %lld). Recomputing it.\n" @@ -1787,102 +1840,103 @@ msgstr "" "El «payload» del almacén de datos es impreciso (%lld < %lld). Intentando " "repararlo.\n" -#: src/datastore/gnunet-service-datastore.c:1307 -#: src/datastore/gnunet-service-datastore.c:1482 +#: src/datastore/gnunet-service-datastore.c:1143 +#: src/datastore/gnunet-service-datastore.c:1318 #, c-format msgid "New payload: %lld\n" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1361 +#: src/datastore/gnunet-service-datastore.c:1197 #, c-format msgid "Loading `%s' datastore plugin\n" msgstr "Cargando el módulo del almacén de datos «%s»\n" -#: src/datastore/gnunet-service-datastore.c:1373 +#: src/datastore/gnunet-service-datastore.c:1209 #, c-format msgid "Failed to load datastore plugin for `%s'\n" msgstr "" "Se produjo un fallo al inicializar el módulo del almacén de datos para «%s»\n" -#: src/datastore/gnunet-service-datastore.c:1433 +#: src/datastore/gnunet-service-datastore.c:1269 msgid "Bloomfilter construction complete.\n" msgstr "Construcción de «bloomfilter» completa.\n" -#: src/datastore/gnunet-service-datastore.c:1489 +#: src/datastore/gnunet-service-datastore.c:1325 msgid "Rebuilding bloomfilter. Please be patient.\n" msgstr "Reconstruyendo «bloomfilter». Por favor, tenga paciencia.\n" -#: src/datastore/gnunet-service-datastore.c:1500 +#: src/datastore/gnunet-service-datastore.c:1336 msgid "Plugin does not support get_keys function. Please fix!\n" msgstr "El módulo no soporta la función «get_keys». Por favor, corríjalo.\n" -#: src/datastore/gnunet-service-datastore.c:1670 +#: src/datastore/gnunet-service-datastore.c:1506 #, c-format msgid "# bytes used in file-sharing datastore `%s'" msgstr "# bytes usados en el almacén de ficheros compartidos «%s»" -#: src/datastore/gnunet-service-datastore.c:1686 +#: src/datastore/gnunet-service-datastore.c:1522 msgid "# quota" msgstr "# cuota" -#: src/datastore/gnunet-service-datastore.c:1691 +#: src/datastore/gnunet-service-datastore.c:1527 msgid "# cache size" msgstr "# tamaño de la caché" -#: src/datastore/gnunet-service-datastore.c:1707 +#: src/datastore/gnunet-service-datastore.c:1543 #, c-format msgid "Could not use specified filename `%s' for bloomfilter.\n" msgstr "" "No se pudo usar el nombre de fichero especificado «%s» para «bloomfilter».\n" -#: src/datastore/gnunet-service-datastore.c:1725 -#: src/datastore/gnunet-service-datastore.c:1741 +#: src/datastore/gnunet-service-datastore.c:1561 +#: src/datastore/gnunet-service-datastore.c:1577 #, c-format msgid "Failed to remove bogus bloomfilter file `%s'\n" msgstr "" "Se produjo un fallo al borrar el fichero de configuración defectuoso de " "«bloomfilter» «%s»:\n" -#: src/datastore/gnunet-service-datastore.c:1773 +#: src/datastore/gnunet-service-datastore.c:1609 msgid "Failed to initialize bloomfilter.\n" msgstr "Se produjo un fallo al inicializar «bloomfilter».\n" -#: src/datastore/plugin_datastore_heap.c:769 +#: src/datastore/plugin_datastore_heap.c:893 msgid "Heap database running\n" msgstr "Base de datos de montículo ejecutándose\n" -#: src/datastore/plugin_datastore_mysql.c:377 -#: src/datastore/plugin_datastore_sqlite.c:590 +#: src/datastore/plugin_datastore_mysql.c:371 +#: src/datastore/plugin_datastore_mysql.c:423 +#: src/datastore/plugin_datastore_mysql.c:1075 +msgid "MySQL statement run failure" +msgstr "" + +#: src/datastore/plugin_datastore_mysql.c:410 +#: src/datastore/plugin_datastore_sqlite.c:626 #, fuzzy msgid "Data too large" msgstr "número de valores" -#: src/datastore/plugin_datastore_mysql.c:393 -msgid "MySQL statement run failure" -msgstr "" - -#: src/datastore/plugin_datastore_mysql.c:936 +#: src/datastore/plugin_datastore_mysql.c:848 #, c-format msgid "`%s' for `%s' failed at %s:%d with error: %s\n" msgstr "«%s» para «%s» falló en %s: %d con error: %s\n" -#: src/datastore/plugin_datastore_mysql.c:1208 +#: src/datastore/plugin_datastore_mysql.c:1180 #: src/psycstore/plugin_psycstore_mysql.c:1936 msgid "Mysql database running\n" msgstr "Base de datos Mysql ejecutándose\n" -#: src/datastore/plugin_datastore_postgres.c:345 +#: src/datastore/plugin_datastore_postgres.c:274 +#: src/datastore/plugin_datastore_postgres.c:891 msgid "Postgress exec failure" msgstr "" -#: src/datastore/plugin_datastore_postgres.c:866 +#: src/datastore/plugin_datastore_postgres.c:852 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:903 -#: src/namecache/plugin_namecache_postgres.c:398 -#: src/namestore/plugin_namestore_postgres.c:571 -#: src/psycstore/plugin_psycstore_postgres.c:1721 +#: src/datastore/plugin_datastore_postgres.c:950 +#: src/psycstore/plugin_psycstore_postgres.c:1506 msgid "Postgres database running\n" msgstr "Base de datos Postgres ejecutándose\n" @@ -1894,7 +1948,7 @@ msgstr "Base de datos Postgres ejecutándose\n" msgid "`%s' failed at %s:%u with error: %s" msgstr "«%s» falló en %s:%u con el error: %s" -#: src/datastore/plugin_datastore_sqlite.c:281 +#: src/datastore/plugin_datastore_sqlite.c:271 #: src/namecache/plugin_namecache_sqlite.c:194 #: src/namestore/plugin_namestore_sqlite.c:222 #: src/peerstore/plugin_peerstore_sqlite.c:535 @@ -1903,14 +1957,18 @@ msgstr "«%s» falló en %s:%u con el error: %s" msgid "Unable to initialize SQLite: %s.\n" msgstr "Imposible inicializar SQLite: %s.\n" +#: src/datastore/plugin_datastore_sqlite.c:577 +msgid "sqlite bind failure" +msgstr "" + # to should be too, i think -#: src/datastore/plugin_datastore_sqlite.c:1234 +#: src/datastore/plugin_datastore_sqlite.c:1259 msgid "sqlite version to old to determine size, assuming zero\n" msgstr "" "la versión de sqlite es muy antigua para determinar el tamaño, se asume " "cero\n" -#: src/datastore/plugin_datastore_sqlite.c:1268 +#: src/datastore/plugin_datastore_sqlite.c:1293 #, c-format msgid "" "Using sqlite page utilization to estimate payload (%llu pages of size %llu " @@ -1919,13 +1977,13 @@ msgstr "" "Usando la utilización de páginas de sqlite para estimar el «payload» (%llu " "páginas de %llu bytes de tamaño)\n" -#: src/datastore/plugin_datastore_sqlite.c:1312 +#: src/datastore/plugin_datastore_sqlite.c:1337 #: src/namecache/plugin_namecache_sqlite.c:603 #: src/namestore/plugin_namestore_sqlite.c:802 msgid "Sqlite database running\n" msgstr "Base de datos sqlite ejecutándose\n" -#: src/datastore/plugin_datastore_template.c:259 +#: src/datastore/plugin_datastore_template.c:253 msgid "Template database running\n" msgstr "Base de datos de plantilla ejecutándose\n" @@ -1989,8 +2047,7 @@ 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:1161 -#: src/testbed/gnunet-testbed-profiler.c:255 +#: src/dht/gnunet_dht_profiler.c:1161 src/testbed/gnunet-testbed-profiler.c:253 #, fuzzy, c-format msgid "Exiting as the number of peers is %u\n" msgstr "El número máximo de conexiones es %u\n" @@ -2006,7 +2063,7 @@ msgid "" msgstr "" #: src/dht/gnunet_dht_profiler.c:1200 src/nse/gnunet-nse-profiler.c:853 -#: src/testbed/gnunet-testbed-profiler.c:305 +#: src/testbed/gnunet-testbed-profiler.c:304 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 " @@ -2646,7 +2703,7 @@ msgstr "«%s» debe ser instalado con SUID, se niega a arrancar\n" msgid "No useful service enabled. Exiting.\n" msgstr "Ningún servicio útil habilitado. Saliendo.\n" -#: src/exit/gnunet-daemon-exit.c:3969 +#: src/exit/gnunet-daemon-exit.c:3970 msgid "Daemon to run to provide an IP exit node for the VPN" msgstr "Demonio a ejecutar para obtener un nodo de salida IP para la VPN" @@ -2876,7 +2933,7 @@ msgstr "" msgid "Failed to not connect to `%s' service.\n" msgstr "Se produjo un fallo al conectar con el servicio «%s».\n" -#: src/fs/fs_misc.c:126 +#: src/fs/fs_misc.c:128 #, c-format msgid "Did not find mime type `%s' in extension list.\n" msgstr "No se encontró el tipo MIME «%s» en la lista de extensiones.\n" @@ -4123,7 +4180,7 @@ msgstr "" msgid "Failed to connect to identity service\n" msgstr "Fallo al conectar a gnunetd.\n" -#: src/gns/gnunet-gns-import.c:489 +#: src/gns/gnunet-gns-import.c:452 msgid "This program will import some GNS authorities into your GNS namestore." msgstr "" @@ -4142,110 +4199,110 @@ msgstr "" msgid "%s failed at %s:%d: `%s'\n" msgstr "%s falló en %s:%d: «%s».\n" -#: src/gns/gnunet-gns-proxy.c:878 +#: src/gns/gnunet-gns-proxy.c:887 #, fuzzy, c-format msgid "Unsupported CURL SSL backend %d\n" msgstr "Tipo de bloque %u no soportado\n" -#: src/gns/gnunet-gns-proxy.c:901 +#: src/gns/gnunet-gns-proxy.c:910 #, fuzzy, c-format msgid "Failed to fetch CN from cert: %s\n" msgstr "Se produjo un fallo al mandar la petición DNS a %s\n" -#: src/gns/gnunet-gns-proxy.c:924 +#: src/gns/gnunet-gns-proxy.c:933 #, fuzzy, c-format msgid "Failed to initialize DANE: %s\n" msgstr "¡No se puede inicializar el resolvedor!\n" -#: src/gns/gnunet-gns-proxy.c:937 +#: src/gns/gnunet-gns-proxy.c:946 #, fuzzy, c-format msgid "Failed to parse DANE record: %s\n" msgstr "Se produjo un fallo al procesar la petición DNS. Omitiendo.\n" -#: src/gns/gnunet-gns-proxy.c:952 +#: src/gns/gnunet-gns-proxy.c:961 #, fuzzy, c-format msgid "Failed to verify TLS connection using DANE: %s\n" msgstr "Se produjo un fallo al borrar el fichero de configuración %s\n" -#: src/gns/gnunet-gns-proxy.c:962 +#: src/gns/gnunet-gns-proxy.c:971 #, c-format msgid "Failed DANE verification failed with GnuTLS verify status code: %u\n" msgstr "" -#: src/gns/gnunet-gns-proxy.c:986 +#: src/gns/gnunet-gns-proxy.c:995 #, c-format msgid "SSL certificate subject name (%s) does not match `%s'\n" msgstr "" -#: src/gns/gnunet-gns-proxy.c:1095 +#: src/gns/gnunet-gns-proxy.c:1104 #, c-format msgid "Cookie domain `%s' supplied by server is invalid\n" msgstr "" -#: src/gns/gnunet-gns-proxy.c:1699 +#: src/gns/gnunet-gns-proxy.c:1709 #, fuzzy, c-format msgid "Unsupported HTTP method `%s'\n" msgstr "Tipo no soportado «%s»\n" -#: src/gns/gnunet-gns-proxy.c:2162 +#: src/gns/gnunet-gns-proxy.c:2172 #, c-format msgid "Unable to import private key from file `%s'\n" msgstr "No se pudo importar la clave privada del fichero «%s»\n" -#: src/gns/gnunet-gns-proxy.c:2192 +#: src/gns/gnunet-gns-proxy.c:2202 #, c-format msgid "Unable to import certificate %s\n" msgstr "No se pudo importar el certificado %s\n" -#: src/gns/gnunet-gns-proxy.c:2365 +#: src/gns/gnunet-gns-proxy.c:2375 #, fuzzy, c-format msgid "Failed to start HTTPS server for `%s'\n" msgstr "Se produjo un fallo al iniciar el servidor HTTP\n" -#: src/gns/gnunet-gns-proxy.c:2384 src/rest/gnunet-rest-server.c:533 +#: src/gns/gnunet-gns-proxy.c:2394 src/rest/gnunet-rest-server.c:533 #, fuzzy msgid "Failed to pass client to MHD\n" msgstr "Se produjo un fallo al conectar con GNS\n" -#: src/gns/gnunet-gns-proxy.c:2704 +#: src/gns/gnunet-gns-proxy.c:2716 #, fuzzy, c-format msgid "Unsupported socks version %d\n" msgstr "Tipo de bloque %u no soportado\n" -#: src/gns/gnunet-gns-proxy.c:2733 +#: src/gns/gnunet-gns-proxy.c:2745 #, fuzzy, c-format msgid "Unsupported socks command %d\n" msgstr "Tipo de bloque %u no soportado\n" -#: src/gns/gnunet-gns-proxy.c:2751 src/gns/gnunet-gns-proxy.c:2780 +#: src/gns/gnunet-gns-proxy.c:2763 src/gns/gnunet-gns-proxy.c:2792 msgid "SSL connection to plain IPv4 address requested\n" msgstr "" -#: src/gns/gnunet-gns-proxy.c:2830 +#: src/gns/gnunet-gns-proxy.c:2842 #, fuzzy, c-format msgid "Unsupported socks address type %d\n" msgstr "Tipo de bloque %u no soportado\n" -#: src/gns/gnunet-gns-proxy.c:3165 src/gns/gnunet-service-gns.c:403 +#: src/gns/gnunet-gns-proxy.c:3177 src/gns/gnunet-service-gns.c:403 #, fuzzy, c-format msgid "No ego configured for `%s`\n" msgstr "" "Ningún puerto fue configurado para el módulo «%s», no se puede probar\n" -#: src/gns/gnunet-gns-proxy.c:3226 +#: src/gns/gnunet-gns-proxy.c:3238 #, fuzzy, c-format msgid "Failed to load SSL/TLS key and certificate from `%s'\n" msgstr "Se produjo un fallo al leer la lista de amigos de «%s»\n" -#: src/gns/gnunet-gns-proxy.c:3269 +#: src/gns/gnunet-gns-proxy.c:3281 msgid "listen on specified port (default: 7777)" msgstr "escuchar en el puerto especificado (predeterminado: 7777)" -#: src/gns/gnunet-gns-proxy.c:3275 +#: src/gns/gnunet-gns-proxy.c:3287 msgid "pem file to use as CA" msgstr "fichero pem para usar como autoridad de certificación (CA)" -#: src/gns/gnunet-gns-proxy.c:3300 +#: src/gns/gnunet-gns-proxy.c:3312 msgid "GNUnet GNS proxy" msgstr "Proxy GNUnet GNS" @@ -4255,7 +4312,7 @@ 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:461 -#: src/zonemaster/gnunet-service-zonemaster.c:741 +#: src/zonemaster/gnunet-service-zonemaster.c:742 msgid "Could not connect to DHT!\n" msgstr "¡No se pudo conectar a la DHT!\n" @@ -4471,39 +4528,39 @@ msgstr "Error escribiendo «HELLO» al fichero «%s»: %s\n" msgid "Modified %u addresses, wrote %u bytes\n" msgstr "" -#: src/hello/hello.c:1103 +#: src/hello/hello.c:1110 msgid "Failed to parse HELLO message: missing expiration time\n" msgstr "" "Se produjo un fallo al procesar un mensaje «HELLO»: falta el tiempo de " "expiración\n" -#: src/hello/hello.c:1112 +#: src/hello/hello.c:1119 msgid "Failed to parse HELLO message: invalid expiration time\n" msgstr "" "Se produjo un fallo al procesar un mensaje «HELLO»: tiempo de expiración no " "válido\n" -#: src/hello/hello.c:1122 +#: src/hello/hello.c:1129 msgid "Failed to parse HELLO message: malformed\n" msgstr "Se produjo un fallo al procesar un mensaje «HELLO»: mal formado\n" -#: src/hello/hello.c:1133 +#: src/hello/hello.c:1140 msgid "Failed to parse HELLO message: missing transport plugin\n" msgstr "" "Se produjo un fallo al procesar un mensaje «HELLO»: falta el módulo de " "transporte\n" -#: src/hello/hello.c:1151 +#: src/hello/hello.c:1158 #, fuzzy, c-format msgid "Plugin `%s' not found, skipping address\n" msgstr "Módulo «%s» no encontrado\n" -#: src/hello/hello.c:1159 +#: src/hello/hello.c:1166 #, c-format msgid "Plugin `%s' does not support URIs yet\n" msgstr "El módulo «%s» no soporta URI todavía\n" -#: src/hello/hello.c:1174 +#: src/hello/hello.c:1181 #, c-format msgid "Failed to parse `%s' as an address for plugin `%s'\n" msgstr "" @@ -4769,7 +4826,7 @@ msgid "# hostlist advertisements send" msgstr "# anuncios de listas de máquinas enviados" #: src/hostlist/gnunet-daemon-hostlist_server.c:679 -#: src/transport/gnunet-service-transport.c:2803 +#: src/transport/gnunet-service-transport.c:2815 msgid "Could not access PEERINFO service. Exiting.\n" msgstr "" "No se pudo acceder al servicio de información de pares (PEERINFO). " @@ -5040,11 +5097,6 @@ msgstr "Se produjo un fallo al crear los índices\n" msgid "flat plugin running\n" msgstr "Base de datos sqlite ejecutándose\n" -#: src/namecache/plugin_namecache_postgres.c:90 -#: src/namestore/plugin_namestore_postgres.c:97 -msgid "Failed to create indices\n" -msgstr "Se produjo un fallo al crear los índices\n" - #: src/namestore/gnunet-namestore.c:301 #, c-format msgid "Adding record failed: %s\n" @@ -5142,8 +5194,7 @@ msgstr "borrar" msgid "Invalid public key for reverse lookup `%s'\n" msgstr "Parámetro no válido «%s»\n" -#: src/namestore/gnunet-namestore.c:979 -#: src/peerinfo-tool/gnunet-peerinfo.c:775 +#: src/namestore/gnunet-namestore.c:979 src/peerinfo-tool/gnunet-peerinfo.c:775 #, c-format msgid "Invalid URI `%s'\n" msgstr "URI no válida: «%s»\n" @@ -5287,7 +5338,7 @@ msgstr "Se produjo un fallo al conectar con GNS\n" 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:612 +#: src/namestore/gnunet-service-namestore.c:615 #, fuzzy, c-format msgid "Failed to replicate block in namecache: %s\n" msgstr "Se produjo un fallo al crear el espacio de nombres «%s»\n" @@ -5633,7 +5684,7 @@ msgid "Measure quality and performance of the NSE service." msgstr "Medir la calidad y rendimiento del servicio NSE." #: src/nse/gnunet-service-nse.c:1534 -#: src/revocation/gnunet-service-revocation.c:838 src/util/gnunet-scrypt.c:276 +#: src/revocation/gnunet-service-revocation.c:840 src/util/gnunet-scrypt.c:276 msgid "Value is too large.\n" msgstr "" @@ -5675,17 +5726,17 @@ msgstr "Escaneando directorio «%s».\n" 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:1076 +#: src/peerinfo/gnunet-service-peerinfo.c:1080 #, fuzzy, c-format msgid "Cleaning up directory `%s'\n" msgstr "Escaneando directorio «%s».\n" -#: src/peerinfo/gnunet-service-peerinfo.c:1405 +#: src/peerinfo/gnunet-service-peerinfo.c:1409 #, c-format msgid "Importing HELLOs from `%s'\n" msgstr "Importando HELLO de «%s»\n" -#: src/peerinfo/gnunet-service-peerinfo.c:1418 +#: src/peerinfo/gnunet-service-peerinfo.c:1422 msgid "Skipping import of included HELLOs\n" msgstr "" @@ -5834,15 +5885,10 @@ msgstr "Error leyendo de «%s»: %s\n" msgid "Unable to create indices: %s.\n" msgstr "Se produjo un fallo al crear los índices\n" -#: src/postgres/postgres.c:67 +#: src/pq/pq_prepare.c:80 #, fuzzy, c-format -msgid "`%s:%s' failed at %s:%d with error: %s\n" -msgstr "«%s:%s» falló en %s:%d con error: %s" - -#: src/postgres/postgres.c:192 -#, fuzzy, c-format -msgid "Unable to connect to Postgres database '%s': %s\n" -msgstr "Imposible guardar el fichero de configuración '%s':" +msgid "PQprepare (`%s' as `%s') failed with error: %s\n" +msgstr "«%s» para «%s» falló en %s: %d con error: %s\n" #: src/psycstore/gnunet-service-psycstore.c:249 #, fuzzy @@ -6019,11 +6065,11 @@ msgstr "" msgid "Daemon to announce regular expressions for the peer using cadet." msgstr "Demonio para anunciar expresiones regulares para el par usando mesh." -#: src/regex/gnunet-regex-profiler.c:1314 +#: src/regex/gnunet-regex-profiler.c:1386 msgid "No configuration file given. Exiting\n" msgstr "No se ha introducido ningún fichero de configuración. Saliendo\n" -#: src/regex/gnunet-regex-profiler.c:1355 +#: src/regex/gnunet-regex-profiler.c:1427 #: src/regex/gnunet-regex-simulation-profiler.c:630 #, c-format msgid "No policy directory specified on command line. Exiting.\n" @@ -6031,51 +6077,51 @@ msgstr "" "No se ha especificado una política de directorios en la línea de comandos. " "Saliendo.\n" -#: src/regex/gnunet-regex-profiler.c:1361 +#: src/regex/gnunet-regex-profiler.c:1433 #: src/regex/gnunet-regex-simulation-profiler.c:638 #, c-format msgid "Specified policies directory does not exist. Exiting.\n" msgstr "Las políticas de directorio especificadas no existen. Saliendo.\n" -#: src/regex/gnunet-regex-profiler.c:1368 +#: src/regex/gnunet-regex-profiler.c:1440 #, c-format msgid "No files found in `%s'\n" msgstr "No se han encontrado ficheros en «%s»\n" -#: src/regex/gnunet-regex-profiler.c:1377 +#: src/regex/gnunet-regex-profiler.c:1449 msgid "No search strings file given. Exiting.\n" msgstr "No se ha proporcionado un fichero de cadenas de búsqueda. Saliendo.\n" -#: src/regex/gnunet-regex-profiler.c:1397 +#: src/regex/gnunet-regex-profiler.c:1469 msgid "Error loading search strings. Exiting.\n" msgstr "Error cargando cadenas de búsqueda. Saliendo.\n" -#: src/regex/gnunet-regex-profiler.c:1485 +#: src/regex/gnunet-regex-profiler.c:1557 msgid "name of the file for writing statistics" msgstr "nombre del fichero para escribir las estadísticas" -#: src/regex/gnunet-regex-profiler.c:1491 +#: src/regex/gnunet-regex-profiler.c:1563 #, fuzzy msgid "wait TIMEOUT before ending the experiment" msgstr "" "esperar «TIMEOUT» antes de considerar que una coincidencia de cadenas como " "fallida" -#: src/regex/gnunet-regex-profiler.c:1497 +#: src/regex/gnunet-regex-profiler.c:1569 msgid "directory with policy files" msgstr "" -#: src/regex/gnunet-regex-profiler.c:1504 +#: src/regex/gnunet-regex-profiler.c:1576 #, fuzzy msgid "name of file with input strings" msgstr "nombre del fichero para escribir las estadísticas" -#: src/regex/gnunet-regex-profiler.c:1510 +#: src/regex/gnunet-regex-profiler.c:1582 #, fuzzy msgid "name of file with hosts' names" msgstr "nombre del fichero para escribir las estadísticas" -#: src/regex/gnunet-regex-profiler.c:1523 +#: src/regex/gnunet-regex-profiler.c:1595 msgid "Profiler for regex" msgstr "Perfilador para expresiones regulares." @@ -6243,12 +6289,12 @@ msgstr "# sesiones wlan creadas" msgid "# revocation set unions completed" msgstr "# transmisiones de fragmentos completadas" -#: src/revocation/gnunet-service-revocation.c:524 -#: src/revocation/gnunet-service-revocation.c:771 +#: src/revocation/gnunet-service-revocation.c:525 +#: src/revocation/gnunet-service-revocation.c:773 msgid "SET service crashed, terminating revocation service\n" msgstr "" -#: src/revocation/gnunet-service-revocation.c:862 +#: src/revocation/gnunet-service-revocation.c:864 #, fuzzy msgid "Could not open revocation database file!" msgstr "No se pudo conectar con el almacén de datos." @@ -6312,9 +6358,9 @@ msgstr "" msgid "Calculate the Vectorproduct with a GNUnet peer." msgstr "" -#: src/scalarproduct/gnunet-service-scalarproduct_alice.c:1407 +#: src/scalarproduct/gnunet-service-scalarproduct_alice.c:1401 #: src/scalarproduct/gnunet-service-scalarproduct_bob.c:1345 -#: src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c:1180 +#: src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c:1172 #: src/scalarproduct/gnunet-service-scalarproduct-ecc_bob.c:1063 #, fuzzy msgid "Connect to CADET failed\n" @@ -6340,7 +6386,7 @@ msgstr "" msgid "also profile decryption" msgstr "" -#: src/set/gnunet-service-set.c:1948 +#: src/set/gnunet-service-set.c:1989 #, fuzzy msgid "Could not connect to CADET service\n" msgstr "¡No se pudo conectar al servicio %s!\n" @@ -6401,116 +6447,116 @@ msgstr "" msgid "say good-bye and leave somebody else's place" msgstr "" -#: src/social/gnunet-social.c:1227 src/social/gnunet-social.c:1232 +#: src/social/gnunet-social.c:1227 msgid "create a place" msgstr "" -#: src/social/gnunet-social.c:1237 +#: src/social/gnunet-social.c:1232 msgid "destroy a place we were hosting" msgstr "" -#: src/social/gnunet-social.c:1242 +#: src/social/gnunet-social.c:1237 msgid "enter somebody else's place" msgstr "" -#: src/social/gnunet-social.c:1248 +#: src/social/gnunet-social.c:1243 msgid "find state matching name prefix" msgstr "" -#: src/social/gnunet-social.c:1253 +#: src/social/gnunet-social.c:1248 msgid "replay history of messages up to the given --limit" msgstr "" -#: src/social/gnunet-social.c:1258 +#: src/social/gnunet-social.c:1253 msgid "reconnect to a previously created place" msgstr "" -#: src/social/gnunet-social.c:1263 +#: src/social/gnunet-social.c:1258 msgid "publish something to a place we are hosting" msgstr "" -#: src/social/gnunet-social.c:1268 +#: src/social/gnunet-social.c:1263 msgid "reconnect to a previously entered place" msgstr "" -#: src/social/gnunet-social.c:1273 +#: src/social/gnunet-social.c:1268 msgid "search for state matching exact name" msgstr "" -#: src/social/gnunet-social.c:1278 +#: src/social/gnunet-social.c:1273 msgid "submit something to somebody's place" msgstr "" -#: src/social/gnunet-social.c:1283 +#: src/social/gnunet-social.c:1278 msgid "list of egos and subscribed places" msgstr "" -#: src/social/gnunet-social.c:1288 +#: src/social/gnunet-social.c:1283 msgid "extract and replay history between message IDs --start and --until" msgstr "" -#: src/social/gnunet-social.c:1297 +#: src/social/gnunet-social.c:1292 msgid "application ID to use when connecting" msgstr "" -#: src/social/gnunet-social.c:1303 +#: src/social/gnunet-social.c:1298 msgid "message body or state value" msgstr "" -#: src/social/gnunet-social.c:1309 +#: src/social/gnunet-social.c:1304 #, fuzzy msgid "name or public key of ego" msgstr "Parámetro no válido «%s»\n" -#: src/social/gnunet-social.c:1314 +#: src/social/gnunet-social.c:1309 #, fuzzy msgid "wait for incoming messages" msgstr "Falló al entregar el mensaje '%s'.\n" -#: src/social/gnunet-social.c:1320 +#: src/social/gnunet-social.c:1315 #, fuzzy msgid "GNS name" msgstr "Mostrar el _nombre" -#: src/social/gnunet-social.c:1326 +#: src/social/gnunet-social.c:1321 msgid "peer ID for --guest-enter" msgstr "" -#: src/social/gnunet-social.c:1332 +#: src/social/gnunet-social.c:1327 msgid "name (key) to query from state" msgstr "" -#: src/social/gnunet-social.c:1338 +#: src/social/gnunet-social.c:1333 #, fuzzy msgid "method name" msgstr "Mostrar el _nombre" -#: src/social/gnunet-social.c:1344 +#: src/social/gnunet-social.c:1339 #, fuzzy msgid "number of messages to replay from history" msgstr "número de mensajes a usar por iteración" -#: src/social/gnunet-social.c:1350 +#: src/social/gnunet-social.c:1345 msgid "key address of place" msgstr "" -#: src/social/gnunet-social.c:1356 +#: src/social/gnunet-social.c:1351 msgid "start message ID for history replay" msgstr "" -#: src/social/gnunet-social.c:1361 +#: src/social/gnunet-social.c:1356 msgid "respond to entry requests by admitting all guests" msgstr "" -#: src/social/gnunet-social.c:1367 +#: src/social/gnunet-social.c:1362 msgid "end message ID for history replay" msgstr "" -#: src/social/gnunet-social.c:1372 +#: src/social/gnunet-social.c:1367 msgid "respond to entry requests by refusing all guests" msgstr "" -#: src/social/gnunet-social.c:1382 +#: src/social/gnunet-social.c:1377 msgid "" "gnunet-social - Interact with the social service: enter/leave, send/receive " "messages, access history and state.\n" @@ -6535,7 +6581,7 @@ msgstr "«%s» falló al resolver el método «%s» con error: %s\n" msgid "Wrote %llu bytes of statistics to `%s'\n" msgstr "Escritos %llu bytes de estadísticas a «%s»\n" -#: src/statistics/gnunet-service-statistics.c:1084 +#: src/statistics/gnunet-service-statistics.c:1086 #, c-format msgid "Loading %llu bytes of statistics from `%s'\n" msgstr "Cargando %llu bytes de estadísticas de «%s»\n" @@ -6664,7 +6710,7 @@ msgid "Invalid argument `%s'; expecting unsigned int\n" msgstr "Argumento no válido para '%s' en %s:%d.\n" #: src/testbed/generate-underlay-topology.c:342 -#: src/testbed/gnunet-testbed-profiler.c:284 +#: src/testbed/gnunet-testbed-profiler.c:283 msgid "create COUNT number of peers" msgstr "crea «COUNT» número de pares" @@ -6702,13 +6748,13 @@ msgid "" "deployments" msgstr "" -#: src/testbed/gnunet-daemon-testbed-underlay.c:231 src/testing/list-keys.c:46 -#: src/testing/testing.c:288 src/util/gnunet-ecc.c:298 +#: src/testbed/gnunet-daemon-testbed-underlay.c:233 src/testing/list-keys.c:46 +#: src/testing/testing.c:288 src/util/gnunet-ecc.c:306 #, c-format msgid "Incorrect hostkey file format: %s\n" msgstr "El fichero de máquinas no tiene el formato correcto: %s\n" -#: src/testbed/gnunet-daemon-testbed-underlay.c:469 +#: src/testbed/gnunet-daemon-testbed-underlay.c:471 msgid "Daemon to restrict underlay network in testbed deployments" msgstr "" @@ -6787,11 +6833,11 @@ msgstr "Esperando a los pares para conectar (%u ciclos restantes)...\n" msgid "Spawning process `%s'\n" msgstr "Iniciando el proceso auxiliar (HELPER) «%s»\n" -#: src/testbed/gnunet-testbed-profiler.c:290 +#: src/testbed/gnunet-testbed-profiler.c:289 msgid "tolerate COUNT number of continious timeout failures" msgstr "tolerar un número «COUNT» de continuas expiraciones de plazo" -#: src/testbed/gnunet-testbed-profiler.c:295 +#: src/testbed/gnunet-testbed-profiler.c:294 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 " @@ -7126,44 +7172,44 @@ msgstr "" msgid "# messages dropped due to slow client" msgstr "# mensajes omitidos debido a un cliente lento" -#: src/transport/gnunet-service-transport.c:809 +#: src/transport/gnunet-service-transport.c:818 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:1539 +#: src/transport/gnunet-service-transport.c:1551 #, 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:1699 +#: src/transport/gnunet-service-transport.c:1711 msgid "# bytes total received" msgstr "# total de bytes recibidos" -#: src/transport/gnunet-service-transport.c:1796 +#: src/transport/gnunet-service-transport.c:1808 msgid "# bytes payload received" msgstr "# bytes de «payload» recibidos" -#: src/transport/gnunet-service-transport.c:2113 -#: src/transport/gnunet-service-transport.c:2585 +#: src/transport/gnunet-service-transport.c:2125 +#: src/transport/gnunet-service-transport.c:2597 msgid "# disconnects due to blacklist" msgstr "# desconexiones debido a la lista negra" -#: src/transport/gnunet-service-transport.c:2589 +#: src/transport/gnunet-service-transport.c:2601 #, 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:2697 +#: src/transport/gnunet-service-transport.c:2709 #, 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:2706 +#: src/transport/gnunet-service-transport.c:2718 #, c-format msgid "Adding blacklisting entry for peer `%s':`%s'\n" msgstr "" -#: src/transport/gnunet-service-transport.c:2771 +#: src/transport/gnunet-service-transport.c:2783 #, fuzzy msgid "Transport service is lacking key configuration settings. Exiting.\n" msgstr "" @@ -7315,75 +7361,75 @@ msgstr "# mensajes PING recibidos" msgid "SYN request from peer `%s' ignored due impending shutdown\n" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:2620 +#: src/transport/gnunet-service-transport_neighbours.c:2623 msgid "# Attempts to switch addresses" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:3102 +#: src/transport/gnunet-service-transport_neighbours.c:3105 #, fuzzy msgid "# SYN_ACK messages received" msgstr "# mensajes SET QUOTA recibidos" -#: src/transport/gnunet-service-transport_neighbours.c:3110 +#: src/transport/gnunet-service-transport_neighbours.c:3113 #, fuzzy msgid "# unexpected SYN_ACK messages (no peer)" msgstr "# Mensajes «CONNECT_ACK» inesperados (sin par)" -#: src/transport/gnunet-service-transport_neighbours.c:3128 -#: src/transport/gnunet-service-transport_neighbours.c:3152 +#: src/transport/gnunet-service-transport_neighbours.c:3131 +#: src/transport/gnunet-service-transport_neighbours.c:3155 #, fuzzy msgid "# unexpected SYN_ACK messages (not ready)" msgstr "# Mensajes «CONNECT_ACK» inesperados (no estaba preparado)" -#: src/transport/gnunet-service-transport_neighbours.c:3164 +#: src/transport/gnunet-service-transport_neighbours.c:3167 #, fuzzy msgid "# unexpected SYN_ACK messages (waiting on ATS)" msgstr "# Mensajes «CONNECT_ACK» inesperados (esperando en el ATS)" -#: src/transport/gnunet-service-transport_neighbours.c:3189 +#: src/transport/gnunet-service-transport_neighbours.c:3192 msgid "# Successful attempts to switch addresses" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:3202 +#: src/transport/gnunet-service-transport_neighbours.c:3205 #, fuzzy msgid "# unexpected SYN_ACK messages (disconnecting)" msgstr "# Mensajes «CONNECT_ACK» inesperados (desconectando)" -#: src/transport/gnunet-service-transport_neighbours.c:3374 +#: src/transport/gnunet-service-transport_neighbours.c:3377 #, fuzzy msgid "# ACK messages received" msgstr "# mensajes «REQUEST CONNECT» recibidos" -#: src/transport/gnunet-service-transport_neighbours.c:3410 +#: src/transport/gnunet-service-transport_neighbours.c:3413 #, fuzzy msgid "# unexpected ACK messages" msgstr "# Mensajes «SESSION ACK» inesperados" -#: src/transport/gnunet-service-transport_neighbours.c:3498 +#: src/transport/gnunet-service-transport_neighbours.c:3501 #, fuzzy msgid "# quota messages ignored (malformed)" msgstr "# mensajes de desconexión ignorados (formato antiguo)" -#: src/transport/gnunet-service-transport_neighbours.c:3505 +#: src/transport/gnunet-service-transport_neighbours.c:3508 #, fuzzy msgid "# QUOTA messages received" msgstr "# Mensajes «GAP PUT» recibidos" -#: src/transport/gnunet-service-transport_neighbours.c:3545 +#: src/transport/gnunet-service-transport_neighbours.c:3548 #, fuzzy msgid "# disconnect messages ignored (malformed)" msgstr "# mensajes de desconexión ignorados (formato antiguo)" -#: src/transport/gnunet-service-transport_neighbours.c:3552 +#: src/transport/gnunet-service-transport_neighbours.c:3555 #, fuzzy msgid "# DISCONNECT messages received" msgstr "# mensajes «REQUEST CONNECT» recibidos" -#: src/transport/gnunet-service-transport_neighbours.c:3563 +#: src/transport/gnunet-service-transport_neighbours.c:3566 msgid "# disconnect messages ignored (timestamp)" msgstr "# mensajes de desconexión ignorados (marca temporal)" -#: src/transport/gnunet-service-transport_neighbours.c:3697 +#: src/transport/gnunet-service-transport_neighbours.c:3700 msgid "# disconnected from peer upon explicit request" msgstr "# desconexiones del par debido a una petición explícita" @@ -7418,8 +7464,8 @@ msgstr "# revalidaciones de direcciones iniciadas" #: src/transport/gnunet-service-transport_validation.c:491 #: src/transport/gnunet-service-transport_validation.c:677 -#: src/transport/gnunet-service-transport_validation.c:988 -#: src/transport/gnunet-service-transport_validation.c:1590 +#: src/transport/gnunet-service-transport_validation.c:997 +#: src/transport/gnunet-service-transport_validation.c:1609 #, fuzzy msgid "# validations running" msgstr "Base de datos sqlite ejecutándose\n" @@ -7447,31 +7493,31 @@ msgstr "" msgid "# address revalidations started" msgstr "# revalidaciones de direcciones iniciadas" -#: src/transport/gnunet-service-transport_validation.c:1114 +#: src/transport/gnunet-service-transport_validation.c:1123 msgid "# PING message for different peer received" msgstr "# Mensajes PING recibidos para un par diferente" -#: src/transport/gnunet-service-transport_validation.c:1165 +#: src/transport/gnunet-service-transport_validation.c:1174 #, fuzzy, c-format msgid "Plugin `%s' not available, cannot confirm having this address\n" msgstr "" "No confirmando el PING con dirección «%s» ya que no puedo confirmar tener " "esa dirección.\n" -#: src/transport/gnunet-service-transport_validation.c:1178 +#: src/transport/gnunet-service-transport_validation.c:1187 msgid "# failed address checks during validation" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1181 +#: src/transport/gnunet-service-transport_validation.c:1190 #, c-format msgid "Address `%s' is not one of my addresses, not confirming PING\n" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1189 +#: src/transport/gnunet-service-transport_validation.c:1198 msgid "# successful address checks during validation" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1202 +#: src/transport/gnunet-service-transport_validation.c:1211 #, fuzzy, c-format msgid "" "Not confirming PING from peer `%s' with address `%s' since I cannot confirm " @@ -7480,28 +7526,28 @@ msgstr "" "No confirmando el PING con dirección «%s» ya que no puedo confirmar tener " "esa dirección.\n" -#: src/transport/gnunet-service-transport_validation.c:1257 +#: src/transport/gnunet-service-transport_validation.c:1266 #, fuzzy, c-format msgid "Failed to create PONG signature for peer `%s'\n" msgstr "Se produjo un fallo al crear la página para «%s»\n" -#: src/transport/gnunet-service-transport_validation.c:1308 +#: src/transport/gnunet-service-transport_validation.c:1317 msgid "# PONGs unicast via reliable transport" msgstr "# unicast de PONG vía transporte confiable" -#: src/transport/gnunet-service-transport_validation.c:1317 +#: src/transport/gnunet-service-transport_validation.c:1326 msgid "# PONGs multicast to all available addresses" msgstr "# multicast de PONG a todas las direcciones disponibles" -#: src/transport/gnunet-service-transport_validation.c:1480 +#: src/transport/gnunet-service-transport_validation.c:1499 msgid "# PONGs dropped, no matching pending validation" msgstr "# PONG omitidos, no hay una validación pendiente coincidente" -#: src/transport/gnunet-service-transport_validation.c:1498 +#: src/transport/gnunet-service-transport_validation.c:1517 msgid "# PONGs dropped, signature expired" msgstr "# Mensajes PONG omitidos, firma expirada" -#: src/transport/gnunet-service-transport_validation.c:1553 +#: src/transport/gnunet-service-transport_validation.c:1572 #, fuzzy msgid "# validations succeeded" msgstr "# revalidaciones de direcciones iniciadas" @@ -7698,8 +7744,8 @@ msgid "message size to use" msgstr "tamaño del mensaje" #: src/transport/plugin_transport_http_client.c:1474 -#: src/transport/plugin_transport_http_server.c:2249 -#: src/transport/plugin_transport_http_server.c:3463 +#: src/transport/plugin_transport_http_server.c:2312 +#: src/transport/plugin_transport_http_server.c:3526 #: src/transport/plugin_transport_tcp.c:3890 #: src/transport/plugin_transport_tcp.c:3897 msgid "TCP_STEALTH not supported on this platform.\n" @@ -7713,13 +7759,13 @@ msgstr "" "módulo %s!\n" #: src/transport/plugin_transport_http_client.c:2164 -#: src/transport/plugin_transport_http_server.c:3178 +#: src/transport/plugin_transport_http_server.c:3241 #, c-format msgid "Shutting down plugin `%s'\n" msgstr "Finalizando el módulo «%s»\n" #: src/transport/plugin_transport_http_client.c:2181 -#: src/transport/plugin_transport_http_server.c:3248 +#: src/transport/plugin_transport_http_server.c:3311 #, c-format msgid "Shutdown for plugin `%s' complete\n" msgstr "Finalización del módulo «%s» completa\n" @@ -7729,7 +7775,7 @@ msgstr "Finalización del módulo «%s» completa\n" msgid "Maximum number of requests is %u\n" msgstr "El número máximo de conexiones es %u\n" -#: src/transport/plugin_transport_http_server.c:1727 +#: src/transport/plugin_transport_http_server.c:1756 #, c-format msgid "" "Access from connection %p (%u of %u) for `%s' `%s' url `%s' with upload data " @@ -7738,12 +7784,12 @@ msgstr "" "Acceso desde la conexión %p (%u de %u) para «%s» «%s» URL «%s» con tamaño de " "los datos de subida %u\n" -#: src/transport/plugin_transport_http_server.c:1967 +#: src/transport/plugin_transport_http_server.c:2028 #, c-format msgid "Accepting connection (%u of %u) from `%s'\n" msgstr "Aceptando conexión (%u de %u) desde «%s»\n" -#: src/transport/plugin_transport_http_server.c:1975 +#: src/transport/plugin_transport_http_server.c:2036 #, c-format msgid "" "Server reached maximum number connections (%u), rejecting new connection\n" @@ -7751,7 +7797,7 @@ msgstr "" "El servidor ha alcanzado el número máximo de conexiones (%u), rechazando " "nueva conexión\n" -#: src/transport/plugin_transport_http_server.c:2125 +#: src/transport/plugin_transport_http_server.c:2186 msgid "" "Could not create a new TLS certificate, program `gnunet-transport-" "certificate-creation' could not be started!\n" @@ -7759,84 +7805,84 @@ msgstr "" "¡No se pudo crear un certificado TLS nuevo, el programa «gnunet-transport-" "certificate-creation» no pudo ser iniciado!\n" -#: src/transport/plugin_transport_http_server.c:2148 +#: src/transport/plugin_transport_http_server.c:2209 #, fuzzy, c-format msgid "No usable TLS certificate found and creating one at `%s/%s' failed!\n" msgstr "" "¡No se encontró ningún certificado TLS útil y se produjo un fallo al crear " "uno!\n" -#: src/transport/plugin_transport_http_server.c:2275 +#: src/transport/plugin_transport_http_server.c:2338 msgid "Could not load or create server certificate! Loading plugin failed!\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:2587 +#: src/transport/plugin_transport_http_server.c:2650 msgid "Require valid port number for service in configuration!\n" msgstr "¡Se necesita un puerto válido para el servicio en la configuración!\n" -#: src/transport/plugin_transport_http_server.c:2752 +#: src/transport/plugin_transport_http_server.c:2815 #, c-format msgid "Found %u addresses to report to NAT service\n" msgstr "Encontradas %u direcciones para comunicar al servicio NAT\n" -#: src/transport/plugin_transport_http_server.c:2838 +#: src/transport/plugin_transport_http_server.c:2901 #: src/transport/plugin_transport_udp.c:3622 msgid "Disabling IPv6 since it is not supported on this system!\n" msgstr "¡Deshabilitando IPv6 ya que no está soportado en este sistema!\n" -#: src/transport/plugin_transport_http_server.c:2944 +#: src/transport/plugin_transport_http_server.c:3007 #, c-format msgid "IPv4 support is %s\n" msgstr "El soporte IPv4 es %s\n" -#: src/transport/plugin_transport_http_server.c:2959 +#: src/transport/plugin_transport_http_server.c:3022 #, c-format msgid "IPv6 support is %s\n" msgstr "El soporte IPv6 es %s\n" -#: src/transport/plugin_transport_http_server.c:2965 +#: src/transport/plugin_transport_http_server.c:3028 msgid "Neither IPv4 nor IPv6 are enabled! Fix in configuration\n" msgstr "¡Ni IPv4 ni IPv6 están habilitadas! Corrija la configuración\n" -#: src/transport/plugin_transport_http_server.c:2976 +#: src/transport/plugin_transport_http_server.c:3039 msgid "Port is required! Fix in configuration\n" msgstr "¡El puerto es necesario! Corrija la configuración\n" -#: src/transport/plugin_transport_http_server.c:2982 +#: src/transport/plugin_transport_http_server.c:3045 #, c-format msgid "Using port %u\n" msgstr "Usando puerto %u\n" -#: src/transport/plugin_transport_http_server.c:3001 +#: src/transport/plugin_transport_http_server.c:3064 #, c-format msgid "Specific IPv4 address `%s' in configuration file is invalid!\n" msgstr "" "¡La dirección IPv4 «%s» especificada en el fichero de configuración no es " "válida!\n" -#: src/transport/plugin_transport_http_server.c:3036 +#: src/transport/plugin_transport_http_server.c:3099 #, c-format msgid "Specific IPv6 address `%s' in configuration file is invalid!\n" msgstr "" "¡La dirección IPv6 «%s» especificada en el fichero de configuración no es " "válida!\n" -#: src/transport/plugin_transport_http_server.c:3111 +#: src/transport/plugin_transport_http_server.c:3174 #, c-format msgid "Using external hostname `%s'\n" msgstr "Usando nombre de máquina externo «%s»\n" -#: src/transport/plugin_transport_http_server.c:3132 +#: src/transport/plugin_transport_http_server.c:3195 #, c-format msgid "Notifying transport only about hostname `%s'\n" msgstr "Notificando al transporte sólo el nombre de máquina «%s»\n" -#: src/transport/plugin_transport_http_server.c:3149 +#: src/transport/plugin_transport_http_server.c:3212 #, c-format msgid "Maximum number of connections is %u\n" msgstr "El número máximo de conexiones es %u\n" -#: src/transport/plugin_transport_http_server.c:3475 +#: src/transport/plugin_transport_http_server.c:3538 #, fuzzy msgid "Unable to compile URL regex\n" msgstr "¡Imposible obtener «HELLO» del par!\n" @@ -8171,7 +8217,7 @@ msgstr "" "El código de procesado para el mensaje del tipo %u no llamó a " "«GNUNET_SERVER_receive_done» después de %s\n" -#: src/transport/tcp_service_legacy.c:339 src/util/service.c:2337 +#: src/transport/tcp_service_legacy.c:339 src/util/service.c:2346 #, c-format msgid "Unknown address family %d\n" msgstr "Familia de direcciones %d desconocida\n" @@ -8220,52 +8266,52 @@ msgstr "Se produjo un fallo al inciar «%s» en «%s»\n" msgid "Service `%s' runs at %s\n" msgstr "El servicio «%s» se ejecuta en %s\n" -#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:1501 +#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:1500 msgid "Service process failed to initialize\n" msgstr "No se pudo inicializar el proceso del servicio\n" -#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:1505 +#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:1504 msgid "Service process could not initialize server function\n" msgstr "" "No se pudo inicializar la función del servidor en el proceso del servicio\n" -#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:1509 +#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:1508 msgid "Service process failed to report status\n" msgstr "El proceso del servicio no devolvió un estado\n" #: src/transport/tcp_service_legacy.c:1313 src/util/disk.c:1488 -#: src/util/service.c:1379 +#: src/util/service.c:1378 #, c-format msgid "Cannot obtain information about user `%s': %s\n" msgstr "No se pudo obtener información acerca del usuario «%s»: %s\n" -#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1381 +#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1380 msgid "No such user" msgstr "No existe tal usuario" -#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1400 +#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1399 #, c-format msgid "Cannot change user/group to `%s': %s\n" msgstr "Imposible cambiar el usuario/grupo a «%s»: %s\n" -#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:1728 +#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:1727 msgid "do daemonize (detach from terminal)" msgstr "demonizar (desasociar del terminal)" -#: src/transport/tcp_service_legacy.c:1448 src/util/program.c:244 -#: src/util/service.c:1791 +#: src/transport/tcp_service_legacy.c:1448 src/util/program.c:255 +#: src/util/service.c:1790 #, fuzzy, c-format msgid "Malformed configuration file `%s', exit ...\n" msgstr "Se produjo un fallo al borrar el fichero de configuración %s\n" -#: src/transport/tcp_service_legacy.c:1458 src/util/program.c:261 -#: src/util/service.c:1802 +#: src/transport/tcp_service_legacy.c:1458 src/util/program.c:272 +#: src/util/service.c:1801 #, fuzzy msgid "Malformed configuration, exit ...\n" msgstr "Se produjo un fallo al borrar el fichero de configuración %s\n" -#: src/transport/tcp_service_legacy.c:1463 src/util/program.c:256 -#: src/util/service.c:1808 +#: src/transport/tcp_service_legacy.c:1463 src/util/program.c:267 +#: src/util/service.c:1807 #, c-format msgid "Could not access configuration file `%s'\n" msgstr "No se pudo acceder al fichero de configuración «%s»\n" @@ -8304,58 +8350,58 @@ msgstr "Los metadatos serializados «%s» son mayores de lo permitido (%u>%u)" msgid "Metadata `%s' failed to deserialize" msgstr "Se produjo un fallo al deserializar los metadatos «%s»" -#: src/util/client.c:882 +#: src/util/client.c:911 #, c-format msgid "Need a non-empty hostname for service `%s'.\n" msgstr "Se necesita un nombre de máquina no vacío para el servicio «%s».\n" -#: src/util/common_logging.c:256 src/util/common_logging.c:1129 +#: src/util/common_logging.c:259 src/util/common_logging.c:1132 msgid "DEBUG" msgstr "DEPURACIÓN" -#: src/util/common_logging.c:258 src/util/common_logging.c:1127 +#: src/util/common_logging.c:261 src/util/common_logging.c:1130 msgid "INFO" msgstr "INFORMACIÓN" -#: src/util/common_logging.c:260 src/util/common_logging.c:1125 +#: src/util/common_logging.c:263 src/util/common_logging.c:1128 msgid "MESSAGE" msgstr "MENSAJE" -#: src/util/common_logging.c:262 src/util/common_logging.c:1123 +#: src/util/common_logging.c:265 src/util/common_logging.c:1126 msgid "WARNING" msgstr "PELIGRO" -#: src/util/common_logging.c:264 src/util/common_logging.c:1121 +#: src/util/common_logging.c:267 src/util/common_logging.c:1124 msgid "ERROR" msgstr "ERROR" -#: src/util/common_logging.c:266 src/util/common_logging.c:1131 +#: src/util/common_logging.c:269 src/util/common_logging.c:1134 msgid "NONE" msgstr "NINGUNO" -#: src/util/common_logging.c:879 +#: src/util/common_logging.c:882 #, c-format msgid "Message `%.*s' repeated %u times in the last %s\n" msgstr "Mensaje `%.*s» repetido %u veces en el último %s\n" -#: src/util/common_logging.c:1132 +#: src/util/common_logging.c:1135 msgid "INVALID" msgstr "NO VÁLIDO" -#: src/util/common_logging.c:1302 +#: src/util/common_logging.c:1326 msgid "unknown address" msgstr "dirección desconocida" -#: src/util/common_logging.c:1344 +#: src/util/common_logging.c:1368 msgid "invalid address" msgstr "dirección no válida" -#: src/util/common_logging.c:1362 +#: src/util/common_logging.c:1386 #, c-format msgid "Configuration fails to specify option `%s' in section `%s'!\n" msgstr "¡La configuración no especifica la opción «%s» en la sección «%s»!\n" -#: src/util/common_logging.c:1383 +#: src/util/common_logging.c:1407 #, c-format msgid "" "Configuration specifies invalid value for option `%s' in section `%s': %s\n" @@ -8363,17 +8409,17 @@ msgstr "" "La configuración especifica un valor no válido en la opción «%s» de la " "sección «%s»: %s\n" -#: src/util/configuration.c:286 +#: src/util/configuration.c:296 #, c-format msgid "Syntax error while deserializing in line %u\n" msgstr "Error de sintaxis en la línea %u mientras se deserializaba\n" -#: src/util/configuration.c:344 +#: src/util/configuration.c:355 #, fuzzy, c-format msgid "Error while reading file `%s'\n" msgstr "Error decodificando clave %u\n" -#: src/util/configuration.c:1017 +#: src/util/configuration.c:1034 #, c-format msgid "" "Configuration value '%s' for '%s' in section '%s' is not in set of legal " @@ -8382,17 +8428,17 @@ msgstr "" "El valor de configuración «%s» para «%s» de la sección «%s» no está dentro " "de las opciones legales\n" -#: src/util/configuration.c:1136 +#: src/util/configuration.c:1153 #, c-format msgid "Recursive expansion suspected, aborting $-expansion for term `%s'\n" msgstr "" -#: src/util/configuration.c:1169 +#: src/util/configuration.c:1186 #, fuzzy, c-format msgid "Missing closing `%s' in option `%s'\n" msgstr "Falta la opción «%s» para la operación «%s»\n" -#: src/util/configuration.c:1237 +#: src/util/configuration.c:1254 #, c-format msgid "" "Failed to expand `%s' in `%s' as it is neither found in [PATHS] nor defined " @@ -8408,43 +8454,43 @@ msgstr "" "El tamaño del fichero en disco es incorrecto para este «Bloom " "filter» (esperado %llu, tiene %llu)\n" -#: src/util/crypto_ecc.c:777 +#: src/util/crypto_ecc.c:810 #, c-format msgid "ECC signing failed at %s:%d: %s\n" msgstr "El firmado ECC falló en %s:%d: %s\n" -#: src/util/crypto_ecc.c:827 +#: src/util/crypto_ecc.c:860 #, fuzzy, c-format msgid "EdDSA signing failed at %s:%d: %s\n" msgstr "El firmado ECC falló en %s:%d: %s\n" -#: src/util/crypto_ecc.c:901 +#: src/util/crypto_ecc.c:934 #, fuzzy, c-format msgid "ECDSA signature verification failed at %s:%d: %s\n" msgstr "La verificación de la firma RSA fallo en %s:%d: %s\n" -#: src/util/crypto_ecc.c:958 +#: src/util/crypto_ecc.c:991 #, fuzzy, c-format msgid "EdDSA signature verification failed at %s:%d: %s\n" msgstr "La verificación de la firma RSA fallo en %s:%d: %s\n" -#: src/util/crypto_ecc_setup.c:122 src/util/crypto_ecc_setup.c:160 -#: src/util/crypto_ecc_setup.c:278 src/util/crypto_ecc_setup.c:316 +#: src/util/crypto_ecc_setup.c:122 src/util/crypto_ecc_setup.c:161 +#: src/util/crypto_ecc_setup.c:279 src/util/crypto_ecc_setup.c:317 #, c-format msgid "Could not acquire lock on file `%s': %s...\n" msgstr "No se pudo bloquear el fichero «%s»: %s...\n" -#: src/util/crypto_ecc_setup.c:127 src/util/crypto_ecc_setup.c:283 +#: src/util/crypto_ecc_setup.c:128 src/util/crypto_ecc_setup.c:284 msgid "Creating a new private key. This may take a while.\n" msgstr "Generando una clave privada nueva. Esto puede tomar un tiempo.\n" -#: src/util/crypto_ecc_setup.c:164 src/util/crypto_ecc_setup.c:320 +#: src/util/crypto_ecc_setup.c:165 src/util/crypto_ecc_setup.c:322 msgid "This may be ok if someone is currently generating a private key.\n" msgstr "" "Esto puede estar bien si alguien está actualmente generando una clave " "privada.\n" -#: src/util/crypto_ecc_setup.c:194 src/util/crypto_ecc_setup.c:350 +#: src/util/crypto_ecc_setup.c:195 src/util/crypto_ecc_setup.c:352 #, c-format msgid "" "When trying to read key file `%s' I found %u bytes but I need at least %u.\n" @@ -8452,13 +8498,13 @@ msgstr "" "Cuando se intentaba leer el fichero de claves «%s» se encontraron %u bytes " "pero al menos %u son necesarios.\n" -#: src/util/crypto_ecc_setup.c:198 src/util/crypto_ecc_setup.c:354 +#: src/util/crypto_ecc_setup.c:199 src/util/crypto_ecc_setup.c:356 msgid "This may be ok if someone is currently generating a key.\n" msgstr "" "Esto puede ser correcto si alguien está actualmente generando una clave de " "máquina.\n" -#: src/util/crypto_ecc_setup.c:413 +#: src/util/crypto_ecc_setup.c:415 #, fuzzy msgid "Could not load peer's private key\n" msgstr "No se pudo acceder a la clave de máquina.\n" @@ -8651,22 +8697,22 @@ msgstr "" msgid "Manipulate GNUnet configuration files" msgstr "Manipular ficheros de configuración de GNUnet" -#: src/util/gnunet-ecc.c:84 +#: src/util/gnunet-ecc.c:94 #, c-format msgid "Failed to open `%s': %s\n" msgstr "Se produjo un fallo al abrir «%s»: %s\n" -#: src/util/gnunet-ecc.c:120 +#: src/util/gnunet-ecc.c:130 #, fuzzy, c-format msgid "Generating %u keys like %s, please wait" msgstr "Generando %u claves, por favor, espere" -#: src/util/gnunet-ecc.c:133 +#: src/util/gnunet-ecc.c:143 #, c-format msgid "Generating %u keys, please wait" msgstr "Generando %u claves, por favor, espere" -#: src/util/gnunet-ecc.c:174 +#: src/util/gnunet-ecc.c:184 #, c-format msgid "" "\n" @@ -8675,60 +8721,70 @@ msgstr "" "\n" "Se produjo un fallo al escribir en «%s»: %s\n" -#: src/util/gnunet-ecc.c:184 +#: src/util/gnunet-ecc.c:194 #, fuzzy, c-format msgid "" "\n" "Finished!\n" msgstr "¡Finalizado!\n" -#: src/util/gnunet-ecc.c:187 +#: src/util/gnunet-ecc.c:197 #, c-format msgid "" "\n" "Error, %u keys not generated\n" msgstr "" -#: src/util/gnunet-ecc.c:280 +#: src/util/gnunet-ecc.c:288 #, fuzzy, c-format msgid "Hostkeys file `%s' not found\n" msgstr "El fichero de máquinas %s no fue encontrado\n" -#: src/util/gnunet-ecc.c:291 +#: src/util/gnunet-ecc.c:299 #, fuzzy, c-format msgid "Hostkeys file `%s' is empty\n" msgstr "El archivo de amigos «%s» está vacío.\n" -#: src/util/gnunet-ecc.c:313 +#: src/util/gnunet-ecc.c:321 #, fuzzy, c-format msgid "Could not read hostkey file: %s\n" msgstr "¡No se puede leer el fichero de claves de máquina!\n" -#: src/util/gnunet-ecc.c:364 +#: src/util/gnunet-ecc.c:372 msgid "No hostkey file specified on command line\n" msgstr "No se ha especificado la clave de máquina en la línea de comandos\n" -#: src/util/gnunet-ecc.c:416 +#: src/util/gnunet-ecc.c:437 msgid "list keys included in a file (for testing)" msgstr "" -#: src/util/gnunet-ecc.c:421 +#: src/util/gnunet-ecc.c:442 msgid "number of keys to list included in a file (for testing)" msgstr "" -#: src/util/gnunet-ecc.c:426 +#: src/util/gnunet-ecc.c:447 msgid "create COUNT public-private key pairs (for testing)" msgstr "crea «COUNT» pares de claves pública-privada (para pruebas)" -#: src/util/gnunet-ecc.c:430 +#: src/util/gnunet-ecc.c:451 msgid "print the public key in ASCII format" msgstr "imprime la clave pública en formato ASCII" -#: src/util/gnunet-ecc.c:434 +#: src/util/gnunet-ecc.c:455 +#, fuzzy +msgid "print the private key in ASCII format" +msgstr "imprime la clave pública en formato ASCII" + +#: src/util/gnunet-ecc.c:459 +#, fuzzy +msgid "print the public key in HEX format" +msgstr "imprime la clave pública en formato ASCII" + +#: src/util/gnunet-ecc.c:463 msgid "print examples of ECC operations (used for compatibility testing)" msgstr "" -#: src/util/gnunet-ecc.c:449 +#: src/util/gnunet-ecc.c:479 msgid "Manipulate GNUnet private ECC key files" msgstr "Manipular los ficheros de clave privada ECC de GNUnet" @@ -8823,7 +8879,7 @@ msgstr "Error escribiendo a «%s»: %s\n" msgid "Unable to shorten unix path `%s' while keeping name unique\n" msgstr "Imposible acortar la ruta unix «%s» manteniendo el nombre único\n" -#: src/util/network.c:1793 src/util/network.c:1969 +#: src/util/network.c:1793 src/util/network.c:1977 #, c-format msgid "" "Fatal internal logic error, process hangs in `%s' (abort with CTRL-C)!\n" @@ -8879,7 +8935,7 @@ 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/resolver_api.c:204 +#: src/util/resolver_api.c:203 #, c-format msgid "" "Missing `%s' for `%s' in configuration, DNS resolution will be unavailable.\n" @@ -8894,12 +8950,12 @@ msgstr "" "¡Se debe especificar «%s» o una dirección numérica IP para «%s» de «%s» en " "la configuración!\n" -#: src/util/resolver_api.c:815 +#: src/util/resolver_api.c:827 #, c-format msgid "Timeout trying to resolve hostname `%s'.\n" msgstr "Expiración de plazo intentando resolver el nombre de máquina «%s».\n" -#: src/util/resolver_api.c:827 +#: src/util/resolver_api.c:840 #, c-format msgid "Timeout trying to resolve IP address `%s'.\n" msgstr "Expiración de plazo intentando resolver la dirección IP «%s».\n" @@ -8907,24 +8963,24 @@ msgstr "Expiración de plazo intentando resolver la dirección IP «%s».\n" # Miguel: He traducido "default" por "predeterminado", la locución # "por defecto" no tiene sentido en sitios como este y he tratado # de ser consistente. -#: src/util/resolver_api.c:1004 +#: src/util/resolver_api.c:1024 #, fuzzy msgid "Resolver not configured correctly.\n" msgstr "¡El servicio predeterminado «%s» no está configurado correctamente!\n" -#: src/util/resolver_api.c:1086 src/util/resolver_api.c:1107 -#: src/util/resolver_api.c:1121 +#: src/util/resolver_api.c:1110 src/util/resolver_api.c:1133 +#: src/util/resolver_api.c:1147 #, fuzzy, c-format msgid "Could not resolve our FQDN: %s\n" msgstr "" "No se pudo resolver nuestro nombre de dominio cualificado (FQDN) : %s\n" -#: src/util/service.c:1306 +#: src/util/service.c:1305 msgid "" "Could not bind to any of the ports I was supposed to, refusing to run!\n" msgstr "" -#: src/util/service.c:2082 +#: src/util/service.c:2091 #, fuzzy, c-format msgid "" "Processing code for message of type %u did not call " @@ -9003,67 +9059,67 @@ msgstr "días" msgid "end of time" msgstr "fin del plazo" -#: src/util/strings.c:1269 +#: src/util/strings.c:1270 msgid "IPv6 address did not start with `['\n" msgstr "La dirección IPv6 no empezaba con «[»\n" -#: src/util/strings.c:1277 +#: src/util/strings.c:1278 msgid "IPv6 address did contain ':' to separate port number\n" msgstr "La dirección IPv6 contenía «:» para separar el número de puerto\n" -#: src/util/strings.c:1283 +#: src/util/strings.c:1284 msgid "IPv6 address did contain ']' before ':' to separate port number\n" msgstr "" "La dirección IPv6 contenía «]» antes de «:» para separar el número de " "puerto\n" -#: src/util/strings.c:1290 +#: src/util/strings.c:1291 msgid "IPv6 address did contain a valid port number after the last ':'\n" msgstr "" "La dirección IPv6 contenía un número de puerto válido después del último " "«:»\n" -#: src/util/strings.c:1299 +#: src/util/strings.c:1300 #, c-format msgid "Invalid IPv6 address `%s': %s\n" msgstr "Dirección IPv6 «%s» no válida: %s\n" -#: src/util/strings.c:1571 src/util/strings.c:1587 +#: src/util/strings.c:1572 src/util/strings.c:1588 msgid "Port not in range\n" msgstr "" -#: src/util/strings.c:1596 +#: src/util/strings.c:1597 #, fuzzy, c-format msgid "Malformed port policy `%s'\n" msgstr "Se produjo un fallo al iniciar el servicio «%s»\n" -#: src/util/strings.c:1679 src/util/strings.c:1710 src/util/strings.c:1758 -#: src/util/strings.c:1779 +#: src/util/strings.c:1680 src/util/strings.c:1711 src/util/strings.c:1759 +#: src/util/strings.c:1780 #, c-format msgid "Invalid format for IP: `%s'\n" msgstr "Formato no válido para la IP: «%s»\n" -#: src/util/strings.c:1736 +#: src/util/strings.c:1737 #, c-format msgid "Invalid network notation ('/%d' is not legal in IPv4 CIDR)." msgstr "Notación de red no válida («/%d» no es válido en IPv4 CIDR)." -#: src/util/strings.c:1788 +#: src/util/strings.c:1789 #, fuzzy, c-format msgid "Invalid format: `%s'\n" msgstr "Formato de tiempo no válido «%s»\n" -#: src/util/strings.c:1840 +#: src/util/strings.c:1841 #, c-format msgid "Invalid network notation (does not end with ';': `%s')\n" msgstr "Notación de red no válida (no termina con «;»: «%s»)\n" -#: src/util/strings.c:1890 +#: src/util/strings.c:1891 #, c-format msgid "Wrong format `%s' for netmask\n" msgstr "Formato «%s» erroneo para máscara de red\n" -#: src/util/strings.c:1921 +#: src/util/strings.c:1922 #, c-format msgid "Wrong format `%s' for network\n" msgstr "Formato «%s» erroneo para red\n" @@ -9116,65 +9172,65 @@ msgstr "# Paquetes ICMPv4 omitidos (no permitido)" msgid "# ICMPv6 packets dropped (not allowed)" msgstr "# Paquetes ICMPv6 omitidos (no permitido)" -#: src/vpn/gnunet-service-vpn.c:2232 +#: src/vpn/gnunet-service-vpn.c:2235 msgid "# Packets received from TUN interface" msgstr "# Paquetes recibidos de la interfaz TUN" -#: src/vpn/gnunet-service-vpn.c:2265 src/vpn/gnunet-service-vpn.c:2301 +#: src/vpn/gnunet-service-vpn.c:2268 src/vpn/gnunet-service-vpn.c:2304 #, c-format msgid "Packet received for unmapped destination `%s' (dropping it)\n" msgstr "Paquete recibido para el destino «%s» no mapeado (omitiéndolo)\n" -#: src/vpn/gnunet-service-vpn.c:2311 +#: src/vpn/gnunet-service-vpn.c:2314 msgid "Received IPv4 packet with options (dropping it)\n" msgstr "Recibido paquete IPv4 con opciones (omitiéndolo)\n" -#: src/vpn/gnunet-service-vpn.c:2325 +#: src/vpn/gnunet-service-vpn.c:2328 #, c-format msgid "Received packet of unknown protocol %d from TUN (dropping it)\n" msgstr "Recibido paquete de protocolo %d desconocido desde TUN (omitiéndolo)\n" -#: src/vpn/gnunet-service-vpn.c:2364 +#: src/vpn/gnunet-service-vpn.c:2367 msgid "Failed to find unallocated IPv4 address in VPN's range\n" msgstr "No se encontraron direcciones IPv4 libres en el rango de la VPN\n" -#: src/vpn/gnunet-service-vpn.c:2419 +#: src/vpn/gnunet-service-vpn.c:2422 msgid "Failed to find unallocated IPv6 address in VPN's range\n" msgstr "No se encontraron direcciones IPv6 libres en el rango de la VPN\n" -#: src/vpn/gnunet-service-vpn.c:2461 src/vpn/gnunet-service-vpn.c:2683 +#: src/vpn/gnunet-service-vpn.c:2464 src/vpn/gnunet-service-vpn.c:2686 msgid "# Active destinations" msgstr "# Destinos activos" -#: src/vpn/gnunet-service-vpn.c:2732 +#: src/vpn/gnunet-service-vpn.c:2735 msgid "Failed to allocate IP address for new destination\n" msgstr "" "Se produjo un fallo al alojar las direcciones IP para el nuevo destino\n" -#: src/vpn/gnunet-service-vpn.c:2995 +#: src/vpn/gnunet-service-vpn.c:2998 #, fuzzy msgid "Must specify valid IPv6 address" msgstr "«%s» no es una dirección IP válida.\n" -#: src/vpn/gnunet-service-vpn.c:3019 +#: src/vpn/gnunet-service-vpn.c:3022 msgid "Must specify valid IPv6 mask" msgstr "" -#: src/vpn/gnunet-service-vpn.c:3027 +#: src/vpn/gnunet-service-vpn.c:3030 msgid "IPv6 support disabled as this system does not support IPv6\n" msgstr "" "El soporte de IPv6 se deshabilita porque este sistema no soporta IPv6\n" -#: src/vpn/gnunet-service-vpn.c:3040 +#: src/vpn/gnunet-service-vpn.c:3043 #, fuzzy msgid "Must specify valid IPv4 address" msgstr "«%s» no es una dirección IP válida.\n" -#: src/vpn/gnunet-service-vpn.c:3053 +#: src/vpn/gnunet-service-vpn.c:3056 msgid "Must specify valid IPv4 mask" msgstr "" -#: src/vpn/gnunet-service-vpn.c:3063 +#: src/vpn/gnunet-service-vpn.c:3066 msgid "IPv4 support disabled as this system does not support IPv4\n" msgstr "" "El soporte de IPv4 se deshabilita porque este sistema no soporta IPv4\n" @@ -9244,26 +9300,37 @@ 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:705 +#: src/zonemaster/gnunet-service-zonemaster.c:706 msgid "Failed to connect to the namestore!\n" msgstr "¡Se produjo un fallo al conectar con el almacén de nombres!\n" -#: src/include/gnunet_common.h:674 src/include/gnunet_common.h:681 -#: src/include/gnunet_common.h:691 src/include/gnunet_common.h:699 +#: src/include/gnunet_common.h:689 src/include/gnunet_common.h:696 +#: src/include/gnunet_common.h:706 src/include/gnunet_common.h:714 #, c-format msgid "Assertion failed at %s:%d.\n" msgstr "Aserción fallida en %s:%d.\n" -#: src/include/gnunet_common.h:711 +#: src/include/gnunet_common.h:726 #, c-format msgid "External protocol violation detected at %s:%d.\n" msgstr "Violación externa del protocolo detectada en %s:%d.\n" -#: src/include/gnunet_common.h:738 src/include/gnunet_common.h:747 +#: src/include/gnunet_common.h:753 src/include/gnunet_common.h:762 #, c-format msgid "`%s' failed on file `%s' at %s:%d with error: %s\n" msgstr "«%s» falló en el fichero «%s» en %s:%d con el error: %s\n" +#~ msgid "Failed to create indices\n" +#~ msgstr "Se produjo un fallo al crear los índices\n" + +#, fuzzy +#~ msgid "`%s:%s' failed at %s:%d with error: %s\n" +#~ msgstr "«%s:%s» falló en %s:%d con error: %s" + +#, fuzzy +#~ msgid "Unable to connect to Postgres database '%s': %s\n" +#~ msgstr "Imposible guardar el fichero de configuración '%s':" + #, fuzzy #~ msgid "Misconfiguration (can not connect to the ARM service)" #~ msgstr "¡Se produjo un fallo al conectar con el servicio dv!\n" @@ -9473,9 +9540,6 @@ msgstr "«%s» falló en el fichero «%s» en %s:%d con el error: %s\n" #~ msgid "# transmission request failures" #~ msgstr "# fallos en peticiones de transmisión" -#~ msgid "# bytes sent to datastore" -#~ msgstr "# bytes mandados al almacén de datos" - #~ msgid "Failed to receive status response from database." #~ msgstr "" #~ "Se produjo un fallo al recibir el estado de respuesta de la base de datos." @@ -9857,10 +9921,6 @@ msgstr "«%s» falló en el fichero «%s» en %s:%d con el error: %s\n" #~ "información de pares (PEERINFO)." #, fuzzy -#~ msgid "Error reading sensor version\n" -#~ msgstr "Error leyendo «%s»: %s" - -#, fuzzy #~ msgid "Error reading sensor category\n" #~ msgstr "Error leyendo «%s»: %s" diff --git 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: 2017-03-31 19:22-0500\n" +"POT-Creation-Date: 2018-01-02 02:33+0100\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" @@ -239,14 +239,14 @@ msgid "Require valid port number for service `%s' in configuration!\n" msgstr "" #: src/arm/gnunet-service-arm.c:430 src/transport/plugin_transport_tcp.c:1176 -#: src/transport/tcp_service_legacy.c:613 src/util/client.c:480 +#: src/transport/tcp_service_legacy.c:613 src/util/client.c:505 #: src/util/service.c:682 #, c-format msgid "UNIXPATH `%s' too long, maximum length is %llu\n" msgstr "" #: src/arm/gnunet-service-arm.c:434 src/transport/plugin_transport_tcp.c:1180 -#: src/transport/tcp_service_legacy.c:617 src/util/client.c:485 +#: src/transport/tcp_service_legacy.c:617 src/util/client.c:510 #: src/util/service.c:687 #, c-format msgid "Using `%s' instead\n" @@ -267,7 +267,7 @@ msgid "Have neither PORT nor UNIXPATH for service `%s', but one is required\n" msgstr "" #: src/arm/gnunet-service-arm.c:513 -#: src/transport/plugin_transport_http_server.c:2621 +#: src/transport/plugin_transport_http_server.c:2684 #: src/transport/plugin_transport_tcp.c:1259 #: src/transport/tcp_service_legacy.c:696 src/util/service.c:782 #, c-format @@ -275,7 +275,7 @@ msgid "Failed to resolve `%s': %s\n" msgstr "Résolution de « %s » échouée : %s\n" #: src/arm/gnunet-service-arm.c:532 -#: src/transport/plugin_transport_http_server.c:2639 +#: src/transport/plugin_transport_http_server.c:2702 #: src/transport/plugin_transport_tcp.c:1278 #: src/transport/tcp_service_legacy.c:715 src/util/service.c:802 #, c-format @@ -369,13 +369,11 @@ msgid "" "%llu\n" msgstr "" -#: src/ats/gnunet-ats-solver-eval.c:3294 -#: src/ats-tests/gnunet-solver-eval.c:939 +#: src/ats/gnunet-ats-solver-eval.c:3294 src/ats-tests/gnunet-solver-eval.c:939 msgid "solver to use" msgstr "solveur utilisé" -#: src/ats/gnunet-ats-solver-eval.c:3299 -#: src/ats-tests/gnunet-solver-eval.c:945 +#: src/ats/gnunet-ats-solver-eval.c:3299 src/ats-tests/gnunet-solver-eval.c:945 #: src/ats-tests/gnunet-solver-eval.c:950 msgid "experiment to use" msgstr "" @@ -663,53 +661,53 @@ msgstr "" msgid "Invalid peer ID `%s'\n" msgstr "" -#: src/cadet/gnunet-cadet.c:702 +#: src/cadet/gnunet-cadet.c:703 #, c-format msgid "Invalid tunnel owner `%s'\n" msgstr "" -#: src/cadet/gnunet-cadet.c:775 +#: src/cadet/gnunet-cadet.c:776 msgid "Extra arguments are not applicable in combination with this option.\n" msgstr "" -#: src/cadet/gnunet-cadet.c:866 +#: src/cadet/gnunet-cadet.c:867 #, c-format msgid "Invalid target `%s'\n" msgstr "" -#: src/cadet/gnunet-cadet.c:903 +#: src/cadet/gnunet-cadet.c:904 msgid "No action requested\n" msgstr "" -#: src/cadet/gnunet-cadet.c:928 +#: src/cadet/gnunet-cadet.c:929 msgid "Provide information about a particular connection" msgstr "" -#: src/cadet/gnunet-cadet.c:933 +#: src/cadet/gnunet-cadet.c:934 msgid "Activate echo mode" msgstr "" -#: src/cadet/gnunet-cadet.c:938 +#: src/cadet/gnunet-cadet.c:939 msgid "Dump debug information to STDERR" msgstr "" -#: src/cadet/gnunet-cadet.c:944 +#: src/cadet/gnunet-cadet.c:945 msgid "Listen for connections using a shared secret among sender and recipient" msgstr "" -#: src/cadet/gnunet-cadet.c:951 +#: src/cadet/gnunet-cadet.c:952 msgid "Provide information about a patricular peer" msgstr "" -#: src/cadet/gnunet-cadet.c:957 +#: src/cadet/gnunet-cadet.c:958 msgid "Provide information about all peers" msgstr "" -#: src/cadet/gnunet-cadet.c:963 +#: src/cadet/gnunet-cadet.c:964 msgid "Provide information about a particular tunnel" msgstr "" -#: src/cadet/gnunet-cadet.c:969 +#: src/cadet/gnunet-cadet.c:970 msgid "Provide information about all tunnels" msgstr "" @@ -1031,7 +1029,7 @@ msgid "" msgstr "" #: src/conversation/gnunet_gst.c:622 -#: src/conversation/gnunet-helper-audio-playback-gst.c:356 +#: src/conversation/gnunet-helper-audio-playback-gst.c:361 #, c-format msgid "Read error from STDIN: %d %s\n" msgstr "" @@ -1041,59 +1039,59 @@ msgstr "" msgid "pa_stream_write() failed: %s\n" msgstr "pa_stream_write() échoué : %s\n" -#: src/conversation/gnunet-helper-audio-playback.c:607 +#: src/conversation/gnunet-helper-audio-playback.c:612 msgid "gnunet-helper-audio-playback - Got signal, exiting\n" msgstr "" -#: src/conversation/gnunet-helper-audio-playback.c:632 +#: src/conversation/gnunet-helper-audio-playback.c:637 #: src/conversation/gnunet-helper-audio-record.c:545 msgid "Connection established.\n" msgstr "" -#: src/conversation/gnunet-helper-audio-playback.c:637 +#: src/conversation/gnunet-helper-audio-playback.c:642 #: src/conversation/gnunet-helper-audio-record.c:550 #, c-format msgid "pa_stream_new() failed: %s\n" msgstr "pa_stream_new() échoué : %s\n" -#: src/conversation/gnunet-helper-audio-playback.c:651 +#: src/conversation/gnunet-helper-audio-playback.c:656 #, c-format msgid "pa_stream_connect_playback() failed: %s\n" msgstr "pa_stream_connect_playback() échoué : %s\n" -#: src/conversation/gnunet-helper-audio-playback.c:664 +#: src/conversation/gnunet-helper-audio-playback.c:669 #: src/conversation/gnunet-helper-audio-record.c:576 #, c-format msgid "Connection failure: %s\n" msgstr "" -#: src/conversation/gnunet-helper-audio-playback.c:685 +#: src/conversation/gnunet-helper-audio-playback.c:690 #: src/conversation/gnunet-helper-audio-record.c:599 msgid "Wrong Spec\n" msgstr "Spécification incorrecte\n" -#: src/conversation/gnunet-helper-audio-playback.c:691 +#: src/conversation/gnunet-helper-audio-playback.c:696 #: src/conversation/gnunet-helper-audio-record.c:605 msgid "pa_mainloop_new() failed.\n" msgstr "pa_mainloop_new() échoué.\n" -#: src/conversation/gnunet-helper-audio-playback.c:705 +#: src/conversation/gnunet-helper-audio-playback.c:710 #: src/conversation/gnunet-helper-audio-record.c:620 msgid "pa_context_new() failed.\n" msgstr "pa_context_new() échoué.\n" -#: src/conversation/gnunet-helper-audio-playback.c:712 +#: src/conversation/gnunet-helper-audio-playback.c:717 #: src/conversation/gnunet-helper-audio-record.c:626 #, c-format msgid "pa_context_connect() failed: %s\n" msgstr "pa_context_connect() échoué : %s\n" -#: src/conversation/gnunet-helper-audio-playback.c:718 +#: src/conversation/gnunet-helper-audio-playback.c:723 #: src/conversation/gnunet-helper-audio-record.c:632 msgid "pa_mainloop_run() failed.\n" msgstr "pa_mainloop_run() échoué.\n" -#: src/conversation/gnunet-helper-audio-playback.c:790 +#: src/conversation/gnunet-helper-audio-playback.c:795 #, c-format msgid "Read error from STDIN: %s\n" msgstr "" @@ -1155,7 +1153,12 @@ msgstr "ogg_stream_init() échoué.\n" msgid "Failed to allocate %u bytes for second packet\n" msgstr "" -#: src/conversation/microphone.c:119 +#: src/conversation/gnunet-service-conversation.c:1276 +#, c-format +msgid "Could not open line, port %s already in use!\n" +msgstr "" + +#: src/conversation/microphone.c:121 msgid "Could not start record audio helper\n" msgstr "" @@ -1238,25 +1241,25 @@ msgstr "" msgid "# dequeuing CAR (duplicate request)" msgstr "" -#: src/core/gnunet-service-core.c:440 +#: src/core/gnunet-service-core.c:443 #, c-format msgid "# bytes of messages of type %u received" msgstr "" -#: src/core/gnunet-service-core.c:538 +#: src/core/gnunet-service-core.c:541 msgid "# messages discarded (session disconnected)" msgstr "" -#: src/core/gnunet-service-core.c:876 +#: src/core/gnunet-service-core.c:879 #, c-format msgid "# messages of type %u discarded (client busy)" msgstr "" -#: src/core/gnunet-service-core.c:985 +#: src/core/gnunet-service-core.c:988 msgid "Core service is lacking HOSTKEY configuration setting. Exiting.\n" msgstr "" -#: src/core/gnunet-service-core.c:1006 +#: src/core/gnunet-service-core.c:1009 #, c-format msgid "Core service of `%s' ready.\n" msgstr "" @@ -1269,124 +1272,124 @@ msgstr "" msgid "# bytes decrypted" msgstr "" -#: src/core/gnunet-service-core_kx.c:725 +#: src/core/gnunet-service-core_kx.c:728 msgid "# PAYLOAD dropped (out of order)" msgstr "" -#: src/core/gnunet-service-core_kx.c:775 +#: src/core/gnunet-service-core_kx.c:778 msgid "# key exchanges initiated" msgstr "" -#: src/core/gnunet-service-core_kx.c:837 +#: src/core/gnunet-service-core_kx.c:840 msgid "# key exchanges stopped" msgstr "" -#: src/core/gnunet-service-core_kx.c:871 +#: src/core/gnunet-service-core_kx.c:874 msgid "# PING messages transmitted" msgstr "" -#: src/core/gnunet-service-core_kx.c:938 +#: src/core/gnunet-service-core_kx.c:941 msgid "# old ephemeral keys ignored" msgstr "" -#: src/core/gnunet-service-core_kx.c:945 +#: src/core/gnunet-service-core_kx.c:948 msgid "# ephemeral keys received" msgstr "" -#: src/core/gnunet-service-core_kx.c:984 +#: src/core/gnunet-service-core_kx.c:987 #, 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 "" -#: src/core/gnunet-service-core_kx.c:995 +#: src/core/gnunet-service-core_kx.c:998 msgid "# EPHEMERAL_KEY messages received" msgstr "" -#: src/core/gnunet-service-core_kx.c:1091 -#: src/transport/gnunet-service-transport_validation.c:1119 +#: src/core/gnunet-service-core_kx.c:1094 +#: src/transport/gnunet-service-transport_validation.c:1128 msgid "# PING messages received" msgstr "" -#: src/core/gnunet-service-core_kx.c:1100 +#: src/core/gnunet-service-core_kx.c:1103 msgid "# PING messages dropped (out of order)" msgstr "" -#: src/core/gnunet-service-core_kx.c:1158 +#: src/core/gnunet-service-core_kx.c:1161 msgid "# PONG messages created" msgstr "" -#: src/core/gnunet-service-core_kx.c:1184 +#: src/core/gnunet-service-core_kx.c:1187 msgid "# sessions terminated by timeout" msgstr "" -#: src/core/gnunet-service-core_kx.c:1197 +#: src/core/gnunet-service-core_kx.c:1200 msgid "# keepalive messages sent" msgstr "" -#: src/core/gnunet-service-core_kx.c:1261 -#: src/transport/gnunet-service-transport_validation.c:1442 +#: src/core/gnunet-service-core_kx.c:1264 +#: src/transport/gnunet-service-transport_validation.c:1461 msgid "# PONG messages received" msgstr "" -#: src/core/gnunet-service-core_kx.c:1268 +#: src/core/gnunet-service-core_kx.c:1271 msgid "# PONG messages dropped (connection down)" msgstr "" -#: src/core/gnunet-service-core_kx.c:1273 +#: src/core/gnunet-service-core_kx.c:1276 msgid "# PONG messages dropped (out of order)" msgstr "" -#: src/core/gnunet-service-core_kx.c:1308 +#: src/core/gnunet-service-core_kx.c:1311 msgid "# PONG messages decrypted" msgstr "" -#: src/core/gnunet-service-core_kx.c:1346 +#: src/core/gnunet-service-core_kx.c:1349 msgid "# session keys confirmed via PONG" msgstr "" -#: src/core/gnunet-service-core_kx.c:1357 +#: src/core/gnunet-service-core_kx.c:1360 msgid "# timeouts prevented via PONG" msgstr "" -#: src/core/gnunet-service-core_kx.c:1364 +#: src/core/gnunet-service-core_kx.c:1367 msgid "# rekey operations confirmed via PONG" msgstr "" -#: src/core/gnunet-service-core_kx.c:1518 +#: src/core/gnunet-service-core_kx.c:1521 msgid "# DATA message dropped (out of order)" msgstr "" -#: src/core/gnunet-service-core_kx.c:1526 +#: src/core/gnunet-service-core_kx.c:1529 #, c-format msgid "" "Session to peer `%s' went down due to key expiration (should not happen)\n" msgstr "" -#: src/core/gnunet-service-core_kx.c:1529 +#: src/core/gnunet-service-core_kx.c:1532 msgid "# sessions terminated by key expiration" msgstr "" -#: src/core/gnunet-service-core_kx.c:1590 -#: src/core/gnunet-service-core_kx.c:1616 +#: src/core/gnunet-service-core_kx.c:1593 +#: src/core/gnunet-service-core_kx.c:1619 msgid "# bytes dropped (duplicates)" msgstr "" -#: src/core/gnunet-service-core_kx.c:1603 +#: src/core/gnunet-service-core_kx.c:1606 msgid "# bytes dropped (out of sequence)" msgstr "" -#: src/core/gnunet-service-core_kx.c:1645 +#: src/core/gnunet-service-core_kx.c:1648 msgid "# bytes dropped (ancient message)" msgstr "" -#: src/core/gnunet-service-core_kx.c:1653 +#: src/core/gnunet-service-core_kx.c:1656 msgid "# bytes of payload decrypted" msgstr "" -#: src/core/gnunet-service-core_sessions.c:266 -#: src/core/gnunet-service-core_sessions.c:356 +#: src/core/gnunet-service-core_sessions.c:260 +#: src/core/gnunet-service-core_sessions.c:350 #: src/dht/gnunet-service-dht_neighbours.c:733 #: src/dht/gnunet-service-dht_neighbours.c:795 #: src/fs/gnunet-service-fs_cp.c:615 src/fs/gnunet-service-fs_cp.c:1520 @@ -1397,15 +1400,15 @@ msgstr "" msgid "# peers connected" msgstr "" -#: src/core/gnunet-service-core_sessions.c:302 +#: src/core/gnunet-service-core_sessions.c:296 msgid "# type map refreshes sent" msgstr "" -#: src/core/gnunet-service-core_sessions.c:422 +#: src/core/gnunet-service-core_sessions.c:416 msgid "# outdated typemap confirmations received" msgstr "" -#: src/core/gnunet-service-core_sessions.c:439 +#: src/core/gnunet-service-core_sessions.c:433 msgid "# valid typemap confirmations received" msgstr "" @@ -1419,7 +1422,7 @@ msgid "# updates to my type map" msgstr "" #: src/datacache/datacache.c:119 src/datacache/datacache.c:294 -#: src/datastore/gnunet-service-datastore.c:775 +#: src/datastore/gnunet-service-datastore.c:757 msgid "# bytes stored" msgstr "" @@ -1459,13 +1462,11 @@ msgstr "" #: src/datacache/plugin_datacache_sqlite.c:113 #: src/datacache/plugin_datacache_sqlite.c:122 -#: src/datastore/plugin_datastore_mysql.c:980 +#: src/datastore/plugin_datastore_mysql.c:892 #: src/datastore/plugin_datastore_sqlite.c:58 #: src/datastore/plugin_datastore_sqlite.c:66 src/my/my.c:80 src/my/my.c:92 #: src/mysql/mysql.c:42 src/mysql/mysql.c:49 -#: src/namecache/plugin_namecache_postgres.c:53 #: src/namecache/plugin_namecache_sqlite.c:53 -#: src/namestore/plugin_namestore_postgres.c:53 #: src/namestore/plugin_namestore_sqlite.c:53 #: src/peerstore/plugin_peerstore_sqlite.c:52 #: src/psycstore/plugin_psycstore_mysql.c:62 @@ -1474,14 +1475,14 @@ msgstr "" #: src/testbed/gnunet-daemon-testbed-underlay.c:56 #: src/testbed/testbed_api_hosts.c:69 src/util/crypto_ecc.c:52 #: src/util/crypto_ecc_setup.c:41 src/util/crypto_mpi.c:39 -#: src/include/gnunet_common.h:720 src/include/gnunet_common.h:729 +#: src/include/gnunet_common.h:735 src/include/gnunet_common.h:744 #: src/scalarproduct/scalarproduct.h:35 #, c-format msgid "`%s' failed at %s:%d with error: %s\n" msgstr "" #: src/datacache/plugin_datacache_sqlite.c:817 -#: src/datastore/plugin_datastore_sqlite.c:475 +#: src/datastore/plugin_datastore_sqlite.c:456 #: src/namecache/plugin_namecache_sqlite.c:296 #: src/namestore/plugin_namestore_sqlite.c:355 msgid "Tried to close sqlite without finalizing all prepared statements.\n" @@ -1505,7 +1506,7 @@ msgstr "" msgid "# queue entries created" msgstr "" -#: src/datastore/datastore_api.c:740 +#: src/datastore/datastore_api.c:760 msgid "# status messages received" msgstr "" @@ -1513,55 +1514,102 @@ msgstr "" msgid "# Results received" msgstr "" -#: src/datastore/datastore_api.c:941 +#: src/datastore/datastore_api.c:920 msgid "# datastore connections (re)created" msgstr "" -#: src/datastore/datastore_api.c:1055 +#: src/datastore/datastore_api.c:1034 msgid "# PUT requests executed" msgstr "" -#: src/datastore/datastore_api.c:1116 +#: src/datastore/datastore_api.c:1095 msgid "# RESERVE requests executed" msgstr "" -#: src/datastore/datastore_api.c:1181 +#: src/datastore/datastore_api.c:1160 msgid "# RELEASE RESERVE requests executed" msgstr "" -#: src/datastore/datastore_api.c:1259 +#: src/datastore/datastore_api.c:1238 msgid "# REMOVE requests executed" msgstr "" -#: src/datastore/datastore_api.c:1319 +#: src/datastore/datastore_api.c:1298 msgid "# GET REPLICATION requests executed" msgstr "" -#: src/datastore/datastore_api.c:1381 +#: src/datastore/datastore_api.c:1360 msgid "# GET ZERO ANONYMITY requests executed" msgstr "" -#: src/datastore/datastore_api.c:1462 +#: src/datastore/datastore_api.c:1441 msgid "# GET requests executed" msgstr "" -#: src/datastore/gnunet-datastore.c:113 +#: src/datastore/gnunet-datastore.c:189 +#, c-format +msgid "Dumped %<PRIu64> records\n" +msgstr "" + +#: src/datastore/gnunet-datastore.c:217 src/datastore/gnunet-datastore.c:229 +#, c-format +msgid "Short write to file: %zd bytes expecting %zd\n" +msgstr "" + +#: src/datastore/gnunet-datastore.c:261 +msgid "Error queueing datastore GET operation\n" +msgstr "" + +#: src/datastore/gnunet-datastore.c:287 src/datastore/gnunet-datastore.c:412 +#, fuzzy, c-format +msgid "Unable to open dump file: %s\n" +msgstr "Résolution de « %s » échouée\n" + +#: src/datastore/gnunet-datastore.c:326 #, c-format msgid "Failed to store item: %s, aborting\n" msgstr "" -#: src/datastore/gnunet-datastore.c:209 +#: src/datastore/gnunet-datastore.c:340 #, c-format -msgid "Cannot use the same configuration for source and destination\n" +msgid "Inserted %<PRIu64> records\n" msgstr "" -#: src/datastore/gnunet-datastore.c:256 -msgid "" -"specifies the configuration to use to access an alternative datastore; will " -"merge that datastore into our current datastore" +#: src/datastore/gnunet-datastore.c:349 src/datastore/gnunet-datastore.c:363 +#, c-format +msgid "Short read from file: %zd bytes expecting %zd\n" +msgstr "" + +#: src/datastore/gnunet-datastore.c:389 +msgid "Error queueing datastore PUT operation\n" +msgstr "" + +#: src/datastore/gnunet-datastore.c:432 +msgid "Input file is not of a supported format\n" msgstr "" -#: src/datastore/gnunet-datastore.c:265 +#: src/datastore/gnunet-datastore.c:458 +msgid "Failed connecting to the datastore.\n" +msgstr "" + +#: src/datastore/gnunet-datastore.c:470 +#, c-format +msgid "Please choose at least one operation: %s, %s\n" +msgstr "" + +#: src/datastore/gnunet-datastore.c:493 +msgid "Dump all records from the datastore" +msgstr "" + +#: src/datastore/gnunet-datastore.c:497 +msgid "Insert records into the datastore" +msgstr "" + +#: src/datastore/gnunet-datastore.c:502 +msgid "File to dump or insert" +msgstr "" + +#: src/datastore/gnunet-datastore.c:511 msgid "Manipulate GNUnet datastore" msgstr "" @@ -1603,8 +1651,8 @@ msgstr "" #: src/datastore/gnunet-service-datastore.c:634 #: src/datastore/gnunet-service-datastore.c:689 -#: src/datastore/gnunet-service-datastore.c:977 -#: src/datastore/gnunet-service-datastore.c:1633 +#: src/datastore/gnunet-service-datastore.c:837 +#: src/datastore/gnunet-service-datastore.c:1469 msgid "# reserved" msgstr "# réservé" @@ -1612,140 +1660,141 @@ msgstr "# réservé" msgid "Could not find matching reservation" msgstr "" -#: src/datastore/gnunet-service-datastore.c:792 +#: src/datastore/gnunet-service-datastore.c:773 #, c-format msgid "Need %llu bytes more space (%llu allowed, using %llu)\n" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1026 +#: src/datastore/gnunet-service-datastore.c:876 msgid "# GET requests received" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1058 +#: src/datastore/gnunet-service-datastore.c:907 msgid "# GET KEY requests received" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1071 +#: src/datastore/gnunet-service-datastore.c:920 msgid "# requests filtered by bloomfilter" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1108 +#: src/datastore/gnunet-service-datastore.c:956 msgid "# GET REPLICATION requests received" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1141 +#: src/datastore/gnunet-service-datastore.c:989 msgid "# GET ZERO ANONYMITY requests received" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1190 +#: src/datastore/gnunet-service-datastore.c:1036 msgid "Content not found" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1199 +#: src/datastore/gnunet-service-datastore.c:1043 msgid "# bytes removed (explicit request)" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1246 +#: src/datastore/gnunet-service-datastore.c:1088 msgid "# REMOVE requests received" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1301 +#: src/datastore/gnunet-service-datastore.c:1137 #, c-format msgid "" "Datastore payload must have been inaccurate (%lld < %lld). Recomputing it.\n" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1307 -#: src/datastore/gnunet-service-datastore.c:1482 +#: src/datastore/gnunet-service-datastore.c:1143 +#: src/datastore/gnunet-service-datastore.c:1318 #, c-format msgid "New payload: %lld\n" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1361 +#: src/datastore/gnunet-service-datastore.c:1197 #, c-format msgid "Loading `%s' datastore plugin\n" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1373 +#: src/datastore/gnunet-service-datastore.c:1209 #, c-format msgid "Failed to load datastore plugin for `%s'\n" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1433 +#: src/datastore/gnunet-service-datastore.c:1269 msgid "Bloomfilter construction complete.\n" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1489 +#: src/datastore/gnunet-service-datastore.c:1325 msgid "Rebuilding bloomfilter. Please be patient.\n" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1500 +#: src/datastore/gnunet-service-datastore.c:1336 msgid "Plugin does not support get_keys function. Please fix!\n" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1670 +#: src/datastore/gnunet-service-datastore.c:1506 #, c-format msgid "# bytes used in file-sharing datastore `%s'" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1686 +#: src/datastore/gnunet-service-datastore.c:1522 msgid "# quota" msgstr "# quota" -#: src/datastore/gnunet-service-datastore.c:1691 +#: src/datastore/gnunet-service-datastore.c:1527 msgid "# cache size" msgstr "# taille du cache" -#: src/datastore/gnunet-service-datastore.c:1707 +#: src/datastore/gnunet-service-datastore.c:1543 #, c-format msgid "Could not use specified filename `%s' for bloomfilter.\n" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1725 -#: src/datastore/gnunet-service-datastore.c:1741 +#: src/datastore/gnunet-service-datastore.c:1561 +#: src/datastore/gnunet-service-datastore.c:1577 #, c-format msgid "Failed to remove bogus bloomfilter file `%s'\n" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1773 +#: src/datastore/gnunet-service-datastore.c:1609 msgid "Failed to initialize bloomfilter.\n" msgstr "" -#: src/datastore/plugin_datastore_heap.c:769 +#: src/datastore/plugin_datastore_heap.c:893 msgid "Heap database running\n" msgstr "" -#: src/datastore/plugin_datastore_mysql.c:377 -#: src/datastore/plugin_datastore_sqlite.c:590 -msgid "Data too large" +#: src/datastore/plugin_datastore_mysql.c:371 +#: src/datastore/plugin_datastore_mysql.c:423 +#: src/datastore/plugin_datastore_mysql.c:1075 +msgid "MySQL statement run failure" msgstr "" -#: src/datastore/plugin_datastore_mysql.c:393 -msgid "MySQL statement run failure" +#: src/datastore/plugin_datastore_mysql.c:410 +#: src/datastore/plugin_datastore_sqlite.c:626 +msgid "Data too large" msgstr "" -#: src/datastore/plugin_datastore_mysql.c:936 +#: src/datastore/plugin_datastore_mysql.c:848 #, c-format msgid "`%s' for `%s' failed at %s:%d with error: %s\n" msgstr "" -#: src/datastore/plugin_datastore_mysql.c:1208 +#: src/datastore/plugin_datastore_mysql.c:1180 #: src/psycstore/plugin_psycstore_mysql.c:1936 msgid "Mysql database running\n" msgstr "" -#: src/datastore/plugin_datastore_postgres.c:345 +#: src/datastore/plugin_datastore_postgres.c:274 +#: src/datastore/plugin_datastore_postgres.c:891 msgid "Postgress exec failure" msgstr "" -#: src/datastore/plugin_datastore_postgres.c:866 +#: src/datastore/plugin_datastore_postgres.c:852 msgid "Failed to drop table from database.\n" msgstr "" -#: src/datastore/plugin_datastore_postgres.c:903 -#: src/namecache/plugin_namecache_postgres.c:398 -#: src/namestore/plugin_namestore_postgres.c:571 -#: src/psycstore/plugin_psycstore_postgres.c:1721 +#: src/datastore/plugin_datastore_postgres.c:950 +#: src/psycstore/plugin_psycstore_postgres.c:1506 msgid "Postgres database running\n" msgstr "" @@ -1757,7 +1806,7 @@ msgstr "" msgid "`%s' failed at %s:%u with error: %s" msgstr "" -#: src/datastore/plugin_datastore_sqlite.c:281 +#: src/datastore/plugin_datastore_sqlite.c:271 #: src/namecache/plugin_namecache_sqlite.c:194 #: src/namestore/plugin_namestore_sqlite.c:222 #: src/peerstore/plugin_peerstore_sqlite.c:535 @@ -1766,24 +1815,28 @@ msgstr "" msgid "Unable to initialize SQLite: %s.\n" msgstr "" -#: src/datastore/plugin_datastore_sqlite.c:1234 +#: src/datastore/plugin_datastore_sqlite.c:577 +msgid "sqlite bind failure" +msgstr "" + +#: src/datastore/plugin_datastore_sqlite.c:1259 msgid "sqlite version to old to determine size, assuming zero\n" msgstr "" -#: src/datastore/plugin_datastore_sqlite.c:1268 +#: src/datastore/plugin_datastore_sqlite.c:1293 #, c-format msgid "" "Using sqlite page utilization to estimate payload (%llu pages of size %llu " "bytes)\n" msgstr "" -#: src/datastore/plugin_datastore_sqlite.c:1312 +#: src/datastore/plugin_datastore_sqlite.c:1337 #: src/namecache/plugin_namecache_sqlite.c:603 #: src/namestore/plugin_namestore_sqlite.c:802 msgid "Sqlite database running\n" msgstr "" -#: src/datastore/plugin_datastore_template.c:259 +#: src/datastore/plugin_datastore_template.c:253 msgid "Template database running\n" msgstr "" @@ -1846,8 +1899,7 @@ msgstr "" msgid "Prints all packets that go through the DHT." msgstr "" -#: src/dht/gnunet_dht_profiler.c:1161 -#: src/testbed/gnunet-testbed-profiler.c:255 +#: src/dht/gnunet_dht_profiler.c:1161 src/testbed/gnunet-testbed-profiler.c:253 #, c-format msgid "Exiting as the number of peers is %u\n" msgstr "" @@ -1864,7 +1916,7 @@ msgid "" msgstr "" #: src/dht/gnunet_dht_profiler.c:1200 src/nse/gnunet-nse-profiler.c:853 -#: src/testbed/gnunet-testbed-profiler.c:305 +#: src/testbed/gnunet-testbed-profiler.c:304 msgid "name of the file with the login information for the testbed" msgstr "" @@ -2455,7 +2507,7 @@ msgstr "" msgid "No useful service enabled. Exiting.\n" msgstr "" -#: src/exit/gnunet-daemon-exit.c:3969 +#: src/exit/gnunet-daemon-exit.c:3970 msgid "Daemon to run to provide an IP exit node for the VPN" msgstr "" @@ -2658,7 +2710,7 @@ msgstr "Dernier message reçu de %s\n" msgid "Failed to not connect to `%s' service.\n" msgstr "" -#: src/fs/fs_misc.c:126 +#: src/fs/fs_misc.c:128 #, c-format msgid "Did not find mime type `%s' in extension list.\n" msgstr "" @@ -3813,7 +3865,7 @@ msgstr "" msgid "Failed to connect to identity service\n" msgstr "" -#: src/gns/gnunet-gns-import.c:489 +#: src/gns/gnunet-gns-import.c:452 msgid "This program will import some GNS authorities into your GNS namestore." msgstr "" @@ -3832,108 +3884,108 @@ msgstr "" msgid "%s failed at %s:%d: `%s'\n" msgstr "" -#: src/gns/gnunet-gns-proxy.c:878 +#: src/gns/gnunet-gns-proxy.c:887 #, c-format msgid "Unsupported CURL SSL backend %d\n" msgstr "" -#: src/gns/gnunet-gns-proxy.c:901 +#: src/gns/gnunet-gns-proxy.c:910 #, c-format msgid "Failed to fetch CN from cert: %s\n" msgstr "" -#: src/gns/gnunet-gns-proxy.c:924 +#: src/gns/gnunet-gns-proxy.c:933 #, c-format msgid "Failed to initialize DANE: %s\n" msgstr "" -#: src/gns/gnunet-gns-proxy.c:937 +#: src/gns/gnunet-gns-proxy.c:946 #, c-format msgid "Failed to parse DANE record: %s\n" msgstr "" -#: src/gns/gnunet-gns-proxy.c:952 +#: src/gns/gnunet-gns-proxy.c:961 #, c-format msgid "Failed to verify TLS connection using DANE: %s\n" msgstr "" -#: src/gns/gnunet-gns-proxy.c:962 +#: src/gns/gnunet-gns-proxy.c:971 #, c-format msgid "Failed DANE verification failed with GnuTLS verify status code: %u\n" msgstr "" -#: src/gns/gnunet-gns-proxy.c:986 +#: src/gns/gnunet-gns-proxy.c:995 #, c-format msgid "SSL certificate subject name (%s) does not match `%s'\n" msgstr "" -#: src/gns/gnunet-gns-proxy.c:1095 +#: src/gns/gnunet-gns-proxy.c:1104 #, c-format msgid "Cookie domain `%s' supplied by server is invalid\n" msgstr "" -#: src/gns/gnunet-gns-proxy.c:1699 +#: src/gns/gnunet-gns-proxy.c:1709 #, c-format msgid "Unsupported HTTP method `%s'\n" msgstr "" -#: src/gns/gnunet-gns-proxy.c:2162 +#: src/gns/gnunet-gns-proxy.c:2172 #, c-format msgid "Unable to import private key from file `%s'\n" msgstr "" -#: src/gns/gnunet-gns-proxy.c:2192 +#: src/gns/gnunet-gns-proxy.c:2202 #, c-format msgid "Unable to import certificate %s\n" msgstr "" -#: src/gns/gnunet-gns-proxy.c:2365 +#: src/gns/gnunet-gns-proxy.c:2375 #, c-format msgid "Failed to start HTTPS server for `%s'\n" msgstr "" -#: src/gns/gnunet-gns-proxy.c:2384 src/rest/gnunet-rest-server.c:533 +#: src/gns/gnunet-gns-proxy.c:2394 src/rest/gnunet-rest-server.c:533 msgid "Failed to pass client to MHD\n" msgstr "" -#: src/gns/gnunet-gns-proxy.c:2704 +#: src/gns/gnunet-gns-proxy.c:2716 #, c-format msgid "Unsupported socks version %d\n" msgstr "" -#: src/gns/gnunet-gns-proxy.c:2733 +#: src/gns/gnunet-gns-proxy.c:2745 #, c-format msgid "Unsupported socks command %d\n" msgstr "" -#: src/gns/gnunet-gns-proxy.c:2751 src/gns/gnunet-gns-proxy.c:2780 +#: src/gns/gnunet-gns-proxy.c:2763 src/gns/gnunet-gns-proxy.c:2792 msgid "SSL connection to plain IPv4 address requested\n" msgstr "" -#: src/gns/gnunet-gns-proxy.c:2830 +#: src/gns/gnunet-gns-proxy.c:2842 #, c-format msgid "Unsupported socks address type %d\n" msgstr "" -#: src/gns/gnunet-gns-proxy.c:3165 src/gns/gnunet-service-gns.c:403 +#: src/gns/gnunet-gns-proxy.c:3177 src/gns/gnunet-service-gns.c:403 #, c-format msgid "No ego configured for `%s`\n" msgstr "" -#: src/gns/gnunet-gns-proxy.c:3226 +#: src/gns/gnunet-gns-proxy.c:3238 #, c-format msgid "Failed to load SSL/TLS key and certificate from `%s'\n" msgstr "" -#: src/gns/gnunet-gns-proxy.c:3269 +#: src/gns/gnunet-gns-proxy.c:3281 msgid "listen on specified port (default: 7777)" msgstr "" -#: src/gns/gnunet-gns-proxy.c:3275 +#: src/gns/gnunet-gns-proxy.c:3287 msgid "pem file to use as CA" msgstr "" -#: src/gns/gnunet-gns-proxy.c:3300 +#: src/gns/gnunet-gns-proxy.c:3312 msgid "GNUnet GNS proxy" msgstr "" @@ -3942,7 +3994,7 @@ msgid "Failed to connect to the namecache!\n" msgstr "" #: src/gns/gnunet-service-gns.c:461 -#: src/zonemaster/gnunet-service-zonemaster.c:741 +#: src/zonemaster/gnunet-service-zonemaster.c:742 msgid "Could not connect to DHT!\n" msgstr "" @@ -4140,33 +4192,33 @@ msgstr "" msgid "Modified %u addresses, wrote %u bytes\n" msgstr "" -#: src/hello/hello.c:1103 +#: src/hello/hello.c:1110 msgid "Failed to parse HELLO message: missing expiration time\n" msgstr "" -#: src/hello/hello.c:1112 +#: src/hello/hello.c:1119 msgid "Failed to parse HELLO message: invalid expiration time\n" msgstr "" -#: src/hello/hello.c:1122 +#: src/hello/hello.c:1129 msgid "Failed to parse HELLO message: malformed\n" msgstr "" -#: src/hello/hello.c:1133 +#: src/hello/hello.c:1140 msgid "Failed to parse HELLO message: missing transport plugin\n" msgstr "" -#: src/hello/hello.c:1151 +#: src/hello/hello.c:1158 #, fuzzy, c-format msgid "Plugin `%s' not found, skipping address\n" msgstr "Extension « %s » introuvable\n" -#: src/hello/hello.c:1159 +#: src/hello/hello.c:1166 #, c-format msgid "Plugin `%s' does not support URIs yet\n" msgstr "" -#: src/hello/hello.c:1174 +#: src/hello/hello.c:1181 #, c-format msgid "Failed to parse `%s' as an address for plugin `%s'\n" msgstr "" @@ -4412,7 +4464,7 @@ msgid "# hostlist advertisements send" msgstr "" #: src/hostlist/gnunet-daemon-hostlist_server.c:679 -#: src/transport/gnunet-service-transport.c:2803 +#: src/transport/gnunet-service-transport.c:2815 msgid "Could not access PEERINFO service. Exiting.\n" msgstr "" @@ -4663,11 +4715,6 @@ msgstr "Résolution de « %s » échouée\n" msgid "flat plugin running\n" msgstr "" -#: src/namecache/plugin_namecache_postgres.c:90 -#: src/namestore/plugin_namestore_postgres.c:97 -msgid "Failed to create indices\n" -msgstr "" - #: src/namestore/gnunet-namestore.c:301 #, c-format msgid "Adding record failed: %s\n" @@ -4765,8 +4812,7 @@ msgstr "supprimer" msgid "Invalid public key for reverse lookup `%s'\n" msgstr "" -#: src/namestore/gnunet-namestore.c:979 -#: src/peerinfo-tool/gnunet-peerinfo.c:775 +#: src/namestore/gnunet-namestore.c:979 src/peerinfo-tool/gnunet-peerinfo.c:775 #, c-format msgid "Invalid URI `%s'\n" msgstr "URI invalide « %s »\n" @@ -4901,7 +4947,7 @@ msgstr "" msgid "GNU Name System First Come First Serve name registration service" msgstr "" -#: src/namestore/gnunet-service-namestore.c:612 +#: src/namestore/gnunet-service-namestore.c:615 #, c-format msgid "Failed to replicate block in namecache: %s\n" msgstr "" @@ -5218,7 +5264,7 @@ msgid "Measure quality and performance of the NSE service." msgstr "" #: src/nse/gnunet-service-nse.c:1534 -#: src/revocation/gnunet-service-revocation.c:838 src/util/gnunet-scrypt.c:276 +#: src/revocation/gnunet-service-revocation.c:840 src/util/gnunet-scrypt.c:276 msgid "Value is too large.\n" msgstr "" @@ -5258,17 +5304,17 @@ msgstr "" msgid "Still no peers found in `%s'!\n" msgstr "" -#: src/peerinfo/gnunet-service-peerinfo.c:1076 +#: src/peerinfo/gnunet-service-peerinfo.c:1080 #, c-format msgid "Cleaning up directory `%s'\n" msgstr "" -#: src/peerinfo/gnunet-service-peerinfo.c:1405 +#: src/peerinfo/gnunet-service-peerinfo.c:1409 #, c-format msgid "Importing HELLOs from `%s'\n" msgstr "" -#: src/peerinfo/gnunet-service-peerinfo.c:1418 +#: src/peerinfo/gnunet-service-peerinfo.c:1422 msgid "Skipping import of included HELLOs\n" msgstr "" @@ -5412,16 +5458,11 @@ msgstr "" msgid "Unable to create indices: %s.\n" msgstr "" -#: src/postgres/postgres.c:67 +#: src/pq/pq_prepare.c:80 #, c-format -msgid "`%s:%s' failed at %s:%d with error: %s\n" +msgid "PQprepare (`%s' as `%s') failed with error: %s\n" msgstr "" -#: src/postgres/postgres.c:192 -#, fuzzy, c-format -msgid "Unable to connect to Postgres database '%s': %s\n" -msgstr "Résolution de « %s » échouée\n" - #: src/psycstore/gnunet-service-psycstore.c:249 msgid "Failed to store membership information!\n" msgstr "" @@ -5580,56 +5621,56 @@ msgstr "" msgid "Daemon to announce regular expressions for the peer using cadet." msgstr "" -#: src/regex/gnunet-regex-profiler.c:1314 +#: src/regex/gnunet-regex-profiler.c:1386 msgid "No configuration file given. Exiting\n" msgstr "" -#: src/regex/gnunet-regex-profiler.c:1355 +#: src/regex/gnunet-regex-profiler.c:1427 #: src/regex/gnunet-regex-simulation-profiler.c:630 #, c-format msgid "No policy directory specified on command line. Exiting.\n" msgstr "" -#: src/regex/gnunet-regex-profiler.c:1361 +#: src/regex/gnunet-regex-profiler.c:1433 #: src/regex/gnunet-regex-simulation-profiler.c:638 #, c-format msgid "Specified policies directory does not exist. Exiting.\n" msgstr "" -#: src/regex/gnunet-regex-profiler.c:1368 +#: src/regex/gnunet-regex-profiler.c:1440 #, c-format msgid "No files found in `%s'\n" msgstr "" -#: src/regex/gnunet-regex-profiler.c:1377 +#: src/regex/gnunet-regex-profiler.c:1449 msgid "No search strings file given. Exiting.\n" msgstr "" -#: src/regex/gnunet-regex-profiler.c:1397 +#: src/regex/gnunet-regex-profiler.c:1469 msgid "Error loading search strings. Exiting.\n" msgstr "" -#: src/regex/gnunet-regex-profiler.c:1485 +#: src/regex/gnunet-regex-profiler.c:1557 msgid "name of the file for writing statistics" msgstr "" -#: src/regex/gnunet-regex-profiler.c:1491 +#: src/regex/gnunet-regex-profiler.c:1563 msgid "wait TIMEOUT before ending the experiment" msgstr "" -#: src/regex/gnunet-regex-profiler.c:1497 +#: src/regex/gnunet-regex-profiler.c:1569 msgid "directory with policy files" msgstr "" -#: src/regex/gnunet-regex-profiler.c:1504 +#: src/regex/gnunet-regex-profiler.c:1576 msgid "name of file with input strings" msgstr "" -#: src/regex/gnunet-regex-profiler.c:1510 +#: src/regex/gnunet-regex-profiler.c:1582 msgid "name of file with hosts' names" msgstr "" -#: src/regex/gnunet-regex-profiler.c:1523 +#: src/regex/gnunet-regex-profiler.c:1595 msgid "Profiler for regex" msgstr "" @@ -5784,12 +5825,12 @@ msgstr "" msgid "# revocation set unions completed" msgstr "" -#: src/revocation/gnunet-service-revocation.c:524 -#: src/revocation/gnunet-service-revocation.c:771 +#: src/revocation/gnunet-service-revocation.c:525 +#: src/revocation/gnunet-service-revocation.c:773 msgid "SET service crashed, terminating revocation service\n" msgstr "" -#: src/revocation/gnunet-service-revocation.c:862 +#: src/revocation/gnunet-service-revocation.c:864 msgid "Could not open revocation database file!" msgstr "" @@ -5851,9 +5892,9 @@ msgstr "" msgid "Calculate the Vectorproduct with a GNUnet peer." msgstr "" -#: src/scalarproduct/gnunet-service-scalarproduct_alice.c:1407 +#: src/scalarproduct/gnunet-service-scalarproduct_alice.c:1401 #: src/scalarproduct/gnunet-service-scalarproduct_bob.c:1345 -#: src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c:1180 +#: src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c:1172 #: src/scalarproduct/gnunet-service-scalarproduct-ecc_bob.c:1063 msgid "Connect to CADET failed\n" msgstr "" @@ -5878,7 +5919,7 @@ msgstr "threshold" msgid "also profile decryption" msgstr "" -#: src/set/gnunet-service-set.c:1948 +#: src/set/gnunet-service-set.c:1989 #, fuzzy msgid "Could not connect to CADET service\n" msgstr "Impossible d’ouvrir « %s ».\n" @@ -5935,112 +5976,112 @@ msgstr "" msgid "say good-bye and leave somebody else's place" msgstr "" -#: src/social/gnunet-social.c:1227 src/social/gnunet-social.c:1232 +#: src/social/gnunet-social.c:1227 msgid "create a place" msgstr "" -#: src/social/gnunet-social.c:1237 +#: src/social/gnunet-social.c:1232 msgid "destroy a place we were hosting" msgstr "" -#: src/social/gnunet-social.c:1242 +#: src/social/gnunet-social.c:1237 msgid "enter somebody else's place" msgstr "" -#: src/social/gnunet-social.c:1248 +#: src/social/gnunet-social.c:1243 msgid "find state matching name prefix" msgstr "" -#: src/social/gnunet-social.c:1253 +#: src/social/gnunet-social.c:1248 msgid "replay history of messages up to the given --limit" msgstr "" -#: src/social/gnunet-social.c:1258 +#: src/social/gnunet-social.c:1253 msgid "reconnect to a previously created place" msgstr "" -#: src/social/gnunet-social.c:1263 +#: src/social/gnunet-social.c:1258 msgid "publish something to a place we are hosting" msgstr "" -#: src/social/gnunet-social.c:1268 +#: src/social/gnunet-social.c:1263 msgid "reconnect to a previously entered place" msgstr "" -#: src/social/gnunet-social.c:1273 +#: src/social/gnunet-social.c:1268 msgid "search for state matching exact name" msgstr "" -#: src/social/gnunet-social.c:1278 +#: src/social/gnunet-social.c:1273 msgid "submit something to somebody's place" msgstr "" -#: src/social/gnunet-social.c:1283 +#: src/social/gnunet-social.c:1278 msgid "list of egos and subscribed places" msgstr "" -#: src/social/gnunet-social.c:1288 +#: src/social/gnunet-social.c:1283 msgid "extract and replay history between message IDs --start and --until" msgstr "" -#: src/social/gnunet-social.c:1297 +#: src/social/gnunet-social.c:1292 msgid "application ID to use when connecting" msgstr "" -#: src/social/gnunet-social.c:1303 +#: src/social/gnunet-social.c:1298 msgid "message body or state value" msgstr "" -#: src/social/gnunet-social.c:1309 +#: src/social/gnunet-social.c:1304 msgid "name or public key of ego" msgstr "" -#: src/social/gnunet-social.c:1314 +#: src/social/gnunet-social.c:1309 msgid "wait for incoming messages" msgstr "" -#: src/social/gnunet-social.c:1320 +#: src/social/gnunet-social.c:1315 msgid "GNS name" msgstr "" -#: src/social/gnunet-social.c:1326 +#: src/social/gnunet-social.c:1321 msgid "peer ID for --guest-enter" msgstr "" -#: src/social/gnunet-social.c:1332 +#: src/social/gnunet-social.c:1327 msgid "name (key) to query from state" msgstr "" -#: src/social/gnunet-social.c:1338 +#: src/social/gnunet-social.c:1333 msgid "method name" msgstr "" -#: src/social/gnunet-social.c:1344 +#: src/social/gnunet-social.c:1339 #, fuzzy msgid "number of messages to replay from history" msgstr "nombre de valeurs" -#: src/social/gnunet-social.c:1350 +#: src/social/gnunet-social.c:1345 msgid "key address of place" msgstr "" -#: src/social/gnunet-social.c:1356 +#: src/social/gnunet-social.c:1351 msgid "start message ID for history replay" msgstr "" -#: src/social/gnunet-social.c:1361 +#: src/social/gnunet-social.c:1356 msgid "respond to entry requests by admitting all guests" msgstr "" -#: src/social/gnunet-social.c:1367 +#: src/social/gnunet-social.c:1362 msgid "end message ID for history replay" msgstr "" -#: src/social/gnunet-social.c:1372 +#: src/social/gnunet-social.c:1367 msgid "respond to entry requests by refusing all guests" msgstr "" -#: src/social/gnunet-social.c:1382 +#: src/social/gnunet-social.c:1377 msgid "" "gnunet-social - Interact with the social service: enter/leave, send/receive " "messages, access history and state.\n" @@ -6065,7 +6106,7 @@ msgstr "Échec du démarrage de %s\n" msgid "Wrote %llu bytes of statistics to `%s'\n" msgstr "" -#: src/statistics/gnunet-service-statistics.c:1084 +#: src/statistics/gnunet-service-statistics.c:1086 #, c-format msgid "Loading %llu bytes of statistics from `%s'\n" msgstr "" @@ -6191,7 +6232,7 @@ msgid "Invalid argument `%s'; expecting unsigned int\n" msgstr "" #: src/testbed/generate-underlay-topology.c:342 -#: src/testbed/gnunet-testbed-profiler.c:284 +#: src/testbed/gnunet-testbed-profiler.c:283 msgid "create COUNT number of peers" msgstr "" @@ -6229,13 +6270,13 @@ msgid "" "deployments" msgstr "" -#: src/testbed/gnunet-daemon-testbed-underlay.c:231 src/testing/list-keys.c:46 -#: src/testing/testing.c:288 src/util/gnunet-ecc.c:298 +#: src/testbed/gnunet-daemon-testbed-underlay.c:233 src/testing/list-keys.c:46 +#: src/testing/testing.c:288 src/util/gnunet-ecc.c:306 #, c-format msgid "Incorrect hostkey file format: %s\n" msgstr "" -#: src/testbed/gnunet-daemon-testbed-underlay.c:469 +#: src/testbed/gnunet-daemon-testbed-underlay.c:471 msgid "Daemon to restrict underlay network in testbed deployments" msgstr "" @@ -6309,11 +6350,11 @@ msgstr "" msgid "Spawning process `%s'\n" msgstr "" -#: src/testbed/gnunet-testbed-profiler.c:290 +#: src/testbed/gnunet-testbed-profiler.c:289 msgid "tolerate COUNT number of continious timeout failures" msgstr "" -#: src/testbed/gnunet-testbed-profiler.c:295 +#: src/testbed/gnunet-testbed-profiler.c:294 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 " @@ -6615,43 +6656,43 @@ msgstr "" msgid "# messages dropped due to slow client" msgstr "" -#: src/transport/gnunet-service-transport.c:809 +#: src/transport/gnunet-service-transport.c:818 msgid "# bytes payload dropped (other peer was not connected)" msgstr "" -#: src/transport/gnunet-service-transport.c:1539 +#: src/transport/gnunet-service-transport.c:1551 msgid "# bytes payload discarded due to not connected peer" msgstr "" -#: src/transport/gnunet-service-transport.c:1699 +#: src/transport/gnunet-service-transport.c:1711 msgid "# bytes total received" msgstr "" -#: src/transport/gnunet-service-transport.c:1796 +#: src/transport/gnunet-service-transport.c:1808 msgid "# bytes payload received" msgstr "" -#: src/transport/gnunet-service-transport.c:2113 -#: src/transport/gnunet-service-transport.c:2585 +#: src/transport/gnunet-service-transport.c:2125 +#: src/transport/gnunet-service-transport.c:2597 msgid "# disconnects due to blacklist" msgstr "" -#: src/transport/gnunet-service-transport.c:2589 +#: src/transport/gnunet-service-transport.c:2601 #, c-format msgid "Disallowing connection to peer `%s' on transport %s\n" msgstr "" -#: src/transport/gnunet-service-transport.c:2697 +#: src/transport/gnunet-service-transport.c:2709 #, c-format msgid "Adding blacklisting entry for peer `%s'\n" msgstr "" -#: src/transport/gnunet-service-transport.c:2706 +#: src/transport/gnunet-service-transport.c:2718 #, c-format msgid "Adding blacklisting entry for peer `%s':`%s'\n" msgstr "" -#: src/transport/gnunet-service-transport.c:2771 +#: src/transport/gnunet-service-transport.c:2783 msgid "Transport service is lacking key configuration settings. Exiting.\n" msgstr "" @@ -6786,64 +6827,64 @@ msgstr "" msgid "SYN request from peer `%s' ignored due impending shutdown\n" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:2620 +#: src/transport/gnunet-service-transport_neighbours.c:2623 msgid "# Attempts to switch addresses" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:3102 +#: src/transport/gnunet-service-transport_neighbours.c:3105 msgid "# SYN_ACK messages received" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:3110 +#: src/transport/gnunet-service-transport_neighbours.c:3113 msgid "# unexpected SYN_ACK messages (no peer)" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:3128 -#: src/transport/gnunet-service-transport_neighbours.c:3152 +#: src/transport/gnunet-service-transport_neighbours.c:3131 +#: src/transport/gnunet-service-transport_neighbours.c:3155 msgid "# unexpected SYN_ACK messages (not ready)" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:3164 +#: src/transport/gnunet-service-transport_neighbours.c:3167 msgid "# unexpected SYN_ACK messages (waiting on ATS)" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:3189 +#: src/transport/gnunet-service-transport_neighbours.c:3192 msgid "# Successful attempts to switch addresses" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:3202 +#: src/transport/gnunet-service-transport_neighbours.c:3205 msgid "# unexpected SYN_ACK messages (disconnecting)" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:3374 +#: src/transport/gnunet-service-transport_neighbours.c:3377 msgid "# ACK messages received" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:3410 +#: src/transport/gnunet-service-transport_neighbours.c:3413 msgid "# unexpected ACK messages" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:3498 +#: src/transport/gnunet-service-transport_neighbours.c:3501 msgid "# quota messages ignored (malformed)" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:3505 +#: src/transport/gnunet-service-transport_neighbours.c:3508 msgid "# QUOTA messages received" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:3545 +#: src/transport/gnunet-service-transport_neighbours.c:3548 msgid "# disconnect messages ignored (malformed)" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:3552 +#: src/transport/gnunet-service-transport_neighbours.c:3555 msgid "# DISCONNECT messages received" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:3563 +#: src/transport/gnunet-service-transport_neighbours.c:3566 msgid "# disconnect messages ignored (timestamp)" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:3697 +#: src/transport/gnunet-service-transport_neighbours.c:3700 msgid "# disconnected from peer upon explicit request" msgstr "" @@ -6877,8 +6918,8 @@ msgstr "" #: src/transport/gnunet-service-transport_validation.c:491 #: src/transport/gnunet-service-transport_validation.c:677 -#: src/transport/gnunet-service-transport_validation.c:988 -#: src/transport/gnunet-service-transport_validation.c:1590 +#: src/transport/gnunet-service-transport_validation.c:997 +#: src/transport/gnunet-service-transport_validation.c:1609 msgid "# validations running" msgstr "" @@ -6902,57 +6943,57 @@ msgstr "" msgid "# address revalidations started" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1114 +#: src/transport/gnunet-service-transport_validation.c:1123 msgid "# PING message for different peer received" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1165 +#: src/transport/gnunet-service-transport_validation.c:1174 #, c-format msgid "Plugin `%s' not available, cannot confirm having this address\n" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1178 +#: src/transport/gnunet-service-transport_validation.c:1187 msgid "# failed address checks during validation" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1181 +#: src/transport/gnunet-service-transport_validation.c:1190 #, c-format msgid "Address `%s' is not one of my addresses, not confirming PING\n" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1189 +#: src/transport/gnunet-service-transport_validation.c:1198 msgid "# successful address checks during validation" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1202 +#: src/transport/gnunet-service-transport_validation.c:1211 #, c-format msgid "" "Not confirming PING from peer `%s' with address `%s' since I cannot confirm " "having this address.\n" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1257 +#: src/transport/gnunet-service-transport_validation.c:1266 #, c-format msgid "Failed to create PONG signature for peer `%s'\n" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1308 +#: src/transport/gnunet-service-transport_validation.c:1317 msgid "# PONGs unicast via reliable transport" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1317 +#: src/transport/gnunet-service-transport_validation.c:1326 msgid "# PONGs multicast to all available addresses" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1480 +#: src/transport/gnunet-service-transport_validation.c:1499 msgid "# PONGs dropped, no matching pending validation" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1498 +#: src/transport/gnunet-service-transport_validation.c:1517 msgid "# PONGs dropped, signature expired" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1553 +#: src/transport/gnunet-service-transport_validation.c:1572 msgid "# validations succeeded" msgstr "" @@ -7129,8 +7170,8 @@ msgid "message size to use" msgstr "" #: src/transport/plugin_transport_http_client.c:1474 -#: src/transport/plugin_transport_http_server.c:2249 -#: src/transport/plugin_transport_http_server.c:3463 +#: src/transport/plugin_transport_http_server.c:2312 +#: src/transport/plugin_transport_http_server.c:3526 #: src/transport/plugin_transport_tcp.c:3890 #: src/transport/plugin_transport_tcp.c:3897 msgid "TCP_STEALTH not supported on this platform.\n" @@ -7142,13 +7183,13 @@ msgid "Could not initialize curl multi handle, failed to start %s plugin!\n" msgstr "" #: src/transport/plugin_transport_http_client.c:2164 -#: src/transport/plugin_transport_http_server.c:3178 +#: src/transport/plugin_transport_http_server.c:3241 #, c-format msgid "Shutting down plugin `%s'\n" msgstr "" #: src/transport/plugin_transport_http_client.c:2181 -#: src/transport/plugin_transport_http_server.c:3248 +#: src/transport/plugin_transport_http_server.c:3311 #, c-format msgid "Shutdown for plugin `%s' complete\n" msgstr "" @@ -7158,102 +7199,102 @@ msgstr "" msgid "Maximum number of requests is %u\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:1727 +#: src/transport/plugin_transport_http_server.c:1756 #, c-format msgid "" "Access from connection %p (%u of %u) for `%s' `%s' url `%s' with upload data " "size %u\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:1967 +#: src/transport/plugin_transport_http_server.c:2028 #, c-format msgid "Accepting connection (%u of %u) from `%s'\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:1975 +#: src/transport/plugin_transport_http_server.c:2036 #, c-format msgid "" "Server reached maximum number connections (%u), rejecting new connection\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:2125 +#: src/transport/plugin_transport_http_server.c:2186 msgid "" "Could not create a new TLS certificate, program `gnunet-transport-" "certificate-creation' could not be started!\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:2148 +#: src/transport/plugin_transport_http_server.c:2209 #, c-format msgid "No usable TLS certificate found and creating one at `%s/%s' failed!\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:2275 +#: src/transport/plugin_transport_http_server.c:2338 msgid "Could not load or create server certificate! Loading plugin failed!\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:2587 +#: src/transport/plugin_transport_http_server.c:2650 msgid "Require valid port number for service in configuration!\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:2752 +#: src/transport/plugin_transport_http_server.c:2815 #, c-format msgid "Found %u addresses to report to NAT service\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:2838 +#: src/transport/plugin_transport_http_server.c:2901 #: src/transport/plugin_transport_udp.c:3622 msgid "Disabling IPv6 since it is not supported on this system!\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:2944 +#: src/transport/plugin_transport_http_server.c:3007 #, c-format msgid "IPv4 support is %s\n" msgstr "Prise en charge d’IPv4 %s\n" -#: src/transport/plugin_transport_http_server.c:2959 +#: src/transport/plugin_transport_http_server.c:3022 #, c-format msgid "IPv6 support is %s\n" msgstr "Prise en charge d’IPv6 %s\n" -#: src/transport/plugin_transport_http_server.c:2965 +#: src/transport/plugin_transport_http_server.c:3028 msgid "Neither IPv4 nor IPv6 are enabled! Fix in configuration\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:2976 +#: src/transport/plugin_transport_http_server.c:3039 msgid "Port is required! Fix in configuration\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:2982 +#: src/transport/plugin_transport_http_server.c:3045 #, c-format msgid "Using port %u\n" msgstr "Utilisation du port %u\n" -#: src/transport/plugin_transport_http_server.c:3001 +#: src/transport/plugin_transport_http_server.c:3064 #, c-format msgid "Specific IPv4 address `%s' in configuration file is invalid!\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:3036 +#: src/transport/plugin_transport_http_server.c:3099 #, c-format msgid "Specific IPv6 address `%s' in configuration file is invalid!\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:3111 +#: src/transport/plugin_transport_http_server.c:3174 #, c-format msgid "Using external hostname `%s'\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:3132 +#: src/transport/plugin_transport_http_server.c:3195 #, c-format msgid "Notifying transport only about hostname `%s'\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:3149 +#: src/transport/plugin_transport_http_server.c:3212 #, c-format msgid "Maximum number of connections is %u\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:3475 +#: src/transport/plugin_transport_http_server.c:3538 msgid "Unable to compile URL regex\n" msgstr "" @@ -7557,7 +7598,7 @@ msgid "" "`GNUNET_SERVER_receive_done' after %s\n" msgstr "" -#: src/transport/tcp_service_legacy.c:339 src/util/service.c:2337 +#: src/transport/tcp_service_legacy.c:339 src/util/service.c:2346 #, c-format msgid "Unknown address family %d\n" msgstr "" @@ -7602,50 +7643,50 @@ msgstr "" msgid "Service `%s' runs at %s\n" msgstr "" -#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:1501 +#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:1500 msgid "Service process failed to initialize\n" msgstr "" -#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:1505 +#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:1504 msgid "Service process could not initialize server function\n" msgstr "" -#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:1509 +#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:1508 msgid "Service process failed to report status\n" msgstr "" #: src/transport/tcp_service_legacy.c:1313 src/util/disk.c:1488 -#: src/util/service.c:1379 +#: src/util/service.c:1378 #, c-format msgid "Cannot obtain information about user `%s': %s\n" msgstr "" -#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1381 +#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1380 msgid "No such user" msgstr "Aucun utilisateur trouvé" -#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1400 +#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1399 #, c-format msgid "Cannot change user/group to `%s': %s\n" msgstr "" -#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:1728 +#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:1727 msgid "do daemonize (detach from terminal)" msgstr "" -#: src/transport/tcp_service_legacy.c:1448 src/util/program.c:244 -#: src/util/service.c:1791 +#: src/transport/tcp_service_legacy.c:1448 src/util/program.c:255 +#: src/util/service.c:1790 #, c-format msgid "Malformed configuration file `%s', exit ...\n" msgstr "" -#: src/transport/tcp_service_legacy.c:1458 src/util/program.c:261 -#: src/util/service.c:1802 +#: src/transport/tcp_service_legacy.c:1458 src/util/program.c:272 +#: src/util/service.c:1801 msgid "Malformed configuration, exit ...\n" msgstr "" -#: src/transport/tcp_service_legacy.c:1463 src/util/program.c:256 -#: src/util/service.c:1808 +#: src/transport/tcp_service_legacy.c:1463 src/util/program.c:267 +#: src/util/service.c:1807 #, c-format msgid "Could not access configuration file `%s'\n" msgstr "" @@ -7684,91 +7725,91 @@ msgstr "" msgid "Metadata `%s' failed to deserialize" msgstr "" -#: src/util/client.c:882 +#: src/util/client.c:911 #, c-format msgid "Need a non-empty hostname for service `%s'.\n" msgstr "" -#: src/util/common_logging.c:256 src/util/common_logging.c:1129 +#: src/util/common_logging.c:259 src/util/common_logging.c:1132 msgid "DEBUG" msgstr "DEBUG" -#: src/util/common_logging.c:258 src/util/common_logging.c:1127 +#: src/util/common_logging.c:261 src/util/common_logging.c:1130 msgid "INFO" msgstr "INFO" -#: src/util/common_logging.c:260 src/util/common_logging.c:1125 +#: src/util/common_logging.c:263 src/util/common_logging.c:1128 msgid "MESSAGE" msgstr "" -#: src/util/common_logging.c:262 src/util/common_logging.c:1123 +#: src/util/common_logging.c:265 src/util/common_logging.c:1126 msgid "WARNING" msgstr "AVERTISSEMENT" -#: src/util/common_logging.c:264 src/util/common_logging.c:1121 +#: src/util/common_logging.c:267 src/util/common_logging.c:1124 msgid "ERROR" msgstr "ERREUR" -#: src/util/common_logging.c:266 src/util/common_logging.c:1131 +#: src/util/common_logging.c:269 src/util/common_logging.c:1134 msgid "NONE" msgstr "AUCUN" -#: src/util/common_logging.c:879 +#: src/util/common_logging.c:882 #, c-format msgid "Message `%.*s' repeated %u times in the last %s\n" msgstr "" -#: src/util/common_logging.c:1132 +#: src/util/common_logging.c:1135 msgid "INVALID" msgstr "INVALIDE" -#: src/util/common_logging.c:1302 +#: src/util/common_logging.c:1326 msgid "unknown address" msgstr "adresse inconnue" -#: src/util/common_logging.c:1344 +#: src/util/common_logging.c:1368 msgid "invalid address" msgstr "adresse invalide" -#: src/util/common_logging.c:1362 +#: src/util/common_logging.c:1386 #, c-format msgid "Configuration fails to specify option `%s' in section `%s'!\n" msgstr "" -#: src/util/common_logging.c:1383 +#: src/util/common_logging.c:1407 #, c-format msgid "" "Configuration specifies invalid value for option `%s' in section `%s': %s\n" msgstr "" -#: src/util/configuration.c:286 +#: src/util/configuration.c:296 #, c-format msgid "Syntax error while deserializing in line %u\n" msgstr "" -#: src/util/configuration.c:344 +#: src/util/configuration.c:355 #, fuzzy, c-format msgid "Error while reading file `%s'\n" msgstr "Erreur de lecture : « %s » : %s" -#: src/util/configuration.c:1017 +#: src/util/configuration.c:1034 #, c-format msgid "" "Configuration value '%s' for '%s' in section '%s' is not in set of legal " "choices\n" msgstr "" -#: src/util/configuration.c:1136 +#: src/util/configuration.c:1153 #, c-format msgid "Recursive expansion suspected, aborting $-expansion for term `%s'\n" msgstr "" -#: src/util/configuration.c:1169 +#: src/util/configuration.c:1186 #, c-format msgid "Missing closing `%s' in option `%s'\n" msgstr "" -#: src/util/configuration.c:1237 +#: src/util/configuration.c:1254 #, c-format msgid "" "Failed to expand `%s' in `%s' as it is neither found in [PATHS] nor defined " @@ -7782,51 +7823,51 @@ msgid "" "%llu)\n" msgstr "" -#: src/util/crypto_ecc.c:777 +#: src/util/crypto_ecc.c:810 #, c-format msgid "ECC signing failed at %s:%d: %s\n" msgstr "" -#: src/util/crypto_ecc.c:827 +#: src/util/crypto_ecc.c:860 #, c-format msgid "EdDSA signing failed at %s:%d: %s\n" msgstr "" -#: src/util/crypto_ecc.c:901 +#: src/util/crypto_ecc.c:934 #, c-format msgid "ECDSA signature verification failed at %s:%d: %s\n" msgstr "" -#: src/util/crypto_ecc.c:958 +#: src/util/crypto_ecc.c:991 #, c-format msgid "EdDSA signature verification failed at %s:%d: %s\n" msgstr "" -#: src/util/crypto_ecc_setup.c:122 src/util/crypto_ecc_setup.c:160 -#: src/util/crypto_ecc_setup.c:278 src/util/crypto_ecc_setup.c:316 +#: src/util/crypto_ecc_setup.c:122 src/util/crypto_ecc_setup.c:161 +#: src/util/crypto_ecc_setup.c:279 src/util/crypto_ecc_setup.c:317 #, c-format msgid "Could not acquire lock on file `%s': %s...\n" msgstr "" -#: src/util/crypto_ecc_setup.c:127 src/util/crypto_ecc_setup.c:283 +#: src/util/crypto_ecc_setup.c:128 src/util/crypto_ecc_setup.c:284 msgid "Creating a new private key. This may take a while.\n" msgstr "" -#: src/util/crypto_ecc_setup.c:164 src/util/crypto_ecc_setup.c:320 +#: src/util/crypto_ecc_setup.c:165 src/util/crypto_ecc_setup.c:322 msgid "This may be ok if someone is currently generating a private key.\n" msgstr "" -#: src/util/crypto_ecc_setup.c:194 src/util/crypto_ecc_setup.c:350 +#: src/util/crypto_ecc_setup.c:195 src/util/crypto_ecc_setup.c:352 #, c-format msgid "" "When trying to read key file `%s' I found %u bytes but I need at least %u.\n" msgstr "" -#: src/util/crypto_ecc_setup.c:198 src/util/crypto_ecc_setup.c:354 +#: src/util/crypto_ecc_setup.c:199 src/util/crypto_ecc_setup.c:356 msgid "This may be ok if someone is currently generating a key.\n" msgstr "" -#: src/util/crypto_ecc_setup.c:413 +#: src/util/crypto_ecc_setup.c:415 msgid "Could not load peer's private key\n" msgstr "" @@ -8014,29 +8055,29 @@ msgstr "" msgid "Manipulate GNUnet configuration files" msgstr "" -#: src/util/gnunet-ecc.c:84 +#: src/util/gnunet-ecc.c:94 #, c-format msgid "Failed to open `%s': %s\n" msgstr "" -#: src/util/gnunet-ecc.c:120 +#: src/util/gnunet-ecc.c:130 #, c-format msgid "Generating %u keys like %s, please wait" msgstr "" -#: src/util/gnunet-ecc.c:133 +#: src/util/gnunet-ecc.c:143 #, c-format msgid "Generating %u keys, please wait" msgstr "" -#: src/util/gnunet-ecc.c:174 +#: src/util/gnunet-ecc.c:184 #, c-format msgid "" "\n" "Failed to write to `%s': %s\n" msgstr "" -#: src/util/gnunet-ecc.c:184 +#: src/util/gnunet-ecc.c:194 #, c-format msgid "" "\n" @@ -8045,53 +8086,61 @@ msgstr "" "\n" "Terminé !\n" -#: src/util/gnunet-ecc.c:187 +#: src/util/gnunet-ecc.c:197 #, c-format msgid "" "\n" "Error, %u keys not generated\n" msgstr "" -#: src/util/gnunet-ecc.c:280 +#: src/util/gnunet-ecc.c:288 #, c-format msgid "Hostkeys file `%s' not found\n" msgstr "" -#: src/util/gnunet-ecc.c:291 +#: src/util/gnunet-ecc.c:299 #, c-format msgid "Hostkeys file `%s' is empty\n" msgstr "" -#: src/util/gnunet-ecc.c:313 +#: src/util/gnunet-ecc.c:321 #, c-format msgid "Could not read hostkey file: %s\n" msgstr "" -#: src/util/gnunet-ecc.c:364 +#: src/util/gnunet-ecc.c:372 msgid "No hostkey file specified on command line\n" msgstr "" -#: src/util/gnunet-ecc.c:416 +#: src/util/gnunet-ecc.c:437 msgid "list keys included in a file (for testing)" msgstr "" -#: src/util/gnunet-ecc.c:421 +#: src/util/gnunet-ecc.c:442 msgid "number of keys to list included in a file (for testing)" msgstr "" -#: src/util/gnunet-ecc.c:426 +#: src/util/gnunet-ecc.c:447 msgid "create COUNT public-private key pairs (for testing)" msgstr "" -#: src/util/gnunet-ecc.c:430 +#: src/util/gnunet-ecc.c:451 msgid "print the public key in ASCII format" msgstr "" -#: src/util/gnunet-ecc.c:434 +#: src/util/gnunet-ecc.c:455 +msgid "print the private key in ASCII format" +msgstr "" + +#: src/util/gnunet-ecc.c:459 +msgid "print the public key in HEX format" +msgstr "" + +#: src/util/gnunet-ecc.c:463 msgid "print examples of ECC operations (used for compatibility testing)" msgstr "" -#: src/util/gnunet-ecc.c:449 +#: src/util/gnunet-ecc.c:479 msgid "Manipulate GNUnet private ECC key files" msgstr "" @@ -8183,7 +8232,7 @@ msgstr "" msgid "Unable to shorten unix path `%s' while keeping name unique\n" msgstr "" -#: src/util/network.c:1793 src/util/network.c:1969 +#: src/util/network.c:1793 src/util/network.c:1977 #, c-format msgid "" "Fatal internal logic error, process hangs in `%s' (abort with CTRL-C)!\n" @@ -8235,7 +8284,7 @@ msgstr "" msgid "Could not determine plugin installation path.\n" msgstr "" -#: src/util/resolver_api.c:204 +#: src/util/resolver_api.c:203 #, c-format msgid "" "Missing `%s' for `%s' in configuration, DNS resolution will be unavailable.\n" @@ -8248,32 +8297,32 @@ msgid "" "resolution will be unavailable.\n" msgstr "" -#: src/util/resolver_api.c:815 +#: src/util/resolver_api.c:827 #, c-format msgid "Timeout trying to resolve hostname `%s'.\n" msgstr "" -#: src/util/resolver_api.c:827 +#: src/util/resolver_api.c:840 #, c-format msgid "Timeout trying to resolve IP address `%s'.\n" msgstr "" -#: src/util/resolver_api.c:1004 +#: src/util/resolver_api.c:1024 msgid "Resolver not configured correctly.\n" msgstr "" -#: src/util/resolver_api.c:1086 src/util/resolver_api.c:1107 -#: src/util/resolver_api.c:1121 +#: src/util/resolver_api.c:1110 src/util/resolver_api.c:1133 +#: src/util/resolver_api.c:1147 #, fuzzy, c-format msgid "Could not resolve our FQDN: %s\n" msgstr "Résolution de « %s » échouée : %s\n" -#: src/util/service.c:1306 +#: src/util/service.c:1305 msgid "" "Could not bind to any of the ports I was supposed to, refusing to run!\n" msgstr "" -#: src/util/service.c:2082 +#: src/util/service.c:2091 #, c-format msgid "" "Processing code for message of type %u did not call " @@ -8348,63 +8397,63 @@ msgstr "jours" msgid "end of time" msgstr "fin du temps" -#: src/util/strings.c:1269 +#: src/util/strings.c:1270 msgid "IPv6 address did not start with `['\n" msgstr "" -#: src/util/strings.c:1277 +#: src/util/strings.c:1278 msgid "IPv6 address did contain ':' to separate port number\n" msgstr "" -#: src/util/strings.c:1283 +#: src/util/strings.c:1284 msgid "IPv6 address did contain ']' before ':' to separate port number\n" msgstr "" -#: src/util/strings.c:1290 +#: src/util/strings.c:1291 msgid "IPv6 address did contain a valid port number after the last ':'\n" msgstr "" -#: src/util/strings.c:1299 +#: src/util/strings.c:1300 #, c-format msgid "Invalid IPv6 address `%s': %s\n" msgstr "" -#: src/util/strings.c:1571 src/util/strings.c:1587 +#: src/util/strings.c:1572 src/util/strings.c:1588 msgid "Port not in range\n" msgstr "" -#: src/util/strings.c:1596 +#: src/util/strings.c:1597 #, c-format msgid "Malformed port policy `%s'\n" msgstr "" -#: src/util/strings.c:1679 src/util/strings.c:1710 src/util/strings.c:1758 -#: src/util/strings.c:1779 +#: src/util/strings.c:1680 src/util/strings.c:1711 src/util/strings.c:1759 +#: src/util/strings.c:1780 #, c-format msgid "Invalid format for IP: `%s'\n" msgstr "" -#: src/util/strings.c:1736 +#: src/util/strings.c:1737 #, c-format msgid "Invalid network notation ('/%d' is not legal in IPv4 CIDR)." msgstr "" -#: src/util/strings.c:1788 +#: src/util/strings.c:1789 #, c-format msgid "Invalid format: `%s'\n" msgstr "fornat invalide : « %s »\n" -#: src/util/strings.c:1840 +#: src/util/strings.c:1841 #, c-format msgid "Invalid network notation (does not end with ';': `%s')\n" msgstr "" -#: src/util/strings.c:1890 +#: src/util/strings.c:1891 #, c-format msgid "Wrong format `%s' for netmask\n" msgstr "" -#: src/util/strings.c:1921 +#: src/util/strings.c:1922 #, c-format msgid "Wrong format `%s' for network\n" msgstr "" @@ -8450,61 +8499,61 @@ msgstr "" msgid "# ICMPv6 packets dropped (not allowed)" msgstr "" -#: src/vpn/gnunet-service-vpn.c:2232 +#: src/vpn/gnunet-service-vpn.c:2235 msgid "# Packets received from TUN interface" msgstr "" -#: src/vpn/gnunet-service-vpn.c:2265 src/vpn/gnunet-service-vpn.c:2301 +#: src/vpn/gnunet-service-vpn.c:2268 src/vpn/gnunet-service-vpn.c:2304 #, c-format msgid "Packet received for unmapped destination `%s' (dropping it)\n" msgstr "" -#: src/vpn/gnunet-service-vpn.c:2311 +#: src/vpn/gnunet-service-vpn.c:2314 msgid "Received IPv4 packet with options (dropping it)\n" msgstr "" -#: src/vpn/gnunet-service-vpn.c:2325 +#: src/vpn/gnunet-service-vpn.c:2328 #, c-format msgid "Received packet of unknown protocol %d from TUN (dropping it)\n" msgstr "" -#: src/vpn/gnunet-service-vpn.c:2364 +#: src/vpn/gnunet-service-vpn.c:2367 msgid "Failed to find unallocated IPv4 address in VPN's range\n" msgstr "" -#: src/vpn/gnunet-service-vpn.c:2419 +#: src/vpn/gnunet-service-vpn.c:2422 msgid "Failed to find unallocated IPv6 address in VPN's range\n" msgstr "" -#: src/vpn/gnunet-service-vpn.c:2461 src/vpn/gnunet-service-vpn.c:2683 +#: src/vpn/gnunet-service-vpn.c:2464 src/vpn/gnunet-service-vpn.c:2686 msgid "# Active destinations" msgstr "" -#: src/vpn/gnunet-service-vpn.c:2732 +#: src/vpn/gnunet-service-vpn.c:2735 msgid "Failed to allocate IP address for new destination\n" msgstr "" -#: src/vpn/gnunet-service-vpn.c:2995 +#: src/vpn/gnunet-service-vpn.c:2998 msgid "Must specify valid IPv6 address" msgstr "" -#: src/vpn/gnunet-service-vpn.c:3019 +#: src/vpn/gnunet-service-vpn.c:3022 msgid "Must specify valid IPv6 mask" msgstr "" -#: src/vpn/gnunet-service-vpn.c:3027 +#: src/vpn/gnunet-service-vpn.c:3030 msgid "IPv6 support disabled as this system does not support IPv6\n" msgstr "" -#: src/vpn/gnunet-service-vpn.c:3040 +#: src/vpn/gnunet-service-vpn.c:3043 msgid "Must specify valid IPv4 address" msgstr "" -#: src/vpn/gnunet-service-vpn.c:3053 +#: src/vpn/gnunet-service-vpn.c:3056 msgid "Must specify valid IPv4 mask" msgstr "" -#: src/vpn/gnunet-service-vpn.c:3063 +#: src/vpn/gnunet-service-vpn.c:3066 msgid "IPv4 support disabled as this system does not support IPv4\n" msgstr "" @@ -8573,26 +8622,30 @@ msgstr "" msgid "Setup tunnels via VPN." msgstr "Configurer des tunnels via VPN." -#: src/zonemaster/gnunet-service-zonemaster.c:705 +#: src/zonemaster/gnunet-service-zonemaster.c:706 msgid "Failed to connect to the namestore!\n" msgstr "" -#: src/include/gnunet_common.h:674 src/include/gnunet_common.h:681 -#: src/include/gnunet_common.h:691 src/include/gnunet_common.h:699 +#: src/include/gnunet_common.h:689 src/include/gnunet_common.h:696 +#: src/include/gnunet_common.h:706 src/include/gnunet_common.h:714 #, c-format msgid "Assertion failed at %s:%d.\n" msgstr "" -#: src/include/gnunet_common.h:711 +#: src/include/gnunet_common.h:726 #, c-format msgid "External protocol violation detected at %s:%d.\n" msgstr "" -#: src/include/gnunet_common.h:738 src/include/gnunet_common.h:747 +#: src/include/gnunet_common.h:753 src/include/gnunet_common.h:762 #, c-format msgid "`%s' failed on file `%s' at %s:%d with error: %s\n" msgstr "" +#, fuzzy +#~ msgid "Unable to connect to Postgres database '%s': %s\n" +#~ msgstr "Résolution de « %s » échouée\n" + #~ msgid "ARM API is busy" #~ msgstr "API ARM occupé" diff --git 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: 2017-03-31 19:22-0500\n" +"POT-Creation-Date: 2018-01-02 02:33+0100\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" @@ -245,14 +245,14 @@ msgid "Require valid port number for service `%s' in configuration!\n" msgstr "" #: src/arm/gnunet-service-arm.c:430 src/transport/plugin_transport_tcp.c:1176 -#: src/transport/tcp_service_legacy.c:613 src/util/client.c:480 +#: src/transport/tcp_service_legacy.c:613 src/util/client.c:505 #: src/util/service.c:682 #, c-format msgid "UNIXPATH `%s' too long, maximum length is %llu\n" msgstr "" #: src/arm/gnunet-service-arm.c:434 src/transport/plugin_transport_tcp.c:1180 -#: src/transport/tcp_service_legacy.c:617 src/util/client.c:485 +#: src/transport/tcp_service_legacy.c:617 src/util/client.c:510 #: src/util/service.c:687 #, fuzzy, c-format msgid "Using `%s' instead\n" @@ -273,7 +273,7 @@ msgid "Have neither PORT nor UNIXPATH for service `%s', but one is required\n" msgstr "" #: src/arm/gnunet-service-arm.c:513 -#: src/transport/plugin_transport_http_server.c:2621 +#: src/transport/plugin_transport_http_server.c:2684 #: src/transport/plugin_transport_tcp.c:1259 #: src/transport/tcp_service_legacy.c:696 src/util/service.c:782 #, fuzzy, c-format @@ -281,7 +281,7 @@ msgid "Failed to resolve `%s': %s\n" msgstr "Misslyckades att leverera \"%s\" meddelande.\n" #: src/arm/gnunet-service-arm.c:532 -#: src/transport/plugin_transport_http_server.c:2639 +#: src/transport/plugin_transport_http_server.c:2702 #: src/transport/plugin_transport_tcp.c:1278 #: src/transport/tcp_service_legacy.c:715 src/util/service.c:802 #, fuzzy, c-format @@ -376,13 +376,11 @@ msgid "" "%llu\n" msgstr "" -#: src/ats/gnunet-ats-solver-eval.c:3294 -#: src/ats-tests/gnunet-solver-eval.c:939 +#: src/ats/gnunet-ats-solver-eval.c:3294 src/ats-tests/gnunet-solver-eval.c:939 msgid "solver to use" msgstr "" -#: src/ats/gnunet-ats-solver-eval.c:3299 -#: src/ats-tests/gnunet-solver-eval.c:945 +#: src/ats/gnunet-ats-solver-eval.c:3299 src/ats-tests/gnunet-solver-eval.c:945 #: src/ats-tests/gnunet-solver-eval.c:950 msgid "experiment to use" msgstr "" @@ -678,58 +676,58 @@ msgstr "hjälptext för -t" msgid "Invalid peer ID `%s'\n" msgstr "Ogiltiga argument: " -#: src/cadet/gnunet-cadet.c:702 +#: src/cadet/gnunet-cadet.c:703 #, fuzzy, c-format msgid "Invalid tunnel owner `%s'\n" msgstr "Ogiltigt format för IP: \"%s\"\n" -#: src/cadet/gnunet-cadet.c:775 +#: src/cadet/gnunet-cadet.c:776 msgid "Extra arguments are not applicable in combination with this option.\n" msgstr "" -#: src/cadet/gnunet-cadet.c:866 +#: src/cadet/gnunet-cadet.c:867 #, fuzzy, c-format msgid "Invalid target `%s'\n" msgstr "Ogiltigt argument: \"%s\"\n" -#: src/cadet/gnunet-cadet.c:903 +#: src/cadet/gnunet-cadet.c:904 #, fuzzy msgid "No action requested\n" msgstr "Samling stoppad.\n" -#: src/cadet/gnunet-cadet.c:928 +#: src/cadet/gnunet-cadet.c:929 #, fuzzy msgid "Provide information about a particular connection" msgstr "Skriv ut information om GNUnets motparter." -#: src/cadet/gnunet-cadet.c:933 +#: src/cadet/gnunet-cadet.c:934 msgid "Activate echo mode" msgstr "" -#: src/cadet/gnunet-cadet.c:938 +#: src/cadet/gnunet-cadet.c:939 msgid "Dump debug information to STDERR" msgstr "" -#: src/cadet/gnunet-cadet.c:944 +#: src/cadet/gnunet-cadet.c:945 msgid "Listen for connections using a shared secret among sender and recipient" msgstr "" -#: src/cadet/gnunet-cadet.c:951 +#: src/cadet/gnunet-cadet.c:952 #, fuzzy msgid "Provide information about a patricular peer" msgstr "Skriv ut information om GNUnets motparter." -#: src/cadet/gnunet-cadet.c:957 +#: src/cadet/gnunet-cadet.c:958 #, fuzzy msgid "Provide information about all peers" msgstr "Skriv ut information om GNUnets motparter." -#: src/cadet/gnunet-cadet.c:963 +#: src/cadet/gnunet-cadet.c:964 #, fuzzy msgid "Provide information about a particular tunnel" msgstr "Skriv ut information om GNUnets motparter." -#: src/cadet/gnunet-cadet.c:969 +#: src/cadet/gnunet-cadet.c:970 #, fuzzy msgid "Provide information about all tunnels" msgstr "Skriv ut information om GNUnets motparter." @@ -1059,7 +1057,7 @@ msgid "" msgstr "" #: src/conversation/gnunet_gst.c:622 -#: src/conversation/gnunet-helper-audio-playback-gst.c:356 +#: src/conversation/gnunet-helper-audio-playback-gst.c:361 #, c-format msgid "Read error from STDIN: %d %s\n" msgstr "" @@ -1069,63 +1067,63 @@ msgstr "" msgid "pa_stream_write() failed: %s\n" msgstr "\"%s\" %s misslyckades: %s\n" -#: src/conversation/gnunet-helper-audio-playback.c:607 +#: src/conversation/gnunet-helper-audio-playback.c:612 msgid "gnunet-helper-audio-playback - Got signal, exiting\n" msgstr "" -#: src/conversation/gnunet-helper-audio-playback.c:632 +#: src/conversation/gnunet-helper-audio-playback.c:637 #: src/conversation/gnunet-helper-audio-record.c:545 #, fuzzy msgid "Connection established.\n" msgstr "Samling stoppad.\n" -#: src/conversation/gnunet-helper-audio-playback.c:637 +#: src/conversation/gnunet-helper-audio-playback.c:642 #: src/conversation/gnunet-helper-audio-record.c:550 #, fuzzy, c-format msgid "pa_stream_new() failed: %s\n" msgstr "\"%s\" %s misslyckades: %s\n" -#: src/conversation/gnunet-helper-audio-playback.c:651 +#: src/conversation/gnunet-helper-audio-playback.c:656 #, c-format msgid "pa_stream_connect_playback() failed: %s\n" msgstr "" -#: src/conversation/gnunet-helper-audio-playback.c:664 +#: src/conversation/gnunet-helper-audio-playback.c:669 #: src/conversation/gnunet-helper-audio-record.c:576 #, fuzzy, c-format msgid "Connection failure: %s\n" msgstr " Anslutning misslyckades (fel?)\n" -#: src/conversation/gnunet-helper-audio-playback.c:685 +#: src/conversation/gnunet-helper-audio-playback.c:690 #: src/conversation/gnunet-helper-audio-record.c:599 msgid "Wrong Spec\n" msgstr "" -#: src/conversation/gnunet-helper-audio-playback.c:691 +#: src/conversation/gnunet-helper-audio-playback.c:696 #: src/conversation/gnunet-helper-audio-record.c:605 #, fuzzy msgid "pa_mainloop_new() failed.\n" msgstr "\"%s\" misslyckades vid %s:%d med fel: \"%s\".\n" -#: src/conversation/gnunet-helper-audio-playback.c:705 +#: src/conversation/gnunet-helper-audio-playback.c:710 #: src/conversation/gnunet-helper-audio-record.c:620 #, fuzzy msgid "pa_context_new() failed.\n" msgstr "\"%s\" misslyckades vid %s:%d med fel: \"%s\".\n" -#: src/conversation/gnunet-helper-audio-playback.c:712 +#: src/conversation/gnunet-helper-audio-playback.c:717 #: src/conversation/gnunet-helper-audio-record.c:626 #, fuzzy, c-format msgid "pa_context_connect() failed: %s\n" msgstr "# av anslutna parter" -#: src/conversation/gnunet-helper-audio-playback.c:718 +#: src/conversation/gnunet-helper-audio-playback.c:723 #: src/conversation/gnunet-helper-audio-record.c:632 #, fuzzy msgid "pa_mainloop_run() failed.\n" msgstr "\"%s\" misslyckades vid %s:%d med fel: \"%s\".\n" -#: src/conversation/gnunet-helper-audio-playback.c:790 +#: src/conversation/gnunet-helper-audio-playback.c:795 #, c-format msgid "Read error from STDIN: %s\n" msgstr "" @@ -1191,7 +1189,12 @@ msgstr "\"%s\" %s misslyckades: %s\n" msgid "Failed to allocate %u bytes for second packet\n" msgstr "Misslyckades att läsa kompislista från \"%s\"\n" -#: src/conversation/microphone.c:119 +#: src/conversation/gnunet-service-conversation.c:1276 +#, fuzzy, c-format +msgid "Could not open line, port %s already in use!\n" +msgstr "Kunde inte ansluta till gnunetd.\n" + +#: src/conversation/microphone.c:121 #, fuzzy msgid "Could not start record audio helper\n" msgstr "Kunde inte komma åt namnrymdsinformation.\n" @@ -1282,27 +1285,27 @@ msgstr "" msgid "# dequeuing CAR (duplicate request)" msgstr "" -#: src/core/gnunet-service-core.c:440 +#: src/core/gnunet-service-core.c:443 #, fuzzy, c-format msgid "# bytes of messages of type %u received" msgstr "# krypterade PONG-meddelanden mottagna" -#: src/core/gnunet-service-core.c:538 +#: src/core/gnunet-service-core.c:541 #, fuzzy msgid "# messages discarded (session disconnected)" msgstr "Nätverksannonsering avstängd i konfigurationen!\n" -#: src/core/gnunet-service-core.c:876 +#: src/core/gnunet-service-core.c:879 #, fuzzy, c-format msgid "# messages of type %u discarded (client busy)" msgstr "# krypterade PONG-meddelanden mottagna" -#: src/core/gnunet-service-core.c:985 +#: src/core/gnunet-service-core.c:988 #, fuzzy msgid "Core service is lacking HOSTKEY configuration setting. Exiting.\n" msgstr "GNUnet-konfiguration" -#: src/core/gnunet-service-core.c:1006 +#: src/core/gnunet-service-core.c:1009 #, fuzzy, c-format msgid "Core service of `%s' ready.\n" msgstr "\"%s\" är inte en fil.\n" @@ -1315,146 +1318,146 @@ msgstr "# byte krypterade" msgid "# bytes decrypted" msgstr "# byte dekrypterade" -#: src/core/gnunet-service-core_kx.c:725 +#: src/core/gnunet-service-core_kx.c:728 #, fuzzy msgid "# PAYLOAD dropped (out of order)" msgstr "# byte kastade via UDP (utgående)" -#: src/core/gnunet-service-core_kx.c:775 +#: src/core/gnunet-service-core_kx.c:778 msgid "# key exchanges initiated" msgstr "" -#: src/core/gnunet-service-core_kx.c:837 +#: src/core/gnunet-service-core_kx.c:840 msgid "# key exchanges stopped" msgstr "" -#: src/core/gnunet-service-core_kx.c:871 +#: src/core/gnunet-service-core_kx.c:874 #, fuzzy msgid "# PING messages transmitted" msgstr "# PING-meddelanden skapade" -#: src/core/gnunet-service-core_kx.c:938 +#: src/core/gnunet-service-core_kx.c:941 msgid "# old ephemeral keys ignored" msgstr "" -#: src/core/gnunet-service-core_kx.c:945 +#: src/core/gnunet-service-core_kx.c:948 #, fuzzy msgid "# ephemeral keys received" msgstr "# krypterade PONG-meddelanden mottagna" -#: src/core/gnunet-service-core_kx.c:984 +#: src/core/gnunet-service-core_kx.c:987 #, 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 "" -#: src/core/gnunet-service-core_kx.c:995 +#: src/core/gnunet-service-core_kx.c:998 #, fuzzy msgid "# EPHEMERAL_KEY messages received" msgstr "# PING-meddelanden skapade" -#: src/core/gnunet-service-core_kx.c:1091 -#: src/transport/gnunet-service-transport_validation.c:1119 +#: src/core/gnunet-service-core_kx.c:1094 +#: src/transport/gnunet-service-transport_validation.c:1128 #, fuzzy msgid "# PING messages received" msgstr "# PING-meddelanden skapade" -#: src/core/gnunet-service-core_kx.c:1100 +#: src/core/gnunet-service-core_kx.c:1103 #, fuzzy msgid "# PING messages dropped (out of order)" msgstr "Nätverksannonsering avstängd i konfigurationen!\n" -#: src/core/gnunet-service-core_kx.c:1158 +#: src/core/gnunet-service-core_kx.c:1161 #, fuzzy msgid "# PONG messages created" msgstr "# PING-meddelanden skapade" -#: src/core/gnunet-service-core_kx.c:1184 +#: src/core/gnunet-service-core_kx.c:1187 #, fuzzy msgid "# sessions terminated by timeout" msgstr "# byte kastade via TCP (utgående)" -#: src/core/gnunet-service-core_kx.c:1197 +#: src/core/gnunet-service-core_kx.c:1200 #, fuzzy msgid "# keepalive messages sent" msgstr "# PING-meddelanden i klartext skickade" -#: src/core/gnunet-service-core_kx.c:1261 -#: src/transport/gnunet-service-transport_validation.c:1442 +#: src/core/gnunet-service-core_kx.c:1264 +#: src/transport/gnunet-service-transport_validation.c:1461 #, fuzzy msgid "# PONG messages received" msgstr "# krypterade PONG-meddelanden mottagna" -#: src/core/gnunet-service-core_kx.c:1268 +#: src/core/gnunet-service-core_kx.c:1271 #, fuzzy msgid "# PONG messages dropped (connection down)" msgstr "# krypterade PONG-meddelanden mottagna" -#: src/core/gnunet-service-core_kx.c:1273 +#: src/core/gnunet-service-core_kx.c:1276 #, fuzzy msgid "# PONG messages dropped (out of order)" msgstr "Nätverksannonsering avstängd i konfigurationen!\n" -#: src/core/gnunet-service-core_kx.c:1308 +#: src/core/gnunet-service-core_kx.c:1311 #, fuzzy msgid "# PONG messages decrypted" msgstr "# PING-meddelanden skapade" -#: src/core/gnunet-service-core_kx.c:1346 +#: src/core/gnunet-service-core_kx.c:1349 #, fuzzy msgid "# session keys confirmed via PONG" msgstr "# sessionnycklar vägrade" -#: src/core/gnunet-service-core_kx.c:1357 +#: src/core/gnunet-service-core_kx.c:1360 #, fuzzy msgid "# timeouts prevented via PONG" msgstr "# byte mottogs via TCP" -#: src/core/gnunet-service-core_kx.c:1364 +#: src/core/gnunet-service-core_kx.c:1367 #, fuzzy msgid "# rekey operations confirmed via PONG" msgstr "# sessionnycklar vägrade" -#: src/core/gnunet-service-core_kx.c:1518 +#: src/core/gnunet-service-core_kx.c:1521 #, fuzzy msgid "# DATA message dropped (out of order)" msgstr "# byte kastade via UDP (utgående)" -#: src/core/gnunet-service-core_kx.c:1526 +#: src/core/gnunet-service-core_kx.c:1529 #, c-format msgid "" "Session to peer `%s' went down due to key expiration (should not happen)\n" msgstr "" -#: src/core/gnunet-service-core_kx.c:1529 +#: src/core/gnunet-service-core_kx.c:1532 #, fuzzy msgid "# sessions terminated by key expiration" msgstr "# byte kastade via TCP (utgående)" -#: src/core/gnunet-service-core_kx.c:1590 -#: src/core/gnunet-service-core_kx.c:1616 +#: src/core/gnunet-service-core_kx.c:1593 +#: src/core/gnunet-service-core_kx.c:1619 #, fuzzy msgid "# bytes dropped (duplicates)" msgstr "# byte kastade via UDP (utgående)" -#: src/core/gnunet-service-core_kx.c:1603 +#: src/core/gnunet-service-core_kx.c:1606 #, fuzzy msgid "# bytes dropped (out of sequence)" msgstr "# byte kastade via UDP (utgående)" -#: src/core/gnunet-service-core_kx.c:1645 +#: src/core/gnunet-service-core_kx.c:1648 #, fuzzy msgid "# bytes dropped (ancient message)" msgstr "# byte kastade via UDP (utgående)" -#: src/core/gnunet-service-core_kx.c:1653 +#: src/core/gnunet-service-core_kx.c:1656 #, fuzzy msgid "# bytes of payload decrypted" msgstr "# byte dekrypterade" -#: src/core/gnunet-service-core_sessions.c:266 -#: src/core/gnunet-service-core_sessions.c:356 +#: src/core/gnunet-service-core_sessions.c:260 +#: src/core/gnunet-service-core_sessions.c:350 #: src/dht/gnunet-service-dht_neighbours.c:733 #: src/dht/gnunet-service-dht_neighbours.c:795 #: src/fs/gnunet-service-fs_cp.c:615 src/fs/gnunet-service-fs_cp.c:1520 @@ -1466,16 +1469,16 @@ msgstr "# byte dekrypterade" msgid "# peers connected" msgstr "# av anslutna parter" -#: src/core/gnunet-service-core_sessions.c:302 +#: src/core/gnunet-service-core_sessions.c:296 msgid "# type map refreshes sent" msgstr "" -#: src/core/gnunet-service-core_sessions.c:422 +#: src/core/gnunet-service-core_sessions.c:416 #, fuzzy msgid "# outdated typemap confirmations received" msgstr "Kunde inte spara konfiguration!" -#: src/core/gnunet-service-core_sessions.c:439 +#: src/core/gnunet-service-core_sessions.c:433 #, fuzzy msgid "# valid typemap confirmations received" msgstr "Kunde inte spara konfiguration!" @@ -1491,7 +1494,7 @@ msgid "# updates to my type map" msgstr "" #: src/datacache/datacache.c:119 src/datacache/datacache.c:294 -#: src/datastore/gnunet-service-datastore.c:775 +#: src/datastore/gnunet-service-datastore.c:757 #, fuzzy msgid "# bytes stored" msgstr "# byte krypterade" @@ -1536,13 +1539,11 @@ msgstr "" #: src/datacache/plugin_datacache_sqlite.c:113 #: src/datacache/plugin_datacache_sqlite.c:122 -#: src/datastore/plugin_datastore_mysql.c:980 +#: src/datastore/plugin_datastore_mysql.c:892 #: src/datastore/plugin_datastore_sqlite.c:58 #: src/datastore/plugin_datastore_sqlite.c:66 src/my/my.c:80 src/my/my.c:92 #: src/mysql/mysql.c:42 src/mysql/mysql.c:49 -#: src/namecache/plugin_namecache_postgres.c:53 #: src/namecache/plugin_namecache_sqlite.c:53 -#: src/namestore/plugin_namestore_postgres.c:53 #: src/namestore/plugin_namestore_sqlite.c:53 #: src/peerstore/plugin_peerstore_sqlite.c:52 #: src/psycstore/plugin_psycstore_mysql.c:62 @@ -1551,14 +1552,14 @@ msgstr "" #: src/testbed/gnunet-daemon-testbed-underlay.c:56 #: src/testbed/testbed_api_hosts.c:69 src/util/crypto_ecc.c:52 #: src/util/crypto_ecc_setup.c:41 src/util/crypto_mpi.c:39 -#: src/include/gnunet_common.h:720 src/include/gnunet_common.h:729 +#: src/include/gnunet_common.h:735 src/include/gnunet_common.h:744 #: src/scalarproduct/scalarproduct.h:35 #, c-format msgid "`%s' failed at %s:%d with error: %s\n" msgstr "\"%s\" misslyckades vid %s:%d med fel: %s\n" #: src/datacache/plugin_datacache_sqlite.c:817 -#: src/datastore/plugin_datastore_sqlite.c:475 +#: src/datastore/plugin_datastore_sqlite.c:456 #: src/namecache/plugin_namecache_sqlite.c:296 #: src/namestore/plugin_namestore_sqlite.c:355 msgid "Tried to close sqlite without finalizing all prepared statements.\n" @@ -1583,7 +1584,7 @@ msgstr "" msgid "# queue entries created" msgstr "# PING-meddelanden skapade" -#: src/datastore/datastore_api.c:740 +#: src/datastore/datastore_api.c:760 #, fuzzy msgid "# status messages received" msgstr "# krypterade PONG-meddelanden mottagna" @@ -1593,56 +1594,108 @@ msgstr "# krypterade PONG-meddelanden mottagna" msgid "# Results received" msgstr "# byte mottogs via TCP" -#: src/datastore/datastore_api.c:941 +#: src/datastore/datastore_api.c:920 #, fuzzy msgid "# datastore connections (re)created" msgstr "Nätverksanslutning" -#: src/datastore/datastore_api.c:1055 +#: src/datastore/datastore_api.c:1034 msgid "# PUT requests executed" msgstr "" -#: src/datastore/datastore_api.c:1116 +#: src/datastore/datastore_api.c:1095 msgid "# RESERVE requests executed" msgstr "" -#: src/datastore/datastore_api.c:1181 +#: src/datastore/datastore_api.c:1160 msgid "# RELEASE RESERVE requests executed" msgstr "" -#: src/datastore/datastore_api.c:1259 +#: src/datastore/datastore_api.c:1238 msgid "# REMOVE requests executed" msgstr "" -#: src/datastore/datastore_api.c:1319 +#: src/datastore/datastore_api.c:1298 msgid "# GET REPLICATION requests executed" msgstr "" -#: src/datastore/datastore_api.c:1381 +#: src/datastore/datastore_api.c:1360 msgid "# GET ZERO ANONYMITY requests executed" msgstr "" -#: src/datastore/datastore_api.c:1462 +#: src/datastore/datastore_api.c:1441 msgid "# GET requests executed" msgstr "" -#: src/datastore/gnunet-datastore.c:113 +#: src/datastore/gnunet-datastore.c:189 +#, c-format +msgid "Dumped %<PRIu64> records\n" +msgstr "" + +#: src/datastore/gnunet-datastore.c:217 src/datastore/gnunet-datastore.c:229 +#, c-format +msgid "Short write to file: %zd bytes expecting %zd\n" +msgstr "" + +#: src/datastore/gnunet-datastore.c:261 +#, fuzzy +msgid "Error queueing datastore GET operation\n" +msgstr "Fel vid skapandet av användare" + +#: src/datastore/gnunet-datastore.c:287 src/datastore/gnunet-datastore.c:412 +#, fuzzy, c-format +msgid "Unable to open dump file: %s\n" +msgstr "Kunde inte skapa namnrymd \"%s\" (existerar?).\n" + +#: src/datastore/gnunet-datastore.c:326 #, fuzzy, c-format msgid "Failed to store item: %s, aborting\n" msgstr "Misslyckades att leverera \"%s\" meddelande.\n" -#: src/datastore/gnunet-datastore.c:209 +#: src/datastore/gnunet-datastore.c:340 #, c-format -msgid "Cannot use the same configuration for source and destination\n" +msgid "Inserted %<PRIu64> records\n" msgstr "" -#: src/datastore/gnunet-datastore.c:256 -msgid "" -"specifies the configuration to use to access an alternative datastore; will " -"merge that datastore into our current datastore" +#: src/datastore/gnunet-datastore.c:349 src/datastore/gnunet-datastore.c:363 +#, c-format +msgid "Short read from file: %zd bytes expecting %zd\n" +msgstr "" + +#: src/datastore/gnunet-datastore.c:389 +#, fuzzy +msgid "Error queueing datastore PUT operation\n" +msgstr "Fel vid skapandet av användare" + +#: src/datastore/gnunet-datastore.c:432 +msgid "Input file is not of a supported format\n" +msgstr "" + +#: src/datastore/gnunet-datastore.c:458 +#, fuzzy +msgid "Failed connecting to the datastore.\n" +msgstr "Misslyckades att ansluta till gnunetd.\n" + +#: src/datastore/gnunet-datastore.c:470 +#, c-format +msgid "Please choose at least one operation: %s, %s\n" +msgstr "" + +#: src/datastore/gnunet-datastore.c:493 +#, fuzzy +msgid "Dump all records from the datastore" +msgstr "Misslyckades att ta emot svar till \"%s\" meddelande från gnunetd\n" + +#: src/datastore/gnunet-datastore.c:497 +#, fuzzy +msgid "Insert records into the datastore" +msgstr "# byte krypterade" + +#: src/datastore/gnunet-datastore.c:502 +msgid "File to dump or insert" msgstr "" -#: src/datastore/gnunet-datastore.c:265 +#: src/datastore/gnunet-datastore.c:511 #, fuzzy msgid "Manipulate GNUnet datastore" msgstr "skriv ut ett värde från konfigurationsfilen till standard ut" @@ -1686,8 +1739,8 @@ msgstr "" #: src/datastore/gnunet-service-datastore.c:634 #: src/datastore/gnunet-service-datastore.c:689 -#: src/datastore/gnunet-service-datastore.c:977 -#: src/datastore/gnunet-service-datastore.c:1633 +#: src/datastore/gnunet-service-datastore.c:837 +#: src/datastore/gnunet-service-datastore.c:1469 msgid "# reserved" msgstr "" @@ -1695,147 +1748,148 @@ msgstr "" msgid "Could not find matching reservation" msgstr "" -#: src/datastore/gnunet-service-datastore.c:792 +#: src/datastore/gnunet-service-datastore.c:773 #, c-format msgid "Need %llu bytes more space (%llu allowed, using %llu)\n" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1026 +#: src/datastore/gnunet-service-datastore.c:876 #, fuzzy msgid "# GET requests received" msgstr "# byte mottogs via TCP" -#: src/datastore/gnunet-service-datastore.c:1058 +#: src/datastore/gnunet-service-datastore.c:907 #, fuzzy msgid "# GET KEY requests received" msgstr "# byte mottogs via TCP" -#: src/datastore/gnunet-service-datastore.c:1071 +#: src/datastore/gnunet-service-datastore.c:920 msgid "# requests filtered by bloomfilter" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1108 +#: src/datastore/gnunet-service-datastore.c:956 msgid "# GET REPLICATION requests received" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1141 +#: src/datastore/gnunet-service-datastore.c:989 msgid "# GET ZERO ANONYMITY requests received" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1190 +#: src/datastore/gnunet-service-datastore.c:1036 #, fuzzy msgid "Content not found" msgstr "Kommando \"%s\" hittades inte!\n" -#: src/datastore/gnunet-service-datastore.c:1199 +#: src/datastore/gnunet-service-datastore.c:1043 msgid "# bytes removed (explicit request)" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1246 +#: src/datastore/gnunet-service-datastore.c:1088 #, fuzzy msgid "# REMOVE requests received" msgstr "# byte mottogs via TCP" -#: src/datastore/gnunet-service-datastore.c:1301 +#: src/datastore/gnunet-service-datastore.c:1137 #, c-format msgid "" "Datastore payload must have been inaccurate (%lld < %lld). Recomputing it.\n" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1307 -#: src/datastore/gnunet-service-datastore.c:1482 +#: src/datastore/gnunet-service-datastore.c:1143 +#: src/datastore/gnunet-service-datastore.c:1318 #, c-format msgid "New payload: %lld\n" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1361 +#: src/datastore/gnunet-service-datastore.c:1197 #, c-format msgid "Loading `%s' datastore plugin\n" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1373 +#: src/datastore/gnunet-service-datastore.c:1209 #, fuzzy, c-format msgid "Failed to load datastore plugin for `%s'\n" msgstr "Kunde inte slå upp \"%s\": %s\n" -#: src/datastore/gnunet-service-datastore.c:1433 +#: src/datastore/gnunet-service-datastore.c:1269 msgid "Bloomfilter construction complete.\n" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1489 +#: src/datastore/gnunet-service-datastore.c:1325 msgid "Rebuilding bloomfilter. Please be patient.\n" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1500 +#: src/datastore/gnunet-service-datastore.c:1336 msgid "Plugin does not support get_keys function. Please fix!\n" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1670 +#: src/datastore/gnunet-service-datastore.c:1506 #, fuzzy, c-format msgid "# bytes used in file-sharing datastore `%s'" msgstr "# byte krypterade" -#: src/datastore/gnunet-service-datastore.c:1686 +#: src/datastore/gnunet-service-datastore.c:1522 msgid "# quota" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1691 +#: src/datastore/gnunet-service-datastore.c:1527 msgid "# cache size" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1707 +#: src/datastore/gnunet-service-datastore.c:1543 #, c-format msgid "Could not use specified filename `%s' for bloomfilter.\n" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1725 -#: src/datastore/gnunet-service-datastore.c:1741 +#: src/datastore/gnunet-service-datastore.c:1561 +#: src/datastore/gnunet-service-datastore.c:1577 #, fuzzy, c-format msgid "Failed to remove bogus bloomfilter file `%s'\n" msgstr "Kunde inte spara konfigurationsfil \"%s\":" -#: src/datastore/gnunet-service-datastore.c:1773 +#: src/datastore/gnunet-service-datastore.c:1609 #, fuzzy msgid "Failed to initialize bloomfilter.\n" msgstr "Misslyckades att initiera tjänsten \"%s\".\n" -#: src/datastore/plugin_datastore_heap.c:769 +#: src/datastore/plugin_datastore_heap.c:893 msgid "Heap database running\n" msgstr "" -#: src/datastore/plugin_datastore_mysql.c:377 -#: src/datastore/plugin_datastore_sqlite.c:590 +#: src/datastore/plugin_datastore_mysql.c:371 +#: src/datastore/plugin_datastore_mysql.c:423 +#: src/datastore/plugin_datastore_mysql.c:1075 +msgid "MySQL statement run failure" +msgstr "" + +#: src/datastore/plugin_datastore_mysql.c:410 +#: src/datastore/plugin_datastore_sqlite.c:626 #, fuzzy msgid "Data too large" msgstr "antal iterationer" -#: src/datastore/plugin_datastore_mysql.c:393 -msgid "MySQL statement run failure" -msgstr "" - -#: src/datastore/plugin_datastore_mysql.c:936 +#: src/datastore/plugin_datastore_mysql.c:848 #, fuzzy, c-format msgid "`%s' for `%s' failed at %s:%d with error: %s\n" msgstr "\"%s\" till \"%s\" misslyckades vid %s:%d med fel: %s\n" -#: src/datastore/plugin_datastore_mysql.c:1208 +#: src/datastore/plugin_datastore_mysql.c:1180 #: src/psycstore/plugin_psycstore_mysql.c:1936 msgid "Mysql database running\n" msgstr "" -#: src/datastore/plugin_datastore_postgres.c:345 +#: src/datastore/plugin_datastore_postgres.c:274 +#: src/datastore/plugin_datastore_postgres.c:891 msgid "Postgress exec failure" msgstr "" -#: src/datastore/plugin_datastore_postgres.c:866 +#: src/datastore/plugin_datastore_postgres.c:852 #, 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:903 -#: src/namecache/plugin_namecache_postgres.c:398 -#: src/namestore/plugin_namestore_postgres.c:571 -#: src/psycstore/plugin_psycstore_postgres.c:1721 +#: src/datastore/plugin_datastore_postgres.c:950 +#: src/psycstore/plugin_psycstore_postgres.c:1506 msgid "Postgres database running\n" msgstr "" @@ -1847,7 +1901,7 @@ msgstr "" msgid "`%s' failed at %s:%u with error: %s" msgstr "\"%s\" misslyckades vid %s:%d med fel: %s\n" -#: src/datastore/plugin_datastore_sqlite.c:281 +#: src/datastore/plugin_datastore_sqlite.c:271 #: src/namecache/plugin_namecache_sqlite.c:194 #: src/namestore/plugin_namestore_sqlite.c:222 #: src/peerstore/plugin_peerstore_sqlite.c:535 @@ -1856,24 +1910,28 @@ msgstr "\"%s\" misslyckades vid %s:%d med fel: %s\n" msgid "Unable to initialize SQLite: %s.\n" msgstr "Kunde inte initiera SQLite.\n" -#: src/datastore/plugin_datastore_sqlite.c:1234 +#: src/datastore/plugin_datastore_sqlite.c:577 +msgid "sqlite bind failure" +msgstr "" + +#: src/datastore/plugin_datastore_sqlite.c:1259 msgid "sqlite version to old to determine size, assuming zero\n" msgstr "" -#: src/datastore/plugin_datastore_sqlite.c:1268 +#: src/datastore/plugin_datastore_sqlite.c:1293 #, c-format msgid "" "Using sqlite page utilization to estimate payload (%llu pages of size %llu " "bytes)\n" msgstr "" -#: src/datastore/plugin_datastore_sqlite.c:1312 +#: src/datastore/plugin_datastore_sqlite.c:1337 #: src/namecache/plugin_namecache_sqlite.c:603 #: src/namestore/plugin_namestore_sqlite.c:802 msgid "Sqlite database running\n" msgstr "" -#: src/datastore/plugin_datastore_template.c:259 +#: src/datastore/plugin_datastore_template.c:253 msgid "Template database running\n" msgstr "" @@ -1935,8 +1993,7 @@ msgstr "" msgid "Prints all packets that go through the DHT." msgstr "" -#: src/dht/gnunet_dht_profiler.c:1161 -#: src/testbed/gnunet-testbed-profiler.c:255 +#: src/dht/gnunet_dht_profiler.c:1161 src/testbed/gnunet-testbed-profiler.c:253 #, fuzzy, c-format msgid "Exiting as the number of peers is %u\n" msgstr "Maximalt antal chattklienter uppnått.\n" @@ -1953,7 +2010,7 @@ msgid "" msgstr "" #: src/dht/gnunet_dht_profiler.c:1200 src/nse/gnunet-nse-profiler.c:853 -#: src/testbed/gnunet-testbed-profiler.c:305 +#: src/testbed/gnunet-testbed-profiler.c:304 msgid "name of the file with the login information for the testbed" msgstr "" @@ -2591,7 +2648,7 @@ msgstr "" msgid "No useful service enabled. Exiting.\n" msgstr "" -#: src/exit/gnunet-daemon-exit.c:3969 +#: src/exit/gnunet-daemon-exit.c:3970 msgid "Daemon to run to provide an IP exit node for the VPN" msgstr "" @@ -2803,7 +2860,7 @@ msgstr "Misslyckades att ta emot svar till \"%s\" meddelande från gnunetd\n" msgid "Failed to not connect to `%s' service.\n" msgstr "Misslyckades att initiera tjänsten \"%s\".\n" -#: src/fs/fs_misc.c:126 +#: src/fs/fs_misc.c:128 #, fuzzy, c-format msgid "Did not find mime type `%s' in extension list.\n" msgstr "Kunde inte hitta motpart \"%s\" i routingtabell!\n" @@ -4031,7 +4088,7 @@ msgstr "" msgid "Failed to connect to identity service\n" msgstr "Misslyckades att ansluta till gnunetd.\n" -#: src/gns/gnunet-gns-import.c:489 +#: src/gns/gnunet-gns-import.c:452 msgid "This program will import some GNS authorities into your GNS namestore." msgstr "" @@ -4050,109 +4107,109 @@ msgstr "" msgid "%s failed at %s:%d: `%s'\n" msgstr "\"%s\" misslyckades vid %s:%d med fel: \"%s\".\n" -#: src/gns/gnunet-gns-proxy.c:878 +#: src/gns/gnunet-gns-proxy.c:887 #, fuzzy, c-format msgid "Unsupported CURL SSL backend %d\n" msgstr "Kommando \"%s\" stöds ej. Avbryter.\n" -#: src/gns/gnunet-gns-proxy.c:901 +#: src/gns/gnunet-gns-proxy.c:910 #, fuzzy, c-format msgid "Failed to fetch CN from cert: %s\n" msgstr "Misslyckades att skicka HTTP-begäran till värd \"%s\": %s\n" -#: src/gns/gnunet-gns-proxy.c:924 +#: src/gns/gnunet-gns-proxy.c:933 #, fuzzy, c-format msgid "Failed to initialize DANE: %s\n" msgstr "Kunde inte initiera SQLite.\n" -#: src/gns/gnunet-gns-proxy.c:937 +#: src/gns/gnunet-gns-proxy.c:946 #, fuzzy, c-format msgid "Failed to parse DANE record: %s\n" msgstr "Misslyckades att skicka HTTP-begäran till värd \"%s\": %s\n" -#: src/gns/gnunet-gns-proxy.c:952 +#: src/gns/gnunet-gns-proxy.c:961 #, fuzzy, c-format msgid "Failed to verify TLS connection using DANE: %s\n" msgstr "Kunde inte spara konfigurationsfil \"%s\":" -#: src/gns/gnunet-gns-proxy.c:962 +#: src/gns/gnunet-gns-proxy.c:971 #, c-format msgid "Failed DANE verification failed with GnuTLS verify status code: %u\n" msgstr "" -#: src/gns/gnunet-gns-proxy.c:986 +#: src/gns/gnunet-gns-proxy.c:995 #, c-format msgid "SSL certificate subject name (%s) does not match `%s'\n" msgstr "" -#: src/gns/gnunet-gns-proxy.c:1095 +#: src/gns/gnunet-gns-proxy.c:1104 #, c-format msgid "Cookie domain `%s' supplied by server is invalid\n" msgstr "" -#: src/gns/gnunet-gns-proxy.c:1699 +#: src/gns/gnunet-gns-proxy.c:1709 #, fuzzy, c-format msgid "Unsupported HTTP method `%s'\n" msgstr "Kommando \"%s\" stöds ej. Avbryter.\n" -#: src/gns/gnunet-gns-proxy.c:2162 +#: src/gns/gnunet-gns-proxy.c:2172 #, fuzzy, c-format msgid "Unable to import private key from file `%s'\n" msgstr "Kunde inte skapa användarkonto:" -#: src/gns/gnunet-gns-proxy.c:2192 +#: src/gns/gnunet-gns-proxy.c:2202 #, fuzzy, c-format msgid "Unable to import certificate %s\n" msgstr "Kunde inte spara konfigurationsfil \"%s\":" -#: src/gns/gnunet-gns-proxy.c:2365 +#: src/gns/gnunet-gns-proxy.c:2375 #, fuzzy, c-format msgid "Failed to start HTTPS server for `%s'\n" msgstr "Misslyckades att starta samling.\n" -#: src/gns/gnunet-gns-proxy.c:2384 src/rest/gnunet-rest-server.c:533 +#: src/gns/gnunet-gns-proxy.c:2394 src/rest/gnunet-rest-server.c:533 #, fuzzy msgid "Failed to pass client to MHD\n" msgstr "Misslyckades att ansluta till gnunetd.\n" -#: src/gns/gnunet-gns-proxy.c:2704 +#: src/gns/gnunet-gns-proxy.c:2716 #, fuzzy, c-format msgid "Unsupported socks version %d\n" msgstr "Kommando \"%s\" stöds ej. Avbryter.\n" -#: src/gns/gnunet-gns-proxy.c:2733 +#: src/gns/gnunet-gns-proxy.c:2745 #, fuzzy, c-format msgid "Unsupported socks command %d\n" msgstr "Kommando \"%s\" stöds ej. Avbryter.\n" -#: src/gns/gnunet-gns-proxy.c:2751 src/gns/gnunet-gns-proxy.c:2780 +#: src/gns/gnunet-gns-proxy.c:2763 src/gns/gnunet-gns-proxy.c:2792 msgid "SSL connection to plain IPv4 address requested\n" msgstr "" -#: src/gns/gnunet-gns-proxy.c:2830 +#: src/gns/gnunet-gns-proxy.c:2842 #, fuzzy, c-format msgid "Unsupported socks address type %d\n" msgstr "Kommando \"%s\" stöds ej. Avbryter.\n" -#: src/gns/gnunet-gns-proxy.c:3165 src/gns/gnunet-service-gns.c:403 +#: src/gns/gnunet-gns-proxy.c:3177 src/gns/gnunet-service-gns.c:403 #, c-format msgid "No ego configured for `%s`\n" msgstr "" -#: src/gns/gnunet-gns-proxy.c:3226 +#: src/gns/gnunet-gns-proxy.c:3238 #, fuzzy, c-format msgid "Failed to load SSL/TLS key and certificate from `%s'\n" msgstr "Misslyckades att läsa kompislista från \"%s\"\n" -#: src/gns/gnunet-gns-proxy.c:3269 +#: src/gns/gnunet-gns-proxy.c:3281 msgid "listen on specified port (default: 7777)" msgstr "" -#: src/gns/gnunet-gns-proxy.c:3275 +#: src/gns/gnunet-gns-proxy.c:3287 msgid "pem file to use as CA" msgstr "" -#: src/gns/gnunet-gns-proxy.c:3300 +#: src/gns/gnunet-gns-proxy.c:3312 msgid "GNUnet GNS proxy" msgstr "" @@ -4162,7 +4219,7 @@ msgid "Failed to connect to the namecache!\n" msgstr "Misslyckades att ansluta till gnunetd.\n" #: src/gns/gnunet-service-gns.c:461 -#: src/zonemaster/gnunet-service-zonemaster.c:741 +#: src/zonemaster/gnunet-service-zonemaster.c:742 #, fuzzy msgid "Could not connect to DHT!\n" msgstr "Kunde inte ansluta till gnunetd.\n" @@ -4364,37 +4421,37 @@ msgstr "Fel vid skapandet av användare" msgid "Modified %u addresses, wrote %u bytes\n" msgstr "" -#: src/hello/hello.c:1103 +#: src/hello/hello.c:1110 #, fuzzy msgid "Failed to parse HELLO message: missing expiration time\n" msgstr "Kunde inte spara konfiguration!" -#: src/hello/hello.c:1112 +#: src/hello/hello.c:1119 #, fuzzy msgid "Failed to parse HELLO message: invalid expiration time\n" msgstr "Kunde inte spara konfiguration!" -#: src/hello/hello.c:1122 +#: src/hello/hello.c:1129 #, fuzzy msgid "Failed to parse HELLO message: malformed\n" msgstr "Misslyckades att läsa kompislista från \"%s\"\n" -#: src/hello/hello.c:1133 +#: src/hello/hello.c:1140 #, fuzzy msgid "Failed to parse HELLO message: missing transport plugin\n" msgstr "Kunde inte slå upp \"%s\": %s\n" -#: src/hello/hello.c:1151 +#: src/hello/hello.c:1158 #, c-format msgid "Plugin `%s' not found, skipping address\n" msgstr "" -#: src/hello/hello.c:1159 +#: src/hello/hello.c:1166 #, c-format msgid "Plugin `%s' does not support URIs yet\n" msgstr "" -#: src/hello/hello.c:1174 +#: src/hello/hello.c:1181 #, fuzzy, c-format msgid "Failed to parse `%s' as an address for plugin `%s'\n" msgstr "Misslyckades att binda till UDP-port %d.\n" @@ -4644,7 +4701,7 @@ msgid "# hostlist advertisements send" msgstr "" #: src/hostlist/gnunet-daemon-hostlist_server.c:679 -#: src/transport/gnunet-service-transport.c:2803 +#: src/transport/gnunet-service-transport.c:2815 #, fuzzy msgid "Could not access PEERINFO service. Exiting.\n" msgstr "Kunde inte komma åt namnrymdsinformation.\n" @@ -4904,12 +4961,6 @@ msgstr "Kunde inte skapa namnrymd \"%s\" (existerar?).\n" msgid "flat plugin running\n" msgstr "" -#: src/namecache/plugin_namecache_postgres.c:90 -#: src/namestore/plugin_namestore_postgres.c:97 -#, fuzzy -msgid "Failed to create indices\n" -msgstr "Kunde inte skapa namnrymd \"%s\" (existerar?).\n" - #: src/namestore/gnunet-namestore.c:301 #, fuzzy, c-format msgid "Adding record failed: %s\n" @@ -5014,8 +5065,7 @@ msgstr "" msgid "Invalid public key for reverse lookup `%s'\n" msgstr "Ogiltigt argument: \"%s\"\n" -#: src/namestore/gnunet-namestore.c:979 -#: src/peerinfo-tool/gnunet-peerinfo.c:775 +#: src/namestore/gnunet-namestore.c:979 src/peerinfo-tool/gnunet-peerinfo.c:775 #, fuzzy, c-format msgid "Invalid URI `%s'\n" msgstr "Ogiltiga argument: " @@ -5156,7 +5206,7 @@ msgstr "Misslyckades att ansluta till gnunetd.\n" msgid "GNU Name System First Come First Serve name registration service" msgstr "" -#: src/namestore/gnunet-service-namestore.c:612 +#: src/namestore/gnunet-service-namestore.c:615 #, fuzzy, c-format msgid "Failed to replicate block in namecache: %s\n" msgstr "Misslyckades att läsa kompislista från \"%s\"\n" @@ -5492,7 +5542,7 @@ msgid "Measure quality and performance of the NSE service." msgstr "Kan inte tillgå tjänsten" #: src/nse/gnunet-service-nse.c:1534 -#: src/revocation/gnunet-service-revocation.c:838 src/util/gnunet-scrypt.c:276 +#: src/revocation/gnunet-service-revocation.c:840 src/util/gnunet-scrypt.c:276 msgid "Value is too large.\n" msgstr "" @@ -5532,17 +5582,17 @@ msgstr "Misslyckades att läsa kompislista från \"%s\"\n" msgid "Still no peers found in `%s'!\n" msgstr "" -#: src/peerinfo/gnunet-service-peerinfo.c:1076 +#: src/peerinfo/gnunet-service-peerinfo.c:1080 #, 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:1405 +#: src/peerinfo/gnunet-service-peerinfo.c:1409 #, c-format msgid "Importing HELLOs from `%s'\n" msgstr "" -#: src/peerinfo/gnunet-service-peerinfo.c:1418 +#: src/peerinfo/gnunet-service-peerinfo.c:1422 msgid "Skipping import of included HELLOs\n" msgstr "" @@ -5690,15 +5740,10 @@ msgstr "Fel vid skapandet av användare" msgid "Unable to create indices: %s.\n" msgstr "Kunde inte skapa namnrymd \"%s\" (existerar?).\n" -#: src/postgres/postgres.c:67 -#, fuzzy, c-format -msgid "`%s:%s' failed at %s:%d with error: %s\n" -msgstr "\"%s\" misslyckades vid %s:%d med fel: %s\n" - -#: src/postgres/postgres.c:192 +#: src/pq/pq_prepare.c:80 #, fuzzy, c-format -msgid "Unable to connect to Postgres database '%s': %s\n" -msgstr "Kunde inte spara konfigurationsfil \"%s\":" +msgid "PQprepare (`%s' as `%s') failed with error: %s\n" +msgstr "\"%s\" till \"%s\" misslyckades vid %s:%d med fel: %s\n" #: src/psycstore/gnunet-service-psycstore.c:249 #, fuzzy @@ -5878,61 +5923,61 @@ msgstr "GNUnet-konfiguration" msgid "Daemon to announce regular expressions for the peer using cadet." msgstr "" -#: src/regex/gnunet-regex-profiler.c:1314 +#: src/regex/gnunet-regex-profiler.c:1386 #, fuzzy msgid "No configuration file given. Exiting\n" msgstr "använd konfigurationsfil FILNAMN" -#: src/regex/gnunet-regex-profiler.c:1355 +#: src/regex/gnunet-regex-profiler.c:1427 #: src/regex/gnunet-regex-simulation-profiler.c:630 #, c-format msgid "No policy directory specified on command line. Exiting.\n" msgstr "" -#: src/regex/gnunet-regex-profiler.c:1361 +#: src/regex/gnunet-regex-profiler.c:1433 #: src/regex/gnunet-regex-simulation-profiler.c:638 #, c-format msgid "Specified policies directory does not exist. Exiting.\n" msgstr "" -#: src/regex/gnunet-regex-profiler.c:1368 +#: src/regex/gnunet-regex-profiler.c:1440 #, fuzzy, c-format msgid "No files found in `%s'\n" msgstr "%d filer hittades i katalog.\n" -#: src/regex/gnunet-regex-profiler.c:1377 +#: src/regex/gnunet-regex-profiler.c:1449 msgid "No search strings file given. Exiting.\n" msgstr "" -#: src/regex/gnunet-regex-profiler.c:1397 +#: src/regex/gnunet-regex-profiler.c:1469 #, fuzzy msgid "Error loading search strings. Exiting.\n" msgstr "Fel vid lämning av DHT.\n" -#: src/regex/gnunet-regex-profiler.c:1485 +#: src/regex/gnunet-regex-profiler.c:1557 #, fuzzy msgid "name of the file for writing statistics" msgstr "Visa värde av alternativet" -#: src/regex/gnunet-regex-profiler.c:1491 +#: src/regex/gnunet-regex-profiler.c:1563 msgid "wait TIMEOUT before ending the experiment" msgstr "" -#: src/regex/gnunet-regex-profiler.c:1497 +#: src/regex/gnunet-regex-profiler.c:1569 msgid "directory with policy files" msgstr "" -#: src/regex/gnunet-regex-profiler.c:1504 +#: src/regex/gnunet-regex-profiler.c:1576 #, fuzzy msgid "name of file with input strings" msgstr "Visa värde av alternativet" -#: src/regex/gnunet-regex-profiler.c:1510 +#: src/regex/gnunet-regex-profiler.c:1582 #, fuzzy msgid "name of file with hosts' names" msgstr "Visa värde av alternativet" -#: src/regex/gnunet-regex-profiler.c:1523 +#: src/regex/gnunet-regex-profiler.c:1595 msgid "Profiler for regex" msgstr "" @@ -6097,12 +6142,12 @@ msgstr "# sessionsnycklar accepterade" msgid "# revocation set unions completed" msgstr "# klartext PONG-meddelanden mottagna" -#: src/revocation/gnunet-service-revocation.c:524 -#: src/revocation/gnunet-service-revocation.c:771 +#: src/revocation/gnunet-service-revocation.c:525 +#: src/revocation/gnunet-service-revocation.c:773 msgid "SET service crashed, terminating revocation service\n" msgstr "" -#: src/revocation/gnunet-service-revocation.c:862 +#: src/revocation/gnunet-service-revocation.c:864 #, fuzzy msgid "Could not open revocation database file!" msgstr "Kunde inte ansluta till gnunetd.\n" @@ -6166,9 +6211,9 @@ msgstr "" msgid "Calculate the Vectorproduct with a GNUnet peer." msgstr "" -#: src/scalarproduct/gnunet-service-scalarproduct_alice.c:1407 +#: src/scalarproduct/gnunet-service-scalarproduct_alice.c:1401 #: src/scalarproduct/gnunet-service-scalarproduct_bob.c:1345 -#: src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c:1180 +#: src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c:1172 #: src/scalarproduct/gnunet-service-scalarproduct-ecc_bob.c:1063 #, fuzzy msgid "Connect to CADET failed\n" @@ -6194,7 +6239,7 @@ msgstr "" msgid "also profile decryption" msgstr "" -#: src/set/gnunet-service-set.c:1948 +#: src/set/gnunet-service-set.c:1989 #, fuzzy msgid "Could not connect to CADET service\n" msgstr "Kunde inte ansluta till gnunetd.\n" @@ -6254,116 +6299,116 @@ msgstr "" msgid "say good-bye and leave somebody else's place" msgstr "" -#: src/social/gnunet-social.c:1227 src/social/gnunet-social.c:1232 +#: src/social/gnunet-social.c:1227 msgid "create a place" msgstr "" -#: src/social/gnunet-social.c:1237 +#: src/social/gnunet-social.c:1232 msgid "destroy a place we were hosting" msgstr "" -#: src/social/gnunet-social.c:1242 +#: src/social/gnunet-social.c:1237 msgid "enter somebody else's place" msgstr "" -#: src/social/gnunet-social.c:1248 +#: src/social/gnunet-social.c:1243 msgid "find state matching name prefix" msgstr "" -#: src/social/gnunet-social.c:1253 +#: src/social/gnunet-social.c:1248 msgid "replay history of messages up to the given --limit" msgstr "" -#: src/social/gnunet-social.c:1258 +#: src/social/gnunet-social.c:1253 msgid "reconnect to a previously created place" msgstr "" -#: src/social/gnunet-social.c:1263 +#: src/social/gnunet-social.c:1258 msgid "publish something to a place we are hosting" msgstr "" -#: src/social/gnunet-social.c:1268 +#: src/social/gnunet-social.c:1263 msgid "reconnect to a previously entered place" msgstr "" -#: src/social/gnunet-social.c:1273 +#: src/social/gnunet-social.c:1268 msgid "search for state matching exact name" msgstr "" -#: src/social/gnunet-social.c:1278 +#: src/social/gnunet-social.c:1273 msgid "submit something to somebody's place" msgstr "" -#: src/social/gnunet-social.c:1283 +#: src/social/gnunet-social.c:1278 msgid "list of egos and subscribed places" msgstr "" -#: src/social/gnunet-social.c:1288 +#: src/social/gnunet-social.c:1283 msgid "extract and replay history between message IDs --start and --until" msgstr "" -#: src/social/gnunet-social.c:1297 +#: src/social/gnunet-social.c:1292 msgid "application ID to use when connecting" msgstr "" -#: src/social/gnunet-social.c:1303 +#: src/social/gnunet-social.c:1298 msgid "message body or state value" msgstr "" -#: src/social/gnunet-social.c:1309 +#: src/social/gnunet-social.c:1304 #, fuzzy msgid "name or public key of ego" msgstr "Ogiltigt argument: \"%s\"\n" -#: src/social/gnunet-social.c:1314 +#: src/social/gnunet-social.c:1309 #, fuzzy msgid "wait for incoming messages" msgstr "Misslyckades att leverera \"%s\" meddelande.\n" -#: src/social/gnunet-social.c:1320 +#: src/social/gnunet-social.c:1315 #, fuzzy msgid "GNS name" msgstr "Visa _namn" -#: src/social/gnunet-social.c:1326 +#: src/social/gnunet-social.c:1321 msgid "peer ID for --guest-enter" msgstr "" -#: src/social/gnunet-social.c:1332 +#: src/social/gnunet-social.c:1327 msgid "name (key) to query from state" msgstr "" -#: src/social/gnunet-social.c:1338 +#: src/social/gnunet-social.c:1333 #, fuzzy msgid "method name" msgstr "Visa _namn" -#: src/social/gnunet-social.c:1344 +#: src/social/gnunet-social.c:1339 #, fuzzy msgid "number of messages to replay from history" msgstr "antal meddelanden att använda per iteration" -#: src/social/gnunet-social.c:1350 +#: src/social/gnunet-social.c:1345 msgid "key address of place" msgstr "" -#: src/social/gnunet-social.c:1356 +#: src/social/gnunet-social.c:1351 msgid "start message ID for history replay" msgstr "" -#: src/social/gnunet-social.c:1361 +#: src/social/gnunet-social.c:1356 msgid "respond to entry requests by admitting all guests" msgstr "" -#: src/social/gnunet-social.c:1367 +#: src/social/gnunet-social.c:1362 msgid "end message ID for history replay" msgstr "" -#: src/social/gnunet-social.c:1372 +#: src/social/gnunet-social.c:1367 msgid "respond to entry requests by refusing all guests" msgstr "" -#: src/social/gnunet-social.c:1382 +#: src/social/gnunet-social.c:1377 msgid "" "gnunet-social - Interact with the social service: enter/leave, send/receive " "messages, access history and state.\n" @@ -6388,7 +6433,7 @@ msgstr "\"%s\" misslyckades för fil \"%s\" vid %s:%d med fel: %s\n" msgid "Wrote %llu bytes of statistics to `%s'\n" msgstr "Ladda ner filer från GNUnet." -#: src/statistics/gnunet-service-statistics.c:1084 +#: src/statistics/gnunet-service-statistics.c:1086 #, fuzzy, c-format msgid "Loading %llu bytes of statistics from `%s'\n" msgstr "Ladda ner filer från GNUnet." @@ -6517,7 +6562,7 @@ msgid "Invalid argument `%s'; expecting unsigned int\n" msgstr "Ogiltigt argument: \"%s\"\n" #: src/testbed/generate-underlay-topology.c:342 -#: src/testbed/gnunet-testbed-profiler.c:284 +#: src/testbed/gnunet-testbed-profiler.c:283 msgid "create COUNT number of peers" msgstr "" @@ -6555,13 +6600,13 @@ msgid "" "deployments" msgstr "" -#: src/testbed/gnunet-daemon-testbed-underlay.c:231 src/testing/list-keys.c:46 -#: src/testing/testing.c:288 src/util/gnunet-ecc.c:298 +#: src/testbed/gnunet-daemon-testbed-underlay.c:233 src/testing/list-keys.c:46 +#: src/testing/testing.c:288 src/util/gnunet-ecc.c:306 #, c-format msgid "Incorrect hostkey file format: %s\n" msgstr "" -#: src/testbed/gnunet-daemon-testbed-underlay.c:469 +#: src/testbed/gnunet-daemon-testbed-underlay.c:471 msgid "Daemon to restrict underlay network in testbed deployments" msgstr "" @@ -6636,11 +6681,11 @@ msgstr "Väntar på att motparter ska ansluta (%u iterationer kvar)...\n" msgid "Spawning process `%s'\n" msgstr "Startade samling \"%s\".\n" -#: src/testbed/gnunet-testbed-profiler.c:290 +#: src/testbed/gnunet-testbed-profiler.c:289 msgid "tolerate COUNT number of continious timeout failures" msgstr "" -#: src/testbed/gnunet-testbed-profiler.c:295 +#: src/testbed/gnunet-testbed-profiler.c:294 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 " @@ -6951,46 +6996,46 @@ msgstr "" msgid "# messages dropped due to slow client" msgstr "" -#: src/transport/gnunet-service-transport.c:809 +#: src/transport/gnunet-service-transport.c:818 msgid "# bytes payload dropped (other peer was not connected)" msgstr "" -#: src/transport/gnunet-service-transport.c:1539 +#: src/transport/gnunet-service-transport.c:1551 #, fuzzy msgid "# bytes payload discarded due to not connected peer" msgstr "Nätverksannonsering avstängd i konfigurationen!\n" -#: src/transport/gnunet-service-transport.c:1699 +#: src/transport/gnunet-service-transport.c:1711 #, fuzzy msgid "# bytes total received" msgstr "# byte krypterade" -#: src/transport/gnunet-service-transport.c:1796 +#: src/transport/gnunet-service-transport.c:1808 #, fuzzy msgid "# bytes payload received" msgstr "# byte dekrypterade" -#: src/transport/gnunet-service-transport.c:2113 -#: src/transport/gnunet-service-transport.c:2585 +#: src/transport/gnunet-service-transport.c:2125 +#: src/transport/gnunet-service-transport.c:2597 msgid "# disconnects due to blacklist" msgstr "" -#: src/transport/gnunet-service-transport.c:2589 +#: src/transport/gnunet-service-transport.c:2601 #, 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:2697 +#: src/transport/gnunet-service-transport.c:2709 #, 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:2706 +#: src/transport/gnunet-service-transport.c:2718 #, c-format msgid "Adding blacklisting entry for peer `%s':`%s'\n" msgstr "" -#: src/transport/gnunet-service-transport.c:2771 +#: src/transport/gnunet-service-transport.c:2783 #, fuzzy msgid "Transport service is lacking key configuration settings. Exiting.\n" msgstr "GNUnet-konfiguration" @@ -7143,74 +7188,74 @@ msgstr "# PING-meddelanden skapade" msgid "SYN request from peer `%s' ignored due impending shutdown\n" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:2620 +#: src/transport/gnunet-service-transport_neighbours.c:2623 msgid "# Attempts to switch addresses" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:3102 +#: src/transport/gnunet-service-transport_neighbours.c:3105 #, fuzzy msgid "# SYN_ACK messages received" msgstr "# krypterade PONG-meddelanden mottagna" -#: src/transport/gnunet-service-transport_neighbours.c:3110 +#: src/transport/gnunet-service-transport_neighbours.c:3113 #, fuzzy msgid "# unexpected SYN_ACK messages (no peer)" msgstr "skicka ANTAL meddelanden" -#: src/transport/gnunet-service-transport_neighbours.c:3128 -#: src/transport/gnunet-service-transport_neighbours.c:3152 +#: src/transport/gnunet-service-transport_neighbours.c:3131 +#: src/transport/gnunet-service-transport_neighbours.c:3155 #, fuzzy msgid "# unexpected SYN_ACK messages (not ready)" msgstr "skicka ANTAL meddelanden" -#: src/transport/gnunet-service-transport_neighbours.c:3164 +#: src/transport/gnunet-service-transport_neighbours.c:3167 #, fuzzy msgid "# unexpected SYN_ACK messages (waiting on ATS)" msgstr "skicka ANTAL meddelanden" -#: src/transport/gnunet-service-transport_neighbours.c:3189 +#: src/transport/gnunet-service-transport_neighbours.c:3192 msgid "# Successful attempts to switch addresses" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:3202 +#: src/transport/gnunet-service-transport_neighbours.c:3205 #, fuzzy msgid "# unexpected SYN_ACK messages (disconnecting)" msgstr "skicka ANTAL meddelanden" -#: src/transport/gnunet-service-transport_neighbours.c:3374 +#: src/transport/gnunet-service-transport_neighbours.c:3377 #, fuzzy msgid "# ACK messages received" msgstr "# krypterade PONG-meddelanden mottagna" -#: src/transport/gnunet-service-transport_neighbours.c:3410 +#: src/transport/gnunet-service-transport_neighbours.c:3413 #, fuzzy msgid "# unexpected ACK messages" msgstr "# krypterade PONG-meddelanden skickade" -#: src/transport/gnunet-service-transport_neighbours.c:3498 +#: src/transport/gnunet-service-transport_neighbours.c:3501 #, fuzzy msgid "# quota messages ignored (malformed)" msgstr "# byte mottogs via TCP" -#: src/transport/gnunet-service-transport_neighbours.c:3505 +#: src/transport/gnunet-service-transport_neighbours.c:3508 #, fuzzy msgid "# QUOTA messages received" msgstr "# krypterade PONG-meddelanden mottagna" -#: src/transport/gnunet-service-transport_neighbours.c:3545 +#: src/transport/gnunet-service-transport_neighbours.c:3548 msgid "# disconnect messages ignored (malformed)" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:3552 +#: src/transport/gnunet-service-transport_neighbours.c:3555 #, fuzzy msgid "# DISCONNECT messages received" msgstr "# krypterade PONG-meddelanden mottagna" -#: src/transport/gnunet-service-transport_neighbours.c:3563 +#: src/transport/gnunet-service-transport_neighbours.c:3566 msgid "# disconnect messages ignored (timestamp)" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:3697 +#: src/transport/gnunet-service-transport_neighbours.c:3700 #, fuzzy msgid "# disconnected from peer upon explicit request" msgstr "# av anslutna parter" @@ -7245,8 +7290,8 @@ msgstr "" #: src/transport/gnunet-service-transport_validation.c:491 #: src/transport/gnunet-service-transport_validation.c:677 -#: src/transport/gnunet-service-transport_validation.c:988 -#: src/transport/gnunet-service-transport_validation.c:1590 +#: src/transport/gnunet-service-transport_validation.c:997 +#: src/transport/gnunet-service-transport_validation.c:1609 msgid "# validations running" msgstr "" @@ -7271,58 +7316,58 @@ msgstr "" msgid "# address revalidations started" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1114 +#: src/transport/gnunet-service-transport_validation.c:1123 #, fuzzy msgid "# PING message for different peer received" msgstr "# PING-meddelanden skapade" -#: src/transport/gnunet-service-transport_validation.c:1165 +#: src/transport/gnunet-service-transport_validation.c:1174 #, c-format msgid "Plugin `%s' not available, cannot confirm having this address\n" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1178 +#: src/transport/gnunet-service-transport_validation.c:1187 msgid "# failed address checks during validation" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1181 +#: src/transport/gnunet-service-transport_validation.c:1190 #, c-format msgid "Address `%s' is not one of my addresses, not confirming PING\n" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1189 +#: src/transport/gnunet-service-transport_validation.c:1198 msgid "# successful address checks during validation" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1202 +#: src/transport/gnunet-service-transport_validation.c:1211 #, c-format msgid "" "Not confirming PING from peer `%s' with address `%s' since I cannot confirm " "having this address.\n" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1257 +#: src/transport/gnunet-service-transport_validation.c:1266 #, fuzzy, c-format msgid "Failed to create PONG signature for peer `%s'\n" msgstr "Kunde inte skapa namnrymd \"%s\" (existerar?).\n" -#: src/transport/gnunet-service-transport_validation.c:1308 +#: src/transport/gnunet-service-transport_validation.c:1317 msgid "# PONGs unicast via reliable transport" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1317 +#: src/transport/gnunet-service-transport_validation.c:1326 msgid "# PONGs multicast to all available addresses" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1480 +#: src/transport/gnunet-service-transport_validation.c:1499 msgid "# PONGs dropped, no matching pending validation" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1498 +#: src/transport/gnunet-service-transport_validation.c:1517 msgid "# PONGs dropped, signature expired" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1553 +#: src/transport/gnunet-service-transport_validation.c:1572 msgid "# validations succeeded" msgstr "" @@ -7514,8 +7559,8 @@ msgid "message size to use" msgstr "meddelandestorlek" #: src/transport/plugin_transport_http_client.c:1474 -#: src/transport/plugin_transport_http_server.c:2249 -#: src/transport/plugin_transport_http_server.c:3463 +#: src/transport/plugin_transport_http_server.c:2312 +#: src/transport/plugin_transport_http_server.c:3526 #: src/transport/plugin_transport_tcp.c:3890 #: src/transport/plugin_transport_tcp.c:3897 msgid "TCP_STEALTH not supported on this platform.\n" @@ -7527,13 +7572,13 @@ msgid "Could not initialize curl multi handle, failed to start %s plugin!\n" msgstr "" #: src/transport/plugin_transport_http_client.c:2164 -#: src/transport/plugin_transport_http_server.c:3178 +#: src/transport/plugin_transport_http_server.c:3241 #, fuzzy, c-format msgid "Shutting down plugin `%s'\n" msgstr "Testar transport(er) %s\n" #: src/transport/plugin_transport_http_client.c:2181 -#: src/transport/plugin_transport_http_server.c:3248 +#: src/transport/plugin_transport_http_server.c:3311 #, fuzzy, c-format msgid "Shutdown for plugin `%s' complete\n" msgstr "" @@ -7544,108 +7589,108 @@ msgstr "" msgid "Maximum number of requests is %u\n" msgstr "Maximalt antal chattklienter uppnått.\n" -#: src/transport/plugin_transport_http_server.c:1727 +#: src/transport/plugin_transport_http_server.c:1756 #, c-format msgid "" "Access from connection %p (%u of %u) for `%s' `%s' url `%s' with upload data " "size %u\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:1967 +#: src/transport/plugin_transport_http_server.c:2028 #, c-format msgid "Accepting connection (%u of %u) from `%s'\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:1975 +#: src/transport/plugin_transport_http_server.c:2036 #, c-format msgid "" "Server reached maximum number connections (%u), rejecting new connection\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:2125 +#: src/transport/plugin_transport_http_server.c:2186 msgid "" "Could not create a new TLS certificate, program `gnunet-transport-" "certificate-creation' could not be started!\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:2148 +#: src/transport/plugin_transport_http_server.c:2209 #, c-format msgid "No usable TLS certificate found and creating one at `%s/%s' failed!\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:2275 +#: src/transport/plugin_transport_http_server.c:2338 msgid "Could not load or create server certificate! Loading plugin failed!\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:2587 +#: src/transport/plugin_transport_http_server.c:2650 #, fuzzy msgid "Require valid port number for service in configuration!\n" msgstr "Inga applikationer definierade i konfiguration!\n" -#: src/transport/plugin_transport_http_server.c:2752 +#: src/transport/plugin_transport_http_server.c:2815 #, c-format msgid "Found %u addresses to report to NAT service\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:2838 +#: src/transport/plugin_transport_http_server.c:2901 #: src/transport/plugin_transport_udp.c:3622 msgid "Disabling IPv6 since it is not supported on this system!\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:2944 +#: src/transport/plugin_transport_http_server.c:3007 #, c-format msgid "IPv4 support is %s\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:2959 +#: src/transport/plugin_transport_http_server.c:3022 #, c-format msgid "IPv6 support is %s\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:2965 +#: src/transport/plugin_transport_http_server.c:3028 msgid "Neither IPv4 nor IPv6 are enabled! Fix in configuration\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:2976 +#: src/transport/plugin_transport_http_server.c:3039 #, fuzzy msgid "Port is required! Fix in configuration\n" msgstr " gconfig\tGTK-konfiguration\n" -#: src/transport/plugin_transport_http_server.c:2982 +#: src/transport/plugin_transport_http_server.c:3045 #, fuzzy, c-format msgid "Using port %u\n" msgstr "Testar transport(er) %s\n" -#: src/transport/plugin_transport_http_server.c:3001 +#: src/transport/plugin_transport_http_server.c:3064 #, fuzzy, c-format msgid "Specific IPv4 address `%s' in configuration file is invalid!\n" msgstr "" "Du måste ange ett positivt nummer för \"%s\" i konfigurationen i sektion \"%s" "\".\n" -#: src/transport/plugin_transport_http_server.c:3036 +#: src/transport/plugin_transport_http_server.c:3099 #, fuzzy, c-format msgid "Specific IPv6 address `%s' in configuration file is invalid!\n" msgstr "" "Du måste ange ett positivt nummer för \"%s\" i konfigurationen i sektion \"%s" "\".\n" -#: src/transport/plugin_transport_http_server.c:3111 +#: src/transport/plugin_transport_http_server.c:3174 #, fuzzy, c-format msgid "Using external hostname `%s'\n" msgstr "Startade samling \"%s\".\n" -#: src/transport/plugin_transport_http_server.c:3132 +#: src/transport/plugin_transport_http_server.c:3195 #, fuzzy, c-format msgid "Notifying transport only about hostname `%s'\n" msgstr "Misslyckades att läsa kompislista från \"%s\"\n" -#: src/transport/plugin_transport_http_server.c:3149 +#: src/transport/plugin_transport_http_server.c:3212 #, fuzzy, c-format msgid "Maximum number of connections is %u\n" msgstr "Maximalt antal chattklienter uppnått.\n" -#: src/transport/plugin_transport_http_server.c:3475 +#: src/transport/plugin_transport_http_server.c:3538 #, fuzzy msgid "Unable to compile URL regex\n" msgstr "Kunde inte initiera SQLite.\n" @@ -7978,7 +8023,7 @@ msgid "" "`GNUNET_SERVER_receive_done' after %s\n" msgstr "" -#: src/transport/tcp_service_legacy.c:339 src/util/service.c:2337 +#: src/transport/tcp_service_legacy.c:339 src/util/service.c:2346 #, fuzzy, c-format msgid "Unknown address family %d\n" msgstr "Okänd operation \"%s\"\n" @@ -8023,51 +8068,51 @@ msgstr "Fel vid %s:%d.\n" msgid "Service `%s' runs at %s\n" msgstr "Motpart \"%s\" med pålitlighet %8u och adress \"%s\"\n" -#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:1501 +#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:1500 msgid "Service process failed to initialize\n" msgstr "" -#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:1505 +#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:1504 msgid "Service process could not initialize server function\n" msgstr "" -#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:1509 +#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:1508 msgid "Service process failed to report status\n" msgstr "" #: src/transport/tcp_service_legacy.c:1313 src/util/disk.c:1488 -#: src/util/service.c:1379 +#: src/util/service.c:1378 #, fuzzy, c-format msgid "Cannot obtain information about user `%s': %s\n" msgstr "Kan inte öppna konfigurationsfil \"%s\".\n" -#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1381 +#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1380 msgid "No such user" msgstr "" -#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1400 +#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1399 #, c-format msgid "Cannot change user/group to `%s': %s\n" msgstr "Kan inte ändra användare/grupp till \"%s\": %s\n" -#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:1728 +#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:1727 msgid "do daemonize (detach from terminal)" msgstr "" -#: src/transport/tcp_service_legacy.c:1448 src/util/program.c:244 -#: src/util/service.c:1791 +#: src/transport/tcp_service_legacy.c:1448 src/util/program.c:255 +#: src/util/service.c:1790 #, fuzzy, c-format msgid "Malformed configuration file `%s', exit ...\n" msgstr "Kunde inte spara konfigurationsfil \"%s\":" -#: src/transport/tcp_service_legacy.c:1458 src/util/program.c:261 -#: src/util/service.c:1802 +#: src/transport/tcp_service_legacy.c:1458 src/util/program.c:272 +#: src/util/service.c:1801 #, fuzzy msgid "Malformed configuration, exit ...\n" msgstr "Kunde inte spara konfigurationsfil \"%s\":" -#: src/transport/tcp_service_legacy.c:1463 src/util/program.c:256 -#: src/util/service.c:1808 +#: src/transport/tcp_service_legacy.c:1463 src/util/program.c:267 +#: src/util/service.c:1807 #, fuzzy, c-format msgid "Could not access configuration file `%s'\n" msgstr "Kunde inte tolka konfigurationsfil \"%s\".\n" @@ -8107,91 +8152,91 @@ msgstr "" msgid "Metadata `%s' failed to deserialize" msgstr "" -#: src/util/client.c:882 +#: src/util/client.c:911 #, c-format msgid "Need a non-empty hostname for service `%s'.\n" msgstr "" -#: src/util/common_logging.c:256 src/util/common_logging.c:1129 +#: src/util/common_logging.c:259 src/util/common_logging.c:1132 msgid "DEBUG" msgstr "FELSÖKNING" -#: src/util/common_logging.c:258 src/util/common_logging.c:1127 +#: src/util/common_logging.c:261 src/util/common_logging.c:1130 msgid "INFO" msgstr "INFO" -#: src/util/common_logging.c:260 src/util/common_logging.c:1125 +#: src/util/common_logging.c:263 src/util/common_logging.c:1128 msgid "MESSAGE" msgstr "MEDDELANDE" -#: src/util/common_logging.c:262 src/util/common_logging.c:1123 +#: src/util/common_logging.c:265 src/util/common_logging.c:1126 msgid "WARNING" msgstr "VARNING" -#: src/util/common_logging.c:264 src/util/common_logging.c:1121 +#: src/util/common_logging.c:267 src/util/common_logging.c:1124 msgid "ERROR" msgstr "FEL" -#: src/util/common_logging.c:266 src/util/common_logging.c:1131 +#: src/util/common_logging.c:269 src/util/common_logging.c:1134 msgid "NONE" msgstr "" -#: src/util/common_logging.c:879 +#: src/util/common_logging.c:882 #, c-format msgid "Message `%.*s' repeated %u times in the last %s\n" msgstr "" -#: src/util/common_logging.c:1132 +#: src/util/common_logging.c:1135 msgid "INVALID" msgstr "" -#: src/util/common_logging.c:1302 +#: src/util/common_logging.c:1326 msgid "unknown address" msgstr "" -#: src/util/common_logging.c:1344 +#: src/util/common_logging.c:1368 msgid "invalid address" msgstr "" -#: src/util/common_logging.c:1362 +#: src/util/common_logging.c:1386 #, fuzzy, c-format msgid "Configuration fails to specify option `%s' in section `%s'!\n" msgstr "Konfigurationsfil \"%s\" skapad.\n" -#: src/util/common_logging.c:1383 +#: src/util/common_logging.c:1407 #, fuzzy, c-format msgid "" "Configuration specifies invalid value for option `%s' in section `%s': %s\n" msgstr "Konfigurationsfil \"%s\" hittades inte. Kör \"gnunet-setup -d\"!\n" -#: src/util/configuration.c:286 +#: src/util/configuration.c:296 #, fuzzy, c-format msgid "Syntax error while deserializing in line %u\n" msgstr "Syntaxfel i konfigurationsfil \"%s\" på rad %d.\n" -#: src/util/configuration.c:344 +#: src/util/configuration.c:355 #, fuzzy, c-format msgid "Error while reading file `%s'\n" msgstr "Fel vid nedladdning: %s\n" -#: src/util/configuration.c:1017 +#: src/util/configuration.c:1034 #, c-format msgid "" "Configuration value '%s' for '%s' in section '%s' is not in set of legal " "choices\n" msgstr "" -#: src/util/configuration.c:1136 +#: src/util/configuration.c:1153 #, c-format msgid "Recursive expansion suspected, aborting $-expansion for term `%s'\n" msgstr "" -#: src/util/configuration.c:1169 +#: src/util/configuration.c:1186 #, fuzzy, c-format msgid "Missing closing `%s' in option `%s'\n" msgstr "Konfigurationsfil \"%s\" skapad.\n" -#: src/util/configuration.c:1237 +#: src/util/configuration.c:1254 #, c-format msgid "" "Failed to expand `%s' in `%s' as it is neither found in [PATHS] nor defined " @@ -8205,52 +8250,52 @@ msgid "" "%llu)\n" msgstr "" -#: src/util/crypto_ecc.c:777 +#: src/util/crypto_ecc.c:810 #, fuzzy, c-format msgid "ECC signing failed at %s:%d: %s\n" msgstr "\"%s\" misslyckades vid %s:%d med fel: \"%s\".\n" -#: src/util/crypto_ecc.c:827 +#: src/util/crypto_ecc.c:860 #, fuzzy, c-format msgid "EdDSA signing failed at %s:%d: %s\n" msgstr "\"%s\" misslyckades vid %s:%d med fel: \"%s\".\n" -#: src/util/crypto_ecc.c:901 +#: src/util/crypto_ecc.c:934 #, fuzzy, c-format msgid "ECDSA signature verification failed at %s:%d: %s\n" msgstr "\"%s\" misslyckades vid %s:%d med fel: \"%s\".\n" -#: src/util/crypto_ecc.c:958 +#: src/util/crypto_ecc.c:991 #, fuzzy, c-format msgid "EdDSA signature verification failed at %s:%d: %s\n" msgstr "\"%s\" misslyckades vid %s:%d med fel: \"%s\".\n" -#: src/util/crypto_ecc_setup.c:122 src/util/crypto_ecc_setup.c:160 -#: src/util/crypto_ecc_setup.c:278 src/util/crypto_ecc_setup.c:316 +#: src/util/crypto_ecc_setup.c:122 src/util/crypto_ecc_setup.c:161 +#: src/util/crypto_ecc_setup.c:279 src/util/crypto_ecc_setup.c:317 #, fuzzy, c-format msgid "Could not acquire lock on file `%s': %s...\n" msgstr "Kunde inte slå upp \"%s\": %s\n" -#: src/util/crypto_ecc_setup.c:127 src/util/crypto_ecc_setup.c:283 +#: src/util/crypto_ecc_setup.c:128 src/util/crypto_ecc_setup.c:284 #, fuzzy msgid "Creating a new private key. This may take a while.\n" msgstr "Skapar ny värdnyckel (det här kan ta en stund).\n" -#: src/util/crypto_ecc_setup.c:164 src/util/crypto_ecc_setup.c:320 +#: src/util/crypto_ecc_setup.c:165 src/util/crypto_ecc_setup.c:322 msgid "This may be ok if someone is currently generating a private key.\n" msgstr "" -#: src/util/crypto_ecc_setup.c:194 src/util/crypto_ecc_setup.c:350 +#: src/util/crypto_ecc_setup.c:195 src/util/crypto_ecc_setup.c:352 #, c-format msgid "" "When trying to read key file `%s' I found %u bytes but I need at least %u.\n" msgstr "" -#: src/util/crypto_ecc_setup.c:198 src/util/crypto_ecc_setup.c:354 +#: src/util/crypto_ecc_setup.c:199 src/util/crypto_ecc_setup.c:356 msgid "This may be ok if someone is currently generating a key.\n" msgstr "" -#: src/util/crypto_ecc_setup.c:413 +#: src/util/crypto_ecc_setup.c:415 #, fuzzy msgid "Could not load peer's private key\n" msgstr "Kunde inte tolka konfigurationsfil \"%s\".\n" @@ -8444,82 +8489,90 @@ msgstr "" msgid "Manipulate GNUnet configuration files" msgstr "skriv ut ett värde från konfigurationsfilen till standard ut" -#: src/util/gnunet-ecc.c:84 +#: src/util/gnunet-ecc.c:94 #, fuzzy, c-format msgid "Failed to open `%s': %s\n" msgstr "Misslyckades att leverera \"%s\" meddelande.\n" -#: src/util/gnunet-ecc.c:120 +#: src/util/gnunet-ecc.c:130 #, c-format msgid "Generating %u keys like %s, please wait" msgstr "" -#: src/util/gnunet-ecc.c:133 +#: src/util/gnunet-ecc.c:143 #, c-format msgid "Generating %u keys, please wait" msgstr "" -#: src/util/gnunet-ecc.c:174 +#: src/util/gnunet-ecc.c:184 #, fuzzy, c-format msgid "" "\n" "Failed to write to `%s': %s\n" msgstr "Fel vid %s:%d.\n" -#: src/util/gnunet-ecc.c:184 +#: src/util/gnunet-ecc.c:194 #, fuzzy, c-format msgid "" "\n" "Finished!\n" msgstr "Slutför" -#: src/util/gnunet-ecc.c:187 +#: src/util/gnunet-ecc.c:197 #, c-format msgid "" "\n" "Error, %u keys not generated\n" msgstr "" -#: src/util/gnunet-ecc.c:280 +#: src/util/gnunet-ecc.c:288 #, fuzzy, c-format msgid "Hostkeys file `%s' not found\n" msgstr "\"%s\" misslyckades: tabell hittades inte!\n" -#: src/util/gnunet-ecc.c:291 +#: src/util/gnunet-ecc.c:299 #, fuzzy, c-format msgid "Hostkeys file `%s' is empty\n" msgstr "antal meddelanden att använda per iteration" -#: src/util/gnunet-ecc.c:313 +#: src/util/gnunet-ecc.c:321 #, fuzzy, c-format msgid "Could not read hostkey file: %s\n" msgstr "Kunde inte skapa värdnyckel!\n" -#: src/util/gnunet-ecc.c:364 +#: src/util/gnunet-ecc.c:372 msgid "No hostkey file specified on command line\n" msgstr "" -#: src/util/gnunet-ecc.c:416 +#: src/util/gnunet-ecc.c:437 msgid "list keys included in a file (for testing)" msgstr "" -#: src/util/gnunet-ecc.c:421 +#: src/util/gnunet-ecc.c:442 msgid "number of keys to list included in a file (for testing)" msgstr "" -#: src/util/gnunet-ecc.c:426 +#: src/util/gnunet-ecc.c:447 msgid "create COUNT public-private key pairs (for testing)" msgstr "" -#: src/util/gnunet-ecc.c:430 +#: src/util/gnunet-ecc.c:451 msgid "print the public key in ASCII format" msgstr "" -#: src/util/gnunet-ecc.c:434 +#: src/util/gnunet-ecc.c:455 +msgid "print the private key in ASCII format" +msgstr "" + +#: src/util/gnunet-ecc.c:459 +msgid "print the public key in HEX format" +msgstr "" + +#: src/util/gnunet-ecc.c:463 msgid "print examples of ECC operations (used for compatibility testing)" msgstr "" -#: src/util/gnunet-ecc.c:449 +#: src/util/gnunet-ecc.c:479 #, fuzzy msgid "Manipulate GNUnet private ECC key files" msgstr "skriv ut ett värde från konfigurationsfilen till standard ut" @@ -8613,7 +8666,7 @@ msgstr "Fel vid skapandet av användare" msgid "Unable to shorten unix path `%s' while keeping name unique\n" msgstr "" -#: src/util/network.c:1793 src/util/network.c:1969 +#: src/util/network.c:1793 src/util/network.c:1977 #, c-format msgid "" "Fatal internal logic error, process hangs in `%s' (abort with CTRL-C)!\n" @@ -8667,7 +8720,7 @@ 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/resolver_api.c:204 +#: src/util/resolver_api.c:203 #, c-format msgid "" "Missing `%s' for `%s' in configuration, DNS resolution will be unavailable.\n" @@ -8682,32 +8735,32 @@ msgstr "" "Du måste ange ett positivt nummer för \"%s\" i konfigurationen i sektion \"%s" "\".\n" -#: src/util/resolver_api.c:815 +#: src/util/resolver_api.c:827 #, fuzzy, c-format msgid "Timeout trying to resolve hostname `%s'.\n" msgstr "Misslyckades att läsa kompislista från \"%s\"\n" -#: src/util/resolver_api.c:827 +#: src/util/resolver_api.c:840 #, c-format msgid "Timeout trying to resolve IP address `%s'.\n" msgstr "" -#: src/util/resolver_api.c:1004 +#: src/util/resolver_api.c:1024 msgid "Resolver not configured correctly.\n" msgstr "" -#: src/util/resolver_api.c:1086 src/util/resolver_api.c:1107 -#: src/util/resolver_api.c:1121 +#: src/util/resolver_api.c:1110 src/util/resolver_api.c:1133 +#: src/util/resolver_api.c:1147 #, fuzzy, c-format msgid "Could not resolve our FQDN: %s\n" msgstr "Kunde inte slå upp \"%s\": %s\n" -#: src/util/service.c:1306 +#: src/util/service.c:1305 msgid "" "Could not bind to any of the ports I was supposed to, refusing to run!\n" msgstr "" -#: src/util/service.c:2082 +#: src/util/service.c:2091 #, c-format msgid "" "Processing code for message of type %u did not call " @@ -8784,63 +8837,63 @@ msgstr " dagar" msgid "end of time" msgstr "" -#: src/util/strings.c:1269 +#: src/util/strings.c:1270 msgid "IPv6 address did not start with `['\n" msgstr "" -#: src/util/strings.c:1277 +#: src/util/strings.c:1278 msgid "IPv6 address did contain ':' to separate port number\n" msgstr "" -#: src/util/strings.c:1283 +#: src/util/strings.c:1284 msgid "IPv6 address did contain ']' before ':' to separate port number\n" msgstr "" -#: src/util/strings.c:1290 +#: src/util/strings.c:1291 msgid "IPv6 address did contain a valid port number after the last ':'\n" msgstr "" -#: src/util/strings.c:1299 +#: src/util/strings.c:1300 #, fuzzy, c-format msgid "Invalid IPv6 address `%s': %s\n" msgstr "Ogiltigt svar på \"%s\".\n" -#: src/util/strings.c:1571 src/util/strings.c:1587 +#: src/util/strings.c:1572 src/util/strings.c:1588 msgid "Port not in range\n" msgstr "" -#: src/util/strings.c:1596 +#: src/util/strings.c:1597 #, fuzzy, c-format msgid "Malformed port policy `%s'\n" msgstr "Misslyckades att starta samling.\n" -#: src/util/strings.c:1679 src/util/strings.c:1710 src/util/strings.c:1758 -#: src/util/strings.c:1779 +#: src/util/strings.c:1680 src/util/strings.c:1711 src/util/strings.c:1759 +#: src/util/strings.c:1780 #, c-format msgid "Invalid format for IP: `%s'\n" msgstr "Ogiltigt format för IP: \"%s\"\n" -#: src/util/strings.c:1736 +#: src/util/strings.c:1737 #, c-format msgid "Invalid network notation ('/%d' is not legal in IPv4 CIDR)." msgstr "Ogiltig nätverksnotation (\"/%d\" är inte giltig i IPv4 CIDR)." -#: src/util/strings.c:1788 +#: src/util/strings.c:1789 #, fuzzy, c-format msgid "Invalid format: `%s'\n" msgstr "Ogiltigt format för IP: \"%s\"\n" -#: src/util/strings.c:1840 +#: src/util/strings.c:1841 #, c-format msgid "Invalid network notation (does not end with ';': `%s')\n" msgstr "Ogiltig nätverksnotation (slutar inte med \";\": \"%s\")\n" -#: src/util/strings.c:1890 +#: src/util/strings.c:1891 #, fuzzy, c-format msgid "Wrong format `%s' for netmask\n" msgstr "Fel format \"%s\" för nätmask: %s\n" -#: src/util/strings.c:1921 +#: src/util/strings.c:1922 #, fuzzy, c-format msgid "Wrong format `%s' for network\n" msgstr "Fel format \"%s\" för nätverk: %s\n" @@ -8893,65 +8946,65 @@ msgstr "" msgid "# ICMPv6 packets dropped (not allowed)" msgstr "" -#: src/vpn/gnunet-service-vpn.c:2232 +#: src/vpn/gnunet-service-vpn.c:2235 #, fuzzy msgid "# Packets received from TUN interface" msgstr "Meddelande mottaget från klient är ogiltig.\n" -#: src/vpn/gnunet-service-vpn.c:2265 src/vpn/gnunet-service-vpn.c:2301 +#: src/vpn/gnunet-service-vpn.c:2268 src/vpn/gnunet-service-vpn.c:2304 #, c-format msgid "Packet received for unmapped destination `%s' (dropping it)\n" msgstr "" -#: src/vpn/gnunet-service-vpn.c:2311 +#: src/vpn/gnunet-service-vpn.c:2314 msgid "Received IPv4 packet with options (dropping it)\n" msgstr "" -#: src/vpn/gnunet-service-vpn.c:2325 +#: src/vpn/gnunet-service-vpn.c:2328 #, c-format msgid "Received packet of unknown protocol %d from TUN (dropping it)\n" msgstr "" -#: src/vpn/gnunet-service-vpn.c:2364 +#: src/vpn/gnunet-service-vpn.c:2367 msgid "Failed to find unallocated IPv4 address in VPN's range\n" msgstr "" -#: src/vpn/gnunet-service-vpn.c:2419 +#: src/vpn/gnunet-service-vpn.c:2422 msgid "Failed to find unallocated IPv6 address in VPN's range\n" msgstr "" -#: src/vpn/gnunet-service-vpn.c:2461 src/vpn/gnunet-service-vpn.c:2683 +#: src/vpn/gnunet-service-vpn.c:2464 src/vpn/gnunet-service-vpn.c:2686 #, fuzzy msgid "# Active destinations" msgstr "Nätverksanslutning" -#: src/vpn/gnunet-service-vpn.c:2732 +#: src/vpn/gnunet-service-vpn.c:2735 msgid "Failed to allocate IP address for new destination\n" msgstr "" -#: src/vpn/gnunet-service-vpn.c:2995 +#: src/vpn/gnunet-service-vpn.c:2998 #, fuzzy msgid "Must specify valid IPv6 address" msgstr "\"%s\" är inte tillgänglig." -#: src/vpn/gnunet-service-vpn.c:3019 +#: src/vpn/gnunet-service-vpn.c:3022 msgid "Must specify valid IPv6 mask" msgstr "" -#: src/vpn/gnunet-service-vpn.c:3027 +#: src/vpn/gnunet-service-vpn.c:3030 msgid "IPv6 support disabled as this system does not support IPv6\n" msgstr "" -#: src/vpn/gnunet-service-vpn.c:3040 +#: src/vpn/gnunet-service-vpn.c:3043 #, fuzzy msgid "Must specify valid IPv4 address" msgstr "\"%s\" är inte tillgänglig." -#: src/vpn/gnunet-service-vpn.c:3053 +#: src/vpn/gnunet-service-vpn.c:3056 msgid "Must specify valid IPv4 mask" msgstr "" -#: src/vpn/gnunet-service-vpn.c:3063 +#: src/vpn/gnunet-service-vpn.c:3066 msgid "IPv4 support disabled as this system does not support IPv4\n" msgstr "" @@ -9023,28 +9076,40 @@ msgstr "# byte mottagna via UDP" msgid "Setup tunnels via VPN." msgstr "" -#: src/zonemaster/gnunet-service-zonemaster.c:705 +#: src/zonemaster/gnunet-service-zonemaster.c:706 #, fuzzy msgid "Failed to connect to the namestore!\n" msgstr "Misslyckades att ansluta till gnunetd.\n" -#: src/include/gnunet_common.h:674 src/include/gnunet_common.h:681 -#: src/include/gnunet_common.h:691 src/include/gnunet_common.h:699 +#: src/include/gnunet_common.h:689 src/include/gnunet_common.h:696 +#: src/include/gnunet_common.h:706 src/include/gnunet_common.h:714 #, fuzzy, c-format msgid "Assertion failed at %s:%d.\n" msgstr "\"%s\" misslyckades vid %s:%d med fel: \"%s\".\n" -#: src/include/gnunet_common.h:711 +#: src/include/gnunet_common.h:726 #, c-format msgid "External protocol violation detected at %s:%d.\n" msgstr "" -#: src/include/gnunet_common.h:738 src/include/gnunet_common.h:747 +#: src/include/gnunet_common.h:753 src/include/gnunet_common.h:762 #, c-format msgid "`%s' failed on file `%s' at %s:%d with error: %s\n" msgstr "\"%s\" misslyckades för fil \"%s\" vid %s:%d med fel: %s\n" #, fuzzy +#~ msgid "Failed to create indices\n" +#~ msgstr "Kunde inte skapa namnrymd \"%s\" (existerar?).\n" + +#, fuzzy +#~ msgid "`%s:%s' failed at %s:%d with error: %s\n" +#~ msgstr "\"%s\" misslyckades vid %s:%d med fel: %s\n" + +#, fuzzy +#~ msgid "Unable to connect to Postgres database '%s': %s\n" +#~ msgstr "Kunde inte spara konfigurationsfil \"%s\":" + +#, fuzzy #~ msgid "Misconfiguration (can not connect to the ARM service)" #~ msgstr "Misslyckades att ansluta till gnunetd.\n" @@ -9153,10 +9218,6 @@ msgstr "\"%s\" misslyckades för fil \"%s\" vid %s:%d med fel: %s\n" #~ msgstr "# klartext PONG-meddelanden mottagna" #, fuzzy -#~ msgid "# bytes sent to datastore" -#~ msgstr "# byte krypterade" - -#, fuzzy #~ msgid "Failed to receive status response from database." #~ msgstr "Misslyckades att ta emot svar till \"%s\" meddelande från gnunetd\n" @@ -9446,10 +9507,6 @@ msgstr "\"%s\" misslyckades för fil \"%s\" vid %s:%d med fel: %s\n" #~ msgstr "Misslyckades att initiera tjänsten \"%s\".\n" #, fuzzy -#~ msgid "Error reading sensor version\n" -#~ msgstr "Fel vid skapandet av användare" - -#, fuzzy #~ msgid "Error reading sensor category\n" #~ msgstr "Fel vid skapandet av användare" @@ -10005,10 +10062,6 @@ msgstr "\"%s\" misslyckades för fil \"%s\" vid %s:%d med fel: %s\n" #~ msgstr "Misslyckades att skicka HTTP-begäran till värd \"%s\": %s\n" #, fuzzy -#~ msgid "Failed to remove records from database" -#~ msgstr "Misslyckades att ta emot svar till \"%s\" meddelande från gnunetd\n" - -#, fuzzy #~ msgid "Failed to access database" #~ msgstr "Misslyckades att leverera \"%s\" meddelande.\n" diff --git 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: 2017-03-31 19:22-0500\n" +"POT-Creation-Date: 2018-01-02 02:33+0100\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" @@ -252,14 +252,14 @@ msgid "Require valid port number for service `%s' in configuration!\n" msgstr "" #: src/arm/gnunet-service-arm.c:430 src/transport/plugin_transport_tcp.c:1176 -#: src/transport/tcp_service_legacy.c:613 src/util/client.c:480 +#: src/transport/tcp_service_legacy.c:613 src/util/client.c:505 #: src/util/service.c:682 #, c-format msgid "UNIXPATH `%s' too long, maximum length is %llu\n" msgstr "" #: src/arm/gnunet-service-arm.c:434 src/transport/plugin_transport_tcp.c:1180 -#: src/transport/tcp_service_legacy.c:617 src/util/client.c:485 +#: src/transport/tcp_service_legacy.c:617 src/util/client.c:510 #: src/util/service.c:687 #, fuzzy, c-format msgid "Using `%s' instead\n" @@ -280,7 +280,7 @@ msgid "Have neither PORT nor UNIXPATH for service `%s', but one is required\n" msgstr "" #: src/arm/gnunet-service-arm.c:513 -#: src/transport/plugin_transport_http_server.c:2621 +#: src/transport/plugin_transport_http_server.c:2684 #: src/transport/plugin_transport_tcp.c:1259 #: src/transport/tcp_service_legacy.c:696 src/util/service.c:782 #, fuzzy, c-format @@ -288,7 +288,7 @@ msgid "Failed to resolve `%s': %s\n" msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n" #: src/arm/gnunet-service-arm.c:532 -#: src/transport/plugin_transport_http_server.c:2639 +#: src/transport/plugin_transport_http_server.c:2702 #: src/transport/plugin_transport_tcp.c:1278 #: src/transport/tcp_service_legacy.c:715 src/util/service.c:802 #, fuzzy, c-format @@ -383,13 +383,11 @@ msgid "" "%llu\n" msgstr "" -#: src/ats/gnunet-ats-solver-eval.c:3294 -#: src/ats-tests/gnunet-solver-eval.c:939 +#: src/ats/gnunet-ats-solver-eval.c:3294 src/ats-tests/gnunet-solver-eval.c:939 msgid "solver to use" msgstr "" -#: src/ats/gnunet-ats-solver-eval.c:3299 -#: src/ats-tests/gnunet-solver-eval.c:945 +#: src/ats/gnunet-ats-solver-eval.c:3299 src/ats-tests/gnunet-solver-eval.c:945 #: src/ats-tests/gnunet-solver-eval.c:950 msgid "experiment to use" msgstr "" @@ -687,58 +685,58 @@ msgstr "" msgid "Invalid peer ID `%s'\n" msgstr "Dữ liệu nhập không hợp lệ.\n" -#: src/cadet/gnunet-cadet.c:702 +#: src/cadet/gnunet-cadet.c:703 #, fuzzy, c-format msgid "Invalid tunnel owner `%s'\n" msgstr "Địa chỉ IP định dạng sai: %s\n" -#: src/cadet/gnunet-cadet.c:775 +#: src/cadet/gnunet-cadet.c:776 msgid "Extra arguments are not applicable in combination with this option.\n" msgstr "" -#: src/cadet/gnunet-cadet.c:866 +#: src/cadet/gnunet-cadet.c:867 #, fuzzy, c-format msgid "Invalid target `%s'\n" msgstr "Đối số không hợp lệ cho « %s ».\n" -#: src/cadet/gnunet-cadet.c:903 +#: src/cadet/gnunet-cadet.c:904 #, fuzzy msgid "No action requested\n" msgstr "Thu thập bị dừng.\n" -#: src/cadet/gnunet-cadet.c:928 +#: src/cadet/gnunet-cadet.c:929 #, fuzzy msgid "Provide information about a particular connection" msgstr "In ra thông tin về các đồng đẳng GNUnet." -#: src/cadet/gnunet-cadet.c:933 +#: src/cadet/gnunet-cadet.c:934 msgid "Activate echo mode" msgstr "" -#: src/cadet/gnunet-cadet.c:938 +#: src/cadet/gnunet-cadet.c:939 msgid "Dump debug information to STDERR" msgstr "" -#: src/cadet/gnunet-cadet.c:944 +#: src/cadet/gnunet-cadet.c:945 msgid "Listen for connections using a shared secret among sender and recipient" msgstr "" -#: src/cadet/gnunet-cadet.c:951 +#: src/cadet/gnunet-cadet.c:952 #, fuzzy msgid "Provide information about a patricular peer" msgstr "In ra thông tin về các đồng đẳng GNUnet." -#: src/cadet/gnunet-cadet.c:957 +#: src/cadet/gnunet-cadet.c:958 #, fuzzy msgid "Provide information about all peers" msgstr "In ra thông tin về các đồng đẳng GNUnet." -#: src/cadet/gnunet-cadet.c:963 +#: src/cadet/gnunet-cadet.c:964 #, fuzzy msgid "Provide information about a particular tunnel" msgstr "In ra thông tin về các đồng đẳng GNUnet." -#: src/cadet/gnunet-cadet.c:969 +#: src/cadet/gnunet-cadet.c:970 #, fuzzy msgid "Provide information about all tunnels" msgstr "In ra thông tin về các đồng đẳng GNUnet." @@ -1068,7 +1066,7 @@ msgid "" msgstr "" #: src/conversation/gnunet_gst.c:622 -#: src/conversation/gnunet-helper-audio-playback-gst.c:356 +#: src/conversation/gnunet-helper-audio-playback-gst.c:361 #, c-format msgid "Read error from STDIN: %d %s\n" msgstr "" @@ -1078,63 +1076,63 @@ msgstr "" msgid "pa_stream_write() failed: %s\n" msgstr "SMTP: « %s » bị lỗi: %s\n" -#: src/conversation/gnunet-helper-audio-playback.c:607 +#: src/conversation/gnunet-helper-audio-playback.c:612 msgid "gnunet-helper-audio-playback - Got signal, exiting\n" msgstr "" -#: src/conversation/gnunet-helper-audio-playback.c:632 +#: src/conversation/gnunet-helper-audio-playback.c:637 #: src/conversation/gnunet-helper-audio-record.c:545 #, fuzzy msgid "Connection established.\n" msgstr "Thu thập bị dừng.\n" -#: src/conversation/gnunet-helper-audio-playback.c:637 +#: src/conversation/gnunet-helper-audio-playback.c:642 #: src/conversation/gnunet-helper-audio-record.c:550 #, fuzzy, c-format msgid "pa_stream_new() failed: %s\n" msgstr "SMTP: « %s » bị lỗi: %s\n" -#: src/conversation/gnunet-helper-audio-playback.c:651 +#: src/conversation/gnunet-helper-audio-playback.c:656 #, c-format msgid "pa_stream_connect_playback() failed: %s\n" msgstr "" -#: src/conversation/gnunet-helper-audio-playback.c:664 +#: src/conversation/gnunet-helper-audio-playback.c:669 #: src/conversation/gnunet-helper-audio-record.c:576 #, fuzzy, c-format msgid "Connection failure: %s\n" msgstr "%s bị lỗi tại %s:%d: « %s »\n" -#: src/conversation/gnunet-helper-audio-playback.c:685 +#: src/conversation/gnunet-helper-audio-playback.c:690 #: src/conversation/gnunet-helper-audio-record.c:599 msgid "Wrong Spec\n" msgstr "" -#: src/conversation/gnunet-helper-audio-playback.c:691 +#: src/conversation/gnunet-helper-audio-playback.c:696 #: src/conversation/gnunet-helper-audio-record.c:605 #, fuzzy msgid "pa_mainloop_new() failed.\n" msgstr "Lỗi nội bộ : khẳng định không thành công tại %s:%d.\n" -#: src/conversation/gnunet-helper-audio-playback.c:705 +#: src/conversation/gnunet-helper-audio-playback.c:710 #: src/conversation/gnunet-helper-audio-record.c:620 #, fuzzy msgid "pa_context_new() failed.\n" msgstr "Lỗi nội bộ : khẳng định không thành công tại %s:%d.\n" -#: src/conversation/gnunet-helper-audio-playback.c:712 +#: src/conversation/gnunet-helper-audio-playback.c:717 #: src/conversation/gnunet-helper-audio-record.c:626 #, fuzzy, c-format msgid "pa_context_connect() failed: %s\n" msgstr "# của các đồng đẳng đã kết nối" -#: src/conversation/gnunet-helper-audio-playback.c:718 +#: src/conversation/gnunet-helper-audio-playback.c:723 #: src/conversation/gnunet-helper-audio-record.c:632 #, fuzzy msgid "pa_mainloop_run() failed.\n" msgstr "Lỗi nội bộ : khẳng định không thành công tại %s:%d.\n" -#: src/conversation/gnunet-helper-audio-playback.c:790 +#: src/conversation/gnunet-helper-audio-playback.c:795 #, c-format msgid "Read error from STDIN: %s\n" msgstr "" @@ -1198,7 +1196,12 @@ msgstr "SMTP: « %s » bị lỗi: %s\n" msgid "Failed to allocate %u bytes for second packet\n" msgstr "Lỗi tạo thư mục tạm thời." -#: src/conversation/microphone.c:119 +#: src/conversation/gnunet-service-conversation.c:1276 +#, fuzzy, c-format +msgid "Could not open line, port %s already in use!\n" +msgstr "Không thể kết nối tới %s:%u: %s\n" + +#: src/conversation/microphone.c:121 #, fuzzy msgid "Could not start record audio helper\n" msgstr "Không thể truy cập đến thông tin về không gian tên.\n" @@ -1290,27 +1293,27 @@ msgstr "# các yêu cầu lỗ hổng bị bỏ do trọng tải" msgid "# dequeuing CAR (duplicate request)" msgstr "" -#: src/core/gnunet-service-core.c:440 +#: src/core/gnunet-service-core.c:443 #, fuzzy, c-format msgid "# bytes of messages of type %u received" msgstr "# các byte nhiễu được nhận" -#: src/core/gnunet-service-core.c:538 +#: src/core/gnunet-service-core.c:541 #, fuzzy msgid "# messages discarded (session disconnected)" msgstr "# các thông báo được chắp liền" -#: src/core/gnunet-service-core.c:876 +#: src/core/gnunet-service-core.c:879 #, fuzzy, c-format msgid "# messages of type %u discarded (client busy)" msgstr "# các byte nhiễu được nhận" -#: src/core/gnunet-service-core.c:985 +#: src/core/gnunet-service-core.c:988 #, fuzzy msgid "Core service is lacking HOSTKEY configuration setting. Exiting.\n" msgstr "Lưu cấu hình ngay bây giờ không?" -#: src/core/gnunet-service-core.c:1006 +#: src/core/gnunet-service-core.c:1009 #, fuzzy, c-format msgid "Core service of `%s' ready.\n" msgstr "Không gian tên « %s » có đánh giá %d.\n" @@ -1323,146 +1326,146 @@ msgstr "# các byte đã mã hoá" msgid "# bytes decrypted" msgstr "# các byte đã giải mã" -#: src/core/gnunet-service-core_kx.c:725 +#: src/core/gnunet-service-core_kx.c:728 #, fuzzy msgid "# PAYLOAD dropped (out of order)" msgstr "# các byte loại bỏ bởi UDP (đi ra)" -#: src/core/gnunet-service-core_kx.c:775 +#: src/core/gnunet-service-core_kx.c:778 msgid "# key exchanges initiated" msgstr "" -#: src/core/gnunet-service-core_kx.c:837 +#: src/core/gnunet-service-core_kx.c:840 msgid "# key exchanges stopped" msgstr "" -#: src/core/gnunet-service-core_kx.c:871 +#: src/core/gnunet-service-core_kx.c:874 #, fuzzy msgid "# PING messages transmitted" msgstr "# các thông báo PING được tạo" -#: src/core/gnunet-service-core_kx.c:938 +#: src/core/gnunet-service-core_kx.c:941 msgid "# old ephemeral keys ignored" msgstr "" -#: src/core/gnunet-service-core_kx.c:945 +#: src/core/gnunet-service-core_kx.c:948 #, fuzzy msgid "# ephemeral keys received" msgstr "# các thông báo phát hiện dht được nhận" -#: src/core/gnunet-service-core_kx.c:984 +#: src/core/gnunet-service-core_kx.c:987 #, 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 "" -#: src/core/gnunet-service-core_kx.c:995 +#: src/core/gnunet-service-core_kx.c:998 #, fuzzy msgid "# EPHEMERAL_KEY messages received" msgstr "# các thông báo được chắp liền" -#: src/core/gnunet-service-core_kx.c:1091 -#: src/transport/gnunet-service-transport_validation.c:1119 +#: src/core/gnunet-service-core_kx.c:1094 +#: src/transport/gnunet-service-transport_validation.c:1128 #, fuzzy msgid "# PING messages received" msgstr "# các thông báo PING được tạo" -#: src/core/gnunet-service-core_kx.c:1100 +#: src/core/gnunet-service-core_kx.c:1103 #, fuzzy msgid "# PING messages dropped (out of order)" msgstr "# các yêu cầu lỗ hổng bị bỏ do trọng tải" -#: src/core/gnunet-service-core_kx.c:1158 +#: src/core/gnunet-service-core_kx.c:1161 #, fuzzy msgid "# PONG messages created" msgstr "# các thông báo PING được tạo" -#: src/core/gnunet-service-core_kx.c:1184 +#: src/core/gnunet-service-core_kx.c:1187 #, fuzzy msgid "# sessions terminated by timeout" msgstr "# các byte loại đi bởi TCP (đi ra)" -#: src/core/gnunet-service-core_kx.c:1197 +#: src/core/gnunet-service-core_kx.c:1200 #, fuzzy msgid "# keepalive messages sent" msgstr "# các thông báo PING nhập thô được gửi" -#: src/core/gnunet-service-core_kx.c:1261 -#: src/transport/gnunet-service-transport_validation.c:1442 +#: src/core/gnunet-service-core_kx.c:1264 +#: src/transport/gnunet-service-transport_validation.c:1461 #, fuzzy msgid "# PONG messages received" msgstr "# các thông báo PONG đã mật mã được nhận" -#: src/core/gnunet-service-core_kx.c:1268 +#: src/core/gnunet-service-core_kx.c:1271 #, fuzzy msgid "# PONG messages dropped (connection down)" msgstr "# các thông báo PONG đã mật mã được nhận" -#: src/core/gnunet-service-core_kx.c:1273 +#: src/core/gnunet-service-core_kx.c:1276 #, fuzzy msgid "# PONG messages dropped (out of order)" msgstr "# các yêu cầu lỗ hổng bị bỏ do trọng tải" -#: src/core/gnunet-service-core_kx.c:1308 +#: src/core/gnunet-service-core_kx.c:1311 #, fuzzy msgid "# PONG messages decrypted" msgstr "# các thông báo PING được tạo" -#: src/core/gnunet-service-core_kx.c:1346 +#: src/core/gnunet-service-core_kx.c:1349 #, fuzzy msgid "# session keys confirmed via PONG" msgstr "# Các quảng cáo đồng đẳng được xác nhận qua PONG" -#: src/core/gnunet-service-core_kx.c:1357 +#: src/core/gnunet-service-core_kx.c:1360 #, fuzzy msgid "# timeouts prevented via PONG" msgstr "# các byte đã nhận qua TCP" -#: src/core/gnunet-service-core_kx.c:1364 +#: src/core/gnunet-service-core_kx.c:1367 #, fuzzy msgid "# rekey operations confirmed via PONG" msgstr "# Các quảng cáo đồng đẳng được xác nhận qua PONG" -#: src/core/gnunet-service-core_kx.c:1518 +#: src/core/gnunet-service-core_kx.c:1521 #, fuzzy msgid "# DATA message dropped (out of order)" msgstr "# các byte loại bỏ bởi UDP (đi ra)" -#: src/core/gnunet-service-core_kx.c:1526 +#: src/core/gnunet-service-core_kx.c:1529 #, c-format msgid "" "Session to peer `%s' went down due to key expiration (should not happen)\n" msgstr "" -#: src/core/gnunet-service-core_kx.c:1529 +#: src/core/gnunet-service-core_kx.c:1532 #, fuzzy msgid "# sessions terminated by key expiration" msgstr "# các byte loại đi bởi TCP (đi ra)" -#: src/core/gnunet-service-core_kx.c:1590 -#: src/core/gnunet-service-core_kx.c:1616 +#: src/core/gnunet-service-core_kx.c:1593 +#: src/core/gnunet-service-core_kx.c:1619 #, fuzzy msgid "# bytes dropped (duplicates)" msgstr "# các byte loại bỏ bởi UDP (đi ra)" -#: src/core/gnunet-service-core_kx.c:1603 +#: src/core/gnunet-service-core_kx.c:1606 #, fuzzy msgid "# bytes dropped (out of sequence)" msgstr "# các byte loại bỏ bởi UDP (đi ra)" -#: src/core/gnunet-service-core_kx.c:1645 +#: src/core/gnunet-service-core_kx.c:1648 #, fuzzy msgid "# bytes dropped (ancient message)" msgstr "# các byte loại bỏ bởi UDP (đi ra)" -#: src/core/gnunet-service-core_kx.c:1653 +#: src/core/gnunet-service-core_kx.c:1656 #, fuzzy msgid "# bytes of payload decrypted" msgstr "# các byte đã giải mã" -#: src/core/gnunet-service-core_sessions.c:266 -#: src/core/gnunet-service-core_sessions.c:356 +#: src/core/gnunet-service-core_sessions.c:260 +#: src/core/gnunet-service-core_sessions.c:350 #: src/dht/gnunet-service-dht_neighbours.c:733 #: src/dht/gnunet-service-dht_neighbours.c:795 #: src/fs/gnunet-service-fs_cp.c:615 src/fs/gnunet-service-fs_cp.c:1520 @@ -1474,17 +1477,17 @@ msgstr "# các byte đã giải mã" msgid "# peers connected" msgstr "# của các đồng đẳng đã kết nối" -#: src/core/gnunet-service-core_sessions.c:302 +#: src/core/gnunet-service-core_sessions.c:296 #, fuzzy msgid "# type map refreshes sent" msgstr "# tổng số yêu cầu lỗ hổng được gửi" -#: src/core/gnunet-service-core_sessions.c:422 +#: src/core/gnunet-service-core_sessions.c:416 #, fuzzy msgid "# outdated typemap confirmations received" msgstr "Lỗi lưu cấu hình." -#: src/core/gnunet-service-core_sessions.c:439 +#: src/core/gnunet-service-core_sessions.c:433 #, fuzzy msgid "# valid typemap confirmations received" msgstr "Lỗi lưu cấu hình." @@ -1500,7 +1503,7 @@ msgid "# updates to my type map" msgstr "" #: src/datacache/datacache.c:119 src/datacache/datacache.c:294 -#: src/datastore/gnunet-service-datastore.c:775 +#: src/datastore/gnunet-service-datastore.c:757 #, fuzzy msgid "# bytes stored" msgstr "# các byte trong kho dữ liệu" @@ -1546,13 +1549,11 @@ msgstr "kho dữ liệu sqlite" #: src/datacache/plugin_datacache_sqlite.c:113 #: src/datacache/plugin_datacache_sqlite.c:122 -#: src/datastore/plugin_datastore_mysql.c:980 +#: src/datastore/plugin_datastore_mysql.c:892 #: src/datastore/plugin_datastore_sqlite.c:58 #: src/datastore/plugin_datastore_sqlite.c:66 src/my/my.c:80 src/my/my.c:92 #: src/mysql/mysql.c:42 src/mysql/mysql.c:49 -#: src/namecache/plugin_namecache_postgres.c:53 #: src/namecache/plugin_namecache_sqlite.c:53 -#: src/namestore/plugin_namestore_postgres.c:53 #: src/namestore/plugin_namestore_sqlite.c:53 #: src/peerstore/plugin_peerstore_sqlite.c:52 #: src/psycstore/plugin_psycstore_mysql.c:62 @@ -1561,14 +1562,14 @@ msgstr "kho dữ liệu sqlite" #: src/testbed/gnunet-daemon-testbed-underlay.c:56 #: src/testbed/testbed_api_hosts.c:69 src/util/crypto_ecc.c:52 #: src/util/crypto_ecc_setup.c:41 src/util/crypto_mpi.c:39 -#: src/include/gnunet_common.h:720 src/include/gnunet_common.h:729 +#: src/include/gnunet_common.h:735 src/include/gnunet_common.h:744 #: src/scalarproduct/scalarproduct.h:35 #, c-format msgid "`%s' failed at %s:%d with error: %s\n" msgstr "« %s » bị lỗi tại %s:%d với lỗi: %s\n" #: src/datacache/plugin_datacache_sqlite.c:817 -#: src/datastore/plugin_datastore_sqlite.c:475 +#: src/datastore/plugin_datastore_sqlite.c:456 #: src/namecache/plugin_namecache_sqlite.c:296 #: src/namestore/plugin_namestore_sqlite.c:355 msgid "Tried to close sqlite without finalizing all prepared statements.\n" @@ -1593,7 +1594,7 @@ msgstr "" msgid "# queue entries created" msgstr "# các truy vấn lỗ hổng được định tuyến" -#: src/datastore/datastore_api.c:740 +#: src/datastore/datastore_api.c:760 #, fuzzy msgid "# status messages received" msgstr "# các thông báo phát hiện dht được nhận" @@ -1603,60 +1604,114 @@ msgstr "# các thông báo phát hiện dht được nhận" msgid "# Results received" msgstr "# các kết quả dht được nhận" -#: src/datastore/datastore_api.c:941 +#: src/datastore/datastore_api.c:920 #, fuzzy msgid "# datastore connections (re)created" msgstr "# các kết nối dht" -#: src/datastore/datastore_api.c:1055 +#: src/datastore/datastore_api.c:1034 #, fuzzy msgid "# PUT requests executed" msgstr "# các yêu cầu dht được định tuyến" -#: src/datastore/datastore_api.c:1116 +#: src/datastore/datastore_api.c:1095 #, fuzzy msgid "# RESERVE requests executed" msgstr "# các yêu cầu dht được định tuyến" -#: src/datastore/datastore_api.c:1181 +#: src/datastore/datastore_api.c:1160 msgid "# RELEASE RESERVE requests executed" msgstr "" -#: src/datastore/datastore_api.c:1259 +#: src/datastore/datastore_api.c:1238 #, fuzzy msgid "# REMOVE requests executed" msgstr "# các yêu cầu dht được định tuyến" -#: src/datastore/datastore_api.c:1319 +#: src/datastore/datastore_api.c:1298 msgid "# GET REPLICATION requests executed" msgstr "" -#: src/datastore/datastore_api.c:1381 +#: src/datastore/datastore_api.c:1360 msgid "# GET ZERO ANONYMITY requests executed" msgstr "" -#: src/datastore/datastore_api.c:1462 +#: src/datastore/datastore_api.c:1441 #, fuzzy msgid "# GET requests executed" msgstr "# các yêu cầu dht được định tuyến" -#: src/datastore/gnunet-datastore.c:113 +#: src/datastore/gnunet-datastore.c:189 +#, c-format +msgid "Dumped %<PRIu64> records\n" +msgstr "" + +#: src/datastore/gnunet-datastore.c:217 src/datastore/gnunet-datastore.c:229 +#, c-format +msgid "Short write to file: %zd bytes expecting %zd\n" +msgstr "" + +#: src/datastore/gnunet-datastore.c:261 +#, fuzzy +msgid "Error queueing datastore GET operation\n" +msgstr "Gặp lỗi khi tạo người dùng" + +#: src/datastore/gnunet-datastore.c:287 src/datastore/gnunet-datastore.c:412 +#, fuzzy, c-format +msgid "Unable to open dump file: %s\n" +msgstr "Không thể tạo miền tên.\n" + +#: src/datastore/gnunet-datastore.c:326 #, fuzzy, c-format msgid "Failed to store item: %s, aborting\n" msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n" -#: src/datastore/gnunet-datastore.c:209 +#: src/datastore/gnunet-datastore.c:340 #, c-format -msgid "Cannot use the same configuration for source and destination\n" +msgid "Inserted %<PRIu64> records\n" msgstr "" -#: src/datastore/gnunet-datastore.c:256 -msgid "" -"specifies the configuration to use to access an alternative datastore; will " -"merge that datastore into our current datastore" +#: src/datastore/gnunet-datastore.c:349 src/datastore/gnunet-datastore.c:363 +#, c-format +msgid "Short read from file: %zd bytes expecting %zd\n" +msgstr "" + +#: src/datastore/gnunet-datastore.c:389 +#, fuzzy +msgid "Error queueing datastore PUT operation\n" +msgstr "Gặp lỗi khi tạo người dùng" + +#: src/datastore/gnunet-datastore.c:432 +msgid "Input file is not of a supported format\n" +msgstr "" + +#: src/datastore/gnunet-datastore.c:458 +#, fuzzy +msgid "Failed connecting to the datastore.\n" +msgstr "Không kết nối được đến trình nền gnunetd." + +#: src/datastore/gnunet-datastore.c:470 +#, c-format +msgid "Please choose at least one operation: %s, %s\n" +msgstr "" + +#: src/datastore/gnunet-datastore.c:493 +#, fuzzy +msgid "Dump all records from the datastore" +msgstr "" +"\n" +"Không nhận được đáp ứng từ gnunetd.\n" + +#: src/datastore/gnunet-datastore.c:497 +#, fuzzy +msgid "Insert records into the datastore" +msgstr "# các byte trong kho dữ liệu" + +#: src/datastore/gnunet-datastore.c:502 +msgid "File to dump or insert" msgstr "" -#: src/datastore/gnunet-datastore.c:265 +#: src/datastore/gnunet-datastore.c:511 #, fuzzy msgid "Manipulate GNUnet datastore" msgstr "cập nhật một giá trị trong tập tin cấu hình" @@ -1700,8 +1755,8 @@ msgstr "" #: src/datastore/gnunet-service-datastore.c:634 #: src/datastore/gnunet-service-datastore.c:689 -#: src/datastore/gnunet-service-datastore.c:977 -#: src/datastore/gnunet-service-datastore.c:1633 +#: src/datastore/gnunet-service-datastore.c:837 +#: src/datastore/gnunet-service-datastore.c:1469 msgid "# reserved" msgstr "" @@ -1709,152 +1764,153 @@ msgstr "" msgid "Could not find matching reservation" msgstr "" -#: src/datastore/gnunet-service-datastore.c:792 +#: src/datastore/gnunet-service-datastore.c:773 #, c-format msgid "Need %llu bytes more space (%llu allowed, using %llu)\n" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1026 +#: src/datastore/gnunet-service-datastore.c:876 #, fuzzy msgid "# GET requests received" msgstr "# các yêu cầu get (lấy) dht được nhận" -#: src/datastore/gnunet-service-datastore.c:1058 +#: src/datastore/gnunet-service-datastore.c:907 #, fuzzy msgid "# GET KEY requests received" msgstr "# các yêu cầu get (lấy) dht được nhận" -#: src/datastore/gnunet-service-datastore.c:1071 +#: src/datastore/gnunet-service-datastore.c:920 #, fuzzy msgid "# requests filtered by bloomfilter" msgstr "# các yêu cầu được lọc theo bộ lọc bloom" -#: src/datastore/gnunet-service-datastore.c:1108 +#: src/datastore/gnunet-service-datastore.c:956 #, fuzzy msgid "# GET REPLICATION requests received" msgstr "# các yêu cầu get (lấy) dht được nhận" -#: src/datastore/gnunet-service-datastore.c:1141 +#: src/datastore/gnunet-service-datastore.c:989 #, fuzzy msgid "# GET ZERO ANONYMITY requests received" msgstr "# các yêu cầu get (lấy) dht được nhận" -#: src/datastore/gnunet-service-datastore.c:1190 +#: src/datastore/gnunet-service-datastore.c:1036 msgid "Content not found" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1199 +#: src/datastore/gnunet-service-datastore.c:1043 msgid "# bytes removed (explicit request)" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1246 +#: src/datastore/gnunet-service-datastore.c:1088 #, fuzzy msgid "# REMOVE requests received" msgstr "# các yêu cầu get (lấy) dht được nhận" -#: src/datastore/gnunet-service-datastore.c:1301 +#: src/datastore/gnunet-service-datastore.c:1137 #, c-format msgid "" "Datastore payload must have been inaccurate (%lld < %lld). Recomputing it.\n" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1307 -#: src/datastore/gnunet-service-datastore.c:1482 +#: src/datastore/gnunet-service-datastore.c:1143 +#: src/datastore/gnunet-service-datastore.c:1318 #, c-format msgid "New payload: %lld\n" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1361 +#: src/datastore/gnunet-service-datastore.c:1197 #, c-format msgid "Loading `%s' datastore plugin\n" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1373 +#: src/datastore/gnunet-service-datastore.c:1209 #, fuzzy, c-format msgid "Failed to load datastore plugin for `%s'\n" msgstr "Không thể nạp phần bổ sung truyền tải « %s »\n" -#: src/datastore/gnunet-service-datastore.c:1433 +#: src/datastore/gnunet-service-datastore.c:1269 msgid "Bloomfilter construction complete.\n" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1489 +#: src/datastore/gnunet-service-datastore.c:1325 msgid "Rebuilding bloomfilter. Please be patient.\n" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1500 +#: src/datastore/gnunet-service-datastore.c:1336 msgid "Plugin does not support get_keys function. Please fix!\n" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1670 +#: src/datastore/gnunet-service-datastore.c:1506 #, fuzzy, c-format msgid "# bytes used in file-sharing datastore `%s'" msgstr "# các byte được phép trong kho dữ liệu" -#: src/datastore/gnunet-service-datastore.c:1686 +#: src/datastore/gnunet-service-datastore.c:1522 msgid "# quota" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1691 +#: src/datastore/gnunet-service-datastore.c:1527 msgid "# cache size" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1707 +#: src/datastore/gnunet-service-datastore.c:1543 #, c-format msgid "Could not use specified filename `%s' for bloomfilter.\n" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1725 -#: src/datastore/gnunet-service-datastore.c:1741 +#: src/datastore/gnunet-service-datastore.c:1561 +#: src/datastore/gnunet-service-datastore.c:1577 #, fuzzy, c-format msgid "Failed to remove bogus bloomfilter file `%s'\n" msgstr "Không thể lưu tập tin cấu hình « %s »:" -#: src/datastore/gnunet-service-datastore.c:1773 +#: src/datastore/gnunet-service-datastore.c:1609 #, fuzzy msgid "Failed to initialize bloomfilter.\n" msgstr "Lỗi sơ khởi dịch vụ « %s ».\n" -#: src/datastore/plugin_datastore_heap.c:769 +#: src/datastore/plugin_datastore_heap.c:893 #, fuzzy msgid "Heap database running\n" msgstr "kho dữ liệu sqlite" -#: src/datastore/plugin_datastore_mysql.c:377 -#: src/datastore/plugin_datastore_sqlite.c:590 +#: src/datastore/plugin_datastore_mysql.c:371 +#: src/datastore/plugin_datastore_mysql.c:423 +#: src/datastore/plugin_datastore_mysql.c:1075 +msgid "MySQL statement run failure" +msgstr "" + +#: src/datastore/plugin_datastore_mysql.c:410 +#: src/datastore/plugin_datastore_sqlite.c:626 #, fuzzy msgid "Data too large" msgstr "số lần lặp lại" -#: src/datastore/plugin_datastore_mysql.c:393 -msgid "MySQL statement run failure" -msgstr "" - -#: src/datastore/plugin_datastore_mysql.c:936 +#: src/datastore/plugin_datastore_mysql.c:848 #, fuzzy, c-format msgid "`%s' for `%s' failed at %s:%d with error: %s\n" msgstr "« %s » bị lỗi tại %s:%d với lỗi: %s\n" -#: src/datastore/plugin_datastore_mysql.c:1208 +#: src/datastore/plugin_datastore_mysql.c:1180 #: src/psycstore/plugin_psycstore_mysql.c:1936 msgid "Mysql database running\n" msgstr "" -#: src/datastore/plugin_datastore_postgres.c:345 +#: src/datastore/plugin_datastore_postgres.c:274 +#: src/datastore/plugin_datastore_postgres.c:891 msgid "Postgress exec failure" msgstr "" -#: src/datastore/plugin_datastore_postgres.c:866 +#: src/datastore/plugin_datastore_postgres.c:852 #, 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:903 -#: src/namecache/plugin_namecache_postgres.c:398 -#: src/namestore/plugin_namestore_postgres.c:571 -#: src/psycstore/plugin_psycstore_postgres.c:1721 +#: src/datastore/plugin_datastore_postgres.c:950 +#: src/psycstore/plugin_psycstore_postgres.c:1506 msgid "Postgres database running\n" msgstr "" @@ -1866,7 +1922,7 @@ msgstr "" msgid "`%s' failed at %s:%u with error: %s" msgstr "« %s » bị lỗi tại %s:%d với lỗi: %s" -#: src/datastore/plugin_datastore_sqlite.c:281 +#: src/datastore/plugin_datastore_sqlite.c:271 #: src/namecache/plugin_namecache_sqlite.c:194 #: src/namestore/plugin_namestore_sqlite.c:222 #: src/peerstore/plugin_peerstore_sqlite.c:535 @@ -1875,25 +1931,29 @@ msgstr "« %s » bị lỗi tại %s:%d với lỗi: %s" msgid "Unable to initialize SQLite: %s.\n" msgstr "Không thể sơ khởi SQLite: %s.\n" -#: src/datastore/plugin_datastore_sqlite.c:1234 +#: src/datastore/plugin_datastore_sqlite.c:577 +msgid "sqlite bind failure" +msgstr "" + +#: src/datastore/plugin_datastore_sqlite.c:1259 msgid "sqlite version to old to determine size, assuming zero\n" msgstr "" -#: src/datastore/plugin_datastore_sqlite.c:1268 +#: src/datastore/plugin_datastore_sqlite.c:1293 #, c-format msgid "" "Using sqlite page utilization to estimate payload (%llu pages of size %llu " "bytes)\n" msgstr "" -#: src/datastore/plugin_datastore_sqlite.c:1312 +#: src/datastore/plugin_datastore_sqlite.c:1337 #: src/namecache/plugin_namecache_sqlite.c:603 #: src/namestore/plugin_namestore_sqlite.c:802 #, fuzzy msgid "Sqlite database running\n" msgstr "kho dữ liệu sqlite" -#: src/datastore/plugin_datastore_template.c:259 +#: src/datastore/plugin_datastore_template.c:253 msgid "Template database running\n" msgstr "" @@ -1955,8 +2015,7 @@ msgstr "" msgid "Prints all packets that go through the DHT." msgstr "" -#: src/dht/gnunet_dht_profiler.c:1161 -#: src/testbed/gnunet-testbed-profiler.c:255 +#: src/dht/gnunet_dht_profiler.c:1161 src/testbed/gnunet-testbed-profiler.c:253 #, 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" @@ -1973,7 +2032,7 @@ msgid "" msgstr "" #: src/dht/gnunet_dht_profiler.c:1200 src/nse/gnunet-nse-profiler.c:853 -#: src/testbed/gnunet-testbed-profiler.c:305 +#: src/testbed/gnunet-testbed-profiler.c:304 msgid "name of the file with the login information for the testbed" msgstr "" @@ -2612,7 +2671,7 @@ msgstr "" msgid "No useful service enabled. Exiting.\n" msgstr "" -#: src/exit/gnunet-daemon-exit.c:3969 +#: src/exit/gnunet-daemon-exit.c:3970 msgid "Daemon to run to provide an IP exit node for the VPN" msgstr "" @@ -2829,7 +2888,7 @@ msgstr "" msgid "Failed to not connect to `%s' service.\n" msgstr "Lỗi sơ khởi dịch vụ « %s ».\n" -#: src/fs/fs_misc.c:126 +#: src/fs/fs_misc.c:128 #, c-format msgid "Did not find mime type `%s' in extension list.\n" msgstr "" @@ -4075,7 +4134,7 @@ msgstr "" msgid "Failed to connect to identity service\n" msgstr "Lỗi kết nối đến gnunetd.\n" -#: src/gns/gnunet-gns-import.c:489 +#: src/gns/gnunet-gns-import.c:452 msgid "This program will import some GNS authorities into your GNS namestore." msgstr "" @@ -4094,109 +4153,109 @@ msgstr "" msgid "%s failed at %s:%d: `%s'\n" msgstr "%s bị lỗi tại %s:%d: « %s »\n" -#: src/gns/gnunet-gns-proxy.c:878 +#: src/gns/gnunet-gns-proxy.c:887 #, fuzzy, c-format msgid "Unsupported CURL SSL backend %d\n" msgstr "Lệnh không được hỗ trợ « %s ». Đang hủy bỏ.\n" -#: src/gns/gnunet-gns-proxy.c:901 +#: src/gns/gnunet-gns-proxy.c:910 #, fuzzy, c-format msgid "Failed to fetch CN from cert: %s\n" msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n" -#: src/gns/gnunet-gns-proxy.c:924 +#: src/gns/gnunet-gns-proxy.c:933 #, fuzzy, c-format msgid "Failed to initialize DANE: %s\n" msgstr "Không thể sơ khởi SQLite: %s.\n" -#: src/gns/gnunet-gns-proxy.c:937 +#: src/gns/gnunet-gns-proxy.c:946 #, fuzzy, c-format msgid "Failed to parse DANE record: %s\n" msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n" -#: src/gns/gnunet-gns-proxy.c:952 +#: src/gns/gnunet-gns-proxy.c:961 #, fuzzy, c-format msgid "Failed to verify TLS connection using DANE: %s\n" msgstr "Không thể lưu tập tin cấu hình « %s »:" -#: src/gns/gnunet-gns-proxy.c:962 +#: src/gns/gnunet-gns-proxy.c:971 #, c-format msgid "Failed DANE verification failed with GnuTLS verify status code: %u\n" msgstr "" -#: src/gns/gnunet-gns-proxy.c:986 +#: src/gns/gnunet-gns-proxy.c:995 #, c-format msgid "SSL certificate subject name (%s) does not match `%s'\n" msgstr "" -#: src/gns/gnunet-gns-proxy.c:1095 +#: src/gns/gnunet-gns-proxy.c:1104 #, c-format msgid "Cookie domain `%s' supplied by server is invalid\n" msgstr "" -#: src/gns/gnunet-gns-proxy.c:1699 +#: src/gns/gnunet-gns-proxy.c:1709 #, fuzzy, c-format msgid "Unsupported HTTP method `%s'\n" msgstr "Lệnh không được hỗ trợ « %s ». Đang hủy bỏ.\n" -#: src/gns/gnunet-gns-proxy.c:2162 +#: src/gns/gnunet-gns-proxy.c:2172 #, fuzzy, c-format msgid "Unable to import private key from file `%s'\n" msgstr "Không thể tạo tài khoản người dùng:" -#: src/gns/gnunet-gns-proxy.c:2192 +#: src/gns/gnunet-gns-proxy.c:2202 #, fuzzy, c-format msgid "Unable to import certificate %s\n" msgstr "Không thể lưu tập tin cấu hình « %s »:" -#: src/gns/gnunet-gns-proxy.c:2365 +#: src/gns/gnunet-gns-proxy.c:2375 #, fuzzy, c-format msgid "Failed to start HTTPS server for `%s'\n" msgstr "Lỗi bắt đầu thu thập.\n" -#: src/gns/gnunet-gns-proxy.c:2384 src/rest/gnunet-rest-server.c:533 +#: src/gns/gnunet-gns-proxy.c:2394 src/rest/gnunet-rest-server.c:533 #, fuzzy msgid "Failed to pass client to MHD\n" msgstr "Lỗi kết nối đến gnunetd.\n" -#: src/gns/gnunet-gns-proxy.c:2704 +#: src/gns/gnunet-gns-proxy.c:2716 #, fuzzy, c-format msgid "Unsupported socks version %d\n" msgstr "Lệnh không được hỗ trợ « %s ». Đang hủy bỏ.\n" -#: src/gns/gnunet-gns-proxy.c:2733 +#: src/gns/gnunet-gns-proxy.c:2745 #, fuzzy, c-format msgid "Unsupported socks command %d\n" msgstr "Lệnh không được hỗ trợ « %s ». Đang hủy bỏ.\n" -#: src/gns/gnunet-gns-proxy.c:2751 src/gns/gnunet-gns-proxy.c:2780 +#: src/gns/gnunet-gns-proxy.c:2763 src/gns/gnunet-gns-proxy.c:2792 msgid "SSL connection to plain IPv4 address requested\n" msgstr "" -#: src/gns/gnunet-gns-proxy.c:2830 +#: src/gns/gnunet-gns-proxy.c:2842 #, fuzzy, c-format msgid "Unsupported socks address type %d\n" msgstr "Lệnh không được hỗ trợ « %s ». Đang hủy bỏ.\n" -#: src/gns/gnunet-gns-proxy.c:3165 src/gns/gnunet-service-gns.c:403 +#: src/gns/gnunet-gns-proxy.c:3177 src/gns/gnunet-service-gns.c:403 #, c-format msgid "No ego configured for `%s`\n" msgstr "" -#: src/gns/gnunet-gns-proxy.c:3226 +#: src/gns/gnunet-gns-proxy.c:3238 #, fuzzy, c-format msgid "Failed to load SSL/TLS key and certificate from `%s'\n" msgstr "Lỗi đọc danh sách bạn bè từ « %s »\n" -#: src/gns/gnunet-gns-proxy.c:3269 +#: src/gns/gnunet-gns-proxy.c:3281 msgid "listen on specified port (default: 7777)" msgstr "" -#: src/gns/gnunet-gns-proxy.c:3275 +#: src/gns/gnunet-gns-proxy.c:3287 msgid "pem file to use as CA" msgstr "" -#: src/gns/gnunet-gns-proxy.c:3300 +#: src/gns/gnunet-gns-proxy.c:3312 msgid "GNUnet GNS proxy" msgstr "" @@ -4206,7 +4265,7 @@ 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:461 -#: src/zonemaster/gnunet-service-zonemaster.c:741 +#: src/zonemaster/gnunet-service-zonemaster.c:742 #, fuzzy msgid "Could not connect to DHT!\n" msgstr "Không thể kết nối tới %s:%u: %s\n" @@ -4409,37 +4468,37 @@ msgstr "Gặp lỗi khi tạo người dùng" msgid "Modified %u addresses, wrote %u bytes\n" msgstr "" -#: src/hello/hello.c:1103 +#: src/hello/hello.c:1110 #, fuzzy msgid "Failed to parse HELLO message: missing expiration time\n" msgstr "Lỗi lưu cấu hình." -#: src/hello/hello.c:1112 +#: src/hello/hello.c:1119 #, fuzzy msgid "Failed to parse HELLO message: invalid expiration time\n" msgstr "Lỗi lưu cấu hình." -#: src/hello/hello.c:1122 +#: src/hello/hello.c:1129 #, fuzzy msgid "Failed to parse HELLO message: malformed\n" msgstr "Lỗi đọc danh sách bạn bè từ « %s »\n" -#: src/hello/hello.c:1133 +#: src/hello/hello.c:1140 #, fuzzy msgid "Failed to parse HELLO message: missing transport plugin\n" msgstr "Không thể nạp phần bổ sung truyền tải « %s »\n" -#: src/hello/hello.c:1151 +#: src/hello/hello.c:1158 #, c-format msgid "Plugin `%s' not found, skipping address\n" msgstr "" -#: src/hello/hello.c:1159 +#: src/hello/hello.c:1166 #, c-format msgid "Plugin `%s' does not support URIs yet\n" msgstr "" -#: src/hello/hello.c:1174 +#: src/hello/hello.c:1181 #, fuzzy, c-format msgid "Failed to parse `%s' as an address for plugin `%s'\n" msgstr "Lỗi đóng kết đến cổng %s %d.\n" @@ -4701,7 +4760,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:679 -#: src/transport/gnunet-service-transport.c:2803 +#: src/transport/gnunet-service-transport.c:2815 #, 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" @@ -4962,12 +5021,6 @@ msgstr "Không thể tạo miền tên.\n" msgid "flat plugin running\n" msgstr "kho dữ liệu sqlite" -#: src/namecache/plugin_namecache_postgres.c:90 -#: src/namestore/plugin_namestore_postgres.c:97 -#, fuzzy -msgid "Failed to create indices\n" -msgstr "Không thể tạo miền tên.\n" - #: src/namestore/gnunet-namestore.c:301 #, fuzzy, c-format msgid "Adding record failed: %s\n" @@ -5066,8 +5119,7 @@ msgstr "" msgid "Invalid public key for reverse lookup `%s'\n" msgstr "Đối số không hợp lệ cho « %s ».\n" -#: src/namestore/gnunet-namestore.c:979 -#: src/peerinfo-tool/gnunet-peerinfo.c:775 +#: src/namestore/gnunet-namestore.c:979 src/peerinfo-tool/gnunet-peerinfo.c:775 #, fuzzy, c-format msgid "Invalid URI `%s'\n" msgstr "Dữ liệu nhập không hợp lệ.\n" @@ -5207,7 +5259,7 @@ msgstr "Lỗi kết nối đến gnunetd.\n" msgid "GNU Name System First Come First Serve name registration service" msgstr "" -#: src/namestore/gnunet-service-namestore.c:612 +#: src/namestore/gnunet-service-namestore.c:615 #, fuzzy, c-format msgid "Failed to replicate block in namecache: %s\n" msgstr "Lỗi cập nhật dữ liệu cho mô-đun « %s »\n" @@ -5540,7 +5592,7 @@ msgid "Measure quality and performance of the NSE service." msgstr "Không thể truy cập đến dịch vụ" #: src/nse/gnunet-service-nse.c:1534 -#: src/revocation/gnunet-service-revocation.c:838 src/util/gnunet-scrypt.c:276 +#: src/revocation/gnunet-service-revocation.c:840 src/util/gnunet-scrypt.c:276 #, fuzzy msgid "Value is too large.\n" msgstr "Giá trị không nằm trong phạm vi được phép." @@ -5583,17 +5635,17 @@ msgstr "Lỗi đọc danh sách bạn bè từ « %s »\n" 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:1076 +#: src/peerinfo/gnunet-service-peerinfo.c:1080 #, 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:1405 +#: src/peerinfo/gnunet-service-peerinfo.c:1409 #, c-format msgid "Importing HELLOs from `%s'\n" msgstr "" -#: src/peerinfo/gnunet-service-peerinfo.c:1418 +#: src/peerinfo/gnunet-service-peerinfo.c:1422 msgid "Skipping import of included HELLOs\n" msgstr "" @@ -5744,15 +5796,10 @@ msgstr "Gặp lỗi khi tạo người dùng" msgid "Unable to create indices: %s.\n" msgstr "Không thể tạo miền tên.\n" -#: src/postgres/postgres.c:67 -#, fuzzy, c-format -msgid "`%s:%s' failed at %s:%d with error: %s\n" -msgstr "« %s » bị lỗi tại %s:%d với lỗi: %s" - -#: src/postgres/postgres.c:192 +#: src/pq/pq_prepare.c:80 #, fuzzy, c-format -msgid "Unable to connect to Postgres database '%s': %s\n" -msgstr "Không thể lưu tập tin cấu hình « %s »:" +msgid "PQprepare (`%s' as `%s') failed with error: %s\n" +msgstr "« %s » bị lỗi tại %s:%d với lỗi: %s\n" #: src/psycstore/gnunet-service-psycstore.c:249 #, fuzzy @@ -5932,61 +5979,61 @@ msgstr "Lưu cấu hình ngay bây giờ không?" msgid "Daemon to announce regular expressions for the peer using cadet." msgstr "" -#: src/regex/gnunet-regex-profiler.c:1314 +#: src/regex/gnunet-regex-profiler.c:1386 #, fuzzy msgid "No configuration file given. Exiting\n" msgstr "dùng tập tin cấu hình TÊN_TẬP_TIN" -#: src/regex/gnunet-regex-profiler.c:1355 +#: src/regex/gnunet-regex-profiler.c:1427 #: src/regex/gnunet-regex-simulation-profiler.c:630 #, c-format msgid "No policy directory specified on command line. Exiting.\n" msgstr "" -#: src/regex/gnunet-regex-profiler.c:1361 +#: src/regex/gnunet-regex-profiler.c:1433 #: src/regex/gnunet-regex-simulation-profiler.c:638 #, c-format msgid "Specified policies directory does not exist. Exiting.\n" msgstr "" -#: src/regex/gnunet-regex-profiler.c:1368 +#: src/regex/gnunet-regex-profiler.c:1440 #, fuzzy, c-format msgid "No files found in `%s'\n" msgstr "Vẫn còn không tìm thấy đồng đẳng trong « %s ».\n" -#: src/regex/gnunet-regex-profiler.c:1377 +#: src/regex/gnunet-regex-profiler.c:1449 msgid "No search strings file given. Exiting.\n" msgstr "" -#: src/regex/gnunet-regex-profiler.c:1397 +#: src/regex/gnunet-regex-profiler.c:1469 #, fuzzy msgid "Error loading search strings. Exiting.\n" msgstr "Gặp lỗi khi tải xuống: %s\n" -#: src/regex/gnunet-regex-profiler.c:1485 +#: src/regex/gnunet-regex-profiler.c:1557 #, fuzzy msgid "name of the file for writing statistics" msgstr "Lỗi lấy thông kê về truyền tải.\n" -#: src/regex/gnunet-regex-profiler.c:1491 +#: src/regex/gnunet-regex-profiler.c:1563 msgid "wait TIMEOUT before ending the experiment" msgstr "" -#: src/regex/gnunet-regex-profiler.c:1497 +#: src/regex/gnunet-regex-profiler.c:1569 msgid "directory with policy files" msgstr "" -#: src/regex/gnunet-regex-profiler.c:1504 +#: src/regex/gnunet-regex-profiler.c:1576 #, fuzzy msgid "name of file with input strings" msgstr "Lỗi lấy thông kê về truyền tải.\n" -#: src/regex/gnunet-regex-profiler.c:1510 +#: src/regex/gnunet-regex-profiler.c:1582 #, fuzzy msgid "name of file with hosts' names" msgstr "Lỗi lấy thông kê về truyền tải.\n" -#: src/regex/gnunet-regex-profiler.c:1523 +#: src/regex/gnunet-regex-profiler.c:1595 msgid "Profiler for regex" msgstr "" @@ -6150,12 +6197,12 @@ msgstr "# các khoá phiên chạy được chấp nhận" msgid "# revocation set unions completed" msgstr "# các sự truyền PONG bị lỗi" -#: src/revocation/gnunet-service-revocation.c:524 -#: src/revocation/gnunet-service-revocation.c:771 +#: src/revocation/gnunet-service-revocation.c:525 +#: src/revocation/gnunet-service-revocation.c:773 msgid "SET service crashed, terminating revocation service\n" msgstr "" -#: src/revocation/gnunet-service-revocation.c:862 +#: src/revocation/gnunet-service-revocation.c:864 #, fuzzy msgid "Could not open revocation database file!" msgstr "« %s »: Không thể kết nối.\n" @@ -6219,9 +6266,9 @@ msgstr "" msgid "Calculate the Vectorproduct with a GNUnet peer." msgstr "" -#: src/scalarproduct/gnunet-service-scalarproduct_alice.c:1407 +#: src/scalarproduct/gnunet-service-scalarproduct_alice.c:1401 #: src/scalarproduct/gnunet-service-scalarproduct_bob.c:1345 -#: src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c:1180 +#: src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c:1172 #: src/scalarproduct/gnunet-service-scalarproduct-ecc_bob.c:1063 #, fuzzy msgid "Connect to CADET failed\n" @@ -6247,7 +6294,7 @@ msgstr "" msgid "also profile decryption" msgstr "" -#: src/set/gnunet-service-set.c:1948 +#: src/set/gnunet-service-set.c:1989 #, fuzzy msgid "Could not connect to CADET service\n" msgstr "Không thể kết nối tới %s:%u: %s\n" @@ -6307,114 +6354,114 @@ msgstr "" msgid "say good-bye and leave somebody else's place" msgstr "" -#: src/social/gnunet-social.c:1227 src/social/gnunet-social.c:1232 +#: src/social/gnunet-social.c:1227 msgid "create a place" msgstr "" -#: src/social/gnunet-social.c:1237 +#: src/social/gnunet-social.c:1232 msgid "destroy a place we were hosting" msgstr "" -#: src/social/gnunet-social.c:1242 +#: src/social/gnunet-social.c:1237 msgid "enter somebody else's place" msgstr "" -#: src/social/gnunet-social.c:1248 +#: src/social/gnunet-social.c:1243 msgid "find state matching name prefix" msgstr "" -#: src/social/gnunet-social.c:1253 +#: src/social/gnunet-social.c:1248 msgid "replay history of messages up to the given --limit" msgstr "" -#: src/social/gnunet-social.c:1258 +#: src/social/gnunet-social.c:1253 msgid "reconnect to a previously created place" msgstr "" -#: src/social/gnunet-social.c:1263 +#: src/social/gnunet-social.c:1258 msgid "publish something to a place we are hosting" msgstr "" -#: src/social/gnunet-social.c:1268 +#: src/social/gnunet-social.c:1263 msgid "reconnect to a previously entered place" msgstr "" -#: src/social/gnunet-social.c:1273 +#: src/social/gnunet-social.c:1268 msgid "search for state matching exact name" msgstr "" -#: src/social/gnunet-social.c:1278 +#: src/social/gnunet-social.c:1273 msgid "submit something to somebody's place" msgstr "" -#: src/social/gnunet-social.c:1283 +#: src/social/gnunet-social.c:1278 msgid "list of egos and subscribed places" msgstr "" -#: src/social/gnunet-social.c:1288 +#: src/social/gnunet-social.c:1283 msgid "extract and replay history between message IDs --start and --until" msgstr "" -#: src/social/gnunet-social.c:1297 +#: src/social/gnunet-social.c:1292 msgid "application ID to use when connecting" msgstr "" -#: src/social/gnunet-social.c:1303 +#: src/social/gnunet-social.c:1298 msgid "message body or state value" msgstr "" -#: src/social/gnunet-social.c:1309 +#: src/social/gnunet-social.c:1304 #, fuzzy msgid "name or public key of ego" msgstr "Đối số không hợp lệ cho « %s ».\n" -#: src/social/gnunet-social.c:1314 +#: src/social/gnunet-social.c:1309 #, fuzzy msgid "wait for incoming messages" msgstr "Lỗi gửi tin nhẳn.\n" -#: src/social/gnunet-social.c:1320 +#: src/social/gnunet-social.c:1315 msgid "GNS name" msgstr "" -#: src/social/gnunet-social.c:1326 +#: src/social/gnunet-social.c:1321 msgid "peer ID for --guest-enter" msgstr "" -#: src/social/gnunet-social.c:1332 +#: src/social/gnunet-social.c:1327 msgid "name (key) to query from state" msgstr "" -#: src/social/gnunet-social.c:1338 +#: src/social/gnunet-social.c:1333 msgid "method name" msgstr "" -#: src/social/gnunet-social.c:1344 +#: src/social/gnunet-social.c:1339 #, fuzzy msgid "number of messages to replay from history" msgstr "số tin nhắn cần dùng mỗi lần lặp" -#: src/social/gnunet-social.c:1350 +#: src/social/gnunet-social.c:1345 msgid "key address of place" msgstr "" -#: src/social/gnunet-social.c:1356 +#: src/social/gnunet-social.c:1351 msgid "start message ID for history replay" msgstr "" -#: src/social/gnunet-social.c:1361 +#: src/social/gnunet-social.c:1356 msgid "respond to entry requests by admitting all guests" msgstr "" -#: src/social/gnunet-social.c:1367 +#: src/social/gnunet-social.c:1362 msgid "end message ID for history replay" msgstr "" -#: src/social/gnunet-social.c:1372 +#: src/social/gnunet-social.c:1367 msgid "respond to entry requests by refusing all guests" msgstr "" -#: src/social/gnunet-social.c:1382 +#: src/social/gnunet-social.c:1377 msgid "" "gnunet-social - Interact with the social service: enter/leave, send/receive " "messages, access history and state.\n" @@ -6439,7 +6486,7 @@ msgstr "« %s » không giải quyết được phương pháp « %s », với l msgid "Wrote %llu bytes of statistics to `%s'\n" msgstr "Đã tải %llu byte xuống « %s ».\n" -#: src/statistics/gnunet-service-statistics.c:1084 +#: src/statistics/gnunet-service-statistics.c:1086 #, fuzzy, c-format msgid "Loading %llu bytes of statistics from `%s'\n" msgstr "Đã tải %llu byte xuống « %s ».\n" @@ -6568,7 +6615,7 @@ msgid "Invalid argument `%s'; expecting unsigned int\n" msgstr "Đối số không hợp lệ cho « %s ».\n" #: src/testbed/generate-underlay-topology.c:342 -#: src/testbed/gnunet-testbed-profiler.c:284 +#: src/testbed/gnunet-testbed-profiler.c:283 msgid "create COUNT number of peers" msgstr "" @@ -6606,13 +6653,13 @@ msgid "" "deployments" msgstr "" -#: src/testbed/gnunet-daemon-testbed-underlay.c:231 src/testing/list-keys.c:46 -#: src/testing/testing.c:288 src/util/gnunet-ecc.c:298 +#: src/testbed/gnunet-daemon-testbed-underlay.c:233 src/testing/list-keys.c:46 +#: src/testing/testing.c:288 src/util/gnunet-ecc.c:306 #, c-format msgid "Incorrect hostkey file format: %s\n" msgstr "" -#: src/testbed/gnunet-daemon-testbed-underlay.c:469 +#: src/testbed/gnunet-daemon-testbed-underlay.c:471 msgid "Daemon to restrict underlay network in testbed deployments" msgstr "" @@ -6687,11 +6734,11 @@ msgstr "Đang đợi các đồng đẳng kết nối" msgid "Spawning process `%s'\n" msgstr "Đang bắt đầu tài về « %s »\n" -#: src/testbed/gnunet-testbed-profiler.c:290 +#: src/testbed/gnunet-testbed-profiler.c:289 msgid "tolerate COUNT number of continious timeout failures" msgstr "" -#: src/testbed/gnunet-testbed-profiler.c:295 +#: src/testbed/gnunet-testbed-profiler.c:294 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 " @@ -7009,46 +7056,46 @@ msgstr "" 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:809 +#: src/transport/gnunet-service-transport.c:818 msgid "# bytes payload dropped (other peer was not connected)" msgstr "" -#: src/transport/gnunet-service-transport.c:1539 +#: src/transport/gnunet-service-transport.c:1551 #, 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:1699 +#: src/transport/gnunet-service-transport.c:1711 #, fuzzy msgid "# bytes total received" msgstr "# tổng số nội dung lỗ hổng được nhận" -#: src/transport/gnunet-service-transport.c:1796 +#: src/transport/gnunet-service-transport.c:1808 #, fuzzy msgid "# bytes payload received" msgstr "# các byte đã giải mã" -#: src/transport/gnunet-service-transport.c:2113 -#: src/transport/gnunet-service-transport.c:2585 +#: src/transport/gnunet-service-transport.c:2125 +#: src/transport/gnunet-service-transport.c:2597 msgid "# disconnects due to blacklist" msgstr "" -#: src/transport/gnunet-service-transport.c:2589 +#: src/transport/gnunet-service-transport.c:2601 #, 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:2697 +#: src/transport/gnunet-service-transport.c:2709 #, 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:2706 +#: src/transport/gnunet-service-transport.c:2718 #, c-format msgid "Adding blacklisting entry for peer `%s':`%s'\n" msgstr "" -#: src/transport/gnunet-service-transport.c:2771 +#: src/transport/gnunet-service-transport.c:2783 #, fuzzy msgid "Transport service is lacking key configuration settings. Exiting.\n" msgstr "Lưu cấu hình ngay bây giờ không?" @@ -7203,74 +7250,74 @@ msgstr "# các thông báo PING được tạo" msgid "SYN request from peer `%s' ignored due impending shutdown\n" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:2620 +#: src/transport/gnunet-service-transport_neighbours.c:2623 msgid "# Attempts to switch addresses" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:3102 +#: src/transport/gnunet-service-transport_neighbours.c:3105 #, fuzzy msgid "# SYN_ACK messages received" msgstr "# các thông báo PONG đã mật mã được nhận" -#: src/transport/gnunet-service-transport_neighbours.c:3110 +#: src/transport/gnunet-service-transport_neighbours.c:3113 #, fuzzy msgid "# unexpected SYN_ACK messages (no peer)" msgstr "gửi ĐẾM thông báo" -#: src/transport/gnunet-service-transport_neighbours.c:3128 -#: src/transport/gnunet-service-transport_neighbours.c:3152 +#: src/transport/gnunet-service-transport_neighbours.c:3131 +#: src/transport/gnunet-service-transport_neighbours.c:3155 #, fuzzy msgid "# unexpected SYN_ACK messages (not ready)" msgstr "gửi ĐẾM thông báo" -#: src/transport/gnunet-service-transport_neighbours.c:3164 +#: src/transport/gnunet-service-transport_neighbours.c:3167 #, fuzzy msgid "# unexpected SYN_ACK messages (waiting on ATS)" msgstr "gửi ĐẾM thông báo" -#: src/transport/gnunet-service-transport_neighbours.c:3189 +#: src/transport/gnunet-service-transport_neighbours.c:3192 msgid "# Successful attempts to switch addresses" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:3202 +#: src/transport/gnunet-service-transport_neighbours.c:3205 #, fuzzy msgid "# unexpected SYN_ACK messages (disconnecting)" msgstr "gửi ĐẾM thông báo" -#: src/transport/gnunet-service-transport_neighbours.c:3374 +#: src/transport/gnunet-service-transport_neighbours.c:3377 #, fuzzy msgid "# ACK messages received" msgstr "# các thông báo PONG đã mật mã được nhận" -#: src/transport/gnunet-service-transport_neighbours.c:3410 +#: src/transport/gnunet-service-transport_neighbours.c:3413 #, fuzzy msgid "# unexpected ACK messages" msgstr "# các thông báo PONG đã mật mã được gửi" -#: src/transport/gnunet-service-transport_neighbours.c:3498 +#: src/transport/gnunet-service-transport_neighbours.c:3501 #, fuzzy msgid "# quota messages ignored (malformed)" msgstr "# các yêu cầu lỗ hổng bị bỏ do trọng tải" -#: src/transport/gnunet-service-transport_neighbours.c:3505 +#: src/transport/gnunet-service-transport_neighbours.c:3508 #, fuzzy msgid "# QUOTA messages received" msgstr "# các thông báo PONG đã mật mã được nhận" -#: src/transport/gnunet-service-transport_neighbours.c:3545 +#: src/transport/gnunet-service-transport_neighbours.c:3548 msgid "# disconnect messages ignored (malformed)" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:3552 +#: src/transport/gnunet-service-transport_neighbours.c:3555 #, fuzzy msgid "# DISCONNECT messages received" msgstr "# các thông báo PONG đã mật mã được nhận" -#: src/transport/gnunet-service-transport_neighbours.c:3563 +#: src/transport/gnunet-service-transport_neighbours.c:3566 msgid "# disconnect messages ignored (timestamp)" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:3697 +#: src/transport/gnunet-service-transport_neighbours.c:3700 #, fuzzy msgid "# disconnected from peer upon explicit request" msgstr "# các yêu cầu lỗ hổng bị bỏ do trọng tải" @@ -7305,8 +7352,8 @@ msgstr "" #: src/transport/gnunet-service-transport_validation.c:491 #: src/transport/gnunet-service-transport_validation.c:677 -#: src/transport/gnunet-service-transport_validation.c:988 -#: src/transport/gnunet-service-transport_validation.c:1590 +#: src/transport/gnunet-service-transport_validation.c:997 +#: src/transport/gnunet-service-transport_validation.c:1609 #, fuzzy msgid "# validations running" msgstr "kho dữ liệu sqlite" @@ -7332,58 +7379,58 @@ msgstr "" msgid "# address revalidations started" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1114 +#: src/transport/gnunet-service-transport_validation.c:1123 #, fuzzy msgid "# PING message for different peer received" msgstr "# các thông báo PING được tạo" -#: src/transport/gnunet-service-transport_validation.c:1165 +#: src/transport/gnunet-service-transport_validation.c:1174 #, c-format msgid "Plugin `%s' not available, cannot confirm having this address\n" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1178 +#: src/transport/gnunet-service-transport_validation.c:1187 msgid "# failed address checks during validation" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1181 +#: src/transport/gnunet-service-transport_validation.c:1190 #, c-format msgid "Address `%s' is not one of my addresses, not confirming PING\n" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1189 +#: src/transport/gnunet-service-transport_validation.c:1198 msgid "# successful address checks during validation" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1202 +#: src/transport/gnunet-service-transport_validation.c:1211 #, c-format msgid "" "Not confirming PING from peer `%s' with address `%s' since I cannot confirm " "having this address.\n" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1257 +#: src/transport/gnunet-service-transport_validation.c:1266 #, fuzzy, c-format msgid "Failed to create PONG signature for peer `%s'\n" msgstr "Không thể tạo miền tên.\n" -#: src/transport/gnunet-service-transport_validation.c:1308 +#: src/transport/gnunet-service-transport_validation.c:1317 msgid "# PONGs unicast via reliable transport" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1317 +#: src/transport/gnunet-service-transport_validation.c:1326 msgid "# PONGs multicast to all available addresses" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1480 +#: src/transport/gnunet-service-transport_validation.c:1499 msgid "# PONGs dropped, no matching pending validation" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1498 +#: src/transport/gnunet-service-transport_validation.c:1517 msgid "# PONGs dropped, signature expired" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1553 +#: src/transport/gnunet-service-transport_validation.c:1572 msgid "# validations succeeded" msgstr "" @@ -7575,8 +7622,8 @@ msgid "message size to use" msgstr "kích cỡ tin nhắn" #: src/transport/plugin_transport_http_client.c:1474 -#: src/transport/plugin_transport_http_server.c:2249 -#: src/transport/plugin_transport_http_server.c:3463 +#: src/transport/plugin_transport_http_server.c:2312 +#: src/transport/plugin_transport_http_server.c:3526 #: src/transport/plugin_transport_tcp.c:3890 #: src/transport/plugin_transport_tcp.c:3897 msgid "TCP_STEALTH not supported on this platform.\n" @@ -7588,13 +7635,13 @@ msgid "Could not initialize curl multi handle, failed to start %s plugin!\n" msgstr "" #: src/transport/plugin_transport_http_client.c:2164 -#: src/transport/plugin_transport_http_server.c:3178 +#: src/transport/plugin_transport_http_server.c:3241 #, fuzzy, c-format msgid "Shutting down plugin `%s'\n" msgstr "Đang nạp các truyền tải « %s »\n" #: src/transport/plugin_transport_http_client.c:2181 -#: src/transport/plugin_transport_http_server.c:3248 +#: src/transport/plugin_transport_http_server.c:3311 #, fuzzy, c-format msgid "Shutdown for plugin `%s' complete\n" msgstr "Tải lên « %s » hoàn thành, địa chỉ URI là « %s ».\n" @@ -7604,106 +7651,106 @@ msgstr "Tải lên « %s » hoàn thành, địa chỉ URI là « %s ».\n" msgid "Maximum number of requests is %u\n" msgstr "tăng sổ tối đa các kết nối TCP/IP" -#: src/transport/plugin_transport_http_server.c:1727 +#: src/transport/plugin_transport_http_server.c:1756 #, c-format msgid "" "Access from connection %p (%u of %u) for `%s' `%s' url `%s' with upload data " "size %u\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:1967 +#: src/transport/plugin_transport_http_server.c:2028 #, c-format msgid "Accepting connection (%u of %u) from `%s'\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:1975 +#: src/transport/plugin_transport_http_server.c:2036 #, c-format msgid "" "Server reached maximum number connections (%u), rejecting new connection\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:2125 +#: src/transport/plugin_transport_http_server.c:2186 msgid "" "Could not create a new TLS certificate, program `gnunet-transport-" "certificate-creation' could not be started!\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:2148 +#: src/transport/plugin_transport_http_server.c:2209 #, c-format msgid "No usable TLS certificate found and creating one at `%s/%s' failed!\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:2275 +#: src/transport/plugin_transport_http_server.c:2338 msgid "Could not load or create server certificate! Loading plugin failed!\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:2587 +#: src/transport/plugin_transport_http_server.c:2650 #, fuzzy msgid "Require valid port number for service in configuration!\n" msgstr "Lỗi lưu cấu hình." -#: src/transport/plugin_transport_http_server.c:2752 +#: src/transport/plugin_transport_http_server.c:2815 #, c-format msgid "Found %u addresses to report to NAT service\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:2838 +#: src/transport/plugin_transport_http_server.c:2901 #: src/transport/plugin_transport_udp.c:3622 msgid "Disabling IPv6 since it is not supported on this system!\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:2944 +#: src/transport/plugin_transport_http_server.c:3007 #, c-format msgid "IPv4 support is %s\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:2959 +#: src/transport/plugin_transport_http_server.c:3022 #, c-format msgid "IPv6 support is %s\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:2965 +#: src/transport/plugin_transport_http_server.c:3028 msgid "Neither IPv4 nor IPv6 are enabled! Fix in configuration\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:2976 +#: src/transport/plugin_transport_http_server.c:3039 #, fuzzy msgid "Port is required! Fix in configuration\n" msgstr "" "\n" "Kết thúc cấu hình.\n" -#: src/transport/plugin_transport_http_server.c:2982 +#: src/transport/plugin_transport_http_server.c:3045 #, fuzzy, c-format msgid "Using port %u\n" msgstr "Đang thử nghiệm (các) truyền tải %s\n" -#: src/transport/plugin_transport_http_server.c:3001 +#: src/transport/plugin_transport_http_server.c:3064 #, fuzzy, c-format msgid "Specific IPv4 address `%s' in configuration file is invalid!\n" msgstr "Đang thử dùng tập tin « %s » cho cấu hình MySQL.\n" -#: src/transport/plugin_transport_http_server.c:3036 +#: src/transport/plugin_transport_http_server.c:3099 #, fuzzy, c-format msgid "Specific IPv6 address `%s' in configuration file is invalid!\n" msgstr "Đang thử dùng tập tin « %s » cho cấu hình MySQL.\n" -#: src/transport/plugin_transport_http_server.c:3111 +#: src/transport/plugin_transport_http_server.c:3174 #, fuzzy, c-format msgid "Using external hostname `%s'\n" msgstr "Đang bắt đầu tài về « %s »\n" -#: src/transport/plugin_transport_http_server.c:3132 +#: src/transport/plugin_transport_http_server.c:3195 #, fuzzy, c-format msgid "Notifying transport only about hostname `%s'\n" msgstr "không quyết định các tên máy" -#: src/transport/plugin_transport_http_server.c:3149 +#: src/transport/plugin_transport_http_server.c:3212 #, fuzzy, c-format msgid "Maximum number of connections is %u\n" msgstr "tăng sổ tối đa các kết nối TCP/IP" -#: src/transport/plugin_transport_http_server.c:3475 +#: src/transport/plugin_transport_http_server.c:3538 #, fuzzy msgid "Unable to compile URL regex\n" msgstr "Không thể sơ khởi SQLite: %s.\n" @@ -8029,7 +8076,7 @@ msgid "" "`GNUNET_SERVER_receive_done' after %s\n" msgstr "" -#: src/transport/tcp_service_legacy.c:339 src/util/service.c:2337 +#: src/transport/tcp_service_legacy.c:339 src/util/service.c:2346 #, fuzzy, c-format msgid "Unknown address family %d\n" msgstr "\tKhông rõ miền tên « %s »\n" @@ -8074,51 +8121,51 @@ msgstr "Lỗi chạy %s: %s %d\n" msgid "Service `%s' runs at %s\n" msgstr "Đồng đẳng « %s » có mức tin cậy %8u\n" -#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:1501 +#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:1500 msgid "Service process failed to initialize\n" msgstr "" -#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:1505 +#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:1504 msgid "Service process could not initialize server function\n" msgstr "" -#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:1509 +#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:1508 msgid "Service process failed to report status\n" msgstr "" #: src/transport/tcp_service_legacy.c:1313 src/util/disk.c:1488 -#: src/util/service.c:1379 +#: src/util/service.c:1378 #, c-format msgid "Cannot obtain information about user `%s': %s\n" msgstr "Không thể lấy thông tin về người dùng « %s »: %s\n" -#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1381 +#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1380 msgid "No such user" msgstr "Không có người dùng như vậy" -#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1400 +#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1399 #, c-format msgid "Cannot change user/group to `%s': %s\n" msgstr "Không thể thay đổi người dùng/nhóm thành « %s »: %s\n" -#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:1728 +#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:1727 msgid "do daemonize (detach from terminal)" msgstr "" -#: src/transport/tcp_service_legacy.c:1448 src/util/program.c:244 -#: src/util/service.c:1791 +#: src/transport/tcp_service_legacy.c:1448 src/util/program.c:255 +#: src/util/service.c:1790 #, fuzzy, c-format msgid "Malformed configuration file `%s', exit ...\n" msgstr "Không thể lưu tập tin cấu hình « %s »:" -#: src/transport/tcp_service_legacy.c:1458 src/util/program.c:261 -#: src/util/service.c:1802 +#: src/transport/tcp_service_legacy.c:1458 src/util/program.c:272 +#: src/util/service.c:1801 #, fuzzy msgid "Malformed configuration, exit ...\n" msgstr "Không thể lưu tập tin cấu hình « %s »:" -#: src/transport/tcp_service_legacy.c:1463 src/util/program.c:256 -#: src/util/service.c:1808 +#: src/transport/tcp_service_legacy.c:1463 src/util/program.c:267 +#: src/util/service.c:1807 #, fuzzy, c-format msgid "Could not access configuration file `%s'\n" msgstr "Không thể truy cập đến tập tin gnunet-directory « %s »\n" @@ -8157,76 +8204,76 @@ msgstr "" msgid "Metadata `%s' failed to deserialize" msgstr "" -#: src/util/client.c:882 +#: src/util/client.c:911 #, c-format msgid "Need a non-empty hostname for service `%s'.\n" msgstr "" -#: src/util/common_logging.c:256 src/util/common_logging.c:1129 +#: src/util/common_logging.c:259 src/util/common_logging.c:1132 msgid "DEBUG" msgstr "GỠ LỖI" -#: src/util/common_logging.c:258 src/util/common_logging.c:1127 +#: src/util/common_logging.c:261 src/util/common_logging.c:1130 msgid "INFO" msgstr "TIN" -#: src/util/common_logging.c:260 src/util/common_logging.c:1125 +#: src/util/common_logging.c:263 src/util/common_logging.c:1128 msgid "MESSAGE" msgstr "" -#: src/util/common_logging.c:262 src/util/common_logging.c:1123 +#: src/util/common_logging.c:265 src/util/common_logging.c:1126 msgid "WARNING" msgstr "CẢNH BÁO" -#: src/util/common_logging.c:264 src/util/common_logging.c:1121 +#: src/util/common_logging.c:267 src/util/common_logging.c:1124 msgid "ERROR" msgstr "LỖI" -#: src/util/common_logging.c:266 src/util/common_logging.c:1131 +#: src/util/common_logging.c:269 src/util/common_logging.c:1134 msgid "NONE" msgstr "" -#: src/util/common_logging.c:879 +#: src/util/common_logging.c:882 #, fuzzy, c-format msgid "Message `%.*s' repeated %u times in the last %s\n" msgstr "Thông điệp « %.*s » đã lặp lại %u lần trong %llu giây trước\n" -#: src/util/common_logging.c:1132 +#: src/util/common_logging.c:1135 msgid "INVALID" msgstr "" -#: src/util/common_logging.c:1302 +#: src/util/common_logging.c:1326 msgid "unknown address" msgstr "" -#: src/util/common_logging.c:1344 +#: src/util/common_logging.c:1368 msgid "invalid address" msgstr "" -#: src/util/common_logging.c:1362 +#: src/util/common_logging.c:1386 #, fuzzy, c-format msgid "Configuration fails to specify option `%s' in section `%s'!\n" msgstr "" "Cấu hình không thỏa mãn các ràng buộc của tập tin đặc tả cấu hình « %s ».\n" -#: src/util/common_logging.c:1383 +#: src/util/common_logging.c:1407 #, fuzzy, c-format msgid "" "Configuration specifies invalid value for option `%s' in section `%s': %s\n" msgstr "" "Cấu hình không thỏa mãn các ràng buộc của tập tin đặc tả cấu hình « %s ».\n" -#: src/util/configuration.c:286 +#: src/util/configuration.c:296 #, fuzzy, c-format msgid "Syntax error while deserializing in line %u\n" msgstr "Gặp lỗi cú pháp trong tập tin cấu hình « %s » tại dòng %d.\n" -#: src/util/configuration.c:344 +#: src/util/configuration.c:355 #, fuzzy, c-format msgid "Error while reading file `%s'\n" msgstr "Gặp lỗi khi tải xuống: %s\n" -#: src/util/configuration.c:1017 +#: src/util/configuration.c:1034 #, c-format msgid "" "Configuration value '%s' for '%s' in section '%s' is not in set of legal " @@ -8235,17 +8282,17 @@ msgstr "" "Giá trị cấu hình « %s » cho « %s » trong phần « %s » không phải nằm trong " "tập hợp các sự chọn được phép\n" -#: src/util/configuration.c:1136 +#: src/util/configuration.c:1153 #, c-format msgid "Recursive expansion suspected, aborting $-expansion for term `%s'\n" msgstr "" -#: src/util/configuration.c:1169 +#: src/util/configuration.c:1186 #, fuzzy, c-format msgid "Missing closing `%s' in option `%s'\n" msgstr "Giá trị cấu hình « %s » cho « %s » trong phần « %s » nên là con số\n" -#: src/util/configuration.c:1237 +#: src/util/configuration.c:1254 #, c-format msgid "" "Failed to expand `%s' in `%s' as it is neither found in [PATHS] nor defined " @@ -8259,52 +8306,52 @@ msgid "" "%llu)\n" msgstr "" -#: src/util/crypto_ecc.c:777 +#: src/util/crypto_ecc.c:810 #, fuzzy, c-format msgid "ECC signing failed at %s:%d: %s\n" msgstr "%s bị lỗi tại %s:%d: « %s »\n" -#: src/util/crypto_ecc.c:827 +#: src/util/crypto_ecc.c:860 #, fuzzy, c-format msgid "EdDSA signing failed at %s:%d: %s\n" msgstr "%s bị lỗi tại %s:%d: « %s »\n" -#: src/util/crypto_ecc.c:901 +#: src/util/crypto_ecc.c:934 #, fuzzy, c-format msgid "ECDSA signature verification failed at %s:%d: %s\n" msgstr "Lỗi thẩm tra chữ ký RSA tại %s:%d: %s\n" -#: src/util/crypto_ecc.c:958 +#: src/util/crypto_ecc.c:991 #, fuzzy, c-format msgid "EdDSA signature verification failed at %s:%d: %s\n" msgstr "Lỗi thẩm tra chữ ký RSA tại %s:%d: %s\n" -#: src/util/crypto_ecc_setup.c:122 src/util/crypto_ecc_setup.c:160 -#: src/util/crypto_ecc_setup.c:278 src/util/crypto_ecc_setup.c:316 +#: src/util/crypto_ecc_setup.c:122 src/util/crypto_ecc_setup.c:161 +#: src/util/crypto_ecc_setup.c:279 src/util/crypto_ecc_setup.c:317 #, fuzzy, c-format msgid "Could not acquire lock on file `%s': %s...\n" msgstr "Lỗi mở tập tin theo dõi « %s »: %s\n" -#: src/util/crypto_ecc_setup.c:127 src/util/crypto_ecc_setup.c:283 +#: src/util/crypto_ecc_setup.c:128 src/util/crypto_ecc_setup.c:284 #, fuzzy msgid "Creating a new private key. This may take a while.\n" msgstr "Đang tạo khoá máy mới (có thể hơi lâu).\n" -#: src/util/crypto_ecc_setup.c:164 src/util/crypto_ecc_setup.c:320 +#: src/util/crypto_ecc_setup.c:165 src/util/crypto_ecc_setup.c:322 msgid "This may be ok if someone is currently generating a private key.\n" msgstr "" -#: src/util/crypto_ecc_setup.c:194 src/util/crypto_ecc_setup.c:350 +#: src/util/crypto_ecc_setup.c:195 src/util/crypto_ecc_setup.c:352 #, c-format msgid "" "When trying to read key file `%s' I found %u bytes but I need at least %u.\n" msgstr "" -#: src/util/crypto_ecc_setup.c:198 src/util/crypto_ecc_setup.c:354 +#: src/util/crypto_ecc_setup.c:199 src/util/crypto_ecc_setup.c:356 msgid "This may be ok if someone is currently generating a key.\n" msgstr "" -#: src/util/crypto_ecc_setup.c:413 +#: src/util/crypto_ecc_setup.c:415 #, fuzzy msgid "Could not load peer's private key\n" msgstr "Không thể truy cập đến tập tin gnunet-directory « %s »\n" @@ -8499,82 +8546,90 @@ msgstr "" msgid "Manipulate GNUnet configuration files" msgstr "cập nhật một giá trị trong tập tin cấu hình" -#: src/util/gnunet-ecc.c:84 +#: src/util/gnunet-ecc.c:94 #, fuzzy, c-format msgid "Failed to open `%s': %s\n" msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n" -#: src/util/gnunet-ecc.c:120 +#: src/util/gnunet-ecc.c:130 #, c-format msgid "Generating %u keys like %s, please wait" msgstr "" -#: src/util/gnunet-ecc.c:133 +#: src/util/gnunet-ecc.c:143 #, c-format msgid "Generating %u keys, please wait" msgstr "" -#: src/util/gnunet-ecc.c:174 +#: src/util/gnunet-ecc.c:184 #, fuzzy, c-format msgid "" "\n" "Failed to write to `%s': %s\n" msgstr "Lỗi chạy %s: %s %d\n" -#: src/util/gnunet-ecc.c:184 +#: src/util/gnunet-ecc.c:194 #, c-format msgid "" "\n" "Finished!\n" msgstr "" -#: src/util/gnunet-ecc.c:187 +#: src/util/gnunet-ecc.c:197 #, c-format msgid "" "\n" "Error, %u keys not generated\n" msgstr "" -#: src/util/gnunet-ecc.c:280 +#: src/util/gnunet-ecc.c:288 #, fuzzy, c-format msgid "Hostkeys file `%s' not found\n" msgstr "Khoá phiên chạy từ đồng đẳng « %s » không thể được thẩm tra.\n" -#: src/util/gnunet-ecc.c:291 +#: src/util/gnunet-ecc.c:299 #, fuzzy, c-format msgid "Hostkeys file `%s' is empty\n" msgstr "Định dạng của tập tin « %s » là không hợp lệ.\n" -#: src/util/gnunet-ecc.c:313 +#: src/util/gnunet-ecc.c:321 #, fuzzy, c-format msgid "Could not read hostkey file: %s\n" msgstr "Không thể đọc danh sách bạn bè « %s »\n" -#: src/util/gnunet-ecc.c:364 +#: src/util/gnunet-ecc.c:372 msgid "No hostkey file specified on command line\n" msgstr "" -#: src/util/gnunet-ecc.c:416 +#: src/util/gnunet-ecc.c:437 msgid "list keys included in a file (for testing)" msgstr "" -#: src/util/gnunet-ecc.c:421 +#: src/util/gnunet-ecc.c:442 msgid "number of keys to list included in a file (for testing)" msgstr "" -#: src/util/gnunet-ecc.c:426 +#: src/util/gnunet-ecc.c:447 msgid "create COUNT public-private key pairs (for testing)" msgstr "" -#: src/util/gnunet-ecc.c:430 +#: src/util/gnunet-ecc.c:451 msgid "print the public key in ASCII format" msgstr "" -#: src/util/gnunet-ecc.c:434 +#: src/util/gnunet-ecc.c:455 +msgid "print the private key in ASCII format" +msgstr "" + +#: src/util/gnunet-ecc.c:459 +msgid "print the public key in HEX format" +msgstr "" + +#: src/util/gnunet-ecc.c:463 msgid "print examples of ECC operations (used for compatibility testing)" msgstr "" -#: src/util/gnunet-ecc.c:449 +#: src/util/gnunet-ecc.c:479 #, fuzzy msgid "Manipulate GNUnet private ECC key files" msgstr "cập nhật một giá trị trong tập tin cấu hình" @@ -8668,7 +8723,7 @@ msgstr "Gặp lỗi khi tạo người dùng" msgid "Unable to shorten unix path `%s' while keeping name unique\n" msgstr "" -#: src/util/network.c:1793 src/util/network.c:1969 +#: src/util/network.c:1793 src/util/network.c:1977 #, c-format msgid "" "Fatal internal logic error, process hangs in `%s' (abort with CTRL-C)!\n" @@ -8721,7 +8776,7 @@ 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/resolver_api.c:204 +#: src/util/resolver_api.c:203 #, c-format msgid "" "Missing `%s' for `%s' in configuration, DNS resolution will be unavailable.\n" @@ -8734,32 +8789,32 @@ msgid "" "resolution will be unavailable.\n" msgstr "" -#: src/util/resolver_api.c:815 +#: src/util/resolver_api.c:827 #, fuzzy, c-format msgid "Timeout trying to resolve hostname `%s'.\n" msgstr "không quyết định các tên máy" -#: src/util/resolver_api.c:827 +#: src/util/resolver_api.c:840 #, fuzzy, c-format msgid "Timeout trying to resolve IP address `%s'.\n" msgstr "GNUnet bây giờ sử dụng địa chỉ IP %s.\n" -#: src/util/resolver_api.c:1004 +#: src/util/resolver_api.c:1024 msgid "Resolver not configured correctly.\n" msgstr "" -#: src/util/resolver_api.c:1086 src/util/resolver_api.c:1107 -#: src/util/resolver_api.c:1121 +#: src/util/resolver_api.c:1110 src/util/resolver_api.c:1133 +#: src/util/resolver_api.c:1147 #, fuzzy, c-format msgid "Could not resolve our FQDN: %s\n" msgstr "Không thể giải quyết « %s » (%s): %s\n" -#: src/util/service.c:1306 +#: src/util/service.c:1305 msgid "" "Could not bind to any of the ports I was supposed to, refusing to run!\n" msgstr "" -#: src/util/service.c:2082 +#: src/util/service.c:2091 #, c-format msgid "" "Processing code for message of type %u did not call " @@ -8837,63 +8892,63 @@ msgstr " ngày" msgid "end of time" msgstr "" -#: src/util/strings.c:1269 +#: src/util/strings.c:1270 msgid "IPv6 address did not start with `['\n" msgstr "" -#: src/util/strings.c:1277 +#: src/util/strings.c:1278 msgid "IPv6 address did contain ':' to separate port number\n" msgstr "" -#: src/util/strings.c:1283 +#: src/util/strings.c:1284 msgid "IPv6 address did contain ']' before ':' to separate port number\n" msgstr "" -#: src/util/strings.c:1290 +#: src/util/strings.c:1291 msgid "IPv6 address did contain a valid port number after the last ':'\n" msgstr "" -#: src/util/strings.c:1299 +#: src/util/strings.c:1300 #, fuzzy, c-format msgid "Invalid IPv6 address `%s': %s\n" msgstr "Mức ưu tiên tiến trình không hợp lê « %s ».\n" -#: src/util/strings.c:1571 src/util/strings.c:1587 +#: src/util/strings.c:1572 src/util/strings.c:1588 msgid "Port not in range\n" msgstr "" -#: src/util/strings.c:1596 +#: src/util/strings.c:1597 #, fuzzy, c-format msgid "Malformed port policy `%s'\n" msgstr "Lỗi bắt đầu thu thập.\n" -#: src/util/strings.c:1679 src/util/strings.c:1710 src/util/strings.c:1758 -#: src/util/strings.c:1779 +#: src/util/strings.c:1680 src/util/strings.c:1711 src/util/strings.c:1759 +#: src/util/strings.c:1780 #, c-format msgid "Invalid format for IP: `%s'\n" msgstr "Địa chỉ IP định dạng sai: %s\n" -#: src/util/strings.c:1736 +#: src/util/strings.c:1737 #, c-format msgid "Invalid network notation ('/%d' is not legal in IPv4 CIDR)." msgstr "Ký hiệu mạng sai (« /%d » không hợp lệ trong CIDR IPv4)." -#: src/util/strings.c:1788 +#: src/util/strings.c:1789 #, fuzzy, c-format msgid "Invalid format: `%s'\n" msgstr "Địa chỉ IP định dạng sai: %s\n" -#: src/util/strings.c:1840 +#: src/util/strings.c:1841 #, c-format msgid "Invalid network notation (does not end with ';': `%s')\n" msgstr "Ký hiệu mạng sai (không kết thúc với « ; »: « %s »)\n" -#: src/util/strings.c:1890 +#: src/util/strings.c:1891 #, fuzzy, c-format msgid "Wrong format `%s' for netmask\n" msgstr "Mặt nạ mạng có định dạng sai « %s »: %s\n" -#: src/util/strings.c:1921 +#: src/util/strings.c:1922 #, fuzzy, c-format msgid "Wrong format `%s' for network\n" msgstr "Mạng có định dạng sai « %s »: %s\n" @@ -8946,65 +9001,65 @@ msgstr "" msgid "# ICMPv6 packets dropped (not allowed)" msgstr "" -#: src/vpn/gnunet-service-vpn.c:2232 +#: src/vpn/gnunet-service-vpn.c:2235 #, fuzzy msgid "# Packets received from TUN interface" msgstr "# các đáp ứng lỗ hổng được gửi cho trình/máy khách" -#: src/vpn/gnunet-service-vpn.c:2265 src/vpn/gnunet-service-vpn.c:2301 +#: src/vpn/gnunet-service-vpn.c:2268 src/vpn/gnunet-service-vpn.c:2304 #, c-format msgid "Packet received for unmapped destination `%s' (dropping it)\n" msgstr "" -#: src/vpn/gnunet-service-vpn.c:2311 +#: src/vpn/gnunet-service-vpn.c:2314 msgid "Received IPv4 packet with options (dropping it)\n" msgstr "" -#: src/vpn/gnunet-service-vpn.c:2325 +#: src/vpn/gnunet-service-vpn.c:2328 #, c-format msgid "Received packet of unknown protocol %d from TUN (dropping it)\n" msgstr "" -#: src/vpn/gnunet-service-vpn.c:2364 +#: src/vpn/gnunet-service-vpn.c:2367 msgid "Failed to find unallocated IPv4 address in VPN's range\n" msgstr "" -#: src/vpn/gnunet-service-vpn.c:2419 +#: src/vpn/gnunet-service-vpn.c:2422 msgid "Failed to find unallocated IPv6 address in VPN's range\n" msgstr "" -#: src/vpn/gnunet-service-vpn.c:2461 src/vpn/gnunet-service-vpn.c:2683 +#: src/vpn/gnunet-service-vpn.c:2464 src/vpn/gnunet-service-vpn.c:2686 #, fuzzy msgid "# Active destinations" msgstr "# các kết nối dht" -#: src/vpn/gnunet-service-vpn.c:2732 +#: src/vpn/gnunet-service-vpn.c:2735 msgid "Failed to allocate IP address for new destination\n" msgstr "" -#: src/vpn/gnunet-service-vpn.c:2995 +#: src/vpn/gnunet-service-vpn.c:2998 #, fuzzy msgid "Must specify valid IPv6 address" msgstr "« %s » không sẵn sàng.\n" -#: src/vpn/gnunet-service-vpn.c:3019 +#: src/vpn/gnunet-service-vpn.c:3022 msgid "Must specify valid IPv6 mask" msgstr "" -#: src/vpn/gnunet-service-vpn.c:3027 +#: src/vpn/gnunet-service-vpn.c:3030 msgid "IPv6 support disabled as this system does not support IPv6\n" msgstr "" -#: src/vpn/gnunet-service-vpn.c:3040 +#: src/vpn/gnunet-service-vpn.c:3043 #, fuzzy msgid "Must specify valid IPv4 address" msgstr "« %s » không sẵn sàng.\n" -#: src/vpn/gnunet-service-vpn.c:3053 +#: src/vpn/gnunet-service-vpn.c:3056 msgid "Must specify valid IPv4 mask" msgstr "" -#: src/vpn/gnunet-service-vpn.c:3063 +#: src/vpn/gnunet-service-vpn.c:3066 msgid "IPv4 support disabled as this system does not support IPv4\n" msgstr "" @@ -9076,28 +9131,40 @@ msgstr "# các byte đã nhận qua UDP" msgid "Setup tunnels via VPN." msgstr "" -#: src/zonemaster/gnunet-service-zonemaster.c:705 +#: src/zonemaster/gnunet-service-zonemaster.c:706 #, fuzzy msgid "Failed to connect to the namestore!\n" msgstr "Không kết nối được đến trình nền gnunetd." -#: src/include/gnunet_common.h:674 src/include/gnunet_common.h:681 -#: src/include/gnunet_common.h:691 src/include/gnunet_common.h:699 +#: src/include/gnunet_common.h:689 src/include/gnunet_common.h:696 +#: src/include/gnunet_common.h:706 src/include/gnunet_common.h:714 #, fuzzy, c-format msgid "Assertion failed at %s:%d.\n" msgstr "Lỗi nội bộ : khẳng định không thành công tại %s:%d.\n" -#: src/include/gnunet_common.h:711 +#: src/include/gnunet_common.h:726 #, fuzzy, c-format msgid "External protocol violation detected at %s:%d.\n" msgstr "Lỗi nội bộ : khẳng định không thành công tại %s:%d.\n" -#: src/include/gnunet_common.h:738 src/include/gnunet_common.h:747 +#: src/include/gnunet_common.h:753 src/include/gnunet_common.h:762 #, c-format msgid "`%s' failed on file `%s' at %s:%d with error: %s\n" msgstr "« %s » thất bại ở tập tin « %s » tại %s:%d với lỗi: %s\n" #, fuzzy +#~ msgid "Failed to create indices\n" +#~ msgstr "Không thể tạo miền tên.\n" + +#, fuzzy +#~ msgid "`%s:%s' failed at %s:%d with error: %s\n" +#~ msgstr "« %s » bị lỗi tại %s:%d với lỗi: %s" + +#, fuzzy +#~ msgid "Unable to connect to Postgres database '%s': %s\n" +#~ msgstr "Không thể lưu tập tin cấu hình « %s »:" + +#, fuzzy #~ msgid "Misconfiguration (can not connect to the ARM service)" #~ msgstr "Lỗi kết nối đến gnunetd.\n" @@ -9206,10 +9273,6 @@ msgstr "« %s » thất bại ở tập tin « %s » tại %s:%d với lỗi: %s #~ msgstr "# các sự truyền PONG bị lỗi" #, fuzzy -#~ msgid "# bytes sent to datastore" -#~ msgstr "# các byte trong kho dữ liệu" - -#, fuzzy #~ msgid "Failed to receive status response from database." #~ msgstr "" #~ "\n" @@ -9526,10 +9589,6 @@ msgstr "« %s » thất bại ở tập tin « %s » tại %s:%d với lỗi: %s #~ msgstr "Lỗi sơ khởi dịch vụ « %s ».\n" #, fuzzy -#~ msgid "Error reading sensor version\n" -#~ msgstr "Gặp lỗi khi tạo người dùng" - -#, fuzzy #~ msgid "Error reading sensor category\n" #~ msgstr "Gặp lỗi khi tạo người dùng" @@ -10134,12 +10193,6 @@ msgstr "« %s » thất bại ở tập tin « %s » tại %s:%d với lỗi: %s #~ "Không nhận được đáp ứng từ gnunetd.\n" #, fuzzy -#~ msgid "Failed to remove records from database" -#~ msgstr "" -#~ "\n" -#~ "Không nhận được đáp ứng từ gnunetd.\n" - -#, fuzzy #~ msgid "Failed to access database" #~ msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n" diff --git 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: 2017-03-31 19:22-0500\n" +"POT-Creation-Date: 2018-01-02 02:33+0100\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" @@ -239,14 +239,14 @@ msgid "Require valid port number for service `%s' in configuration!\n" msgstr "" #: src/arm/gnunet-service-arm.c:430 src/transport/plugin_transport_tcp.c:1176 -#: src/transport/tcp_service_legacy.c:613 src/util/client.c:480 +#: src/transport/tcp_service_legacy.c:613 src/util/client.c:505 #: src/util/service.c:682 #, c-format msgid "UNIXPATH `%s' too long, maximum length is %llu\n" msgstr "" #: src/arm/gnunet-service-arm.c:434 src/transport/plugin_transport_tcp.c:1180 -#: src/transport/tcp_service_legacy.c:617 src/util/client.c:485 +#: src/transport/tcp_service_legacy.c:617 src/util/client.c:510 #: src/util/service.c:687 #, fuzzy, c-format msgid "Using `%s' instead\n" @@ -267,7 +267,7 @@ msgid "Have neither PORT nor UNIXPATH for service `%s', but one is required\n" msgstr "" #: src/arm/gnunet-service-arm.c:513 -#: src/transport/plugin_transport_http_server.c:2621 +#: src/transport/plugin_transport_http_server.c:2684 #: src/transport/plugin_transport_tcp.c:1259 #: src/transport/tcp_service_legacy.c:696 src/util/service.c:782 #, fuzzy, c-format @@ -275,7 +275,7 @@ msgid "Failed to resolve `%s': %s\n" msgstr "打开日志文件“%s”失败:%s\n" #: src/arm/gnunet-service-arm.c:532 -#: src/transport/plugin_transport_http_server.c:2639 +#: src/transport/plugin_transport_http_server.c:2702 #: src/transport/plugin_transport_tcp.c:1278 #: src/transport/tcp_service_legacy.c:715 src/util/service.c:802 #, fuzzy, c-format @@ -370,13 +370,11 @@ msgid "" "%llu\n" msgstr "" -#: src/ats/gnunet-ats-solver-eval.c:3294 -#: src/ats-tests/gnunet-solver-eval.c:939 +#: src/ats/gnunet-ats-solver-eval.c:3294 src/ats-tests/gnunet-solver-eval.c:939 msgid "solver to use" msgstr "" -#: src/ats/gnunet-ats-solver-eval.c:3299 -#: src/ats-tests/gnunet-solver-eval.c:945 +#: src/ats/gnunet-ats-solver-eval.c:3299 src/ats-tests/gnunet-solver-eval.c:945 #: src/ats-tests/gnunet-solver-eval.c:950 msgid "experiment to use" msgstr "" @@ -671,57 +669,57 @@ msgstr "" msgid "Invalid peer ID `%s'\n" msgstr "无效条目。\n" -#: src/cadet/gnunet-cadet.c:702 +#: src/cadet/gnunet-cadet.c:703 #, fuzzy, c-format msgid "Invalid tunnel owner `%s'\n" msgstr "IP 格式无效:“%s”\n" -#: src/cadet/gnunet-cadet.c:775 +#: src/cadet/gnunet-cadet.c:776 msgid "Extra arguments are not applicable in combination with this option.\n" msgstr "" -#: src/cadet/gnunet-cadet.c:866 +#: src/cadet/gnunet-cadet.c:867 #, fuzzy, c-format msgid "Invalid target `%s'\n" msgstr "“%s”的参数无效。\n" -#: src/cadet/gnunet-cadet.c:903 +#: src/cadet/gnunet-cadet.c:904 msgid "No action requested\n" msgstr "" -#: src/cadet/gnunet-cadet.c:928 +#: src/cadet/gnunet-cadet.c:929 #, fuzzy msgid "Provide information about a particular connection" msgstr "无法获取有关用户“%s”的信息:%s\n" -#: src/cadet/gnunet-cadet.c:933 +#: src/cadet/gnunet-cadet.c:934 msgid "Activate echo mode" msgstr "" -#: src/cadet/gnunet-cadet.c:938 +#: src/cadet/gnunet-cadet.c:939 msgid "Dump debug information to STDERR" msgstr "" -#: src/cadet/gnunet-cadet.c:944 +#: src/cadet/gnunet-cadet.c:945 msgid "Listen for connections using a shared secret among sender and recipient" msgstr "" -#: src/cadet/gnunet-cadet.c:951 +#: src/cadet/gnunet-cadet.c:952 #, fuzzy msgid "Provide information about a patricular peer" msgstr "无法获取有关用户“%s”的信息:%s\n" -#: src/cadet/gnunet-cadet.c:957 +#: src/cadet/gnunet-cadet.c:958 #, fuzzy msgid "Provide information about all peers" msgstr "无法获取有关用户“%s”的信息:%s\n" -#: src/cadet/gnunet-cadet.c:963 +#: src/cadet/gnunet-cadet.c:964 #, fuzzy msgid "Provide information about a particular tunnel" msgstr "无法获取有关用户“%s”的信息:%s\n" -#: src/cadet/gnunet-cadet.c:969 +#: src/cadet/gnunet-cadet.c:970 #, fuzzy msgid "Provide information about all tunnels" msgstr "无法获取有关用户“%s”的信息:%s\n" @@ -1049,7 +1047,7 @@ msgid "" msgstr "" #: src/conversation/gnunet_gst.c:622 -#: src/conversation/gnunet-helper-audio-playback-gst.c:356 +#: src/conversation/gnunet-helper-audio-playback-gst.c:361 #, c-format msgid "Read error from STDIN: %d %s\n" msgstr "" @@ -1059,59 +1057,59 @@ msgstr "" msgid "pa_stream_write() failed: %s\n" msgstr "“%s”说:%s\n" -#: src/conversation/gnunet-helper-audio-playback.c:607 +#: src/conversation/gnunet-helper-audio-playback.c:612 msgid "gnunet-helper-audio-playback - Got signal, exiting\n" msgstr "" -#: src/conversation/gnunet-helper-audio-playback.c:632 +#: src/conversation/gnunet-helper-audio-playback.c:637 #: src/conversation/gnunet-helper-audio-record.c:545 msgid "Connection established.\n" msgstr "" -#: src/conversation/gnunet-helper-audio-playback.c:637 +#: src/conversation/gnunet-helper-audio-playback.c:642 #: src/conversation/gnunet-helper-audio-record.c:550 #, fuzzy, c-format msgid "pa_stream_new() failed: %s\n" msgstr "“%s”说:%s\n" -#: src/conversation/gnunet-helper-audio-playback.c:651 +#: src/conversation/gnunet-helper-audio-playback.c:656 #, c-format msgid "pa_stream_connect_playback() failed: %s\n" msgstr "" -#: src/conversation/gnunet-helper-audio-playback.c:664 +#: src/conversation/gnunet-helper-audio-playback.c:669 #: src/conversation/gnunet-helper-audio-record.c:576 #, fuzzy, c-format msgid "Connection failure: %s\n" msgstr "“%s”已连接到“%s”。\n" -#: src/conversation/gnunet-helper-audio-playback.c:685 +#: src/conversation/gnunet-helper-audio-playback.c:690 #: src/conversation/gnunet-helper-audio-record.c:599 msgid "Wrong Spec\n" msgstr "" -#: src/conversation/gnunet-helper-audio-playback.c:691 +#: src/conversation/gnunet-helper-audio-playback.c:696 #: src/conversation/gnunet-helper-audio-record.c:605 msgid "pa_mainloop_new() failed.\n" msgstr "" -#: src/conversation/gnunet-helper-audio-playback.c:705 +#: src/conversation/gnunet-helper-audio-playback.c:710 #: src/conversation/gnunet-helper-audio-record.c:620 msgid "pa_context_new() failed.\n" msgstr "" -#: src/conversation/gnunet-helper-audio-playback.c:712 +#: src/conversation/gnunet-helper-audio-playback.c:717 #: src/conversation/gnunet-helper-audio-record.c:626 #, fuzzy, c-format msgid "pa_context_connect() failed: %s\n" msgstr "“%s”说:%s\n" -#: src/conversation/gnunet-helper-audio-playback.c:718 +#: src/conversation/gnunet-helper-audio-playback.c:723 #: src/conversation/gnunet-helper-audio-record.c:632 msgid "pa_mainloop_run() failed.\n" msgstr "" -#: src/conversation/gnunet-helper-audio-playback.c:790 +#: src/conversation/gnunet-helper-audio-playback.c:795 #, c-format msgid "Read error from STDIN: %s\n" msgstr "" @@ -1175,7 +1173,12 @@ msgstr "“%s”说:%s\n" msgid "Failed to allocate %u bytes for second packet\n" msgstr "初始化“%s”服务失败。\n" -#: src/conversation/microphone.c:119 +#: src/conversation/gnunet-service-conversation.c:1276 +#, fuzzy, c-format +msgid "Could not open line, port %s already in use!\n" +msgstr "无法连接到 %s:%u:%s\n" + +#: src/conversation/microphone.c:121 #, fuzzy msgid "Could not start record audio helper\n" msgstr "找不到主机“%s”的 IP:%s\n" @@ -1264,26 +1267,26 @@ msgstr "" msgid "# dequeuing CAR (duplicate request)" msgstr "" -#: src/core/gnunet-service-core.c:440 +#: src/core/gnunet-service-core.c:443 #, c-format msgid "# bytes of messages of type %u received" msgstr "" -#: src/core/gnunet-service-core.c:538 +#: src/core/gnunet-service-core.c:541 msgid "# messages discarded (session disconnected)" msgstr "" -#: src/core/gnunet-service-core.c:876 +#: src/core/gnunet-service-core.c:879 #, c-format msgid "# messages of type %u discarded (client busy)" msgstr "" -#: src/core/gnunet-service-core.c:985 +#: src/core/gnunet-service-core.c:988 #, fuzzy msgid "Core service is lacking HOSTKEY configuration setting. Exiting.\n" msgstr "立即保存配置?" -#: src/core/gnunet-service-core.c:1006 +#: src/core/gnunet-service-core.c:1009 #, fuzzy, c-format msgid "Core service of `%s' ready.\n" msgstr "服务已删除。\n" @@ -1296,125 +1299,125 @@ msgstr "" msgid "# bytes decrypted" msgstr "" -#: src/core/gnunet-service-core_kx.c:725 +#: src/core/gnunet-service-core_kx.c:728 msgid "# PAYLOAD dropped (out of order)" msgstr "" -#: src/core/gnunet-service-core_kx.c:775 +#: src/core/gnunet-service-core_kx.c:778 msgid "# key exchanges initiated" msgstr "" -#: src/core/gnunet-service-core_kx.c:837 +#: src/core/gnunet-service-core_kx.c:840 msgid "# key exchanges stopped" msgstr "" -#: src/core/gnunet-service-core_kx.c:871 +#: src/core/gnunet-service-core_kx.c:874 #, fuzzy msgid "# PING messages transmitted" msgstr "消息尺寸" -#: src/core/gnunet-service-core_kx.c:938 +#: src/core/gnunet-service-core_kx.c:941 msgid "# old ephemeral keys ignored" msgstr "" -#: src/core/gnunet-service-core_kx.c:945 +#: src/core/gnunet-service-core_kx.c:948 msgid "# ephemeral keys received" msgstr "" -#: src/core/gnunet-service-core_kx.c:984 +#: src/core/gnunet-service-core_kx.c:987 #, 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 "" -#: src/core/gnunet-service-core_kx.c:995 +#: src/core/gnunet-service-core_kx.c:998 msgid "# EPHEMERAL_KEY messages received" msgstr "" -#: src/core/gnunet-service-core_kx.c:1091 -#: src/transport/gnunet-service-transport_validation.c:1119 +#: src/core/gnunet-service-core_kx.c:1094 +#: src/transport/gnunet-service-transport_validation.c:1128 msgid "# PING messages received" msgstr "" -#: src/core/gnunet-service-core_kx.c:1100 +#: src/core/gnunet-service-core_kx.c:1103 msgid "# PING messages dropped (out of order)" msgstr "" -#: src/core/gnunet-service-core_kx.c:1158 +#: src/core/gnunet-service-core_kx.c:1161 msgid "# PONG messages created" msgstr "" -#: src/core/gnunet-service-core_kx.c:1184 +#: src/core/gnunet-service-core_kx.c:1187 msgid "# sessions terminated by timeout" msgstr "" -#: src/core/gnunet-service-core_kx.c:1197 +#: src/core/gnunet-service-core_kx.c:1200 msgid "# keepalive messages sent" msgstr "" -#: src/core/gnunet-service-core_kx.c:1261 -#: src/transport/gnunet-service-transport_validation.c:1442 +#: src/core/gnunet-service-core_kx.c:1264 +#: src/transport/gnunet-service-transport_validation.c:1461 msgid "# PONG messages received" msgstr "" -#: src/core/gnunet-service-core_kx.c:1268 +#: src/core/gnunet-service-core_kx.c:1271 msgid "# PONG messages dropped (connection down)" msgstr "" -#: src/core/gnunet-service-core_kx.c:1273 +#: src/core/gnunet-service-core_kx.c:1276 msgid "# PONG messages dropped (out of order)" msgstr "" -#: src/core/gnunet-service-core_kx.c:1308 +#: src/core/gnunet-service-core_kx.c:1311 msgid "# PONG messages decrypted" msgstr "" -#: src/core/gnunet-service-core_kx.c:1346 +#: src/core/gnunet-service-core_kx.c:1349 msgid "# session keys confirmed via PONG" msgstr "" -#: src/core/gnunet-service-core_kx.c:1357 +#: src/core/gnunet-service-core_kx.c:1360 msgid "# timeouts prevented via PONG" msgstr "" -#: src/core/gnunet-service-core_kx.c:1364 +#: src/core/gnunet-service-core_kx.c:1367 msgid "# rekey operations confirmed via PONG" msgstr "" -#: src/core/gnunet-service-core_kx.c:1518 +#: src/core/gnunet-service-core_kx.c:1521 msgid "# DATA message dropped (out of order)" msgstr "" -#: src/core/gnunet-service-core_kx.c:1526 +#: src/core/gnunet-service-core_kx.c:1529 #, c-format msgid "" "Session to peer `%s' went down due to key expiration (should not happen)\n" msgstr "" -#: src/core/gnunet-service-core_kx.c:1529 +#: src/core/gnunet-service-core_kx.c:1532 msgid "# sessions terminated by key expiration" msgstr "" -#: src/core/gnunet-service-core_kx.c:1590 -#: src/core/gnunet-service-core_kx.c:1616 +#: src/core/gnunet-service-core_kx.c:1593 +#: src/core/gnunet-service-core_kx.c:1619 msgid "# bytes dropped (duplicates)" msgstr "" -#: src/core/gnunet-service-core_kx.c:1603 +#: src/core/gnunet-service-core_kx.c:1606 msgid "# bytes dropped (out of sequence)" msgstr "" -#: src/core/gnunet-service-core_kx.c:1645 +#: src/core/gnunet-service-core_kx.c:1648 msgid "# bytes dropped (ancient message)" msgstr "" -#: src/core/gnunet-service-core_kx.c:1653 +#: src/core/gnunet-service-core_kx.c:1656 msgid "# bytes of payload decrypted" msgstr "" -#: src/core/gnunet-service-core_sessions.c:266 -#: src/core/gnunet-service-core_sessions.c:356 +#: src/core/gnunet-service-core_sessions.c:260 +#: src/core/gnunet-service-core_sessions.c:350 #: src/dht/gnunet-service-dht_neighbours.c:733 #: src/dht/gnunet-service-dht_neighbours.c:795 #: src/fs/gnunet-service-fs_cp.c:615 src/fs/gnunet-service-fs_cp.c:1520 @@ -1425,16 +1428,16 @@ msgstr "" msgid "# peers connected" msgstr "" -#: src/core/gnunet-service-core_sessions.c:302 +#: src/core/gnunet-service-core_sessions.c:296 msgid "# type map refreshes sent" msgstr "" -#: src/core/gnunet-service-core_sessions.c:422 +#: src/core/gnunet-service-core_sessions.c:416 #, fuzzy msgid "# outdated typemap confirmations received" msgstr "保存配置失败。" -#: src/core/gnunet-service-core_sessions.c:439 +#: src/core/gnunet-service-core_sessions.c:433 #, fuzzy msgid "# valid typemap confirmations received" msgstr "保存配置失败。" @@ -1449,7 +1452,7 @@ msgid "# updates to my type map" msgstr "" #: src/datacache/datacache.c:119 src/datacache/datacache.c:294 -#: src/datastore/gnunet-service-datastore.c:775 +#: src/datastore/gnunet-service-datastore.c:757 msgid "# bytes stored" msgstr "" @@ -1490,13 +1493,11 @@ msgstr "sqlite 数据仓库" #: src/datacache/plugin_datacache_sqlite.c:113 #: src/datacache/plugin_datacache_sqlite.c:122 -#: src/datastore/plugin_datastore_mysql.c:980 +#: src/datastore/plugin_datastore_mysql.c:892 #: src/datastore/plugin_datastore_sqlite.c:58 #: src/datastore/plugin_datastore_sqlite.c:66 src/my/my.c:80 src/my/my.c:92 #: src/mysql/mysql.c:42 src/mysql/mysql.c:49 -#: src/namecache/plugin_namecache_postgres.c:53 #: src/namecache/plugin_namecache_sqlite.c:53 -#: src/namestore/plugin_namestore_postgres.c:53 #: src/namestore/plugin_namestore_sqlite.c:53 #: src/peerstore/plugin_peerstore_sqlite.c:52 #: src/psycstore/plugin_psycstore_mysql.c:62 @@ -1505,14 +1506,14 @@ msgstr "sqlite 数据仓库" #: src/testbed/gnunet-daemon-testbed-underlay.c:56 #: src/testbed/testbed_api_hosts.c:69 src/util/crypto_ecc.c:52 #: src/util/crypto_ecc_setup.c:41 src/util/crypto_mpi.c:39 -#: src/include/gnunet_common.h:720 src/include/gnunet_common.h:729 +#: src/include/gnunet_common.h:735 src/include/gnunet_common.h:744 #: src/scalarproduct/scalarproduct.h:35 #, fuzzy, c-format msgid "`%s' failed at %s:%d with error: %s\n" msgstr "“%s”于 %s:%d 处失败,错误为:%s\n" #: src/datacache/plugin_datacache_sqlite.c:817 -#: src/datastore/plugin_datastore_sqlite.c:475 +#: src/datastore/plugin_datastore_sqlite.c:456 #: src/namecache/plugin_namecache_sqlite.c:296 #: src/namestore/plugin_namestore_sqlite.c:355 msgid "Tried to close sqlite without finalizing all prepared statements.\n" @@ -1536,7 +1537,7 @@ msgstr "" msgid "# queue entries created" msgstr "" -#: src/datastore/datastore_api.c:740 +#: src/datastore/datastore_api.c:760 msgid "# status messages received" msgstr "" @@ -1544,55 +1545,106 @@ msgstr "" msgid "# Results received" msgstr "" -#: src/datastore/datastore_api.c:941 +#: src/datastore/datastore_api.c:920 msgid "# datastore connections (re)created" msgstr "" -#: src/datastore/datastore_api.c:1055 +#: src/datastore/datastore_api.c:1034 msgid "# PUT requests executed" msgstr "" -#: src/datastore/datastore_api.c:1116 +#: src/datastore/datastore_api.c:1095 msgid "# RESERVE requests executed" msgstr "" -#: src/datastore/datastore_api.c:1181 +#: src/datastore/datastore_api.c:1160 msgid "# RELEASE RESERVE requests executed" msgstr "" -#: src/datastore/datastore_api.c:1259 +#: src/datastore/datastore_api.c:1238 msgid "# REMOVE requests executed" msgstr "" -#: src/datastore/datastore_api.c:1319 +#: src/datastore/datastore_api.c:1298 msgid "# GET REPLICATION requests executed" msgstr "" -#: src/datastore/datastore_api.c:1381 +#: src/datastore/datastore_api.c:1360 msgid "# GET ZERO ANONYMITY requests executed" msgstr "" -#: src/datastore/datastore_api.c:1462 +#: src/datastore/datastore_api.c:1441 msgid "# GET requests executed" msgstr "" -#: src/datastore/gnunet-datastore.c:113 +#: src/datastore/gnunet-datastore.c:189 +#, c-format +msgid "Dumped %<PRIu64> records\n" +msgstr "" + +#: src/datastore/gnunet-datastore.c:217 src/datastore/gnunet-datastore.c:229 +#, c-format +msgid "Short write to file: %zd bytes expecting %zd\n" +msgstr "" + +#: src/datastore/gnunet-datastore.c:261 +#, fuzzy +msgid "Error queueing datastore GET operation\n" +msgstr "创建用户出错" + +#: src/datastore/gnunet-datastore.c:287 src/datastore/gnunet-datastore.c:412 +#, fuzzy, c-format +msgid "Unable to open dump file: %s\n" +msgstr "发送消息失败。\n" + +#: src/datastore/gnunet-datastore.c:326 #, fuzzy, c-format msgid "Failed to store item: %s, aborting\n" msgstr "打开日志文件“%s”失败:%s\n" -#: src/datastore/gnunet-datastore.c:209 +#: src/datastore/gnunet-datastore.c:340 #, c-format -msgid "Cannot use the same configuration for source and destination\n" +msgid "Inserted %<PRIu64> records\n" msgstr "" -#: src/datastore/gnunet-datastore.c:256 -msgid "" -"specifies the configuration to use to access an alternative datastore; will " -"merge that datastore into our current datastore" +#: src/datastore/gnunet-datastore.c:349 src/datastore/gnunet-datastore.c:363 +#, c-format +msgid "Short read from file: %zd bytes expecting %zd\n" +msgstr "" + +#: src/datastore/gnunet-datastore.c:389 +#, fuzzy +msgid "Error queueing datastore PUT operation\n" +msgstr "创建用户出错" + +#: src/datastore/gnunet-datastore.c:432 +msgid "Input file is not of a supported format\n" msgstr "" -#: src/datastore/gnunet-datastore.c:265 +#: src/datastore/gnunet-datastore.c:458 +#, fuzzy +msgid "Failed connecting to the datastore.\n" +msgstr "初始化“%s”服务失败。\n" + +#: src/datastore/gnunet-datastore.c:470 +#, c-format +msgid "Please choose at least one operation: %s, %s\n" +msgstr "" + +#: src/datastore/gnunet-datastore.c:493 +#, fuzzy +msgid "Dump all records from the datastore" +msgstr "发送消息失败。\n" + +#: src/datastore/gnunet-datastore.c:497 +msgid "Insert records into the datastore" +msgstr "" + +#: src/datastore/gnunet-datastore.c:502 +msgid "File to dump or insert" +msgstr "" + +#: src/datastore/gnunet-datastore.c:511 #, fuzzy msgid "Manipulate GNUnet datastore" msgstr "更改配置文件中的一个值" @@ -1635,8 +1687,8 @@ msgstr "" #: src/datastore/gnunet-service-datastore.c:634 #: src/datastore/gnunet-service-datastore.c:689 -#: src/datastore/gnunet-service-datastore.c:977 -#: src/datastore/gnunet-service-datastore.c:1633 +#: src/datastore/gnunet-service-datastore.c:837 +#: src/datastore/gnunet-service-datastore.c:1469 msgid "# reserved" msgstr "" @@ -1644,144 +1696,145 @@ msgstr "" msgid "Could not find matching reservation" msgstr "" -#: src/datastore/gnunet-service-datastore.c:792 +#: src/datastore/gnunet-service-datastore.c:773 #, c-format msgid "Need %llu bytes more space (%llu allowed, using %llu)\n" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1026 +#: src/datastore/gnunet-service-datastore.c:876 msgid "# GET requests received" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1058 +#: src/datastore/gnunet-service-datastore.c:907 msgid "# GET KEY requests received" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1071 +#: src/datastore/gnunet-service-datastore.c:920 msgid "# requests filtered by bloomfilter" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1108 +#: src/datastore/gnunet-service-datastore.c:956 msgid "# GET REPLICATION requests received" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1141 +#: src/datastore/gnunet-service-datastore.c:989 msgid "# GET ZERO ANONYMITY requests received" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1190 +#: src/datastore/gnunet-service-datastore.c:1036 msgid "Content not found" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1199 +#: src/datastore/gnunet-service-datastore.c:1043 msgid "# bytes removed (explicit request)" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1246 +#: src/datastore/gnunet-service-datastore.c:1088 msgid "# REMOVE requests received" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1301 +#: src/datastore/gnunet-service-datastore.c:1137 #, c-format msgid "" "Datastore payload must have been inaccurate (%lld < %lld). Recomputing it.\n" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1307 -#: src/datastore/gnunet-service-datastore.c:1482 +#: src/datastore/gnunet-service-datastore.c:1143 +#: src/datastore/gnunet-service-datastore.c:1318 #, c-format msgid "New payload: %lld\n" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1361 +#: src/datastore/gnunet-service-datastore.c:1197 #, c-format msgid "Loading `%s' datastore plugin\n" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1373 +#: src/datastore/gnunet-service-datastore.c:1209 #, fuzzy, c-format msgid "Failed to load datastore plugin for `%s'\n" msgstr "解析配置文件“%s”失败\n" -#: src/datastore/gnunet-service-datastore.c:1433 +#: src/datastore/gnunet-service-datastore.c:1269 msgid "Bloomfilter construction complete.\n" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1489 +#: src/datastore/gnunet-service-datastore.c:1325 msgid "Rebuilding bloomfilter. Please be patient.\n" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1500 +#: src/datastore/gnunet-service-datastore.c:1336 msgid "Plugin does not support get_keys function. Please fix!\n" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1670 +#: src/datastore/gnunet-service-datastore.c:1506 #, c-format msgid "# bytes used in file-sharing datastore `%s'" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1686 +#: src/datastore/gnunet-service-datastore.c:1522 msgid "# quota" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1691 +#: src/datastore/gnunet-service-datastore.c:1527 msgid "# cache size" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1707 +#: src/datastore/gnunet-service-datastore.c:1543 #, c-format msgid "Could not use specified filename `%s' for bloomfilter.\n" msgstr "" -#: src/datastore/gnunet-service-datastore.c:1725 -#: src/datastore/gnunet-service-datastore.c:1741 +#: src/datastore/gnunet-service-datastore.c:1561 +#: src/datastore/gnunet-service-datastore.c:1577 #, fuzzy, c-format msgid "Failed to remove bogus bloomfilter file `%s'\n" msgstr "解析配置文件“%s”失败\n" -#: src/datastore/gnunet-service-datastore.c:1773 +#: src/datastore/gnunet-service-datastore.c:1609 #, fuzzy msgid "Failed to initialize bloomfilter.\n" msgstr "初始化“%s”服务失败。\n" -#: src/datastore/plugin_datastore_heap.c:769 +#: src/datastore/plugin_datastore_heap.c:893 #, fuzzy msgid "Heap database running\n" msgstr "sqlite 数据仓库" -#: src/datastore/plugin_datastore_mysql.c:377 -#: src/datastore/plugin_datastore_sqlite.c:590 +#: src/datastore/plugin_datastore_mysql.c:371 +#: src/datastore/plugin_datastore_mysql.c:423 +#: src/datastore/plugin_datastore_mysql.c:1075 +msgid "MySQL statement run failure" +msgstr "" + +#: src/datastore/plugin_datastore_mysql.c:410 +#: src/datastore/plugin_datastore_sqlite.c:626 #, fuzzy msgid "Data too large" msgstr "迭代次数" -#: src/datastore/plugin_datastore_mysql.c:393 -msgid "MySQL statement run failure" -msgstr "" - -#: src/datastore/plugin_datastore_mysql.c:936 +#: src/datastore/plugin_datastore_mysql.c:848 #, fuzzy, c-format msgid "`%s' for `%s' failed at %s:%d with error: %s\n" msgstr "“%s”于 %s:%d 处失败,错误为:%s\n" -#: src/datastore/plugin_datastore_mysql.c:1208 +#: src/datastore/plugin_datastore_mysql.c:1180 #: src/psycstore/plugin_psycstore_mysql.c:1936 msgid "Mysql database running\n" msgstr "" -#: src/datastore/plugin_datastore_postgres.c:345 +#: src/datastore/plugin_datastore_postgres.c:274 +#: src/datastore/plugin_datastore_postgres.c:891 msgid "Postgress exec failure" msgstr "" -#: src/datastore/plugin_datastore_postgres.c:866 +#: src/datastore/plugin_datastore_postgres.c:852 #, fuzzy msgid "Failed to drop table from database.\n" msgstr "发送消息失败。\n" -#: src/datastore/plugin_datastore_postgres.c:903 -#: src/namecache/plugin_namecache_postgres.c:398 -#: src/namestore/plugin_namestore_postgres.c:571 -#: src/psycstore/plugin_psycstore_postgres.c:1721 +#: src/datastore/plugin_datastore_postgres.c:950 +#: src/psycstore/plugin_psycstore_postgres.c:1506 msgid "Postgres database running\n" msgstr "" @@ -1793,7 +1846,7 @@ msgstr "" msgid "`%s' failed at %s:%u with error: %s" msgstr "“%s”于 %s:%d 处失败,错误为:%s\n" -#: src/datastore/plugin_datastore_sqlite.c:281 +#: src/datastore/plugin_datastore_sqlite.c:271 #: src/namecache/plugin_namecache_sqlite.c:194 #: src/namestore/plugin_namestore_sqlite.c:222 #: src/peerstore/plugin_peerstore_sqlite.c:535 @@ -1802,25 +1855,29 @@ msgstr "“%s”于 %s:%d 处失败,错误为:%s\n" msgid "Unable to initialize SQLite: %s.\n" msgstr "无法初始化 SQLite:%s。\n" -#: src/datastore/plugin_datastore_sqlite.c:1234 +#: src/datastore/plugin_datastore_sqlite.c:577 +msgid "sqlite bind failure" +msgstr "" + +#: src/datastore/plugin_datastore_sqlite.c:1259 msgid "sqlite version to old to determine size, assuming zero\n" msgstr "" -#: src/datastore/plugin_datastore_sqlite.c:1268 +#: src/datastore/plugin_datastore_sqlite.c:1293 #, c-format msgid "" "Using sqlite page utilization to estimate payload (%llu pages of size %llu " "bytes)\n" msgstr "" -#: src/datastore/plugin_datastore_sqlite.c:1312 +#: src/datastore/plugin_datastore_sqlite.c:1337 #: src/namecache/plugin_namecache_sqlite.c:603 #: src/namestore/plugin_namestore_sqlite.c:802 #, fuzzy msgid "Sqlite database running\n" msgstr "sqlite 数据仓库" -#: src/datastore/plugin_datastore_template.c:259 +#: src/datastore/plugin_datastore_template.c:253 msgid "Template database running\n" msgstr "" @@ -1882,8 +1939,7 @@ msgstr "" msgid "Prints all packets that go through the DHT." msgstr "" -#: src/dht/gnunet_dht_profiler.c:1161 -#: src/testbed/gnunet-testbed-profiler.c:255 +#: src/dht/gnunet_dht_profiler.c:1161 src/testbed/gnunet-testbed-profiler.c:253 #, fuzzy, c-format msgid "Exiting as the number of peers is %u\n" msgstr "增加 TCP/IP 的最大连接数" @@ -1900,7 +1956,7 @@ msgid "" msgstr "" #: src/dht/gnunet_dht_profiler.c:1200 src/nse/gnunet-nse-profiler.c:853 -#: src/testbed/gnunet-testbed-profiler.c:305 +#: src/testbed/gnunet-testbed-profiler.c:304 msgid "name of the file with the login information for the testbed" msgstr "" @@ -2500,7 +2556,7 @@ msgstr "" msgid "No useful service enabled. Exiting.\n" msgstr "" -#: src/exit/gnunet-daemon-exit.c:3969 +#: src/exit/gnunet-daemon-exit.c:3970 msgid "Daemon to run to provide an IP exit node for the VPN" msgstr "" @@ -2705,7 +2761,7 @@ msgstr "“%s”的参数无效。\n" msgid "Failed to not connect to `%s' service.\n" msgstr "初始化“%s”服务失败。\n" -#: src/fs/fs_misc.c:126 +#: src/fs/fs_misc.c:128 #, c-format msgid "Did not find mime type `%s' in extension list.\n" msgstr "" @@ -3881,7 +3937,7 @@ msgstr "" msgid "Failed to connect to identity service\n" msgstr "初始化“%s”服务失败。\n" -#: src/gns/gnunet-gns-import.c:489 +#: src/gns/gnunet-gns-import.c:452 msgid "This program will import some GNS authorities into your GNS namestore." msgstr "" @@ -3900,109 +3956,109 @@ msgstr "" msgid "%s failed at %s:%d: `%s'\n" msgstr "" -#: src/gns/gnunet-gns-proxy.c:878 +#: src/gns/gnunet-gns-proxy.c:887 #, fuzzy, c-format msgid "Unsupported CURL SSL backend %d\n" msgstr "未知的命令“%s”。\n" -#: src/gns/gnunet-gns-proxy.c:901 +#: src/gns/gnunet-gns-proxy.c:910 #, fuzzy, c-format msgid "Failed to fetch CN from cert: %s\n" msgstr "打开日志文件“%s”失败:%s\n" -#: src/gns/gnunet-gns-proxy.c:924 +#: src/gns/gnunet-gns-proxy.c:933 #, fuzzy, c-format msgid "Failed to initialize DANE: %s\n" msgstr "无法初始化 SQLite:%s。\n" -#: src/gns/gnunet-gns-proxy.c:937 +#: src/gns/gnunet-gns-proxy.c:946 #, fuzzy, c-format msgid "Failed to parse DANE record: %s\n" msgstr "打开日志文件“%s”失败:%s\n" -#: src/gns/gnunet-gns-proxy.c:952 +#: src/gns/gnunet-gns-proxy.c:961 #, fuzzy, c-format msgid "Failed to verify TLS connection using DANE: %s\n" msgstr "解析配置文件“%s”失败\n" -#: src/gns/gnunet-gns-proxy.c:962 +#: src/gns/gnunet-gns-proxy.c:971 #, c-format msgid "Failed DANE verification failed with GnuTLS verify status code: %u\n" msgstr "" -#: src/gns/gnunet-gns-proxy.c:986 +#: src/gns/gnunet-gns-proxy.c:995 #, c-format msgid "SSL certificate subject name (%s) does not match `%s'\n" msgstr "" -#: src/gns/gnunet-gns-proxy.c:1095 +#: src/gns/gnunet-gns-proxy.c:1104 #, c-format msgid "Cookie domain `%s' supplied by server is invalid\n" msgstr "" -#: src/gns/gnunet-gns-proxy.c:1699 +#: src/gns/gnunet-gns-proxy.c:1709 #, fuzzy, c-format msgid "Unsupported HTTP method `%s'\n" msgstr "未知的命令“%s”。\n" -#: src/gns/gnunet-gns-proxy.c:2162 +#: src/gns/gnunet-gns-proxy.c:2172 #, fuzzy, c-format msgid "Unable to import private key from file `%s'\n" msgstr "无法创建用户账户:" -#: src/gns/gnunet-gns-proxy.c:2192 +#: src/gns/gnunet-gns-proxy.c:2202 #, fuzzy, c-format msgid "Unable to import certificate %s\n" msgstr "无法保存配置文件“%s”:" -#: src/gns/gnunet-gns-proxy.c:2365 +#: src/gns/gnunet-gns-proxy.c:2375 #, fuzzy, c-format msgid "Failed to start HTTPS server for `%s'\n" msgstr "初始化“%s”服务失败。\n" -#: src/gns/gnunet-gns-proxy.c:2384 src/rest/gnunet-rest-server.c:533 +#: src/gns/gnunet-gns-proxy.c:2394 src/rest/gnunet-rest-server.c:533 #, fuzzy msgid "Failed to pass client to MHD\n" msgstr "初始化“%s”服务失败。\n" -#: src/gns/gnunet-gns-proxy.c:2704 +#: src/gns/gnunet-gns-proxy.c:2716 #, fuzzy, c-format msgid "Unsupported socks version %d\n" msgstr "未知的命令“%s”。\n" -#: src/gns/gnunet-gns-proxy.c:2733 +#: src/gns/gnunet-gns-proxy.c:2745 #, fuzzy, c-format msgid "Unsupported socks command %d\n" msgstr "未知的命令“%s”。\n" -#: src/gns/gnunet-gns-proxy.c:2751 src/gns/gnunet-gns-proxy.c:2780 +#: src/gns/gnunet-gns-proxy.c:2763 src/gns/gnunet-gns-proxy.c:2792 msgid "SSL connection to plain IPv4 address requested\n" msgstr "" -#: src/gns/gnunet-gns-proxy.c:2830 +#: src/gns/gnunet-gns-proxy.c:2842 #, fuzzy, c-format msgid "Unsupported socks address type %d\n" msgstr "未知的命令“%s”。\n" -#: src/gns/gnunet-gns-proxy.c:3165 src/gns/gnunet-service-gns.c:403 +#: src/gns/gnunet-gns-proxy.c:3177 src/gns/gnunet-service-gns.c:403 #, c-format msgid "No ego configured for `%s`\n" msgstr "" -#: src/gns/gnunet-gns-proxy.c:3226 +#: src/gns/gnunet-gns-proxy.c:3238 #, fuzzy, c-format msgid "Failed to load SSL/TLS key and certificate from `%s'\n" msgstr "解析配置文件“%s”失败\n" -#: src/gns/gnunet-gns-proxy.c:3269 +#: src/gns/gnunet-gns-proxy.c:3281 msgid "listen on specified port (default: 7777)" msgstr "" -#: src/gns/gnunet-gns-proxy.c:3275 +#: src/gns/gnunet-gns-proxy.c:3287 msgid "pem file to use as CA" msgstr "" -#: src/gns/gnunet-gns-proxy.c:3300 +#: src/gns/gnunet-gns-proxy.c:3312 msgid "GNUnet GNS proxy" msgstr "" @@ -4012,7 +4068,7 @@ msgid "Failed to connect to the namecache!\n" msgstr "初始化“%s”服务失败。\n" #: src/gns/gnunet-service-gns.c:461 -#: src/zonemaster/gnunet-service-zonemaster.c:741 +#: src/zonemaster/gnunet-service-zonemaster.c:742 #, fuzzy msgid "Could not connect to DHT!\n" msgstr "无法连接到 %s:%u:%s\n" @@ -4213,36 +4269,36 @@ msgstr "创建用户出错" msgid "Modified %u addresses, wrote %u bytes\n" msgstr "" -#: src/hello/hello.c:1103 +#: src/hello/hello.c:1110 #, fuzzy msgid "Failed to parse HELLO message: missing expiration time\n" msgstr "保存配置失败。" -#: src/hello/hello.c:1112 +#: src/hello/hello.c:1119 #, fuzzy msgid "Failed to parse HELLO message: invalid expiration time\n" msgstr "保存配置失败。" -#: src/hello/hello.c:1122 +#: src/hello/hello.c:1129 #, fuzzy msgid "Failed to parse HELLO message: malformed\n" msgstr "打开日志文件“%s”失败:%s\n" -#: src/hello/hello.c:1133 +#: src/hello/hello.c:1140 msgid "Failed to parse HELLO message: missing transport plugin\n" msgstr "" -#: src/hello/hello.c:1151 +#: src/hello/hello.c:1158 #, c-format msgid "Plugin `%s' not found, skipping address\n" msgstr "" -#: src/hello/hello.c:1159 +#: src/hello/hello.c:1166 #, c-format msgid "Plugin `%s' does not support URIs yet\n" msgstr "" -#: src/hello/hello.c:1174 +#: src/hello/hello.c:1181 #, fuzzy, c-format msgid "Failed to parse `%s' as an address for plugin `%s'\n" msgstr "找不到接口“%s”的一个 IP 地址。\n" @@ -4488,7 +4544,7 @@ msgid "# hostlist advertisements send" msgstr "" #: src/hostlist/gnunet-daemon-hostlist_server.c:679 -#: src/transport/gnunet-service-transport.c:2803 +#: src/transport/gnunet-service-transport.c:2815 msgid "Could not access PEERINFO service. Exiting.\n" msgstr "" @@ -4745,12 +4801,6 @@ msgstr "发送消息失败。\n" msgid "flat plugin running\n" msgstr "sqlite 数据仓库" -#: src/namecache/plugin_namecache_postgres.c:90 -#: src/namestore/plugin_namestore_postgres.c:97 -#, fuzzy -msgid "Failed to create indices\n" -msgstr "发送消息失败。\n" - #: src/namestore/gnunet-namestore.c:301 #, c-format msgid "Adding record failed: %s\n" @@ -4849,8 +4899,7 @@ msgstr "" msgid "Invalid public key for reverse lookup `%s'\n" msgstr "“%s”的参数无效。\n" -#: src/namestore/gnunet-namestore.c:979 -#: src/peerinfo-tool/gnunet-peerinfo.c:775 +#: src/namestore/gnunet-namestore.c:979 src/peerinfo-tool/gnunet-peerinfo.c:775 #, fuzzy, c-format msgid "Invalid URI `%s'\n" msgstr "无效条目。\n" @@ -4990,7 +5039,7 @@ msgstr "初始化“%s”服务失败。\n" msgid "GNU Name System First Come First Serve name registration service" msgstr "" -#: src/namestore/gnunet-service-namestore.c:612 +#: src/namestore/gnunet-service-namestore.c:615 #, fuzzy, c-format msgid "Failed to replicate block in namecache: %s\n" msgstr "发送消息失败。\n" @@ -5317,7 +5366,7 @@ msgid "Measure quality and performance of the NSE service." msgstr "无法访问该服务" #: src/nse/gnunet-service-nse.c:1534 -#: src/revocation/gnunet-service-revocation.c:838 src/util/gnunet-scrypt.c:276 +#: src/revocation/gnunet-service-revocation.c:840 src/util/gnunet-scrypt.c:276 #, fuzzy msgid "Value is too large.\n" msgstr "值不在合法范围内。" @@ -5358,17 +5407,17 @@ msgstr "解析配置文件“%s”失败\n" msgid "Still no peers found in `%s'!\n" msgstr "" -#: src/peerinfo/gnunet-service-peerinfo.c:1076 +#: src/peerinfo/gnunet-service-peerinfo.c:1080 #, fuzzy, c-format msgid "Cleaning up directory `%s'\n" msgstr "解析配置文件“%s”失败\n" -#: src/peerinfo/gnunet-service-peerinfo.c:1405 +#: src/peerinfo/gnunet-service-peerinfo.c:1409 #, c-format msgid "Importing HELLOs from `%s'\n" msgstr "" -#: src/peerinfo/gnunet-service-peerinfo.c:1418 +#: src/peerinfo/gnunet-service-peerinfo.c:1422 msgid "Skipping import of included HELLOs\n" msgstr "" @@ -5516,16 +5565,11 @@ msgstr "创建用户出错" msgid "Unable to create indices: %s.\n" msgstr "发送消息失败。\n" -#: src/postgres/postgres.c:67 +#: src/pq/pq_prepare.c:80 #, fuzzy, c-format -msgid "`%s:%s' failed at %s:%d with error: %s\n" +msgid "PQprepare (`%s' as `%s') failed with error: %s\n" msgstr "“%s”于 %s:%d 处失败,错误为:%s\n" -#: src/postgres/postgres.c:192 -#, fuzzy, c-format -msgid "Unable to connect to Postgres database '%s': %s\n" -msgstr "无法保存配置文件“%s”:" - #: src/psycstore/gnunet-service-psycstore.c:249 #, fuzzy msgid "Failed to store membership information!\n" @@ -5696,60 +5740,60 @@ msgstr "立即保存配置?" msgid "Daemon to announce regular expressions for the peer using cadet." msgstr "" -#: src/regex/gnunet-regex-profiler.c:1314 +#: src/regex/gnunet-regex-profiler.c:1386 msgid "No configuration file given. Exiting\n" msgstr "" -#: src/regex/gnunet-regex-profiler.c:1355 +#: src/regex/gnunet-regex-profiler.c:1427 #: src/regex/gnunet-regex-simulation-profiler.c:630 #, c-format msgid "No policy directory specified on command line. Exiting.\n" msgstr "" -#: src/regex/gnunet-regex-profiler.c:1361 +#: src/regex/gnunet-regex-profiler.c:1433 #: src/regex/gnunet-regex-simulation-profiler.c:638 #, c-format msgid "Specified policies directory does not exist. Exiting.\n" msgstr "" -#: src/regex/gnunet-regex-profiler.c:1368 +#: src/regex/gnunet-regex-profiler.c:1440 #, fuzzy, c-format msgid "No files found in `%s'\n" msgstr "运行 %s失败:%s %d\n" -#: src/regex/gnunet-regex-profiler.c:1377 +#: src/regex/gnunet-regex-profiler.c:1449 msgid "No search strings file given. Exiting.\n" msgstr "" -#: src/regex/gnunet-regex-profiler.c:1397 +#: src/regex/gnunet-regex-profiler.c:1469 #, fuzzy msgid "Error loading search strings. Exiting.\n" msgstr "创建用户出错" -#: src/regex/gnunet-regex-profiler.c:1485 +#: src/regex/gnunet-regex-profiler.c:1557 #, fuzzy msgid "name of the file for writing statistics" msgstr "初始化“%s”服务失败。\n" -#: src/regex/gnunet-regex-profiler.c:1491 +#: src/regex/gnunet-regex-profiler.c:1563 msgid "wait TIMEOUT before ending the experiment" msgstr "" -#: src/regex/gnunet-regex-profiler.c:1497 +#: src/regex/gnunet-regex-profiler.c:1569 msgid "directory with policy files" msgstr "" -#: src/regex/gnunet-regex-profiler.c:1504 +#: src/regex/gnunet-regex-profiler.c:1576 #, fuzzy msgid "name of file with input strings" msgstr "初始化“%s”服务失败。\n" -#: src/regex/gnunet-regex-profiler.c:1510 +#: src/regex/gnunet-regex-profiler.c:1582 #, fuzzy msgid "name of file with hosts' names" msgstr "初始化“%s”服务失败。\n" -#: src/regex/gnunet-regex-profiler.c:1523 +#: src/regex/gnunet-regex-profiler.c:1595 msgid "Profiler for regex" msgstr "" @@ -5911,12 +5955,12 @@ msgstr "" msgid "# revocation set unions completed" msgstr "" -#: src/revocation/gnunet-service-revocation.c:524 -#: src/revocation/gnunet-service-revocation.c:771 +#: src/revocation/gnunet-service-revocation.c:525 +#: src/revocation/gnunet-service-revocation.c:773 msgid "SET service crashed, terminating revocation service\n" msgstr "" -#: src/revocation/gnunet-service-revocation.c:862 +#: src/revocation/gnunet-service-revocation.c:864 #, fuzzy msgid "Could not open revocation database file!" msgstr "无法连接到 %s:%u:%s\n" @@ -5980,9 +6024,9 @@ msgstr "" msgid "Calculate the Vectorproduct with a GNUnet peer." msgstr "" -#: src/scalarproduct/gnunet-service-scalarproduct_alice.c:1407 +#: src/scalarproduct/gnunet-service-scalarproduct_alice.c:1401 #: src/scalarproduct/gnunet-service-scalarproduct_bob.c:1345 -#: src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c:1180 +#: src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c:1172 #: src/scalarproduct/gnunet-service-scalarproduct-ecc_bob.c:1063 #, fuzzy msgid "Connect to CADET failed\n" @@ -6008,7 +6052,7 @@ msgstr "" msgid "also profile decryption" msgstr "" -#: src/set/gnunet-service-set.c:1948 +#: src/set/gnunet-service-set.c:1989 #, fuzzy msgid "Could not connect to CADET service\n" msgstr "无法连接到 %s:%u:%s\n" @@ -6068,114 +6112,114 @@ msgstr "" msgid "say good-bye and leave somebody else's place" msgstr "" -#: src/social/gnunet-social.c:1227 src/social/gnunet-social.c:1232 +#: src/social/gnunet-social.c:1227 msgid "create a place" msgstr "" -#: src/social/gnunet-social.c:1237 +#: src/social/gnunet-social.c:1232 msgid "destroy a place we were hosting" msgstr "" -#: src/social/gnunet-social.c:1242 +#: src/social/gnunet-social.c:1237 msgid "enter somebody else's place" msgstr "" -#: src/social/gnunet-social.c:1248 +#: src/social/gnunet-social.c:1243 msgid "find state matching name prefix" msgstr "" -#: src/social/gnunet-social.c:1253 +#: src/social/gnunet-social.c:1248 msgid "replay history of messages up to the given --limit" msgstr "" -#: src/social/gnunet-social.c:1258 +#: src/social/gnunet-social.c:1253 msgid "reconnect to a previously created place" msgstr "" -#: src/social/gnunet-social.c:1263 +#: src/social/gnunet-social.c:1258 msgid "publish something to a place we are hosting" msgstr "" -#: src/social/gnunet-social.c:1268 +#: src/social/gnunet-social.c:1263 msgid "reconnect to a previously entered place" msgstr "" -#: src/social/gnunet-social.c:1273 +#: src/social/gnunet-social.c:1268 msgid "search for state matching exact name" msgstr "" -#: src/social/gnunet-social.c:1278 +#: src/social/gnunet-social.c:1273 msgid "submit something to somebody's place" msgstr "" -#: src/social/gnunet-social.c:1283 +#: src/social/gnunet-social.c:1278 msgid "list of egos and subscribed places" msgstr "" -#: src/social/gnunet-social.c:1288 +#: src/social/gnunet-social.c:1283 msgid "extract and replay history between message IDs --start and --until" msgstr "" -#: src/social/gnunet-social.c:1297 +#: src/social/gnunet-social.c:1292 msgid "application ID to use when connecting" msgstr "" -#: src/social/gnunet-social.c:1303 +#: src/social/gnunet-social.c:1298 msgid "message body or state value" msgstr "" -#: src/social/gnunet-social.c:1309 +#: src/social/gnunet-social.c:1304 #, fuzzy msgid "name or public key of ego" msgstr "“%s”的参数无效。\n" -#: src/social/gnunet-social.c:1314 +#: src/social/gnunet-social.c:1309 #, fuzzy msgid "wait for incoming messages" msgstr "发送消息失败。\n" -#: src/social/gnunet-social.c:1320 +#: src/social/gnunet-social.c:1315 msgid "GNS name" msgstr "" -#: src/social/gnunet-social.c:1326 +#: src/social/gnunet-social.c:1321 msgid "peer ID for --guest-enter" msgstr "" -#: src/social/gnunet-social.c:1332 +#: src/social/gnunet-social.c:1327 msgid "name (key) to query from state" msgstr "" -#: src/social/gnunet-social.c:1338 +#: src/social/gnunet-social.c:1333 msgid "method name" msgstr "" -#: src/social/gnunet-social.c:1344 +#: src/social/gnunet-social.c:1339 #, fuzzy msgid "number of messages to replay from history" msgstr "每次迭代所使用的消息数量" -#: src/social/gnunet-social.c:1350 +#: src/social/gnunet-social.c:1345 msgid "key address of place" msgstr "" -#: src/social/gnunet-social.c:1356 +#: src/social/gnunet-social.c:1351 msgid "start message ID for history replay" msgstr "" -#: src/social/gnunet-social.c:1361 +#: src/social/gnunet-social.c:1356 msgid "respond to entry requests by admitting all guests" msgstr "" -#: src/social/gnunet-social.c:1367 +#: src/social/gnunet-social.c:1362 msgid "end message ID for history replay" msgstr "" -#: src/social/gnunet-social.c:1372 +#: src/social/gnunet-social.c:1367 msgid "respond to entry requests by refusing all guests" msgstr "" -#: src/social/gnunet-social.c:1382 +#: src/social/gnunet-social.c:1377 msgid "" "gnunet-social - Interact with the social service: enter/leave, send/receive " "messages, access history and state.\n" @@ -6200,7 +6244,7 @@ msgstr "解析配置文件“%s”失败\n" msgid "Wrote %llu bytes of statistics to `%s'\n" msgstr "" -#: src/statistics/gnunet-service-statistics.c:1084 +#: src/statistics/gnunet-service-statistics.c:1086 #, c-format msgid "Loading %llu bytes of statistics from `%s'\n" msgstr "" @@ -6329,7 +6373,7 @@ msgid "Invalid argument `%s'; expecting unsigned int\n" msgstr "“%s”的参数无效。\n" #: src/testbed/generate-underlay-topology.c:342 -#: src/testbed/gnunet-testbed-profiler.c:284 +#: src/testbed/gnunet-testbed-profiler.c:283 msgid "create COUNT number of peers" msgstr "" @@ -6367,13 +6411,13 @@ msgid "" "deployments" msgstr "" -#: src/testbed/gnunet-daemon-testbed-underlay.c:231 src/testing/list-keys.c:46 -#: src/testing/testing.c:288 src/util/gnunet-ecc.c:298 +#: src/testbed/gnunet-daemon-testbed-underlay.c:233 src/testing/list-keys.c:46 +#: src/testing/testing.c:288 src/util/gnunet-ecc.c:306 #, c-format msgid "Incorrect hostkey file format: %s\n" msgstr "" -#: src/testbed/gnunet-daemon-testbed-underlay.c:469 +#: src/testbed/gnunet-daemon-testbed-underlay.c:471 msgid "Daemon to restrict underlay network in testbed deployments" msgstr "" @@ -6447,11 +6491,11 @@ msgstr "" msgid "Spawning process `%s'\n" msgstr "卸载 GNUnet 服务" -#: src/testbed/gnunet-testbed-profiler.c:290 +#: src/testbed/gnunet-testbed-profiler.c:289 msgid "tolerate COUNT number of continious timeout failures" msgstr "" -#: src/testbed/gnunet-testbed-profiler.c:295 +#: src/testbed/gnunet-testbed-profiler.c:294 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 " @@ -6762,43 +6806,43 @@ msgstr "" msgid "# messages dropped due to slow client" msgstr "" -#: src/transport/gnunet-service-transport.c:809 +#: src/transport/gnunet-service-transport.c:818 msgid "# bytes payload dropped (other peer was not connected)" msgstr "" -#: src/transport/gnunet-service-transport.c:1539 +#: src/transport/gnunet-service-transport.c:1551 msgid "# bytes payload discarded due to not connected peer" msgstr "" -#: src/transport/gnunet-service-transport.c:1699 +#: src/transport/gnunet-service-transport.c:1711 msgid "# bytes total received" msgstr "" -#: src/transport/gnunet-service-transport.c:1796 +#: src/transport/gnunet-service-transport.c:1808 msgid "# bytes payload received" msgstr "" -#: src/transport/gnunet-service-transport.c:2113 -#: src/transport/gnunet-service-transport.c:2585 +#: src/transport/gnunet-service-transport.c:2125 +#: src/transport/gnunet-service-transport.c:2597 msgid "# disconnects due to blacklist" msgstr "" -#: src/transport/gnunet-service-transport.c:2589 +#: src/transport/gnunet-service-transport.c:2601 #, fuzzy, c-format msgid "Disallowing connection to peer `%s' on transport %s\n" msgstr "解析配置文件“%s”失败\n" -#: src/transport/gnunet-service-transport.c:2697 +#: src/transport/gnunet-service-transport.c:2709 #, fuzzy, c-format msgid "Adding blacklisting entry for peer `%s'\n" msgstr "卸载 GNUnet 服务" -#: src/transport/gnunet-service-transport.c:2706 +#: src/transport/gnunet-service-transport.c:2718 #, c-format msgid "Adding blacklisting entry for peer `%s':`%s'\n" msgstr "" -#: src/transport/gnunet-service-transport.c:2771 +#: src/transport/gnunet-service-transport.c:2783 #, fuzzy msgid "Transport service is lacking key configuration settings. Exiting.\n" msgstr "立即保存配置?" @@ -6936,64 +6980,64 @@ msgstr "" msgid "SYN request from peer `%s' ignored due impending shutdown\n" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:2620 +#: src/transport/gnunet-service-transport_neighbours.c:2623 msgid "# Attempts to switch addresses" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:3102 +#: src/transport/gnunet-service-transport_neighbours.c:3105 msgid "# SYN_ACK messages received" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:3110 +#: src/transport/gnunet-service-transport_neighbours.c:3113 msgid "# unexpected SYN_ACK messages (no peer)" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:3128 -#: src/transport/gnunet-service-transport_neighbours.c:3152 +#: src/transport/gnunet-service-transport_neighbours.c:3131 +#: src/transport/gnunet-service-transport_neighbours.c:3155 msgid "# unexpected SYN_ACK messages (not ready)" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:3164 +#: src/transport/gnunet-service-transport_neighbours.c:3167 msgid "# unexpected SYN_ACK messages (waiting on ATS)" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:3189 +#: src/transport/gnunet-service-transport_neighbours.c:3192 msgid "# Successful attempts to switch addresses" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:3202 +#: src/transport/gnunet-service-transport_neighbours.c:3205 msgid "# unexpected SYN_ACK messages (disconnecting)" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:3374 +#: src/transport/gnunet-service-transport_neighbours.c:3377 msgid "# ACK messages received" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:3410 +#: src/transport/gnunet-service-transport_neighbours.c:3413 msgid "# unexpected ACK messages" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:3498 +#: src/transport/gnunet-service-transport_neighbours.c:3501 msgid "# quota messages ignored (malformed)" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:3505 +#: src/transport/gnunet-service-transport_neighbours.c:3508 msgid "# QUOTA messages received" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:3545 +#: src/transport/gnunet-service-transport_neighbours.c:3548 msgid "# disconnect messages ignored (malformed)" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:3552 +#: src/transport/gnunet-service-transport_neighbours.c:3555 msgid "# DISCONNECT messages received" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:3563 +#: src/transport/gnunet-service-transport_neighbours.c:3566 msgid "# disconnect messages ignored (timestamp)" msgstr "" -#: src/transport/gnunet-service-transport_neighbours.c:3697 +#: src/transport/gnunet-service-transport_neighbours.c:3700 msgid "# disconnected from peer upon explicit request" msgstr "" @@ -7027,8 +7071,8 @@ msgstr "" #: src/transport/gnunet-service-transport_validation.c:491 #: src/transport/gnunet-service-transport_validation.c:677 -#: src/transport/gnunet-service-transport_validation.c:988 -#: src/transport/gnunet-service-transport_validation.c:1590 +#: src/transport/gnunet-service-transport_validation.c:997 +#: src/transport/gnunet-service-transport_validation.c:1609 #, fuzzy msgid "# validations running" msgstr "sqlite 数据仓库" @@ -7053,57 +7097,57 @@ msgstr "" msgid "# address revalidations started" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1114 +#: src/transport/gnunet-service-transport_validation.c:1123 msgid "# PING message for different peer received" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1165 +#: src/transport/gnunet-service-transport_validation.c:1174 #, c-format msgid "Plugin `%s' not available, cannot confirm having this address\n" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1178 +#: src/transport/gnunet-service-transport_validation.c:1187 msgid "# failed address checks during validation" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1181 +#: src/transport/gnunet-service-transport_validation.c:1190 #, c-format msgid "Address `%s' is not one of my addresses, not confirming PING\n" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1189 +#: src/transport/gnunet-service-transport_validation.c:1198 msgid "# successful address checks during validation" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1202 +#: src/transport/gnunet-service-transport_validation.c:1211 #, c-format msgid "" "Not confirming PING from peer `%s' with address `%s' since I cannot confirm " "having this address.\n" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1257 +#: src/transport/gnunet-service-transport_validation.c:1266 #, fuzzy, c-format msgid "Failed to create PONG signature for peer `%s'\n" msgstr "发送消息失败。\n" -#: src/transport/gnunet-service-transport_validation.c:1308 +#: src/transport/gnunet-service-transport_validation.c:1317 msgid "# PONGs unicast via reliable transport" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1317 +#: src/transport/gnunet-service-transport_validation.c:1326 msgid "# PONGs multicast to all available addresses" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1480 +#: src/transport/gnunet-service-transport_validation.c:1499 msgid "# PONGs dropped, no matching pending validation" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1498 +#: src/transport/gnunet-service-transport_validation.c:1517 msgid "# PONGs dropped, signature expired" msgstr "" -#: src/transport/gnunet-service-transport_validation.c:1553 +#: src/transport/gnunet-service-transport_validation.c:1572 msgid "# validations succeeded" msgstr "" @@ -7290,8 +7334,8 @@ msgid "message size to use" msgstr "消息尺寸" #: src/transport/plugin_transport_http_client.c:1474 -#: src/transport/plugin_transport_http_server.c:2249 -#: src/transport/plugin_transport_http_server.c:3463 +#: src/transport/plugin_transport_http_server.c:2312 +#: src/transport/plugin_transport_http_server.c:3526 #: src/transport/plugin_transport_tcp.c:3890 #: src/transport/plugin_transport_tcp.c:3897 msgid "TCP_STEALTH not supported on this platform.\n" @@ -7303,13 +7347,13 @@ msgid "Could not initialize curl multi handle, failed to start %s plugin!\n" msgstr "" #: src/transport/plugin_transport_http_client.c:2164 -#: src/transport/plugin_transport_http_server.c:3178 +#: src/transport/plugin_transport_http_server.c:3241 #, fuzzy, c-format msgid "Shutting down plugin `%s'\n" msgstr "未知的命令“%s”。\n" #: src/transport/plugin_transport_http_client.c:2181 -#: src/transport/plugin_transport_http_server.c:3248 +#: src/transport/plugin_transport_http_server.c:3311 #, c-format msgid "Shutdown for plugin `%s' complete\n" msgstr "" @@ -7319,106 +7363,106 @@ msgstr "" msgid "Maximum number of requests is %u\n" msgstr "增加 TCP/IP 的最大连接数" -#: src/transport/plugin_transport_http_server.c:1727 +#: src/transport/plugin_transport_http_server.c:1756 #, c-format msgid "" "Access from connection %p (%u of %u) for `%s' `%s' url `%s' with upload data " "size %u\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:1967 +#: src/transport/plugin_transport_http_server.c:2028 #, c-format msgid "Accepting connection (%u of %u) from `%s'\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:1975 +#: src/transport/plugin_transport_http_server.c:2036 #, c-format msgid "" "Server reached maximum number connections (%u), rejecting new connection\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:2125 +#: src/transport/plugin_transport_http_server.c:2186 msgid "" "Could not create a new TLS certificate, program `gnunet-transport-" "certificate-creation' could not be started!\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:2148 +#: src/transport/plugin_transport_http_server.c:2209 #, c-format msgid "No usable TLS certificate found and creating one at `%s/%s' failed!\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:2275 +#: src/transport/plugin_transport_http_server.c:2338 msgid "Could not load or create server certificate! Loading plugin failed!\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:2587 +#: src/transport/plugin_transport_http_server.c:2650 #, fuzzy msgid "Require valid port number for service in configuration!\n" msgstr "保存配置失败。" -#: src/transport/plugin_transport_http_server.c:2752 +#: src/transport/plugin_transport_http_server.c:2815 #, c-format msgid "Found %u addresses to report to NAT service\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:2838 +#: src/transport/plugin_transport_http_server.c:2901 #: src/transport/plugin_transport_udp.c:3622 msgid "Disabling IPv6 since it is not supported on this system!\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:2944 +#: src/transport/plugin_transport_http_server.c:3007 #, c-format msgid "IPv4 support is %s\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:2959 +#: src/transport/plugin_transport_http_server.c:3022 #, c-format msgid "IPv6 support is %s\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:2965 +#: src/transport/plugin_transport_http_server.c:3028 msgid "Neither IPv4 nor IPv6 are enabled! Fix in configuration\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:2976 +#: src/transport/plugin_transport_http_server.c:3039 #, fuzzy msgid "Port is required! Fix in configuration\n" msgstr "" "\n" "结束配置。\n" -#: src/transport/plugin_transport_http_server.c:2982 +#: src/transport/plugin_transport_http_server.c:3045 #, c-format msgid "Using port %u\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:3001 +#: src/transport/plugin_transport_http_server.c:3064 #, c-format msgid "Specific IPv4 address `%s' in configuration file is invalid!\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:3036 +#: src/transport/plugin_transport_http_server.c:3099 #, c-format msgid "Specific IPv6 address `%s' in configuration file is invalid!\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:3111 +#: src/transport/plugin_transport_http_server.c:3174 #, fuzzy, c-format msgid "Using external hostname `%s'\n" msgstr "卸载 GNUnet 服务" -#: src/transport/plugin_transport_http_server.c:3132 +#: src/transport/plugin_transport_http_server.c:3195 #, c-format msgid "Notifying transport only about hostname `%s'\n" msgstr "" -#: src/transport/plugin_transport_http_server.c:3149 +#: src/transport/plugin_transport_http_server.c:3212 #, fuzzy, c-format msgid "Maximum number of connections is %u\n" msgstr "增加 TCP/IP 的最大连接数" -#: src/transport/plugin_transport_http_server.c:3475 +#: src/transport/plugin_transport_http_server.c:3538 #, fuzzy msgid "Unable to compile URL regex\n" msgstr "无法初始化 SQLite:%s。\n" @@ -7731,7 +7775,7 @@ msgid "" "`GNUNET_SERVER_receive_done' after %s\n" msgstr "" -#: src/transport/tcp_service_legacy.c:339 src/util/service.c:2337 +#: src/transport/tcp_service_legacy.c:339 src/util/service.c:2346 #, c-format msgid "Unknown address family %d\n" msgstr "" @@ -7776,51 +7820,51 @@ msgstr "运行 %s失败:%s %d\n" msgid "Service `%s' runs at %s\n" msgstr "" -#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:1501 +#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:1500 msgid "Service process failed to initialize\n" msgstr "" -#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:1505 +#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:1504 msgid "Service process could not initialize server function\n" msgstr "" -#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:1509 +#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:1508 msgid "Service process failed to report status\n" msgstr "" #: src/transport/tcp_service_legacy.c:1313 src/util/disk.c:1488 -#: src/util/service.c:1379 +#: src/util/service.c:1378 #, c-format msgid "Cannot obtain information about user `%s': %s\n" msgstr "无法获取有关用户“%s”的信息:%s\n" -#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1381 +#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1380 msgid "No such user" msgstr "无此用户" -#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1400 +#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1399 #, c-format msgid "Cannot change user/group to `%s': %s\n" msgstr "无法更改用户/组为“%s”:%s\n" -#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:1728 +#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:1727 msgid "do daemonize (detach from terminal)" msgstr "" -#: src/transport/tcp_service_legacy.c:1448 src/util/program.c:244 -#: src/util/service.c:1791 +#: src/transport/tcp_service_legacy.c:1448 src/util/program.c:255 +#: src/util/service.c:1790 #, fuzzy, c-format msgid "Malformed configuration file `%s', exit ...\n" msgstr "解析配置文件“%s”失败\n" -#: src/transport/tcp_service_legacy.c:1458 src/util/program.c:261 -#: src/util/service.c:1802 +#: src/transport/tcp_service_legacy.c:1458 src/util/program.c:272 +#: src/util/service.c:1801 #, fuzzy msgid "Malformed configuration, exit ...\n" msgstr "解析配置文件“%s”失败\n" -#: src/transport/tcp_service_legacy.c:1463 src/util/program.c:256 -#: src/util/service.c:1808 +#: src/transport/tcp_service_legacy.c:1463 src/util/program.c:267 +#: src/util/service.c:1807 #, fuzzy, c-format msgid "Could not access configuration file `%s'\n" msgstr "找不到接口“%s”的一个 IP 地址。\n" @@ -7859,91 +7903,91 @@ msgstr "" msgid "Metadata `%s' failed to deserialize" msgstr "" -#: src/util/client.c:882 +#: src/util/client.c:911 #, c-format msgid "Need a non-empty hostname for service `%s'.\n" msgstr "" -#: src/util/common_logging.c:256 src/util/common_logging.c:1129 +#: src/util/common_logging.c:259 src/util/common_logging.c:1132 msgid "DEBUG" msgstr "调试" -#: src/util/common_logging.c:258 src/util/common_logging.c:1127 +#: src/util/common_logging.c:261 src/util/common_logging.c:1130 msgid "INFO" msgstr "信息" -#: src/util/common_logging.c:260 src/util/common_logging.c:1125 +#: src/util/common_logging.c:263 src/util/common_logging.c:1128 msgid "MESSAGE" msgstr "" -#: src/util/common_logging.c:262 src/util/common_logging.c:1123 +#: src/util/common_logging.c:265 src/util/common_logging.c:1126 msgid "WARNING" msgstr "警告" -#: src/util/common_logging.c:264 src/util/common_logging.c:1121 +#: src/util/common_logging.c:267 src/util/common_logging.c:1124 msgid "ERROR" msgstr "错误" -#: src/util/common_logging.c:266 src/util/common_logging.c:1131 +#: src/util/common_logging.c:269 src/util/common_logging.c:1134 msgid "NONE" msgstr "" -#: src/util/common_logging.c:879 +#: src/util/common_logging.c:882 #, fuzzy, c-format msgid "Message `%.*s' repeated %u times in the last %s\n" msgstr "消息“%.*s”重复了 %u 次,在最近 %llu 秒内\n" -#: src/util/common_logging.c:1132 +#: src/util/common_logging.c:1135 msgid "INVALID" msgstr "" -#: src/util/common_logging.c:1302 +#: src/util/common_logging.c:1326 msgid "unknown address" msgstr "" -#: src/util/common_logging.c:1344 +#: src/util/common_logging.c:1368 msgid "invalid address" msgstr "" -#: src/util/common_logging.c:1362 +#: src/util/common_logging.c:1386 #, fuzzy, c-format msgid "Configuration fails to specify option `%s' in section `%s'!\n" msgstr "配置不满足配置规范文件“%s”的约束!\n" -#: src/util/common_logging.c:1383 +#: src/util/common_logging.c:1407 #, fuzzy, c-format msgid "" "Configuration specifies invalid value for option `%s' in section `%s': %s\n" msgstr "配置不满足配置规范文件“%s”的约束!\n" -#: src/util/configuration.c:286 +#: src/util/configuration.c:296 #, fuzzy, c-format msgid "Syntax error while deserializing in line %u\n" msgstr "配置文件“%s”第 %d 行有语法错误。\n" -#: src/util/configuration.c:344 +#: src/util/configuration.c:355 #, fuzzy, c-format msgid "Error while reading file `%s'\n" msgstr "解析 dscl 输出时出错。\n" -#: src/util/configuration.c:1017 +#: src/util/configuration.c:1034 #, c-format msgid "" "Configuration value '%s' for '%s' in section '%s' is not in set of legal " "choices\n" msgstr "" -#: src/util/configuration.c:1136 +#: src/util/configuration.c:1153 #, c-format msgid "Recursive expansion suspected, aborting $-expansion for term `%s'\n" msgstr "" -#: src/util/configuration.c:1169 +#: src/util/configuration.c:1186 #, fuzzy, c-format msgid "Missing closing `%s' in option `%s'\n" msgstr "配置文件“%s”已写入。\n" -#: src/util/configuration.c:1237 +#: src/util/configuration.c:1254 #, c-format msgid "" "Failed to expand `%s' in `%s' as it is neither found in [PATHS] nor defined " @@ -7957,52 +8001,52 @@ msgid "" "%llu)\n" msgstr "" -#: src/util/crypto_ecc.c:777 +#: src/util/crypto_ecc.c:810 #, fuzzy, c-format msgid "ECC signing failed at %s:%d: %s\n" msgstr "对驱动器“%2$s”的“%1$s”操作失败:%3$u\n" -#: src/util/crypto_ecc.c:827 +#: src/util/crypto_ecc.c:860 #, fuzzy, c-format msgid "EdDSA signing failed at %s:%d: %s\n" msgstr "对驱动器“%2$s”的“%1$s”操作失败:%3$u\n" -#: src/util/crypto_ecc.c:901 +#: src/util/crypto_ecc.c:934 #, fuzzy, c-format msgid "ECDSA signature verification failed at %s:%d: %s\n" msgstr "对驱动器“%2$s”的“%1$s”操作失败:%3$u\n" -#: src/util/crypto_ecc.c:958 +#: src/util/crypto_ecc.c:991 #, fuzzy, c-format msgid "EdDSA signature verification failed at %s:%d: %s\n" msgstr "对驱动器“%2$s”的“%1$s”操作失败:%3$u\n" -#: src/util/crypto_ecc_setup.c:122 src/util/crypto_ecc_setup.c:160 -#: src/util/crypto_ecc_setup.c:278 src/util/crypto_ecc_setup.c:316 +#: src/util/crypto_ecc_setup.c:122 src/util/crypto_ecc_setup.c:161 +#: src/util/crypto_ecc_setup.c:279 src/util/crypto_ecc_setup.c:317 #, fuzzy, c-format msgid "Could not acquire lock on file `%s': %s...\n" msgstr "无法解析“%s”(%s):%s\n" -#: src/util/crypto_ecc_setup.c:127 src/util/crypto_ecc_setup.c:283 +#: src/util/crypto_ecc_setup.c:128 src/util/crypto_ecc_setup.c:284 #, fuzzy msgid "Creating a new private key. This may take a while.\n" msgstr "正在启动数据仓库转换(可能需要一段时间)。\n" -#: src/util/crypto_ecc_setup.c:164 src/util/crypto_ecc_setup.c:320 +#: src/util/crypto_ecc_setup.c:165 src/util/crypto_ecc_setup.c:322 msgid "This may be ok if someone is currently generating a private key.\n" msgstr "" -#: src/util/crypto_ecc_setup.c:194 src/util/crypto_ecc_setup.c:350 +#: src/util/crypto_ecc_setup.c:195 src/util/crypto_ecc_setup.c:352 #, c-format msgid "" "When trying to read key file `%s' I found %u bytes but I need at least %u.\n" msgstr "" -#: src/util/crypto_ecc_setup.c:198 src/util/crypto_ecc_setup.c:354 +#: src/util/crypto_ecc_setup.c:199 src/util/crypto_ecc_setup.c:356 msgid "This may be ok if someone is currently generating a key.\n" msgstr "" -#: src/util/crypto_ecc_setup.c:413 +#: src/util/crypto_ecc_setup.c:415 #, fuzzy msgid "Could not load peer's private key\n" msgstr "找不到接口“%s”的一个 IP 地址。\n" @@ -8193,82 +8237,90 @@ msgstr "" msgid "Manipulate GNUnet configuration files" msgstr "更改配置文件中的一个值" -#: src/util/gnunet-ecc.c:84 +#: src/util/gnunet-ecc.c:94 #, fuzzy, c-format msgid "Failed to open `%s': %s\n" msgstr "打开日志文件“%s”失败:%s\n" -#: src/util/gnunet-ecc.c:120 +#: src/util/gnunet-ecc.c:130 #, c-format msgid "Generating %u keys like %s, please wait" msgstr "" -#: src/util/gnunet-ecc.c:133 +#: src/util/gnunet-ecc.c:143 #, c-format msgid "Generating %u keys, please wait" msgstr "" -#: src/util/gnunet-ecc.c:174 +#: src/util/gnunet-ecc.c:184 #, fuzzy, c-format msgid "" "\n" "Failed to write to `%s': %s\n" msgstr "运行 %s失败:%s %d\n" -#: src/util/gnunet-ecc.c:184 +#: src/util/gnunet-ecc.c:194 #, c-format msgid "" "\n" "Finished!\n" msgstr "" -#: src/util/gnunet-ecc.c:187 +#: src/util/gnunet-ecc.c:197 #, c-format msgid "" "\n" "Error, %u keys not generated\n" msgstr "" -#: src/util/gnunet-ecc.c:280 +#: src/util/gnunet-ecc.c:288 #, c-format msgid "Hostkeys file `%s' not found\n" msgstr "" -#: src/util/gnunet-ecc.c:291 +#: src/util/gnunet-ecc.c:299 #, fuzzy, c-format msgid "Hostkeys file `%s' is empty\n" msgstr "找不到接口“%s”的一个 IP 地址。\n" -#: src/util/gnunet-ecc.c:313 +#: src/util/gnunet-ecc.c:321 #, fuzzy, c-format msgid "Could not read hostkey file: %s\n" msgstr "找不到接口“%s”的一个 IP 地址。\n" -#: src/util/gnunet-ecc.c:364 +#: src/util/gnunet-ecc.c:372 msgid "No hostkey file specified on command line\n" msgstr "" -#: src/util/gnunet-ecc.c:416 +#: src/util/gnunet-ecc.c:437 msgid "list keys included in a file (for testing)" msgstr "" -#: src/util/gnunet-ecc.c:421 +#: src/util/gnunet-ecc.c:442 msgid "number of keys to list included in a file (for testing)" msgstr "" -#: src/util/gnunet-ecc.c:426 +#: src/util/gnunet-ecc.c:447 msgid "create COUNT public-private key pairs (for testing)" msgstr "" -#: src/util/gnunet-ecc.c:430 +#: src/util/gnunet-ecc.c:451 msgid "print the public key in ASCII format" msgstr "" -#: src/util/gnunet-ecc.c:434 +#: src/util/gnunet-ecc.c:455 +msgid "print the private key in ASCII format" +msgstr "" + +#: src/util/gnunet-ecc.c:459 +msgid "print the public key in HEX format" +msgstr "" + +#: src/util/gnunet-ecc.c:463 msgid "print examples of ECC operations (used for compatibility testing)" msgstr "" -#: src/util/gnunet-ecc.c:449 +#: src/util/gnunet-ecc.c:479 #, fuzzy msgid "Manipulate GNUnet private ECC key files" msgstr "更改配置文件中的一个值" @@ -8362,7 +8414,7 @@ msgstr "创建用户出错" msgid "Unable to shorten unix path `%s' while keeping name unique\n" msgstr "" -#: src/util/network.c:1793 src/util/network.c:1969 +#: src/util/network.c:1793 src/util/network.c:1977 #, c-format msgid "" "Fatal internal logic error, process hangs in `%s' (abort with CTRL-C)!\n" @@ -8415,7 +8467,7 @@ msgstr "" msgid "Could not determine plugin installation path.\n" msgstr "无法确定用户界面定义文件。" -#: src/util/resolver_api.c:204 +#: src/util/resolver_api.c:203 #, c-format msgid "" "Missing `%s' for `%s' in configuration, DNS resolution will be unavailable.\n" @@ -8428,32 +8480,32 @@ msgid "" "resolution will be unavailable.\n" msgstr "" -#: src/util/resolver_api.c:815 +#: src/util/resolver_api.c:827 #, c-format msgid "Timeout trying to resolve hostname `%s'.\n" msgstr "" -#: src/util/resolver_api.c:827 +#: src/util/resolver_api.c:840 #, fuzzy, c-format msgid "Timeout trying to resolve IP address `%s'.\n" msgstr "GNUnet 现在使用 IP 地址 %s。\n" -#: src/util/resolver_api.c:1004 +#: src/util/resolver_api.c:1024 msgid "Resolver not configured correctly.\n" msgstr "" -#: src/util/resolver_api.c:1086 src/util/resolver_api.c:1107 -#: src/util/resolver_api.c:1121 +#: src/util/resolver_api.c:1110 src/util/resolver_api.c:1133 +#: src/util/resolver_api.c:1147 #, fuzzy, c-format msgid "Could not resolve our FQDN: %s\n" msgstr "无法解析“%s”(%s):%s\n" -#: src/util/service.c:1306 +#: src/util/service.c:1305 msgid "" "Could not bind to any of the ports I was supposed to, refusing to run!\n" msgstr "" -#: src/util/service.c:2082 +#: src/util/service.c:2091 #, c-format msgid "" "Processing code for message of type %u did not call " @@ -8530,63 +8582,63 @@ msgstr " 天" msgid "end of time" msgstr "" -#: src/util/strings.c:1269 +#: src/util/strings.c:1270 msgid "IPv6 address did not start with `['\n" msgstr "" -#: src/util/strings.c:1277 +#: src/util/strings.c:1278 msgid "IPv6 address did contain ':' to separate port number\n" msgstr "" -#: src/util/strings.c:1283 +#: src/util/strings.c:1284 msgid "IPv6 address did contain ']' before ':' to separate port number\n" msgstr "" -#: src/util/strings.c:1290 +#: src/util/strings.c:1291 msgid "IPv6 address did contain a valid port number after the last ':'\n" msgstr "" -#: src/util/strings.c:1299 +#: src/util/strings.c:1300 #, fuzzy, c-format msgid "Invalid IPv6 address `%s': %s\n" msgstr "无效的进程优先级“%s”\n" -#: src/util/strings.c:1571 src/util/strings.c:1587 +#: src/util/strings.c:1572 src/util/strings.c:1588 msgid "Port not in range\n" msgstr "" -#: src/util/strings.c:1596 +#: src/util/strings.c:1597 #, fuzzy, c-format msgid "Malformed port policy `%s'\n" msgstr "解析配置文件“%s”失败\n" -#: src/util/strings.c:1679 src/util/strings.c:1710 src/util/strings.c:1758 -#: src/util/strings.c:1779 +#: src/util/strings.c:1680 src/util/strings.c:1711 src/util/strings.c:1759 +#: src/util/strings.c:1780 #, c-format msgid "Invalid format for IP: `%s'\n" msgstr "IP 格式无效:“%s”\n" -#: src/util/strings.c:1736 +#: src/util/strings.c:1737 #, c-format msgid "Invalid network notation ('/%d' is not legal in IPv4 CIDR)." msgstr "网络表示法无效(“/%d” 在 IPv4 CIDR 中是非法的)。" -#: src/util/strings.c:1788 +#: src/util/strings.c:1789 #, fuzzy, c-format msgid "Invalid format: `%s'\n" msgstr "IP 格式无效:“%s”\n" -#: src/util/strings.c:1840 +#: src/util/strings.c:1841 #, c-format msgid "Invalid network notation (does not end with ';': `%s')\n" msgstr "无效的网络表示法(没有以“;”结尾:“%s”)\n" -#: src/util/strings.c:1890 +#: src/util/strings.c:1891 #, c-format msgid "Wrong format `%s' for netmask\n" msgstr "网络掩码的格式“%s”错误\n" -#: src/util/strings.c:1921 +#: src/util/strings.c:1922 #, c-format msgid "Wrong format `%s' for network\n" msgstr "网络的格式“%s”错误\n" @@ -8635,63 +8687,63 @@ msgstr "" msgid "# ICMPv6 packets dropped (not allowed)" msgstr "" -#: src/vpn/gnunet-service-vpn.c:2232 +#: src/vpn/gnunet-service-vpn.c:2235 msgid "# Packets received from TUN interface" msgstr "" -#: src/vpn/gnunet-service-vpn.c:2265 src/vpn/gnunet-service-vpn.c:2301 +#: src/vpn/gnunet-service-vpn.c:2268 src/vpn/gnunet-service-vpn.c:2304 #, c-format msgid "Packet received for unmapped destination `%s' (dropping it)\n" msgstr "" -#: src/vpn/gnunet-service-vpn.c:2311 +#: src/vpn/gnunet-service-vpn.c:2314 msgid "Received IPv4 packet with options (dropping it)\n" msgstr "" -#: src/vpn/gnunet-service-vpn.c:2325 +#: src/vpn/gnunet-service-vpn.c:2328 #, c-format msgid "Received packet of unknown protocol %d from TUN (dropping it)\n" msgstr "" -#: src/vpn/gnunet-service-vpn.c:2364 +#: src/vpn/gnunet-service-vpn.c:2367 msgid "Failed to find unallocated IPv4 address in VPN's range\n" msgstr "" -#: src/vpn/gnunet-service-vpn.c:2419 +#: src/vpn/gnunet-service-vpn.c:2422 msgid "Failed to find unallocated IPv6 address in VPN's range\n" msgstr "" -#: src/vpn/gnunet-service-vpn.c:2461 src/vpn/gnunet-service-vpn.c:2683 +#: src/vpn/gnunet-service-vpn.c:2464 src/vpn/gnunet-service-vpn.c:2686 msgid "# Active destinations" msgstr "" -#: src/vpn/gnunet-service-vpn.c:2732 +#: src/vpn/gnunet-service-vpn.c:2735 msgid "Failed to allocate IP address for new destination\n" msgstr "" -#: src/vpn/gnunet-service-vpn.c:2995 +#: src/vpn/gnunet-service-vpn.c:2998 #, fuzzy msgid "Must specify valid IPv6 address" msgstr "“%s”不可用。\n" -#: src/vpn/gnunet-service-vpn.c:3019 +#: src/vpn/gnunet-service-vpn.c:3022 msgid "Must specify valid IPv6 mask" msgstr "" -#: src/vpn/gnunet-service-vpn.c:3027 +#: src/vpn/gnunet-service-vpn.c:3030 msgid "IPv6 support disabled as this system does not support IPv6\n" msgstr "" -#: src/vpn/gnunet-service-vpn.c:3040 +#: src/vpn/gnunet-service-vpn.c:3043 #, fuzzy msgid "Must specify valid IPv4 address" msgstr "“%s”不可用。\n" -#: src/vpn/gnunet-service-vpn.c:3053 +#: src/vpn/gnunet-service-vpn.c:3056 msgid "Must specify valid IPv4 mask" msgstr "" -#: src/vpn/gnunet-service-vpn.c:3063 +#: src/vpn/gnunet-service-vpn.c:3066 msgid "IPv4 support disabled as this system does not support IPv4\n" msgstr "" @@ -8761,28 +8813,40 @@ msgstr "" msgid "Setup tunnels via VPN." msgstr "" -#: src/zonemaster/gnunet-service-zonemaster.c:705 +#: src/zonemaster/gnunet-service-zonemaster.c:706 #, fuzzy msgid "Failed to connect to the namestore!\n" msgstr "初始化“%s”服务失败。\n" -#: src/include/gnunet_common.h:674 src/include/gnunet_common.h:681 -#: src/include/gnunet_common.h:691 src/include/gnunet_common.h:699 +#: src/include/gnunet_common.h:689 src/include/gnunet_common.h:696 +#: src/include/gnunet_common.h:706 src/include/gnunet_common.h:714 #, c-format msgid "Assertion failed at %s:%d.\n" msgstr "" -#: src/include/gnunet_common.h:711 +#: src/include/gnunet_common.h:726 #, c-format msgid "External protocol violation detected at %s:%d.\n" msgstr "" -#: src/include/gnunet_common.h:738 src/include/gnunet_common.h:747 +#: src/include/gnunet_common.h:753 src/include/gnunet_common.h:762 #, c-format msgid "`%s' failed on file `%s' at %s:%d with error: %s\n" msgstr "" #, fuzzy +#~ msgid "Failed to create indices\n" +#~ msgstr "发送消息失败。\n" + +#, fuzzy +#~ msgid "`%s:%s' failed at %s:%d with error: %s\n" +#~ msgstr "“%s”于 %s:%d 处失败,错误为:%s\n" + +#, fuzzy +#~ msgid "Unable to connect to Postgres database '%s': %s\n" +#~ msgstr "无法保存配置文件“%s”:" + +#, fuzzy #~ msgid "Misconfiguration (can not connect to the ARM service)" #~ msgstr "初始化“%s”服务失败。\n" @@ -9079,10 +9143,6 @@ msgstr "" #~ msgstr "初始化“%s”服务失败。\n" #, fuzzy -#~ msgid "Error reading sensor version\n" -#~ msgstr "创建用户出错" - -#, fuzzy #~ msgid "Error reading sensor category\n" #~ msgstr "创建用户出错" @@ -9405,10 +9465,6 @@ msgstr "" #~ msgstr "找不到接口“%s”的一个 IP 地址。\n" #, fuzzy -#~ msgid "Failed to remove records from database" -#~ msgstr "发送消息失败。\n" - -#, fuzzy #~ msgid "Failed to access database" #~ msgstr "打开日志文件“%s”失败:%s\n" diff --git a/src/Makefile.am b/src/Makefile.am @@ -13,7 +13,6 @@ if HAVE_EXPERIMENTAL EXP_DIR = \ rps endif -# dv (FTBFS) if HAVE_JSON if HAVE_MHD diff --git a/src/auction/Makefile.am b/src/auction/Makefile.am @@ -68,6 +68,11 @@ test_auction_api_LDADD = \ check_SCRIPTS = \ test_auction_create.sh +EXTRA_DIST = \ + auction.h \ + auction.conf \ + $(check_SCRIPTS) + 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) $(check_SCRIPTS) diff --git a/src/cadet/cadet_api.c b/src/cadet/cadet_api.c @@ -391,6 +391,8 @@ destroy_channel_on_reconnect_cb (void *cls, /* struct GNUNET_CADET_Handle *handle = cls; */ struct GNUNET_CADET_Channel *ch = value; + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "Destroying channel due to reconnect\n"); destroy_channel (ch); return GNUNET_OK; } @@ -1158,6 +1160,7 @@ reconnect (struct GNUNET_CADET_Handle *h) GNUNET_MQ_handler_end () }; + GNUNET_assert (NULL == h->mq); h->mq = GNUNET_CLIENT_connect (h->cfg, "cadet", handlers, @@ -1196,6 +1199,8 @@ destroy_channel_cb (void *cls, "channel %X not destroyed\n", ntohl (ch->ccn.channel_of_client)); } + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "Destroying channel due to GNUNET_CADET_disconnect()\n"); destroy_channel (ch); return GNUNET_OK; } @@ -1310,6 +1315,8 @@ GNUNET_CADET_channel_destroy (struct GNUNET_CADET_Channel *channel) GNUNET_MQ_send (h->mq, env); } + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "Destroying channel due to GNUNET_CADET_channel_destroy()\n"); destroy_channel (channel); } diff --git a/src/cadet/cadet_test_lib.c b/src/cadet/cadet_test_lib.c @@ -241,6 +241,7 @@ GNUNET_CADET_TEST_cleanup (struct GNUNET_CADET_TEST_Context *ctx) } GNUNET_free (ctx->ops); GNUNET_free (ctx->cadets); + GNUNET_free (ctx->handlers); GNUNET_free (ctx); GNUNET_SCHEDULER_shutdown (); } diff --git a/src/cadet/gnunet-service-cadet_core.c b/src/cadet/gnunet-service-cadet_core.c @@ -623,7 +623,7 @@ timeout_cb (void *cls) { exp = GNUNET_TIME_absolute_add (r->last_use, linger); - if (0 != GNUNET_TIME_absolute_get_duration (exp).rel_value_us) + if (0 != GNUNET_TIME_absolute_get_remaining (exp).rel_value_us) { /* Route not yet timed out, wait until it does. */ timeout_task = GNUNET_SCHEDULER_add_at (exp, @@ -631,6 +631,11 @@ timeout_cb (void *cls) NULL); return; } + GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + "Sending BROKEN due to timeout (%s was last use, %s linger)\n", + GNUNET_STRINGS_absolute_time_to_string (r->last_use), + GNUNET_STRINGS_relative_time_to_string (linger, + GNUNET_YES)); send_broken (&r->prev, &r->cid, NULL, @@ -688,6 +693,8 @@ dir_ready_cb (void *cls, return; } odir = (dir == &route->next) ? &route->prev : &route->next; + GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + "Sending BROKEN due to MQ going down\n"); send_broken (&route->next, &route->cid, GCP_get_id (odir->hop), diff --git a/src/cadet/gnunet-service-cadet_paths.c b/src/cadet/gnunet-service-cadet_paths.c @@ -179,7 +179,7 @@ GCPP_del_connection (struct CadetPeerPath *path, GCC_2s (cc), GCPP_2s (path), off); - GNUNET_assert (off < path->entries_length); /* FIXME: #4909: This assertion fails sometimes! */ + GNUNET_assert (off < path->entries_length); entry = path->entries[off]; GNUNET_assert (cc == entry->cc); entry->cc = NULL; @@ -187,33 +187,51 @@ GCPP_del_connection (struct CadetPeerPath *path, /** - * This path is no longer needed, free resources. + * Tries to attach @a path to a peer, working backwards from the end + * and stopping at @a stop_at. If path->hn is NULL on return then the + * path was not attached and you can assume that path->entries_length + * is equal to @a stop_at. * - * @param path path resources to free + * @param path the path to attach + * @param stop_at the path length at which to stop trying */ static void -path_destroy (struct CadetPeerPath *path) +attach_path (struct CadetPeerPath *path, unsigned int stop_at) { - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Destroying path %s\n", - GCPP_2s (path)); - for (unsigned int i=0;i<path->entries_length;i++) + GNUNET_assert (NULL == path->hn); + + /* Try to attach this path to a peer, working backwards from the end. */ + while (path->entries_length > stop_at) { - struct CadetPeerPathEntry *entry = path->entries[i]; + unsigned int end = path->entries_length - 1; + struct CadetPeerPathEntry *entry = path->entries[end]; + int force = GNUNET_NO; + recalculate_path_desirability (path); + /* If the entry already has a connection using it, force attach. */ if (NULL != entry->cc) - { - struct CadetTConnection *ct; + force = GNUNET_YES; + path->hn = GCP_attach_path (entry->peer, + path, + end, + force); + if (NULL != path->hn) + break; - ct = GCC_get_ct (entry->cc); - if (NULL != ct) - GCT_connection_lost (ct); - GCC_destroy_without_tunnel (entry->cc); - } + /* Attach failed, trim this entry from the path. */ + GNUNET_assert (NULL == entry->cc); + GCP_path_entry_remove (entry->peer, + entry, + end); GNUNET_free (entry); + path->entries[end] = NULL; + path->entries_length--; } - GNUNET_free (path->entries); - GNUNET_free (path); + + /* Shrink array to actual path length. */ + GNUNET_array_grow (path->entries, + path->entries_length, + path->entries_length); } @@ -228,7 +246,6 @@ void GCPP_release (struct CadetPeerPath *path) { struct CadetPeerPathEntry *entry; - int force; LOG (GNUNET_ERROR_TYPE_DEBUG, "Owner releases path %s\n", @@ -236,34 +253,23 @@ GCPP_release (struct CadetPeerPath *path) path->hn = NULL; entry = path->entries[path->entries_length - 1]; GNUNET_assert (path == entry->path); - while (1) + GNUNET_assert (NULL == entry->cc); + /* cut 'off' end of path */ + GCP_path_entry_remove (entry->peer, + entry, + path->entries_length - 1); + GNUNET_free (entry); + path->entries[path->entries_length - 1] = NULL; + path->entries_length--; + /* see if new peer at the end likes this path any better */ + attach_path (path, 0); + if (NULL == path->hn) { - /* cut 'off' end of path */ - GNUNET_assert (NULL == entry->cc); - GCP_path_entry_remove (entry->peer, - entry, - path->entries_length - 1); - path->entries_length--; /* We don't bother shrinking the 'entries' array, - as it's probably not worth it. */ - GNUNET_free (entry); - if (0 == path->entries_length) - break; /* the end */ - - /* see if new peer at the end likes this path any better */ - entry = path->entries[path->entries_length - 1]; - GNUNET_assert (path == entry->path); - force = (NULL == entry->cc) ? GNUNET_NO : GNUNET_YES; - path->hn = GCP_attach_path (entry->peer, - path, - path->entries_length - 1, - force); - if (NULL != path->hn) - return; /* yep, got attached, we are done. */ - GNUNET_assert (GNUNET_NO == force); + /* nobody wants us, discard the path */ + GNUNET_assert (0 == path->entries_length); + GNUNET_assert (NULL == path->entries); + GNUNET_free (path); } - - /* nobody wants us, discard the path */ - path_destroy (path); } @@ -422,33 +428,13 @@ extend_path (struct CadetPeerPath *path, path, path->hn); path->hn = NULL; - for (i=num_peers-1;i>=0;i--) - { - struct CadetPeerPathEntry *entry = path->entries[old_len + i]; - - path->entries_length = old_len + i + 1; - recalculate_path_desirability (path); - if (NULL != entry->cc) - force = GNUNET_YES; - path->hn = GCP_attach_path (peers[i], - path, - old_len + (unsigned int) i, - force); - if (NULL != path->hn) - break; - GCP_path_entry_remove (entry->peer, - entry, - old_len + i); - GNUNET_free (entry); - path->entries[old_len + i] = NULL; - } + path->entries_length = old_len + num_peers; + attach_path (path, old_len); if (NULL == path->hn) { /* none of the peers is interested in this path; - shrink path back and re-attach. */ - GNUNET_array_grow (path->entries, - path->entries_length, - old_len); + re-attach. */ + GNUNET_assert (old_len == path->entries_length); path->hn = GCP_attach_path (path->entries[old_len - 1]->peer, path, old_len - 1, @@ -483,7 +469,6 @@ GCPP_try_path_from_dht (const struct GNUNET_PeerIdentity *get_path, struct CadetPeer *cpath[get_path_length + put_path_length]; struct CheckMatchContext cm_ctx; struct CadetPeerPath *path; - struct GNUNET_CONTAINER_HeapNode *hn; int i; unsigned int skip; unsigned int total_len; @@ -587,39 +572,17 @@ GCPP_try_path_from_dht (const struct GNUNET_PeerIdentity *get_path, } /* Finally, try to attach it */ - hn = NULL; - for (i=total_len-1;i>=0;i--) - { - struct CadetPeerPathEntry *entry = path->entries[i]; - - path->entries_length = i + 1; - recalculate_path_desirability (path); - hn = GCP_attach_path (cpath[i], - path, - (unsigned int) i, - GNUNET_NO); - if (NULL != hn) - break; - GCP_path_entry_remove (entry->peer, - entry, - i); - GNUNET_free (entry); - path->entries[i] = NULL; - } - if (NULL == hn) + attach_path (path, 0); + if (NULL == path->hn) { /* None of the peers on the path care about it. */ LOG (GNUNET_ERROR_TYPE_DEBUG, "Path discovered from DHT is not interesting to us\n"); - GNUNET_free (path->entries); + GNUNET_assert (0 == path->entries_length); + GNUNET_assert (NULL == path->entries); GNUNET_free (path); return; } - path->hn = hn; - /* Shrink path to actual useful length */ - GNUNET_array_grow (path->entries, - path->entries_length, - i + 1); LOG (GNUNET_ERROR_TYPE_DEBUG, "Created new path %s based on information from DHT\n", GCPP_2s (path)); diff --git a/src/cadet/gnunet-service-cadet_peer.c b/src/cadet/gnunet-service-cadet_peer.c @@ -979,7 +979,7 @@ GCP_attach_path (struct CadetPeer *cp, (desirability < root_desirability) ) { LOG (GNUNET_ERROR_TYPE_DEBUG, - "Decided to not attach path %p to peer %s due to undesirability\n", + "Decided to not attach path %s to peer %s due to undesirability\n", GCPP_2s (path), GCP_2s (cp)); return NULL; diff --git a/src/cadet/gnunet-service-cadet_tunnels.c b/src/cadet/gnunet-service-cadet_tunnels.c @@ -2856,7 +2856,9 @@ handle_plaintext_channel_destroy (void *cls, * * @param cls the `struct CadetTunnel` that got the message * @param msg the message - * @return #GNUNET_OK (continue to process) + * @return #GNUNET_OK on success (always) + * #GNUNET_NO to stop further processing (no error) + * #GNUNET_SYSERR to stop further processing with error */ static int handle_decrypted (void *cls, diff --git a/src/cadet/test_cadet.c b/src/cadet/test_cadet.c @@ -58,6 +58,11 @@ struct CadetTestChannelWrapper #define SHORT_TIME GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 20) /** + * How fast do we send messages? + */ +#define SEND_INTERVAL GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MILLISECONDS, 10) + +/** * DIFFERENT TESTS TO RUN */ #define SETUP 0 @@ -269,12 +274,20 @@ show_end_data (void) end_time = GNUNET_TIME_absolute_get (); total_time = GNUNET_TIME_absolute_get_difference (start_time, end_time); - FPRINTF (stderr, "\nResults of test \"%s\"\n", test_name); - FPRINTF (stderr, "Test time %s\n", + FPRINTF (stderr, + "\nResults of test \"%s\"\n", + test_name); + FPRINTF (stderr, + "Test time %s\n", GNUNET_STRINGS_relative_time_to_string (total_time, GNUNET_YES)); - FPRINTF (stderr, "Test bandwidth: %f kb/s\n", 4 * total_packets * 1.0 / (total_time.rel_value_us / 1000)); // 4bytes * ms - FPRINTF (stderr, "Test throughput: %f packets/s\n\n", total_packets * 1000.0 / (total_time.rel_value_us / 1000)); // packets * ms - GAUGER ("CADET", test_name, + FPRINTF (stderr, + "Test bandwidth: %f kb/s\n", + 4 * total_packets * 1.0 / (total_time.rel_value_us / 1000)); // 4bytes * ms + FPRINTF (stderr, + "Test throughput: %f packets/s\n\n", + total_packets * 1000.0 / (total_time.rel_value_us / 1000)); // packets * ms + GAUGER ("CADET", + test_name, total_packets * 1000.0 / (total_time.rel_value_us / 1000), "packets/s"); } @@ -290,13 +303,12 @@ static void disconnect_cadet_peers (void *cls) { long line = (long) cls; - unsigned int i; disconnect_task = NULL; GNUNET_log (GNUNET_ERROR_TYPE_INFO, "disconnecting cadet service of peers, called from line %ld\n", line); - for (i = 0; i < 2; i++) + for (unsigned int i = 0; i < 2; i++) { GNUNET_TESTBED_operation_done (t_op[i]); } @@ -324,7 +336,8 @@ disconnect_cadet_peers (void *cls) static void shutdown_task (void *cls) { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Ending test.\n"); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Ending test.\n"); if (NULL != send_next_msg_task) { GNUNET_SCHEDULER_cancel (send_next_msg_task); @@ -339,7 +352,8 @@ shutdown_task (void *cls) { GNUNET_SCHEDULER_cancel (disconnect_task); disconnect_task = - GNUNET_SCHEDULER_add_now (&disconnect_cadet_peers, (void *) __LINE__); + GNUNET_SCHEDULER_add_now (&disconnect_cadet_peers, + (void *) __LINE__); } } @@ -354,10 +368,14 @@ shutdown_task (void *cls) * operation has executed successfully. */ static void -stats_cont (void *cls, struct GNUNET_TESTBED_Operation *op, const char *emsg) +stats_cont (void *cls, + struct GNUNET_TESTBED_Operation *op, + const char *emsg) { - GNUNET_log (GNUNET_ERROR_TYPE_INFO, " KA sent: %u, KA received: %u\n", - ka_sent, ka_received); + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "KA sent: %u, KA received: %u\n", + ka_sent, + ka_received); if ((KEEPALIVE == test) && ((ka_sent < 2) || (ka_sent > ka_received + 1))) { GNUNET_break (0); @@ -367,7 +385,8 @@ stats_cont (void *cls, struct GNUNET_TESTBED_Operation *op, const char *emsg) if (NULL != disconnect_task) GNUNET_SCHEDULER_cancel (disconnect_task); - disconnect_task = GNUNET_SCHEDULER_add_now (&disconnect_cadet_peers, cls); + disconnect_task = GNUNET_SCHEDULER_add_now (&disconnect_cadet_peers, + cls); } @@ -438,7 +457,6 @@ gather_stats_and_exit (void *cls) } - /** * Abort test: schedule disconnect and shutdown immediately * @@ -450,9 +468,12 @@ abort_test (long line) if (NULL != disconnect_task) { GNUNET_SCHEDULER_cancel (disconnect_task); - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Aborting test from %ld\n", line); + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Aborting test from %ld\n", + line); disconnect_task = - GNUNET_SCHEDULER_add_now (&disconnect_cadet_peers, (void *) line); + GNUNET_SCHEDULER_add_now (&disconnect_cadet_peers, + (void *) line); } } @@ -525,6 +546,7 @@ send_test_message (struct GNUNET_CADET_Channel *channel) GNUNET_MQ_send (GNUNET_CADET_get_mq (channel), env); } + /** * Task to request a new data transmission in a SPEED test, without waiting * for previous messages to be sent/arrrive. @@ -537,7 +559,9 @@ send_next_msg (void *cls) struct GNUNET_CADET_Channel *channel; send_next_msg_task = NULL; - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending next message: %d\n", data_sent); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Sending next message: %d\n", + data_sent); channel = GNUNET_YES == test_backwards ? incoming_ch : outgoing_ch; GNUNET_assert (NULL != channel); @@ -550,9 +574,9 @@ send_next_msg (void *cls) "Scheduling message %d\n", data_sent + 1); send_next_msg_task = - GNUNET_SCHEDULER_add_delayed(GNUNET_TIME_UNIT_SECONDS, - &send_next_msg, - NULL); + GNUNET_SCHEDULER_add_delayed (SEND_INTERVAL, + &send_next_msg, + NULL); } } @@ -571,7 +595,7 @@ reschedule_timeout_task (long line) if (NULL != disconnect_task) { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - " reschedule timeout every 10 messages\n"); + "reschedule timeout every 10 messages\n"); GNUNET_SCHEDULER_cancel (disconnect_task); disconnect_task = GNUNET_SCHEDULER_add_delayed (short_time, &gather_stats_and_exit, @@ -605,7 +629,8 @@ check_data (void *cls, const struct GNUNET_MessageHeader *message) * @param message the actual message */ static void -handle_data (void *cls, const struct GNUNET_MessageHeader *message) +handle_data (void *cls, + const struct GNUNET_MessageHeader *message) { struct CadetTestChannelWrapper *ch = cls; struct GNUNET_CADET_Channel *channel = ch->ch; @@ -770,19 +795,21 @@ connect_handler (void *cls, struct GNUNET_CADET_Channel *channel, * @param channel Connection to the other end (henceforth invalid). */ static void -disconnect_handler (void *cls, const struct GNUNET_CADET_Channel *channel) +disconnect_handler (void *cls, + const struct GNUNET_CADET_Channel *channel) { struct CadetTestChannelWrapper *ch_w = cls; - GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Channel disconnected\n"); + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "Channel disconnected at %d\n", + ok); GNUNET_assert (ch_w->ch == channel); if (channel == incoming_ch) { ok++; incoming_ch = NULL; } - else if (outgoing_ch == channel - ) + else if (outgoing_ch == channel) { if (P2P_SIGNAL == test) { @@ -791,15 +818,17 @@ disconnect_handler (void *cls, const struct GNUNET_CADET_Channel *channel) outgoing_ch = NULL; } else - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Unknown channel! %p\n", channel); - GNUNET_log (GNUNET_ERROR_TYPE_INFO, " ok: %d\n", ok); - + GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + "Unknown channel! %p\n", + channel); if (NULL != disconnect_task) { GNUNET_SCHEDULER_cancel (disconnect_task); disconnect_task = - GNUNET_SCHEDULER_add_now (&gather_stats_and_exit, (void *) __LINE__); + GNUNET_SCHEDULER_add_now (&gather_stats_and_exit, + (void *) __LINE__); } + GNUNET_free (ch_w); } @@ -879,25 +908,34 @@ start_test (void *cls) * NULL if the operation is successfull */ static void -pi_cb (void *cls, struct GNUNET_TESTBED_Operation *op, - const struct GNUNET_TESTBED_PeerInformation *pinfo, const char *emsg) +pi_cb (void *cls, + struct GNUNET_TESTBED_Operation *op, + const struct GNUNET_TESTBED_PeerInformation *pinfo, + const char *emsg) { long i = (long) cls; - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "ID callback for %ld\n", i); - - if ((NULL == pinfo) || (NULL != emsg)) + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "ID callback for %ld\n", + i); + if ( (NULL == pinfo) || + (NULL != emsg) ) { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "pi_cb: %s\n", emsg); + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "pi_cb: %s\n", + emsg); abort_test (__LINE__); return; } p_id[i] = pinfo->result.id; - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, " id: %s\n", GNUNET_i2s (p_id[i])); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "id: %s\n", + GNUNET_i2s (p_id[i])); p_ids++; if (p_ids < 2) return; - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Got all IDs, starting test\n"); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Got all IDs, starting test\n"); test_task = GNUNET_SCHEDULER_add_now (&start_test, NULL); } @@ -929,7 +967,8 @@ tmain (void *cls, disconnect_task = GNUNET_SCHEDULER_add_delayed (short_time, &disconnect_cadet_peers, (void *) __LINE__); - GNUNET_SCHEDULER_add_shutdown (&shutdown_task, NULL); + GNUNET_SCHEDULER_add_shutdown (&shutdown_task, + NULL); t_op[0] = GNUNET_TESTBED_peer_get_information (peers[0], GNUNET_TESTBED_PIT_IDENTITY, &pi_cb, diff --git a/src/conversation/gnunet-helper-audio-playback-gst.c b/src/conversation/gnunet-helper-audio-playback-gst.c @@ -221,6 +221,11 @@ feed_buffer_to_gst (const char *audio, size_t b_len) /** * Message callback + * + * @param msg message we received. + * @return #GNUNET_OK on success, + * #GNUNET_NO to stop further processing due to disconnect (no error) + * #GNUNET_SYSERR to stop further processing due to error */ static int stdin_receiver (void *cls, diff --git a/src/conversation/gnunet-helper-audio-playback.c b/src/conversation/gnunet-helper-audio-playback.c @@ -546,6 +546,11 @@ ogg_demux_and_decode () /** * Message callback + * + * @param msg message we received. + * @return #GNUNET_OK on success, + * #GNUNET_NO to stop further processing due to disconnect (no error) + * #GNUNET_SYSERR to stop further processing due to error */ static int stdin_receiver (void *cls, diff --git a/src/conversation/gnunet_gst.c b/src/conversation/gnunet_gst.c @@ -649,6 +649,11 @@ gnunet_read (GNUNET_gstData * d) /** * Message callback + * + * @param msg message we received. + * @return #GNUNET_OK on success, + * #GNUNET_NO to stop further processing due to disconnect (no error) + * #GNUNET_SYSERR to stop further processing due to error */ static int stdin_receiver (void *cls, diff --git a/src/conversation/microphone.c b/src/conversation/microphone.c @@ -65,7 +65,9 @@ struct Microphone * * @param cls clsoure with our `struct Microphone` * @param msg the message from the helper - * @return #GNUNET_OK on success, #GNUNET_SYSERR on error + * @return #GNUNET_OK on success, + * #GNUNET_NO to stop further processing (no error) + * #GNUNET_SYSERR to stop further processing with error */ static int process_record_messages (void *cls, diff --git a/src/core/gnunet-service-core.c b/src/core/gnunet-service-core.c @@ -426,6 +426,9 @@ struct TokenizerContext * * @param cls reservation request (`struct TokenizerContext`) * @param message the actual message + * @return #GNUNET_OK on success, + * #GNUNET_NO to stop further processing (no error) + * #GNUNET_SYSERR to stop further processing with error */ static int tokenized_cb (void *cls, diff --git a/src/core/gnunet-service-core_kx.c b/src/core/gnunet-service-core_kx.c @@ -708,6 +708,9 @@ setup_fresh_ping (struct GSC_KeyExchangeInfo *kx) * * @param cls the `struct GSC_KeyExchangeInfo` * @param m the message + * @return #GNUNET_OK on success, + * #GNUNET_NO to stop further processing (no error) + * #GNUNET_SYSERR to stop further processing with error */ static int deliver_message (void *cls, @@ -950,7 +953,7 @@ handle_ephemeral_key (void *cls, kx->peer, sizeof (struct GNUNET_PeerIdentity))) { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Received EPHEMERAL_KEY from %s, but expected %s\n", GNUNET_i2s (&m->origin_identity), GNUNET_i2s_full (kx->peer)); diff --git a/src/core/gnunet-service-core_sessions.c b/src/core/gnunet-service-core_sessions.c @@ -147,12 +147,6 @@ struct Session struct GNUNET_TIME_Relative typemap_delay; /** - * Is the neighbour queue empty and thus ready for us - * to transmit an encrypted message? - */ - int ready_to_transmit; - - /** * Is this the first time we're sending the typemap? If so, * we want to send it a bit faster the second time. 0 if * we are sending for the first time, 1 if not. @@ -641,13 +635,7 @@ try_transmission (struct Session *session) enum GNUNET_CORE_Priority maxpc; struct GSC_ClientActiveRequest *car; int excess; - - if (GNUNET_YES != session->ready_to_transmit) - { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Not yet ready to transmit, not evaluating queue\n"); - return; - } + msize = 0; min_deadline = GNUNET_TIME_UNIT_FOREVER_ABS; /* if the peer has excess bandwidth, background traffic is allowed, @@ -801,7 +789,6 @@ try_transmission (struct Session *session) total_bytes / total_msgs, GNUNET_NO); /* now actually transmit... */ - session->ready_to_transmit = GNUNET_NO; GSC_KX_encrypt_and_transmit (session->kx, pbuf, used); @@ -888,10 +875,12 @@ GSC_SESSIONS_solicit (const struct GNUNET_PeerIdentity *pid) { struct Session *session; + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Transport solicits for %s\n", + GNUNET_i2s (pid)); session = find_session (pid); if (NULL == session) return; - session->ready_to_transmit = GNUNET_YES; try_transmission (session); } diff --git a/src/dht/Makefile.am b/src/dht/Makefile.am @@ -197,6 +197,7 @@ test_dht_monitor_LDADD = \ EXTRA_DIST = \ $(check_SCRIPTS) \ + gnunet-service-dht_clients.c \ test_dht_api_data.conf \ test_dht_api_peer1.conf \ test_dht_monitor.conf \ diff --git a/src/dht/gnunet-service-dht.c b/src/dht/gnunet-service-dht.c @@ -55,7 +55,6 @@ static struct GNUNET_TRANSPORT_HelloGetHandle *ghh; struct GNUNET_TIME_Relative hello_expiration; -/* Code shared between different DHT implementations */ #include "gnunet-service-dht_clients.c" diff --git a/src/fs/fs_dirmetascan.c b/src/fs/fs_dirmetascan.c @@ -246,6 +246,9 @@ finish_scan (void *cls) * * @param cls the closure (directory scanner object) * @param msg message from the helper process + * @return #GNUNET_OK on success, + * #GNUNET_NO to stop further processing (no error) + * #GNUNET_SYSERR to stop further processing with error */ static int process_helper_msgs (void *cls, diff --git a/src/fs/test_fs_download_persistence.c b/src/fs/test_fs_download_persistence.c @@ -179,7 +179,6 @@ progress_cb (void *cls, const struct GNUNET_FS_ProgressInfo *event) GNUNET_FS_DOWNLOAD_OPTION_NONE, "download", NULL); break; case GNUNET_FS_STATUS_DOWNLOAD_COMPLETED: - consider_restart (event->status); printf ("Download complete, %llu kbps.\n", (unsigned long long) (FILESIZE * 1000000LL / (1 + diff --git a/src/fs/test_fs_publish_persistence.c b/src/fs/test_fs_publish_persistence.c @@ -134,7 +134,6 @@ progress_cb (void *cls, switch (event->status) { case GNUNET_FS_STATUS_PUBLISH_COMPLETED: - consider_restart (event->status); ret = event->value.publish.cctx; printf ("Publish complete, %llu kbps.\n", (unsigned long long) (FILESIZE * 1000000LL / diff --git a/src/identity-provider/Makefile.am b/src/identity-provider/Makefile.am @@ -30,9 +30,12 @@ bin_PROGRAMS = \ libexec_PROGRAMS = \ gnunet-service-identity-provider +EXTRA_DIST = \ + $(pkgcfg_DATA) + gnunet_service_identity_provider_SOURCES = \ gnunet-service-identity-provider.c \ - identity_token.c + identity_token.c identity_token.h gnunet_service_identity_provider_LDADD = \ $(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \ $(top_builddir)/src/util/libgnunetutil.la \ diff --git a/src/include/Makefile.am b/src/include/Makefile.am @@ -33,6 +33,7 @@ gnunetinclude_HEADERS = \ gnunet_bandwidth_lib.h \ gnunet_bio_lib.h \ gnunet_block_lib.h \ + gnunet_block_group_lib.h \ gnunet_block_plugin.h \ gnunet_client_lib.h \ gnunet_common.h \ @@ -65,7 +66,10 @@ gnunetinclude_HEADERS = \ gnunet_hello_lib.h \ gnunet_helper_lib.h \ gnunet_identity_service.h \ + gnunet_identity_provider_service.h \ gnunet_json_lib.h \ + gnunet_jsonapi_lib.h \ + gnunet_jsonapi_util.h \ gnunet_load_lib.h \ gnunet_cadet_service.h \ gnunet_microphone_lib.h \ @@ -102,6 +106,8 @@ gnunetinclude_HEADERS = \ gnunet_protocols.h \ gnunet_resolver_service.h \ gnunet_regex_service.h \ + gnunet_rest_lib.h \ + gnunet_rest_plugin.h \ gnunet_revocation_service.h \ gnunet_scalarproduct_service.h \ gnunet_scheduler_lib.h \ @@ -111,6 +117,7 @@ gnunetinclude_HEADERS = \ gnunet_signal_lib.h \ gnunet_signatures.h \ gnunet_social_service.h \ + gnunet_socks.h \ gnunet_speaker_lib.h \ gnunet_sq_lib.h \ gnunet_statistics_service.h \ diff --git a/src/include/gnunet_common.h b/src/include/gnunet_common.h @@ -988,7 +988,8 @@ GNUNET_ntoh_double (double d); * arr is important since size is the number of elements and * not the size in bytes * @param size the number of elements in the existing vector (number - * of elements to copy over) + * of elements to copy over), will be updated with the new + * array size * @param tsize the target size for the resulting vector, use 0 to * free the vector (then, arr will be NULL afterwards). */ @@ -996,8 +997,16 @@ GNUNET_ntoh_double (double d); /** * @ingroup memory - * Append an element to a list (growing the - * list by one). + * Append an element to a list (growing the list by one). + * + * @param arr base-pointer of the vector, may be NULL if size is 0; + * will be updated to reflect the new address. The TYPE of + * arr is important since size is the number of elements and + * not the size in bytes + * @param size the number of elements in the existing vector (number + * of elements to copy over), will be updated with the new + * array size + * @param element the element that will be appended to the array */ #define GNUNET_array_append(arr,size,element) do { GNUNET_array_grow(arr,size,size+1); arr[size-1] = element; } while(0) diff --git a/src/include/gnunet_mst_lib.h b/src/include/gnunet_mst_lib.h @@ -61,7 +61,9 @@ struct GNUNET_MessageStreamTokenizer; * * @param cls closure * @param message the actual message - * @return #GNUNET_OK on success, #GNUNET_SYSERR to stop further processing + * @return #GNUNET_OK on success, + * #GNUNET_NO to stop further processing due to disconnect (no error) + * #GNUNET_SYSERR to stop further processing due to error */ typedef int (*GNUNET_MessageTokenizerCallback) (void *cls, diff --git a/src/include/gnunet_network_lib.h b/src/include/gnunet_network_lib.h @@ -464,7 +464,7 @@ GNUNET_NETWORK_fdset_copy (struct GNUNET_NETWORK_FDSet *to, * @return POSIX file descriptor */ int -GNUNET_NETWORK_get_fd (struct GNUNET_NETWORK_Handle *desc); +GNUNET_NETWORK_get_fd (const struct GNUNET_NETWORK_Handle *desc); /** @@ -474,7 +474,7 @@ GNUNET_NETWORK_get_fd (struct GNUNET_NETWORK_Handle *desc); * @return POSIX file descriptor */ struct sockaddr* -GNUNET_NETWORK_get_addr (struct GNUNET_NETWORK_Handle *desc); +GNUNET_NETWORK_get_addr (const struct GNUNET_NETWORK_Handle *desc); /** @@ -484,7 +484,7 @@ GNUNET_NETWORK_get_addr (struct GNUNET_NETWORK_Handle *desc); * @return socklen_t for sockaddr */ socklen_t -GNUNET_NETWORK_get_addrlen (struct GNUNET_NETWORK_Handle *desc); +GNUNET_NETWORK_get_addrlen (const struct GNUNET_NETWORK_Handle *desc); /** diff --git a/src/include/gnunet_protocols.h b/src/include/gnunet_protocols.h @@ -2067,7 +2067,11 @@ extern "C" /** S->C: slave join acknowledgement */ #define GNUNET_MESSAGE_TYPE_PSYC_SLAVE_JOIN_ACK 684 -/* 685-686 */ +/** C->S: request to part from a channel */ +#define GNUNET_MESSAGE_TYPE_PSYC_PART_REQUEST 685 + +/** S->C: acknowledgement that a slave of master parted from a channel */ +#define GNUNET_MESSAGE_TYPE_PSYC_PART_ACK 686 /** M->S->C: incoming join request from multicast */ #define GNUNET_MESSAGE_TYPE_PSYC_JOIN_REQUEST 687 @@ -2258,6 +2262,7 @@ extern "C" */ #define GNUNET_MESSAGE_TYPE_MULTICAST_PART_ACK 755 +// FIXME: this is never used! /** * Group terminated. */ @@ -2398,35 +2403,38 @@ extern "C" /** C->S: request to leave a place */ #define GNUNET_MESSAGE_TYPE_SOCIAL_PLACE_LEAVE 848 +/** S->C: place leave acknowledgement */ +#define GNUNET_MESSAGE_TYPE_SOCIAL_PLACE_LEAVE_ACK 849 + /** C->S: add place to GNS zone */ -#define GNUNET_MESSAGE_TYPE_SOCIAL_ZONE_ADD_PLACE 849 +#define GNUNET_MESSAGE_TYPE_SOCIAL_ZONE_ADD_PLACE 850 /** C->S: add nym to GNS zone */ -#define GNUNET_MESSAGE_TYPE_SOCIAL_ZONE_ADD_NYM 850 +#define GNUNET_MESSAGE_TYPE_SOCIAL_ZONE_ADD_NYM 851 /** C->S: connect application */ -#define GNUNET_MESSAGE_TYPE_SOCIAL_APP_CONNECT 851 +#define GNUNET_MESSAGE_TYPE_SOCIAL_APP_CONNECT 852 /** C->S: detach a place from application */ -#define GNUNET_MESSAGE_TYPE_SOCIAL_APP_DETACH 852 +#define GNUNET_MESSAGE_TYPE_SOCIAL_APP_DETACH 853 /** S->C: notify about an existing ego */ -#define GNUNET_MESSAGE_TYPE_SOCIAL_APP_EGO 853 +#define GNUNET_MESSAGE_TYPE_SOCIAL_APP_EGO 854 /** S->C: end of ego list */ -#define GNUNET_MESSAGE_TYPE_SOCIAL_APP_EGO_END 854 +#define GNUNET_MESSAGE_TYPE_SOCIAL_APP_EGO_END 855 /** S->C: notify about an existing place */ -#define GNUNET_MESSAGE_TYPE_SOCIAL_APP_PLACE 855 +#define GNUNET_MESSAGE_TYPE_SOCIAL_APP_PLACE 856 /** S->C: end of place list */ -#define GNUNET_MESSAGE_TYPE_SOCIAL_APP_PLACE_END 856 +#define GNUNET_MESSAGE_TYPE_SOCIAL_APP_PLACE_END 857 /** C->S: set message processing flags */ -#define GNUNET_MESSAGE_TYPE_SOCIAL_MSG_PROC_SET 860 +#define GNUNET_MESSAGE_TYPE_SOCIAL_MSG_PROC_SET 858 /** C->S: clear message processing flags */ -#define GNUNET_MESSAGE_TYPE_SOCIAL_MSG_PROC_CLEAR 861 +#define GNUNET_MESSAGE_TYPE_SOCIAL_MSG_PROC_CLEAR 859 /******************************************************************************* * X-VINE DHT messages diff --git a/src/include/gnunet_rest_lib.h b/src/include/gnunet_rest_lib.h @@ -32,7 +32,7 @@ #define GNUNET_REST_LIB_H #include "gnunet_util_lib.h" -#include "microhttpd.h" +#include <microhttpd.h> #define GNUNET_REST_HANDLER_END {NULL, NULL, NULL} diff --git a/src/include/gnunet_scheduler_lib.h b/src/include/gnunet_scheduler_lib.h @@ -152,14 +152,14 @@ struct GNUNET_SCHEDULER_FdInfo * NULL if this is about a file handle or if no network * handle was given to the scheduler originally. */ - struct GNUNET_NETWORK_Handle *fd; + const struct GNUNET_NETWORK_Handle *fd; /** * GNUnet file handle the event is about, matches @a sock, * NULL if this is about a network socket or if no network * handle was given to the scheduler originally. */ - struct GNUNET_DISK_FileHandle *fh; + const struct GNUNET_DISK_FileHandle *fh; /** * Type of the event that was generated related to @e sock. @@ -216,17 +216,18 @@ struct GNUNET_SCHEDULER_TaskContext /** * Function used by event-loop implementations to signal the scheduler - * that a particular @a task is ready due to an event of type @a et. + * that a particular @a task is ready due to an event specified in the + * et field of @a fdi. * * This function will then queue the task to notify the application * that the task is ready (with the respective priority). * * @param task the task that is ready - * @param et information about why the task is ready + * @param fdi information about the related FD */ void GNUNET_SCHEDULER_task_ready (struct GNUNET_SCHEDULER_Task *task, - enum GNUNET_SCHEDULER_EventType et); + struct GNUNET_SCHEDULER_FdInfo *fdi); /** @@ -241,15 +242,16 @@ struct GNUNET_SCHEDULER_Handle; * there are tasks left to run just to give other tasks a chance as * well. If we return #GNUNET_YES, the driver should call this * function again as soon as possible, while if we return #GNUNET_NO - * it must block until the operating system has more work as the - * scheduler has no more work to do right now. + * it must block until either the operating system has more work (the + * scheduler has no more work to do right now) or the timeout set by + * the scheduler (using the set_wakeup callback) is reached. * * @param sh scheduler handle that was given to the `loop` * @return #GNUNET_OK if there are more tasks that are ready, * and thus we would like to run more (yield to avoid * blocking other activities for too long) * #GNUNET_NO if we are done running tasks (yield to block) - * #GNUNET_SYSERR on error + * #GNUNET_SYSERR on error, e.g. no tasks were ready */ int GNUNET_SCHEDULER_run_from_driver (struct GNUNET_SCHEDULER_Handle *sh); @@ -268,8 +270,11 @@ struct GNUNET_SCHEDULER_Driver void *cls; /** - * Add a @a task to be run if the conditions given - * in @a fdi are satisfied. + * Add a @a task to be run if the conditions specified in the + * et field of the given @a fdi are satisfied. The et field will + * be cleared after this call and the driver is expected to set + * the type of the actual event before passing @a fdi to + * #GNUNET_SCHEDULER_task_ready. * * @param cls closure * @param task task to add @@ -280,21 +285,21 @@ struct GNUNET_SCHEDULER_Driver int (*add)(void *cls, struct GNUNET_SCHEDULER_Task *task, - struct GNUNET_SCHEDULER_FdInfo *fdi); + struct GNUNET_SCHEDULER_FdInfo *fdi); /** - * Delete a @a task from the set of tasks to be run. + * Delete a @a task from the set of tasks to be run. A task may + * comprise multiple FdInfo entries previously added with the add + * function. The driver is expected to delete them all. * * @param cls closure * @param task task to delete - * @param fdi conditions to watch for (must match @e add call) * @return #GNUNET_OK on success, #GNUNET_SYSERR on failure - * (i.e. @a task or @a fdi do not match prior @e add call) + * (i.e. @a task does not match prior @e add call) */ int (*del)(void *cls, - struct GNUNET_SCHEDULER_Task *task, - const struct GNUNET_SCHEDULER_FdInfo *fdi); + struct GNUNET_SCHEDULER_Task *task); /** * Set time at which we definitively want to get a wakeup call. @@ -309,7 +314,10 @@ struct GNUNET_SCHEDULER_Driver /** * Event loop's "main" function, to be called from * #GNUNET_SCHEDULER_run_with_driver() to actually - * launch the loop. + * launch the loop. The loop should run as long as + * tasks (added by the add callback) are available + * OR the wakeup time (added by the set_wakeup + * callback) is not FOREVER. * * @param cls closure * @param sh scheduler handle to pass to @@ -359,7 +367,7 @@ GNUNET_SCHEDULER_run_with_driver (const struct GNUNET_SCHEDULER_Driver *driver, * * @return NULL on error */ -const struct GNUNET_SCHEDULER_Driver * +struct GNUNET_SCHEDULER_Driver * GNUNET_SCHEDULER_driver_select (void); diff --git a/src/include/gnunet_service_lib.h b/src/include/gnunet_service_lib.h @@ -366,11 +366,16 @@ GNUNET_SERVICE_client_disable_continue_warning (struct GNUNET_SERVICE_Client *c) /** * Ask the server to disconnect from the given client. This is the * same as returning #GNUNET_SYSERR within the check procedure when - * handling a message, wexcept that it allows dropping of a client even + * handling a message, except that it allows dropping of a client even * when not handling a message from that client. The `disconnect_cb` * will be called on @a c even if the application closes the connection * using this function. * + * This function should be called (outside of util's internal logic) + * if (and usually only if) the client has violated the + * protocol. Otherwise, we should leave it to the client to disconnect + * from the service. + * * @param c client to disconnect now */ void diff --git a/src/jsonapi/Makefile.am b/src/jsonapi/Makefile.am @@ -24,7 +24,7 @@ libgnunetjsonapi_la_LDFLAGS = \ -version-info 0:0:0 \ -no-undefined libgnunetjsonapi_la_SOURCES = \ - jsonapi_document.c \ + jsonapi_document.c jsonapi_objects.h \ jsonapi_resource.c \ jsonapi_error.c \ jsonapi_relationship.c diff --git a/src/multicast/Makefile.am b/src/multicast/Makefile.am @@ -19,7 +19,7 @@ endif lib_LTLIBRARIES = libgnunetmulticast.la libgnunetmulticast_la_SOURCES = \ - multicast_api.c + multicast_api.c multicast.h libgnunetmulticast_la_LIBADD = \ $(top_builddir)/src/util/libgnunetutil.la \ $(GN_LIBINTL) $(XLIB) diff --git a/src/multicast/gnunet-service-multicast.c b/src/multicast/gnunet-service-multicast.c @@ -137,6 +137,7 @@ struct Channel */ struct GNUNET_CADET_Channel *channel; + // FIXME: not used /** * CADET transmission handle. */ @@ -228,7 +229,7 @@ struct Group /** * Is the client disconnected? #GNUNET_YES or #GNUNET_NO */ - uint8_t disconnected; + uint8_t is_disconnected; /** * Is this an origin (#GNUNET_YES), or member (#GNUNET_NO)? @@ -365,6 +366,8 @@ client_send_join_decision (struct Member *mem, static void shutdown_task (void *cls) { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "shutting down\n"); if (NULL != cadet) { GNUNET_CADET_disconnect (cadet); @@ -420,6 +423,11 @@ cleanup_member (struct Member *mem) GNUNET_free (mem->join_dcsn); mem->join_dcsn = NULL; } + if (NULL != mem->origin_channel) + { + GNUNET_CADET_channel_destroy (mem->origin_channel->channel); + mem->origin_channel = NULL; + } GNUNET_CONTAINER_multihashmap_remove (members, &grp->pub_key_hash, mem); GNUNET_free (mem); } @@ -553,36 +561,47 @@ client_send (struct GNUNET_SERVICE_Client *client, * Send message to all clients connected to the group. */ static void -client_send_group (const struct Group *grp, - const struct GNUNET_MessageHeader *msg) +client_send_group_keep_envelope (const struct Group *grp, + struct GNUNET_MQ_Envelope *env) { - GNUNET_log (GNUNET_ERROR_TYPE_INFO, - "%p Sending message to all clients of the group.\n", grp); + struct ClientList *cli = grp->clients_head; - struct ClientList *cl = grp->clients_head; - while (NULL != cl) + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "%p Sending message to all clients of the group.\n", + grp); + while (NULL != cli) { - struct GNUNET_MQ_Envelope * - env = GNUNET_MQ_msg_copy (msg); - - GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq (cl->client), - env); - cl = cl->next; + GNUNET_MQ_send_copy (GNUNET_SERVICE_client_get_mq (cli->client), + env); + cli = cli->next; } } /** + * Send message to all clients connected to the group and + * takes care of freeing @env. + */ +static void +client_send_group (const struct Group *grp, + struct GNUNET_MQ_Envelope *env) +{ + client_send_group_keep_envelope (grp, env); + GNUNET_MQ_discard (env); +} + + +/** * Iterator callback for sending a message to origin clients. */ static int client_send_origin_cb (void *cls, const struct GNUNET_HashCode *pub_key_hash, void *origin) { - const struct GNUNET_MessageHeader *msg = cls; + struct GNUNET_MQ_Envelope *env = cls; struct Member *orig = origin; - client_send_group (&orig->group, msg); + client_send_group_keep_envelope (&orig->group, env); return GNUNET_YES; } @@ -594,12 +613,12 @@ static int client_send_member_cb (void *cls, const struct GNUNET_HashCode *pub_key_hash, void *member) { - const struct GNUNET_MessageHeader *msg = cls; + struct GNUNET_MQ_Envelope *env = cls; struct Member *mem = member; if (NULL != mem->join_dcsn) { /* Only send message to admitted members */ - client_send_group (&mem->group, msg); + client_send_group_keep_envelope (&mem->group, env); } return GNUNET_YES; } @@ -615,15 +634,16 @@ client_send_member_cb (void *cls, const struct GNUNET_HashCode *pub_key_hash, */ static int client_send_all (struct GNUNET_HashCode *pub_key_hash, - const struct GNUNET_MessageHeader *msg) + struct GNUNET_MQ_Envelope *env) { int n = 0; n += GNUNET_CONTAINER_multihashmap_get_multiple (origins, pub_key_hash, client_send_origin_cb, - (void *) msg); + (void *) env); n += GNUNET_CONTAINER_multihashmap_get_multiple (members, pub_key_hash, client_send_member_cb, - (void *) msg); + (void *) env); + GNUNET_MQ_discard (env); return n; } @@ -636,14 +656,14 @@ client_send_all (struct GNUNET_HashCode *pub_key_hash, */ static int client_send_random (struct GNUNET_HashCode *pub_key_hash, - const struct GNUNET_MessageHeader *msg) + struct GNUNET_MQ_Envelope *env) { int n = 0; n = GNUNET_CONTAINER_multihashmap_get_random (origins, client_send_origin_cb, - (void *) msg); + (void *) env); if (n <= 0) n = GNUNET_CONTAINER_multihashmap_get_random (members, client_send_member_cb, - (void *) msg); + (void *) env); return n; } @@ -658,12 +678,12 @@ client_send_random (struct GNUNET_HashCode *pub_key_hash, */ static int client_send_origin (struct GNUNET_HashCode *pub_key_hash, - const struct GNUNET_MessageHeader *msg) + struct GNUNET_MQ_Envelope *env) { int n = 0; n += GNUNET_CONTAINER_multihashmap_get_multiple (origins, pub_key_hash, client_send_origin_cb, - (void *) msg); + (void *) env); return n; } @@ -677,17 +697,12 @@ client_send_origin (struct GNUNET_HashCode *pub_key_hash, static void client_send_ack (struct GNUNET_HashCode *pub_key_hash) { + struct GNUNET_MQ_Envelope *env; + GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Sending message ACK to client.\n"); - - static struct GNUNET_MessageHeader *msg = NULL; - if (NULL == msg) - { - msg = GNUNET_malloc (sizeof (*msg)); - msg->type = htons (GNUNET_MESSAGE_TYPE_MULTICAST_FRAGMENT_ACK); - msg->size = htons (sizeof (*msg)); - } - client_send_all (pub_key_hash, msg); + env = GNUNET_MQ_msg_header (GNUNET_MESSAGE_TYPE_MULTICAST_FRAGMENT_ACK); + client_send_all (pub_key_hash, env); } @@ -983,7 +998,8 @@ handle_cadet_join_request (void *cls, chn->peer = req->peer; chn->join_status = JOIN_WAITING; - client_send_all (&group_pub_hash, &req->header); + client_send_all (&group_pub_hash, + GNUNET_MQ_msg_copy (&req->header)); } @@ -1102,7 +1118,8 @@ handle_cadet_message (void *cls, { struct Channel *chn = cls; GNUNET_CADET_receive_done (chn->channel); - client_send_all (&chn->group_pub_hash, &msg->header); + client_send_all (&chn->group_pub_hash, + GNUNET_MQ_msg_copy (&msg->header)); } @@ -1153,30 +1170,32 @@ handle_cadet_request (void *cls, { struct Channel *chn = cls; GNUNET_CADET_receive_done (chn->channel); - client_send_origin (&chn->group_pub_hash, &req->header); + client_send_origin (&chn->group_pub_hash, + GNUNET_MQ_msg_copy (&req->header)); } -static int -check_cadet_replay_request (void *cls, - const struct MulticastReplayRequestMessage *req) -{ - uint16_t size = ntohs (req->header.size); - if (size < sizeof (*req)) - { - GNUNET_break_op (0); - return GNUNET_SYSERR; - } - - struct Channel *chn = cls; - if (NULL == chn) - { - GNUNET_break_op (0); - return GNUNET_SYSERR; - } - - return GNUNET_OK; -} +// FIXME: do checks in handle_cadet_replay_request +//static int +//check_cadet_replay_request (void *cls, +// const struct MulticastReplayRequestMessage *req) +//{ +// uint16_t size = ntohs (req->header.size); +// if (size < sizeof (*req)) +// { +// GNUNET_break_op (0); +// return GNUNET_SYSERR; +// } +// +// struct Channel *chn = cls; +// if (NULL == chn) +// { +// GNUNET_break_op (0); +// return GNUNET_SYSERR; +// } +// +// return GNUNET_OK; +//} /** @@ -1187,6 +1206,7 @@ handle_cadet_replay_request (void *cls, const struct MulticastReplayRequestMessage *req) { struct Channel *chn = cls; + GNUNET_CADET_receive_done (chn->channel); struct MulticastReplayRequestMessage rep = *req; @@ -1203,12 +1223,16 @@ handle_cadet_replay_request (void *cls, GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST); } struct GNUNET_HashCode key_hash; - replay_key_hash (rep.fragment_id, rep.message_id, rep.fragment_offset, - rep.flags, &key_hash); + replay_key_hash (rep.fragment_id, + rep.message_id, + rep.fragment_offset, + rep.flags, + &key_hash); GNUNET_CONTAINER_multihashmap_put (grp_replay_req, &key_hash, chn, GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE); - client_send_random (&chn->group_pub_hash, &rep.header); + client_send_random (&chn->group_pub_hash, + GNUNET_MQ_msg_copy (&rep.header)); } @@ -1290,10 +1314,10 @@ cadet_channel_create (struct Group *grp, struct GNUNET_PeerIdentity *peer) struct MulticastJoinDecisionMessageHeader, chn), - GNUNET_MQ_hd_var_size (cadet_replay_request, - GNUNET_MESSAGE_TYPE_MULTICAST_REPLAY_REQUEST, - struct MulticastReplayRequestMessage, - chn), + GNUNET_MQ_hd_fixed_size (cadet_replay_request, + GNUNET_MESSAGE_TYPE_MULTICAST_REPLAY_REQUEST, + struct MulticastReplayRequestMessage, + chn), GNUNET_MQ_hd_var_size (cadet_replay_response, GNUNET_MESSAGE_TYPE_MULTICAST_REPLAY_RESPONSE, @@ -1357,6 +1381,7 @@ handle_client_origin_start (void *cls, grp->is_origin = GNUNET_YES; grp->pub_key = pub_key; grp->pub_key_hash = pub_key_hash; + grp->is_disconnected = GNUNET_NO; GNUNET_CONTAINER_multihashmap_put (origins, &grp->pub_key_hash, orig, GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST); @@ -1379,10 +1404,10 @@ handle_client_origin_start (void *cls, struct MulticastJoinRequestMessage, grp), - GNUNET_MQ_hd_var_size (cadet_replay_request, - GNUNET_MESSAGE_TYPE_MULTICAST_REPLAY_REQUEST, - struct MulticastReplayRequestMessage, - grp), + GNUNET_MQ_hd_fixed_size (cadet_replay_request, + GNUNET_MESSAGE_TYPE_MULTICAST_REPLAY_REQUEST, + struct MulticastReplayRequestMessage, + grp), GNUNET_MQ_hd_var_size (cadet_replay_response, GNUNET_MESSAGE_TYPE_MULTICAST_REPLAY_RESPONSE, @@ -1484,6 +1509,7 @@ handle_client_member_join (void *cls, grp->is_origin = GNUNET_NO; grp->pub_key = msg->group_pub_key; grp->pub_key_hash = pub_key_hash; + grp->is_disconnected = GNUNET_NO; group_set_cadet_port_hash (grp); if (NULL == grp_mem) @@ -1494,7 +1520,8 @@ handle_client_member_join (void *cls, } GNUNET_CONTAINER_multihashmap_put (grp_mem, &mem->pub_key_hash, mem, GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST); - + + // FIXME: should the members hash map have option UNIQUE_FAST? GNUNET_CONTAINER_multihashmap_put (members, &grp->pub_key_hash, mem, GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE); } @@ -1509,10 +1536,11 @@ handle_client_member_join (void *cls, char *str = GNUNET_CRYPTO_ecdsa_public_key_to_string (&mem->pub_key); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Client connected to group %s as member %s (%s).\n", + "Client connected to group %s as member %s (%s). size = %d\n", GNUNET_h2s (&grp->pub_key_hash), GNUNET_h2s2 (&mem->pub_key_hash), - str); + str, + GNUNET_CONTAINER_multihashmap_size (members)); GNUNET_free (str); if (NULL != mem->join_dcsn) @@ -1567,7 +1595,9 @@ handle_client_member_join (void *cls, GNUNET_free (mem->join_req); mem->join_req = req; - if (0 == client_send_origin (&grp->pub_key_hash, &mem->join_req->header)) + if (0 == + client_send_origin (&grp->pub_key_hash, + GNUNET_MQ_msg_copy (&mem->join_req->header))) { /* No local origins, send to remote origin */ cadet_send_join_request (mem); } @@ -1580,7 +1610,7 @@ static void client_send_join_decision (struct Member *mem, const struct MulticastJoinDecisionMessageHeader *hdcsn) { - client_send_group (&mem->group, &hdcsn->header); + client_send_group (&mem->group, GNUNET_MQ_msg_copy (&hdcsn->header)); const struct MulticastJoinDecisionMessage * dcsn = (const struct MulticastJoinDecisionMessage *) &hdcsn[1]; @@ -1621,8 +1651,9 @@ handle_client_join_decision (void *cls, GNUNET_SERVICE_client_drop (client); return; } + GNUNET_assert (GNUNET_NO == grp->is_disconnected); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "%p Got join decision from client for group %s..\n", + "%p got join decision from client for group %s..\n", grp, GNUNET_h2s (&grp->pub_key_hash)); struct GNUNET_CONTAINER_MultiHashMap * @@ -1652,6 +1683,32 @@ handle_client_join_decision (void *cls, } +static void +handle_client_part_request (void *cls, + const struct GNUNET_MessageHeader *msg) +{ + struct Client *c = cls; + struct GNUNET_SERVICE_Client *client = c->client; + struct Group *grp = c->group; + struct GNUNET_MQ_Envelope *env; + + if (NULL == grp) + { + GNUNET_break (0); + GNUNET_SERVICE_client_drop (client); + return; + } + GNUNET_assert (GNUNET_NO == grp->is_disconnected); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "%p got part request from client for group %s.\n", + grp, GNUNET_h2s (&grp->pub_key_hash)); + grp->is_disconnected = GNUNET_YES; + env = GNUNET_MQ_msg_header (GNUNET_MESSAGE_TYPE_MULTICAST_PART_ACK); + client_send_group (grp, env); + GNUNET_SERVICE_client_continue (client); +} + + static int check_client_multicast_message (void *cls, const struct GNUNET_MULTICAST_MessageHeader *msg) @@ -1667,6 +1724,7 @@ static void handle_client_multicast_message (void *cls, const struct GNUNET_MULTICAST_MessageHeader *msg) { + // FIXME: what if GNUNET_YES == grp->is_disconnected? Do we allow sending messages? struct Client *c = cls; struct GNUNET_SERVICE_Client *client = c->client; struct Group *grp = c->group; @@ -1680,6 +1738,7 @@ handle_client_multicast_message (void *cls, GNUNET_assert (GNUNET_YES == grp->is_origin); struct Origin *orig = grp->origin; + // FIXME: use GNUNET_MQ_msg_copy /* FIXME: yucky, should use separate message structs for P2P and CS! */ struct GNUNET_MULTICAST_MessageHeader * out = (struct GNUNET_MULTICAST_MessageHeader *) GNUNET_copy_message (&msg->header); @@ -1696,7 +1755,7 @@ handle_client_multicast_message (void *cls, GNUNET_assert (0); } - client_send_all (&grp->pub_key_hash, &out->header); + client_send_all (&grp->pub_key_hash, GNUNET_MQ_msg_copy (&out->header)); cadet_send_children (&grp->pub_key_hash, &out->header); client_send_ack (&grp->pub_key_hash); GNUNET_free (out); @@ -1730,6 +1789,7 @@ handle_client_multicast_request (void *cls, GNUNET_SERVICE_client_drop (client); return; } + GNUNET_assert (GNUNET_NO == grp->is_disconnected); GNUNET_assert (GNUNET_NO == grp->is_origin); struct Member *mem = grp->member; @@ -1751,7 +1811,9 @@ handle_client_multicast_request (void *cls, } uint8_t send_ack = GNUNET_YES; - if (0 == client_send_origin (&grp->pub_key_hash, &out->header)) + if (0 == + client_send_origin (&grp->pub_key_hash, + GNUNET_MQ_msg_copy (&out->header))) { /* No local origins, send to remote origin */ if (NULL != mem->origin_channel) { @@ -1792,6 +1854,7 @@ handle_client_replay_request (void *cls, GNUNET_SERVICE_client_drop (client); return; } + GNUNET_assert (GNUNET_NO == grp->is_disconnected); GNUNET_assert (GNUNET_NO == grp->is_origin); struct Member *mem = grp->member; @@ -1812,7 +1875,9 @@ handle_client_replay_request (void *cls, GNUNET_CONTAINER_multihashmap_put (grp_replay_req, &key_hash, client, GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE); - if (0 == client_send_origin (&grp->pub_key_hash, &rep->header)) + if (0 == + client_send_origin (&grp->pub_key_hash, + GNUNET_MQ_msg_copy (&rep->header))) { /* No local origin, replay from remote members / origin. */ if (NULL != mem->origin_channel) { @@ -1821,6 +1886,7 @@ handle_client_replay_request (void *cls, else { /* FIXME: not yet connected to origin */ + GNUNET_assert (0); GNUNET_SERVICE_client_drop (client); return; } @@ -1880,6 +1946,7 @@ handle_client_replay_response_end (void *cls, GNUNET_SERVICE_client_drop (client); return; } + GNUNET_assert (GNUNET_NO == grp->is_disconnected); struct GNUNET_HashCode key_hash; replay_key_hash (res->fragment_id, res->message_id, res->fragment_offset, @@ -1939,6 +2006,7 @@ handle_client_replay_response (void *cls, GNUNET_SERVICE_client_drop (client); return; } + GNUNET_assert (GNUNET_NO == grp->is_disconnected); const struct GNUNET_MessageHeader *msg = &res->header; if (GNUNET_MULTICAST_REC_OK == res->error_code) @@ -2033,9 +2101,14 @@ client_notify_disconnect (void *cls, grp, (GNUNET_YES == grp->is_origin) ? "origin" : "member", GNUNET_h2s (&grp->pub_key_hash)); + // FIXME (due to protocol change): here we must not remove all clients, + // only the one we were notified about! struct ClientList *cl = grp->clients_head; while (NULL != cl) { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "iterating clients for group %p\n", + grp); if (cl->client == client) { GNUNET_CONTAINER_DLL_remove (grp->clients_head, grp->clients_tail, cl); @@ -2049,16 +2122,7 @@ client_notify_disconnect (void *cls, if (NULL == grp->clients_head) { /* Last client disconnected. */ -#if FIXME - if (NULL != grp->tmit_head) - { /* Send pending messages via CADET before cleanup. */ - transmit_message (grp); - } - else -#endif - { - cleanup_group (grp); - } + cleanup_group (grp); } } @@ -2103,9 +2167,9 @@ run (void *cls, GNUNET_SERVICE_MAIN ("multicast", GNUNET_SERVICE_OPTION_NONE, - run, - client_notify_connect, - client_notify_disconnect, + &run, + &client_notify_connect, + &client_notify_disconnect, NULL, GNUNET_MQ_hd_fixed_size (client_origin_start, GNUNET_MESSAGE_TYPE_MULTICAST_ORIGIN_START, @@ -2119,6 +2183,10 @@ GNUNET_SERVICE_MAIN GNUNET_MESSAGE_TYPE_MULTICAST_JOIN_DECISION, struct MulticastJoinDecisionMessageHeader, NULL), + GNUNET_MQ_hd_fixed_size (client_part_request, + GNUNET_MESSAGE_TYPE_MULTICAST_PART_REQUEST, + struct GNUNET_MessageHeader, + NULL), GNUNET_MQ_hd_var_size (client_multicast_message, GNUNET_MESSAGE_TYPE_MULTICAST_MESSAGE, struct GNUNET_MULTICAST_MessageHeader, diff --git a/src/multicast/multicast_api.c b/src/multicast/multicast_api.c @@ -542,31 +542,12 @@ group_cleanup (struct GNUNET_MULTICAST_Group *grp) static void -group_disconnect (struct GNUNET_MULTICAST_Group *grp, - GNUNET_ContinuationCallback cb, - void *cls) +handle_group_part_ack (void *cls, + const struct GNUNET_MessageHeader *msg) { - grp->is_disconnecting = GNUNET_YES; - grp->disconnect_cb = cb; - grp->disconnect_cls = cls; + struct GNUNET_MULTICAST_Group *grp = cls; - if (NULL != grp->mq) - { - struct GNUNET_MQ_Envelope *last = GNUNET_MQ_get_last_envelope (grp->mq); - if (NULL != last) - { - GNUNET_MQ_notify_sent (last, - (GNUNET_SCHEDULER_TaskCallback) group_cleanup, grp); - } - else - { - group_cleanup (grp); - } - } - else - { - group_cleanup (grp); - } + group_cleanup (grp); } @@ -779,6 +760,10 @@ origin_connect (struct GNUNET_MULTICAST_Origin *orig) GNUNET_MESSAGE_TYPE_MULTICAST_JOIN_REQUEST, struct MulticastJoinRequestMessage, grp), + GNUNET_MQ_hd_fixed_size (group_part_ack, + GNUNET_MESSAGE_TYPE_MULTICAST_PART_ACK, + struct GNUNET_MessageHeader, + grp), GNUNET_MQ_hd_fixed_size (group_replay_request, GNUNET_MESSAGE_TYPE_MULTICAST_REPLAY_REQUEST, struct MulticastReplayRequestMessage, @@ -879,8 +864,13 @@ GNUNET_MULTICAST_origin_stop (struct GNUNET_MULTICAST_Origin *orig, void *stop_cls) { struct GNUNET_MULTICAST_Group *grp = &orig->grp; + struct GNUNET_MQ_Envelope *env; - group_disconnect (grp, stop_cb, stop_cls); + grp->is_disconnecting = GNUNET_YES; + grp->disconnect_cb = stop_cb; + grp->disconnect_cls = stop_cls; + env = GNUNET_MQ_msg_header (GNUNET_MESSAGE_TYPE_MULTICAST_PART_REQUEST); + GNUNET_MQ_send (grp->mq, env); } @@ -1065,6 +1055,10 @@ member_connect (struct GNUNET_MULTICAST_Member *mem) GNUNET_MESSAGE_TYPE_MULTICAST_JOIN_DECISION, struct MulticastJoinDecisionMessageHeader, mem), + GNUNET_MQ_hd_fixed_size (group_part_ack, + GNUNET_MESSAGE_TYPE_MULTICAST_PART_ACK, + struct GNUNET_MessageHeader, + grp), GNUNET_MQ_hd_fixed_size (group_replay_request, GNUNET_MESSAGE_TYPE_MULTICAST_REPLAY_REQUEST, struct MulticastReplayRequestMessage, @@ -1198,16 +1192,19 @@ GNUNET_MULTICAST_member_part (struct GNUNET_MULTICAST_Member *mem, GNUNET_ContinuationCallback part_cb, void *part_cls) { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "%p Member parting.\n", mem); struct GNUNET_MULTICAST_Group *grp = &mem->grp; + struct GNUNET_MQ_Envelope *env; mem->join_dcsn_cb = NULL; grp->join_req_cb = NULL; grp->message_cb = NULL; grp->replay_msg_cb = NULL; grp->replay_frag_cb = NULL; - - group_disconnect (grp, part_cb, part_cls); + grp->is_disconnecting = GNUNET_YES; + grp->disconnect_cb = part_cb; + grp->disconnect_cls = part_cls; + env = GNUNET_MQ_msg_header (GNUNET_MESSAGE_TYPE_MULTICAST_PART_REQUEST); + GNUNET_MQ_send (grp->mq, env); } diff --git a/src/multicast/test_multicast_multipeer.c b/src/multicast/test_multicast_multipeer.c @@ -35,9 +35,10 @@ #define PEERS_REQUESTED 12 -struct multicast_peer +struct MulticastPeerContext { int peer; /* peer number */ + struct GNUNET_CRYPTO_EcdsaPrivateKey *key; const struct GNUNET_PeerIdentity *id; struct GNUNET_TESTBED_Operation *op; /* not yet in use */ struct GNUNET_TESTBED_Operation *pi_op; /* not yet in use */ @@ -61,7 +62,7 @@ static void service_connect (void *cls, void *ca_result, const char *emsg); -static struct multicast_peer **mc_peers; +static struct MulticastPeerContext **multicast_peers; static struct GNUNET_TESTBED_Peer **peers; // FIXME: refactor @@ -69,18 +70,14 @@ static struct GNUNET_TESTBED_Operation *op[PEERS_REQUESTED]; static struct GNUNET_TESTBED_Operation *pi_op[PEERS_REQUESTED]; static struct GNUNET_MULTICAST_Origin *origin; -static struct GNUNET_MULTICAST_Member *member[PEERS_REQUESTED]; /* first element always empty */ +static struct GNUNET_MULTICAST_Member *members[PEERS_REQUESTED]; /* first element always empty */ static struct GNUNET_SCHEDULER_Task *timeout_tid; -static struct GNUNET_CRYPTO_EddsaPrivateKey group_key; +//static struct GNUNET_CRYPTO_EddsaPrivateKey *group_key; static struct GNUNET_CRYPTO_EddsaPublicKey group_pub_key; static struct GNUNET_HashCode group_pub_key_hash; -static struct GNUNET_CRYPTO_EcdsaPrivateKey *member_key[PEERS_REQUESTED]; -static struct GNUNET_CRYPTO_EcdsaPublicKey *member_pub_key[PEERS_REQUESTED]; - - /** * Global result for testcase. */ @@ -93,6 +90,8 @@ static int result; static void shutdown_task (void *cls) { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "shutdown_task!\n"); for (int i=0;i<PEERS_REQUESTED;i++) { if (NULL != op[i]) @@ -107,14 +106,16 @@ shutdown_task (void *cls) } } - if (NULL != mc_peers) + if (NULL != multicast_peers) { for (int i=0; i < PEERS_REQUESTED; i++) { - GNUNET_free (mc_peers[i]); - mc_peers[i] = NULL; + GNUNET_free (multicast_peers[i]->key); + GNUNET_free (multicast_peers[i]); + multicast_peers[i] = NULL; } - GNUNET_free (mc_peers); + GNUNET_free (multicast_peers); + multicast_peers = NULL; } if (NULL != timeout_tid) @@ -141,11 +142,11 @@ member_join_request (void *cls, const struct GNUNET_MessageHeader *join_msg, struct GNUNET_MULTICAST_JoinHandle *jh) { - struct multicast_peer *mc_peer = (struct multicast_peer*)cls; + struct MulticastPeerContext *mc_peer = (struct MulticastPeerContext*)cls; GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Peer #%u (%s) sent a join request.\n", mc_peer->peer, - GNUNET_i2s (mc_peers[mc_peer->peer]->id)); + GNUNET_i2s (multicast_peers[mc_peer->peer]->id)); } @@ -154,7 +155,7 @@ notify (void *cls, size_t *data_size, void *data) { - struct multicast_peer *mc_peer = (struct multicast_peer*)cls; + struct MulticastPeerContext *mc_peer = (struct MulticastPeerContext*)cls; struct pingpong_msg *pp_msg = GNUNET_new (struct pingpong_msg); pp_msg->peer = mc_peer->peer; @@ -178,18 +179,18 @@ member_join_decision (void *cls, const struct GNUNET_PeerIdentity *relays, const struct GNUNET_MessageHeader *join_msg) { - struct multicast_peer *mc_peer = (struct multicast_peer*)cls; + struct MulticastPeerContext *mc_peer = (struct MulticastPeerContext*)cls; struct GNUNET_MULTICAST_MemberTransmitHandle *req; GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Peer #%u (%s) received a decision from origin: %s\n", mc_peer->peer, - GNUNET_i2s (mc_peers[mc_peer->peer]->id), + GNUNET_i2s (multicast_peers[mc_peer->peer]->id), (GNUNET_YES == is_admitted)?"accepted":"rejected"); if (GNUNET_YES == is_admitted) { - req = GNUNET_MULTICAST_member_to_origin (member[mc_peer->peer], + req = GNUNET_MULTICAST_member_to_origin (members[mc_peer->peer], 0, notify, cls); @@ -215,10 +216,32 @@ member_replay_msg () static void +origin_disconnected_cb (void *cls) +{ + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Origin disconnected. Shutting down.\n"); + result = GNUNET_YES; + GNUNET_SCHEDULER_shutdown (); +} + + +static void +member_disconnected_cb (void *cls) +{ + for (int i = 1; i < PEERS_REQUESTED; ++i) + if (GNUNET_NO == multicast_peers[i]->test_ok) + return; + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "All member disconnected. Stopping origin.\n"); + GNUNET_MULTICAST_origin_stop (origin, origin_disconnected_cb, cls); +} + + +static void member_message (void *cls, const struct GNUNET_MULTICAST_MessageHeader *msg) { - struct multicast_peer *mc_peer = (struct multicast_peer*)cls; + struct MulticastPeerContext *mc_peer = (struct MulticastPeerContext*)cls; struct pingpong_msg *pp_msg = (struct pingpong_msg*) &(msg[1]); if (PONG == pp_msg->msg && mc_peer->peer == pp_msg->peer) @@ -226,18 +249,15 @@ member_message (void *cls, GNUNET_log (GNUNET_ERROR_TYPE_INFO, "peer #%i (%s) receives a pong\n", mc_peer->peer, - GNUNET_i2s (mc_peers[mc_peer->peer]->id)); - + GNUNET_i2s (multicast_peers[mc_peer->peer]->id)); mc_peer->test_ok = GNUNET_OK; - } - - // Test for completeness of received PONGs - for (int i=1; i<PEERS_REQUESTED; i++) - if (GNUNET_NO == mc_peers[i]->test_ok) - return; + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "peer #%u (%s) parting from multicast group\n", + mc_peer->peer, + GNUNET_i2s (multicast_peers[mc_peer->peer]->id)); - result = GNUNET_YES; - GNUNET_SCHEDULER_shutdown(); + GNUNET_MULTICAST_member_part (members[mc_peer->peer], member_disconnected_cb, cls); + } } @@ -349,81 +369,53 @@ origin_message (void *cls, static void -multicast_da (void *cls, - void *op_result) +multicast_disconnect (void *cls, + void *op_result) { - struct multicast_peer *mc_peer = (struct multicast_peer*)cls; - if (0 == mc_peer->peer) - { - GNUNET_log (GNUNET_ERROR_TYPE_INFO, - "Origin closes multicast group\n"); - - GNUNET_MULTICAST_origin_stop (origin, NULL, cls); - } - else - { - GNUNET_log (GNUNET_ERROR_TYPE_INFO, - "peer #%u (%s) parting from multicast group\n", - mc_peer->peer, - GNUNET_i2s (mc_peers[mc_peer->peer]->id)); - - GNUNET_MULTICAST_member_part (member[mc_peer->peer], NULL, cls); - } } static void * -multicast_ca (void *cls, - const struct GNUNET_CONFIGURATION_Handle *cfg) +multicast_connect (void *cls, + const struct GNUNET_CONFIGURATION_Handle *cfg) { - struct multicast_peer *mc_peer = (struct multicast_peer*)cls; + struct MulticastPeerContext *multicast_peer = cls; struct GNUNET_MessageHeader *join_msg; char data[64]; - if (0 == mc_peer->peer) + multicast_peer->key = GNUNET_CRYPTO_ecdsa_key_create (); + if (0 == multicast_peer->peer) { - struct GNUNET_CRYPTO_EddsaPrivateKey *key = GNUNET_CRYPTO_eddsa_key_create (); - GNUNET_CRYPTO_eddsa_key_get_public (key, &group_pub_key); + GNUNET_CRYPTO_eddsa_key_get_public (multicast_peer->key, &group_pub_key); GNUNET_CRYPTO_hash (&group_pub_key, sizeof (group_pub_key), &group_pub_key_hash); - - group_key = *key; - origin = GNUNET_MULTICAST_origin_start (cfg, - &group_key, - 0, - origin_join_request, - origin_replay_frag, - origin_replay_msg, - origin_request, - origin_message, - cls); - - if (NULL == origin) { + multicast_peer->key, + 0, + origin_join_request, + origin_replay_frag, + origin_replay_msg, + origin_request, + origin_message, + cls); + if (NULL == origin) + { GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Peer #%u could not create a multicast group", - mc_peer->peer); + multicast_peer->peer); return NULL; } - GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Peer #%u connected as origin to group %s\n", - mc_peer->peer, + multicast_peer->peer, GNUNET_h2s (&group_pub_key_hash)); - return origin; } else { - // Get members keys - member_pub_key[mc_peer->peer] = GNUNET_new (struct GNUNET_CRYPTO_EcdsaPublicKey); - member_key[mc_peer->peer] = GNUNET_CRYPTO_ecdsa_key_create (); - GNUNET_CRYPTO_ecdsa_key_get_public (member_key[mc_peer->peer], - member_pub_key[mc_peer->peer]); - sprintf(data, "Hi, I am peer #%u (%s). Can I enter?", - mc_peer->peer, - GNUNET_i2s (mc_peers[mc_peer->peer]->id)); + multicast_peer->peer, + GNUNET_i2s (multicast_peers[multicast_peer->peer]->id)); uint8_t data_size = strlen (data) + 1; join_msg = GNUNET_malloc (sizeof (join_msg) + data_size); join_msg->size = htons (sizeof (join_msg) + data_size); @@ -432,24 +424,25 @@ multicast_ca (void *cls, GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Peer #%u (%s) tries to join multicast group %s\n", - mc_peer->peer, - GNUNET_i2s (mc_peers[mc_peer->peer]->id), + multicast_peer->peer, + GNUNET_i2s (multicast_peers[multicast_peer->peer]->id), GNUNET_h2s (&group_pub_key_hash)); - member[mc_peer->peer] = GNUNET_MULTICAST_member_join (cfg, - &group_pub_key, - member_key[mc_peer->peer], - mc_peers[0]->id, - 0, - NULL, - join_msg, /* join message */ - member_join_request, - member_join_decision, - member_replay_frag, - member_replay_msg, - member_message, - cls); - return member[mc_peer->peer]; + members[multicast_peer->peer] = + GNUNET_MULTICAST_member_join (cfg, + &group_pub_key, + multicast_peer->key, + multicast_peers[0]->id, + 0, + NULL, + join_msg, /* join message */ + member_join_request, + member_join_decision, + member_replay_frag, + member_replay_msg, + member_message, + cls); + return members[multicast_peer->peer]; } } @@ -460,7 +453,7 @@ peer_information_cb (void *cls, const struct GNUNET_TESTBED_PeerInformation *pinfo, const char *emsg) { - struct multicast_peer *mc_peer = (struct multicast_peer*)cls; + struct MulticastPeerContext *mc_peer = (struct MulticastPeerContext*)cls; if (NULL == pinfo) { GNUNET_log (GNUNET_ERROR_TYPE_INFO, "got no peer information\n"); @@ -468,7 +461,7 @@ peer_information_cb (void *cls, GNUNET_SCHEDULER_shutdown (); } - mc_peers[mc_peer->peer]->id = pinfo->result.id; + multicast_peers[mc_peer->peer]->id = pinfo->result.id; GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Got peer information of %s (%s)\n", @@ -478,22 +471,28 @@ peer_information_cb (void *cls, GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Create peer #%u (%s)\n", mc_peer->peer, - GNUNET_i2s (mc_peers[mc_peer->peer]->id)); + GNUNET_i2s (multicast_peers[mc_peer->peer]->id)); if (0 != mc_peer->peer) { /* connect to multicast service of members */ - op[mc_peer->peer] = GNUNET_TESTBED_service_connect (NULL, /* Closure for operation */ - peers[mc_peer->peer], /* The peer whose service to connect to */ - "multicast", /* The name of the service */ - service_connect, /* callback to call after a handle to service - is opened */ - cls, /* closure for the above callback */ - multicast_ca, /* callback to call with peer's configuration; - this should open the needed service connection */ - multicast_da, /* callback to be called when closing the - opened service connection */ - cls); /* closure for the above two callbacks */ + op[mc_peer->peer] = + GNUNET_TESTBED_service_connect (/* Closure for operation */ + NULL, + /* The peer whose service to connect to */ + peers[mc_peer->peer], + /* The name of the service */ + "multicast", + /* called after a handle to service is opened */ + service_connect, + /* closure for the above callback */ + cls, + /* called when opening the service connection */ + multicast_connect, + /* called when closing the service connection */ + multicast_disconnect, + /* closure for the above two callbacks */ + cls); } } @@ -504,14 +503,14 @@ service_connect (void *cls, void *ca_result, const char *emsg) { - struct multicast_peer *mc_peer = (struct multicast_peer*)cls; + struct MulticastPeerContext *mc_peer = (struct MulticastPeerContext*)cls; if (NULL == ca_result) { GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Connection adapter not created for peer #%u (%s)\n", mc_peer->peer, - GNUNET_i2s (mc_peers[mc_peer->peer]->id)); + GNUNET_i2s (multicast_peers[mc_peer->peer]->id)); result = GNUNET_SYSERR; GNUNET_SCHEDULER_shutdown(); @@ -525,7 +524,7 @@ service_connect (void *cls, pi_op[i] = GNUNET_TESTBED_peer_get_information (peers[i], GNUNET_TESTBED_PIT_IDENTITY, peer_information_cb, - mc_peers[i]); + multicast_peers[i]); } } } @@ -550,50 +549,51 @@ service_connect (void *cls, */ static void testbed_master (void *cls, - struct GNUNET_TESTBED_RunHandle *h, - unsigned int num_peers, - struct GNUNET_TESTBED_Peer **p, - unsigned int links_succeeded, - unsigned int links_failed) + struct GNUNET_TESTBED_RunHandle *h, + unsigned int num_peers, + struct GNUNET_TESTBED_Peer **p, + unsigned int links_succeeded, + unsigned int links_failed) { /* Testbed is ready with peers running and connected in a pre-defined overlay topology (FIXME) */ - - GNUNET_log (GNUNET_ERROR_TYPE_INFO, - "Connected to testbed_master()\n"); - peers = p; - - mc_peers = GNUNET_new_array (PEERS_REQUESTED, struct multicast_peer*); + multicast_peers = GNUNET_new_array (PEERS_REQUESTED, struct MulticastPeerContext*); // Create test contexts for members for (int i = 0; i<PEERS_REQUESTED; i++) { - mc_peers[i] = GNUNET_new (struct multicast_peer); - mc_peers[i]->peer = i; - mc_peers[i]->test_ok = GNUNET_NO; + multicast_peers[i] = GNUNET_new (struct MulticastPeerContext); + multicast_peers[i]->peer = i; + multicast_peers[i]->test_ok = GNUNET_NO; } - GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Create origin peer\n"); - - op[0] = GNUNET_TESTBED_service_connect (NULL, /* Closure for operation */ - peers[0], /* The peer whose service to connect to */ - "multicast", /* The name of the service */ - service_connect, /* callback to call after a handle to service - is opened */ - mc_peers[0], /* closure for the above callback */ - multicast_ca, /* callback to call with peer's configuration; - this should open the needed service connection */ - multicast_da, /* callback to be called when closing the - opened service connection */ - mc_peers[0]); /* closure for the above two callbacks */ - - GNUNET_SCHEDULER_add_shutdown (&shutdown_task, NULL); /* Schedule a new task on shutdown */ - + op[0] = + GNUNET_TESTBED_service_connect (/* Closure for operation */ + NULL, + /* The peer whose service to connect to */ + peers[0], + /* The name of the service */ + "multicast", + /* called after a handle to service is opened */ + service_connect, + /* closure for the above callback */ + multicast_peers[0], + /* called when opening the service connection */ + multicast_connect, + /* called when closing the service connection */ + multicast_disconnect, + /* closure for the above two callbacks */ + multicast_peers[0]); + /* Schedule a new task on shutdown */ + GNUNET_SCHEDULER_add_shutdown (&shutdown_task, NULL); /* Schedule the shutdown task with a delay of a few Seconds */ - timeout_tid = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, 400), - &timeout_task, NULL); + timeout_tid = + GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply + (GNUNET_TIME_UNIT_SECONDS, 400), + &timeout_task, + NULL); } @@ -617,15 +617,21 @@ main (int argc, char *argv[]) } result = GNUNET_SYSERR; - ret = GNUNET_TESTBED_test_run - ("test-multicast-multipeer", /* test case name */ - config_file, /* template configuration */ - PEERS_REQUESTED, /* number of peers to start */ - 0LL, /* Event mask - set to 0 for no event notifications */ - NULL, /* Controller event callback */ - NULL, /* Closure for controller event callback */ - testbed_master, /* continuation callback to be called when testbed setup is complete */ - NULL); /* Closure for the test_master callback */ + ret = + GNUNET_TESTBED_test_run ("test-multicast-multipeer", + config_file, + /* number of peers to start */ + PEERS_REQUESTED, + /* Event mask - set to 0 for no event notifications */ + 0LL, + /* Controller event callback */ + NULL, + /* Closure for controller event callback */ + NULL, + /* called when testbed setup is complete */ + testbed_master, + /* Closure for the test_master callback */ + NULL); if ( (GNUNET_OK != ret) || (GNUNET_OK != result) ) return 1; return 0; diff --git a/src/psyc/gnunet-service-psyc.c b/src/psyc/gnunet-service-psyc.c @@ -279,7 +279,7 @@ struct Channel * Is the client disconnected? * #GNUNET_YES or #GNUNET_NO */ - uint8_t is_disconnected; + uint8_t is_disconnecting; /** * Is this a channel master (#GNUNET_YES), or slave (#GNUNET_NO)? @@ -508,8 +508,6 @@ cleanup_master (struct Master *mst) { struct Channel *chn = &mst->channel; - if (NULL != mst->origin) - GNUNET_MULTICAST_origin_stop (mst->origin, NULL, NULL); // FIXME GNUNET_CONTAINER_multihashmap_destroy (mst->join_reqs); GNUNET_CONTAINER_multihashmap_remove (masters, &chn->pub_key_hash, mst); } @@ -546,11 +544,6 @@ cleanup_slave (struct Slave *slv) GNUNET_free (slv->relays); slv->relays = NULL; } - if (NULL != slv->member) - { - GNUNET_MULTICAST_member_part (slv->member, NULL, NULL); // FIXME - slv->member = NULL; - } GNUNET_CONTAINER_multihashmap_remove (slaves, &chn->pub_key_hash, slv); } @@ -603,15 +596,16 @@ client_notify_disconnect (void *cls, if (NULL == chn) { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "%p User context is NULL in client_disconnect()\n", + "%p User context is NULL in client_notify_disconnect ()\n", chn); GNUNET_break (0); return; } GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "%p Client (%s) disconnected from channel %s\n", + "%p Client %p (%s) disconnected from channel %s\n", chn, + client, (GNUNET_YES == chn->is_master) ? "master" : "slave", GNUNET_h2s (&chn->pub_key_hash)); @@ -645,15 +639,8 @@ client_notify_disconnect (void *cls, chn, (GNUNET_YES == chn->is_master) ? "master" : "slave", GNUNET_h2s (&chn->pub_key_hash)); - chn->is_disconnected = GNUNET_YES; - if (NULL != chn->tmit_head) - { /* Send pending messages to multicast before cleanup. */ - transmit_message (chn); - } - else - { - cleanup_channel (chn); - } + chn->is_disconnecting = GNUNET_YES; + cleanup_channel (chn); } } @@ -688,7 +675,7 @@ client_send_msg (const struct Channel *chn, const struct GNUNET_MessageHeader *msg) { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "%p Sending message to clients.\n", + "Sending message to clients of channel %p.\n", chn); struct ClientList *cli = chn->clients_head; @@ -699,7 +686,6 @@ client_send_msg (const struct Channel *chn, GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq (cli->client), env); - cli = cli->next; } } @@ -734,7 +720,7 @@ client_send_result (struct GNUNET_SERVICE_Client *client, uint64_t op_id, GNUNET_memcpy (&res[1], data, data_size); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "%p Sending result to client for operation #%" PRIu64 ": %" PRId64 " (size: %u)\n", + "%p Sending result to client for OP ID %" PRIu64 ": %" PRId64 " (size: %u)\n", client, GNUNET_ntohll (op_id), result_code, @@ -1202,12 +1188,12 @@ fragment_queue_insert (struct Channel *chn, else if (GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_METHOD == first_ptype || frag_offset == fragq->header_size) { /* header is now complete */ - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "%p Header of message %" PRIu64 " is complete.\n", chn, GNUNET_ntohll (mmsg->message_id)); - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "%p Adding message %" PRIu64 " to queue.\n", chn, GNUNET_ntohll (mmsg->message_id)); @@ -1215,7 +1201,7 @@ fragment_queue_insert (struct Channel *chn, } else { - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "%p Header of message %" PRIu64 " is NOT complete yet: %" PRIu64 " != %" PRIu64 "\n", chn, GNUNET_ntohll (mmsg->message_id), @@ -1230,7 +1216,7 @@ fragment_queue_insert (struct Channel *chn, if (frag_offset == fragq->size) fragq->state = MSG_FRAG_STATE_END; else - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "%p Message %" PRIu64 " is NOT complete yet: %" PRIu64 " != %" PRIu64 "\n", chn, GNUNET_ntohll (mmsg->message_id), @@ -1285,7 +1271,7 @@ static void fragment_queue_run (struct Channel *chn, uint64_t msg_id, struct FragmentQueue *fragq, uint8_t drop) { - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "%p Running message fragment queue for message %" PRIu64 " (state: %u).\n", chn, msg_id, @@ -1413,7 +1399,7 @@ store_recv_state_modify_result (void *cls, int64_t result, static uint64_t message_queue_run (struct Channel *chn) { - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "%p Running message queue.\n", chn); uint64_t n = 0; uint64_t msg_id; @@ -1421,7 +1407,7 @@ message_queue_run (struct Channel *chn) while (GNUNET_YES == GNUNET_CONTAINER_heap_peek2 (chn->recv_msgs, NULL, &msg_id)) { - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "%p Processing message %" PRIu64 " in queue.\n", chn, msg_id); struct GNUNET_HashCode msg_id_hash; hash_key_from_hll (&msg_id_hash, msg_id); @@ -1431,7 +1417,7 @@ message_queue_run (struct Channel *chn) if (NULL == fragq || fragq->state <= MSG_FRAG_STATE_HEADER) { - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "%p No fragq (%p) or header not complete.\n", chn, fragq); break; @@ -1453,7 +1439,7 @@ message_queue_run (struct Channel *chn) && (chn->max_message_id != msg_id - 1 && chn->max_message_id != msg_id)) { - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "%p Out of order message. " "(%" PRIu64 " != %" PRIu64 " - 1)\n", chn, chn->max_message_id, msg_id); @@ -1469,7 +1455,7 @@ message_queue_run (struct Channel *chn) { if (msg_id - fragq->state_delta != chn->max_state_message_id) { - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "%p Out of order stateful message. " "(%" PRIu64 " - %" PRIu64 " != %" PRIu64 ")\n", chn, msg_id, fragq->state_delta, chn->max_state_message_id); @@ -1515,8 +1501,6 @@ message_queue_run (struct Channel *chn) static uint64_t message_queue_drop (struct Channel *chn) { - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, - "%p Dropping message queue.\n", chn); uint64_t n = 0; uint64_t msg_id; while (GNUNET_YES == GNUNET_CONTAINER_heap_peek2 (chn->recv_msgs, NULL, @@ -1703,7 +1687,7 @@ store_recv_slave_counters (void *cls, int result, uint64_t max_fragment_id, res.result_code = htonl (result); res.max_message_id = GNUNET_htonll (max_message_id); - if (GNUNET_OK == result || GNUNET_NO == result) + if (GNUNET_YES == result || GNUNET_NO == result) { chn->max_message_id = max_message_id; chn->max_state_message_id = max_state_message_id; @@ -1831,6 +1815,9 @@ handle_client_slave_join (void *cls, struct GNUNET_CRYPTO_EcdsaPublicKey slv_pub_key; struct GNUNET_HashCode pub_key_hash, slv_pub_hash; + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "got join request from client %p\n", + client); GNUNET_CRYPTO_ecdsa_key_get_public (&req->slave_key, &slv_pub_key); GNUNET_CRYPTO_hash (&slv_pub_key, sizeof (slv_pub_key), &slv_pub_hash); GNUNET_CRYPTO_hash (&req->channel_pub_key, sizeof (req->channel_pub_key), &pub_key_hash); @@ -1905,7 +1892,7 @@ handle_client_slave_join (void *cls, GNUNET_CONTAINER_multihashmap_put (slaves, &chn->pub_key_hash, chn, GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE); chn->store_op = GNUNET_PSYCSTORE_counters_get (store, &chn->pub_key, - &store_recv_slave_counters, slv); + &store_recv_slave_counters, slv); } else { @@ -1952,8 +1939,9 @@ handle_client_slave_join (void *cls, } GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "%p Client connected as slave to channel %s.\n", - slv, GNUNET_h2s (&chn->pub_key_hash)); + "Client %p connected as slave to channel %s.\n", + client, + GNUNET_h2s (&chn->pub_key_hash)); struct ClientList *cli = GNUNET_malloc (sizeof (*cli)); cli->client = client; @@ -2037,6 +2025,49 @@ handle_client_join_decision (void *cls, } +static void +channel_part_cb (void *cls) +{ + struct GNUNET_SERVICE_Client *client = cls; + struct GNUNET_MQ_Envelope *env; + + env = GNUNET_MQ_msg_header (GNUNET_MESSAGE_TYPE_PSYC_PART_ACK); + GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq (client), + env); +} + + +static void +handle_client_part_request (void *cls, + const struct GNUNET_MessageHeader *msg) +{ + struct Client *c = cls; + + c->channel->is_disconnecting = GNUNET_YES; + if (GNUNET_YES == c->channel->is_master) + { + struct Master *mst = (struct Master *) c->channel; + + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Got part request from master %p\n", + mst); + GNUNET_assert (NULL != mst->origin); + GNUNET_MULTICAST_origin_stop (mst->origin, channel_part_cb, c->client); + } + else + { + struct Slave *slv = (struct Slave *) c->channel; + + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Got part request from slave %p\n", + slv); + GNUNET_assert (NULL != slv->member); + GNUNET_MULTICAST_member_part (slv->member, channel_part_cb, c->client); + } + GNUNET_SERVICE_client_continue (c->client); +} + + /** * Send acknowledgement to a client. * @@ -2096,7 +2127,7 @@ transmit_notify (void *cls, size_t *data_size, void *data) { GNUNET_SCHEDULER_add_now (&schedule_transmit_message, chn); } - else if (GNUNET_YES == chn->is_disconnected + else if (GNUNET_YES == chn->is_disconnecting && tmit_msg->last_ptype < GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_END) { /* FIXME: handle partial message (when still in_transmit) */ @@ -2208,12 +2239,10 @@ transmit_message (struct Channel *chn) static void master_queue_message (struct Master *mst, struct TransmitMessage *tmit_msg) { - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "%p master_queue_message()\n", mst); - if (GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_METHOD == tmit_msg->first_ptype) { tmit_msg->id = ++mst->max_message_id; - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "%p master_queue_message: message_id=%" PRIu64 "\n", mst, tmit_msg->id); struct GNUNET_PSYC_MessageMethod *pmeth @@ -2225,7 +2254,7 @@ master_queue_message (struct Master *mst, struct TransmitMessage *tmit_msg) } else if (pmeth->flags & GNUNET_PSYC_MASTER_TRANSMIT_STATE_MODIFY) { - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "%p master_queue_message: state_delta=%" PRIu64 "\n", mst, tmit_msg->id - mst->max_state_message_id); pmeth->state_delta = GNUNET_htonll (tmit_msg->id @@ -2234,7 +2263,7 @@ master_queue_message (struct Master *mst, struct TransmitMessage *tmit_msg) } else { - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "%p master_queue_message: state not modified\n", mst); pmeth->state_delta = GNUNET_htonll (GNUNET_PSYC_STATE_NOT_MODIFIED); } @@ -2359,7 +2388,9 @@ handle_client_psyc_message (void *cls, if (GNUNET_YES != chn->is_ready) { GNUNET_log (GNUNET_ERROR_TYPE_WARNING, - "%p Channel is not ready yet, disconnecting client.\n", chn); + "%p Channel is not ready yet, disconnecting client %p.\n", + chn, + client); GNUNET_break (0); GNUNET_SERVICE_client_drop (client); return; @@ -2789,9 +2820,9 @@ run (void *cls, GNUNET_SERVICE_MAIN ("psyc", GNUNET_SERVICE_OPTION_NONE, - run, - client_notify_connect, - client_notify_disconnect, + &run, + &client_notify_connect, + &client_notify_disconnect, NULL, GNUNET_MQ_hd_fixed_size (client_master_start, GNUNET_MESSAGE_TYPE_PSYC_MASTER_START, @@ -2805,6 +2836,10 @@ GNUNET_SERVICE_MAIN GNUNET_MESSAGE_TYPE_PSYC_JOIN_DECISION, struct GNUNET_PSYC_JoinDecisionMessage, NULL), + GNUNET_MQ_hd_fixed_size (client_part_request, + GNUNET_MESSAGE_TYPE_PSYC_PART_REQUEST, + struct GNUNET_MessageHeader, + NULL), GNUNET_MQ_hd_var_size (client_psyc_message, GNUNET_MESSAGE_TYPE_PSYC_MESSAGE, struct GNUNET_MessageHeader, diff --git a/src/psyc/psyc_api.c b/src/psyc/psyc_api.c @@ -260,6 +260,10 @@ handle_channel_result (void *cls, GNUNET_OP_result (chn->op, GNUNET_ntohll (res->op_id), GNUNET_ntohll (res->result_code), data, data_size, NULL); + + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "handle_channel_result: Received result message with OP ID %" PRIu64 "\n", + GNUNET_ntohll (res->op_id)); } @@ -555,6 +559,9 @@ handle_slave_join_decision (void *cls, static void channel_cleanup (struct GNUNET_PSYC_Channel *chn) { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "cleaning up channel %p\n", + chn); if (NULL != chn->tmit) { GNUNET_PSYC_transmit_destroy (chn->tmit); @@ -562,6 +569,7 @@ channel_cleanup (struct GNUNET_PSYC_Channel *chn) } if (NULL != chn->recv) { + GNUNET_PSYC_receive_destroy (chn->recv); chn->recv = NULL; } @@ -585,30 +593,12 @@ channel_cleanup (struct GNUNET_PSYC_Channel *chn) static void -channel_disconnect (struct GNUNET_PSYC_Channel *chn, - GNUNET_ContinuationCallback cb, - void *cls) +handle_channel_part_ack (void *cls, + const struct GNUNET_MessageHeader *msg) { - chn->is_disconnecting = GNUNET_YES; - chn->disconnect_cb = cb; - chn->disconnect_cls = cls; + struct GNUNET_PSYC_Channel *chn = cls; - if (NULL != chn->mq) - { - struct GNUNET_MQ_Envelope *env = GNUNET_MQ_get_last_envelope (chn->mq); - if (NULL != env) - { - GNUNET_MQ_notify_sent (env, (GNUNET_SCHEDULER_TaskCallback) channel_cleanup, chn); - } - else - { - channel_cleanup (chn); - } - } - else - { - channel_cleanup (chn); - } + channel_cleanup (chn); } @@ -671,6 +661,10 @@ master_connect (struct GNUNET_PSYC_Master *mst) GNUNET_MESSAGE_TYPE_PSYC_JOIN_REQUEST, struct GNUNET_PSYC_JoinRequestMessage, mst), + GNUNET_MQ_hd_fixed_size (channel_part_ack, + GNUNET_MESSAGE_TYPE_PSYC_PART_ACK, + struct GNUNET_MessageHeader, + chn), GNUNET_MQ_hd_var_size (channel_message, GNUNET_MESSAGE_TYPE_PSYC_MESSAGE, struct GNUNET_PSYC_MessageHeader, @@ -694,8 +688,11 @@ master_connect (struct GNUNET_PSYC_Master *mst) GNUNET_MQ_handler_end () }; - chn->mq = GNUNET_CLIENT_connect (chn->cfg, "psyc", - handlers, master_disconnected, mst); + chn->mq = GNUNET_CLIENT_connect (chn->cfg, + "psyc", + handlers, + &master_disconnected, + mst); GNUNET_assert (NULL != chn->mq); chn->tmit = GNUNET_PSYC_transmit_create (chn->mq); @@ -780,10 +777,13 @@ GNUNET_PSYC_master_stop (struct GNUNET_PSYC_Master *mst, void *stop_cls) { struct GNUNET_PSYC_Channel *chn = &mst->chn; + struct GNUNET_MQ_Envelope *env; - /* FIXME: send msg to service */ - - channel_disconnect (chn, stop_cb, stop_cls); + chn->is_disconnecting = GNUNET_YES; + chn->disconnect_cb = stop_cb; + chn->disconnect_cls = stop_cls; + env = GNUNET_MQ_msg_header (GNUNET_MESSAGE_TYPE_PSYC_PART_REQUEST); + GNUNET_MQ_send (chn->mq, env); } @@ -931,7 +931,8 @@ slave_reconnect (void *cls) * Reconnect after backoff period. */ static void -slave_disconnected (void *cls, enum GNUNET_MQ_Error error) +slave_disconnected (void *cls, + enum GNUNET_MQ_Error error) { struct GNUNET_PSYC_Slave *slv = cls; struct GNUNET_PSYC_Channel *chn = &slv->chn; @@ -950,7 +951,7 @@ slave_disconnected (void *cls, enum GNUNET_MQ_Error error) chn->mq = NULL; } chn->reconnect_task = GNUNET_SCHEDULER_add_delayed (chn->reconnect_delay, - slave_reconnect, + &slave_reconnect, slv); chn->reconnect_delay = GNUNET_TIME_STD_BACKOFF (chn->reconnect_delay); } @@ -970,6 +971,10 @@ slave_connect (struct GNUNET_PSYC_Slave *slv) GNUNET_MESSAGE_TYPE_PSYC_JOIN_DECISION, struct GNUNET_PSYC_JoinDecisionMessage, slv), + GNUNET_MQ_hd_fixed_size (channel_part_ack, + GNUNET_MESSAGE_TYPE_PSYC_PART_ACK, + struct GNUNET_MessageHeader, + chn), GNUNET_MQ_hd_var_size (channel_message, GNUNET_MESSAGE_TYPE_PSYC_MESSAGE, struct GNUNET_PSYC_MessageHeader, @@ -993,9 +998,19 @@ slave_connect (struct GNUNET_PSYC_Slave *slv) GNUNET_MQ_handler_end () }; - chn->mq = GNUNET_CLIENT_connect (chn->cfg, "psyc", - handlers, slave_disconnected, slv); - GNUNET_assert (NULL != chn->mq); + chn->mq = GNUNET_CLIENT_connect (chn->cfg, + "psyc", + handlers, + &slave_disconnected, + slv); + if (NULL == chn->mq) + { + chn->reconnect_task = GNUNET_SCHEDULER_add_delayed (chn->reconnect_delay, + &slave_reconnect, + slv); + chn->reconnect_delay = GNUNET_TIME_STD_BACKOFF (chn->reconnect_delay); + return; + } chn->tmit = GNUNET_PSYC_transmit_create (chn->mq); GNUNET_MQ_send_copy (chn->mq, chn->connect_env); @@ -1107,10 +1122,13 @@ GNUNET_PSYC_slave_part (struct GNUNET_PSYC_Slave *slv, void *part_cls) { struct GNUNET_PSYC_Channel *chn = &slv->chn; + struct GNUNET_MQ_Envelope *env; - /* FIXME: send msg to service */ - - channel_disconnect (chn, part_cb, part_cls); + chn->is_disconnecting = GNUNET_YES; + chn->disconnect_cb = part_cb; + chn->disconnect_cls = part_cls; + env = GNUNET_MQ_msg_header (GNUNET_MESSAGE_TYPE_PSYC_PART_REQUEST); + GNUNET_MQ_send (chn->mq, env); } @@ -1233,6 +1251,9 @@ GNUNET_PSYC_channel_slave_add (struct GNUNET_PSYC_Channel *chn, req->did_join = GNUNET_YES; req->op_id = GNUNET_htonll (GNUNET_OP_add (chn->op, result_cb, cls, NULL)); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "GNUNET_PSYC_channel_slave_add, OP ID: %" PRIu64 "\n", + GNUNET_ntohll (req->op_id)); GNUNET_MQ_send (chn->mq, env); } @@ -1283,6 +1304,9 @@ GNUNET_PSYC_channel_slave_remove (struct GNUNET_PSYC_Channel *chn, req->did_join = GNUNET_NO; req->op_id = GNUNET_htonll (GNUNET_OP_add (chn->op, result_cb, cls, NULL)); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "GNUNET_PSYC_channel_slave_remove, OP ID: %" PRIu64 "\n", + GNUNET_ntohll (req->op_id)); GNUNET_MQ_send (chn->mq, env); } @@ -1321,6 +1345,10 @@ channel_history_replay (struct GNUNET_PSYC_Channel *chn, req->message_limit = GNUNET_htonll (message_limit); req->flags = htonl (flags); req->op_id = GNUNET_htonll (hist->op_id); + + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "channel_history_replay, OP ID: %" PRIu64 "\n", + GNUNET_ntohll (req->op_id)); GNUNET_memcpy (&req[1], method_prefix, method_size); GNUNET_MQ_send (chn->mq, env); @@ -1459,6 +1487,11 @@ channel_state_get (struct GNUNET_PSYC_Channel *chn, struct GNUNET_MQ_Envelope * env = GNUNET_MQ_msg_extra (req, name_size, type); req->op_id = GNUNET_htonll (sr->op_id); + + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "channel_state_get, OP ID: %" PRIu64 "\n", + GNUNET_ntohll (req->op_id)); + GNUNET_memcpy (&req[1], name, name_size); GNUNET_MQ_send (chn->mq, env); diff --git a/src/psyc/test_psyc.c b/src/psyc/test_psyc.c @@ -755,15 +755,22 @@ slave_add () static void +schedule_second_slave_join (void *cls) +{ + slave_join (TEST_SLAVE_JOIN_ACCEPT); +} + + +static void first_slave_parted (void *cls) { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "First slave parted.\n"); - slave_join (TEST_SLAVE_JOIN_ACCEPT); + GNUNET_SCHEDULER_add_now (&schedule_second_slave_join, NULL); } static void -schedule_slave_part (void *cls) +schedule_first_slave_part (void *cls) { GNUNET_PSYC_slave_part (slv, GNUNET_NO, &first_slave_parted, NULL); } @@ -783,7 +790,7 @@ join_decision_cb (void *cls, case TEST_SLAVE_JOIN_REJECT: GNUNET_assert (0 == is_admitted); GNUNET_assert (1 == join_req_count); - GNUNET_SCHEDULER_add_now (&schedule_slave_part, NULL); + GNUNET_SCHEDULER_add_now (&schedule_first_slave_part, NULL); break; case TEST_SLAVE_JOIN_ACCEPT: @@ -844,11 +851,18 @@ slave_join (int t) struct GNUNET_PSYC_Message * join_msg = GNUNET_PSYC_message_create ("_request_join", env, "some data", 9); - slv = GNUNET_PSYC_slave_join (cfg, &channel_pub_key, slave_key, + slv = GNUNET_PSYC_slave_join (cfg, + &channel_pub_key, + slave_key, GNUNET_PSYC_SLAVE_JOIN_NONE, - &origin, 0, NULL, - &slave_message_cb, &slave_message_part_cb, - &slave_connect_cb, &join_decision_cb, NULL, + &origin, + 0, + NULL, + &slave_message_cb, + &slave_message_part_cb, + &slave_connect_cb, + &join_decision_cb, + NULL, join_msg); GNUNET_free (join_msg); slv_chn = GNUNET_PSYC_slave_get_channel (slv); diff --git a/src/psyc/test_psyc.conf b/src/psyc/test_psyc.conf @@ -1,50 +1,16 @@ -[arm] -#GLOBAL_POSTFIX=-L ERROR +@INLINE@ ../../contrib/no_forcestart.conf -[vpn] -AUTOSTART = NO +[PATHS] +GNUNET_TEST_HOME = /tmp/gnunet-test-psyc/ -[peerinfo] -# Do not use shipped gnunet HELLOs -USE_INCLUDED_HELLOS = NO - -# Option to disable all disk IO; only useful for testbed runs -# (large-scale experiments); disables persistence of HELLOs! -NO_IO = YES - -[hostlist] -FORCESTART = NO -AUTOSTART = NO +[transport] +PLUGINS = tcp [nat] -FORCESTART = NO -AUTOSTART = NO +DISABLEV6 = YES ENABLE_UPNP = NO +BEHIND_NAT = NO +ALLOW_NAT = NO +INTERNAL_ADDRESS = 127.0.0.1 +EXTERNAL_ADDRESS = 127.0.0.1 -[fs] -FORCESTART = NO -AUTOSTART = NO - -[vpn] -FORCESTART = NO -AUTOSTART = NO - -[revocation] -FORCESTART = NO -AUTOSTART = NO - -[gns] -FORCESTART = NO -AUTOSTART = NO - -[namestore] -FORCESTART = NO -AUTOSTART = NO - -[namecache] -FORCESTART = NO -AUTOSTART = NO - -[topology] -FORCESTART = NO -AUTOSTART = NO diff --git a/src/psycstore/psycstore_api.c b/src/psycstore/psycstore_api.c @@ -148,14 +148,14 @@ handle_result_code (void *cls, const struct OperationResult *opres) str, size - sizeof (*opres), (void **) &op)) { LOG (GNUNET_ERROR_TYPE_DEBUG, - "handle_result_code: Received result message with operation ID: %" PRIu64 "\n", + "handle_result_code: Received result message with OP ID: %" PRIu64 "\n", GNUNET_ntohll (opres->op_id)); GNUNET_free (op); } else { LOG (GNUNET_ERROR_TYPE_DEBUG, - "handle_result_code: No callback registered for operation with ID %" PRIu64 ".\n", + "handle_result_code: No callback registered for OP ID %" PRIu64 ".\n", GNUNET_ntohll (opres->op_id)); } h->reconnect_delay = GNUNET_TIME_UNIT_MILLISECONDS; @@ -187,7 +187,7 @@ handle_result_counters (void *cls, const struct CountersResult *cres) else { LOG (GNUNET_ERROR_TYPE_DEBUG, - "handle_result_counters: No callback registered for operation with ID %" PRIu64 ".\n", + "handle_result_counters: No callback registered for OP ID %" PRIu64 ".\n", GNUNET_ntohll (cres->op_id)); } h->reconnect_delay = GNUNET_TIME_UNIT_MILLISECONDS; @@ -233,7 +233,7 @@ handle_result_fragment (void *cls, const struct FragmentResult *fres) else { LOG (GNUNET_ERROR_TYPE_DEBUG, - "handle_result_fragment: No callback registered for operation with ID %" PRIu64 ".\n", + "handle_result_fragment: No callback registered for OP ID %" PRIu64 ".\n", GNUNET_ntohll (fres->op_id)); } h->reconnect_delay = GNUNET_TIME_UNIT_MILLISECONDS; @@ -282,7 +282,7 @@ handle_result_state (void *cls, const struct StateResult *sres) else { LOG (GNUNET_ERROR_TYPE_DEBUG, - "handle_result_state: No callback registered for operation with ID %" PRIu64 ".\n", + "handle_result_state: No callback registered for OP ID %" PRIu64 ".\n", GNUNET_ntohll (sres->op_id)); } h->reconnect_delay = GNUNET_TIME_UNIT_MILLISECONDS; diff --git a/src/rest/Makefile.am b/src/rest/Makefile.am @@ -26,6 +26,8 @@ lib_LTLIBRARIES = \ libexec_PROGRAMS = \ gnunet-rest-server +EXTRA_DIST = \ + rest.conf gnunet_rest_server_SOURCES = \ gnunet-rest-server.c diff --git a/src/rps/.gitignore b/src/rps/.gitignore @@ -9,7 +9,7 @@ test_rps_seed_big test_rps_seed_request test_rps_single_req test_service_rps_custommap -test_service_rps_peers test_service_rps_sampler_elem test_service_rps_view - +test_rps_churn +test_service_rps_peers diff --git a/src/rps/Makefile.am b/src/rps/Makefile.am @@ -49,7 +49,6 @@ endif gnunet_service_rps_SOURCES = \ gnunet-service-rps_sampler_elem.h gnunet-service-rps_sampler_elem.c \ gnunet-service-rps_sampler.h gnunet-service-rps_sampler.c \ - gnunet-service-rps_peers.h gnunet-service-rps_peers.c \ gnunet-service-rps_custommap.h gnunet-service-rps_custommap.c \ gnunet-service-rps_view.h gnunet-service-rps_view.c \ rps-test_util.h rps-test_util.c \ @@ -73,7 +72,6 @@ if HAVE_TESTING check_PROGRAMS = \ test_service_rps_view \ test_service_rps_custommap \ - test_service_rps_peers \ test_service_rps_sampler_elem \ test_rps_malicious_1 \ test_rps_malicious_2 \ @@ -106,13 +104,6 @@ test_service_rps_view_SOURCES = \ test_service_rps_view.c test_service_rps_view_LDADD = $(top_builddir)/src/util/libgnunetutil.la -test_service_rps_peers_SOURCES = \ - gnunet-service-rps_peers.h gnunet-service-rps_peers.c \ - test_service_rps_peers.c -test_service_rps_peers_LDADD = \ - $(top_builddir)/src/util/libgnunetutil.la \ - $(top_builddir)/src/cadet/libgnunetcadet.la - test_service_rps_custommap_SOURCES = \ gnunet-service-rps_custommap.h gnunet-service-rps_custommap.c \ test_service_rps_custommap.c diff --git a/src/rps/gnunet-service-rps.c b/src/rps/gnunet-service-rps.c @@ -33,7 +33,6 @@ #include "rps-test_util.h" #include "gnunet-service-rps_sampler.h" #include "gnunet-service-rps_custommap.h" -#include "gnunet-service-rps_peers.h" #include "gnunet-service-rps_view.h" #include <math.h> @@ -66,6 +65,1728 @@ static const struct GNUNET_CONFIGURATION_Handle *cfg; static struct GNUNET_PeerIdentity own_identity; + +/*********************************************************************** + * Old gnunet-service-rps_peers.c +***********************************************************************/ + +/** + * Set a peer flag of given peer context. + */ +#define set_peer_flag(peer_ctx, mask) ((peer_ctx->peer_flags) |= (mask)) + +/** + * Get peer flag of given peer context. + */ +#define check_peer_flag_set(peer_ctx, mask)\ + ((peer_ctx->peer_flags) & (mask) ? GNUNET_YES : GNUNET_NO) + +/** + * Unset flag of given peer context. + */ +#define unset_peer_flag(peer_ctx, mask) ((peer_ctx->peer_flags) &= ~(mask)) + +/** + * Set a channel flag of given channel context. + */ +#define set_channel_flag(channel_flags, mask) ((*channel_flags) |= (mask)) + +/** + * Get channel flag of given channel context. + */ +#define check_channel_flag_set(channel_flags, mask)\ + ((*channel_flags) & (mask) ? GNUNET_YES : GNUNET_NO) + +/** + * Unset flag of given channel context. + */ +#define unset_channel_flag(channel_flags, mask) ((*channel_flags) &= ~(mask)) + + + +/** + * Pending operation on peer consisting of callback and closure + * + * When an operation cannot be executed right now this struct is used to store + * the callback and closure for later execution. + */ +struct PeerPendingOp +{ + /** + * Callback + */ + PeerOp op; + + /** + * Closure + */ + void *op_cls; +}; + +/** + * List containing all messages that are yet to be send + * + * This is used to keep track of all messages that have not been sent yet. When + * a peer is to be removed the pending messages can be removed properly. + */ +struct PendingMessage +{ + /** + * DLL next, prev + */ + struct PendingMessage *next; + struct PendingMessage *prev; + + /** + * The envelope to the corresponding message + */ + struct GNUNET_MQ_Envelope *ev; + + /** + * The corresponding context + */ + struct PeerContext *peer_ctx; + + /** + * The message type + */ + const char *type; +}; + +/** + * Struct used to keep track of other peer's status + * + * This is stored in a multipeermap. + * It contains information such as cadet channels, a message queue for sending, + * status about the channels, the pending operations on this peer and some flags + * about the status of the peer itself. (live, valid, ...) + */ +struct PeerContext +{ + /** + * Message queue open to client + */ + struct GNUNET_MQ_Handle *mq; + + /** + * Channel open to client. + */ + struct GNUNET_CADET_Channel *send_channel; + + /** + * Flags to the sending channel + */ + uint32_t *send_channel_flags; + + /** + * Channel open from client. + */ + struct GNUNET_CADET_Channel *recv_channel; // unneeded? + + /** + * Flags to the receiving channel + */ + uint32_t *recv_channel_flags; + + /** + * Array of pending operations on this peer. + */ + struct PeerPendingOp *pending_ops; + + /** + * Handle to the callback given to cadet_ntfy_tmt_rdy() + * + * To be canceled on shutdown. + */ + struct PendingMessage *liveliness_check_pending; + + /** + * Number of pending operations. + */ + unsigned int num_pending_ops; + + /** + * Identity of the peer + */ + struct GNUNET_PeerIdentity peer_id; + + /** + * Flags indicating status of peer + */ + uint32_t peer_flags; + + /** + * Last time we received something from that peer. + */ + struct GNUNET_TIME_Absolute last_message_recv; + + /** + * Last time we received a keepalive message. + */ + struct GNUNET_TIME_Absolute last_keepalive; + + /** + * DLL with all messages that are yet to be sent + */ + struct PendingMessage *pending_messages_head; + struct PendingMessage *pending_messages_tail; + + /** + * This is pobably followed by 'statistical' data (when we first saw + * him, how did we get his ID, how many pushes (in a timeinterval), + * ...) + */ +}; + +/** + * @brief Closure to #valid_peer_iterator + */ +struct PeersIteratorCls +{ + /** + * Iterator function + */ + PeersIterator iterator; + + /** + * Closure to iterator + */ + void *cls; +}; + +/** + * @brief Hashmap of valid peers. + */ +static struct GNUNET_CONTAINER_MultiPeerMap *valid_peers; + +/** + * @brief Maximum number of valid peers to keep. + * TODO read from config + */ +static uint32_t num_valid_peers_max = UINT32_MAX; + +/** + * @brief Filename of the file that stores the valid peers persistently. + */ +static char *filename_valid_peers; + +/** + * Set of all peers to keep track of them. + */ +static struct GNUNET_CONTAINER_MultiPeerMap *peer_map; + +/** + * Cadet handle. + */ +static struct GNUNET_CADET_Handle *cadet_handle; + + + +/** + * @brief Get the #PeerContext associated with a peer + * + * @param peer the peer id + * + * @return the #PeerContext + */ +static struct PeerContext * +get_peer_ctx (const struct GNUNET_PeerIdentity *peer) +{ + struct PeerContext *ctx; + int ret; + + ret = GNUNET_CONTAINER_multipeermap_contains (peer_map, peer); + GNUNET_assert (GNUNET_YES == ret); + ctx = GNUNET_CONTAINER_multipeermap_get (peer_map, peer); + GNUNET_assert (NULL != ctx); + return ctx; +} + +int +Peers_check_peer_known (const struct GNUNET_PeerIdentity *peer); + +/** + * @brief Create a new #PeerContext and insert it into the peer map + * + * @param peer the peer to create the #PeerContext for + * + * @return the #PeerContext + */ +static struct PeerContext * +create_peer_ctx (const struct GNUNET_PeerIdentity *peer) +{ + struct PeerContext *ctx; + int ret; + + GNUNET_assert (GNUNET_NO == Peers_check_peer_known (peer)); + + ctx = GNUNET_new (struct PeerContext); + ctx->peer_id = *peer; + ctx->send_channel_flags = GNUNET_new (uint32_t); + ctx->recv_channel_flags = GNUNET_new (uint32_t); + ret = GNUNET_CONTAINER_multipeermap_put (peer_map, peer, ctx, + GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY); + GNUNET_assert (GNUNET_OK == ret); + return ctx; +} + + +/** + * @brief Create or get a #PeerContext + * + * @param peer the peer to get the associated context to + * + * @return the context + */ +static struct PeerContext * +create_or_get_peer_ctx (const struct GNUNET_PeerIdentity *peer) +{ + if (GNUNET_NO == Peers_check_peer_known (peer)) + { + return create_peer_ctx (peer); + } + return get_peer_ctx (peer); +} + +void +Peers_unset_peer_flag (const struct GNUNET_PeerIdentity *peer, enum Peers_PeerFlags flags); + +void +Peers_set_peer_flag (const struct GNUNET_PeerIdentity *peer, enum Peers_PeerFlags flags); + +/** + * @brief Check whether we have a connection to this @a peer + * + * Also sets the #Peers_ONLINE flag accordingly + * + * @param peer the peer in question + * + * @return #GNUNET_YES if we are connected + * #GNUNET_NO otherwise + */ +int +Peers_check_connected (const struct GNUNET_PeerIdentity *peer) +{ + const struct PeerContext *peer_ctx; + + /* If we don't know about this peer we don't know whether it's online */ + if (GNUNET_NO == Peers_check_peer_known (peer)) + { + return GNUNET_NO; + } + /* Get the context */ + peer_ctx = get_peer_ctx (peer); + /* If we have no channel to this peer we don't know whether it's online */ + if ( (NULL == peer_ctx->send_channel) && + (NULL == peer_ctx->recv_channel) ) + { + Peers_unset_peer_flag (peer, Peers_ONLINE); + return GNUNET_NO; + } + /* Otherwise (if we have a channel, we know that it's online */ + Peers_set_peer_flag (peer, Peers_ONLINE); + return GNUNET_YES; +} + + +/** + * @brief The closure to #get_rand_peer_iterator. + */ +struct GetRandPeerIteratorCls +{ + /** + * @brief The index of the peer to return. + * Will be decreased until 0. + * Then current peer is returned. + */ + uint32_t index; + + /** + * @brief Pointer to peer to return. + */ + const struct GNUNET_PeerIdentity *peer; +}; + + +/** + * @brief Iterator function for #get_random_peer_from_peermap. + * + * Implements #GNUNET_CONTAINER_PeerMapIterator. + * Decreases the index until the index is null. + * Then returns the current peer. + * + * @param cls the #GetRandPeerIteratorCls containing index and peer + * @param peer current peer + * @param value unused + * + * @return #GNUNET_YES if we should continue to + * iterate, + * #GNUNET_NO if not. + */ +static int +get_rand_peer_iterator (void *cls, + const struct GNUNET_PeerIdentity *peer, + void *value) +{ + struct GetRandPeerIteratorCls *iterator_cls = cls; + if (0 >= iterator_cls->index) + { + iterator_cls->peer = peer; + return GNUNET_NO; + } + iterator_cls->index--; + return GNUNET_YES; +} + + +/** + * @brief Get a random peer from @a peer_map + * + * @param peer_map the peer_map to get the peer from + * + * @return a random peer + */ +static const struct GNUNET_PeerIdentity * +get_random_peer_from_peermap (const struct + GNUNET_CONTAINER_MultiPeerMap *peer_map) +{ + struct GetRandPeerIteratorCls *iterator_cls; + const struct GNUNET_PeerIdentity *ret; + + iterator_cls = GNUNET_new (struct GetRandPeerIteratorCls); + iterator_cls->index = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK, + GNUNET_CONTAINER_multipeermap_size (peer_map)); + (void) GNUNET_CONTAINER_multipeermap_iterate (valid_peers, + get_rand_peer_iterator, + iterator_cls); + ret = iterator_cls->peer; + GNUNET_free (iterator_cls); + return ret; +} + + +/** + * @brief Add a given @a peer to valid peers. + * + * If valid peers are already #num_valid_peers_max, delete a peer previously. + * + * @param peer the peer that is added to the valid peers. + * + * @return #GNUNET_YES if no other peer had to be removed + * #GNUNET_NO otherwise + */ +static int +add_valid_peer (const struct GNUNET_PeerIdentity *peer) +{ + const struct GNUNET_PeerIdentity *rand_peer; + int ret; + + ret = GNUNET_YES; + while (GNUNET_CONTAINER_multipeermap_size (valid_peers) >= num_valid_peers_max) + { + rand_peer = get_random_peer_from_peermap (valid_peers); + GNUNET_CONTAINER_multipeermap_remove_all (valid_peers, rand_peer); + ret = GNUNET_NO; + } + (void) GNUNET_CONTAINER_multipeermap_put (valid_peers, peer, NULL, + GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY); + return ret; +} + + +/** + * @brief Set the peer flag to living and + * call the pending operations on this peer. + * + * Also adds peer to #valid_peers. + * + * @param peer_ctx the #PeerContext of the peer to set live + */ +static void +set_peer_live (struct PeerContext *peer_ctx) +{ + struct GNUNET_PeerIdentity *peer; + unsigned int i; + + peer = &peer_ctx->peer_id; + LOG (GNUNET_ERROR_TYPE_DEBUG, + "Peer %s is live and valid, calling %i pending operations on it\n", + GNUNET_i2s (peer), + peer_ctx->num_pending_ops); + + if (NULL != peer_ctx->liveliness_check_pending) + { + LOG (GNUNET_ERROR_TYPE_DEBUG, + "Removing pending liveliness check for peer %s\n", + GNUNET_i2s (&peer_ctx->peer_id)); + // TODO wait until cadet sets mq->cancel_impl + //GNUNET_MQ_send_cancel (peer_ctx->liveliness_check_pending->ev); + GNUNET_free (peer_ctx->liveliness_check_pending); + peer_ctx->liveliness_check_pending = NULL; + } + + (void) add_valid_peer (peer); + set_peer_flag (peer_ctx, Peers_ONLINE); + + /* Call pending operations */ + for (i = 0; i < peer_ctx->num_pending_ops; i++) + { + peer_ctx->pending_ops[i].op (peer_ctx->pending_ops[i].op_cls, peer); + } + GNUNET_array_grow (peer_ctx->pending_ops, peer_ctx->num_pending_ops, 0); +} + +static void +cleanup_destroyed_channel (void *cls, + const struct GNUNET_CADET_Channel *channel); + +/* Declaration of handlers */ +static void +handle_peer_check (void *cls, + const struct GNUNET_MessageHeader *msg); + +static void +handle_peer_push (void *cls, + const struct GNUNET_MessageHeader *msg); + +static void +handle_peer_pull_request (void *cls, + const struct GNUNET_MessageHeader *msg); + +static int +check_peer_pull_reply (void *cls, + const struct GNUNET_RPS_P2P_PullReplyMessage *msg); + +static void +handle_peer_pull_reply (void *cls, + const struct GNUNET_RPS_P2P_PullReplyMessage *msg); + +/* End declaration of handlers */ + + +/** + * @brief Get the channel of a peer. If not existing, create. + * + * @param peer the peer id + * @return the #GNUNET_CADET_Channel used to send data to @a peer + */ +struct GNUNET_CADET_Channel * +get_channel (const struct GNUNET_PeerIdentity *peer) +{ + struct PeerContext *peer_ctx; + struct GNUNET_HashCode port; + /* There exists a copy-paste-clone in run() */ + struct GNUNET_MQ_MessageHandler cadet_handlers[] = { + GNUNET_MQ_hd_fixed_size (peer_check, + GNUNET_MESSAGE_TYPE_RPS_PP_CHECK_LIVE, + struct GNUNET_MessageHeader, + NULL), + GNUNET_MQ_hd_fixed_size (peer_push, + GNUNET_MESSAGE_TYPE_RPS_PP_PUSH, + struct GNUNET_MessageHeader, + NULL), + GNUNET_MQ_hd_fixed_size (peer_pull_request, + GNUNET_MESSAGE_TYPE_RPS_PP_PULL_REQUEST, + struct GNUNET_MessageHeader, + NULL), + GNUNET_MQ_hd_var_size (peer_pull_reply, + GNUNET_MESSAGE_TYPE_RPS_PP_PULL_REPLY, + struct GNUNET_RPS_P2P_PullReplyMessage, + NULL), + GNUNET_MQ_handler_end () + }; + + + peer_ctx = get_peer_ctx (peer); + if (NULL == peer_ctx->send_channel) + { + LOG (GNUNET_ERROR_TYPE_DEBUG, + "Trying to establish channel to peer %s\n", + GNUNET_i2s (peer)); + GNUNET_CRYPTO_hash (GNUNET_APPLICATION_PORT_RPS, + strlen (GNUNET_APPLICATION_PORT_RPS), + &port); + peer_ctx->send_channel = + GNUNET_CADET_channel_create (cadet_handle, + (struct GNUNET_PeerIdentity *) peer, /* context */ + peer, + &port, + GNUNET_CADET_OPTION_RELIABLE, + NULL, /* WindowSize handler */ + cleanup_destroyed_channel, /* Disconnect handler */ + cadet_handlers); + } + GNUNET_assert (NULL != peer_ctx->send_channel); + return peer_ctx->send_channel; +} + + +/** + * Get the message queue (#GNUNET_MQ_Handle) of a specific peer. + * + * If we already have a message queue open to this client, + * simply return it, otherways create one. + * + * @param peer the peer to get the mq to + * @return the #GNUNET_MQ_Handle + */ +static struct GNUNET_MQ_Handle * +get_mq (const struct GNUNET_PeerIdentity *peer) +{ + struct PeerContext *peer_ctx; + + peer_ctx = get_peer_ctx (peer); + + if (NULL == peer_ctx->mq) + { + (void) get_channel (peer); + peer_ctx->mq = GNUNET_CADET_get_mq (peer_ctx->send_channel); + } + return peer_ctx->mq; +} + + +/** + * @brief This is called in response to the first message we sent as a + * liveliness check. + * + * @param cls #PeerContext of peer with pending liveliness check + */ +static void +mq_liveliness_check_successful (void *cls) +{ + struct PeerContext *peer_ctx = cls; + + if (NULL != peer_ctx->liveliness_check_pending) + { + LOG (GNUNET_ERROR_TYPE_DEBUG, + "Liveliness check for peer %s was successfull\n", + GNUNET_i2s (&peer_ctx->peer_id)); + GNUNET_free (peer_ctx->liveliness_check_pending); + peer_ctx->liveliness_check_pending = NULL; + set_peer_live (peer_ctx); + } +} + +/** + * Issue a check whether peer is live + * + * @param peer_ctx the context of the peer + */ +static void +check_peer_live (struct PeerContext *peer_ctx) +{ + LOG (GNUNET_ERROR_TYPE_DEBUG, + "Get informed about peer %s getting live\n", + GNUNET_i2s (&peer_ctx->peer_id)); + + struct GNUNET_MQ_Handle *mq; + struct GNUNET_MQ_Envelope *ev; + + ev = GNUNET_MQ_msg_header (GNUNET_MESSAGE_TYPE_RPS_PP_CHECK_LIVE); + peer_ctx->liveliness_check_pending = GNUNET_new (struct PendingMessage); + peer_ctx->liveliness_check_pending->ev = ev; + peer_ctx->liveliness_check_pending->peer_ctx = peer_ctx; + peer_ctx->liveliness_check_pending->type = "Check liveliness"; + mq = get_mq (&peer_ctx->peer_id); + GNUNET_MQ_notify_sent (ev, + mq_liveliness_check_successful, + peer_ctx); + GNUNET_MQ_send (mq, ev); +} + +/** + * @brief Add an envelope to a message passed to mq to list of pending messages + * + * @param peer peer the message was sent to + * @param ev envelope to the message + * @param type type of the message to be sent + * @return pointer to pending message + */ +static struct PendingMessage * +insert_pending_message (const struct GNUNET_PeerIdentity *peer, + struct GNUNET_MQ_Envelope *ev, + const char *type) +{ + struct PendingMessage *pending_msg; + struct PeerContext *peer_ctx; + + peer_ctx = get_peer_ctx (peer); + pending_msg = GNUNET_new (struct PendingMessage); + pending_msg->ev = ev; + pending_msg->peer_ctx = peer_ctx; + pending_msg->type = type; + GNUNET_CONTAINER_DLL_insert (peer_ctx->pending_messages_head, + peer_ctx->pending_messages_tail, + pending_msg); + return pending_msg; +} + + +/** + * @brief Remove a pending message from the respective DLL + * + * @param pending_msg the pending message to remove + * @param cancel cancel the pending message, too + */ +static void +remove_pending_message (struct PendingMessage *pending_msg, int cancel) +{ + struct PeerContext *peer_ctx; + + peer_ctx = pending_msg->peer_ctx; + GNUNET_assert (NULL != peer_ctx); + GNUNET_CONTAINER_DLL_remove (peer_ctx->pending_messages_head, + peer_ctx->pending_messages_tail, + pending_msg); + // TODO wait for the cadet implementation of message cancellation + //if (GNUNET_YES == cancel) + //{ + // GNUNET_MQ_send_cancel (pending_msg->ev); + //} + GNUNET_free (pending_msg); +} + + +/** + * @brief Check whether function of type #PeerOp was already scheduled + * + * The array with pending operations will probably never grow really big, so + * iterating over it should be ok. + * + * @param peer the peer to check + * @param peer_op the operation (#PeerOp) on the peer + * + * @return #GNUNET_YES if this operation is scheduled on that peer + * #GNUNET_NO otherwise + */ +static int +check_operation_scheduled (const struct GNUNET_PeerIdentity *peer, + const PeerOp peer_op) +{ + const struct PeerContext *peer_ctx; + unsigned int i; + + peer_ctx = get_peer_ctx (peer); + for (i = 0; i < peer_ctx->num_pending_ops; i++) + if (peer_op == peer_ctx->pending_ops[i].op) + return GNUNET_YES; + return GNUNET_NO; +} + +int +Peers_remove_peer (const struct GNUNET_PeerIdentity *peer); + +/** + * Iterator over hash map entries. Deletes all contexts of peers. + * + * @param cls closure + * @param key current public key + * @param value value in the hash map + * @return #GNUNET_YES if we should continue to iterate, + * #GNUNET_NO if not. + */ +static int +peermap_clear_iterator (void *cls, + const struct GNUNET_PeerIdentity *key, + void *value) +{ + Peers_remove_peer (key); + return GNUNET_YES; +} + + +/** + * @brief This is called once a message is sent. + * + * Removes the pending message + * + * @param cls type of the message that was sent + */ +static void +mq_notify_sent_cb (void *cls) +{ + struct PendingMessage *pending_msg = (struct PendingMessage *) cls; + LOG (GNUNET_ERROR_TYPE_DEBUG, + "%s was sent.\n", + pending_msg->type); + /* Do not cancle message */ + remove_pending_message (pending_msg, GNUNET_NO); +} + + +/** + * @brief Iterator function for #store_valid_peers. + * + * Implements #GNUNET_CONTAINER_PeerMapIterator. + * Writes single peer to disk. + * + * @param cls the file handle to write to. + * @param peer current peer + * @param value unused + * + * @return #GNUNET_YES if we should continue to + * iterate, + * #GNUNET_NO if not. + */ +static int +store_peer_presistently_iterator (void *cls, + const struct GNUNET_PeerIdentity *peer, + void *value) +{ + const struct GNUNET_DISK_FileHandle *fh = cls; + char peer_string[128]; + int size; + ssize_t ret; + + if (NULL == peer) + { + return GNUNET_YES; + } + size = GNUNET_snprintf (peer_string, + sizeof (peer_string), + "%s\n", + GNUNET_i2s_full (peer)); + GNUNET_assert (53 == size); + ret = GNUNET_DISK_file_write (fh, + peer_string, + size); + GNUNET_assert (size == ret); + return GNUNET_YES; +} + + +/** + * @brief Store the peers currently in #valid_peers to disk. + */ +static void +store_valid_peers () +{ + struct GNUNET_DISK_FileHandle *fh; + uint32_t number_written_peers; + int ret; + + if (0 == strncmp ("DISABLE", filename_valid_peers, 7)) + { + return; + } + + ret = GNUNET_DISK_directory_create_for_file (filename_valid_peers); + if (GNUNET_SYSERR == ret) + { + LOG (GNUNET_ERROR_TYPE_WARNING, + "Not able to create directory for file `%s'\n", + filename_valid_peers); + GNUNET_break (0); + } + else if (GNUNET_NO == ret) + { + LOG (GNUNET_ERROR_TYPE_WARNING, + "Directory for file `%s' exists but is not writable for us\n", + filename_valid_peers); + GNUNET_break (0); + } + fh = GNUNET_DISK_file_open (filename_valid_peers, + GNUNET_DISK_OPEN_WRITE | + GNUNET_DISK_OPEN_CREATE, + GNUNET_DISK_PERM_USER_READ | + GNUNET_DISK_PERM_USER_WRITE); + if (NULL == fh) + { + LOG (GNUNET_ERROR_TYPE_WARNING, + "Not able to write valid peers to file `%s'\n", + filename_valid_peers); + return; + } + LOG (GNUNET_ERROR_TYPE_DEBUG, + "Writing %u valid peers to disk\n", + GNUNET_CONTAINER_multipeermap_size (valid_peers)); + number_written_peers = + GNUNET_CONTAINER_multipeermap_iterate (valid_peers, + store_peer_presistently_iterator, + fh); + GNUNET_assert (GNUNET_OK == GNUNET_DISK_file_close (fh)); + GNUNET_assert (number_written_peers == + GNUNET_CONTAINER_multipeermap_size (valid_peers)); +} + + +/** + * @brief Convert string representation of peer id to peer id. + * + * Counterpart to #GNUNET_i2s_full. + * + * @param string_repr The string representation of the peer id + * + * @return The peer id + */ +static const struct GNUNET_PeerIdentity * +s2i_full (const char *string_repr) +{ + struct GNUNET_PeerIdentity *peer; + size_t len; + int ret; + + peer = GNUNET_new (struct GNUNET_PeerIdentity); + len = strlen (string_repr); + if (52 > len) + { + LOG (GNUNET_ERROR_TYPE_WARNING, + "Not able to convert string representation of PeerID to PeerID\n" + "Sting representation: %s (len %lu) - too short\n", + string_repr, + len); + GNUNET_break (0); + } + else if (52 < len) + { + len = 52; + } + ret = GNUNET_CRYPTO_eddsa_public_key_from_string (string_repr, + len, + &peer->public_key); + if (GNUNET_OK != ret) + { + LOG (GNUNET_ERROR_TYPE_WARNING, + "Not able to convert string representation of PeerID to PeerID\n" + "Sting representation: %s\n", + string_repr); + GNUNET_break (0); + } + return peer; +} + + +/** + * @brief Restore the peers on disk to #valid_peers. + */ +static void +restore_valid_peers () +{ + off_t file_size; + uint32_t num_peers; + struct GNUNET_DISK_FileHandle *fh; + char *buf; + ssize_t size_read; + char *iter_buf; + char *str_repr; + const struct GNUNET_PeerIdentity *peer; + + if (0 == strncmp ("DISABLE", filename_valid_peers, 7)) + { + return; + } + + if (GNUNET_OK != GNUNET_DISK_file_test (filename_valid_peers)) + { + return; + } + fh = GNUNET_DISK_file_open (filename_valid_peers, + GNUNET_DISK_OPEN_READ, + GNUNET_DISK_PERM_NONE); + GNUNET_assert (NULL != fh); + GNUNET_assert (GNUNET_OK == GNUNET_DISK_file_handle_size (fh, &file_size)); + num_peers = file_size / 53; + buf = GNUNET_malloc (file_size); + size_read = GNUNET_DISK_file_read (fh, buf, file_size); + GNUNET_assert (size_read == file_size); + LOG (GNUNET_ERROR_TYPE_DEBUG, + "Restoring %" PRIu32 " peers from file `%s'\n", + num_peers, + filename_valid_peers); + for (iter_buf = buf; iter_buf < buf + file_size - 1; iter_buf += 53) + { + str_repr = GNUNET_strndup (iter_buf, 53); + peer = s2i_full (str_repr); + GNUNET_free (str_repr); + add_valid_peer (peer); + LOG (GNUNET_ERROR_TYPE_DEBUG, + "Restored valid peer %s from disk\n", + GNUNET_i2s_full (peer)); + } + iter_buf = NULL; + GNUNET_free (buf); + LOG (GNUNET_ERROR_TYPE_DEBUG, + "num_peers: %" PRIu32 ", _size (valid_peers): %u\n", + num_peers, + GNUNET_CONTAINER_multipeermap_size (valid_peers)); + if (num_peers != GNUNET_CONTAINER_multipeermap_size (valid_peers)) + { + LOG (GNUNET_ERROR_TYPE_WARNING, + "Number of restored peers does not match file size. Have probably duplicates.\n"); + } + GNUNET_assert (GNUNET_OK == GNUNET_DISK_file_close (fh)); + LOG (GNUNET_ERROR_TYPE_DEBUG, + "Restored %u valid peers from disk\n", + GNUNET_CONTAINER_multipeermap_size (valid_peers)); +} + + +/** + * @brief Initialise storage of peers + * + * @param fn_valid_peers filename of the file used to store valid peer ids + * @param cadet_h cadet handle + * @param disconnect_handler Disconnect handler + * @param own_id own peer identity + */ +void +Peers_initialise (char* fn_valid_peers, + struct GNUNET_CADET_Handle *cadet_h, + GNUNET_CADET_DisconnectEventHandler disconnect_handler, + const struct GNUNET_PeerIdentity *own_id) +{ + filename_valid_peers = GNUNET_strdup (fn_valid_peers); + cadet_handle = cadet_h; + own_identity = *own_id; + peer_map = GNUNET_CONTAINER_multipeermap_create (4, GNUNET_NO); + valid_peers = GNUNET_CONTAINER_multipeermap_create (4, GNUNET_NO); + restore_valid_peers (); +} + + +/** + * @brief Delete storage of peers that was created with #Peers_initialise () + */ +void +Peers_terminate () +{ + if (GNUNET_SYSERR == + GNUNET_CONTAINER_multipeermap_iterate (peer_map, + peermap_clear_iterator, + NULL)) + { + LOG (GNUNET_ERROR_TYPE_WARNING, + "Iteration destroying peers was aborted.\n"); + } + GNUNET_CONTAINER_multipeermap_destroy (peer_map); + store_valid_peers (); + GNUNET_free (filename_valid_peers); + GNUNET_CONTAINER_multipeermap_destroy (valid_peers); +} + + +/** + * Iterator over #valid_peers hash map entries. + * + * @param cls closure - unused + * @param peer current peer id + * @param value value in the hash map - unused + * @return #GNUNET_YES if we should continue to + * iterate, + * #GNUNET_NO if not. + */ +static int +valid_peer_iterator (void *cls, + const struct GNUNET_PeerIdentity *peer, + void *value) +{ + struct PeersIteratorCls *it_cls = cls; + + return it_cls->iterator (it_cls->cls, + peer); +} + + +/** + * @brief Get all currently known, valid peer ids. + * + * @param it function to call on each peer id + * @param it_cls extra argument to @a it + * @return the number of key value pairs processed, + * #GNUNET_SYSERR if it aborted iteration + */ +int +Peers_get_valid_peers (PeersIterator iterator, + void *it_cls) +{ + struct PeersIteratorCls *cls; + int ret; + + cls = GNUNET_new (struct PeersIteratorCls); + cls->iterator = iterator; + cls->cls = it_cls; + ret = GNUNET_CONTAINER_multipeermap_iterate (valid_peers, + valid_peer_iterator, + cls); + GNUNET_free (cls); + return ret; +} + + +/** + * @brief Add peer to known peers. + * + * This function is called on new peer_ids from 'external' sources + * (client seed, cadet get_peers(), ...) + * + * @param peer the new #GNUNET_PeerIdentity + * + * @return #GNUNET_YES if peer was inserted + * #GNUNET_NO otherwise (if peer was already known or + * peer was #own_identity) + */ +int +Peers_insert_peer (const struct GNUNET_PeerIdentity *peer) +{ + if ( (GNUNET_YES == Peers_check_peer_known (peer)) || + (0 == GNUNET_CRYPTO_cmp_peer_identity (peer, &own_identity)) ) + { + return GNUNET_NO; /* We already know this peer - nothing to do */ + } + (void) create_peer_ctx (peer); + return GNUNET_YES; +} + +int +Peers_check_peer_flag (const struct GNUNET_PeerIdentity *peer, enum Peers_PeerFlags flags); + +/** + * @brief Try connecting to a peer to see whether it is online + * + * If not known yet, insert into known peers + * + * @param peer the peer whose liveliness is to be checked + * @return #GNUNET_YES if peer had to be inserted + * #GNUNET_NO otherwise (if peer was already known or + * peer was #own_identity) + */ +int +Peers_issue_peer_liveliness_check (const struct GNUNET_PeerIdentity *peer) +{ + struct PeerContext *peer_ctx; + int ret; + + if (0 == GNUNET_CRYPTO_cmp_peer_identity (peer, &own_identity)) + { + return GNUNET_NO; + } + ret = Peers_insert_peer (peer); + peer_ctx = get_peer_ctx (peer); + if (GNUNET_NO == Peers_check_peer_flag (peer, Peers_ONLINE)) + { + check_peer_live (peer_ctx); + } + return ret; +} + + +/** + * @brief Check if peer is removable. + * + * Check if + * - a recv channel exists + * - there are pending messages + * - there is no pending pull reply + * + * @param peer the peer in question + * @return #GNUNET_YES if peer is removable + * #GNUNET_NO if peer is NOT removable + * #GNUNET_SYSERR if peer is not known + */ +int +Peers_check_removable (const struct GNUNET_PeerIdentity *peer) +{ + struct PeerContext *peer_ctx; + + if (GNUNET_NO == GNUNET_CONTAINER_multipeermap_contains (peer_map, peer)) + { + return GNUNET_SYSERR; + } + + peer_ctx = get_peer_ctx (peer); + if ( (NULL != peer_ctx->recv_channel) || + (NULL != peer_ctx->pending_messages_head) || + (GNUNET_NO == check_peer_flag_set (peer_ctx, Peers_PULL_REPLY_PENDING)) ) + { + return GNUNET_NO; + } + return GNUNET_YES; +} + +uint32_t * +Peers_get_channel_flag (const struct GNUNET_PeerIdentity *peer, + enum Peers_ChannelRole role); + +int +Peers_check_channel_flag (uint32_t *channel_flags, enum Peers_ChannelFlags flags); + +/** + * @brief Remove peer + * + * @param peer the peer to clean + * @return #GNUNET_YES if peer was removed + * #GNUNET_NO otherwise + */ +int +Peers_remove_peer (const struct GNUNET_PeerIdentity *peer) +{ + struct PeerContext *peer_ctx; + uint32_t *channel_flag; + + if (GNUNET_NO == GNUNET_CONTAINER_multipeermap_contains (peer_map, peer)) + { + return GNUNET_NO; + } + + peer_ctx = get_peer_ctx (peer); + set_peer_flag (peer_ctx, Peers_TO_DESTROY); + LOG (GNUNET_ERROR_TYPE_DEBUG, + "Going to remove peer %s\n", + GNUNET_i2s (&peer_ctx->peer_id)); + Peers_unset_peer_flag (peer, Peers_ONLINE); + + GNUNET_array_grow (peer_ctx->pending_ops, peer_ctx->num_pending_ops, 0); + while (NULL != peer_ctx->pending_messages_head) + { + LOG (GNUNET_ERROR_TYPE_DEBUG, + "Removing unsent %s\n", + peer_ctx->pending_messages_head->type); + /* Cancle pending message, too */ + remove_pending_message (peer_ctx->pending_messages_head, GNUNET_YES); + } + /* If we are still waiting for notification whether this peer is live + * cancel the according task */ + if (NULL != peer_ctx->liveliness_check_pending) + { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Removing pending liveliness check for peer %s\n", + GNUNET_i2s (&peer_ctx->peer_id)); + // TODO wait until cadet sets mq->cancel_impl + //GNUNET_MQ_send_cancel (peer_ctx->liveliness_check_pending->ev); + GNUNET_free (peer_ctx->liveliness_check_pending); + peer_ctx->liveliness_check_pending = NULL; + } + channel_flag = Peers_get_channel_flag (peer, Peers_CHANNEL_ROLE_SENDING); + if (NULL != peer_ctx->send_channel && + GNUNET_YES != Peers_check_channel_flag (channel_flag, Peers_CHANNEL_DESTROING)) + { + LOG (GNUNET_ERROR_TYPE_DEBUG, + "Destroying send channel\n"); + GNUNET_CADET_channel_destroy (peer_ctx->send_channel); + peer_ctx->send_channel = NULL; + } + channel_flag = Peers_get_channel_flag (peer, Peers_CHANNEL_ROLE_RECEIVING); + if (NULL != peer_ctx->recv_channel && + GNUNET_YES != Peers_check_channel_flag (channel_flag, Peers_CHANNEL_DESTROING)) + { + LOG (GNUNET_ERROR_TYPE_DEBUG, + "Destroying recv channel\n"); + GNUNET_CADET_channel_destroy (peer_ctx->recv_channel); + peer_ctx->recv_channel = NULL; + } + + GNUNET_free (peer_ctx->send_channel_flags); + GNUNET_free (peer_ctx->recv_channel_flags); + + if (GNUNET_YES != GNUNET_CONTAINER_multipeermap_remove_all (peer_map, &peer_ctx->peer_id)) + { + LOG (GNUNET_ERROR_TYPE_WARNING, "removing peer from peer_map failed\n"); + } + GNUNET_free (peer_ctx); + return GNUNET_YES; +} + + +/** + * @brief set flags on a given peer. + * + * @param peer the peer to set flags on + * @param flags the flags + */ +void +Peers_set_peer_flag (const struct GNUNET_PeerIdentity *peer, enum Peers_PeerFlags flags) +{ + struct PeerContext *peer_ctx; + + peer_ctx = get_peer_ctx (peer); + set_peer_flag (peer_ctx, flags); +} + + +/** + * @brief unset flags on a given peer. + * + * @param peer the peer to unset flags on + * @param flags the flags + */ +void +Peers_unset_peer_flag (const struct GNUNET_PeerIdentity *peer, enum Peers_PeerFlags flags) +{ + struct PeerContext *peer_ctx; + + peer_ctx = get_peer_ctx (peer); + unset_peer_flag (peer_ctx, flags); +} + + +/** + * @brief Check whether flags on a peer are set. + * + * @param peer the peer to check the flag of + * @param flags the flags to check + * + * @return #GNUNET_SYSERR if peer is not known + * #GNUNET_YES if all given flags are set + * #GNUNET_NO otherwise + */ +int +Peers_check_peer_flag (const struct GNUNET_PeerIdentity *peer, enum Peers_PeerFlags flags) +{ + struct PeerContext *peer_ctx; + + if (GNUNET_NO == Peers_check_peer_known (peer)) + { + return GNUNET_SYSERR; + } + peer_ctx = get_peer_ctx (peer); + return check_peer_flag_set (peer_ctx, flags); +} + + +/** + * @brief set flags on a given channel. + * + * @param channel the channel to set flags on + * @param flags the flags + */ +void +Peers_set_channel_flag (uint32_t *channel_flags, enum Peers_ChannelFlags flags) +{ + set_channel_flag (channel_flags, flags); +} + + +/** + * @brief unset flags on a given channel. + * + * @param channel the channel to unset flags on + * @param flags the flags + */ +void +Peers_unset_channel_flag (uint32_t *channel_flags, enum Peers_ChannelFlags flags) +{ + unset_channel_flag (channel_flags, flags); +} + + +/** + * @brief Check whether flags on a channel are set. + * + * @param channel the channel to check the flag of + * @param flags the flags to check + * + * @return #GNUNET_YES if all given flags are set + * #GNUNET_NO otherwise + */ +int +Peers_check_channel_flag (uint32_t *channel_flags, enum Peers_ChannelFlags flags) +{ + return check_channel_flag_set (channel_flags, flags); +} + +/** + * @brief Get the flags for the channel in @a role for @a peer. + * + * @param peer Peer to get the channel flags for. + * @param role Role of channel to get flags for + * + * @return The flags. + */ +uint32_t * +Peers_get_channel_flag (const struct GNUNET_PeerIdentity *peer, + enum Peers_ChannelRole role) +{ + const struct PeerContext *peer_ctx; + + peer_ctx = get_peer_ctx (peer); + if (Peers_CHANNEL_ROLE_SENDING == role) + { + return peer_ctx->send_channel_flags; + } + else if (Peers_CHANNEL_ROLE_RECEIVING == role) + { + return peer_ctx->recv_channel_flags; + } + else + { + GNUNET_assert (0); + } +} + +/** + * @brief Check whether we have information about the given peer. + * + * FIXME probably deprecated. Make this the new _online. + * + * @param peer peer in question + * + * @return #GNUNET_YES if peer is known + * #GNUNET_NO if peer is not knwon + */ +int +Peers_check_peer_known (const struct GNUNET_PeerIdentity *peer) +{ + return GNUNET_CONTAINER_multipeermap_contains (peer_map, peer); +} + + +/** + * @brief Check whether @a peer is actually a peer. + * + * A valid peer is a peer that we know exists eg. we were connected to once. + * + * @param peer peer in question + * + * @return #GNUNET_YES if peer is valid + * #GNUNET_NO if peer is not valid + */ +int +Peers_check_peer_valid (const struct GNUNET_PeerIdentity *peer) +{ + return GNUNET_CONTAINER_multipeermap_contains (valid_peers, peer); +} + + +/** + * @brief Indicate that we want to send to the other peer + * + * This establishes a sending channel + * + * @param peer the peer to establish channel to + */ +void +Peers_indicate_sending_intention (const struct GNUNET_PeerIdentity *peer) +{ + GNUNET_assert (GNUNET_YES == Peers_check_peer_known (peer)); + (void) get_channel (peer); +} + + +/** + * @brief Check whether other peer has the intention to send/opened channel + * towars us + * + * @param peer the peer in question + * + * @return #GNUNET_YES if peer has the intention to send + * #GNUNET_NO otherwise + */ +int +Peers_check_peer_send_intention (const struct GNUNET_PeerIdentity *peer) +{ + const struct PeerContext *peer_ctx; + + peer_ctx = get_peer_ctx (peer); + if (NULL != peer_ctx->recv_channel) + { + return GNUNET_YES; + } + return GNUNET_NO; +} + + +/** + * Handle the channel a peer opens to us. + * + * @param cls The closure + * @param channel The channel the peer wants to establish + * @param initiator The peer's peer ID + * + * @return initial channel context for the channel + * (can be NULL -- that's not an error) + */ +void * +Peers_handle_inbound_channel (void *cls, + struct GNUNET_CADET_Channel *channel, + const struct GNUNET_PeerIdentity *initiator) +{ + struct PeerContext *peer_ctx; + + LOG (GNUNET_ERROR_TYPE_DEBUG, + "New channel was established to us (Peer %s).\n", + GNUNET_i2s (initiator)); + GNUNET_assert (NULL != channel); /* according to cadet API */ + /* Make sure we 'know' about this peer */ + peer_ctx = create_or_get_peer_ctx (initiator); + set_peer_live (peer_ctx); + /* We only accept one incoming channel per peer */ + if (GNUNET_YES == Peers_check_peer_send_intention (initiator)) + { + set_channel_flag (peer_ctx->recv_channel_flags, + Peers_CHANNEL_ESTABLISHED_TWICE); + GNUNET_CADET_channel_destroy (channel); + /* return the channel context */ + return &peer_ctx->peer_id; + } + peer_ctx->recv_channel = channel; + return &peer_ctx->peer_id; +} + + +/** + * @brief Check whether a sending channel towards the given peer exists + * + * @param peer the peer to check for + * + * @return #GNUNET_YES if a sending channel towards that peer exists + * #GNUNET_NO otherwise + */ +int +Peers_check_sending_channel_exists (const struct GNUNET_PeerIdentity *peer) +{ + struct PeerContext *peer_ctx; + + if (GNUNET_NO == Peers_check_peer_known (peer)) + { /* If no such peer exists, there is no channel */ + return GNUNET_NO; + } + peer_ctx = get_peer_ctx (peer); + if (NULL == peer_ctx->send_channel) + { + return GNUNET_NO; + } + return GNUNET_YES; +} + + +/** + * @brief check whether the given channel is the sending channel of the given + * peer + * + * @param peer the peer in question + * @param channel the channel to check for + * @param role either #Peers_CHANNEL_ROLE_SENDING, or + * #Peers_CHANNEL_ROLE_RECEIVING + * + * @return #GNUNET_YES if the given chennel is the sending channel of the peer + * #GNUNET_NO otherwise + */ +int +Peers_check_channel_role (const struct GNUNET_PeerIdentity *peer, + const struct GNUNET_CADET_Channel *channel, + enum Peers_ChannelRole role) +{ + const struct PeerContext *peer_ctx; + + if (GNUNET_NO == Peers_check_peer_known (peer)) + { + return GNUNET_NO; + } + peer_ctx = get_peer_ctx (peer); + if ( (Peers_CHANNEL_ROLE_SENDING == role) && + (channel == peer_ctx->send_channel) ) + { + return GNUNET_YES; + } + if ( (Peers_CHANNEL_ROLE_RECEIVING == role) && + (channel == peer_ctx->recv_channel) ) + { + return GNUNET_YES; + } + return GNUNET_NO; +} + + +/** + * @brief Destroy the send channel of a peer e.g. stop indicating a sending + * intention to another peer + * + * If there is also no channel to receive messages from that peer, remove it + * from the peermap. + * TODO really? + * + * @peer the peer identity of the peer whose sending channel to destroy + * @return #GNUNET_YES if channel was destroyed + * #GNUNET_NO otherwise + */ +int +Peers_destroy_sending_channel (const struct GNUNET_PeerIdentity *peer) +{ + struct PeerContext *peer_ctx; + + if (GNUNET_NO == Peers_check_peer_known (peer)) + { + return GNUNET_NO; + } + peer_ctx = get_peer_ctx (peer); + if (NULL != peer_ctx->send_channel) + { + set_channel_flag (peer_ctx->send_channel_flags, Peers_CHANNEL_CLEAN); + GNUNET_CADET_channel_destroy (peer_ctx->send_channel); + peer_ctx->send_channel = NULL; + (void) Peers_check_connected (peer); + return GNUNET_YES; + } + return GNUNET_NO; +} + +/** + * This is called when a channel is destroyed. + * + * @param cls The closure + * @param channel The channel being closed + * @param channel_ctx The context associated with this channel + */ +void +Peers_cleanup_destroyed_channel (void *cls, + const struct GNUNET_CADET_Channel *channel) +{ + struct GNUNET_PeerIdentity *peer = cls; + struct PeerContext *peer_ctx; + + if (GNUNET_NO == Peers_check_peer_known (peer)) + {/* We don't want to implicitly create a context that we're about to kill */ + LOG (GNUNET_ERROR_TYPE_DEBUG, + "channel (%s) without associated context was destroyed\n", + GNUNET_i2s (peer)); + return; + } + peer_ctx = get_peer_ctx (peer); + + /* If our peer issued the destruction of the channel, the #Peers_TO_DESTROY + * flag will be set. In this case simply make sure that the channels are + * cleaned. */ + /* FIXME This distinction seems to be redundant */ + if (Peers_check_peer_flag (peer, Peers_TO_DESTROY)) + {/* We initiatad the destruction of this particular peer */ + if (channel == peer_ctx->send_channel) + peer_ctx->send_channel = NULL; + else if (channel == peer_ctx->recv_channel) + peer_ctx->recv_channel = NULL; + + if (NULL != peer_ctx->send_channel) + { + GNUNET_CADET_channel_destroy (peer_ctx->send_channel); + peer_ctx->send_channel = NULL; + } + if (NULL != peer_ctx->recv_channel) + { + GNUNET_CADET_channel_destroy (peer_ctx->recv_channel); + peer_ctx->recv_channel = NULL; + } + /* Set the #Peers_ONLINE flag accordingly */ + (void) Peers_check_connected (peer); + return; + } + + else + { /* We did not initiate the destruction of this peer */ + if (channel == peer_ctx->send_channel) + { /* Something (but us) killd the channel - clean up peer */ + LOG (GNUNET_ERROR_TYPE_DEBUG, + "send channel (%s) was destroyed - cleaning up\n", + GNUNET_i2s (peer)); + peer_ctx->send_channel = NULL; + } + else if (channel == peer_ctx->recv_channel) + { /* Other peer doesn't want to send us messages anymore */ + LOG (GNUNET_ERROR_TYPE_DEBUG, + "Peer %s destroyed recv channel - cleaning up channel\n", + GNUNET_i2s (peer)); + peer_ctx->recv_channel = NULL; + } + else + { + LOG (GNUNET_ERROR_TYPE_WARNING, + "unknown channel (%s) was destroyed\n", + GNUNET_i2s (peer)); + } + } + (void) Peers_check_connected (peer); +} + +/** + * @brief Send a message to another peer. + * + * Keeps track about pending messages so they can be properly removed when the + * peer is destroyed. + * + * @param peer receeiver of the message + * @param ev envelope of the message + * @param type type of the message + */ +void +Peers_send_message (const struct GNUNET_PeerIdentity *peer, + struct GNUNET_MQ_Envelope *ev, + const char *type) +{ + struct PendingMessage *pending_msg; + struct GNUNET_MQ_Handle *mq; + + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Sending message to %s of type %s\n", + GNUNET_i2s (peer), + type); + pending_msg = insert_pending_message (peer, ev, type); + mq = get_mq (peer); + GNUNET_MQ_notify_sent (ev, + mq_notify_sent_cb, + pending_msg); + GNUNET_MQ_send (mq, ev); +} + +/** + * @brief Schedule a operation on given peer + * + * Avoids scheduling an operation twice. + * + * @param peer the peer we want to schedule the operation for once it gets live + * + * @return #GNUNET_YES if the operation was scheduled + * #GNUNET_NO otherwise + */ +int +Peers_schedule_operation (const struct GNUNET_PeerIdentity *peer, + const PeerOp peer_op) +{ + struct PeerPendingOp pending_op; + struct PeerContext *peer_ctx; + + if (0 == GNUNET_CRYPTO_cmp_peer_identity (peer, &own_identity)) + { + return GNUNET_NO; + } + GNUNET_assert (GNUNET_YES == Peers_check_peer_known (peer)); + + //TODO if LIVE/ONLINE execute immediately + + if (GNUNET_NO == check_operation_scheduled (peer, peer_op)) + { + peer_ctx = get_peer_ctx (peer); + pending_op.op = peer_op; + pending_op.op_cls = NULL; + GNUNET_array_append (peer_ctx->pending_ops, + peer_ctx->num_pending_ops, + pending_op); + return GNUNET_YES; + } + return GNUNET_NO; +} + +/** + * @brief Get the recv_channel of @a peer. + * Needed to correctly handle (call #GNUNET_CADET_receive_done()) incoming + * messages. + * + * @param peer The peer to get the recv_channel from. + * + * @return The recv_channel. + */ +struct GNUNET_CADET_Channel * +Peers_get_recv_channel (const struct GNUNET_PeerIdentity *peer) +{ + struct PeerContext *peer_ctx; + + GNUNET_assert (GNUNET_YES == Peers_check_peer_known (peer)); + peer_ctx = get_peer_ctx (peer); + return peer_ctx->recv_channel; +} +/*********************************************************************** + * /Old gnunet-service-rps_peers.c +***********************************************************************/ + + /*********************************************************************** * Housekeeping with clients ***********************************************************************/ @@ -847,6 +2568,7 @@ cleanup_destroyed_channel (void *cls, { struct GNUNET_PeerIdentity *peer = cls; uint32_t *channel_flag; + struct PeerContext *peer_ctx; if (GNUNET_NO == Peers_check_peer_known (peer)) { /* We don't know a context to that peer */ @@ -856,6 +2578,15 @@ cleanup_destroyed_channel (void *cls, return; } + peer_ctx = get_peer_ctx (peer); + if (GNUNET_YES == Peers_check_channel_role (peer, channel, Peers_CHANNEL_ROLE_RECEIVING)) + { + set_channel_flag (peer_ctx->recv_channel_flags, Peers_CHANNEL_DESTROING); + } else if (GNUNET_YES == Peers_check_channel_role (peer, channel, Peers_CHANNEL_ROLE_SENDING)) + { + set_channel_flag (peer_ctx->send_channel_flags, Peers_CHANNEL_DESTROING); + } + if (GNUNET_YES == Peers_check_peer_flag (peer, Peers_TO_DESTROY)) { /* We are in the middle of removing that peer from our knowledge. In this case simply make sure that the channels are cleaned. */ @@ -1121,7 +2852,6 @@ handle_client_request_cancel (void *cls, (rep_cls->id != ntohl (msg->id)) ) rep_cls = rep_cls->next; GNUNET_assert (rep_cls->id == ntohl (msg->id)); - RPS_sampler_request_cancel (rep_cls->req_handle); destroy_reply_cls (rep_cls); GNUNET_SERVICE_client_continue (cli_ctx->client); } @@ -2129,7 +3859,6 @@ shutdown_task (void *cls) reply_cls); GNUNET_free (reply_cls); } - GNUNET_MQ_destroy (client_ctx->mq); GNUNET_CONTAINER_DLL_remove (cli_ctx_head, cli_ctx_tail, client_ctx); GNUNET_free (client_ctx); } @@ -2238,26 +3967,6 @@ run (void *cls, const struct GNUNET_CONFIGURATION_Handle *c, struct GNUNET_SERVICE_Handle *service) { - struct GNUNET_MQ_MessageHandler cadet_handlers[] = { - GNUNET_MQ_hd_fixed_size (peer_check, - GNUNET_MESSAGE_TYPE_RPS_PP_CHECK_LIVE, - struct GNUNET_MessageHeader, - NULL), - GNUNET_MQ_hd_fixed_size (peer_push, - GNUNET_MESSAGE_TYPE_RPS_PP_PUSH, - struct GNUNET_MessageHeader, - NULL), - GNUNET_MQ_hd_fixed_size (peer_pull_request, - GNUNET_MESSAGE_TYPE_RPS_PP_PULL_REQUEST, - struct GNUNET_MessageHeader, - NULL), - GNUNET_MQ_hd_var_size (peer_pull_reply, - GNUNET_MESSAGE_TYPE_RPS_PP_PULL_REPLY, - struct GNUNET_RPS_P2P_PullReplyMessage, - NULL), - GNUNET_MQ_handler_end () - }; - int size; int out_size; char* fn_valid_peers; @@ -2347,6 +4056,27 @@ run (void *cls, /* Initialise cadet */ + /* There exists a copy-paste-clone in get_channel() */ + struct GNUNET_MQ_MessageHandler cadet_handlers[] = { + GNUNET_MQ_hd_fixed_size (peer_check, + GNUNET_MESSAGE_TYPE_RPS_PP_CHECK_LIVE, + struct GNUNET_MessageHeader, + NULL), + GNUNET_MQ_hd_fixed_size (peer_push, + GNUNET_MESSAGE_TYPE_RPS_PP_PUSH, + struct GNUNET_MessageHeader, + NULL), + GNUNET_MQ_hd_fixed_size (peer_pull_request, + GNUNET_MESSAGE_TYPE_RPS_PP_PULL_REQUEST, + struct GNUNET_MessageHeader, + NULL), + GNUNET_MQ_hd_var_size (peer_pull_reply, + GNUNET_MESSAGE_TYPE_RPS_PP_PULL_REPLY, + struct GNUNET_RPS_P2P_PullReplyMessage, + NULL), + GNUNET_MQ_handler_end () + }; + cadet_handle = GNUNET_CADET_connect (cfg); GNUNET_assert (NULL != cadet_handle); GNUNET_CRYPTO_hash (GNUNET_APPLICATION_PORT_RPS, @@ -2363,7 +4093,7 @@ run (void *cls, peerinfo_handle = GNUNET_PEERINFO_connect (cfg); Peers_initialise (fn_valid_peers, cadet_handle, cleanup_destroyed_channel, - cadet_handlers, &own_identity); + &own_identity); GNUNET_free (fn_valid_peers); /* Initialise sampler */ diff --git a/src/rps/gnunet-service-rps_peers.c b/src/rps/gnunet-service-rps_peers.c @@ -1,1698 +0,0 @@ -/* - This file is part of GNUnet. - Copyright (C) - - GNUnet is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published - by the Free Software Foundation; either version 3, or (at your - option) any later version. - - GNUnet is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GNUnet; see the file COPYING. If not, write to the - Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. -*/ - -/** - * @file rps/gnunet-service-rps_peers.c - * @brief utilities for managing (information about) peers - * @author Julius Bünger - */ -#include "platform.h" -#include "gnunet_applications.h" -#include "gnunet_util_lib.h" -#include "gnunet_cadet_service.h" -#include <inttypes.h> -#include "rps.h" -#include "gnunet-service-rps_peers.h" - - - -#define LOG(kind, ...) GNUNET_log_from(kind,"rps-peers",__VA_ARGS__) - - -/** - * Set a peer flag of given peer context. - */ -#define set_peer_flag(peer_ctx, mask) ((peer_ctx->peer_flags) |= (mask)) - -/** - * Get peer flag of given peer context. - */ -#define check_peer_flag_set(peer_ctx, mask)\ - ((peer_ctx->peer_flags) & (mask) ? GNUNET_YES : GNUNET_NO) - -/** - * Unset flag of given peer context. - */ -#define unset_peer_flag(peer_ctx, mask) ((peer_ctx->peer_flags) &= ~(mask)) - -/** - * Set a channel flag of given channel context. - */ -#define set_channel_flag(channel_flags, mask) ((*channel_flags) |= (mask)) - -/** - * Get channel flag of given channel context. - */ -#define check_channel_flag_set(channel_flags, mask)\ - ((*channel_flags) & (mask) ? GNUNET_YES : GNUNET_NO) - -/** - * Unset flag of given channel context. - */ -#define unset_channel_flag(channel_flags, mask) ((*channel_flags) &= ~(mask)) - - - -/** - * Pending operation on peer consisting of callback and closure - * - * When an operation cannot be executed right now this struct is used to store - * the callback and closure for later execution. - */ -struct PeerPendingOp -{ - /** - * Callback - */ - PeerOp op; - - /** - * Closure - */ - void *op_cls; -}; - -/** - * List containing all messages that are yet to be send - * - * This is used to keep track of all messages that have not been sent yet. When - * a peer is to be removed the pending messages can be removed properly. - */ -struct PendingMessage -{ - /** - * DLL next, prev - */ - struct PendingMessage *next; - struct PendingMessage *prev; - - /** - * The envelope to the corresponding message - */ - struct GNUNET_MQ_Envelope *ev; - - /** - * The corresponding context - */ - struct PeerContext *peer_ctx; - - /** - * The message type - */ - const char *type; -}; - -/** - * Struct used to keep track of other peer's status - * - * This is stored in a multipeermap. - * It contains information such as cadet channels, a message queue for sending, - * status about the channels, the pending operations on this peer and some flags - * about the status of the peer itself. (live, valid, ...) - */ -struct PeerContext -{ - /** - * Message queue open to client - */ - struct GNUNET_MQ_Handle *mq; - - /** - * Channel open to client. - */ - struct GNUNET_CADET_Channel *send_channel; - - /** - * Flags to the sending channel - */ - uint32_t *send_channel_flags; - - /** - * Channel open from client. - */ - struct GNUNET_CADET_Channel *recv_channel; // unneeded? - - /** - * Flags to the receiving channel - */ - uint32_t *recv_channel_flags; - - /** - * Array of pending operations on this peer. - */ - struct PeerPendingOp *pending_ops; - - /** - * Handle to the callback given to cadet_ntfy_tmt_rdy() - * - * To be canceled on shutdown. - */ - struct PendingMessage *liveliness_check_pending; - - /** - * Number of pending operations. - */ - unsigned int num_pending_ops; - - /** - * Identity of the peer - */ - struct GNUNET_PeerIdentity peer_id; - - /** - * Flags indicating status of peer - */ - uint32_t peer_flags; - - /** - * Last time we received something from that peer. - */ - struct GNUNET_TIME_Absolute last_message_recv; - - /** - * Last time we received a keepalive message. - */ - struct GNUNET_TIME_Absolute last_keepalive; - - /** - * DLL with all messages that are yet to be sent - */ - struct PendingMessage *pending_messages_head; - struct PendingMessage *pending_messages_tail; - - /** - * This is pobably followed by 'statistical' data (when we first saw - * him, how did we get his ID, how many pushes (in a timeinterval), - * ...) - */ -}; - -/** - * @brief Closure to #valid_peer_iterator - */ -struct PeersIteratorCls -{ - /** - * Iterator function - */ - PeersIterator iterator; - - /** - * Closure to iterator - */ - void *cls; -}; - -/** - * @brief Hashmap of valid peers. - */ -static struct GNUNET_CONTAINER_MultiPeerMap *valid_peers; - -/** - * @brief Maximum number of valid peers to keep. - * TODO read from config - */ -static uint32_t num_valid_peers_max = UINT32_MAX; - -/** - * @brief Filename of the file that stores the valid peers persistently. - */ -static char *filename_valid_peers; - -/** - * Set of all peers to keep track of them. - */ -static struct GNUNET_CONTAINER_MultiPeerMap *peer_map; - -/** - * Own #GNUNET_PeerIdentity. - */ -static const struct GNUNET_PeerIdentity *own_identity; - -/** - * Cadet handle. - */ -static struct GNUNET_CADET_Handle *cadet_handle; - -/** - * @brief Disconnect handler - */ -static GNUNET_CADET_DisconnectEventHandler cleanup_destroyed_channel; - -/** - * @brief cadet handlers - */ -static const struct GNUNET_MQ_MessageHandler *cadet_handlers; - - - -/** - * @brief Get the #PeerContext associated with a peer - * - * @param peer the peer id - * - * @return the #PeerContext - */ -static struct PeerContext * -get_peer_ctx (const struct GNUNET_PeerIdentity *peer) -{ - struct PeerContext *ctx; - int ret; - - ret = GNUNET_CONTAINER_multipeermap_contains (peer_map, peer); - GNUNET_assert (GNUNET_YES == ret); - ctx = GNUNET_CONTAINER_multipeermap_get (peer_map, peer); - GNUNET_assert (NULL != ctx); - return ctx; -} - - -/** - * @brief Create a new #PeerContext and insert it into the peer map - * - * @param peer the peer to create the #PeerContext for - * - * @return the #PeerContext - */ -static struct PeerContext * -create_peer_ctx (const struct GNUNET_PeerIdentity *peer) -{ - struct PeerContext *ctx; - int ret; - - GNUNET_assert (GNUNET_NO == Peers_check_peer_known (peer)); - - ctx = GNUNET_new (struct PeerContext); - ctx->peer_id = *peer; - ctx->send_channel_flags = GNUNET_new (uint32_t); - ctx->recv_channel_flags = GNUNET_new (uint32_t); - ret = GNUNET_CONTAINER_multipeermap_put (peer_map, peer, ctx, - GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY); - GNUNET_assert (GNUNET_OK == ret); - return ctx; -} - - -/** - * @brief Create or get a #PeerContext - * - * @param peer the peer to get the associated context to - * - * @return the context - */ -static struct PeerContext * -create_or_get_peer_ctx (const struct GNUNET_PeerIdentity *peer) -{ - if (GNUNET_NO == Peers_check_peer_known (peer)) - { - return create_peer_ctx (peer); - } - return get_peer_ctx (peer); -} - - -/** - * @brief Check whether we have a connection to this @a peer - * - * Also sets the #Peers_ONLINE flag accordingly - * - * @param peer the peer in question - * - * @return #GNUNET_YES if we are connected - * #GNUNET_NO otherwise - */ -int -Peers_check_connected (const struct GNUNET_PeerIdentity *peer) -{ - const struct PeerContext *peer_ctx; - - /* If we don't know about this peer we don't know whether it's online */ - if (GNUNET_NO == Peers_check_peer_known (peer)) - { - return GNUNET_NO; - } - /* Get the context */ - peer_ctx = get_peer_ctx (peer); - /* If we have no channel to this peer we don't know whether it's online */ - if ( (NULL == peer_ctx->send_channel) && - (NULL == peer_ctx->recv_channel) ) - { - Peers_unset_peer_flag (peer, Peers_ONLINE); - return GNUNET_NO; - } - /* Otherwise (if we have a channel, we know that it's online */ - Peers_set_peer_flag (peer, Peers_ONLINE); - return GNUNET_YES; -} - - -/** - * @brief The closure to #get_rand_peer_iterator. - */ -struct GetRandPeerIteratorCls -{ - /** - * @brief The index of the peer to return. - * Will be decreased until 0. - * Then current peer is returned. - */ - uint32_t index; - - /** - * @brief Pointer to peer to return. - */ - const struct GNUNET_PeerIdentity *peer; -}; - - -/** - * @brief Iterator function for #get_random_peer_from_peermap. - * - * Implements #GNUNET_CONTAINER_PeerMapIterator. - * Decreases the index until the index is null. - * Then returns the current peer. - * - * @param cls the #GetRandPeerIteratorCls containing index and peer - * @param peer current peer - * @param value unused - * - * @return #GNUNET_YES if we should continue to - * iterate, - * #GNUNET_NO if not. - */ -static int -get_rand_peer_iterator (void *cls, - const struct GNUNET_PeerIdentity *peer, - void *value) -{ - struct GetRandPeerIteratorCls *iterator_cls = cls; - if (0 >= iterator_cls->index) - { - iterator_cls->peer = peer; - return GNUNET_NO; - } - iterator_cls->index--; - return GNUNET_YES; -} - - -/** - * @brief Get a random peer from @a peer_map - * - * @param peer_map the peer_map to get the peer from - * - * @return a random peer - */ -static const struct GNUNET_PeerIdentity * -get_random_peer_from_peermap (const struct - GNUNET_CONTAINER_MultiPeerMap *peer_map) -{ - struct GetRandPeerIteratorCls *iterator_cls; - const struct GNUNET_PeerIdentity *ret; - - iterator_cls = GNUNET_new (struct GetRandPeerIteratorCls); - iterator_cls->index = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK, - GNUNET_CONTAINER_multipeermap_size (peer_map)); - (void) GNUNET_CONTAINER_multipeermap_iterate (valid_peers, - get_rand_peer_iterator, - iterator_cls); - ret = iterator_cls->peer; - GNUNET_free (iterator_cls); - return ret; -} - - -/** - * @brief Add a given @a peer to valid peers. - * - * If valid peers are already #num_valid_peers_max, delete a peer previously. - * - * @param peer the peer that is added to the valid peers. - * - * @return #GNUNET_YES if no other peer had to be removed - * #GNUNET_NO otherwise - */ -static int -add_valid_peer (const struct GNUNET_PeerIdentity *peer) -{ - const struct GNUNET_PeerIdentity *rand_peer; - int ret; - - ret = GNUNET_YES; - while (GNUNET_CONTAINER_multipeermap_size (valid_peers) >= num_valid_peers_max) - { - rand_peer = get_random_peer_from_peermap (valid_peers); - GNUNET_CONTAINER_multipeermap_remove_all (valid_peers, rand_peer); - ret = GNUNET_NO; - } - (void) GNUNET_CONTAINER_multipeermap_put (valid_peers, peer, NULL, - GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY); - return ret; -} - - -/** - * @brief Set the peer flag to living and - * call the pending operations on this peer. - * - * Also adds peer to #valid_peers. - * - * @param peer_ctx the #PeerContext of the peer to set live - */ -static void -set_peer_live (struct PeerContext *peer_ctx) -{ - struct GNUNET_PeerIdentity *peer; - unsigned int i; - - peer = &peer_ctx->peer_id; - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Peer %s is live and valid, calling %i pending operations on it\n", - GNUNET_i2s (peer), - peer_ctx->num_pending_ops); - - if (NULL != peer_ctx->liveliness_check_pending) - { - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Removing pending liveliness check for peer %s\n", - GNUNET_i2s (&peer_ctx->peer_id)); - // TODO wait until cadet sets mq->cancel_impl - //GNUNET_MQ_send_cancel (peer_ctx->liveliness_check_pending->ev); - GNUNET_free (peer_ctx->liveliness_check_pending); - peer_ctx->liveliness_check_pending = NULL; - } - - (void) add_valid_peer (peer); - set_peer_flag (peer_ctx, Peers_ONLINE); - - /* Call pending operations */ - for (i = 0; i < peer_ctx->num_pending_ops; i++) - { - peer_ctx->pending_ops[i].op (peer_ctx->pending_ops[i].op_cls, peer); - } - GNUNET_array_grow (peer_ctx->pending_ops, peer_ctx->num_pending_ops, 0); -} - - -/** - * @brief Get the channel of a peer. If not existing, create. - * - * @param peer the peer id - * @return the #GNUNET_CADET_Channel used to send data to @a peer - */ -struct GNUNET_CADET_Channel * -get_channel (const struct GNUNET_PeerIdentity *peer) -{ - struct PeerContext *peer_ctx; - struct GNUNET_HashCode port; - - peer_ctx = get_peer_ctx (peer); - if (NULL == peer_ctx->send_channel) - { - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Trying to establish channel to peer %s\n", - GNUNET_i2s (peer)); - GNUNET_CRYPTO_hash (GNUNET_APPLICATION_PORT_RPS, - strlen (GNUNET_APPLICATION_PORT_RPS), - &port); - peer_ctx->send_channel = - GNUNET_CADET_channel_create (cadet_handle, - (struct GNUNET_PeerIdentity *) peer, /* context */ - peer, - &port, - GNUNET_CADET_OPTION_RELIABLE, - NULL, /* WindowSize handler */ - cleanup_destroyed_channel, /* Disconnect handler */ - cadet_handlers); - } - GNUNET_assert (NULL != peer_ctx->send_channel); - return peer_ctx->send_channel; -} - - -/** - * Get the message queue (#GNUNET_MQ_Handle) of a specific peer. - * - * If we already have a message queue open to this client, - * simply return it, otherways create one. - * - * @param peer the peer to get the mq to - * @return the #GNUNET_MQ_Handle - */ -static struct GNUNET_MQ_Handle * -get_mq (const struct GNUNET_PeerIdentity *peer) -{ - struct PeerContext *peer_ctx; - - peer_ctx = get_peer_ctx (peer); - - if (NULL == peer_ctx->mq) - { - (void) get_channel (peer); - peer_ctx->mq = GNUNET_CADET_get_mq (peer_ctx->send_channel); - } - return peer_ctx->mq; -} - - -/** - * @brief This is called in response to the first message we sent as a - * liveliness check. - * - * @param cls #PeerContext of peer with pending liveliness check - */ -static void -mq_liveliness_check_successful (void *cls) -{ - struct PeerContext *peer_ctx = cls; - - if (NULL != peer_ctx->liveliness_check_pending) - { - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Liveliness check for peer %s was successfull\n", - GNUNET_i2s (&peer_ctx->peer_id)); - GNUNET_free (peer_ctx->liveliness_check_pending); - peer_ctx->liveliness_check_pending = NULL; - set_peer_live (peer_ctx); - } -} - -/** - * Issue a check whether peer is live - * - * @param peer_ctx the context of the peer - */ -static void -check_peer_live (struct PeerContext *peer_ctx) -{ - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Get informed about peer %s getting live\n", - GNUNET_i2s (&peer_ctx->peer_id)); - - struct GNUNET_MQ_Handle *mq; - struct GNUNET_MQ_Envelope *ev; - - ev = GNUNET_MQ_msg_header (GNUNET_MESSAGE_TYPE_RPS_PP_CHECK_LIVE); - peer_ctx->liveliness_check_pending = GNUNET_new (struct PendingMessage); - peer_ctx->liveliness_check_pending->ev = ev; - peer_ctx->liveliness_check_pending->peer_ctx = peer_ctx; - peer_ctx->liveliness_check_pending->type = "Check liveliness"; - mq = get_mq (&peer_ctx->peer_id); - GNUNET_MQ_notify_sent (ev, - mq_liveliness_check_successful, - peer_ctx); - GNUNET_MQ_send (mq, ev); -} - -/** - * @brief Add an envelope to a message passed to mq to list of pending messages - * - * @param peer peer the message was sent to - * @param ev envelope to the message - * @param type type of the message to be sent - * @return pointer to pending message - */ -static struct PendingMessage * -insert_pending_message (const struct GNUNET_PeerIdentity *peer, - struct GNUNET_MQ_Envelope *ev, - const char *type) -{ - struct PendingMessage *pending_msg; - struct PeerContext *peer_ctx; - - peer_ctx = get_peer_ctx (peer); - pending_msg = GNUNET_new (struct PendingMessage); - pending_msg->ev = ev; - pending_msg->peer_ctx = peer_ctx; - pending_msg->type = type; - GNUNET_CONTAINER_DLL_insert (peer_ctx->pending_messages_head, - peer_ctx->pending_messages_tail, - pending_msg); - return pending_msg; -} - - -/** - * @brief Remove a pending message from the respective DLL - * - * @param pending_msg the pending message to remove - */ -static void -remove_pending_message (struct PendingMessage *pending_msg) -{ - struct PeerContext *peer_ctx; - - peer_ctx = pending_msg->peer_ctx; - GNUNET_CONTAINER_DLL_remove (peer_ctx->pending_messages_head, - peer_ctx->pending_messages_tail, - pending_msg); - GNUNET_MQ_send_cancel (peer_ctx->pending_messages_head->ev); - GNUNET_free (pending_msg); -} - - -/** - * @brief Check whether function of type #PeerOp was already scheduled - * - * The array with pending operations will probably never grow really big, so - * iterating over it should be ok. - * - * @param peer the peer to check - * @param peer_op the operation (#PeerOp) on the peer - * - * @return #GNUNET_YES if this operation is scheduled on that peer - * #GNUNET_NO otherwise - */ -static int -check_operation_scheduled (const struct GNUNET_PeerIdentity *peer, - const PeerOp peer_op) -{ - const struct PeerContext *peer_ctx; - unsigned int i; - - peer_ctx = get_peer_ctx (peer); - for (i = 0; i < peer_ctx->num_pending_ops; i++) - if (peer_op == peer_ctx->pending_ops[i].op) - return GNUNET_YES; - return GNUNET_NO; -} - - -/** - * Iterator over hash map entries. Deletes all contexts of peers. - * - * @param cls closure - * @param key current public key - * @param value value in the hash map - * @return #GNUNET_YES if we should continue to iterate, - * #GNUNET_NO if not. - */ -static int -peermap_clear_iterator (void *cls, - const struct GNUNET_PeerIdentity *key, - void *value) -{ - Peers_remove_peer (key); - return GNUNET_YES; -} - - -/** - * @brief This is called once a message is sent. - * - * Removes the pending message - * - * @param cls type of the message that was sent - */ -static void -mq_notify_sent_cb (void *cls) -{ - struct PendingMessage *pending_msg = (struct PendingMessage *) cls; - LOG (GNUNET_ERROR_TYPE_DEBUG, - "%s was sent.\n", - pending_msg->type); - remove_pending_message (pending_msg); -} - - -/** - * @brief Iterator function for #store_valid_peers. - * - * Implements #GNUNET_CONTAINER_PeerMapIterator. - * Writes single peer to disk. - * - * @param cls the file handle to write to. - * @param peer current peer - * @param value unused - * - * @return #GNUNET_YES if we should continue to - * iterate, - * #GNUNET_NO if not. - */ -static int -store_peer_presistently_iterator (void *cls, - const struct GNUNET_PeerIdentity *peer, - void *value) -{ - const struct GNUNET_DISK_FileHandle *fh = cls; - char peer_string[128]; - int size; - ssize_t ret; - - if (NULL == peer) - { - return GNUNET_YES; - } - size = GNUNET_snprintf (peer_string, - sizeof (peer_string), - "%s\n", - GNUNET_i2s_full (peer)); - GNUNET_assert (53 == size); - ret = GNUNET_DISK_file_write (fh, - peer_string, - size); - GNUNET_assert (size == ret); - return GNUNET_YES; -} - - -/** - * @brief Store the peers currently in #valid_peers to disk. - */ -static void -store_valid_peers () -{ - struct GNUNET_DISK_FileHandle *fh; - uint32_t number_written_peers; - int ret; - - if (0 == strncmp ("DISABLE", filename_valid_peers, 7)) - { - return; - } - - ret = GNUNET_DISK_directory_create_for_file (filename_valid_peers); - if (GNUNET_SYSERR == ret) - { - LOG (GNUNET_ERROR_TYPE_WARNING, - "Not able to create directory for file `%s'\n", - filename_valid_peers); - GNUNET_break (0); - } - else if (GNUNET_NO == ret) - { - LOG (GNUNET_ERROR_TYPE_WARNING, - "Directory for file `%s' exists but is not writable for us\n", - filename_valid_peers); - GNUNET_break (0); - } - fh = GNUNET_DISK_file_open (filename_valid_peers, - GNUNET_DISK_OPEN_WRITE | - GNUNET_DISK_OPEN_CREATE, - GNUNET_DISK_PERM_USER_READ | - GNUNET_DISK_PERM_USER_WRITE); - if (NULL == fh) - { - LOG (GNUNET_ERROR_TYPE_WARNING, - "Not able to write valid peers to file `%s'\n", - filename_valid_peers); - return; - } - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Writing %u valid peers to disk\n", - GNUNET_CONTAINER_multipeermap_size (valid_peers)); - number_written_peers = - GNUNET_CONTAINER_multipeermap_iterate (valid_peers, - store_peer_presistently_iterator, - fh); - GNUNET_assert (GNUNET_OK == GNUNET_DISK_file_close (fh)); - GNUNET_assert (number_written_peers == - GNUNET_CONTAINER_multipeermap_size (valid_peers)); -} - - -/** - * @brief Convert string representation of peer id to peer id. - * - * Counterpart to #GNUNET_i2s_full. - * - * @param string_repr The string representation of the peer id - * - * @return The peer id - */ -static const struct GNUNET_PeerIdentity * -s2i_full (const char *string_repr) -{ - struct GNUNET_PeerIdentity *peer; - size_t len; - int ret; - - peer = GNUNET_new (struct GNUNET_PeerIdentity); - len = strlen (string_repr); - if (52 > len) - { - LOG (GNUNET_ERROR_TYPE_WARNING, - "Not able to convert string representation of PeerID to PeerID\n" - "Sting representation: %s (len %u) - too short\n", - string_repr, - len); - GNUNET_break (0); - } - else if (52 < len) - { - len = 52; - } - ret = GNUNET_CRYPTO_eddsa_public_key_from_string (string_repr, - len, - &peer->public_key); - if (GNUNET_OK != ret) - { - LOG (GNUNET_ERROR_TYPE_WARNING, - "Not able to convert string representation of PeerID to PeerID\n" - "Sting representation: %s\n", - string_repr); - GNUNET_break (0); - } - return peer; -} - - -/** - * @brief Restore the peers on disk to #valid_peers. - */ -static void -restore_valid_peers () -{ - off_t file_size; - uint32_t num_peers; - struct GNUNET_DISK_FileHandle *fh; - char *buf; - ssize_t size_read; - char *iter_buf; - char *str_repr; - const struct GNUNET_PeerIdentity *peer; - - if (0 == strncmp ("DISABLE", filename_valid_peers, 7)) - { - return; - } - - if (GNUNET_OK != GNUNET_DISK_file_test (filename_valid_peers)) - { - return; - } - fh = GNUNET_DISK_file_open (filename_valid_peers, - GNUNET_DISK_OPEN_READ, - GNUNET_DISK_PERM_NONE); - GNUNET_assert (NULL != fh); - GNUNET_assert (GNUNET_OK == GNUNET_DISK_file_handle_size (fh, &file_size)); - num_peers = file_size / 53; - buf = GNUNET_malloc (file_size); - size_read = GNUNET_DISK_file_read (fh, buf, file_size); - GNUNET_assert (size_read == file_size); - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Restoring %" PRIu32 " peers from file `%s'\n", - num_peers, - filename_valid_peers); - for (iter_buf = buf; iter_buf < buf + file_size - 1; iter_buf += 53) - { - str_repr = GNUNET_strndup (iter_buf, 53); - peer = s2i_full (str_repr); - GNUNET_free (str_repr); - add_valid_peer (peer); - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Restored valid peer %s from disk\n", - GNUNET_i2s_full (peer)); - } - iter_buf = NULL; - GNUNET_free (buf); - LOG (GNUNET_ERROR_TYPE_DEBUG, - "num_peers: %" PRIu32 ", _size (valid_peers): %u\n", - num_peers, - GNUNET_CONTAINER_multipeermap_size (valid_peers)); - if (num_peers != GNUNET_CONTAINER_multipeermap_size (valid_peers)) - { - LOG (GNUNET_ERROR_TYPE_WARNING, - "Number of restored peers does not match file size. Have probably duplicates.\n"); - } - GNUNET_assert (GNUNET_OK == GNUNET_DISK_file_close (fh)); - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Restored %u valid peers from disk\n", - GNUNET_CONTAINER_multipeermap_size (valid_peers)); -} - - -/** - * @brief Initialise storage of peers - * - * @param fn_valid_peers filename of the file used to store valid peer ids - * @param cadet_h cadet handle - * @param disconnect_handler Disconnect handler - * @param c_handlers cadet handlers - * @param own_id own peer identity - */ -void -Peers_initialise (char* fn_valid_peers, - struct GNUNET_CADET_Handle *cadet_h, - GNUNET_CADET_DisconnectEventHandler disconnect_handler, - const struct GNUNET_MQ_MessageHandler *c_handlers, - const struct GNUNET_PeerIdentity *own_id) -{ - filename_valid_peers = GNUNET_strdup (fn_valid_peers); - cadet_handle = cadet_h; - cleanup_destroyed_channel = disconnect_handler; - cadet_handlers = c_handlers; - own_identity = own_id; - peer_map = GNUNET_CONTAINER_multipeermap_create (4, GNUNET_NO); - valid_peers = GNUNET_CONTAINER_multipeermap_create (4, GNUNET_NO); - restore_valid_peers (); -} - - -/** - * @brief Delete storage of peers that was created with #Peers_initialise () - */ -void -Peers_terminate () -{ - if (GNUNET_SYSERR == - GNUNET_CONTAINER_multipeermap_iterate (peer_map, - peermap_clear_iterator, - NULL)) - { - LOG (GNUNET_ERROR_TYPE_WARNING, - "Iteration destroying peers was aborted.\n"); - } - GNUNET_CONTAINER_multipeermap_destroy (peer_map); - store_valid_peers (); - GNUNET_free (filename_valid_peers); - GNUNET_CONTAINER_multipeermap_destroy (valid_peers); -} - - -/** - * Iterator over #valid_peers hash map entries. - * - * @param cls closure - unused - * @param peer current peer id - * @param value value in the hash map - unused - * @return #GNUNET_YES if we should continue to - * iterate, - * #GNUNET_NO if not. - */ -static int -valid_peer_iterator (void *cls, - const struct GNUNET_PeerIdentity *peer, - void *value) -{ - struct PeersIteratorCls *it_cls = cls; - - return it_cls->iterator (it_cls->cls, - peer); -} - - -/** - * @brief Get all currently known, valid peer ids. - * - * @param it function to call on each peer id - * @param it_cls extra argument to @a it - * @return the number of key value pairs processed, - * #GNUNET_SYSERR if it aborted iteration - */ -int -Peers_get_valid_peers (PeersIterator iterator, - void *it_cls) -{ - struct PeersIteratorCls *cls; - int ret; - - cls = GNUNET_new (struct PeersIteratorCls); - cls->iterator = iterator; - cls->cls = it_cls; - ret = GNUNET_CONTAINER_multipeermap_iterate (valid_peers, - valid_peer_iterator, - cls); - GNUNET_free (cls); - return ret; -} - - -/** - * @brief Add peer to known peers. - * - * This function is called on new peer_ids from 'external' sources - * (client seed, cadet get_peers(), ...) - * - * @param peer the new #GNUNET_PeerIdentity - * - * @return #GNUNET_YES if peer was inserted - * #GNUNET_NO otherwise (if peer was already known or - * peer was #own_identity) - */ -int -Peers_insert_peer (const struct GNUNET_PeerIdentity *peer) -{ - if ( (GNUNET_YES == Peers_check_peer_known (peer)) || - (0 == GNUNET_CRYPTO_cmp_peer_identity (peer, own_identity)) ) - { - return GNUNET_NO; /* We already know this peer - nothing to do */ - } - (void) create_peer_ctx (peer); - return GNUNET_YES; -} - - -/** - * @brief Try connecting to a peer to see whether it is online - * - * If not known yet, insert into known peers - * - * @param peer the peer whose liveliness is to be checked - * @return #GNUNET_YES if peer had to be inserted - * #GNUNET_NO otherwise (if peer was already known or - * peer was #own_identity) - */ -int -Peers_issue_peer_liveliness_check (const struct GNUNET_PeerIdentity *peer) -{ - struct PeerContext *peer_ctx; - int ret; - - if (0 == GNUNET_CRYPTO_cmp_peer_identity (peer, own_identity)) - { - return GNUNET_NO; - } - ret = Peers_insert_peer (peer); - peer_ctx = get_peer_ctx (peer); - if (GNUNET_NO == Peers_check_peer_flag (peer, Peers_ONLINE)) - { - check_peer_live (peer_ctx); - } - return ret; -} - - -/** - * @brief Check if peer is removable. - * - * Check if - * - a recv channel exists - * - there are pending messages - * - there is no pending pull reply - * - * @param peer the peer in question - * @return #GNUNET_YES if peer is removable - * #GNUNET_NO if peer is NOT removable - * #GNUNET_SYSERR if peer is not known - */ -int -Peers_check_removable (const struct GNUNET_PeerIdentity *peer) -{ - struct PeerContext *peer_ctx; - - if (GNUNET_NO == GNUNET_CONTAINER_multipeermap_contains (peer_map, peer)) - { - return GNUNET_SYSERR; - } - - peer_ctx = get_peer_ctx (peer); - if ( (NULL != peer_ctx->recv_channel) || - (NULL != peer_ctx->pending_messages_head) || - (GNUNET_NO == check_peer_flag_set (peer_ctx, Peers_PULL_REPLY_PENDING)) ) - { - return GNUNET_NO; - } - return GNUNET_YES; -} - - -/** - * @brief Remove peer - * - * @param peer the peer to clean - * @return #GNUNET_YES if peer was removed - * #GNUNET_NO otherwise - */ -int -Peers_remove_peer (const struct GNUNET_PeerIdentity *peer) -{ - struct PeerContext *peer_ctx; - - if (GNUNET_NO == GNUNET_CONTAINER_multipeermap_contains (peer_map, peer)) - { - return GNUNET_NO; - } - - peer_ctx = get_peer_ctx (peer); - set_peer_flag (peer_ctx, Peers_TO_DESTROY); - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Going to remove peer %s\n", - GNUNET_i2s (&peer_ctx->peer_id)); - Peers_unset_peer_flag (peer, Peers_ONLINE); - - GNUNET_array_grow (peer_ctx->pending_ops, peer_ctx->num_pending_ops, 0); - while (NULL != peer_ctx->pending_messages_head) - { - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Removing unsent %s\n", - peer_ctx->pending_messages_head->type); - remove_pending_message (peer_ctx->pending_messages_head); - } - /* If we are still waiting for notification whether this peer is live - * cancel the according task */ - if (NULL != peer_ctx->liveliness_check_pending) - { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Removing pending liveliness check for peer %s\n", - GNUNET_i2s (&peer_ctx->peer_id)); - // TODO wait until cadet sets mq->cancel_impl - //GNUNET_MQ_send_cancel (peer_ctx->liveliness_check_pending->ev); - GNUNET_free (peer_ctx->liveliness_check_pending); - peer_ctx->liveliness_check_pending = NULL; - } - if (NULL != peer_ctx->send_channel) - { - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Destroying send channel\n"); - GNUNET_CADET_channel_destroy (peer_ctx->send_channel); - peer_ctx->send_channel = NULL; - } - if (NULL != peer_ctx->recv_channel) - { - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Destroying recv channel\n"); - GNUNET_CADET_channel_destroy (peer_ctx->recv_channel); - peer_ctx->recv_channel = NULL; - } - if (NULL != peer_ctx->mq) - { - GNUNET_MQ_destroy (peer_ctx->mq); - peer_ctx->mq = NULL; - } - - GNUNET_free (peer_ctx->send_channel_flags); - GNUNET_free (peer_ctx->recv_channel_flags); - - if (GNUNET_YES != GNUNET_CONTAINER_multipeermap_remove_all (peer_map, &peer_ctx->peer_id)) - { - LOG (GNUNET_ERROR_TYPE_WARNING, "removing peer from peer_map failed\n"); - } - GNUNET_free (peer_ctx); - return GNUNET_YES; -} - - -/** - * @brief set flags on a given peer. - * - * @param peer the peer to set flags on - * @param flags the flags - */ -void -Peers_set_peer_flag (const struct GNUNET_PeerIdentity *peer, enum Peers_PeerFlags flags) -{ - struct PeerContext *peer_ctx; - - peer_ctx = get_peer_ctx (peer); - set_peer_flag (peer_ctx, flags); -} - - -/** - * @brief unset flags on a given peer. - * - * @param peer the peer to unset flags on - * @param flags the flags - */ -void -Peers_unset_peer_flag (const struct GNUNET_PeerIdentity *peer, enum Peers_PeerFlags flags) -{ - struct PeerContext *peer_ctx; - - peer_ctx = get_peer_ctx (peer); - unset_peer_flag (peer_ctx, flags); -} - - -/** - * @brief Check whether flags on a peer are set. - * - * @param peer the peer to check the flag of - * @param flags the flags to check - * - * @return #GNUNET_SYSERR if peer is not known - * #GNUNET_YES if all given flags are set - * #GNUNET_NO otherwise - */ -int -Peers_check_peer_flag (const struct GNUNET_PeerIdentity *peer, enum Peers_PeerFlags flags) -{ - struct PeerContext *peer_ctx; - - if (GNUNET_NO == Peers_check_peer_known (peer)) - { - return GNUNET_SYSERR; - } - peer_ctx = get_peer_ctx (peer); - return check_peer_flag_set (peer_ctx, flags); -} - - -/** - * @brief set flags on a given channel. - * - * @param channel the channel to set flags on - * @param flags the flags - */ -void -Peers_set_channel_flag (uint32_t *channel_flags, enum Peers_ChannelFlags flags) -{ - set_channel_flag (channel_flags, flags); -} - - -/** - * @brief unset flags on a given channel. - * - * @param channel the channel to unset flags on - * @param flags the flags - */ -void -Peers_unset_channel_flag (uint32_t *channel_flags, enum Peers_ChannelFlags flags) -{ - unset_channel_flag (channel_flags, flags); -} - - -/** - * @brief Check whether flags on a channel are set. - * - * @param channel the channel to check the flag of - * @param flags the flags to check - * - * @return #GNUNET_YES if all given flags are set - * #GNUNET_NO otherwise - */ -int -Peers_check_channel_flag (uint32_t *channel_flags, enum Peers_ChannelFlags flags) -{ - return check_channel_flag_set (channel_flags, flags); -} - -/** - * @brief Get the flags for the channel in @a role for @a peer. - * - * @param peer Peer to get the channel flags for. - * @param role Role of channel to get flags for - * - * @return The flags. - */ -uint32_t * -Peers_get_channel_flag (const struct GNUNET_PeerIdentity *peer, - enum Peers_ChannelRole role) -{ - const struct PeerContext *peer_ctx; - - peer_ctx = get_peer_ctx (peer); - if (Peers_CHANNEL_ROLE_SENDING == role) - { - return peer_ctx->send_channel_flags; - } - else if (Peers_CHANNEL_ROLE_RECEIVING == role) - { - return peer_ctx->recv_channel_flags; - } - else - { - GNUNET_assert (0); - } -} - -/** - * @brief Check whether we have information about the given peer. - * - * FIXME probably deprecated. Make this the new _online. - * - * @param peer peer in question - * - * @return #GNUNET_YES if peer is known - * #GNUNET_NO if peer is not knwon - */ -int -Peers_check_peer_known (const struct GNUNET_PeerIdentity *peer) -{ - return GNUNET_CONTAINER_multipeermap_contains (peer_map, peer); -} - - -/** - * @brief Check whether @a peer is actually a peer. - * - * A valid peer is a peer that we know exists eg. we were connected to once. - * - * @param peer peer in question - * - * @return #GNUNET_YES if peer is valid - * #GNUNET_NO if peer is not valid - */ -int -Peers_check_peer_valid (const struct GNUNET_PeerIdentity *peer) -{ - return GNUNET_CONTAINER_multipeermap_contains (valid_peers, peer); -} - - -/** - * @brief Indicate that we want to send to the other peer - * - * This establishes a sending channel - * - * @param peer the peer to establish channel to - */ -void -Peers_indicate_sending_intention (const struct GNUNET_PeerIdentity *peer) -{ - GNUNET_assert (GNUNET_YES == Peers_check_peer_known (peer)); - (void) get_channel (peer); -} - - -/** - * @brief Check whether other peer has the intention to send/opened channel - * towars us - * - * @param peer the peer in question - * - * @return #GNUNET_YES if peer has the intention to send - * #GNUNET_NO otherwise - */ -int -Peers_check_peer_send_intention (const struct GNUNET_PeerIdentity *peer) -{ - const struct PeerContext *peer_ctx; - - peer_ctx = get_peer_ctx (peer); - if (NULL != peer_ctx->recv_channel) - { - return GNUNET_YES; - } - return GNUNET_NO; -} - - -/** - * Handle the channel a peer opens to us. - * - * @param cls The closure - * @param channel The channel the peer wants to establish - * @param initiator The peer's peer ID - * - * @return initial channel context for the channel - * (can be NULL -- that's not an error) - */ -void * -Peers_handle_inbound_channel (void *cls, - struct GNUNET_CADET_Channel *channel, - const struct GNUNET_PeerIdentity *initiator) -{ - struct PeerContext *peer_ctx; - - LOG (GNUNET_ERROR_TYPE_DEBUG, - "New channel was established to us (Peer %s).\n", - GNUNET_i2s (initiator)); - GNUNET_assert (NULL != channel); /* according to cadet API */ - /* Make sure we 'know' about this peer */ - peer_ctx = create_or_get_peer_ctx (initiator); - set_peer_live (peer_ctx); - /* We only accept one incoming channel per peer */ - if (GNUNET_YES == Peers_check_peer_send_intention (initiator)) - { - set_channel_flag (peer_ctx->recv_channel_flags, - Peers_CHANNEL_ESTABLISHED_TWICE); - GNUNET_CADET_channel_destroy (channel); - /* return the channel context */ - return &peer_ctx->peer_id; - } - peer_ctx->recv_channel = channel; - return &peer_ctx->peer_id; -} - - -/** - * @brief Check whether a sending channel towards the given peer exists - * - * @param peer the peer to check for - * - * @return #GNUNET_YES if a sending channel towards that peer exists - * #GNUNET_NO otherwise - */ -int -Peers_check_sending_channel_exists (const struct GNUNET_PeerIdentity *peer) -{ - struct PeerContext *peer_ctx; - - if (GNUNET_NO == Peers_check_peer_known (peer)) - { /* If no such peer exists, there is no channel */ - return GNUNET_NO; - } - peer_ctx = get_peer_ctx (peer); - if (NULL == peer_ctx->send_channel) - { - return GNUNET_NO; - } - return GNUNET_YES; -} - - -/** - * @brief check whether the given channel is the sending channel of the given - * peer - * - * @param peer the peer in question - * @param channel the channel to check for - * @param role either #Peers_CHANNEL_ROLE_SENDING, or - * #Peers_CHANNEL_ROLE_RECEIVING - * - * @return #GNUNET_YES if the given chennel is the sending channel of the peer - * #GNUNET_NO otherwise - */ -int -Peers_check_channel_role (const struct GNUNET_PeerIdentity *peer, - const struct GNUNET_CADET_Channel *channel, - enum Peers_ChannelRole role) -{ - const struct PeerContext *peer_ctx; - - if (GNUNET_NO == Peers_check_peer_known (peer)) - { - return GNUNET_NO; - } - peer_ctx = get_peer_ctx (peer); - if ( (Peers_CHANNEL_ROLE_SENDING == role) && - (channel == peer_ctx->send_channel) ) - { - return GNUNET_YES; - } - if ( (Peers_CHANNEL_ROLE_RECEIVING == role) && - (channel == peer_ctx->recv_channel) ) - { - return GNUNET_YES; - } - return GNUNET_NO; -} - - -/** - * @brief Destroy the send channel of a peer e.g. stop indicating a sending - * intention to another peer - * - * If there is also no channel to receive messages from that peer, remove it - * from the peermap. - * TODO really? - * - * @peer the peer identity of the peer whose sending channel to destroy - * @return #GNUNET_YES if channel was destroyed - * #GNUNET_NO otherwise - */ -int -Peers_destroy_sending_channel (const struct GNUNET_PeerIdentity *peer) -{ - struct PeerContext *peer_ctx; - - if (GNUNET_NO == Peers_check_peer_known (peer)) - { - return GNUNET_NO; - } - peer_ctx = get_peer_ctx (peer); - if (NULL != peer_ctx->send_channel) - { - set_channel_flag (peer_ctx->send_channel_flags, Peers_CHANNEL_CLEAN); - GNUNET_CADET_channel_destroy (peer_ctx->send_channel); - peer_ctx->send_channel = NULL; - (void) Peers_check_connected (peer); - return GNUNET_YES; - } - return GNUNET_NO; -} - -/** - * This is called when a channel is destroyed. - * - * @param cls The closure - * @param channel The channel being closed - * @param channel_ctx The context associated with this channel - */ -void -Peers_cleanup_destroyed_channel (void *cls, - const struct GNUNET_CADET_Channel *channel) -{ - struct GNUNET_PeerIdentity *peer = cls; - struct PeerContext *peer_ctx; - - if (GNUNET_NO == Peers_check_peer_known (peer)) - {/* We don't want to implicitly create a context that we're about to kill */ - LOG (GNUNET_ERROR_TYPE_DEBUG, - "channel (%s) without associated context was destroyed\n", - GNUNET_i2s (peer)); - return; - } - peer_ctx = get_peer_ctx (peer); - - /* If our peer issued the destruction of the channel, the #Peers_TO_DESTROY - * flag will be set. In this case simply make sure that the channels are - * cleaned. */ - /* FIXME This distinction seems to be redundant */ - if (Peers_check_peer_flag (peer, Peers_TO_DESTROY)) - {/* We initiatad the destruction of this particular peer */ - if (channel == peer_ctx->send_channel) - peer_ctx->send_channel = NULL; - else if (channel == peer_ctx->recv_channel) - peer_ctx->recv_channel = NULL; - - if (NULL != peer_ctx->send_channel) - { - GNUNET_CADET_channel_destroy (peer_ctx->send_channel); - peer_ctx->send_channel = NULL; - } - if (NULL != peer_ctx->recv_channel) - { - GNUNET_CADET_channel_destroy (peer_ctx->recv_channel); - peer_ctx->recv_channel = NULL; - } - /* Set the #Peers_ONLINE flag accordingly */ - (void) Peers_check_connected (peer); - return; - } - - else - { /* We did not initiate the destruction of this peer */ - if (channel == peer_ctx->send_channel) - { /* Something (but us) killd the channel - clean up peer */ - LOG (GNUNET_ERROR_TYPE_DEBUG, - "send channel (%s) was destroyed - cleaning up\n", - GNUNET_i2s (peer)); - peer_ctx->send_channel = NULL; - } - else if (channel == peer_ctx->recv_channel) - { /* Other peer doesn't want to send us messages anymore */ - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Peer %s destroyed recv channel - cleaning up channel\n", - GNUNET_i2s (peer)); - peer_ctx->recv_channel = NULL; - } - else - { - LOG (GNUNET_ERROR_TYPE_WARNING, - "unknown channel (%s) was destroyed\n", - GNUNET_i2s (peer)); - } - } - (void) Peers_check_connected (peer); -} - -/** - * @brief Send a message to another peer. - * - * Keeps track about pending messages so they can be properly removed when the - * peer is destroyed. - * - * @param peer receeiver of the message - * @param ev envelope of the message - * @param type type of the message - */ -void -Peers_send_message (const struct GNUNET_PeerIdentity *peer, - struct GNUNET_MQ_Envelope *ev, - const char *type) -{ - struct PendingMessage *pending_msg; - struct GNUNET_MQ_Handle *mq; - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Sending message to %s of type %s\n", - GNUNET_i2s (peer), - type); - pending_msg = insert_pending_message (peer, ev, type); - mq = get_mq (peer); - GNUNET_MQ_notify_sent (ev, - mq_notify_sent_cb, - pending_msg); - GNUNET_MQ_send (mq, ev); -} - -/** - * @brief Schedule a operation on given peer - * - * Avoids scheduling an operation twice. - * - * @param peer the peer we want to schedule the operation for once it gets live - * - * @return #GNUNET_YES if the operation was scheduled - * #GNUNET_NO otherwise - */ -int -Peers_schedule_operation (const struct GNUNET_PeerIdentity *peer, - const PeerOp peer_op) -{ - struct PeerPendingOp pending_op; - struct PeerContext *peer_ctx; - - if (0 == GNUNET_CRYPTO_cmp_peer_identity (peer, own_identity)) - { - return GNUNET_NO; - } - GNUNET_assert (GNUNET_YES == Peers_check_peer_known (peer)); - - //TODO if LIVE/ONLINE execute immediately - - if (GNUNET_NO == check_operation_scheduled (peer, peer_op)) - { - peer_ctx = get_peer_ctx (peer); - pending_op.op = peer_op; - pending_op.op_cls = NULL; - GNUNET_array_append (peer_ctx->pending_ops, - peer_ctx->num_pending_ops, - pending_op); - return GNUNET_YES; - } - return GNUNET_NO; -} - -/** - * @brief Get the recv_channel of @a peer. - * Needed to correctly handle (call #GNUNET_CADET_receive_done()) incoming - * messages. - * - * @param peer The peer to get the recv_channel from. - * - * @return The recv_channel. - */ -struct GNUNET_CADET_Channel * -Peers_get_recv_channel (const struct GNUNET_PeerIdentity *peer) -{ - struct PeerContext *peer_ctx; - - GNUNET_assert (GNUNET_YES == Peers_check_peer_known (peer)); - peer_ctx = get_peer_ctx (peer); - return peer_ctx->recv_channel; -} - -/* end of gnunet-service-rps_peers.c */ diff --git a/src/rps/gnunet-service-rps_peers.h b/src/rps/gnunet-service-rps_peers.h @@ -1,437 +0,0 @@ -/* - This file is part of GNUnet. - Copyright (C) - - GNUnet is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published - by the Free Software Foundation; either version 3, or (at your - option) any later version. - - GNUnet is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GNUnet; see the file COPYING. If not, write to the - Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. -*/ - -/** - * @file rps/gnunet-service-rps_peers.h - * @brief utilities for managing (information about) peers - * @author Julius Bünger - */ -#include "gnunet_util_lib.h" -#include <inttypes.h> -#include "gnunet_cadet_service.h" - - -/** - * Different flags indicating the status of another peer. - */ -enum Peers_PeerFlags -{ - /** - * If we are waiting for a reply from that peer (sent a pull request). - */ - Peers_PULL_REPLY_PENDING = 0x01, - - /* IN_OTHER_GOSSIP_LIST = 0x02, unneeded? */ - /* IN_OWN_SAMPLER_LIST = 0x04, unneeded? */ - /* IN_OWN_GOSSIP_LIST = 0x08, unneeded? */ - - /** - * We set this bit when we know the peer is online. - */ - Peers_ONLINE = 0x20, - - /** - * We set this bit when we are going to destroy the channel to this peer. - * When cleanup_channel is called, we know that we wanted to destroy it. - * Otherwise the channel to the other peer was destroyed. - */ - Peers_TO_DESTROY = 0x40, -}; - -/** - * Keep track of the status of a channel. - * - * This is needed in order to know what to do with a channel when it's - * destroyed. - */ -enum Peers_ChannelFlags -{ - /** - * We destroyed the channel because the other peer established a second one. - */ - Peers_CHANNEL_ESTABLISHED_TWICE = 0x1, - - /** - * The channel was removed because it was not needed any more. This should be - * the sending channel. - */ - Peers_CHANNEL_CLEAN = 0x2, -}; - -/** - * @brief The role of a channel. Sending or receiving. - */ -enum Peers_ChannelRole -{ - /** - * Channel is used for sending - */ - Peers_CHANNEL_ROLE_SENDING = 0x01, - - /** - * Channel is used for receiving - */ - Peers_CHANNEL_ROLE_RECEIVING = 0x02, -}; - -/** - * @brief Functions of this type can be used to be stored at a peer for later execution. - * - * @param cls closure - * @param peer peer to execute function on - */ -typedef void (* PeerOp) (void *cls, const struct GNUNET_PeerIdentity *peer); - -/** - * @brief Iterator over valid peers. - * - * @param cls closure - * @param peer current public peer id - * @return #GNUNET_YES if we should continue to - * iterate, - * #GNUNET_NO if not. - */ -typedef int -(*PeersIterator) (void *cls, - const struct GNUNET_PeerIdentity *peer); - -/** - * @brief Initialise storage of peers - * - * @param fn_valid_peers filename of the file used to store valid peer ids - * @param cadet_h cadet handle - * @param disconnect_handler Disconnect handler - * @param c_handlers cadet handlers - * @param own_id own peer identity - */ -void -Peers_initialise (char* fn_valid_peers, - struct GNUNET_CADET_Handle *cadet_h, - GNUNET_CADET_DisconnectEventHandler disconnect_handler, - const struct GNUNET_MQ_MessageHandler *c_handlers, - const struct GNUNET_PeerIdentity *own_id); - -/** - * @brief Delete storage of peers that was created with #Peers_initialise () - */ -void -Peers_terminate (); - - -/** - * @brief Get all currently known, valid peer ids. - * - * @param it function to call on each peer id - * @param it_cls extra argument to @a it - * @return the number of key value pairs processed, - * #GNUNET_SYSERR if it aborted iteration - */ -int -Peers_get_valid_peers (PeersIterator iterator, - void *it_cls); - -/** - * @brief Add peer to known peers. - * - * This function is called on new peer_ids from 'external' sources - * (client seed, cadet get_peers(), ...) - * - * @param peer the new #GNUNET_PeerIdentity - * - * @return #GNUNET_YES if peer was inserted - * #GNUNET_NO otherwise (if peer was already known or - * peer was #own_identity) - */ -int -Peers_insert_peer (const struct GNUNET_PeerIdentity *peer); - -/** - * @brief Try connecting to a peer to see whether it is online - * - * If not known yet, insert into known peers - * - * @param peer the peer whose liveliness is to be checked - * @return #GNUNET_YES if peer had to be inserted - * #GNUNET_NO otherwise (if peer was already known or - * peer was #own_identity) - */ -int -Peers_issue_peer_liveliness_check (const struct GNUNET_PeerIdentity *peer); - -/** - * @brief Check if peer is removable. - * - * Check if - * - a recv channel exists - * - there are pending messages - * - there is no pending pull reply - * - * @param peer the peer in question - * @return #GNUNET_YES if peer is removable - * #GNUNET_NO if peer is NOT removable - * #GNUNET_SYSERR if peer is not known - */ -int -Peers_check_removable (const struct GNUNET_PeerIdentity *peer); - -/** - * @brief Remove peer - * - * @param peer the peer to clean - * @return #GNUNET_YES if peer was removed - * #GNUNET_NO otherwise - */ -int -Peers_remove_peer (const struct GNUNET_PeerIdentity *peer); - -/** - * @brief set flags on a given peer. - * - * @param peer the peer to set flags on - * @param flags the flags - */ -void -Peers_set_peer_flag (const struct GNUNET_PeerIdentity *peer, enum Peers_PeerFlags flags); - -/** - * @brief unset flags on a given peer. - * - * @param peer the peer to unset flags on - * @param flags the flags - */ -void -Peers_unset_peer_flag (const struct GNUNET_PeerIdentity *peer, enum Peers_PeerFlags flags); - -/** - * @brief Check whether flags on a peer are set. - * - * @param peer the peer to check the flag of - * @param flags the flags to check - * - * @return #GNUNET_YES if all given flags are set - * ##GNUNET_NO otherwise - */ -int -Peers_check_peer_flag (const struct GNUNET_PeerIdentity *peer, enum Peers_PeerFlags flags); - - -/** - * @brief set flags on a given channel. - * - * @param channel the channel to set flags on - * @param flags the flags - */ -void -Peers_set_channel_flag (uint32_t *channel_flags, enum Peers_ChannelFlags flags); - -/** - * @brief unset flags on a given channel. - * - * @param channel the channel to unset flags on - * @param flags the flags - */ -void -Peers_unset_channel_flag (uint32_t *channel_flags, enum Peers_ChannelFlags flags); - -/** - * @brief Check whether flags on a channel are set. - * - * @param channel the channel to check the flag of - * @param flags the flags to check - * - * @return #GNUNET_YES if all given flags are set - * #GNUNET_NO otherwise - */ -int -Peers_check_channel_flag (uint32_t *channel_flags, enum Peers_ChannelFlags flags); - -/** - * @brief Get the flags for the channel in @a role for @a peer. - * - * @param peer Peer to get the channel flags for. - * @param role Role of channel to get flags for - * - * @return The flags. - */ -uint32_t * -Peers_get_channel_flag (const struct GNUNET_PeerIdentity *peer, - enum Peers_ChannelRole role); - -/** - * @brief Check whether we have information about the given peer. - * - * FIXME probably deprecated. Make this the new _online. - * - * @param peer peer in question - * - * @return #GNUNET_YES if peer is known - * #GNUNET_NO if peer is not knwon - */ -int -Peers_check_peer_known (const struct GNUNET_PeerIdentity *peer); - -/** - * @brief Check whether @a peer is actually a peer. - * - * A valid peer is a peer that we know exists eg. we were connected to once. - * - * @param peer peer in question - * - * @return #GNUNET_YES if peer is valid - * #GNUNET_NO if peer is not valid - */ -int -Peers_check_peer_valid (const struct GNUNET_PeerIdentity *peer); - -/** - * @brief Indicate that we want to send to the other peer - * - * This establishes a sending channel - * - * @param peer the peer to establish channel to - */ -void -Peers_indicate_sending_intention (const struct GNUNET_PeerIdentity *peer); - -/** - * @brief Check whether other peer has the intention to send/opened channel - * towars us - * - * @param peer the peer in question - * - * @return #GNUNET_YES if peer has the intention to send - * #GNUNET_NO otherwise - */ -int -Peers_check_peer_send_intention (const struct GNUNET_PeerIdentity *peer); - -/** - * Handle the channel a peer opens to us. - * - * @param cls The closure - * @param channel The channel the peer wants to establish - * @param initiator The peer's peer ID - * - * @return initial channel context for the channel - * (can be NULL -- that's not an error) - */ -void * -Peers_handle_inbound_channel (void *cls, - struct GNUNET_CADET_Channel *channel, - const struct GNUNET_PeerIdentity *initiator); - -/** - * @brief Check whether a sending channel towards the given peer exists - * - * @param peer the peer to check for - * - * @return #GNUNET_YES if a sending channel towards that peer exists - * #GNUNET_NO otherwise - */ -int -Peers_check_sending_channel_exists (const struct GNUNET_PeerIdentity *peer); - -/** - * @brief check whether the given channel is the sending channel of the given - * peer - * - * @param peer the peer in question - * @param channel the channel to check for - * @param role either #Peers_CHANNEL_ROLE_SENDING, or - * #Peers_CHANNEL_ROLE_RECEIVING - * - * @return #GNUNET_YES if the given chennel is the sending channel of the peer - * #GNUNET_NO otherwise - */ -int -Peers_check_channel_role (const struct GNUNET_PeerIdentity *peer, - const struct GNUNET_CADET_Channel *channel, - enum Peers_ChannelRole role); - -/** - * @brief Destroy the send channel of a peer e.g. stop indicating a sending - * intention to another peer - * - * If there is also no channel to receive messages from that peer, remove it - * from the peermap. - * - * @peer the peer identity of the peer whose sending channel to destroy - * @return #GNUNET_YES if channel was destroyed - * #GNUNET_NO otherwise - */ -int -Peers_destroy_sending_channel (const struct GNUNET_PeerIdentity *peer); - -/** - * This is called when a channel is destroyed. - * - * Removes peer completely from our knowledge if the send_channel was destroyed - * Otherwise simply delete the recv_channel - * - * @param cls The closure - * @param channel The channel being closed - * @param channel_ctx The context associated with this channel - */ -void -Peers_cleanup_destroyed_channel (void *cls, - const struct GNUNET_CADET_Channel *channel); - -/** - * @brief Send a message to another peer. - * - * Keeps track about pending messages so they can be properly removed when the - * peer is destroyed. - * - * @param peer receeiver of the message - * @param ev envelope of the message - * @param type type of the message - */ -void -Peers_send_message (const struct GNUNET_PeerIdentity *peer, - struct GNUNET_MQ_Envelope *ev, - const char *type); - -/** - * @brief Schedule a operation on given peer - * - * Avoids scheduling an operation twice. - * - * @param peer the peer we want to schedule the operation for once it gets live - * - * @return #GNUNET_YES if the operation was scheduled - * #GNUNET_NO otherwise - */ -int -Peers_schedule_operation (const struct GNUNET_PeerIdentity *peer, - const PeerOp peer_op); - -/** - * @brief Get the recv_channel of @a peer. - * Needed to correctly handle (call #GNUNET_CADET_receive_done()) incoming - * messages. - * - * @param peer The peer to get the recv_channel from. - * - * @return The recv_channel. - */ -struct GNUNET_CADET_Channel * -Peers_get_recv_channel (const struct GNUNET_PeerIdentity *peer); - -/* end of gnunet-service-rps_peers.h */ diff --git a/src/rps/rps.h b/src/rps/rps.h @@ -175,4 +175,100 @@ struct GNUNET_RPS_CS_ActMaliciousMessage }; #endif /* ENABLE_MALICIOUS */ + +/*********************************************************************** + * Defines from old gnunet-service-rps_peers.h +***********************************************************************/ + +/** + * Different flags indicating the status of another peer. + */ +enum Peers_PeerFlags +{ + /** + * If we are waiting for a reply from that peer (sent a pull request). + */ + Peers_PULL_REPLY_PENDING = 0x01, + + /* IN_OTHER_GOSSIP_LIST = 0x02, unneeded? */ + /* IN_OWN_SAMPLER_LIST = 0x04, unneeded? */ + /* IN_OWN_GOSSIP_LIST = 0x08, unneeded? */ + + /** + * We set this bit when we know the peer is online. + */ + Peers_ONLINE = 0x20, + + /** + * We set this bit when we are going to destroy the channel to this peer. + * When cleanup_channel is called, we know that we wanted to destroy it. + * Otherwise the channel to the other peer was destroyed. + */ + Peers_TO_DESTROY = 0x40, +}; + +/** + * Keep track of the status of a channel. + * + * This is needed in order to know what to do with a channel when it's + * destroyed. + */ +enum Peers_ChannelFlags +{ + /** + * We destroyed the channel because the other peer established a second one. + */ + Peers_CHANNEL_ESTABLISHED_TWICE = 0x1, + + /** + * The channel was removed because it was not needed any more. This should be + * the sending channel. + */ + Peers_CHANNEL_CLEAN = 0x2, + + /** + * We destroyed the channel because the other peer established a second one. + */ + Peers_CHANNEL_DESTROING = 0x4, +}; + + +/** + * @brief The role of a channel. Sending or receiving. + */ +enum Peers_ChannelRole +{ + /** + * Channel is used for sending + */ + Peers_CHANNEL_ROLE_SENDING = 0x01, + + /** + * Channel is used for receiving + */ + Peers_CHANNEL_ROLE_RECEIVING = 0x02, +}; + +/** + * @brief Functions of this type can be used to be stored at a peer for later execution. + * + * @param cls closure + * @param peer peer to execute function on + */ +typedef void (* PeerOp) (void *cls, const struct GNUNET_PeerIdentity *peer); + +/** + * @brief Iterator over valid peers. + * + * @param cls closure + * @param peer current public peer id + * @return #GNUNET_YES if we should continue to + * iterate, + * #GNUNET_NO if not. + */ +typedef int +(*PeersIterator) (void *cls, + const struct GNUNET_PeerIdentity *peer); + + GNUNET_NETWORK_STRUCT_END diff --git a/src/rps/test_rps.c b/src/rps/test_rps.c @@ -1028,6 +1028,33 @@ req_cancel_cb (struct RPSPeer *rps_peer) } /*********************************** + * CHURN +***********************************/ + +static void +churn (void *cls); + +static void +churn_test_cb (struct RPSPeer *rps_peer) +{ + /* Start churn */ + if (GNUNET_YES == cur_test_run.have_churn && NULL == churn_task) + { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Starting churn task\n"); + churn_task = GNUNET_SCHEDULER_add_delayed ( + GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 5), + churn, + NULL); + } else { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Not starting churn task\n"); + } + + schedule_missing_requests (rps_peer); +} + +/*********************************** * PROFILER ***********************************/ @@ -1153,6 +1180,9 @@ churn (void *cls) double portion_go_online; double portion_go_offline; + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Churn function executing\n"); + /* Compute the probability for an online peer to go offline * this round */ portion_online = num_peers_online * 1.0 / num_peers; @@ -1263,10 +1293,15 @@ profiler_cb (struct RPSPeer *rps_peer) /* Start churn */ if (GNUNET_YES == cur_test_run.have_churn && NULL == churn_task) { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Starting churn task\n"); churn_task = GNUNET_SCHEDULER_add_delayed ( GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 5), churn, NULL); + } else { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Not starting churn task\n"); } /* Only request peer ids at one peer. @@ -1358,6 +1393,24 @@ run (void *cls, struct OpListEntry *entry; uint32_t num_mal_peers; + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "RUN was called\n"); + + /* Check whether we timed out */ + if (n_peers != num_peers || + NULL == peers || + 0 == links_succeeded) + { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Going down due to args (eg. timeout)\n"); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "\tn_peers: %u\n", n_peers); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "\tnum_peers: %" PRIu32 "\n", num_peers); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "\tpeers: %p\n", peers); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "\tlinks_succeeded: %u\n", links_succeeded); + GNUNET_SCHEDULER_shutdown (); + return; + } + + + /* Initialize peers */ testbed_peers = peers; num_peers_online = 0; for (i = 0; i < num_peers; i++) @@ -1515,7 +1568,10 @@ main (int argc, char *argv[]) GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Test churn\n"); cur_test_run.name = "test-rps-churn"; num_peers = 5; - cur_test_run.main_test = single_req_cb; + cur_test_run.init_peer = default_init_peer; + cur_test_run.main_test = churn_test_cb; + cur_test_run.reply_handle = default_reply_handle; + cur_test_run.eval_cb = default_eval_cb; cur_test_run.have_churn = GNUNET_YES; timeout = GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 10); } diff --git a/src/rps/test_service_rps_peers.c b/src/rps/test_service_rps_peers.c @@ -1,137 +0,0 @@ -/* - This file is part of GNUnet. - Copyright (C) - - GNUnet is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published - by the Free Software Foundation; either version 3, or (at your - option) any later version. - - GNUnet is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GNUnet; see the file COPYING. If not, write to the - Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. -*/ -/** - * @file rps/test_service_rps_peers.c - * @brief testcase for gnunet-service-rps_peers.c - */ -#include <platform.h> -#include "gnunet-service-rps_peers.h" - -#define ABORT() { fprintf(stderr, "Error at %s:%d\n", __FILE__, __LINE__); Peers_terminate (); return 1; } -#define CHECK(c) { if (! (c)) ABORT(); } - -#define FN_VALID_PEERS "DISABLE" - -/** - * @brief Dummy implementation of #PeerOp (Operation on peer) - * - * @param cls closure - * @param peer peer - */ -void peer_op (void *cls, const struct GNUNET_PeerIdentity *peer) -{ - GNUNET_assert (NULL != peer); -} - -/** - * @brief Function that is called on a peer for later execution - * - * @param cls closure - * @param peer peer to execute function upon - */ -void -peer_op (void *cls, const struct GNUNET_PeerIdentity *peer); - -static int -check () -{ - struct GNUNET_PeerIdentity k1; - struct GNUNET_PeerIdentity own_id; - - memset (&k1, 0, sizeof (k1)); - memset (&own_id, 1, sizeof (own_id)); - - /* Do nothing */ - Peers_initialise (FN_VALID_PEERS, NULL, NULL, NULL, &own_id); - Peers_terminate (); - - - /* Create peer */ - Peers_initialise (FN_VALID_PEERS, NULL, NULL, NULL, &own_id); - CHECK (GNUNET_YES == Peers_insert_peer (&k1)); - Peers_terminate (); - - - /* Create peer */ - Peers_initialise (FN_VALID_PEERS, NULL, NULL, NULL, &own_id); - CHECK (GNUNET_YES == Peers_insert_peer (&k1)); - CHECK (GNUNET_YES == Peers_remove_peer (&k1)); - Peers_terminate (); - - - /* Insertion and Removal */ - Peers_initialise (FN_VALID_PEERS, NULL, NULL, NULL, &own_id); - CHECK (GNUNET_NO == Peers_check_peer_known (&k1)); - - CHECK (GNUNET_YES == Peers_insert_peer (&k1)); - CHECK (GNUNET_NO == Peers_insert_peer (&k1)); - CHECK (GNUNET_YES == Peers_check_peer_known (&k1)); - - CHECK (GNUNET_YES == Peers_remove_peer (&k1)); - CHECK (GNUNET_NO == Peers_remove_peer (&k1)); - CHECK (GNUNET_NO == Peers_check_peer_known (&k1)); - - - /* Flags */ - Peers_insert_peer (&k1); - - CHECK (GNUNET_NO == Peers_check_peer_flag (&k1, Peers_PULL_REPLY_PENDING)); - CHECK (GNUNET_NO == Peers_check_peer_flag (&k1, Peers_ONLINE)); - CHECK (GNUNET_NO == Peers_check_peer_flag (&k1, Peers_TO_DESTROY)); - - CHECK (GNUNET_NO == Peers_check_peer_flag (&k1, Peers_ONLINE)); - - Peers_set_peer_flag (&k1, Peers_ONLINE); - CHECK (GNUNET_YES == Peers_check_peer_flag (&k1, Peers_ONLINE)); - CHECK (GNUNET_NO == Peers_check_peer_flag (&k1, Peers_TO_DESTROY)); - CHECK (GNUNET_YES == Peers_check_peer_flag (&k1, Peers_ONLINE)); - CHECK (GNUNET_NO == Peers_check_peer_flag (&k1, Peers_TO_DESTROY)); - - /* Check send intention */ - CHECK (GNUNET_NO == Peers_check_peer_send_intention (&k1)); - - /* Check existence of sending channel */ - CHECK (GNUNET_NO == Peers_check_sending_channel_exists (&k1)); - - /* Check role of channels */ - CHECK (GNUNET_YES == Peers_check_channel_role (&k1, - NULL, - Peers_CHANNEL_ROLE_SENDING)); - CHECK (GNUNET_YES == Peers_check_channel_role (&k1, - NULL, - Peers_CHANNEL_ROLE_RECEIVING)); - - CHECK (GNUNET_YES == Peers_schedule_operation (&k1, peer_op)); - - Peers_terminate (); - return 0; -} - - -int -main (int argc, char *argv[]) -{ - GNUNET_log_setup ("test_service_rps_peers", - "WARNING", - NULL); - return check (); -} - -/* end of test_service_rps_peers.c */ diff --git a/src/set/Makefile.am b/src/set/Makefile.am @@ -52,7 +52,7 @@ gnunet_set_ibf_profiler_LDADD = \ gnunet_service_set_SOURCES = \ gnunet-service-set.c gnunet-service-set.h \ gnunet-service-set_union.c gnunet-service-set_union.h \ - gnunet-service-set_intersection.c \ + gnunet-service-set_intersection.c gnunet-service-set_intersection.h \ ibf.c ibf.h \ gnunet-service-set_union_strata_estimator.c gnunet-service-set_union_strata_estimator.h \ gnunet-service-set_protocol.h diff --git a/src/set/gnunet-service-set_union.c b/src/set/gnunet-service-set_union.c @@ -364,7 +364,7 @@ fail_union_operation (struct Operation *op) struct GNUNET_MQ_Envelope *ev; struct GNUNET_SET_ResultMessage *msg; - LOG (GNUNET_ERROR_TYPE_ERROR, + LOG (GNUNET_ERROR_TYPE_WARNING, "union operation failed\n"); ev = GNUNET_MQ_msg (msg, GNUNET_MESSAGE_TYPE_SET_RESULT); msg->result_status = htons (GNUNET_SET_STATUS_FAILURE); @@ -1404,7 +1404,7 @@ send_client_done (void *cls) } if (PHASE_DONE != op->state->phase) { - LOG (GNUNET_ERROR_TYPE_ERROR, + LOG (GNUNET_ERROR_TYPE_WARNING, "union operation failed\n"); ev = GNUNET_MQ_msg (rm, GNUNET_MESSAGE_TYPE_SET_RESULT); rm->result_status = htons (GNUNET_SET_STATUS_FAILURE); diff --git a/src/social/gnunet-service-social.c b/src/social/gnunet-service-social.c @@ -96,7 +96,7 @@ static struct GNUNET_CONTAINER_MultiHashMap *apps_places; * Application subscriptions per place. * H(place_pub_key) -> H(app_id) */ -static struct GNUNET_CONTAINER_MultiHashMap *places_apps; +//static struct GNUNET_CONTAINER_MultiHashMap *places_apps; /** * Connected applications. @@ -255,10 +255,10 @@ struct Place uint8_t is_ready; /** - * Is the client disconnected? + * Is the client disconnecting? * #GNUNET_YES or #GNUNET_NO */ - uint8_t is_disconnected; + uint8_t is_disconnecting; /** * Is this a host (#GNUNET_YES), or guest (#GNUNET_NO)? @@ -348,7 +348,7 @@ struct Guest /** * Join request to be transmitted to the master on join. */ - struct GNUNET_MessageHeader *join_req; + struct GNUNET_MessageHeader *join_req; // FIXME: not used! /** * Join decision received from PSYC. @@ -487,8 +487,6 @@ cleanup_host (struct Host *hst) { struct Place *plc = &hst->place; - if (NULL != hst->master) - GNUNET_PSYC_master_stop (hst->master, GNUNET_NO, NULL, NULL); // FIXME GNUNET_CONTAINER_multihashmap_destroy (hst->join_reqs); GNUNET_CONTAINER_multihashmap_destroy (hst->relay_msgs); GNUNET_CONTAINER_multihashmap_remove (hosts, &plc->pub_key_hash, plc); @@ -505,7 +503,7 @@ cleanup_guest (struct Guest *gst) struct GNUNET_CONTAINER_MultiHashMap * plc_gst = GNUNET_CONTAINER_multihashmap_get (place_guests, &plc->pub_key_hash); - GNUNET_assert (NULL != plc_gst); // FIXME + GNUNET_assert (NULL != plc_gst); GNUNET_CONTAINER_multihashmap_remove (plc_gst, &plc->ego_pub_hash, gst); if (0 == GNUNET_CONTAINER_multihashmap_size (plc_gst)) @@ -520,8 +518,6 @@ cleanup_guest (struct Guest *gst) GNUNET_free (gst->join_req); if (NULL != gst->relays) GNUNET_free (gst->relays); - if (NULL != gst->slave) - GNUNET_PSYC_slave_part (gst->slave, GNUNET_NO, NULL, NULL); // FIXME GNUNET_CONTAINER_multihashmap_remove (guests, &plc->pub_key_hash, plc); } @@ -537,8 +533,8 @@ cleanup_place (void *cls) struct Place *plc = cls; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "%p Cleaning up place %s\n", - plc, GNUNET_h2s (&plc->pub_key_hash)); + "cleaning up place %s\n", + GNUNET_h2s (&plc->pub_key_hash)); (GNUNET_YES == plc->is_host) ? cleanup_host ((struct Host *) plc) @@ -583,12 +579,19 @@ client_notify_disconnect (void *cls, { if (cli->client == client) { - GNUNET_CONTAINER_DLL_remove (plc->clients_head, plc->clients_tail, cli); + GNUNET_CONTAINER_DLL_remove (plc->clients_head, + plc->clients_tail, + cli); GNUNET_free (cli); break; } cli = cli->next; } + if (GNUNET_YES == plc->is_disconnecting) + { + GNUNET_PSYC_slicer_destroy (plc->slicer); + GNUNET_free (plc); + } } @@ -605,46 +608,55 @@ client_notify_connect (void *cls, struct GNUNET_SERVICE_Client *client, struct GNUNET_MQ_Handle *mq) { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Client connected: %p\n", client); + struct Client *c = GNUNET_new (struct Client); - struct Client *c = GNUNET_malloc (sizeof (*c)); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Client %p connected with queue %p\n", + client, + mq); c->client = client; - return c; } /** - * Send message to a client. - */ -static inline void -client_send_msg (struct GNUNET_SERVICE_Client *client, - const struct GNUNET_MessageHeader *msg) -{ - struct GNUNET_MQ_Envelope * - env = GNUNET_MQ_msg_copy (msg); - - GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq (client), - env); -} - - -/** - * Send message to all clients connected to a place. + * Send message to all clients connected to a place and + * takes care of freeing @env. */ static void place_send_msg (const struct Place *plc, - const struct GNUNET_MessageHeader *msg) + struct GNUNET_MQ_Envelope *env) { + struct ClientListItem *cli = plc->clients_head; + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "%p Sending message to clients of place.\n", plc); - - struct ClientListItem *cli = plc->clients_head; while (NULL != cli) { - client_send_msg (cli->client, msg); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Sending message to client %p\n", + cli); + GNUNET_MQ_send_copy (GNUNET_SERVICE_client_get_mq (cli->client), + env); cli = cli->next; } + GNUNET_MQ_discard (env); +} + + +static void +place_send_leave_ack (struct Place *plc) +{ + struct GNUNET_MQ_Envelope *env; + + for (struct ClientListItem *cli = plc->clients_head; + NULL != cli; + cli = cli->next) + { + env = GNUNET_MQ_msg_header (GNUNET_MESSAGE_TYPE_SOCIAL_PLACE_LEAVE_ACK); + GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq (cli->client), + env); + } } @@ -666,23 +678,21 @@ static void client_send_result (struct GNUNET_SERVICE_Client *client, uint64_t op_id, int64_t result_code, const void *data, uint16_t data_size) { + struct GNUNET_MQ_Envelope *env; struct GNUNET_OperationResultMessage *res; - res = GNUNET_malloc (sizeof (*res) + data_size); - res->header.type = htons (GNUNET_MESSAGE_TYPE_PSYC_RESULT_CODE); - res->header.size = htons (sizeof (*res) + data_size); + env = GNUNET_MQ_msg_extra (res, + data_size, + GNUNET_MESSAGE_TYPE_PSYC_RESULT_CODE); res->result_code = GNUNET_htonll (result_code); res->op_id = op_id; if (0 < data_size) GNUNET_memcpy (&res[1], data, data_size); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "%p Sending result to client for operation #%" PRIu64 ": " "%" PRId64 " (size: %u)\n", client, GNUNET_ntohll (op_id), result_code, data_size); - - client_send_msg (client, &res->header); - GNUNET_free (res); + GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq (client), env); } @@ -690,19 +700,21 @@ static void client_send_host_enter_ack (struct GNUNET_SERVICE_Client *client, struct Host *hst, uint32_t result) { + struct GNUNET_MQ_Envelope *env; + struct HostEnterAck *hack; struct Place *plc = &hst->place; - struct HostEnterAck hack; - hack.header.type = htons (GNUNET_MESSAGE_TYPE_SOCIAL_HOST_ENTER_ACK); - hack.header.size = htons (sizeof (hack)); - hack.result_code = htonl (result); - hack.max_message_id = GNUNET_htonll (plc->max_message_id); - hack.place_pub_key = plc->pub_key; + env = GNUNET_MQ_msg (hack, + GNUNET_MESSAGE_TYPE_SOCIAL_HOST_ENTER_ACK); + hack->result_code = htonl (result); + hack->max_message_id = GNUNET_htonll (plc->max_message_id); + hack->place_pub_key = plc->pub_key; if (NULL != client) - client_send_msg (client, &hack.header); + GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq (client), + env); else - place_send_msg (plc, &hack.header); + place_send_msg (plc, env); } @@ -736,7 +748,8 @@ psyc_recv_join_request (void *cls, GNUNET_CRYPTO_hash (slave_key, sizeof (*slave_key), &slave_key_hash); GNUNET_CONTAINER_multihashmap_put (hst->join_reqs, &slave_key_hash, jh, GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE); - place_send_msg (&hst->place, &req->header); + place_send_msg (&hst->place, + GNUNET_MQ_msg_copy (&req->header)); } @@ -746,18 +759,29 @@ psyc_recv_join_request (void *cls, static void psyc_slave_connected (void *cls, int result, uint64_t max_message_id) { + struct GNUNET_PSYC_CountersResultMessage *res; + struct GNUNET_MQ_Envelope *env; struct Guest *gst = cls; struct Place *plc = &gst->place; + plc->max_message_id = max_message_id; plc->is_ready = GNUNET_YES; + env = GNUNET_MQ_msg (res, + GNUNET_MESSAGE_TYPE_SOCIAL_GUEST_ENTER_ACK); + res->result_code = + (result != GNUNET_SYSERR) ? htonl (GNUNET_OK) : htonl (GNUNET_SYSERR); + res->max_message_id = GNUNET_htonll (plc->max_message_id); + place_send_msg (plc, env); +} - struct GNUNET_PSYC_CountersResultMessage res; - res.header.type = htons (GNUNET_MESSAGE_TYPE_SOCIAL_GUEST_ENTER_ACK); - res.header.size = htons (sizeof (res)); - res.result_code = htonl (result); - res.max_message_id = GNUNET_htonll (plc->max_message_id); - place_send_msg (plc, &res.header); +static void +slave_parted_after_join_decision (void *cls) +{ + struct Guest *gst = cls; + + GNUNET_assert (NULL != gst->join_dcsn); + place_send_msg (&gst->place, GNUNET_MQ_msg_copy (&gst->join_dcsn->header)); } @@ -771,7 +795,21 @@ psyc_recv_join_dcsn (void *cls, const struct GNUNET_PSYC_Message *join_msg) { struct Guest *gst = cls; - place_send_msg (&gst->place, &dcsn->header); + + gst->join_dcsn = GNUNET_malloc (dcsn->header.size); + GNUNET_memcpy (gst->join_dcsn, + dcsn, + dcsn->header.size); + if (GNUNET_NO == is_admitted) + { + GNUNET_PSYC_slave_part (gst->slave, + GNUNET_NO, + &slave_parted_after_join_decision, + gst); + gst->slave = NULL; + return; + } + place_send_msg (&gst->place, GNUNET_MQ_msg_copy (&gst->join_dcsn->header)); } @@ -792,7 +830,7 @@ psyc_recv_message (void *cls, GNUNET_PSYC_slicer_message (plc->slicer, msg); - place_send_msg (plc, &msg->header); + place_send_msg (plc, GNUNET_MQ_msg_copy (&msg->header)); } @@ -1096,9 +1134,6 @@ place_init (struct Place *plc) static int place_add (const struct PlaceEnterRequest *ereq) { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Adding place to hashmap:\n"); - struct EgoPlacePublicKey ego_place_pub_key = { .ego_pub_key = ereq->ego_pub_key, .place_pub_key = ereq->place_pub_key, @@ -1173,7 +1208,9 @@ app_place_add (const char *app_id, return GNUNET_NO; if (GNUNET_SYSERR == place_add (ereq)) + { return GNUNET_SYSERR; + } if (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put (app_places, &ego_place_pub_hash, NULL, GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST)) @@ -1181,32 +1218,6 @@ app_place_add (const char *app_id, GNUNET_break (0); return GNUNET_SYSERR; } - - struct GNUNET_HashCode place_pub_hash; - GNUNET_CRYPTO_hash (&ereq->place_pub_key, sizeof (ereq->place_pub_key), &place_pub_hash); - - struct GNUNET_CONTAINER_MultiHashMap * - place_apps = GNUNET_CONTAINER_multihashmap_get (places_apps, &place_pub_hash); - if (NULL == place_apps) - { - place_apps = GNUNET_CONTAINER_multihashmap_create (1, GNUNET_NO); - if (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put (places_apps, &place_pub_hash, place_apps, - GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST)) - { - GNUNET_break (0); - } - } - - size_t app_id_size = strlen (app_id) + 1; - void *app_id_value = GNUNET_malloc (app_id_size); - GNUNET_memcpy (app_id_value, app_id, app_id_size); - - if (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put (place_apps, &app_id_hash, app_id_value, - GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY)) - { - GNUNET_break (0); - } - return GNUNET_OK; } @@ -1223,7 +1234,10 @@ static int app_place_save (const char *app_id, const struct PlaceEnterRequest *ereq) { - app_place_add (app_id, ereq); + if (GNUNET_SYSERR == app_place_add (app_id, ereq)) + { + GNUNET_assert (0); + } if (NULL == dir_places) return GNUNET_SYSERR; @@ -1304,18 +1318,6 @@ app_place_remove (const char *app_id, if (NULL != app_places) GNUNET_CONTAINER_multihashmap_remove (app_places, &place_pub_hash, NULL); - struct GNUNET_CONTAINER_MultiHashMap * - place_apps = GNUNET_CONTAINER_multihashmap_get (places_apps, &place_pub_hash); - if (NULL != place_apps) - { - void *app_id_value = GNUNET_CONTAINER_multihashmap_get (place_apps, &app_id_hash); - if (NULL != app_id_value) - { - GNUNET_CONTAINER_multihashmap_remove (place_apps, &app_id_hash, app_id_value); - GNUNET_free (app_id_value); - } - } - int ret = GNUNET_OK; if (0 != unlink (app_place_filename)) @@ -1407,6 +1409,124 @@ msg_proc_parse (const struct MsgProcRequest *mpreq, } +void +app_notify_place (const struct GNUNET_MessageHeader *msg, + struct GNUNET_SERVICE_Client *client) +{ + struct AppPlaceMessage *amsg; + struct GNUNET_MQ_Envelope *env; + uint16_t msg_size = ntohs (msg->size); + + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "%p Sending place notification of type %u to client.\n", + client, ntohs (msg->type)); + switch (ntohs (msg->type)) + { + case GNUNET_MESSAGE_TYPE_SOCIAL_HOST_ENTER: + { + struct HostEnterRequest *hreq = (struct HostEnterRequest *) msg; + if (msg_size < sizeof (struct HostEnterRequest)) + return; + env = GNUNET_MQ_msg (amsg, + GNUNET_MESSAGE_TYPE_SOCIAL_APP_PLACE); + // FIXME: also notify about not entered places + amsg->place_state = GNUNET_SOCIAL_PLACE_STATE_ENTERED; + amsg->is_host = GNUNET_YES; + amsg->ego_pub_key = hreq->ego_pub_key; + amsg->place_pub_key = hreq->place_pub_key; + GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq (client), + env); + break; + } + case GNUNET_MESSAGE_TYPE_SOCIAL_GUEST_ENTER: + { + if (msg_size < sizeof (struct GuestEnterRequest)) + return; + struct GuestEnterRequest *greq = (struct GuestEnterRequest *) msg; + env = GNUNET_MQ_msg (amsg, + GNUNET_MESSAGE_TYPE_SOCIAL_APP_PLACE); + // FIXME: also notify about not entered places + amsg->place_state = GNUNET_SOCIAL_PLACE_STATE_ENTERED; + amsg->is_host = GNUNET_NO; + amsg->ego_pub_key = greq->ego_pub_key; + amsg->place_pub_key = greq->place_pub_key; + GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq (client), + env); + break; + } + default: + return; + } +} + + +void +app_notify_place_end (struct GNUNET_SERVICE_Client *client) +{ + struct GNUNET_MQ_Envelope *env; + + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "%p Sending end of place list notification to client\n", + client); + env = GNUNET_MQ_msg_header (GNUNET_MESSAGE_TYPE_SOCIAL_APP_PLACE_END); + GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq (client), + env); +} + + +void +app_notify_ego (struct Ego *ego, struct GNUNET_SERVICE_Client *client) +{ + struct AppEgoMessage *emsg; + struct GNUNET_MQ_Envelope *env; + size_t name_size = strlen (ego->name) + 1; + + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "%p Sending ego notification to client: %s\n", + client, ego->name); + env = GNUNET_MQ_msg_extra (emsg, + name_size, + GNUNET_MESSAGE_TYPE_SOCIAL_APP_EGO); + GNUNET_CRYPTO_ecdsa_key_get_public (&ego->key, &emsg->ego_pub_key); + GNUNET_memcpy (&emsg[1], ego->name, name_size); + GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq (client), + env); +} + + +void +app_notify_ego_end (struct GNUNET_SERVICE_Client *client) +{ + struct GNUNET_MQ_Envelope *env; + + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "%p Sending end of ego list notification to client\n", + client); + env = GNUNET_MQ_msg_header (GNUNET_MESSAGE_TYPE_SOCIAL_APP_EGO_END); + GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq (client), + env); +} + + +int +app_place_entry_notify (void *cls, const struct GNUNET_HashCode *key, void *value) +{ + struct GNUNET_MessageHeader * + msg = GNUNET_CONTAINER_multihashmap_get (places, key); + if (NULL != msg) + app_notify_place (msg, cls); + return GNUNET_YES; +} + + +int +ego_entry (void *cls, const struct GNUNET_HashCode *key, void *value) +{ + app_notify_ego (value, cls); + return GNUNET_YES; +} + + static int check_client_msg_proc_set (void *cls, const struct MsgProcRequest *mpreq) @@ -1518,9 +1638,8 @@ static void handle_client_host_enter (void *cls, const struct HostEnterRequest *hr) { - struct Client *c = cls; + struct Client *c = cls; struct GNUNET_SERVICE_Client *client = c->client; - struct HostEnterRequest * hreq = (struct HostEnterRequest *) GNUNET_copy_message (&hr->header); @@ -1578,7 +1697,7 @@ handle_client_host_enter (void *cls, if (ret != GNUNET_SYSERR) { - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "%p Client connected as host to place %s.\n", hst, GNUNET_h2s (&plc->pub_key_hash)); @@ -1586,6 +1705,7 @@ handle_client_host_enter (void *cls, cli->client = client; GNUNET_CONTAINER_DLL_insert (plc->clients_head, plc->clients_tail, cli); c->place = plc; + app_notify_place (&hreq->header, client); } GNUNET_CRYPTO_eddsa_key_clear (&hreq->place_key); @@ -1622,8 +1742,12 @@ guest_enter (const struct GuestEnterRequest *greq, struct Guest **ret_gst) struct Ego *ego = GNUNET_CONTAINER_multihashmap_get (egos, &ego_pub_hash); if (NULL == ego) + { return GNUNET_SYSERR; + } + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "entering as guest\n"); struct GNUNET_HashCode place_pub_hash; GNUNET_CRYPTO_hash (&greq->place_pub_key, sizeof (greq->place_pub_key), &place_pub_hash); @@ -1635,9 +1759,16 @@ guest_enter (const struct GuestEnterRequest *greq, struct Guest **ret_gst) if (NULL != plc_gst) gst = GNUNET_CONTAINER_multihashmap_get (plc_gst, &ego_pub_hash); - if (NULL == gst || NULL == gst->slave) + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "plc_gst = %p, gst = %p\n", + plc_gst, + gst); + if (NULL == gst) { gst = GNUNET_new (struct Guest); + } + if (NULL == gst->slave) + { gst->origin = greq->origin; gst->relay_count = ntohl (greq->relay_count); @@ -1710,11 +1841,12 @@ guest_enter (const struct GuestEnterRequest *greq, struct Guest **ret_gst) plc_gst = GNUNET_CONTAINER_multihashmap_create (1, GNUNET_YES); (void) GNUNET_CONTAINER_multihashmap_put (place_guests, &plc->pub_key_hash, plc_gst, GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST); - } - (void) GNUNET_CONTAINER_multihashmap_put (plc_gst, &plc->ego_pub_hash, gst, - GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST); - (void) GNUNET_CONTAINER_multihashmap_put (guests, &plc->pub_key_hash, gst, + (void) GNUNET_CONTAINER_multihashmap_put (plc_gst, &plc->ego_pub_hash, gst, + GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST); + (void) GNUNET_CONTAINER_multihashmap_put (guests, &plc->pub_key_hash, gst, GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE); + + } gst->slave = GNUNET_PSYC_slave_join (cfg, &plc->pub_key, &plc->ego_key, gst->join_flags, &gst->origin, @@ -1724,6 +1856,9 @@ guest_enter (const struct GuestEnterRequest *greq, struct Guest **ret_gst) &psyc_recv_join_dcsn, gst, join_msg); plc->channel = GNUNET_PSYC_slave_get_channel (gst->slave); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "slave entered channel %p\n", + plc->channel); ret = GNUNET_YES; } @@ -1734,78 +1869,96 @@ guest_enter (const struct GuestEnterRequest *greq, struct Guest **ret_gst) static int -check_client_guest_enter (void *cls, - const struct GuestEnterRequest *greq) -{ - return GNUNET_OK; -} - - -/** - * Handle a connecting client entering a place as guest. - */ -static void -handle_client_guest_enter (void *cls, - const struct GuestEnterRequest *greq) +client_guest_enter (struct Client *c, + const struct GuestEnterRequest *greq) { - struct Client *c = cls; + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "client_guest_enter\n"); + struct GNUNET_PSYC_CountersResultMessage *result_msg; + struct GNUNET_MQ_Envelope *env; struct GNUNET_SERVICE_Client *client = c->client; - uint16_t remaining = ntohs (greq->header.size) - sizeof (*greq); const char *app_id = NULL; uint16_t offset = GNUNET_STRINGS_buffer_tokenize ((const char *) &greq[1], remaining, 1, &app_id); - if (0 == offset) - { - GNUNET_break (0); - GNUNET_SERVICE_client_drop (client); - return; - } - struct Guest *gst = NULL; struct Place *plc = NULL; + if (0 == offset) + { + return GNUNET_SYSERR; + } switch (guest_enter (greq, &gst)) { case GNUNET_YES: + { plc = c->place = &gst->place; + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "guest entered successfully to local place %s\n", + GNUNET_h2s (&plc->pub_key_hash)); plc->guest = gst; app_place_save (app_id, (const struct PlaceEnterRequest *) greq); + app_notify_place (&greq->header, client); break; - + } case GNUNET_NO: { plc = c->place = &gst->place; + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "guest re-entered successfully to local place %s\n", + GNUNET_h2s (&plc->pub_key_hash)); plc->guest = gst; - - struct GNUNET_PSYC_CountersResultMessage res; - res.header.type = htons (GNUNET_MESSAGE_TYPE_SOCIAL_GUEST_ENTER_ACK); - res.header.size = htons (sizeof (res)); - res.result_code = htonl (GNUNET_OK); - res.max_message_id = GNUNET_htonll (plc->max_message_id); - - client_send_msg (client, &res.header); + env = GNUNET_MQ_msg (result_msg, + GNUNET_MESSAGE_TYPE_SOCIAL_GUEST_ENTER_ACK); + result_msg->result_code = htonl (GNUNET_OK); + result_msg->max_message_id = GNUNET_htonll (plc->max_message_id); + GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq (client), + env); if (NULL != gst->join_dcsn) - client_send_msg (client, &gst->join_dcsn->header); - + { + env = GNUNET_MQ_msg_copy (&gst->join_dcsn->header); + GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq (client), + env); + } break; } case GNUNET_SYSERR: - GNUNET_break (0); - GNUNET_SERVICE_client_drop (client); - return; + { + return GNUNET_SYSERR; + } } - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "%p Client connected as guest to place %s.\n", - gst, GNUNET_h2s (&plc->pub_key_hash)); struct ClientListItem *cli = GNUNET_new (struct ClientListItem); cli->client = client; GNUNET_CONTAINER_DLL_insert (plc->clients_head, plc->clients_tail, cli); + return GNUNET_OK; +} - c->place = plc; - GNUNET_SERVICE_client_continue (client); + +static int +check_client_guest_enter (void *cls, + const struct GuestEnterRequest *greq) +{ + return GNUNET_OK; +} + + +/** + * Handle a connecting client entering a place as guest. + */ +static void +handle_client_guest_enter (void *cls, + const struct GuestEnterRequest *greq) +{ + struct Client *c = cls; + + if (GNUNET_SYSERR == client_guest_enter (c, greq)) + { + GNUNET_break (0); + GNUNET_SERVICE_client_drop (c->client); + return; + } + GNUNET_SERVICE_client_continue (c->client); } @@ -1830,7 +1983,7 @@ gns_result_guest_enter (void *cls, uint32_t rd_count, { struct GuestEnterByNameClosure *gcls = cls; struct Client *c = gcls->client; - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "%p GNS result: %u records.\n", c, rd_count); @@ -1882,7 +2035,7 @@ gns_result_guest_enter (void *cls, uint32_t rd_count, p += relay_size; GNUNET_memcpy (p, gcls->join_msg, join_msg_size); - handle_client_guest_enter (c, greq); + client_guest_enter (c, greq); GNUNET_free (gcls->app_id); if (NULL != gcls->password) @@ -1960,118 +2113,7 @@ handle_client_guest_enter_by_name (void *cls, GNUNET_GNSRECORD_TYPE_PLACE, GNUNET_GNS_LO_DEFAULT, &gns_result_guest_enter, gcls); -} - - -void -app_notify_place (struct GNUNET_MessageHeader *msg, - struct GNUNET_SERVICE_Client *client) -{ - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "%p Sending place notification of type %u to client.\n", - client, ntohs (msg->type)); - - uint16_t msg_size = ntohs (msg->size); - struct AppPlaceMessage amsg; - amsg.header.type = htons (GNUNET_MESSAGE_TYPE_SOCIAL_APP_PLACE); - amsg.header.size = htons (sizeof (amsg)); - // FIXME: also notify about not entered places - amsg.place_state = GNUNET_SOCIAL_PLACE_STATE_ENTERED; - - switch (ntohs (msg->type)) - { - case GNUNET_MESSAGE_TYPE_SOCIAL_HOST_ENTER: - if (msg_size < sizeof (struct HostEnterRequest)) - return; - struct HostEnterRequest *hreq = (struct HostEnterRequest *) msg; - amsg.is_host = GNUNET_YES; - amsg.ego_pub_key = hreq->ego_pub_key; - amsg.place_pub_key = hreq->place_pub_key; - break; - - case GNUNET_MESSAGE_TYPE_SOCIAL_GUEST_ENTER: - if (msg_size < sizeof (struct GuestEnterRequest)) - return; - struct GuestEnterRequest *greq = (struct GuestEnterRequest *) msg; - amsg.is_host = GNUNET_NO; - amsg.ego_pub_key = greq->ego_pub_key; - amsg.place_pub_key = greq->place_pub_key; - break; - - default: - return; - } - - client_send_msg (client, &amsg.header); -} - - -void -app_notify_place_end (struct GNUNET_SERVICE_Client *client) -{ - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "%p Sending end of place list notification to client\n", - client); - - struct GNUNET_MessageHeader msg; - msg.type = htons (GNUNET_MESSAGE_TYPE_SOCIAL_APP_PLACE_END); - msg.size = htons (sizeof (msg)); - - client_send_msg (client, &msg); -} - - -void -app_notify_ego (struct Ego *ego, struct GNUNET_SERVICE_Client *client) -{ - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "%p Sending ego notification to client: %s\n", - client, ego->name); - - size_t name_size = strlen (ego->name) + 1; - struct AppEgoMessage *emsg = GNUNET_malloc (sizeof (*emsg) + name_size); - emsg->header.type = htons (GNUNET_MESSAGE_TYPE_SOCIAL_APP_EGO); - emsg->header.size = htons (sizeof (*emsg) + name_size); - - GNUNET_CRYPTO_ecdsa_key_get_public (&ego->key, &emsg->ego_pub_key); - GNUNET_memcpy (&emsg[1], ego->name, name_size); - - client_send_msg (client, &emsg->header); - GNUNET_free (emsg); -} - - -void -app_notify_ego_end (struct GNUNET_SERVICE_Client *client) -{ - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "%p Sending end of ego list notification to client\n", - client); - - struct GNUNET_MessageHeader msg; - msg.type = htons (GNUNET_MESSAGE_TYPE_SOCIAL_APP_EGO_END); - msg.size = htons (sizeof (msg)); - - client_send_msg (client, &msg); -} - - -int -app_place_entry_notify (void *cls, const struct GNUNET_HashCode *key, void *value) -{ - struct GNUNET_MessageHeader * - msg = GNUNET_CONTAINER_multihashmap_get (places, key); - if (NULL != msg) - app_notify_place (msg, cls); - return GNUNET_YES; -} - - -int -ego_entry (void *cls, const struct GNUNET_HashCode *key, void *value) -{ - app_notify_ego (value, cls); - return GNUNET_YES; + GNUNET_SERVICE_client_continue (client); } @@ -2154,13 +2196,15 @@ handle_client_app_detach (void *cls, } -int -app_places_entry_remove (void *cls, const struct GNUNET_HashCode *key, void *value) +static void +place_leave_cb (void *cls) { struct Place *plc = cls; - const char *app_id = value; - app_place_remove (app_id, &plc->ego_pub_key, &plc->pub_key); - return GNUNET_YES; + + place_send_leave_ack (plc); + (GNUNET_YES == plc->is_host) + ? cleanup_host ((struct Host *) plc) + : cleanup_guest ((struct Guest *) plc); } @@ -2174,6 +2218,11 @@ handle_client_place_leave (void *cls, struct Client *c = cls; struct GNUNET_SERVICE_Client *client = c->client; struct Place *plc = c->place; + + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "got leave request from %s for place %s", + plc->is_host? "host" : "slave", + GNUNET_h2s (&plc->pub_key_hash)); if (NULL == plc) { GNUNET_break (0); @@ -2181,40 +2230,28 @@ handle_client_place_leave (void *cls, return; } - /* FIXME: remove all app subscriptions and leave this place */ - - struct GNUNET_CONTAINER_MultiHashMap * - place_apps = GNUNET_CONTAINER_multihashmap_get (places_apps, &plc->pub_key_hash); - if (NULL != place_apps) + if (GNUNET_YES != plc->is_disconnecting) { - GNUNET_CONTAINER_multihashmap_iterate (place_apps, app_places_entry_remove, plc); - } - - /* FIXME: disconnect from the network, but keep local connection for history access */ - - /* Disconnect all clients connected to the place */ - struct ClientListItem *cli = plc->clients_head, *next; - while (NULL != cli) - { - GNUNET_CONTAINER_DLL_remove (plc->clients_head, plc->clients_tail, cli); - GNUNET_SERVICE_client_drop (cli->client); - next = cli->next; - GNUNET_free (cli); - cli = next; - } - - if (GNUNET_YES != plc->is_disconnected) - { - plc->is_disconnected = GNUNET_YES; - if (NULL != plc->tmit_msgs_head) - { /* Send pending messages to PSYC before cleanup. */ - psyc_transmit_message (plc); + plc->is_disconnecting = GNUNET_YES; + if (plc->is_host) + { + struct Host *host = plc->host; + GNUNET_assert (NULL != host); + GNUNET_PSYC_master_stop (host->master, GNUNET_NO, &place_leave_cb, plc); } else { - cleanup_place (plc); + struct Guest *guest = plc->guest; + GNUNET_assert (NULL != guest); + GNUNET_PSYC_slave_part (guest->slave, GNUNET_NO, &place_leave_cb, plc); } } + else + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "got leave request but place is already leaving\n"); + } + GNUNET_SERVICE_client_continue (client); } @@ -2273,6 +2310,9 @@ handle_client_join_decision (void *cls, ? (struct GNUNET_PSYC_Message *) &dcsn[1] : NULL; + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "jcls.msg = %p\n", + jcls.msg); struct GNUNET_HashCode slave_pub_hash; GNUNET_CRYPTO_hash (&dcsn->slave_pub_key, sizeof (dcsn->slave_pub_key), &slave_pub_hash); @@ -2302,10 +2342,11 @@ handle_client_join_decision (void *cls, static void send_message_ack (struct Place *plc, struct GNUNET_SERVICE_Client *client) { - struct GNUNET_MessageHeader res; - res.size = htons (sizeof (res)); - res.type = htons (GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_ACK); - client_send_msg (client, &res); + struct GNUNET_MQ_Envelope *env; + + env = GNUNET_MQ_msg_header (GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_ACK); + GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq (client), + env); } @@ -2437,7 +2478,6 @@ psyc_transmit_notify_data (void *cls, uint16_t *data_size, void *data) { *data_size = 0; tmit_msg = psyc_transmit_queue_next_msg (plc, tmit_msg); - plc->is_disconnected = GNUNET_YES; GNUNET_SERVICE_client_drop (tmit_frag->client); GNUNET_SCHEDULER_add_now (&cleanup_place, plc); return ret; @@ -2479,11 +2519,7 @@ psyc_transmit_notify_data (void *cls, uint16_t *data_size, void *data) { psyc_transmit_message (plc); } - else if (GNUNET_YES == plc->is_disconnected) - { - /* FIXME: handle partial message (when still in_transmit) */ - cleanup_place (plc); - } + /* FIXME: handle partial message (when still in_transmit) */ } return ret; } @@ -2597,7 +2633,6 @@ psyc_transmit_notify_mod (void *cls, uint16_t *data_size, void *data, *data_size = 0; ret = GNUNET_SYSERR; tmit_msg = psyc_transmit_queue_next_msg (plc, tmit_msg); - plc->is_disconnected = GNUNET_YES; GNUNET_SERVICE_client_drop (tmit_frag->client); GNUNET_SCHEDULER_add_now (&cleanup_place, plc); } @@ -2862,26 +2897,26 @@ psyc_transmit_queue_message (struct Place *plc, } -/** - * Cancel transmission of current message to PSYC. - * - * @param plc Place to send to. - * @param client Client the message originates from. - */ -static void -psyc_transmit_cancel (struct Place *plc, struct GNUNET_SERVICE_Client *client) -{ - uint16_t type = GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_CANCEL; - - struct GNUNET_MessageHeader msg; - msg.size = htons (sizeof (msg)); - msg.type = htons (type); - - psyc_transmit_queue_message (plc, client, sizeof (msg), &msg, type, type, NULL); - psyc_transmit_message (plc); - - /* FIXME: cleanup */ -} +///** +// * Cancel transmission of current message to PSYC. +// * +// * @param plc Place to send to. +// * @param client Client the message originates from. +// */ +//static void +//psyc_transmit_cancel (struct Place *plc, struct GNUNET_SERVICE_Client *client) +//{ +// uint16_t type = GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_CANCEL; +// +// struct GNUNET_MessageHeader msg; +// msg.size = htons (sizeof (msg)); +// msg.type = htons (type); +// +// psyc_transmit_queue_message (plc, client, sizeof (msg), &msg, type, type, NULL); +// psyc_transmit_message (plc); +// +// /* FIXME: cleanup */ +//} static int @@ -2902,17 +2937,19 @@ handle_client_psyc_message (void *cls, struct Client *c = cls; struct GNUNET_SERVICE_Client *client = c->client; struct Place *plc = c->place; + int ret; + if (NULL == plc) { + GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + "received PSYC message for non-existing client %p\n", + client); GNUNET_break (0); GNUNET_SERVICE_client_drop (client); return; } - - int ret = GNUNET_SYSERR; - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "%p Received message from client.\n", plc); + "%p Received message of type %d from client.\n", plc, ntohs (msg->type)); GNUNET_PSYC_log_message (GNUNET_ERROR_TYPE_DEBUG, msg); if (GNUNET_YES != plc->is_ready) @@ -2933,20 +2970,19 @@ handle_client_psyc_message (void *cls, "%p Received message with invalid payload size (%u) from client.\n", plc, psize); GNUNET_break (0); - psyc_transmit_cancel (plc, client); GNUNET_SERVICE_client_drop (client); return; } - uint16_t first_ptype = 0, last_ptype = 0; - if (GNUNET_SYSERR - == GNUNET_PSYC_receive_check_parts (psize, (const char *) &msg[1], - &first_ptype, &last_ptype)) + uint16_t first_ptype = 0; + uint16_t last_ptype = 0; + if (GNUNET_SYSERR == + GNUNET_PSYC_receive_check_parts (psize, (const char *) &msg[1], + &first_ptype, &last_ptype)) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "%p Received invalid message part from client.\n", plc); GNUNET_break (0); - psyc_transmit_cancel (plc, client); GNUNET_SERVICE_client_drop (client); return; } @@ -2963,20 +2999,19 @@ handle_client_psyc_message (void *cls, c->tmit_msg = NULL; ret = psyc_transmit_message (plc); } - + else + { + ret = GNUNET_SYSERR; + } if (GNUNET_OK != ret) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "%p Received invalid message part from client.\n", plc); GNUNET_break (0); - psyc_transmit_cancel (plc, client); - ret = GNUNET_SYSERR; - } - - if (GNUNET_OK == ret) - GNUNET_SERVICE_client_continue (client); - else GNUNET_SERVICE_client_drop (client); + return; + } + GNUNET_SERVICE_client_continue (client); } @@ -3006,7 +3041,7 @@ psyc_recv_history_message (void *cls, const struct GNUNET_PSYC_MessageHeader *ms GNUNET_memcpy (&res[1], msg, size); /** @todo FIXME: send only to requesting client */ - place_send_msg (plc, &res->header); + place_send_msg (plc, GNUNET_MQ_msg_copy (&res->header)); GNUNET_free (res); } @@ -3108,29 +3143,24 @@ psyc_recv_state_var (void *cls, uint32_t value_size, uint32_t full_value_size) { + struct GNUNET_OperationResultMessage *result_msg; + struct GNUNET_MQ_Envelope *env; struct OperationClosure *opcls = cls; struct Client *c = opcls->client; struct Place *plc = c->place; + uint16_t size = ntohs (mod->size); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "%p Received state variable %s from PSYC\n", plc, name); - - uint16_t size = ntohs (mod->size); - - struct GNUNET_OperationResultMessage * - res = GNUNET_malloc (sizeof (*res) + size); - res->header.size = htons (sizeof (*res) + size); - res->header.type = htons (GNUNET_MESSAGE_TYPE_PSYC_STATE_RESULT); - res->op_id = opcls->op_id; - res->result_code = GNUNET_htonll (GNUNET_OK); - - GNUNET_memcpy (&res[1], mod, size); - + env = GNUNET_MQ_msg_extra (result_msg, + size, + GNUNET_MESSAGE_TYPE_PSYC_STATE_RESULT); + result_msg->op_id = opcls->op_id; + result_msg->result_code = GNUNET_htonll (GNUNET_OK); + GNUNET_memcpy (&result_msg[1], mod, size); /** @todo FIXME: send only to requesting client */ - place_send_msg (plc, &res->header); - - GNUNET_free (res); + place_send_msg (plc, env); } @@ -3184,7 +3214,7 @@ handle_client_state_get (void *cls, uint16_t size = ntohs (req->header.size); const char *name = (const char *) &req[1]; - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "%p State get #%" PRIu64 ": %s\n", plc, GNUNET_ntohll (req->op_id), name); @@ -3382,7 +3412,7 @@ path_basename (const char *path) if (NULL != basename) basename++; - if (NULL == basename || '\0' == basename) + if (NULL == basename || '\0' == *basename) return NULL; return basename; @@ -3468,7 +3498,10 @@ file_place_load (void *cls, const char *place_filename) return GNUNET_OK; } - app_place_add (plcls->app_id, ereq); + if (GNUNET_SYSERR == app_place_add (plcls->app_id, ereq)) + { + GNUNET_assert (0); + } GNUNET_free (ereq); return GNUNET_OK; } @@ -3523,6 +3556,10 @@ identity_recv_ego (void *cls, struct GNUNET_IDENTITY_Ego *id_ego, if (NULL == id_ego) // end of initial list of egos return; + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "social service received ego %s\n", + name); + struct GNUNET_CRYPTO_EcdsaPublicKey ego_pub_key; GNUNET_IDENTITY_ego_get_public_key (id_ego, &ego_pub_key); @@ -3571,6 +3608,9 @@ run (void *cls, const struct GNUNET_CONFIGURATION_Handle *c, struct GNUNET_SERVICE_Handle *svc) { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "starting social service\n"); + cfg = c; service = svc; GNUNET_CRYPTO_get_peer_identity (cfg, &this_peer); @@ -3583,7 +3623,7 @@ run (void *cls, apps = GNUNET_CONTAINER_multihashmap_create (1, GNUNET_NO); places = GNUNET_CONTAINER_multihashmap_create(1, GNUNET_NO); apps_places = GNUNET_CONTAINER_multihashmap_create(1, GNUNET_NO); - places_apps = GNUNET_CONTAINER_multihashmap_create(1, GNUNET_NO); + //places_apps = GNUNET_CONTAINER_multihashmap_create(1, GNUNET_NO); id = GNUNET_IDENTITY_connect (cfg, &identity_recv_ego, NULL); gns = GNUNET_GNS_connect (cfg); diff --git a/src/social/gnunet-social.c b/src/social/gnunet-social.c @@ -283,7 +283,7 @@ exit_fail () static void host_left (void *cls) { - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "The host has left the place.\n"); exit_success (); } @@ -309,7 +309,7 @@ host_leave () static void guest_left (void *cls) { - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Guest has left the place.\n"); } @@ -518,7 +518,7 @@ look_var (void *cls, uint32_t value_size, uint32_t full_value_size) { - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Received var: %s\n%.*s\n", name, value_size, (const char *) value); } @@ -558,7 +558,7 @@ slicer_recv_method (void *cls, const char *method_name) { method_received = method_name; - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Received method for message ID %" PRIu64 ":\n" "%s (flags: %x)\n", message_id, method_name, ntohl (meth->flags)); @@ -584,7 +584,7 @@ slicer_recv_modifier (void *cls, uint16_t full_value_size) { #if 0 - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Received modifier for message ID %" PRIu64 ":\n" "%c%s: %.*s (size: %u)\n", message_id, oper, name, value_size, (const char *) value, value_size); @@ -608,7 +608,7 @@ slicer_recv_data (void *cls, uint16_t data_size) { #if 0 - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Received data for message ID %" PRIu64 ":\n" "%.*s\n", message_id, data_size, (const char *) data); @@ -631,7 +631,7 @@ slicer_recv_eom (void *cls, uint8_t is_cancelled) { printf(".\n"); - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Received end of message ID %" PRIu64 ", cancelled: %u\n", message_id, is_cancelled); @@ -668,7 +668,7 @@ guest_recv_entry_decision (void *cls, int is_admitted, const struct GNUNET_PSYC_Message *entry_msg) { - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Guest received entry decision %d\n", is_admitted); @@ -683,7 +683,7 @@ guest_recv_entry_decision (void *cls, GNUNET_PSYC_message_parse (pmsg, &method_name, env, &data, &data_size); GNUNET_free (pmsg); - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "%s\n%.*s\n", method_name, data_size, (const char *) data); } @@ -704,7 +704,7 @@ guest_recv_local_enter (void *cls, int result, uint64_t max_message_id) { char *pub_str = GNUNET_CRYPTO_eddsa_public_key_to_string (pub_key); - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Guest entered local place: %s, max_message_id: %" PRIu64 "\n", pub_str, max_message_id); GNUNET_free (pub_str); @@ -802,7 +802,7 @@ host_answer_door (void *cls, char * nym_str = GNUNET_CRYPTO_ecdsa_public_key_to_string (nym_key); - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Entry request: %s\n", nym_str); GNUNET_free (nym_str); @@ -840,7 +840,7 @@ host_farewell (void *cls, char * nym_str = GNUNET_CRYPTO_ecdsa_public_key_to_string (nym_key); - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Farewell: %s\n", nym_str); GNUNET_free (nym_str); } @@ -856,7 +856,7 @@ host_entered (void *cls, int result, { place_pub_key = *pub_key; char *pub_str = GNUNET_CRYPTO_eddsa_public_key_to_string (pub_key); - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Host entered: %s, max_message_id: %" PRIu64 "\n", pub_str, max_message_id); GNUNET_free (pub_str); diff --git a/src/social/social_api.c b/src/social/social_api.c @@ -183,6 +183,7 @@ struct GNUNET_SOCIAL_Place */ struct GNUNET_PSYC_Slicer *slicer; + // FIXME: do we need is_disconnecing like on the psyc and multicast APIs? /** * Function called after disconnected from the service. */ @@ -371,6 +372,68 @@ struct ZoneAddNymHandle }; +/*** CLEANUP / DISCONNECT ***/ + + +static void +host_cleanup (struct GNUNET_SOCIAL_Host *hst) +{ + if (NULL != hst->slicer) + { + GNUNET_PSYC_slicer_destroy (hst->slicer); + hst->slicer = NULL; + } + GNUNET_free (hst); +} + + +static void +guest_cleanup (struct GNUNET_SOCIAL_Guest *gst) +{ + GNUNET_free (gst); +} + + +static void +place_cleanup (struct GNUNET_SOCIAL_Place *plc) +{ + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "cleaning up place %p\n", + plc); + if (NULL != plc->tmit) + { + GNUNET_PSYC_transmit_destroy (plc->tmit); + plc->tmit = NULL; + } + if (NULL != plc->connect_env) + { + GNUNET_MQ_discard (plc->connect_env); + plc->connect_env = NULL; + } + if (NULL != plc->mq) + { + GNUNET_MQ_destroy (plc->mq); + plc->mq = NULL; + } + if (NULL != plc->disconnect_cb) + { + plc->disconnect_cb (plc->disconnect_cls); + plc->disconnect_cb = NULL; + } + + (GNUNET_YES == plc->is_host) + ? host_cleanup ((struct GNUNET_SOCIAL_Host *) plc) + : guest_cleanup ((struct GNUNET_SOCIAL_Guest *) plc); +} + + +static void +place_disconnect (struct GNUNET_SOCIAL_Place *plc) +{ + place_cleanup (plc); +} + + /*** NYM ***/ static struct GNUNET_SOCIAL_Nym * @@ -428,7 +491,7 @@ host_recv_notice_place_leave_method (void *cls, struct GNUNET_SOCIAL_Nym *nym = nym_get_or_create (&msg->slave_pub_key); - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Host received method for message ID %" PRIu64 " from nym %s: %s\n", message_id, GNUNET_h2s (&nym->pub_key_hash), method_name); @@ -436,7 +499,7 @@ host_recv_notice_place_leave_method (void *cls, hst->notice_place_leave_env = GNUNET_PSYC_env_create (); char *str = GNUNET_CRYPTO_ecdsa_public_key_to_string (&hst->notice_place_leave_nym->pub_key); - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "_notice_place_leave: got method from nym %s (%s).\n", GNUNET_h2s (&hst->notice_place_leave_nym->pub_key_hash), str); GNUNET_free (str); @@ -458,7 +521,7 @@ host_recv_notice_place_leave_modifier (void *cls, if (NULL == hst->notice_place_leave_env) return; - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Host received modifier for _notice_place_leave message with ID %" PRIu64 ":\n" "%c%s: %.*s\n", message_id, oper, name, value_size, (const char *) value); @@ -485,7 +548,7 @@ host_recv_notice_place_leave_eom (void *cls, return; char *str = GNUNET_CRYPTO_ecdsa_public_key_to_string (&hst->notice_place_leave_nym->pub_key); - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "_notice_place_leave: got EOM from nym %s (%s).\n", GNUNET_h2s (&hst->notice_place_leave_nym->pub_key_hash), str); GNUNET_free (str); @@ -1015,100 +1078,24 @@ handle_app_place_end (void *cls, } -/*** CLEANUP / DISCONNECT ***/ - - -static void -host_cleanup (struct GNUNET_SOCIAL_Host *hst) -{ - if (NULL != hst->slicer) - { - GNUNET_PSYC_slicer_destroy (hst->slicer); - hst->slicer = NULL; - } - GNUNET_free (hst); -} - - +/** + * Handler for a #GNUNET_MESSAGE_TYPE_SOCIAL_PLACE_LEAVE_ACK message received + * from the social service. + * + * @param cls the place of type `struct GNUNET_SOCIAL_Place` + * @param msg the message received from the service + */ static void -guest_cleanup (struct GNUNET_SOCIAL_Guest *gst) +handle_place_leave_ack (void *cls, + const struct GNUNET_MessageHeader *msg) { - GNUNET_free (gst); -} - + struct GNUNET_SOCIAL_Place *plc = cls; -static void -place_cleanup (struct GNUNET_SOCIAL_Place *plc) -{ - struct GNUNET_HashCode place_pub_hash; - GNUNET_CRYPTO_hash (&plc->pub_key, sizeof (plc->pub_key), &place_pub_hash); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "%s place cleanup: %s\n", - GNUNET_YES == plc->is_host ? "host" : "guest", - GNUNET_h2s (&place_pub_hash)); - - if (NULL != plc->tmit) - { - GNUNET_PSYC_transmit_destroy (plc->tmit); - plc->tmit = NULL; - } - if (NULL != plc->connect_env) - { - GNUNET_MQ_discard (plc->connect_env); - plc->connect_env = NULL; - } - if (NULL != plc->mq) - { - GNUNET_MQ_destroy (plc->mq); - plc->mq = NULL; - } - if (NULL != plc->disconnect_cb) - { - plc->disconnect_cb (plc->disconnect_cls); - plc->disconnect_cb = NULL; - } - - (GNUNET_YES == plc->is_host) - ? host_cleanup ((struct GNUNET_SOCIAL_Host *) plc) - : guest_cleanup ((struct GNUNET_SOCIAL_Guest *) plc); -} - - -void -place_disconnect (struct GNUNET_SOCIAL_Place *plc, - GNUNET_ContinuationCallback cb, - void *cls) -{ - plc->disconnect_cb = cb; - plc->disconnect_cls = cls; - - if (NULL != plc->mq) - { - struct GNUNET_MQ_Envelope *env = GNUNET_MQ_get_last_envelope (plc->mq); - if (NULL != env) - { - GNUNET_MQ_notify_sent (env, (GNUNET_SCHEDULER_TaskCallback) place_cleanup, plc); - } - else - { - place_cleanup (plc); - } - } - else - { - place_cleanup (plc); - } -} - - -void -place_leave (struct GNUNET_SOCIAL_Place *plc) -{ - struct GNUNET_MessageHeader *msg; - struct GNUNET_MQ_Envelope * - env = GNUNET_MQ_msg (msg, GNUNET_MESSAGE_TYPE_SOCIAL_PLACE_LEAVE); - - GNUNET_MQ_send (plc->mq, env); + "%s left place %p\n", + plc->is_host ? "host" : "guest", + plc); + place_disconnect (plc); } @@ -1168,6 +1155,10 @@ host_connect (struct GNUNET_SOCIAL_Host *hst) GNUNET_MESSAGE_TYPE_SOCIAL_HOST_ENTER_ACK, struct HostEnterAck, hst), + GNUNET_MQ_hd_fixed_size (place_leave_ack, + GNUNET_MESSAGE_TYPE_SOCIAL_PLACE_LEAVE_ACK, + struct GNUNET_MessageHeader, + plc), GNUNET_MQ_hd_var_size (host_enter_request, GNUNET_MESSAGE_TYPE_PSYC_JOIN_REQUEST, struct GNUNET_PSYC_JoinRequestMessage, @@ -1516,6 +1507,9 @@ GNUNET_SOCIAL_host_announce (struct GNUNET_SOCIAL_Host *hst, void *notify_data_cls, enum GNUNET_SOCIAL_AnnounceFlags flags) { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "PSYC_transmit_message for host, method: %s\n", + method_name); if (GNUNET_OK == GNUNET_PSYC_transmit_message (hst->plc.tmit, method_name, env, NULL, notify_data, notify_data_cls, flags)) @@ -1580,7 +1574,11 @@ GNUNET_SOCIAL_host_disconnect (struct GNUNET_SOCIAL_Host *hst, GNUNET_ContinuationCallback disconnect_cb, void *cls) { - place_disconnect (&hst->plc, disconnect_cb, cls); + struct GNUNET_SOCIAL_Place *plc = &hst->plc; + + plc->disconnect_cb = disconnect_cb; + plc->disconnect_cls = cls; + place_disconnect (plc); } @@ -1607,10 +1605,15 @@ GNUNET_SOCIAL_host_leave (struct GNUNET_SOCIAL_Host *hst, GNUNET_ContinuationCallback disconnect_cb, void *cls) { + struct GNUNET_MQ_Envelope *envelope; + GNUNET_SOCIAL_host_announce (hst, "_notice_place_closing", env, NULL, NULL, GNUNET_SOCIAL_ANNOUNCE_NONE); - place_leave (&hst->plc); - GNUNET_SOCIAL_host_disconnect (hst, disconnect_cb, cls); + hst->plc.disconnect_cb = disconnect_cb; + hst->plc.disconnect_cls = cls; + envelope = GNUNET_MQ_msg_header (GNUNET_MESSAGE_TYPE_SOCIAL_PLACE_LEAVE); + GNUNET_MQ_send (hst->plc.mq, + envelope); } @@ -1670,6 +1673,10 @@ guest_connect (struct GNUNET_SOCIAL_Guest *gst) GNUNET_MESSAGE_TYPE_SOCIAL_GUEST_ENTER_ACK, struct GNUNET_PSYC_CountersResultMessage, gst), + GNUNET_MQ_hd_fixed_size (place_leave_ack, + GNUNET_MESSAGE_TYPE_SOCIAL_PLACE_LEAVE_ACK, + struct GNUNET_MessageHeader, + plc), GNUNET_MQ_hd_var_size (guest_enter_decision, GNUNET_MESSAGE_TYPE_PSYC_JOIN_DECISION, struct GNUNET_PSYC_JoinDecisionMessage, @@ -1896,6 +1903,64 @@ GNUNET_SOCIAL_guest_enter_by_name (const struct GNUNET_SOCIAL_App *app, } +struct ReconnectContext +{ + struct GNUNET_SOCIAL_Guest *guest; + int *result; + int64_t *max_message_id; + GNUNET_SOCIAL_GuestEnterCallback enter_cb; + void *enter_cls; +}; + + +static void +guest_enter_reconnect_cb (void *cls, + int result, + const struct GNUNET_CRYPTO_EddsaPublicKey *place_pub_key, + uint64_t max_message_id) +{ + struct ReconnectContext *reconnect_ctx = cls; + + GNUNET_assert (NULL != reconnect_ctx); + reconnect_ctx->result = GNUNET_new (int); + *(reconnect_ctx->result) = result; + reconnect_ctx->max_message_id = GNUNET_new (int64_t); + *(reconnect_ctx->max_message_id) = max_message_id; +} + + +static void +guest_entry_dcsn_reconnect_cb (void *cls, + int is_admitted, + const struct GNUNET_PSYC_Message *entry_resp) +{ + struct ReconnectContext *reconnect_ctx = cls; + struct GNUNET_SOCIAL_Guest *gst = reconnect_ctx->guest; + + GNUNET_assert (NULL != reconnect_ctx); + GNUNET_assert (NULL != reconnect_ctx->result); + GNUNET_assert (NULL != reconnect_ctx->max_message_id); + if (GNUNET_YES != is_admitted) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Guest was rejected after calling " + "GNUNET_SOCIAL_guest_enter_reconnect ()\n"); + } + else if (NULL != reconnect_ctx->enter_cb) + { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "guest reconnected!\n"); + reconnect_ctx->enter_cb (reconnect_ctx->enter_cls, + *(reconnect_ctx->result), + &gst->plc.pub_key, + *(reconnect_ctx->max_message_id)); + } + GNUNET_free (reconnect_ctx->result); + GNUNET_free (reconnect_ctx->max_message_id); + GNUNET_free (reconnect_ctx); +} + + /** * Reconnect to an already entered place as guest. * @@ -1906,8 +1971,8 @@ GNUNET_SOCIAL_guest_enter_by_name (const struct GNUNET_SOCIAL_App *app, * Flags for the entry. * @param slicer * Slicer to use for processing incoming requests from guests. - * @param local_enter_cb - * Called upon connection established to the social service. + * @param enter_cb + * Called upon re-entering is complete. * @param entry_decision_cb * Called upon receiving entry decision. * @@ -1917,11 +1982,12 @@ struct GNUNET_SOCIAL_Guest * GNUNET_SOCIAL_guest_enter_reconnect (struct GNUNET_SOCIAL_GuestConnection *gconn, enum GNUNET_PSYC_SlaveJoinFlags flags, struct GNUNET_PSYC_Slicer *slicer, - GNUNET_SOCIAL_GuestEnterCallback local_enter_cb, + GNUNET_SOCIAL_GuestEnterCallback enter_cb, void *cls) { struct GNUNET_SOCIAL_Guest *gst = GNUNET_malloc (sizeof (*gst)); struct GNUNET_SOCIAL_Place *plc = &gst->plc; + struct ReconnectContext *reconnect_ctx; uint16_t app_id_size = strlen (gconn->app->id) + 1; struct GuestEnterRequest *greq; @@ -1940,10 +2006,15 @@ GNUNET_SOCIAL_guest_enter_reconnect (struct GNUNET_SOCIAL_GuestConnection *gconn plc->pub_key = gconn->plc_msg.place_pub_key; plc->ego_pub_key = gconn->plc_msg.ego_pub_key; - plc->op = GNUNET_OP_create (); + reconnect_ctx = GNUNET_new (struct ReconnectContext); + reconnect_ctx->guest = gst; + reconnect_ctx->enter_cb = enter_cb; + reconnect_ctx->enter_cls = cls; - gst->enter_cb = local_enter_cb; - gst->cb_cls = cls; + plc->op = GNUNET_OP_create (); + gst->enter_cb = &guest_enter_reconnect_cb; + gst->entry_dcsn_cb = &guest_entry_dcsn_reconnect_cb; + gst->cb_cls = reconnect_ctx; guest_connect (gst); return gst; @@ -2028,7 +2099,11 @@ GNUNET_SOCIAL_guest_disconnect (struct GNUNET_SOCIAL_Guest *gst, GNUNET_ContinuationCallback disconnect_cb, void *cls) { - place_disconnect (&gst->plc, disconnect_cb, cls); + struct GNUNET_SOCIAL_Place *plc = &gst->plc; + + plc->disconnect_cb = disconnect_cb; + plc->disconnect_cls = cls; + place_disconnect (plc); } @@ -2054,10 +2129,15 @@ GNUNET_SOCIAL_guest_leave (struct GNUNET_SOCIAL_Guest *gst, GNUNET_ContinuationCallback disconnect_cb, void *cls) { + struct GNUNET_MQ_Envelope *envelope; + GNUNET_SOCIAL_guest_talk (gst, "_notice_place_leave", env, NULL, NULL, GNUNET_SOCIAL_TALK_NONE); - place_leave (&gst->plc); - GNUNET_SOCIAL_guest_disconnect (gst, disconnect_cb, cls); + gst->plc.disconnect_cb = disconnect_cb; + gst->plc.disconnect_cls = cls; + envelope = GNUNET_MQ_msg_header (GNUNET_MESSAGE_TYPE_SOCIAL_PLACE_LEAVE); + GNUNET_MQ_send (gst->plc.mq, + envelope); } diff --git a/src/social/test_social.c b/src/social/test_social.c @@ -129,22 +129,22 @@ enum TEST_HOST_ANSWER_DOOR_REFUSE = 4, TEST_GUEST_RECV_ENTRY_DCSN_REFUSE = 5, TEST_HOST_ANSWER_DOOR_ADMIT = 6, - TEST_GUEST_RECV_ENTRY_DCSN_ADMIT = 9, - TEST_HOST_ANNOUNCE = 10, - TEST_HOST_ANNOUNCE_END = 11, - TEST_GUEST_TALK = 12, - TEST_HOST_ANNOUNCE2 = 13, - TEST_HOST_ANNOUNCE2_END = 14, - TEST_GUEST_HISTORY_REPLAY = 15, - TEST_GUEST_HISTORY_REPLAY_LATEST = 16, - TEST_GUEST_LOOK_AT = 17, - TEST_GUEST_LOOK_FOR = 18, - TEST_GUEST_LEAVE = 18, - TEST_ZONE_ADD_PLACE = 20, - TEST_GUEST_ENTER_BY_NAME = 21, - TEST_RECONNECT = 22, - TEST_GUEST_LEAVE2 = 23, - TEST_HOST_LEAVE = 24, + TEST_GUEST_RECV_ENTRY_DCSN_ADMIT = 7, + TEST_HOST_ANNOUNCE = 8, + TEST_HOST_ANNOUNCE_END = 9, + TEST_GUEST_TALK = 10, + TEST_HOST_ANNOUNCE2 = 11, + TEST_HOST_ANNOUNCE2_END = 12, + TEST_GUEST_HISTORY_REPLAY = 13, + TEST_GUEST_HISTORY_REPLAY_LATEST = 14, + TEST_GUEST_LOOK_AT = 15, + TEST_GUEST_LOOK_FOR = 16, + TEST_GUEST_LEAVE = 17, + TEST_ZONE_ADD_PLACE = 18, + TEST_GUEST_ENTER_BY_NAME = 19, + TEST_RECONNECT = 20, + TEST_GUEST_LEAVE2 = 21, + TEST_HOST_LEAVE = 22, } test; @@ -180,10 +180,28 @@ host_announce2 (); /** - * Clean up all resources used. + * Terminate the test case (failure). + * + * @param cls NULL + */ +static void +end_badly (void *cls) +{ + end_badly_task = NULL; + GNUNET_SCHEDULER_shutdown (); + res = 2; + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Test FAILED.\n"); +} + + +/** + * Terminate the test case (failure). + * + * @param cls NULL */ static void -cleanup () +end_shutdown (void *cls) { if (NULL != id) { @@ -202,7 +220,11 @@ cleanup () GNUNET_PSYC_slicer_destroy (host_slicer); host_slicer = NULL; } - + if (NULL != end_badly_task) + { + GNUNET_SCHEDULER_cancel (end_badly_task); + end_badly_task = NULL; + } if (NULL != gst) { GNUNET_SOCIAL_guest_leave (gst, NULL, NULL, NULL); @@ -216,21 +238,6 @@ cleanup () hst_plc = NULL; } GNUNET_SOCIAL_app_disconnect (app, NULL, NULL); - GNUNET_SCHEDULER_shutdown (); -} - - -/** - * Terminate the test case (failure). - * - * @param cls NULL - */ -static void -end_badly (void *cls) -{ - res = 1; - cleanup (); - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Test FAILED.\n"); } @@ -242,9 +249,9 @@ end_badly (void *cls) static void end_normally (void *cls) { + GNUNET_SCHEDULER_shutdown (); res = 0; - cleanup (); - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Test PASSED.\n"); + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Test PASSED.\n"); } @@ -254,7 +261,7 @@ end_normally (void *cls) static void end () { - GNUNET_log (GNUNET_ERROR_TYPE_INFO, + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Test #%u: Ending tests.\n", test); if (end_badly_task != NULL) @@ -271,7 +278,7 @@ transmit_resume (void *cls) { struct TransmitClosure *tmit = cls; - GNUNET_log (GNUNET_ERROR_TYPE_INFO, + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Test #%u: Transmission resumed.\n", test); if (NULL != tmit->host_ann) GNUNET_SOCIAL_host_announce_resume (tmit->host_ann); @@ -296,7 +303,7 @@ notify_data (void *cls, uint16_t *data_size, void *data) } uint16_t size = strlen (tmit->data[tmit->n]); - GNUNET_log (GNUNET_ERROR_TYPE_INFO, + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Test #%u: Transmit notify data: %u bytes available, " "processing fragment %u/%u (size %u).\n", test, *data_size, tmit->n + 1, tmit->data_count, size); @@ -309,7 +316,7 @@ notify_data (void *cls, uint16_t *data_size, void *data) if (GNUNET_YES != tmit->paused && 0 < tmit->data_delay[tmit->n]) { - GNUNET_log (GNUNET_ERROR_TYPE_INFO, + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Test #%u: Transmission paused.\n", test); tmit->paused = GNUNET_YES; GNUNET_SCHEDULER_add_delayed ( @@ -331,7 +338,7 @@ notify_data (void *cls, uint16_t *data_size, void *data) static void host_left () { - GNUNET_log (GNUNET_ERROR_TYPE_INFO, + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Test #%u: The host has left the place.\n", test); end (); } @@ -352,7 +359,7 @@ host_farewell2 (void *cls, const struct GNUNET_SOCIAL_Nym *nym, struct GNUNET_PSYC_Environment *env) { - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Nym left the place again.\n"); GNUNET_SCHEDULER_add_now (&schedule_host_leave, NULL); } @@ -365,13 +372,14 @@ host_reconnected (void *cls, int result, { place_pub_key = *home_pub_key; GNUNET_CRYPTO_hash (&place_pub_key, sizeof (place_pub_key), &place_pub_hash); - GNUNET_log (GNUNET_ERROR_TYPE_INFO, + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Test #%u: Host reconnected to place %s\n", test, GNUNET_h2s (&place_pub_hash)); is_host_reconnected = GNUNET_YES; if (GNUNET_YES == is_guest_reconnected) { + GNUNET_assert (NULL != gst); GNUNET_SCHEDULER_add_now (&schedule_guest_leave, NULL); } } @@ -382,7 +390,7 @@ guest_reconnected (void *cls, int result, const struct GNUNET_CRYPTO_EddsaPublicKey *place_pub_key, uint64_t max_message_id) { - GNUNET_log (GNUNET_ERROR_TYPE_INFO, + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Test #%u: Guest reconnected to place: %d\n", test, result); GNUNET_assert (0 <= result); @@ -390,6 +398,7 @@ guest_reconnected (void *cls, int result, is_guest_reconnected = GNUNET_YES; if (GNUNET_YES == is_host_reconnected) { + GNUNET_assert (NULL != gst); GNUNET_SCHEDULER_add_now (&schedule_guest_leave, NULL); } } @@ -398,7 +407,7 @@ guest_reconnected (void *cls, int result, static void app_connected (void *cls) { - GNUNET_log (GNUNET_ERROR_TYPE_INFO, + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Test #%u: App connected: %p\n", test, cls); } @@ -411,21 +420,28 @@ app_recv_host (void *cls, enum GNUNET_SOCIAL_AppPlaceState place_state) { struct GNUNET_HashCode host_pub_hash; - GNUNET_CRYPTO_hash (host_pub_key, sizeof (*host_pub_key), &host_pub_hash); - GNUNET_log (GNUNET_ERROR_TYPE_INFO, + GNUNET_CRYPTO_hash (host_pub_key, + sizeof (*host_pub_key), + &host_pub_hash); + + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Test #%u: Got app host place notification: %s\n", - test, GNUNET_h2s (&host_pub_hash)); + test, + GNUNET_h2s (&host_pub_hash)); if (test == TEST_RECONNECT) { if (0 == memcmp (&place_pub_key, host_pub_key, sizeof (*host_pub_key))) { - GNUNET_log (GNUNET_ERROR_TYPE_INFO, + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Test #%u: Reconnecting to host place: %s\n", test, GNUNET_h2s (&host_pub_hash)); - hst = GNUNET_SOCIAL_host_enter_reconnect (hconn, host_slicer, host_reconnected, - host_answer_door, host_farewell2, NULL); + hst = GNUNET_SOCIAL_host_enter_reconnect (hconn, host_slicer, + &host_reconnected, + &host_answer_door, + &host_farewell2, + NULL); } } } @@ -439,21 +455,30 @@ app_recv_guest (void *cls, enum GNUNET_SOCIAL_AppPlaceState place_state) { struct GNUNET_HashCode guest_pub_hash; - GNUNET_CRYPTO_hash (guest_pub_key, sizeof (*guest_pub_key), &guest_pub_hash); - GNUNET_log (GNUNET_ERROR_TYPE_INFO, + GNUNET_CRYPTO_hash (guest_pub_key, + sizeof (*guest_pub_key), + &guest_pub_hash); + + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Test #%u: Got app guest place notification: %s\n", test, GNUNET_h2s (&guest_pub_hash)); if (test == TEST_RECONNECT) { - if (0 == memcmp (&place_pub_key, guest_pub_key, sizeof (*guest_pub_key))) + if (0 == memcmp (&place_pub_key, + guest_pub_key, + sizeof (*guest_pub_key))) { - GNUNET_log (GNUNET_ERROR_TYPE_INFO, + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Test #%u: Reconnecting to guest place: %s\n", test, GNUNET_h2s (&guest_pub_hash)); - gst = GNUNET_SOCIAL_guest_enter_reconnect (gconn, GNUNET_PSYC_SLAVE_JOIN_NONE, - guest_slicer, guest_reconnected, NULL); + gst = GNUNET_SOCIAL_guest_enter_reconnect (gconn, + GNUNET_PSYC_SLAVE_JOIN_NONE, + guest_slicer, + &guest_reconnected, + NULL); + GNUNET_assert (NULL != gst); } } } @@ -478,7 +503,7 @@ app_recv_ego (void *cls, const char *name) { char *ego_pub_str = GNUNET_CRYPTO_ecdsa_public_key_to_string (ego_pub_key); - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Test #%u: Got app ego notification: %p %s %s\n", test, ego, name, ego_pub_str); GNUNET_free (ego_pub_str); @@ -487,15 +512,30 @@ app_recv_ego (void *cls, { host_ego = ego; host_pub_key = ego_pub_key; - GNUNET_assert (TEST_IDENTITIES_CREATE == test); - enter_if_ready (); + if (TEST_IDENTITIES_CREATE == test) + { + enter_if_ready (); + } + else + { + GNUNET_assert (TEST_RECONNECT == test); + } } else if (NULL != strstr (name, guest_name)) { guest_ego = ego; guest_pub_key = ego_pub_key; - GNUNET_assert (TEST_IDENTITIES_CREATE == test); - enter_if_ready (); + if (TEST_IDENTITIES_CREATE == test) + { + enter_if_ready (); + } + else + { + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, + "test = %d\n", + test); + GNUNET_assert (TEST_RECONNECT == test); + } } } @@ -504,7 +544,6 @@ static void schedule_reconnect (void *cls) { test = TEST_RECONNECT; - GNUNET_SOCIAL_host_disconnect (hst, NULL, NULL); GNUNET_SOCIAL_guest_disconnect (gst, NULL, NULL); hst = NULL; @@ -512,10 +551,10 @@ schedule_reconnect (void *cls) GNUNET_SOCIAL_app_disconnect (app, NULL, NULL); app = GNUNET_SOCIAL_app_connect (cfg, app_id, - app_recv_ego, - app_recv_host, - app_recv_guest, - app_connected, + &app_recv_ego, + &app_recv_host, + &app_recv_guest, + &app_connected, NULL); } @@ -524,7 +563,7 @@ static void host_recv_zone_add_place_result (void *cls, int64_t result, const void *data, uint16_t data_size) { - GNUNET_log (GNUNET_ERROR_TYPE_INFO, + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Test #%u: Zone add place result: %" PRId64 " (%.*s).\n", test, result, data_size, (const char *) data); GNUNET_assert (GNUNET_YES == result); @@ -538,7 +577,7 @@ static void zone_add_place () { test = TEST_ZONE_ADD_PLACE; - GNUNET_log (GNUNET_ERROR_TYPE_INFO, + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Test #%u: Adding place to zone.\n", test); GNUNET_SOCIAL_zone_add_place (app, host_ego, "home", "let.me*in!", @@ -557,7 +596,7 @@ host_farewell (void *cls, nym_key = GNUNET_SOCIAL_nym_get_pub_key (nym); char *str = GNUNET_CRYPTO_ecdsa_public_key_to_string (nym_key); - GNUNET_log (GNUNET_ERROR_TYPE_INFO, + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Test #%u: Farewell: nym %s (%s) has left the place.\n", test, GNUNET_h2s (GNUNET_SOCIAL_nym_get_pub_key_hash (nym)), str); GNUNET_free (str); @@ -578,13 +617,13 @@ host_farewell (void *cls, static void guest_left (void *cls) { - GNUNET_log (GNUNET_ERROR_TYPE_INFO, + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Test #%u: The guest has left the place.\n", test); } static void -guest_leave() +guest_leave () { if (test < TEST_RECONNECT) test = TEST_GUEST_LEAVE; @@ -615,11 +654,11 @@ guest_look_for_result (void *cls, uint16_t data_size) { struct ResultClosure *rcls = cls; - GNUNET_log (GNUNET_ERROR_TYPE_INFO, + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Test #%u: guest_look_for_result: %" PRId64 "\n", test, result_code); GNUNET_assert (GNUNET_OK == result_code); - GNUNET_assert (3 == rcls->n); + GNUNET_assert (6 == rcls->n); GNUNET_free (rcls); GNUNET_SCHEDULER_add_now (&schedule_guest_leave, NULL); } @@ -635,7 +674,7 @@ guest_look_for_var (void *cls, { struct ResultClosure *rcls = cls; rcls->n++; - GNUNET_log (GNUNET_ERROR_TYPE_INFO, + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Test #%u: guest_look_for_var: %s\n%.*s\n", test, name, value_size, (const char *) value); } @@ -656,7 +695,7 @@ guest_look_at_result (void *cls, int64_t result_code, { struct ResultClosure *rcls = cls; - GNUNET_log (GNUNET_ERROR_TYPE_INFO, + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Test #%u: guest_look_at_result: %" PRId64 "\n", test, result_code); GNUNET_assert (GNUNET_OK == result_code); @@ -677,7 +716,7 @@ guest_look_at_var (void *cls, struct ResultClosure *rcls = cls; rcls->n++; - GNUNET_log (GNUNET_ERROR_TYPE_INFO, + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Test #%u: guest_look_at_var: %s\n%.*s\n", test ,name, value_size, (const char *) value); } @@ -696,7 +735,7 @@ static void guest_recv_history_replay_latest_result (void *cls, int64_t result, const void *data, uint16_t data_size) { - GNUNET_log (GNUNET_ERROR_TYPE_INFO, + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Test #%u: Guest received latest history replay result " "(%" PRIu32 " messages, %" PRId64 " fragments):\n" "%.*s\n", @@ -725,7 +764,7 @@ static void guest_recv_history_replay_result (void *cls, int64_t result, const void *data, uint16_t data_size) { - GNUNET_log (GNUNET_ERROR_TYPE_INFO, + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Test #%u: Guest received history replay result: %" PRId64 "\n" "%.*s\n", test, result, data_size, (const char *) data); @@ -756,7 +795,7 @@ guest_recv_method (void *cls, uint64_t message_id, const char *method_name) { - GNUNET_log (GNUNET_ERROR_TYPE_INFO, + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Test #%u: Guest received method for message ID %" PRIu64 ":\n" "%s (flags: %x)\n", test, message_id, method_name, ntohl (meth->flags)); @@ -775,7 +814,7 @@ guest_recv_modifier (void *cls, uint16_t value_size, uint16_t full_value_size) { - GNUNET_log (GNUNET_ERROR_TYPE_INFO, + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Test #%u: Guest received modifier for message ID %" PRIu64 ":\n" "%c%s: %.*s (size: %u)\n", test, message_id, oper, name, value_size, (const char *) value, value_size); @@ -793,7 +832,7 @@ guest_recv_mod_foo_bar (void *cls, uint16_t value_size, uint16_t full_value_size) { - GNUNET_log (GNUNET_ERROR_TYPE_INFO, + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Test #%u: Guest received modifier matching _foo_bar for message ID %" PRIu64 ":\n" "%c%s: %.*s (size: %u)\n", test, message_id, oper, name, value_size, (const char *) value, value_size); @@ -811,7 +850,7 @@ guest_recv_data (void *cls, const void *data, uint16_t data_size) { - GNUNET_log (GNUNET_ERROR_TYPE_INFO, + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Test #%u: Guest received data for message ID %" PRIu64 ":\n" "%.*s\n", test, message_id, data_size, (const char *) data); @@ -826,7 +865,7 @@ guest_recv_eom (void *cls, uint64_t message_id, uint8_t is_cancelled) { - GNUNET_log (GNUNET_ERROR_TYPE_INFO, + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Test #%u: Guest received end of message ID %" PRIu64 ", cancelled: %u\n", test, message_id, is_cancelled); @@ -868,7 +907,7 @@ host_recv_method (void *cls, uint64_t message_id, const char *method_name) { - GNUNET_log (GNUNET_ERROR_TYPE_INFO, + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Test #%u: Host received method for message ID %" PRIu64 ":\n" "%s\n", test, message_id, method_name); @@ -887,7 +926,7 @@ host_recv_modifier (void *cls, uint16_t value_size, uint16_t full_value_size) { - GNUNET_log (GNUNET_ERROR_TYPE_INFO, + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Test #%u: Host received modifier for message ID %" PRIu64 ":\n" "%c%s: %.*s\n", test, message_id, oper, name, value_size, (const char *) value); @@ -902,7 +941,7 @@ host_recv_data (void *cls, const void *data, uint16_t data_size) { - GNUNET_log (GNUNET_ERROR_TYPE_INFO, + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Test #%u: Host received data for message ID %" PRIu64 ":\n" "%.*s\n", test, message_id, data_size, (const char *) data); @@ -916,7 +955,7 @@ host_recv_eom (void *cls, uint64_t message_id, uint8_t is_cancelled) { - GNUNET_log (GNUNET_ERROR_TYPE_INFO, + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Test #%u: Host received end of message ID %" PRIu64 ", cancelled: %u\n", test, message_id, is_cancelled); @@ -981,7 +1020,7 @@ host_announce () { test = TEST_HOST_ANNOUNCE; - GNUNET_log (GNUNET_ERROR_TYPE_INFO, + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Test #%u: Host announcement.\n", test); tmit = (struct TransmitClosure) {}; @@ -1015,7 +1054,7 @@ host_announce2 () test = TEST_HOST_ANNOUNCE2; - GNUNET_log (GNUNET_ERROR_TYPE_INFO, + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Test #%u: Host announcement 2.\n", test); tmit = (struct TransmitClosure) {}; @@ -1025,7 +1064,7 @@ host_announce2 () GNUNET_PSYC_env_add (tmit.env, GNUNET_PSYC_OP_ASSIGN, "_foo2_bar", DATA2ARG ("FOO BAR")); GNUNET_PSYC_env_add (tmit.env, GNUNET_PSYC_OP_ASSIGN, - "_foo2_bar", DATA2ARG ("FOO BAR BAZ")); + "_foo2_bar_baz", DATA2ARG ("FOO BAR BAZ")); tmit.data[0] = "AAA BBB CCC "; tmit.data[1] = "ABC DEF GHI JKL.\n"; tmit.data[2] = "TESTING ONE TWO THREE.\n"; @@ -1043,7 +1082,7 @@ guest_recv_entry_decision (void *cls, int is_admitted, const struct GNUNET_PSYC_Message *entry_msg) { - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Test #%u: Guest received entry decision (try %u): %d.\n", test, join_req_count, is_admitted); @@ -1068,7 +1107,8 @@ guest_recv_entry_decision (void *cls, { case TEST_GUEST_RECV_ENTRY_DCSN_REFUSE: GNUNET_assert (GNUNET_NO == is_admitted); - guest_enter (); + test = TEST_HOST_ANSWER_DOOR_ADMIT; + GNUNET_SOCIAL_guest_disconnect (gst, &guest_enter, NULL); break; case TEST_GUEST_RECV_ENTRY_DCSN_ADMIT: @@ -1097,7 +1137,7 @@ host_answer_door (void *cls, { join_req_count++; - GNUNET_log (GNUNET_ERROR_TYPE_INFO, + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Test #%u: Host received entry request from guest (try %u).\n", (uint8_t) test, join_req_count); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, @@ -1118,7 +1158,7 @@ host_answer_door (void *cls, // fall through case TEST_GUEST_ENTER_BY_NAME: - join_resp = GNUNET_PSYC_message_create ("_notice_place_admit", env, + join_resp = GNUNET_PSYC_message_create ("_notice_place_admit", env, DATA2ARG ("Welcome, nym!")); GNUNET_SOCIAL_host_entry_decision (hst, nym, GNUNET_YES, join_resp); break; @@ -1135,18 +1175,18 @@ guest_recv_local_enter (void *cls, int result, const struct GNUNET_CRYPTO_EddsaPublicKey *place_pub_key, uint64_t max_message_id) { - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, - "Test #%u: Guest entered to local place: %d\n", + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, + "Test #%u: Guest entered local place: %d\n", test, result); - GNUNET_assert (0 <= result); + GNUNET_assert (GNUNET_OK == result); } static void guest_enter () { - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, - "Test #%u: Entering to place as guest.\n", test); + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, + "Test #%u: Entering place as guest.\n", test); struct GuestEnterMessage *emsg = &guest_enter_msg; @@ -1177,8 +1217,8 @@ static void guest_enter_by_name () { test = TEST_GUEST_ENTER_BY_NAME; - GNUNET_log (GNUNET_ERROR_TYPE_INFO, - "Test #%u: Entering to place by name as guest.\n", test); + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, + "Test #%u: Entering place by name as guest.\n", test); struct GuestEnterMessage *emsg = &guest_enter_msg; @@ -1222,7 +1262,7 @@ guest_init () guest_recv_data, guest_recv_eom, NULL); GNUNET_PSYC_slicer_modifier_add (guest_slicer, "_foo_bar", guest_recv_mod_foo_bar, &mod_foo_bar_rcls); - test = TEST_HOST_ANSWER_DOOR_ADMIT; + test = TEST_HOST_ANSWER_DOOR_REFUSE; GNUNET_SOCIAL_zone_add_nym (app, guest_ego, "host", host_pub_key, GNUNET_TIME_relative_to_absolute (GNUNET_TIME_UNIT_MINUTES), @@ -1270,8 +1310,8 @@ host_entered (void *cls, int result, { place_pub_key = *home_pub_key; GNUNET_CRYPTO_hash (&place_pub_key, sizeof (place_pub_key), &place_pub_hash); - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, - "Test #%u: Host entered to place %s\n", + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, + "Test #%u: Host entered place %s\n", test, GNUNET_h2s (&place_pub_hash)); guest_enter (); } @@ -1285,8 +1325,8 @@ host_enter () host_recv_method, host_recv_modifier, host_recv_data, host_recv_eom, NULL); - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, - "Test #%u: Entering to place as host.\n", test); + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, + "Test #%u: Entering place as host.\n", test); test = TEST_HOST_ENTER; hst = GNUNET_SOCIAL_host_enter (app, host_ego, GNUNET_PSYC_CHANNEL_PRIVATE, @@ -1306,6 +1346,8 @@ start_app_if_ready () { return; } + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, + "starting app...\n"); app = GNUNET_SOCIAL_app_connect (cfg, app_id, app_recv_ego, @@ -1324,17 +1366,17 @@ identity_ego_cb (void *cls, struct GNUNET_IDENTITY_Ego *ego, { if (ego == identity_host_ego) { - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Host ego deleted\n"); } else if (ego == identity_guest_ego) { - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Guest ego deleted\n"); } else if (0 == strcmp (name, host_name)) { - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Created ego %s\n", name); identity_host_ego = ego; @@ -1342,7 +1384,7 @@ identity_ego_cb (void *cls, struct GNUNET_IDENTITY_Ego *ego, } else if (0 == strcmp (name, guest_name)) { - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, "Created guest ego %s\n", name); identity_guest_ego = ego; @@ -1370,9 +1412,11 @@ run (void *cls, #endif { cfg = c; + res = 1; end_badly_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT, &end_badly, NULL); - + GNUNET_SCHEDULER_add_shutdown (&end_shutdown, + NULL); GNUNET_CRYPTO_get_peer_identity (cfg, &this_peer); id = GNUNET_IDENTITY_connect (cfg, &identity_ego_cb, NULL); diff --git a/src/social/test_social.conf b/src/social/test_social.conf @@ -0,0 +1,19 @@ +@INLINE@ ../../contrib/no_forcestart.conf + +[PATHS] +GNUNET_TEST_HOME = /tmp/gnunet-test-social/ + +[social] +FORCESTART = YES + +[transport] +PLUGINS = tcp + +[nat] +DISABLEV6 = YES +ENABLE_UPNP = NO +BEHIND_NAT = NO +ALLOW_NAT = NO +INTERNAL_ADDRESS = 127.0.0.1 +EXTERNAL_ADDRESS = 127.0.0.1 + diff --git a/src/statistics/gnunet-service-statistics.c b/src/statistics/gnunet-service-statistics.c @@ -998,7 +998,9 @@ client_disconnect_cb (void *cls, * * @param cls NULL * @param message the message found on disk - * @return #GNUNET_OK on success, #GNUNET_SYSERR to stop further processing + * @return #GNUNET_OK on success, + * #GNUNET_NO to stop further processing (no error) + * #GNUNET_SYSERR to stop further processing with error */ static int inject_message (void *cls, diff --git a/src/testbed/Makefile.am b/src/testbed/Makefile.am @@ -45,7 +45,7 @@ gnunet_service_testbed_SOURCES = \ gnunet-service-testbed_oc.c \ gnunet-service-testbed_cpustatus.c \ gnunet-service-testbed_meminfo.c gnunet-service-testbed_meminfo.h \ - gnunet-service-testbed_barriers.c \ + gnunet-service-testbed_barriers.c gnunet-service-testbed_barriers.h \ gnunet-service-testbed_connectionpool.c gnunet-service-testbed_connectionpool.h gnunet_service_testbed_LDADD = $(XLIB) \ $(top_builddir)/src/util/libgnunetutil.la \ diff --git a/src/testbed/gnunet-helper-testbed.c b/src/testbed/gnunet-helper-testbed.c @@ -292,8 +292,9 @@ child_death_task (void *cls) * * @param cls identification of the client * @param message the actual message - * - * @return #GNUNET_OK on success, #GNUNET_SYSERR to stop further processing + * @return #GNUNET_OK on success, + * #GNUNET_NO to stop further processing (no error) + * #GNUNET_SYSERR to stop further processing with error */ static int tokenizer_cb (void *cls, @@ -359,7 +360,7 @@ tokenizer_cb (void *cls, cfg = GNUNET_CONFIGURATION_create (); if (GNUNET_OK != GNUNET_CONFIGURATION_deserialize (cfg, - config, + config, ul_config_size, NULL)) { diff --git a/src/transport/Makefile.am b/src/transport/Makefile.am @@ -295,7 +295,7 @@ noinst_LTLIBRARIES = \ libgnunet_plugin_transport_template.la libgnunet_plugin_transport_tcp_la_SOURCES = \ - plugin_transport_tcp.c + plugin_transport_tcp.c libgnunet_plugin_transport_tcp_la_LIBADD = \ $(top_builddir)/src/hello/libgnunethello.la \ $(top_builddir)/src/statistics/libgnunetstatistics.la \ @@ -1330,7 +1330,6 @@ test_transport_api_monitor_peers_peer2.conf\ test_transport_api_monitor_validation_peer1.conf\ test_transport_api_monitor_validation_peer2.conf\ test_transport_defaults.conf\ -test_transport_startonly.conf\ test_transport_api_disconnect_tcp_peer1.conf\ test_transport_api_disconnect_tcp_peer2.conf\ test_transport_api_timeout_http_peer1.conf\ @@ -1350,4 +1349,8 @@ test_transport_api_http_reverse_peer2.conf \ perf_tcp_peer1.conf \ perf_tcp_peer2.conf \ test_transport_api_slow_ats_peer1.conf \ -test_transport_api_slow_ats_peer2.conf +test_transport_api_slow_ats_peer2.conf \ + tcp_connection_legacy.c \ + tcp_server_mst_legacy.c \ + tcp_server_legacy.c \ + tcp_service_legacy.c diff --git a/src/transport/gnunet-helper-transport-wlan-dummy.c b/src/transport/gnunet-helper-transport-wlan-dummy.c @@ -121,6 +121,9 @@ send_mac_to_plugin (char *buffer, struct GNUNET_TRANSPORT_WLAN_MacAddress *mac) * * @param cls the 'struct SendBuffer' to copy the converted message to * @param hdr inbound message from the FIFO + * @return #GNUNET_OK on success, + * #GNUNET_NO to stop further processing (no error) + * #GNUNET_SYSERR to stop further processing with error */ static int stdin_send (void *cls, @@ -167,6 +170,9 @@ stdin_send (void *cls, * * @param cls the 'struct SendBuffer' to copy to * @param hdr the message we received to copy to the buffer + * @return #GNUNET_OK on success, + * #GNUNET_NO to stop further processing (no error) + * #GNUNET_SYSERR to stop further processing with error */ static int file_in_send (void *cls, diff --git a/src/transport/plugin_transport_http_server.c b/src/transport/plugin_transport_http_server.c @@ -1651,7 +1651,7 @@ server_send_callback (void *cls, * * @param cls current session as closure * @param message the message to be forwarded to transport service - * @return #GNUNET_OK + * @return #GNUNET_OK (all OK) */ static int server_receive_mst_cb (void *cls, diff --git a/src/util/client.c b/src/util/client.c @@ -261,14 +261,27 @@ transmit_ready (void *cls) pos = (const char *) cstate->msg; len = ntohs (cstate->msg->size); GNUNET_assert (cstate->msg_off < len); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "client: message of type %u trying to send with socket %p (MQ: %p\n", + ntohs(cstate->msg->type), + cstate->sock, + cstate->mq); + RETRY: ret = GNUNET_NETWORK_socket_send (cstate->sock, &pos[cstate->msg_off], len - cstate->msg_off); if (-1 == ret) { - if (EINTR == errno) + GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + "client: error during sending message of type %u\n", + ntohs(cstate->msg->type)); + if (EINTR == errno){ + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "client: retrying message of type %u\n", + ntohs(cstate->msg->type)); goto RETRY; + } GNUNET_MQ_inject_error (cstate->mq, GNUNET_MQ_ERROR_WRITE); return; @@ -277,6 +290,9 @@ transmit_ready (void *cls) cstate->msg_off += ret; if (cstate->msg_off < len) { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "client: rescheduling message of type %u\n", + ntohs(cstate->msg->type)); cstate->send_task = GNUNET_SCHEDULER_add_write_net (GNUNET_TIME_UNIT_FOREVER_REL, cstate->sock, @@ -286,6 +302,9 @@ transmit_ready (void *cls) GNUNET_MQ_impl_send_in_flight (cstate->mq); return; } + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "client: sending message of type %u successful\n", + ntohs(cstate->msg->type)); cstate->msg = NULL; GNUNET_MQ_impl_send_continue (cstate->mq); } @@ -297,7 +316,9 @@ transmit_ready (void *cls) * * @param cls the `struct ClientState` * @param msg message we received. - * @return #GNUNET_OK on success, #GNUNET_SYSERR to stop further processing + * @return #GNUNET_OK on success, + * #GNUNET_NO to stop further processing due to disconnect (no error) + * #GNUNET_SYSERR to stop further processing due to error */ static int recv_message (void *cls, @@ -306,7 +327,7 @@ recv_message (void *cls, struct ClientState *cstate = cls; if (GNUNET_YES == cstate->in_destroy) - return GNUNET_SYSERR; + return GNUNET_NO; LOG (GNUNET_ERROR_TYPE_DEBUG, "Received message of type %u and size %u from %s\n", ntohs (msg->type), @@ -315,7 +336,7 @@ recv_message (void *cls, GNUNET_MQ_inject_message (cstate->mq, msg); if (GNUNET_YES == cstate->in_destroy) - return GNUNET_SYSERR; + return GNUNET_NO; return GNUNET_OK; } @@ -371,8 +392,12 @@ connection_client_destroy_impl (struct GNUNET_MQ_Handle *mq, GNUNET_SCHEDULER_cancel (cstate->recv_task); if (NULL != cstate->retry_task) GNUNET_SCHEDULER_cancel (cstate->retry_task); - if (NULL != cstate->sock) + if (NULL != cstate->sock){ + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "client: destroying socket: %p\n", + cstate->sock); GNUNET_NETWORK_socket_close (cstate->sock); + } cancel_aps (cstate); GNUNET_free (cstate->service_name); GNUNET_free_non_null (cstate->hostname); @@ -794,8 +819,12 @@ connection_client_send_impl (struct GNUNET_MQ_Handle *mq, GNUNET_assert (NULL == cstate->send_task); cstate->msg = msg; cstate->msg_off = 0; - if (NULL == cstate->sock) + if (NULL == cstate->sock){ + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "client: message of type %u waiting for socket\n", + ntohs(msg->type)); return; /* still waiting for connection */ + } cstate->send_task = GNUNET_SCHEDULER_add_write_net (GNUNET_TIME_UNIT_FOREVER_REL, cstate->sock, diff --git a/src/util/mq.c b/src/util/mq.c @@ -357,6 +357,12 @@ GNUNET_MQ_send (struct GNUNET_MQ_Handle *mq, } GNUNET_assert (NULL == mq->envelope_head); mq->current_envelope = ev; + + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "mq: sending message of type %u, queue empty (MQ: %p)\n", + ntohs(ev->mh->type), + mq); + mq->send_impl (mq, ev->mh, mq->impl_state); @@ -452,6 +458,11 @@ impl_send_continue (void *cls) GNUNET_CONTAINER_DLL_remove (mq->envelope_head, mq->envelope_tail, mq->current_envelope); + + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "mq: sending message of type %u from queue\n", + ntohs(mq->current_envelope->mh->type)); + mq->send_impl (mq, mq->current_envelope->mh, mq->impl_state); @@ -840,6 +851,9 @@ GNUNET_MQ_destroy (struct GNUNET_MQ_Handle *mq) ev); GNUNET_assert (0 < mq->queue_length); mq->queue_length--; + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "MQ destroy drops message of type %u\n", + ntohs (ev->mh->type)); GNUNET_MQ_discard (ev); } if (NULL != mq->current_envelope) @@ -847,6 +861,9 @@ GNUNET_MQ_destroy (struct GNUNET_MQ_Handle *mq) /* we can only discard envelopes that * are not queued! */ mq->current_envelope->parent_queue = NULL; + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "MQ destroy drops current message of type %u\n", + ntohs (mq->current_envelope->mh->type)); GNUNET_MQ_discard (mq->current_envelope); mq->current_envelope = NULL; GNUNET_assert (0 < mq->queue_length); @@ -928,6 +945,11 @@ GNUNET_MQ_send_cancel (struct GNUNET_MQ_Envelope *ev) GNUNET_CONTAINER_DLL_remove (mq->envelope_head, mq->envelope_tail, mq->current_envelope); + + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "mq: sending canceled message of type %u queue\n", + ntohs(ev->mh->type)); + mq->send_impl (mq, mq->current_envelope->mh, mq->impl_state); diff --git a/src/util/mst.c b/src/util/mst.c @@ -1,6 +1,6 @@ /* This file is part of GNUnet. - Copyright (C) 2010, 2016 GNUnet e.V. + Copyright (C) 2010, 2016, 2017 GNUnet e.V. GNUnet is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published @@ -126,6 +126,7 @@ GNUNET_MST_from_buffer (struct GNUNET_MessageStreamTokenizer *mst, int need_align; unsigned long offset; int ret; + int cbret; GNUNET_assert (mst->off <= mst->pos); GNUNET_assert (mst->pos <= mst->curr_buf); @@ -229,9 +230,17 @@ do_align: if (one_shot == GNUNET_YES) one_shot = GNUNET_SYSERR; mst->off += want; - if (GNUNET_SYSERR == mst->cb (mst->cb_cls, - hdr)) + if (GNUNET_OK != + (cbret = mst->cb (mst->cb_cls, + hdr))) + { + if (GNUNET_SYSERR == cbret) + GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + "Failure processing message of type %u and size %u\n", + ntohs (hdr->type), + ntohs (hdr->size)); return GNUNET_SYSERR; + } if (mst->off == mst->pos) { /* reset to beginning of buffer, it's free right now! */ @@ -271,9 +280,17 @@ do_align: } if (one_shot == GNUNET_YES) one_shot = GNUNET_SYSERR; - if (GNUNET_SYSERR == mst->cb (mst->cb_cls, - hdr)) + if (GNUNET_OK != + (cbret = mst->cb (mst->cb_cls, + hdr))) + { + if (GNUNET_SYSERR == cbret) + GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + "Failure processing message of type %u and size %u\n", + ntohs (hdr->type), + ntohs (hdr->size)); return GNUNET_SYSERR; + } buf += want; size -= want; } diff --git a/src/util/network.c b/src/util/network.c @@ -1223,7 +1223,7 @@ GNUNET_NETWORK_fdset_copy (struct GNUNET_NETWORK_FDSet *to, * @return POSIX file descriptor */ int -GNUNET_NETWORK_get_fd (struct GNUNET_NETWORK_Handle *desc) +GNUNET_NETWORK_get_fd (const struct GNUNET_NETWORK_Handle *desc) { return desc->fd; } @@ -1236,7 +1236,7 @@ GNUNET_NETWORK_get_fd (struct GNUNET_NETWORK_Handle *desc) * @return sockaddr */ struct sockaddr* -GNUNET_NETWORK_get_addr (struct GNUNET_NETWORK_Handle *desc) +GNUNET_NETWORK_get_addr (const struct GNUNET_NETWORK_Handle *desc) { return desc->addr; } @@ -1249,7 +1249,7 @@ GNUNET_NETWORK_get_addr (struct GNUNET_NETWORK_Handle *desc) * @return socklen_t for sockaddr */ socklen_t -GNUNET_NETWORK_get_addrlen (struct GNUNET_NETWORK_Handle *desc) +GNUNET_NETWORK_get_addrlen (const struct GNUNET_NETWORK_Handle *desc) { return desc->addrlen; } diff --git a/src/util/program.c b/src/util/program.c @@ -69,6 +69,16 @@ struct CommandContext /** + * task run when the scheduler shuts down + */ +static void +shutdown_task (void *cls) +{ + GNUNET_SPEEDUP_stop_ (); +} + + +/** * Initial task called by the scheduler for each * program. Runs the program-specific main task. */ @@ -78,6 +88,7 @@ program_main (void *cls) struct CommandContext *cc = cls; GNUNET_SPEEDUP_start_(cc->cfg); + GNUNET_SCHEDULER_add_shutdown (&shutdown_task, NULL); GNUNET_RESOLVER_connect (cc->cfg); cc->task (cc->task_cls, cc->args, cc->cfgfile, cc->cfg); } @@ -306,7 +317,6 @@ GNUNET_PROGRAM_run2 (int argc, char *const *argv, const char *binaryName, } ret = GNUNET_OK; cleanup: - GNUNET_SPEEDUP_stop_ (); GNUNET_CONFIGURATION_destroy (cfg); GNUNET_free_non_null (cc.cfgfile); GNUNET_free (cfg_fn); diff --git a/src/util/scheduler.c b/src/util/scheduler.c @@ -89,12 +89,6 @@ struct GNUNET_SCHEDULER_Handle * @deprecated */ struct GNUNET_NETWORK_FDSet *ws; - - /** - * Driver we used for the event loop. - */ - const struct GNUNET_SCHEDULER_Driver *driver; - }; @@ -124,36 +118,40 @@ struct GNUNET_SCHEDULER_Task void *callback_cls; /** - * Handle to the scheduler's state. + * Information about which FDs are ready for this task (and why). */ - const struct GNUNET_SCHEDULER_Handle *sh; + struct GNUNET_SCHEDULER_FdInfo *fds; /** - * Set of file descriptors this task is waiting - * for for reading. Once ready, this is updated - * to reflect the set of file descriptors ready - * for operation. + * Storage location used for @e fds if we want to avoid + * a separate malloc() call in the common case that this + * task is only about a single FD. */ - struct GNUNET_NETWORK_FDSet *read_set; + struct GNUNET_SCHEDULER_FdInfo fdx; /** - * Set of file descriptors this task is waiting for for writing. - * Once ready, this is updated to reflect the set of file - * descriptors ready for operation. + * Size of the @e fds array. */ - struct GNUNET_NETWORK_FDSet *write_set; + unsigned int fds_len; /** - * Information about which FDs are ready for this task (and why). + * if this task is related to multiple FDs this array contains + * all FdInfo structs that were marked as ready by calling + * #GNUNET_SCHEDULER_task_ready */ - const struct GNUNET_SCHEDULER_FdInfo *fds; + struct GNUNET_SCHEDULER_FdInfo *ready_fds; /** - * Storage location used for @e fds if we want to avoid - * a separate malloc() call in the common case that this - * task is only about a single FD. + * Size of the @e ready_fds array */ - struct GNUNET_SCHEDULER_FdInfo fdx; + unsigned int ready_fds_len; + + /** + * Do we own the network and file handles referenced by the FdInfo + * structs in the fds array. This will only be GNUNET_YES if the + * task was created by the #GNUNET_SCHEDULER_add_select function. + */ + int own_handles; /** * Absolute timeout value for the task, or @@ -169,11 +167,6 @@ struct GNUNET_SCHEDULER_Task #endif /** - * Size of the @e fds array. - */ - unsigned int fds_len; - - /** * Why is the task ready? Set after task is added to ready queue. * Initially set to zero. All reasons that have already been * satisfied (i.e. read or write ready) will be set over time. @@ -224,11 +217,72 @@ struct GNUNET_SCHEDULER_Task int num_backtrace_strings; #endif +}; + + +/** + * A struct representing an event the select driver is waiting for + */ +struct Scheduled +{ + struct Scheduled *prev; + struct Scheduled *next; + + /** + * the task, the event is related to + */ + struct GNUNET_SCHEDULER_Task *task; + + /** + * information about the network socket / file descriptor where + * the event is expected to occur + */ + struct GNUNET_SCHEDULER_FdInfo *fdi; + + /** + * the event types (multiple event types can be ORed) the select + * driver is expected to wait for + */ + enum GNUNET_SCHEDULER_EventType et; }; /** + * Driver context used by GNUNET_SCHEDULER_run + */ +struct DriverContext +{ + /** + * the head of a DLL containing information about the events the + * select driver is waiting for + */ + struct Scheduled *scheduled_head; + + /** + * the tail of a DLL containing information about the events the + * select driver is waiting for + */ + struct Scheduled *scheduled_tail; + + /** + * the time until the select driver will wake up again (after + * calling select) + */ + struct GNUNET_TIME_Relative timeout; +}; + + +/** + * The driver used for the event loop. Will be handed over to + * the scheduler in #GNUNET_SCHEDULER_run_from_driver(), peristed + * there in this variable for later use in functions like + * #GNUNET_SCHEDULER_add_select(), #add_without_sets() and + * #GNUNET_SCHEDULER_cancel(). + */ +static const struct GNUNET_SCHEDULER_Driver *scheduler_driver; + +/** * Head of list of tasks waiting for an event. */ static struct GNUNET_SCHEDULER_Task *pending_head; @@ -330,6 +384,11 @@ static struct GNUNET_SCHEDULER_TaskContext tc; */ static void *scheduler_select_cls; +/** + * Scheduler handle used for the driver functions + */ +static struct GNUNET_SCHEDULER_Handle sh; + /** * Sets the select function to use in the scheduler (scheduler_select). @@ -364,115 +423,44 @@ check_priority (enum GNUNET_SCHEDULER_Priority p) /** - * Update all sets and timeout for select. - * - * @param rs read-set, set to all FDs we would like to read (updated) - * @param ws write-set, set to all FDs we would like to write (updated) - * @param timeout next timeout (updated) + * chooses the nearest timeout from all pending tasks, to be used + * to tell the driver the next wakeup time (using its set_wakeup + * callback) */ -static void -update_sets (struct GNUNET_NETWORK_FDSet *rs, - struct GNUNET_NETWORK_FDSet *ws, - struct GNUNET_TIME_Relative *timeout) +struct GNUNET_TIME_Absolute +get_timeout () { struct GNUNET_SCHEDULER_Task *pos; struct GNUNET_TIME_Absolute now; - struct GNUNET_TIME_Relative to; + struct GNUNET_TIME_Absolute timeout; - now = GNUNET_TIME_absolute_get (); pos = pending_timeout_head; + now = GNUNET_TIME_absolute_get (); + timeout = GNUNET_TIME_UNIT_FOREVER_ABS; if (NULL != pos) { - to = GNUNET_TIME_absolute_get_difference (now, pos->timeout); - if (timeout->rel_value_us > to.rel_value_us) - *timeout = to; if (0 != pos->reason) - *timeout = GNUNET_TIME_UNIT_ZERO; + { + timeout = now; + } + else + { + timeout = pos->timeout; + } } for (pos = pending_head; NULL != pos; pos = pos->next) { - if (pos->timeout.abs_value_us != GNUNET_TIME_UNIT_FOREVER_ABS.abs_value_us) + if (0 != pos->reason) { - to = GNUNET_TIME_absolute_get_difference (now, pos->timeout); - if (timeout->rel_value_us > to.rel_value_us) - *timeout = to; + timeout = now; + } + else if ((pos->timeout.abs_value_us != GNUNET_TIME_UNIT_FOREVER_ABS.abs_value_us) && + (timeout.abs_value_us > pos->timeout.abs_value_us)) + { + timeout = pos->timeout; } - if (-1 != pos->read_fd) - GNUNET_NETWORK_fdset_set_native (rs, pos->read_fd); - if (-1 != pos->write_fd) - GNUNET_NETWORK_fdset_set_native (ws, pos->write_fd); - if (NULL != pos->read_set) - GNUNET_NETWORK_fdset_add (rs, pos->read_set); - if (NULL != pos->write_set) - GNUNET_NETWORK_fdset_add (ws, pos->write_set); - if (0 != pos->reason) - *timeout = GNUNET_TIME_UNIT_ZERO; - } -} - - -/** - * Check if the ready set overlaps with the set we want to have ready. - * If so, update the want set (set all FDs that are ready). If not, - * return #GNUNET_NO. - * - * @param ready set that is ready - * @param want set that we want to be ready - * @return #GNUNET_YES if there was some overlap - */ -static int -set_overlaps (const struct GNUNET_NETWORK_FDSet *ready, - struct GNUNET_NETWORK_FDSet *want) -{ - if ((NULL == want) || (NULL == ready)) - return GNUNET_NO; - if (GNUNET_NETWORK_fdset_overlap (ready, want)) - { - /* copy all over (yes, there maybe unrelated bits, - * but this should not hurt well-written clients) */ - GNUNET_NETWORK_fdset_copy (want, ready); - return GNUNET_YES; } - return GNUNET_NO; -} - - -/** - * Check if the given task is eligible to run now. - * Also set the reason why it is eligible. - * - * @param task task to check if it is ready - * @param now the current time - * @param rs set of FDs ready for reading - * @param ws set of FDs ready for writing - * @return #GNUNET_YES if we can run it, #GNUNET_NO if not. - */ -static int -is_ready (struct GNUNET_SCHEDULER_Task *task, - struct GNUNET_TIME_Absolute now, - const struct GNUNET_NETWORK_FDSet *rs, - const struct GNUNET_NETWORK_FDSet *ws) -{ - enum GNUNET_SCHEDULER_Reason reason; - - reason = task->reason; - if (now.abs_value_us >= task->timeout.abs_value_us) - reason |= GNUNET_SCHEDULER_REASON_TIMEOUT; - if ((0 == (reason & GNUNET_SCHEDULER_REASON_READ_READY)) && - (((task->read_fd != -1) && - (GNUNET_YES == GNUNET_NETWORK_fdset_test_native (rs, task->read_fd))) || - (set_overlaps (rs, task->read_set)))) - reason |= GNUNET_SCHEDULER_REASON_READ_READY; - if ((0 == (reason & GNUNET_SCHEDULER_REASON_WRITE_READY)) && - (((task->write_fd != -1) && - (GNUNET_YES == GNUNET_NETWORK_fdset_test_native (ws, task->write_fd))) - || (set_overlaps (ws, task->write_set)))) - reason |= GNUNET_SCHEDULER_REASON_WRITE_READY; - if (0 == reason) - return GNUNET_NO; /* not ready */ - reason |= GNUNET_SCHEDULER_REASON_PREREQ_DONE; - task->reason = reason; - return GNUNET_YES; + return timeout; } @@ -495,51 +483,6 @@ queue_ready_task (struct GNUNET_SCHEDULER_Task *task) /** - * Check which tasks are ready and move them - * to the respective ready queue. - * - * @param rs FDs ready for reading - * @param ws FDs ready for writing - */ -static void -check_ready (const struct GNUNET_NETWORK_FDSet *rs, - const struct GNUNET_NETWORK_FDSet *ws) -{ - struct GNUNET_SCHEDULER_Task *pos; - struct GNUNET_SCHEDULER_Task *next; - struct GNUNET_TIME_Absolute now; - - now = GNUNET_TIME_absolute_get (); - while (NULL != (pos = pending_timeout_head)) - { - if (now.abs_value_us >= pos->timeout.abs_value_us) - pos->reason |= GNUNET_SCHEDULER_REASON_TIMEOUT; - if (0 == pos->reason) - break; - GNUNET_CONTAINER_DLL_remove (pending_timeout_head, - pending_timeout_tail, - pos); - if (pending_timeout_last == pos) - pending_timeout_last = NULL; - queue_ready_task (pos); - } - pos = pending_head; - while (NULL != pos) - { - next = pos->next; - if (GNUNET_YES == is_ready (pos, now, rs, ws)) - { - GNUNET_CONTAINER_DLL_remove (pending_head, - pending_tail, - pos); - queue_ready_task (pos); - } - pos = next; - } -} - - -/** * Request the shutdown of a scheduler. Marks all tasks * awaiting shutdown as ready. Note that tasks * scheduled with #GNUNET_SCHEDULER_add_shutdown() AFTER this call @@ -562,25 +505,6 @@ GNUNET_SCHEDULER_shutdown () /** - * Destroy a task (release associated resources) - * - * @param t task to destroy - */ -static void -destroy_task (struct GNUNET_SCHEDULER_Task *t) -{ - if (NULL != t->read_set) - GNUNET_NETWORK_fdset_destroy (t->read_set); - if (NULL != t->write_set) - GNUNET_NETWORK_fdset_destroy (t->write_set); -#if EXECINFO - GNUNET_free (t->backtrace_strings); -#endif - GNUNET_free (t); -} - - -/** * Output stack trace of task @a t. * * @param t task to dump stack trace of @@ -592,88 +516,59 @@ dump_backtrace (struct GNUNET_SCHEDULER_Task *t) unsigned int i; for (i = 0; i < t->num_backtrace_strings; i++) - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Task %p trace %u: %s\n", - t, - i, - t->backtrace_strings[i]); + LOG (GNUNET_ERROR_TYPE_WARNING, + "Task %p trace %u: %s\n", + t, + i, + t->backtrace_strings[i]); #endif } /** - * Run at least one task in the highest-priority queue that is not - * empty. Keep running tasks until we are either no longer running - * "URGENT" tasks or until we have at least one "pending" task (which - * may become ready, hence we should select on it). Naturally, if - * there are no more ready tasks, we also return. + * Destroy a task (release associated resources) * - * @param rs FDs ready for reading - * @param ws FDs ready for writing + * @param t task to destroy */ static void -run_ready (struct GNUNET_NETWORK_FDSet *rs, - struct GNUNET_NETWORK_FDSet *ws) +destroy_task (struct GNUNET_SCHEDULER_Task *t) { - enum GNUNET_SCHEDULER_Priority p; - struct GNUNET_SCHEDULER_Task *pos; + unsigned int i; - max_priority_added = GNUNET_SCHEDULER_PRIORITY_KEEP; - do + LOG (GNUNET_ERROR_TYPE_DEBUG, + "destroying task %p\n", + t); + + if (GNUNET_YES == t->own_handles) { - if (0 == ready_count) - return; - GNUNET_assert (NULL == ready_head[GNUNET_SCHEDULER_PRIORITY_KEEP]); - /* yes, p>0 is correct, 0 is "KEEP" which should - * always be an empty queue (see assertion)! */ - for (p = GNUNET_SCHEDULER_PRIORITY_COUNT - 1; p > 0; p--) + for (i = 0; i != t->fds_len; ++i) { - pos = ready_head[p]; - if (NULL != pos) - break; - } - GNUNET_assert (NULL != pos); /* ready_count wrong? */ - GNUNET_CONTAINER_DLL_remove (ready_head[p], - ready_tail[p], - pos); - ready_count--; - current_priority = pos->priority; - current_lifeness = pos->lifeness; - active_task = pos; -#if PROFILE_DELAYS - if (GNUNET_TIME_absolute_get_duration (pos->start_time).rel_value_us > - DELAY_THRESHOLD.rel_value_us) - { - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Task %p took %s to be scheduled\n", - pos, - GNUNET_STRINGS_relative_time_to_string (GNUNET_TIME_absolute_get_duration (pos->start_time), - GNUNET_YES)); + const struct GNUNET_NETWORK_Handle *fd = t->fds[i].fd; + const struct GNUNET_DISK_FileHandle *fh = t->fds[i].fh; + if (fd) + { + GNUNET_NETWORK_socket_free_memory_only_ ((struct GNUNET_NETWORK_Handle *) fd); + } + if (fh) + { + // FIXME: on WIN32 this is not enough! A function + // GNUNET_DISK_file_free_memory_only would be nice + GNUNET_free ((void *) fh); + } } -#endif - tc.reason = pos->reason; - tc.read_ready = (NULL == pos->read_set) ? rs : pos->read_set; - if ((-1 != pos->read_fd) && - (0 != (pos->reason & GNUNET_SCHEDULER_REASON_READ_READY))) - GNUNET_NETWORK_fdset_set_native (rs, pos->read_fd); - tc.write_ready = (NULL == pos->write_set) ? ws : pos->write_set; - if ((-1 != pos->write_fd) && - (0 != (pos->reason & GNUNET_SCHEDULER_REASON_WRITE_READY))) - GNUNET_NETWORK_fdset_set_native (ws, pos->write_fd); - if ((0 != (tc.reason & GNUNET_SCHEDULER_REASON_WRITE_READY)) && - (-1 != pos->write_fd) && - (!GNUNET_NETWORK_fdset_test_native (ws, pos->write_fd))) - GNUNET_assert (0); // added to ready in previous select loop! - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Running task: %p\n", - pos); - pos->callback (pos->callback_cls); - dump_backtrace (pos); - active_task = NULL; - destroy_task (pos); - tasks_run++; } - while ((NULL == pending_head) || (p >= max_priority_added)); + if (t->fds_len > 1) + { + GNUNET_array_grow (t->fds, t->fds_len, 0); + } + if (t->ready_fds_len > 0) + { + GNUNET_array_grow (t->ready_fds, t->ready_fds_len, 0); + } +#if EXECINFO + GNUNET_free (t->backtrace_strings); +#endif + GNUNET_free (t); } @@ -700,22 +595,22 @@ sighandler_pipe () #endif -/** - * Wait for a short time. - * Sleeps for @a ms ms (as that should be long enough for virtually all - * modern systems to context switch and allow another process to do - * some 'real' work). - * - * @param ms how many ms to wait - */ -static void -short_wait (unsigned int ms) -{ - struct GNUNET_TIME_Relative timeout; - - timeout = GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MILLISECONDS, ms); - (void) GNUNET_NETWORK_socket_select (NULL, NULL, NULL, timeout); -} +///** +// * Wait for a short time. +// * Sleeps for @a ms ms (as that should be long enough for virtually all +// * modern systems to context switch and allow another process to do +// * some 'real' work). +// * +// * @param ms how many ms to wait +// */ +//static void +//short_wait (unsigned int ms) +//{ +// struct GNUNET_TIME_Relative timeout; +// +// timeout = GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MILLISECONDS, ms); +// (void) GNUNET_NETWORK_socket_select (NULL, NULL, NULL, timeout); +//} /** @@ -737,35 +632,31 @@ sighandler_shutdown () } -/** - * Check if the system is still alive. Trigger shutdown if we - * have tasks, but none of them give us lifeness. - * - * @return #GNUNET_OK to continue the main loop, - * #GNUNET_NO to exit - */ -static int -check_lifeness () +void +shutdown_if_no_lifeness () { struct GNUNET_SCHEDULER_Task *t; if (ready_count > 0) - return GNUNET_OK; + return; for (t = pending_head; NULL != t; t = t->next) - if (t->lifeness == GNUNET_YES) - return GNUNET_OK; + if (GNUNET_YES == t->lifeness) + return; for (t = shutdown_head; NULL != t; t = t->next) - if (t->lifeness == GNUNET_YES) - return GNUNET_OK; + if (GNUNET_YES == t->lifeness) + return; for (t = pending_timeout_head; NULL != t; t = t->next) - if (t->lifeness == GNUNET_YES) - return GNUNET_OK; - if (NULL != shutdown_head) + if (GNUNET_YES == t->lifeness) + return; + /* No lifeness! Cancel all pending tasks the driver knows about and shutdown */ + t = pending_head; + while (NULL != t) { - GNUNET_SCHEDULER_shutdown (); - return GNUNET_OK; + struct GNUNET_SCHEDULER_Task *next = t->next; + GNUNET_SCHEDULER_cancel (t); + t = next; } - return GNUNET_NO; + GNUNET_SCHEDULER_shutdown (); } @@ -787,204 +678,17 @@ void GNUNET_SCHEDULER_run (GNUNET_SCHEDULER_TaskCallback task, void *task_cls) { - GNUNET_SCHEDULER_run_with_optional_signals(GNUNET_YES, task, task_cls); -} - -void -GNUNET_SCHEDULER_run_with_optional_signals (int install_signals, - GNUNET_SCHEDULER_TaskCallback task, - void *task_cls) -{ - struct GNUNET_NETWORK_FDSet *rs; - struct GNUNET_NETWORK_FDSet *ws; - struct GNUNET_TIME_Relative timeout; - int ret; - struct GNUNET_SIGNAL_Context *shc_int; - struct GNUNET_SIGNAL_Context *shc_term; -#if (SIGTERM != GNUNET_TERM_SIG) - struct GNUNET_SIGNAL_Context *shc_gterm; -#endif - -#ifndef MINGW - struct GNUNET_SIGNAL_Context *shc_quit; - struct GNUNET_SIGNAL_Context *shc_hup; - struct GNUNET_SIGNAL_Context *shc_pipe; -#endif - unsigned long long last_tr; - unsigned int busy_wait_warning; - const struct GNUNET_DISK_FileHandle *pr; - char c; - - GNUNET_assert (NULL == active_task); - rs = GNUNET_NETWORK_fdset_create (); - ws = GNUNET_NETWORK_fdset_create (); - GNUNET_assert (NULL == shutdown_pipe_handle); - shutdown_pipe_handle = GNUNET_DISK_pipe (GNUNET_NO, - GNUNET_NO, - GNUNET_NO, - GNUNET_NO); - GNUNET_assert (NULL != shutdown_pipe_handle); - pr = GNUNET_DISK_pipe_handle (shutdown_pipe_handle, - GNUNET_DISK_PIPE_END_READ); - GNUNET_assert (NULL != pr); - my_pid = getpid (); - - if (GNUNET_YES == install_signals) - { - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Registering signal handlers\n"); - shc_int = GNUNET_SIGNAL_handler_install (SIGINT, - &sighandler_shutdown); - shc_term = GNUNET_SIGNAL_handler_install (SIGTERM, - &sighandler_shutdown); -#if (SIGTERM != GNUNET_TERM_SIG) - shc_gterm = GNUNET_SIGNAL_handler_install (GNUNET_TERM_SIG, - &sighandler_shutdown); -#endif -#ifndef MINGW - shc_pipe = GNUNET_SIGNAL_handler_install (SIGPIPE, - &sighandler_pipe); - shc_quit = GNUNET_SIGNAL_handler_install (SIGQUIT, - &sighandler_shutdown); - shc_hup = GNUNET_SIGNAL_handler_install (SIGHUP, - &sighandler_shutdown); -#endif - } - - current_priority = GNUNET_SCHEDULER_PRIORITY_DEFAULT; - current_lifeness = GNUNET_YES; - GNUNET_SCHEDULER_add_with_reason_and_priority (task, - task_cls, - GNUNET_SCHEDULER_REASON_STARTUP, - GNUNET_SCHEDULER_PRIORITY_DEFAULT); - active_task = (void *) (long) -1; /* force passing of sanity check */ - GNUNET_SCHEDULER_add_now_with_lifeness (GNUNET_NO, - &GNUNET_OS_install_parent_control_handler, - NULL); - active_task = NULL; - last_tr = 0; - busy_wait_warning = 0; - while (GNUNET_OK == check_lifeness ()) - { - GNUNET_NETWORK_fdset_zero (rs); - GNUNET_NETWORK_fdset_zero (ws); - timeout = GNUNET_TIME_UNIT_FOREVER_REL; - update_sets (rs, ws, &timeout); - GNUNET_NETWORK_fdset_handle_set (rs, pr); - if (ready_count > 0) - { - /* no blocking, more work already ready! */ - timeout = GNUNET_TIME_UNIT_ZERO; - } - if (NULL == scheduler_select) - ret = GNUNET_NETWORK_socket_select (rs, - ws, - NULL, - timeout); - else - ret = scheduler_select (scheduler_select_cls, - rs, - ws, - NULL, - timeout); - if (ret == GNUNET_SYSERR) - { - if (errno == EINTR) - continue; - - LOG_STRERROR (GNUNET_ERROR_TYPE_ERROR, "select"); -#ifndef MINGW -#if USE_LSOF - char lsof[512]; - - snprintf (lsof, sizeof (lsof), "lsof -p %d", getpid ()); - (void) close (1); - (void) dup2 (2, 1); - if (0 != system (lsof)) - LOG_STRERROR (GNUNET_ERROR_TYPE_WARNING, - "system"); -#endif -#endif -#if DEBUG_FDS - struct GNUNET_SCHEDULER_Task *t; - - for (t = pending_head; NULL != t; t = t->next) - { - if (-1 != t->read_fd) - { - int flags = fcntl (t->read_fd, F_GETFD); - if ((flags == -1) && (errno == EBADF)) - { - LOG (GNUNET_ERROR_TYPE_ERROR, - "Got invalid file descriptor %d!\n", - t->read_fd); - dump_backtrace (t); - } - } - if (-1 != t->write_fd) - { - int flags = fcntl (t->write_fd, F_GETFD); - if ((flags == -1) && (errno == EBADF)) - { - LOG (GNUNET_ERROR_TYPE_ERROR, - "Got invalid file descriptor %d!\n", - t->write_fd); - dump_backtrace (t); - } - } - } -#endif - GNUNET_assert (0); - break; - } - - if ( (0 == ret) && - (0 == timeout.rel_value_us) && - (busy_wait_warning > 16) ) - { - LOG (GNUNET_ERROR_TYPE_WARNING, - "Looks like we're busy waiting...\n"); - short_wait (100); /* mitigate */ - } - check_ready (rs, ws); - run_ready (rs, ws); - if (GNUNET_NETWORK_fdset_handle_isset (rs, pr)) - { - /* consume the signal */ - GNUNET_DISK_file_read (pr, &c, sizeof (c)); - /* mark all active tasks as ready due to shutdown */ - GNUNET_SCHEDULER_shutdown (); - } - if (last_tr == tasks_run) - { - short_wait (1); - busy_wait_warning++; - } - else - { - last_tr = tasks_run; - busy_wait_warning = 0; - } - } - - if (GNUNET_YES == install_signals) - { - GNUNET_SIGNAL_handler_uninstall (shc_int); - GNUNET_SIGNAL_handler_uninstall (shc_term); -#if (SIGTERM != GNUNET_TERM_SIG) - GNUNET_SIGNAL_handler_uninstall (shc_gterm); -#endif -#ifndef MINGW - GNUNET_SIGNAL_handler_uninstall (shc_pipe); - GNUNET_SIGNAL_handler_uninstall (shc_quit); - GNUNET_SIGNAL_handler_uninstall (shc_hup); -#endif - } - - GNUNET_DISK_pipe_close (shutdown_pipe_handle); - shutdown_pipe_handle = NULL; - GNUNET_NETWORK_fdset_destroy (rs); - GNUNET_NETWORK_fdset_destroy (ws); + struct GNUNET_SCHEDULER_Driver *driver; + struct DriverContext context = {.scheduled_head = NULL, + .scheduled_tail = NULL, + .timeout = GNUNET_TIME_UNIT_FOREVER_REL}; + + driver = GNUNET_SCHEDULER_driver_select (); + driver->cls = &context; + + GNUNET_SCHEDULER_run_with_driver (driver, task, task_cls); + + GNUNET_free (driver); } @@ -1014,24 +718,179 @@ GNUNET_SCHEDULER_get_task_context () unsigned int GNUNET_SCHEDULER_get_load (enum GNUNET_SCHEDULER_Priority p) { - struct GNUNET_SCHEDULER_Task *pos; - unsigned int ret; + struct GNUNET_SCHEDULER_Task *pos; + unsigned int ret; + + GNUNET_assert (NULL != active_task); + if (p == GNUNET_SCHEDULER_PRIORITY_COUNT) + return ready_count; + if (p == GNUNET_SCHEDULER_PRIORITY_KEEP) + p = current_priority; + ret = 0; + for (pos = ready_head[check_priority (p)]; NULL != pos; pos = pos->next) + ret++; + return ret; +} + + +void +init_fd_info (struct GNUNET_SCHEDULER_Task *t, + const struct GNUNET_NETWORK_Handle *const *read_nh, + unsigned int read_nh_len, + const struct GNUNET_NETWORK_Handle *const *write_nh, + unsigned int write_nh_len, + const struct GNUNET_DISK_FileHandle *const *read_fh, + unsigned int read_fh_len, + const struct GNUNET_DISK_FileHandle *const *write_fh, + unsigned int write_fh_len) +{ + // FIXME: if we have exactly two network handles / exactly two file handles + // and they are equal, we can make one FdInfo with both + // GNUNET_SCHEDULER_ET_IN and GNUNET_SCHEDULER_ET_OUT set. + struct GNUNET_SCHEDULER_FdInfo *fdi; + + t->fds_len = read_nh_len + write_nh_len + read_fh_len + write_fh_len; + if (1 == t->fds_len) + { + fdi = &t->fdx; + t->fds = fdi; + if (1 == read_nh_len) + { + fdi->fd = *read_nh; + GNUNET_assert (NULL != fdi->fd); + fdi->et = GNUNET_SCHEDULER_ET_IN; + fdi->sock = GNUNET_NETWORK_get_fd (*read_nh); + t->read_fd = fdi->sock; + t->write_fd = -1; + } + else if (1 == write_nh_len) + { + fdi->fd = *write_nh; + GNUNET_assert (NULL != fdi->fd); + fdi->et = GNUNET_SCHEDULER_ET_OUT; + fdi->sock = GNUNET_NETWORK_get_fd (*write_nh); + t->read_fd = -1; + t->write_fd = fdi->sock; + } + else if (1 == read_fh_len) + { + fdi->fh = *read_fh; + GNUNET_assert (NULL != fdi->fh); + fdi->et = GNUNET_SCHEDULER_ET_IN; + fdi->sock = (*read_fh)->fd; // FIXME: does not work under WIN32 + t->read_fd = fdi->sock; + t->write_fd = -1; + } + else + { + fdi->fh = *write_fh; + GNUNET_assert (NULL != fdi->fh); + fdi->et = GNUNET_SCHEDULER_ET_OUT; + fdi->sock = (*write_fh)->fd; // FIXME: does not work under WIN32 + t->read_fd = -1; + t->write_fd = fdi->sock; + } + } + else + { + fdi = GNUNET_new_array (t->fds_len, struct GNUNET_SCHEDULER_FdInfo); + t->fds = fdi; + t->read_fd = -1; + t->write_fd = -1; + unsigned int i; + for (i = 0; i != read_nh_len; ++i) + { + fdi->fd = read_nh[i]; + GNUNET_assert (NULL != fdi->fd); + fdi->et = GNUNET_SCHEDULER_ET_IN; + fdi->sock = GNUNET_NETWORK_get_fd (read_nh[i]); + ++fdi; + } + for (i = 0; i != write_nh_len; ++i) + { + fdi->fd = write_nh[i]; + GNUNET_assert (NULL != fdi->fd); + fdi->et = GNUNET_SCHEDULER_ET_OUT; + fdi->sock = GNUNET_NETWORK_get_fd (write_nh[i]); + ++fdi; + } + for (i = 0; i != read_fh_len; ++i) + { + fdi->fh = read_fh[i]; + GNUNET_assert (NULL != fdi->fh); + fdi->et = GNUNET_SCHEDULER_ET_IN; + fdi->sock = (read_fh[i])->fd; // FIXME: does not work under WIN32 + ++fdi; + } + for (i = 0; i != write_fh_len; ++i) + { + fdi->fh = write_fh[i]; + GNUNET_assert (NULL != fdi->fh); + fdi->et = GNUNET_SCHEDULER_ET_OUT; + fdi->sock = (write_fh[i])->fd; // FIXME: does not work under WIN32 + ++fdi; + } + } +} + + +/** + * calls the given function @a func on each FdInfo related to @a t. + * Optionally updates the event type field in each FdInfo after calling + * @a func. + * + * @param t the task + * @param driver_func the function to call with each FdInfo contained in + * in @a t + * @param if_not_ready only call @a driver_func on FdInfos that are not + * ready + * @param et the event type to be set in each FdInfo after calling + * @a driver_func on it, or -1 if no updating not desired. + */ +void driver_add_multiple (struct GNUNET_SCHEDULER_Task *t, + enum GNUNET_SCHEDULER_EventType et) +{ + struct GNUNET_SCHEDULER_FdInfo *fdi; + int success = GNUNET_YES; + + for (int i = 0; i != t->fds_len; ++i) + { + fdi = &t->fds[i]; + success = scheduler_driver->add (scheduler_driver->cls, t, fdi) && success; + if (et != -1) + { + fdi->et = et; + } + } + if (GNUNET_YES != success) + { + LOG (GNUNET_ERROR_TYPE_ERROR, + "driver could not add task\n"); + } +} + + +void +shutdown_cb (void *cls) +{ + char c; + const struct GNUNET_DISK_FileHandle *pr; - GNUNET_assert (NULL != active_task); - if (p == GNUNET_SCHEDULER_PRIORITY_COUNT) - return ready_count; - if (p == GNUNET_SCHEDULER_PRIORITY_KEEP) - p = current_priority; - ret = 0; - for (pos = ready_head[check_priority (p)]; NULL != pos; pos = pos->next) - ret++; - return ret; + pr = GNUNET_DISK_pipe_handle (shutdown_pipe_handle, + GNUNET_DISK_PIPE_END_READ); + GNUNET_assert (! GNUNET_DISK_handle_invalid (pr)); + /* consume the signal */ + GNUNET_DISK_file_read (pr, &c, sizeof (c)); + /* mark all active tasks as ready due to shutdown */ + GNUNET_SCHEDULER_shutdown (); } /** * Cancel the task with the specified identifier. - * The task must not yet have run. + * The task must not yet have run. Only allowed to be called as long as the + * scheduler is running (#GNUNET_SCHEDULER_run or + * #GNUNET_SCHEDULER_run_with_driver has been called and has not returned yet). * * @param task id of the task to cancel * @return original closure of the task @@ -1040,34 +899,50 @@ void * GNUNET_SCHEDULER_cancel (struct GNUNET_SCHEDULER_Task *task) { enum GNUNET_SCHEDULER_Priority p; + int is_fd_task; void *ret; + LOG (GNUNET_ERROR_TYPE_DEBUG, + "canceling task %p\n", + task); + + /* scheduler must be running */ + GNUNET_assert (NULL != scheduler_driver); GNUNET_assert ( (NULL != active_task) || - (GNUNET_NO == task->lifeness) ); - if (! task->in_ready_list) + (GNUNET_NO == task->lifeness) ); + is_fd_task = (NULL != task->fds); + if (is_fd_task) { - if ( (-1 == task->read_fd) && - (-1 == task->write_fd) && - (NULL == task->read_set) && - (NULL == task->write_set) ) + int del_result = scheduler_driver->del (scheduler_driver->cls, task); + if (GNUNET_OK != del_result) { - if (GNUNET_YES == task->on_shutdown) - GNUNET_CONTAINER_DLL_remove (shutdown_head, - shutdown_tail, - task); - else - GNUNET_CONTAINER_DLL_remove (pending_timeout_head, - pending_timeout_tail, - task); - if (task == pending_timeout_last) - pending_timeout_last = NULL; + LOG (GNUNET_ERROR_TYPE_ERROR, + "driver could not delete task\n"); + GNUNET_assert (0); } - else + } + if (! task->in_ready_list) + { + if (is_fd_task) { GNUNET_CONTAINER_DLL_remove (pending_head, pending_tail, task); } + else if (GNUNET_YES == task->on_shutdown) + { + GNUNET_CONTAINER_DLL_remove (shutdown_head, + shutdown_tail, + task); + } + else + { + GNUNET_CONTAINER_DLL_remove (pending_timeout_head, + pending_timeout_tail, + task); + if (pending_timeout_last == task) + pending_timeout_last = NULL; + } } else { @@ -1078,9 +953,6 @@ GNUNET_SCHEDULER_cancel (struct GNUNET_SCHEDULER_Task *task) ready_count--; } ret = task->callback_cls; - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Canceling task %p\n", - task); destroy_task (task); return ret; } @@ -1101,7 +973,7 @@ init_backtrace (struct GNUNET_SCHEDULER_Task *t) = backtrace (backtrace_array, MAX_TRACE_DEPTH); t->backtrace_strings = backtrace_symbols (backtrace_array, - t->num_backtrace_strings); + t->num_backtrace_strings); dump_backtrace (t); #endif } @@ -1218,7 +1090,7 @@ GNUNET_SCHEDULER_add_at_with_priority (struct GNUNET_TIME_Absolute at, pending_timeout_last = t; LOG (GNUNET_ERROR_TYPE_DEBUG, - "Adding task: %p\n", + "Adding task %p\n", t); init_backtrace (t); return t; @@ -1238,8 +1110,8 @@ GNUNET_SCHEDULER_add_at_with_priority (struct GNUNET_TIME_Absolute at, */ struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_delayed_with_priority (struct GNUNET_TIME_Relative delay, - enum GNUNET_SCHEDULER_Priority priority, - GNUNET_SCHEDULER_TaskCallback task, + enum GNUNET_SCHEDULER_Priority priority, + GNUNET_SCHEDULER_TaskCallback task, void *task_cls) { return GNUNET_SCHEDULER_add_at_with_priority (GNUNET_TIME_relative_to_absolute (delay), @@ -1307,12 +1179,12 @@ GNUNET_SCHEDULER_add_at (struct GNUNET_TIME_Absolute at, struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_delayed (struct GNUNET_TIME_Relative delay, GNUNET_SCHEDULER_TaskCallback task, - void *task_cls) + void *task_cls) { return GNUNET_SCHEDULER_add_delayed_with_priority (delay, - GNUNET_SCHEDULER_PRIORITY_DEFAULT, - task, - task_cls); + GNUNET_SCHEDULER_PRIORITY_DEFAULT, + task, + task_cls); } @@ -1333,11 +1205,11 @@ GNUNET_SCHEDULER_add_delayed (struct GNUNET_TIME_Relative delay, */ struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_now (GNUNET_SCHEDULER_TaskCallback task, - void *task_cls) + void *task_cls) { return GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_ZERO, - task, - task_cls); + task, + task_cls); } @@ -1353,7 +1225,7 @@ GNUNET_SCHEDULER_add_now (GNUNET_SCHEDULER_TaskCallback task, */ struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_shutdown (GNUNET_SCHEDULER_TaskCallback task, - void *task_cls) + void *task_cls) { struct GNUNET_SCHEDULER_Task *t; @@ -1370,12 +1242,12 @@ GNUNET_SCHEDULER_add_shutdown (GNUNET_SCHEDULER_TaskCallback task, t->timeout = GNUNET_TIME_UNIT_FOREVER_ABS; t->priority = GNUNET_SCHEDULER_PRIORITY_SHUTDOWN; t->on_shutdown = GNUNET_YES; - t->lifeness = GNUNET_YES; + t->lifeness = GNUNET_NO; GNUNET_CONTAINER_DLL_insert (shutdown_head, - shutdown_tail, - t); + shutdown_tail, + t); LOG (GNUNET_ERROR_TYPE_DEBUG, - "Adding task: %p\n", + "Adding shutdown task %p\n", t); init_backtrace (t); return t; @@ -1409,6 +1281,33 @@ GNUNET_SCHEDULER_add_now_with_lifeness (int lifeness, } +#if DEBUG_FDS +/** + * check a raw file descriptor and abort if it is bad (for debugging purposes) + * + * @param t the task related to the file descriptor + * @param raw_fd the raw file descriptor to check + */ +void +check_fd (struct GNUNET_SCHEDULER_Task *t, int raw_fd) +{ + if (-1 != raw_fd) + { + int flags = fcntl (raw_fd, F_GETFD); + + if ((flags == -1) && (errno == EBADF)) + { + LOG (GNUNET_ERROR_TYPE_ERROR, + "Got invalid file descriptor %d!\n", + raw_fd); + init_backtrace (t); + GNUNET_assert (0); + } + } +} +#endif + + /** * Schedule a new task to be run with a specified delay or when any of * the specified file descriptor sets is ready. The delay can be used @@ -1437,9 +1336,11 @@ GNUNET_SCHEDULER_add_now_with_lifeness (int lifeness, #ifndef MINGW static struct GNUNET_SCHEDULER_Task * add_without_sets (struct GNUNET_TIME_Relative delay, - enum GNUNET_SCHEDULER_Priority priority, - int rfd, - int wfd, + enum GNUNET_SCHEDULER_Priority priority, + const struct GNUNET_NETWORK_Handle *read_nh, + const struct GNUNET_NETWORK_Handle *write_nh, + const struct GNUNET_DISK_FileHandle *read_fh, + const struct GNUNET_DISK_FileHandle *write_fh, GNUNET_SCHEDULER_TaskCallback task, void *task_cls) { @@ -1448,39 +1349,23 @@ add_without_sets (struct GNUNET_TIME_Relative delay, GNUNET_assert (NULL != active_task); GNUNET_assert (NULL != task); t = GNUNET_new (struct GNUNET_SCHEDULER_Task); + init_fd_info (t, + &read_nh, + read_nh ? 1 : 0, + &write_nh, + write_nh ? 1 : 0, + &read_fh, + read_fh ? 1 : 0, + &write_fh, + write_fh ? 1 : 0); t->callback = task; t->callback_cls = task_cls; #if DEBUG_FDS - if (-1 != rfd) - { - int flags = fcntl (rfd, F_GETFD); - - if ((flags == -1) && (errno == EBADF)) - { - LOG (GNUNET_ERROR_TYPE_ERROR, - "Got invalid file descriptor %d!\n", - rfd); - init_backtrace (t); - GNUNET_assert (0); - } - } - if (-1 != wfd) - { - int flags = fcntl (wfd, F_GETFD); - - if (flags == -1 && errno == EBADF) - { - LOG (GNUNET_ERROR_TYPE_ERROR, - "Got invalid file descriptor %d!\n", - wfd); - init_backtrace (t); - GNUNET_assert (0); - } - } + check_fd (t, NULL != read_nh ? GNUNET_NETWORK_get_fd (read_nh) : -1); + check_fd (t, NULL != write_nh ? GNUNET_NETWORK_get_fd (write_nh) : -1); + check_fd (t, NULL != read_fh ? read_fh->fd : -1); + check_fd (t, NULL != write_fh ? write_fh->fd : -1); #endif - t->read_fd = rfd; - GNUNET_assert (wfd >= -1); - t->write_fd = wfd; #if PROFILE_DELAYS t->start_time = GNUNET_TIME_absolute_get (); #endif @@ -1490,11 +1375,9 @@ add_without_sets (struct GNUNET_TIME_Relative delay, GNUNET_CONTAINER_DLL_insert (pending_head, pending_tail, t); + driver_add_multiple (t, GNUNET_SCHEDULER_ET_NONE); max_priority_added = GNUNET_MAX (max_priority_added, t->priority); - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Adding task %p\n", - t); init_backtrace (t); return t; } @@ -1507,6 +1390,9 @@ add_without_sets (struct GNUNET_TIME_Relative delay, * used as a timeout on the socket being ready. The task will be * scheduled for execution once either the delay has expired or the * socket operation is ready. It will be run with the DEFAULT priority. + * Only allowed to be called as long as the scheduler is running + * (#GNUNET_SCHEDULER_run or #GNUNET_SCHEDULER_run_with_driver has been + * called and has not returned yet). * * @param delay when should this operation time out? * @param rfd read file-descriptor @@ -1522,8 +1408,8 @@ GNUNET_SCHEDULER_add_read_net (struct GNUNET_TIME_Relative delay, void *task_cls) { return GNUNET_SCHEDULER_add_read_net_with_priority (delay, - GNUNET_SCHEDULER_PRIORITY_DEFAULT, - rfd, task, task_cls); + GNUNET_SCHEDULER_PRIORITY_DEFAULT, + rfd, task, task_cls); } @@ -1534,6 +1420,9 @@ GNUNET_SCHEDULER_add_read_net (struct GNUNET_TIME_Relative delay, * socket being ready. The task will be scheduled for execution once * either the delay has expired or the socket operation is ready. It * will be run with the DEFAULT priority. + * Only allowed to be called as long as the scheduler is running + * (#GNUNET_SCHEDULER_run or #GNUNET_SCHEDULER_run_with_driver has been + * called and has not returned yet). * * @param delay when should this operation time out? * @param priority priority to use for the task @@ -1545,9 +1434,9 @@ GNUNET_SCHEDULER_add_read_net (struct GNUNET_TIME_Relative delay, */ struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_read_net_with_priority (struct GNUNET_TIME_Relative delay, - enum GNUNET_SCHEDULER_Priority priority, - struct GNUNET_NETWORK_Handle *rfd, - GNUNET_SCHEDULER_TaskCallback task, + enum GNUNET_SCHEDULER_Priority priority, + struct GNUNET_NETWORK_Handle *rfd, + GNUNET_SCHEDULER_TaskCallback task, void *task_cls) { return GNUNET_SCHEDULER_add_net_with_priority (delay, priority, @@ -1565,6 +1454,9 @@ GNUNET_SCHEDULER_add_read_net_with_priority (struct GNUNET_TIME_Relative delay, * scheduled for execution once either the delay has expired or the * socket operation is ready. It will be run with the priority of * the calling task. + * Only allowed to be called as long as the scheduler is running + * (#GNUNET_SCHEDULER_run or #GNUNET_SCHEDULER_run_with_driver has been + * called and has not returned yet). * * @param delay when should this operation time out? * @param wfd write file-descriptor @@ -1592,6 +1484,9 @@ GNUNET_SCHEDULER_add_write_net (struct GNUNET_TIME_Relative delay, * used as a timeout on the socket being ready. The task will be * scheduled for execution once either the delay has expired or the * socket operation is ready. + * Only allowed to be called as long as the scheduler is running + * (#GNUNET_SCHEDULER_run or #GNUNET_SCHEDULER_run_with_driver has been + * called and has not returned yet). * * @param delay when should this operation time out? * @param priority priority of the task @@ -1612,6 +1507,9 @@ GNUNET_SCHEDULER_add_net_with_priority (struct GNUNET_TIME_Relative delay, GNUNET_SCHEDULER_TaskCallback task, void *task_cls) { + /* scheduler must be running */ + GNUNET_assert (NULL != scheduler_driver); + #if MINGW struct GNUNET_NETWORK_FDSet *s; struct GNUNET_SCHEDULER_Task * ret; @@ -1627,10 +1525,13 @@ GNUNET_SCHEDULER_add_net_with_priority (struct GNUNET_TIME_Relative delay, GNUNET_NETWORK_fdset_destroy (s); return ret; #else + GNUNET_assert (on_read || on_write); GNUNET_assert (GNUNET_NETWORK_get_fd (fd) >= 0); return add_without_sets (delay, priority, - on_read ? GNUNET_NETWORK_get_fd (fd) : -1, - on_write ? GNUNET_NETWORK_get_fd (fd) : -1, + on_read ? fd : NULL, + on_write ? fd : NULL, + NULL, + NULL, task, task_cls); #endif } @@ -1642,6 +1543,9 @@ GNUNET_SCHEDULER_add_net_with_priority (struct GNUNET_TIME_Relative delay, * used as a timeout on the socket being ready. The task will be * scheduled for execution once either the delay has expired or the * socket operation is ready. It will be run with the DEFAULT priority. + * Only allowed to be called as long as the scheduler is running + * (#GNUNET_SCHEDULER_run or #GNUNET_SCHEDULER_run_with_driver has been + * called and has not returned yet). * * @param delay when should this operation time out? * @param rfd read file-descriptor @@ -1668,6 +1572,9 @@ GNUNET_SCHEDULER_add_read_file (struct GNUNET_TIME_Relative delay, * used as a timeout on the socket being ready. The task will be * scheduled for execution once either the delay has expired or the * socket operation is ready. It will be run with the DEFAULT priority. + * Only allowed to be called as long as the scheduler is running + * (#GNUNET_SCHEDULER_run or #GNUNET_SCHEDULER_run_with_driver has been + * called and has not returned yet). * * @param delay when should this operation time out? * @param wfd write file-descriptor @@ -1694,6 +1601,9 @@ GNUNET_SCHEDULER_add_write_file (struct GNUNET_TIME_Relative delay, * used as a timeout on the socket being ready. The task will be * scheduled for execution once either the delay has expired or the * socket operation is ready. + * Only allowed to be called as long as the scheduler is running + * (#GNUNET_SCHEDULER_run or #GNUNET_SCHEDULER_run_with_driver has been + * called and has not returned yet). * * @param delay when should this operation time out? * @param priority priority of the task @@ -1712,6 +1622,9 @@ GNUNET_SCHEDULER_add_file_with_priority (struct GNUNET_TIME_Relative delay, int on_read, int on_write, GNUNET_SCHEDULER_TaskCallback task, void *task_cls) { + /* scheduler must be running */ + GNUNET_assert (NULL != scheduler_driver); + #if MINGW struct GNUNET_NETWORK_FDSet *s; struct GNUNET_SCHEDULER_Task * ret; @@ -1727,19 +1640,70 @@ GNUNET_SCHEDULER_add_file_with_priority (struct GNUNET_TIME_Relative delay, GNUNET_NETWORK_fdset_destroy (s); return ret; #else - int real_fd; - - GNUNET_DISK_internal_file_handle_ (fd, &real_fd, sizeof (int)); - GNUNET_assert (real_fd >= 0); - return add_without_sets ( - delay, priority, - on_read ? real_fd : -1, - on_write ? real_fd : -1, - task, task_cls); + GNUNET_assert (on_read || on_write); + GNUNET_assert (fd->fd >= 0); + return add_without_sets (delay, priority, + NULL, + NULL, + on_read ? fd : NULL, + on_write ? fd : NULL, + task, task_cls); #endif } +void +extract_handles (struct GNUNET_SCHEDULER_Task *t, + const struct GNUNET_NETWORK_FDSet *fdset, + const struct GNUNET_NETWORK_Handle ***ntarget, + unsigned int *extracted_nhandles, + const struct GNUNET_DISK_FileHandle ***ftarget, + unsigned int *extracted_fhandles) +{ + // FIXME: this implementation only works for unix, for WIN32 the file handles + // in fdset must be handled separately + const struct GNUNET_NETWORK_Handle **nhandles; + const struct GNUNET_DISK_FileHandle **fhandles; + unsigned int nhandles_len, fhandles_len; + int sock; + + nhandles = NULL; + fhandles = NULL; + nhandles_len = 0; + fhandles_len = 0; + for (sock = 0; sock != fdset->nsds; ++sock) + { + if (GNUNET_YES == GNUNET_NETWORK_fdset_test_native (fdset, sock)) + { + struct GNUNET_NETWORK_Handle *nhandle; + struct GNUNET_DISK_FileHandle *fhandle; + + nhandle = GNUNET_NETWORK_socket_box_native (sock); + if (NULL != nhandle) + { + GNUNET_array_append (nhandles, nhandles_len, nhandle); + } + else + { + fhandle = GNUNET_DISK_get_handle_from_int_fd (sock); + if (NULL != fhandle) + { + GNUNET_array_append (fhandles, fhandles_len, fhandle); + } + else + { + GNUNET_assert (0); + } + } + } + } + *ntarget = nhandles_len > 0 ? nhandles : NULL; + *ftarget = fhandles_len > 0 ? fhandles : NULL; + *extracted_nhandles = nhandles_len; + *extracted_fhandles = fhandles_len; +} + + /** * Schedule a new task to be run with a specified delay or when any of * the specified file descriptor sets is ready. The delay can be used @@ -1755,6 +1719,9 @@ GNUNET_SCHEDULER_add_file_with_priority (struct GNUNET_TIME_Relative delay, * || any-rs-ready * || any-ws-ready) ) * </code> + * Only allowed to be called as long as the scheduler is running + * (#GNUNET_SCHEDULER_run or #GNUNET_SCHEDULER_run_with_driver has been + * called and has not returned yet). * * @param prio how important is this task? * @param delay how long should we wait? @@ -1774,13 +1741,20 @@ GNUNET_SCHEDULER_add_select (enum GNUNET_SCHEDULER_Priority prio, void *task_cls) { struct GNUNET_SCHEDULER_Task *t; - - if ( (NULL == rs) && - (NULL == ws) ) + const struct GNUNET_NETWORK_Handle **read_nhandles; + const struct GNUNET_NETWORK_Handle **write_nhandles; + const struct GNUNET_DISK_FileHandle **read_fhandles; + const struct GNUNET_DISK_FileHandle **write_fhandles; + unsigned int read_nhandles_len, write_nhandles_len, + read_fhandles_len, write_fhandles_len; + + if (((NULL == rs) && (NULL == ws)) || ((0 == rs->nsds) && (0 == ws->nsds))) return GNUNET_SCHEDULER_add_delayed_with_priority (delay, prio, task, task_cls); + /* scheduler must be running */ + GNUNET_assert (NULL != scheduler_driver); GNUNET_assert (NULL != active_task); GNUNET_assert (NULL != task); t = GNUNET_new (struct GNUNET_SCHEDULER_Task); @@ -1788,16 +1762,48 @@ GNUNET_SCHEDULER_add_select (enum GNUNET_SCHEDULER_Priority prio, t->callback_cls = task_cls; t->read_fd = -1; t->write_fd = -1; + t->own_handles = GNUNET_YES; + read_nhandles = NULL; + write_nhandles = NULL; + read_fhandles = NULL; + write_fhandles = NULL; + read_nhandles_len = 0; + write_nhandles_len = 0; + read_fhandles_len = 0; + write_fhandles_len = 0; if (NULL != rs) { - t->read_set = GNUNET_NETWORK_fdset_create (); - GNUNET_NETWORK_fdset_copy (t->read_set, rs); + extract_handles (t, + rs, + &read_nhandles, + &read_nhandles_len, + &read_fhandles, + &read_fhandles_len); } if (NULL != ws) { - t->write_set = GNUNET_NETWORK_fdset_create (); - GNUNET_NETWORK_fdset_copy (t->write_set, ws); + extract_handles (t, + ws, + &write_nhandles, + &write_nhandles_len, + &write_fhandles, + &write_fhandles_len); } + init_fd_info (t, + read_nhandles, + read_nhandles_len, + write_nhandles, + write_nhandles_len, + read_fhandles, + read_fhandles_len, + write_fhandles, + write_fhandles_len); + /* free the arrays of pointers to network / file handles, the actual + * handles will be freed in destroy_task */ + GNUNET_array_grow (read_nhandles, read_nhandles_len, 0); + GNUNET_array_grow (write_nhandles, write_nhandles_len, 0); + GNUNET_array_grow (read_fhandles, read_fhandles_len, 0); + GNUNET_array_grow (write_fhandles, write_fhandles_len, 0); #if PROFILE_DELAYS t->start_time = GNUNET_TIME_absolute_get (); #endif @@ -1810,8 +1816,9 @@ GNUNET_SCHEDULER_add_select (enum GNUNET_SCHEDULER_Priority prio, GNUNET_CONTAINER_DLL_insert (pending_head, pending_tail, t); + driver_add_multiple (t, GNUNET_SCHEDULER_ET_NONE); max_priority_added = GNUNET_MAX (max_priority_added, - t->priority); + t->priority); LOG (GNUNET_ERROR_TYPE_DEBUG, "Adding task %p\n", t); @@ -1822,17 +1829,18 @@ GNUNET_SCHEDULER_add_select (enum GNUNET_SCHEDULER_Priority prio, /** * Function used by event-loop implementations to signal the scheduler - * that a particular @a task is ready due to an event of type @a et. + * that a particular @a task is ready due to an event specified in the + * et field of @a fdi. * * This function will then queue the task to notify the application * that the task is ready (with the respective priority). * - * @param task the task that is ready, NULL for wake up calls - * @param et information about why the task is ready + * @param task the task that is ready + * @param fdi information about the related FD */ void GNUNET_SCHEDULER_task_ready (struct GNUNET_SCHEDULER_Task *task, - enum GNUNET_SCHEDULER_EventType et) + struct GNUNET_SCHEDULER_FdInfo *fdi) { enum GNUNET_SCHEDULER_Reason reason; struct GNUNET_TIME_Absolute now; @@ -1842,17 +1850,20 @@ GNUNET_SCHEDULER_task_ready (struct GNUNET_SCHEDULER_Task *task, if (now.abs_value_us >= task->timeout.abs_value_us) reason |= GNUNET_SCHEDULER_REASON_TIMEOUT; if ( (0 == (reason & GNUNET_SCHEDULER_REASON_READ_READY)) && - (0 != (GNUNET_SCHEDULER_ET_IN & et)) ) + (0 != (GNUNET_SCHEDULER_ET_IN & fdi->et)) ) reason |= GNUNET_SCHEDULER_REASON_READ_READY; if ( (0 == (reason & GNUNET_SCHEDULER_REASON_WRITE_READY)) && - (0 != (GNUNET_SCHEDULER_ET_OUT & et)) ) + (0 != (GNUNET_SCHEDULER_ET_OUT & fdi->et)) ) reason |= GNUNET_SCHEDULER_REASON_WRITE_READY; reason |= GNUNET_SCHEDULER_REASON_PREREQ_DONE; task->reason = reason; - task->fds = &task->fdx; - task->fdx.et = et; - task->fds_len = 1; - queue_ready_task (task); + if (GNUNET_NO == task->in_ready_list) + { + GNUNET_CONTAINER_DLL_remove (pending_head, + pending_tail, + task); + queue_ready_task (task); + } } @@ -1862,15 +1873,16 @@ GNUNET_SCHEDULER_task_ready (struct GNUNET_SCHEDULER_Task *task, * there are tasks left to run just to give other tasks a chance as * well. If we return #GNUNET_YES, the driver should call this * function again as soon as possible, while if we return #GNUNET_NO - * it must block until the operating system has more work as the - * scheduler has no more work to do right now. + * it must block until either the operating system has more work (the + * scheduler has no more work to do right now) or the timeout set by + * the scheduler (using the set_wakeup callback) is reached. * * @param sh scheduler handle that was given to the `loop` * @return #GNUNET_OK if there are more tasks that are ready, * and thus we would like to run more (yield to avoid * blocking other activities for too long) * #GNUNET_NO if we are done running tasks (yield to block) - * #GNUNET_SYSERR on error + * #GNUNET_SYSERR on error, e.g. no tasks were ready */ int GNUNET_SCHEDULER_run_from_driver (struct GNUNET_SCHEDULER_Handle *sh) @@ -1894,9 +1906,27 @@ GNUNET_SCHEDULER_run_from_driver (struct GNUNET_SCHEDULER_Handle *sh) pending_timeout_last = NULL; queue_ready_task (pos); } + pos = pending_head; + while (NULL != pos) + { + struct GNUNET_SCHEDULER_Task *next = pos->next; + if (now.abs_value_us >= pos->timeout.abs_value_us) + { + pos->reason |= GNUNET_SCHEDULER_REASON_TIMEOUT; + GNUNET_CONTAINER_DLL_remove (pending_head, + pending_tail, + pos); + queue_ready_task (pos); + } + pos = next; + } if (0 == ready_count) - return GNUNET_NO; + { + LOG (GNUNET_ERROR_TYPE_ERROR, + "GNUNET_SCHEDULER_run_from_driver was called, but no tasks are ready!\n"); + return GNUNET_SYSERR; + } /* find out which task priority level we are going to process this time */ @@ -1916,49 +1946,74 @@ GNUNET_SCHEDULER_run_from_driver (struct GNUNET_SCHEDULER_Handle *sh) while (NULL != (pos = ready_head[p])) { GNUNET_CONTAINER_DLL_remove (ready_head[p], - ready_tail[p], - pos); + ready_tail[p], + pos); ready_count--; current_priority = pos->priority; current_lifeness = pos->lifeness; active_task = pos; #if PROFILE_DELAYS if (GNUNET_TIME_absolute_get_duration (pos->start_time).rel_value_us > - DELAY_THRESHOLD.rel_value_us) + DELAY_THRESHOLD.rel_value_us) { LOG (GNUNET_ERROR_TYPE_DEBUG, - "Task %p took %s to be scheduled\n", - pos, - GNUNET_STRINGS_relative_time_to_string (GNUNET_TIME_absolute_get_duration (pos->start_time), - GNUNET_YES)); + "Task %p took %s to be scheduled\n", + pos, + GNUNET_STRINGS_relative_time_to_string (GNUNET_TIME_absolute_get_duration (pos->start_time), + GNUNET_YES)); } #endif tc.reason = pos->reason; GNUNET_NETWORK_fdset_zero (sh->rs); GNUNET_NETWORK_fdset_zero (sh->ws); + // FIXME: do we have to remove FdInfos from fds if they are not ready? tc.fds_len = pos->fds_len; tc.fds = pos->fds; - tc.read_ready = (NULL == pos->read_set) ? sh->rs : pos->read_set; - if ( (-1 != pos->read_fd) && - (0 != (pos->reason & GNUNET_SCHEDULER_REASON_READ_READY)) ) - GNUNET_NETWORK_fdset_set_native (sh->rs, - pos->read_fd); - tc.write_ready = (NULL == pos->write_set) ? sh->ws : pos->write_set; - if ((-1 != pos->write_fd) && - (0 != (pos->reason & GNUNET_SCHEDULER_REASON_WRITE_READY))) - GNUNET_NETWORK_fdset_set_native (sh->ws, - pos->write_fd); + for (int i = 0; i != pos->fds_len; ++i) + { + struct GNUNET_SCHEDULER_FdInfo *fdi = &pos->fds[i]; + if (0 != (GNUNET_SCHEDULER_ET_IN & fdi->et)) + { + GNUNET_NETWORK_fdset_set_native (sh->rs, + fdi->sock); + } + if (0 != (GNUNET_SCHEDULER_ET_OUT & fdi->et)) + { + GNUNET_NETWORK_fdset_set_native (sh->ws, + fdi->sock); + } + } + tc.read_ready = sh->rs; + tc.write_ready = sh->ws; LOG (GNUNET_ERROR_TYPE_DEBUG, - "Running task: %p\n", - pos); + "Running task %p\n", + pos); + GNUNET_assert (NULL != pos->callback); pos->callback (pos->callback_cls); + if (NULL != pos->fds) + { + int del_result = scheduler_driver->del (scheduler_driver->cls, pos); + if (GNUNET_OK != del_result) + { + LOG (GNUNET_ERROR_TYPE_ERROR, + "driver could not delete task\n"); + GNUNET_assert (0); + } + } active_task = NULL; dump_backtrace (pos); destroy_task (pos); tasks_run++; } + shutdown_if_no_lifeness (); if (0 == ready_count) + { + scheduler_driver->set_wakeup (scheduler_driver->cls, + get_timeout ()); return GNUNET_NO; + } + scheduler_driver->set_wakeup (scheduler_driver->cls, + GNUNET_TIME_absolute_get ()); return GNUNET_OK; } @@ -1981,8 +2036,8 @@ GNUNET_SCHEDULER_run_from_driver (struct GNUNET_SCHEDULER_Handle *sh) */ int GNUNET_SCHEDULER_run_with_driver (const struct GNUNET_SCHEDULER_Driver *driver, - GNUNET_SCHEDULER_TaskCallback task, - void *task_cls) + GNUNET_SCHEDULER_TaskCallback task, + void *task_cls) { int ret; struct GNUNET_SIGNAL_Context *shc_int; @@ -1997,7 +2052,6 @@ GNUNET_SCHEDULER_run_with_driver (const struct GNUNET_SCHEDULER_Driver *driver, #endif struct GNUNET_SCHEDULER_Task tsk; const struct GNUNET_DISK_FileHandle *pr; - struct GNUNET_SCHEDULER_Handle sh; /* general set-up */ GNUNET_assert (NULL == active_task); @@ -2009,54 +2063,56 @@ GNUNET_SCHEDULER_run_with_driver (const struct GNUNET_SCHEDULER_Driver *driver, GNUNET_assert (NULL != shutdown_pipe_handle); pr = GNUNET_DISK_pipe_handle (shutdown_pipe_handle, GNUNET_DISK_PIPE_END_READ); - GNUNET_assert (NULL != pr); my_pid = getpid (); + scheduler_driver = driver; /* install signal handlers */ LOG (GNUNET_ERROR_TYPE_DEBUG, "Registering signal handlers\n"); shc_int = GNUNET_SIGNAL_handler_install (SIGINT, - &sighandler_shutdown); + &sighandler_shutdown); shc_term = GNUNET_SIGNAL_handler_install (SIGTERM, - &sighandler_shutdown); + &sighandler_shutdown); #if (SIGTERM != GNUNET_TERM_SIG) shc_gterm = GNUNET_SIGNAL_handler_install (GNUNET_TERM_SIG, - &sighandler_shutdown); + &sighandler_shutdown); #endif #ifndef MINGW shc_pipe = GNUNET_SIGNAL_handler_install (SIGPIPE, - &sighandler_pipe); + &sighandler_pipe); shc_quit = GNUNET_SIGNAL_handler_install (SIGQUIT, - &sighandler_shutdown); + &sighandler_shutdown); shc_hup = GNUNET_SIGNAL_handler_install (SIGHUP, - &sighandler_shutdown); + &sighandler_shutdown); #endif /* Setup initial tasks */ current_priority = GNUNET_SCHEDULER_PRIORITY_DEFAULT; - current_lifeness = GNUNET_YES; + current_lifeness = GNUNET_NO; memset (&tsk, - 0, - sizeof (tsk)); + 0, + sizeof (tsk)); active_task = &tsk; - tsk.sh = &sh; + GNUNET_SCHEDULER_add_now (&GNUNET_OS_install_parent_control_handler, + NULL); + GNUNET_SCHEDULER_add_read_file (GNUNET_TIME_UNIT_FOREVER_REL, + pr, + &shutdown_cb, + NULL); + current_lifeness = GNUNET_YES; GNUNET_SCHEDULER_add_with_reason_and_priority (task, task_cls, GNUNET_SCHEDULER_REASON_STARTUP, GNUNET_SCHEDULER_PRIORITY_DEFAULT); - GNUNET_SCHEDULER_add_now_with_lifeness (GNUNET_NO, - &GNUNET_OS_install_parent_control_handler, - NULL); active_task = NULL; - driver->set_wakeup (driver->cls, - GNUNET_TIME_absolute_get ()); - + scheduler_driver->set_wakeup (scheduler_driver->cls, + get_timeout ()); /* begin main event loop */ sh.rs = GNUNET_NETWORK_fdset_create (); sh.ws = GNUNET_NETWORK_fdset_create (); - sh.driver = driver; + GNUNET_NETWORK_fdset_handle_set (sh.rs, pr); ret = driver->loop (driver->cls, - &sh); + &sh); GNUNET_NETWORK_fdset_destroy (sh.rs); GNUNET_NETWORK_fdset_destroy (sh.ws); @@ -2073,20 +2129,215 @@ GNUNET_SCHEDULER_run_with_driver (const struct GNUNET_SCHEDULER_Driver *driver, #endif GNUNET_DISK_pipe_close (shutdown_pipe_handle); shutdown_pipe_handle = NULL; + scheduler_driver = NULL; + return ret; +} + + +int +select_add (void *cls, + struct GNUNET_SCHEDULER_Task *task, + struct GNUNET_SCHEDULER_FdInfo *fdi) +{ + struct DriverContext *context = cls; + GNUNET_assert (NULL != context); + GNUNET_assert (NULL != task); + GNUNET_assert (NULL != fdi); + GNUNET_assert (0 != (GNUNET_SCHEDULER_ET_IN & fdi->et) || + 0 != (GNUNET_SCHEDULER_ET_OUT & fdi->et)); + + if (!((NULL != fdi->fd) ^ (NULL != fdi->fh)) || (fdi->sock < 0)) + { + /* exactly one out of {fd, hf} must be != NULL and the OS handle must be valid */ + return GNUNET_SYSERR; + } + + struct Scheduled *scheduled = GNUNET_new (struct Scheduled); + scheduled->task = task; + scheduled->fdi = fdi; + scheduled->et = fdi->et; + + GNUNET_CONTAINER_DLL_insert (context->scheduled_head, + context->scheduled_tail, + scheduled); + return GNUNET_OK; +} + + +int +select_del (void *cls, + struct GNUNET_SCHEDULER_Task *task) +{ + struct DriverContext *context; + struct Scheduled *pos; + int ret; + + GNUNET_assert (NULL != cls); + + context = cls; + ret = GNUNET_SYSERR; + pos = context->scheduled_head; + while (NULL != pos) + { + struct Scheduled *next = pos->next; + if (pos->task == task) + { + GNUNET_CONTAINER_DLL_remove (context->scheduled_head, + context->scheduled_tail, + pos); + GNUNET_free (pos); + ret = GNUNET_OK; + } + pos = next; + } return ret; } +int +select_loop (void *cls, + struct GNUNET_SCHEDULER_Handle *sh) +{ + struct GNUNET_NETWORK_FDSet *rs; + struct GNUNET_NETWORK_FDSet *ws; + struct DriverContext *context; + int select_result; + int tasks_ready; + + context = cls; + GNUNET_assert (NULL != context); + rs = GNUNET_NETWORK_fdset_create (); + ws = GNUNET_NETWORK_fdset_create (); + tasks_ready = GNUNET_NO; + while (NULL != context->scheduled_head || + GNUNET_TIME_UNIT_FOREVER_REL.rel_value_us != context->timeout.rel_value_us) + { + LOG (GNUNET_ERROR_TYPE_DEBUG, + "select timeout = %s\n", + GNUNET_STRINGS_relative_time_to_string (context->timeout, GNUNET_NO)); + + GNUNET_NETWORK_fdset_zero (rs); + GNUNET_NETWORK_fdset_zero (ws); + struct Scheduled *pos; + for (pos = context->scheduled_head; NULL != pos; pos = pos->next) + { + if (0 != (GNUNET_SCHEDULER_ET_IN & pos->et)) + { + GNUNET_NETWORK_fdset_set_native (rs, pos->fdi->sock); + } + if (0 != (GNUNET_SCHEDULER_ET_OUT & pos->et)) + { + GNUNET_NETWORK_fdset_set_native (ws, pos->fdi->sock); + } + } + if (NULL == scheduler_select) + { + select_result = GNUNET_NETWORK_socket_select (rs, + ws, + NULL, + context->timeout); + } + else + { + select_result = scheduler_select (scheduler_select_cls, + rs, + ws, + NULL, + context->timeout); + } + if (select_result == GNUNET_SYSERR) + { + if (errno == EINTR) + continue; + + LOG_STRERROR (GNUNET_ERROR_TYPE_ERROR, "select"); +#ifndef MINGW +#if USE_LSOF + char lsof[512]; + + snprintf (lsof, sizeof (lsof), "lsof -p %d", getpid ()); + (void) close (1); + (void) dup2 (2, 1); + if (0 != system (lsof)) + LOG_STRERROR (GNUNET_ERROR_TYPE_WARNING, + "system"); +#endif +#endif +#if DEBUG_FDS + struct Scheduled *s; + for (s = context->scheduled_head; NULL != s; s = s->next) + { + int flags = fcntl (s->fdi->sock, F_GETFD); + if ((flags == -1) && (errno == EBADF)) + { + LOG (GNUNET_ERROR_TYPE_ERROR, + "Got invalid file descriptor %d!\n", + s->fdi->sock); + } + } +#endif + GNUNET_assert (0); + GNUNET_NETWORK_fdset_destroy (rs); + GNUNET_NETWORK_fdset_destroy (ws); + return GNUNET_SYSERR; + } + for (pos = context->scheduled_head; NULL != pos; pos = pos->next) + { + int is_ready = GNUNET_NO; + if (0 != (GNUNET_SCHEDULER_ET_IN & pos->et) && + GNUNET_YES == GNUNET_NETWORK_fdset_test_native (rs, pos->fdi->sock)) + { + pos->fdi->et |= GNUNET_SCHEDULER_ET_IN; + is_ready = GNUNET_YES; + } + if (0 != (GNUNET_SCHEDULER_ET_OUT & pos->et) && + GNUNET_YES == GNUNET_NETWORK_fdset_test_native (ws, pos->fdi->sock)) + { + pos->fdi->et |= GNUNET_SCHEDULER_ET_OUT; + is_ready = GNUNET_YES; + } + if (GNUNET_YES == is_ready) + { + GNUNET_SCHEDULER_task_ready (pos->task, pos->fdi); + } + } + tasks_ready = GNUNET_SCHEDULER_run_from_driver (sh); + GNUNET_assert (GNUNET_SYSERR != tasks_ready); + } + GNUNET_NETWORK_fdset_destroy (rs); + GNUNET_NETWORK_fdset_destroy (ws); + return GNUNET_OK; +} + + +void +select_set_wakeup(void *cls, + struct GNUNET_TIME_Absolute dt) +{ + struct DriverContext *context = cls; + GNUNET_assert (NULL != context); + + context->timeout = GNUNET_TIME_absolute_get_remaining (dt); +} + + /** * Obtain the driver for using select() as the event loop. * * @return NULL on error */ -const struct GNUNET_SCHEDULER_Driver * +struct GNUNET_SCHEDULER_Driver * GNUNET_SCHEDULER_driver_select () { - GNUNET_break (0); // not implemented - return NULL; + struct GNUNET_SCHEDULER_Driver *select_driver; + select_driver = GNUNET_new (struct GNUNET_SCHEDULER_Driver); + + select_driver->loop = &select_loop; + select_driver->add = &select_add; + select_driver->del = &select_del; + select_driver->set_wakeup = &select_set_wakeup; + + return select_driver; } diff --git a/src/util/service.c b/src/util/service.c @@ -1932,6 +1932,11 @@ do_send (void *cls) size_t left; const char *buf; + LOG (GNUNET_ERROR_TYPE_DEBUG, + "service: sending message with type %u", + ntohs(client->msg->type)); + + client->send_task = NULL; buf = (const char *) client->msg; left = ntohs (client->msg->size) - client->msg_pos; @@ -1941,6 +1946,8 @@ do_send (void *cls) GNUNET_assert (ret <= (ssize_t) left); if (0 == ret) { + LOG (GNUNET_ERROR_TYPE_DEBUG, + "no data send"); GNUNET_MQ_inject_error (client->mq, GNUNET_MQ_ERROR_WRITE); return; @@ -1958,6 +1965,9 @@ do_send (void *cls) if (EPIPE != errno) GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "send"); + LOG (GNUNET_ERROR_TYPE_DEBUG, + "socket send returned with error code %i", + errno); GNUNET_MQ_inject_error (client->mq, GNUNET_MQ_ERROR_WRITE); return; @@ -2402,7 +2412,7 @@ resume_client_receive (void *cls) GNUNET_YES); if (GNUNET_SYSERR == ret) { - if (NULL != c->drop_task) + if (NULL == c->drop_task) GNUNET_SERVICE_client_drop (c); return; } @@ -2431,6 +2441,7 @@ resume_client_receive (void *cls) void GNUNET_SERVICE_client_continue (struct GNUNET_SERVICE_Client *c) { + GNUNET_assert (NULL == c->drop_task); GNUNET_assert (GNUNET_YES == c->needs_continue); GNUNET_assert (NULL == c->recv_task); c->needs_continue = GNUNET_NO; @@ -2513,6 +2524,24 @@ GNUNET_SERVICE_client_drop (struct GNUNET_SERVICE_Client *c) { struct GNUNET_SERVICE_Handle *sh = c->sh; + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Client dropped: %p (MQ: %p)\n", + c, + c->mq); + +#if EXECINFO + void *backtrace_array[MAX_TRACE_DEPTH]; + int num_backtrace_strings = backtrace (backtrace_array, MAX_TRACE_DEPTH); + char **backtrace_strings = + backtrace_symbols (backtrace_array, + t->num_backtrace_strings); + for (unsigned int i = 0; i < num_backtrace_strings; i++) + LOG (GNUNET_ERROR_TYPE_DEBUG, + "client drop trace %u: %s\n", + i, + backtrace_strings[i]); +#endif + if (NULL != c->drop_task) { /* asked to drop twice! */ diff --git a/src/util/time.c b/src/util/time.c @@ -693,7 +693,7 @@ GNUNET_TIME_year_to_time (unsigned int year) } t.tm_year = year - 1900; t.tm_mday = 1; - t.tm_mon = 1; + t.tm_mon = 0; t.tm_wday = 1; t.tm_yday = 1; tp = mktime (&t); diff --git a/src/vpn/gnunet-service-vpn.c b/src/vpn/gnunet-service-vpn.c @@ -2218,6 +2218,9 @@ route_packet (struct DestinationEntry *destination, * * @param cls closure, NULL * @param message message we got from the client (VPN channel interface) + * @return #GNUNET_OK on success, + * #GNUNET_NO to stop further processing (no error) + * #GNUNET_SYSERR to stop further processing with error */ static int message_token (void *cls,