aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2018-05-30 10:28:51 +0200
committerChristian Grothoff <christian@grothoff.org>2018-05-30 10:28:51 +0200
commit30fb422df59da0e650eb790933dadbd4bb189658 (patch)
treeb37f7529e275671ce3e640b4064a8945f658d442
parent0a0ac96d8be21130ccbb885537b0b179b16842e4 (diff)
parenta46fff931d631a176f56547692b16ae32c89299b (diff)
downloadgnunet-30fb422df59da0e650eb790933dadbd4bb189658.tar.gz
gnunet-30fb422df59da0e650eb790933dadbd4bb189658.zip
Merge branch 'master' of ssh://gnunet.org/gnunet
-rw-r--r--.gitignore8
-rw-r--r--README13
-rwxr-xr-xbin/pogen.sh (renamed from contrib/pogen.sh)0
-rwxr-xr-xbootstrap2
-rw-r--r--configure.ac2
-rw-r--r--contrib/3rdparty/Windows/openvpn-tap32/COPYING340
-rw-r--r--contrib/3rdparty/Windows/openvpn-tap32/INSTALL (renamed from contrib/openvpn-tap32/INSTALL)0
-rw-r--r--contrib/3rdparty/Windows/openvpn-tap32/tap32-signed-i386-2.1.zip (renamed from contrib/openvpn-tap32/tap32-signed-i386-2.1.zip)bin33754 -> 33754 bytes
-rw-r--r--contrib/3rdparty/Windows/openvpn-tap32/tap32-source-2.1.zip (renamed from contrib/openvpn-tap32/tap32-source-2.1.zip)bin53335 -> 53335 bytes
-rw-r--r--contrib/3rdparty/Windows/openvpn-tap32/tapw32/OemWin2k.inf (renamed from contrib/openvpn-tap32/tapw32/OemWin2k.inf)0
-rw-r--r--contrib/3rdparty/Windows/openvpn-tap32/tapw32/tap0901.cat (renamed from contrib/openvpn-tap32/tapw32/tap0901.cat)bin6551 -> 6551 bytes
-rw-r--r--contrib/3rdparty/Windows/openvpn-tap32/tapw32/tap0901.sys (renamed from contrib/openvpn-tap32/tapw32/tap0901.sys)bin31360 -> 31360 bytes
-rw-r--r--contrib/3rdparty/Windows/openvpn-tap32/tapw64/OemWin2k.inf (renamed from contrib/openvpn-tap32/tapw64/OemWin2k.inf)0
-rw-r--r--contrib/3rdparty/Windows/openvpn-tap32/tapw64/tap0901.cat (renamed from contrib/openvpn-tap32/tapw64/tap0901.cat)bin6587 -> 6587 bytes
-rw-r--r--contrib/3rdparty/Windows/openvpn-tap32/tapw64/tap0901.sys (renamed from contrib/openvpn-tap32/tapw64/tap0901.sys)bin36736 -> 36736 bytes
-rw-r--r--contrib/Makefile.am90
-rw-r--r--contrib/branding/logo/gnunet-logo-big.png (renamed from contrib/gnunet-logo-big.png)bin250489 -> 250489 bytes
-rw-r--r--contrib/branding/logo/gnunet-logo-color.png (renamed from contrib/gnunet-logo-color.png)bin6851 -> 6851 bytes
-rw-r--r--contrib/branding/logo/gnunet-logo.pdf (renamed from contrib/gnunet-logo.pdf)bin91138 -> 91138 bytes
-rw-r--r--contrib/buildslave-0.8.6p1-gnunet-w32.patch202
-rwxr-xr-xcontrib/ci/buildbot/buildbot-update.sh (renamed from contrib/buildbot-update.sh)0
-rw-r--r--contrib/ci/buildbot/ssh-config (renamed from contrib/ssh-config)0
-rw-r--r--contrib/ci/buildbot/ssh-keys (renamed from contrib/ssh-keys)0
-rw-r--r--contrib/ci/docker/Dockerfile (renamed from contrib/Dockerfile)7
-rw-r--r--contrib/ci/docker/docker-entrypoint.sh (renamed from contrib/docker-entrypoint.sh)0
-rw-r--r--contrib/conf/colorit/colorit.conf (renamed from contrib/colorit.conf)0
-rw-r--r--contrib/conf/editors/eclipse/gnunet_codingstyle.xml (renamed from contrib/gnunet_codingstyle.xml)0
-rw-r--r--contrib/conf/gnunet/no_autostart_above_core.conf (renamed from contrib/no_autostart_above_core.conf)0
-rw-r--r--contrib/conf/gnunet/no_forcestart.conf (renamed from contrib/no_forcestart.conf)0
-rw-r--r--contrib/conf/nss/nssswitch.conf (renamed from contrib/nssswitch.conf)0
-rw-r--r--contrib/conf/wireshark/wireshark.lua (renamed from bin/wireshark.lua)0
-rw-r--r--contrib/gns/bootstrap.min.css (renamed from contrib/bootstrap.min.css)0
-rw-r--r--contrib/gns/def.tex (renamed from contrib/def.tex)0
-rw-r--r--contrib/gns/gns-bcd.html (renamed from contrib/gns-bcd.html)0
-rw-r--r--contrib/gns/gns-bcd.tex (renamed from contrib/gns-bcd.tex)2
-rw-r--r--contrib/gns/gns-form-fields.xml (renamed from contrib/gns-form-fields.xml)0
-rw-r--r--contrib/gns/gns-form.xslt (renamed from contrib/gns-form.xslt)0
-rw-r--r--contrib/gnunet_janitor.py.in78
-rw-r--r--contrib/gnunet_pyexpect.py.in83
-rw-r--r--contrib/nse/experiments/infiniband.conf (renamed from contrib/experiments/nse/infiniband.conf)0
-rw-r--r--contrib/patches/lrn-indent.diff (renamed from contrib/lrn-indent.diff)0
-rw-r--r--contrib/patches/texi2html5-indent.diff (renamed from contrib/texi2html5-indent.diff)0
-rw-r--r--contrib/patches/transport_ats_years.diff (renamed from contrib/transport_ats_years.diff)0
-rwxr-xr-xcontrib/removetrailingwhitespace14
-rwxr-xr-xcontrib/repeat.sh1
-rw-r--r--contrib/scripts/.gitignore2
-rwxr-xr-xcontrib/scripts/coverage.sh (renamed from contrib/coverage.sh)0
-rwxr-xr-xcontrib/scripts/debug (renamed from contrib/debug)0
-rw-r--r--contrib/scripts/documentation/gnunet-doc.scm184
-rw-r--r--contrib/scripts/find_typedefs.py (renamed from contrib/find_typedefs.py)3
-rw-r--r--contrib/scripts/gdb-iterate-dll.py (renamed from contrib/gdb-iterate-dll.py)3
-rwxr-xr-xcontrib/scripts/generate-monkey-db.sh (renamed from contrib/generate-monkey-db.sh)0
-rwxr-xr-xcontrib/scripts/gnunet-chk.py.in (renamed from contrib/gnunet-chk.py.in)4
-rwxr-xr-xcontrib/scripts/gnunet-logread/gnunet-logread (renamed from contrib/gnunet-logread)2
-rwxr-xr-xcontrib/scripts/gnunet-logread/gnunet-logread-ipc (renamed from contrib/gnunet-logread-ipc)1
-rwxr-xr-xcontrib/scripts/gnunet-logread/gnunet-logread-ipc-sdedit (renamed from contrib/gnunet-logread-ipc-sdedit)2
-rwxr-xr-xcontrib/scripts/gnunet-suidfix (renamed from contrib/gnunet-suidfix)0
-rw-r--r--contrib/scripts/gnunet_janitor.py.in81
-rw-r--r--contrib/scripts/gnunet_pyexpect.py.in84
-rwxr-xr-xcontrib/scripts/lint-python.sh24
-rwxr-xr-xcontrib/scripts/process_log.sh (renamed from contrib/process_log.sh)0
-rw-r--r--contrib/scripts/pydiffer.py.in (renamed from contrib/pydiffer.py.in)0
-rwxr-xr-xcontrib/scripts/pydmesg (renamed from contrib/pydmesg)0
-rwxr-xr-xcontrib/scripts/regression.sh (renamed from contrib/regression.sh)0
-rwxr-xr-xcontrib/scripts/removetrailingwhitespace.py.in15
-rwxr-xr-xcontrib/scripts/report.sh (renamed from contrib/report.sh)0
-rwxr-xr-xcontrib/scripts/revisionary.sh (renamed from contrib/revisionary.sh)0
-rw-r--r--contrib/scripts/terminate.py.in68
-rwxr-xr-xcontrib/scripts/testbed_cleanup.sh (renamed from contrib/testbed_cleanup.sh)0
-rw-r--r--contrib/scripts/texinfo-hacks.el (renamed from doc/hacks.el)1
-rwxr-xr-xcontrib/scripts/visualize_stats.sh (renamed from contrib/visualize_stats.sh)0
-rwxr-xr-xcontrib/scripts/zonewalk-to-types.sh (renamed from contrib/zonewalk-to-types.sh)8
-rw-r--r--contrib/terminate.py.in64
-rw-r--r--contrib/testbed_perfhacks.patch90
-rwxr-xr-xcontrib/testbed_setup_pre_ecc_tree.sh9
-rw-r--r--contrib/testing_hostkeys.eccbin131072 -> 131072 bytes
-rw-r--r--contrib/transpot_delay.patch77
-rw-r--r--contrib/web/log.php (renamed from contrib/log.php)0
-rw-r--r--doc/Makefile.am2
-rw-r--r--doc/documentation/.gitignore7
-rw-r--r--doc/documentation/README.txt63
-rw-r--r--doc/documentation/TODO106
-rw-r--r--doc/documentation/chapters/installation.texi54
-rw-r--r--doc/documentation/gnunet-c-tutorial.texi62
-rw-r--r--guix-env.scm2
-rw-r--r--pkgconfig/gnunetgns.pc.in2
-rw-r--r--po/POTFILES.in7
-rw-r--r--po/update.pl.in (renamed from po/update.pl)2
-rwxr-xr-xpre-commit4
-rw-r--r--src/arm/test_arm_api_data.conf4
-rw-r--r--src/arm/test_gnunet_arm.py.in185
-rw-r--r--src/ats-tests/template_perf_ats.conf2
-rw-r--r--src/ats/test_ats_api.conf2
-rw-r--r--src/ats/test_ats_api_delayed.conf2
-rw-r--r--src/ats/test_ats_api_mlp.conf2
-rw-r--r--src/ats/test_ats_api_proportional.conf2
-rw-r--r--src/ats/test_ats_api_ril.conf2
-rw-r--r--src/ats/test_ats_solver_default.conf2
-rw-r--r--src/cadet/cadet_api.c25
-rw-r--r--src/cadet/cadet_protocol.h33
-rw-r--r--src/cadet/cadet_test_lib.c65
-rw-r--r--src/cadet/gnunet-service-cadet.c1
-rw-r--r--src/cadet/gnunet-service-cadet_channel.c14
-rw-r--r--src/cadet/gnunet-service-cadet_connection.c96
-rw-r--r--src/cadet/gnunet-service-cadet_connection.h4
-rw-r--r--src/cadet/gnunet-service-cadet_core.c121
-rw-r--r--src/cadet/gnunet-service-cadet_paths.c2
-rw-r--r--src/cadet/gnunet-service-cadet_peer.c38
-rw-r--r--src/cadet/gnunet-service-cadet_tunnels.c190
-rw-r--r--src/cadet/test_cadet.c52
-rw-r--r--src/cadet/test_cadet_flow.c888
-rw-r--r--src/cadet/test_cadet_local_mq.c12
-rw-r--r--src/consensus/.gitignore1
-rw-r--r--src/consensus/Makefile.am20
-rw-r--r--src/consensus/consensus-simulation.py108
-rw-r--r--src/consensus/consensus-simulation.py.in110
-rw-r--r--src/conversation/test_conversation.conf2
-rw-r--r--src/core/test_core_defaults.conf4
-rw-r--r--src/credential/test_credential_defaults.conf2
-rw-r--r--src/datastore/test_defaults.conf4
-rw-r--r--src/dht/gnunet_dht_profiler.c4
-rw-r--r--src/dht/plugin_block_dht.c15
-rw-r--r--src/dht/test_dht_2dtorus.conf4
-rw-r--r--src/dht/test_dht_api_data.conf4
-rw-r--r--src/dht/test_dht_api_peer1.conf4
-rw-r--r--src/dht/test_dht_line.conf4
-rw-r--r--src/dht/test_dht_monitor.conf4
-rw-r--r--src/dht/test_dht_multipeer.conf4
-rw-r--r--src/dht/test_dht_tools.py.in184
-rw-r--r--src/fs/test_fs_defaults.conf2
-rwxr-xr-xsrc/fs/test_gnunet_fs_idx.py.in60
-rwxr-xr-xsrc/fs/test_gnunet_fs_psd.py.in67
-rwxr-xr-xsrc/fs/test_gnunet_fs_rec.py.in134
-rw-r--r--src/gns/Makefile.am1
-rw-r--r--src/gns/gnunet-gns-benchmark.c22
-rw-r--r--src/gns/gnunet-service-gns.c27
-rw-r--r--src/gns/gnunet-service-gns_resolver.c135
-rw-r--r--src/gns/test_gns_defaults.conf2
-rwxr-xr-xsrc/gns/test_gns_gns2dns_cname_lookup.sh89
-rw-r--r--src/gnsrecord/gnsrecord_crypto.c83
-rw-r--r--src/gnsrecord/gnsrecord_serialization.c54
-rw-r--r--src/hostlist/test_hostlist_defaults.conf4
-rw-r--r--src/identity-provider/test_idp_defaults.conf2
-rw-r--r--src/include/gnunet_gnsrecord_lib.h4
-rw-r--r--src/include/gnunet_mq_lib.h20
-rw-r--r--src/integration-tests/confs/test_defaults.conf4
-rw-r--r--src/integration-tests/gnunet_testing.py.in207
-rwxr-xr-xsrc/integration-tests/test_integration_bootstrap_and_connect.py.in280
-rwxr-xr-xsrc/integration-tests/test_integration_clique.py.in323
-rwxr-xr-xsrc/integration-tests/test_integration_disconnect_nat.py.in324
-rwxr-xr-xsrc/integration-tests/test_integration_reconnect_nat.py.in359
-rw-r--r--src/namestore/gnunet-namestore.c28
-rw-r--r--src/namestore/gnunet-service-namestore.c377
-rw-r--r--src/namestore/gnunet-zoneimport.c15
-rw-r--r--src/namestore/namestore_api.c20
-rw-r--r--src/namestore/namestore_api_monitor.c7
-rw-r--r--src/namestore/plugin_namestore_flat.c16
-rw-r--r--src/namestore/plugin_namestore_postgres.c11
-rw-r--r--src/namestore/plugin_namestore_sqlite.c9
-rw-r--r--src/namestore/test_namestore_api.conf4
-rwxr-xr-xsrc/peerinfo-tool/test_gnunet_peerinfo.py.in90
-rw-r--r--src/peerinfo-tool/test_gnunet_peerinfo_data.conf2
-rw-r--r--src/psyc/test_psyc.conf2
-rw-r--r--src/regex/test_regex_api_data.conf4
-rw-r--r--src/revocation/test_local_revocation.py.in139
-rw-r--r--src/revocation/test_revocation.conf2
-rw-r--r--src/rps/test_rps.conf4
-rw-r--r--src/scalarproduct/test_scalarproduct.conf2
-rw-r--r--src/set/test_set.conf2
-rw-r--r--src/social/test_social.conf2
-rw-r--r--src/statistics/test_gnunet_statistics.py.in262
-rw-r--r--src/statistics/test_statistics_api_data.conf4
-rw-r--r--src/testbed/buildvars.py.in15
-rw-r--r--src/testbed/test_testbed_api_template.conf4
-rw-r--r--src/transport/test_transport_api_limited_sockets_tcp_peer1.conf2
-rw-r--r--src/transport/test_transport_api_limited_sockets_tcp_peer2.conf2
-rw-r--r--src/transport/test_transport_defaults.conf2
-rw-r--r--src/util/common_logging.c14
-rw-r--r--src/util/crypto_bug.c2
-rw-r--r--src/util/crypto_ecc.c10
-rwxr-xr-xsrc/util/gnunet-qr.py.in173
-rw-r--r--src/util/mq.c26
-rw-r--r--src/util/resolver_api.c4
-rw-r--r--tox.ini3
184 files changed, 4787 insertions, 2772 deletions
diff --git a/.gitignore b/.gitignore
index b7dd58739..46dc14a98 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,6 @@
1*~ 1*~
2\#*\# 2\#*\#
3*.bak
3*.a 4*.a
4*.la 5*.la
5*.lo 6*.lo
@@ -40,7 +41,7 @@ INSTALL
40confdefs.h 41confdefs.h
41confdefs.c 42confdefs.c
42confdefs.err 43confdefs.err
43gnunet-doc.scm 44guix-env-gillmann.scm
44src/namestore/test_namestore_api_zone_to_name 45src/namestore/test_namestore_api_zone_to_name
45src/credential/gnunet-credential 46src/credential/gnunet-credential
46src/credential/gnunet-service-credential 47src/credential/gnunet-service-credential
@@ -49,3 +50,8 @@ src/identity-provider/gnunet-idp
49src/namestore/perf_namestore_api_zone_iteration_flat 50src/namestore/perf_namestore_api_zone_iteration_flat
50src/namestore/perf_namestore_api_zone_iteration_postgres 51src/namestore/perf_namestore_api_zone_iteration_postgres
51src/namestore/perf_namestore_api_zone_iteration_sqlite 52src/namestore/perf_namestore_api_zone_iteration_sqlite
53python-lint.log
54flake8.log
55# for pytest created data:
56.cache/
57__pycache__/
diff --git a/README b/README
index 7819b883a..80a87d274 100644
--- a/README
+++ b/README
@@ -51,7 +51,7 @@ These are the direct dependencies for running GNUnet:
51- libogg >= 1.3.0 (optional for experimental conversation tool) 51- libogg >= 1.3.0 (optional for experimental conversation tool)
52- python-zbar >= 0.10 (optional for gnunet-qr) 52- python-zbar >= 0.10 (optional for gnunet-qr)
53- TeX Live >= 2012 (optional for gnunet-bcd[*]) 53- TeX Live >= 2012 (optional for gnunet-bcd[*])
54- Texinfo >= 5.2 54- Texinfo >= 5.2 [*1]
55- libglpk >= 4.45 (optional for experimental code) 55- libglpk >= 4.45 (optional for experimental code)
56 56
57Recommended autotools for compiling the git version are: 57Recommended autotools for compiling the git version are:
@@ -63,6 +63,10 @@ Recommended autotools for compiling the git version are:
63[*] Mandatory for compiling the info output of the documentation, 63[*] Mandatory for compiling the info output of the documentation,
64a limited subset ('texlive-tiny' in Guix) is enough. 64a limited subset ('texlive-tiny' in Guix) is enough.
65 65
66[*1] The default configuration is to build the info output of the documentation,
67and therefore require texinfo. You can pass --disable-documentation to
68the configure script to change this.
69
66How to install? 70How to install?
67=============== 71===============
68 72
@@ -260,9 +264,10 @@ $ make
260$ make install 264$ make install
261$ make check 265$ make check
262 266
263Some of the testcases require python >= 2.6 and pexpect to be 267Some of the testcases require python >= 2.6 (+ the python module "futures")
264installed. If any testcases fail to pass on your system, run 268and pexpect to be installed. If any testcases fail to pass on your system, run
265"contrib/report.sh" and report the output together with 269"contrib/scripts/report.sh" (in the repository) or "gnunet-bugreport"
270when you already have GNUnet installed and report the output together with
266information about the failing testcase to the Mantis bugtracking 271information about the failing testcase to the Mantis bugtracking
267system at https://gnunet.org/bugs/. 272system at https://gnunet.org/bugs/.
268 273
diff --git a/contrib/pogen.sh b/bin/pogen.sh
index 87c90adf2..87c90adf2 100755
--- a/contrib/pogen.sh
+++ b/bin/pogen.sh
diff --git a/bootstrap b/bootstrap
index f13919ba8..a1cdcfa00 100755
--- a/bootstrap
+++ b/bootstrap
@@ -6,4 +6,4 @@ which glibtoolize || which libtoolize || which libtool || {
6 exit 1 6 exit 1
7} 7}
8autoreconf -if 8autoreconf -if
9contrib/pogen.sh 9. "bin/pogen.sh"
diff --git a/configure.ac b/configure.ac
index 668ac7529..871a84f93 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1530,6 +1530,8 @@ AM_CONDITIONAL([USE_COVERAGE], [test "x$use_gcov" = "xyes"])
1530 1530
1531 1531
1532# version info 1532# version info
1533# TODO: git blame says this predates our switch to git. git-svn should be adjusted to simply git, or
1534# an external script that does the job.
1533AC_PATH_PROG(svnversioncommand, svnversion) 1535AC_PATH_PROG(svnversioncommand, svnversion)
1534AC_PATH_PROG(gitcommand, git) 1536AC_PATH_PROG(gitcommand, git)
1535AC_MSG_CHECKING(for source being under a VCS) 1537AC_MSG_CHECKING(for source being under a VCS)
diff --git a/contrib/3rdparty/Windows/openvpn-tap32/COPYING b/contrib/3rdparty/Windows/openvpn-tap32/COPYING
new file mode 100644
index 000000000..3912109b5
--- /dev/null
+++ b/contrib/3rdparty/Windows/openvpn-tap32/COPYING
@@ -0,0 +1,340 @@
1 GNU GENERAL PUBLIC LICENSE
2 Version 2, June 1991
3
4 Copyright (C) 1989, 1991 Free Software Foundation, Inc.
5 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
6 Everyone is permitted to copy and distribute verbatim copies
7 of this license document, but changing it is not allowed.
8
9 Preamble
10
11 The licenses for most software are designed to take away your
12freedom to share and change it. By contrast, the GNU General Public
13License is intended to guarantee your freedom to share and change free
14software--to make sure the software is free for all its users. This
15General Public License applies to most of the Free Software
16Foundation's software and to any other program whose authors commit to
17using it. (Some other Free Software Foundation software is covered by
18the GNU Library General Public License instead.) You can apply it to
19your programs, too.
20
21 When we speak of free software, we are referring to freedom, not
22price. Our General Public Licenses are designed to make sure that you
23have the freedom to distribute copies of free software (and charge for
24this service if you wish), that you receive source code or can get it
25if you want it, that you can change the software or use pieces of it
26in new free programs; and that you know you can do these things.
27
28 To protect your rights, we need to make restrictions that forbid
29anyone to deny you these rights or to ask you to surrender the rights.
30These restrictions translate to certain responsibilities for you if you
31distribute copies of the software, or if you modify it.
32
33 For example, if you distribute copies of such a program, whether
34gratis or for a fee, you must give the recipients all the rights that
35you have. You must make sure that they, too, receive or can get the
36source code. And you must show them these terms so they know their
37rights.
38
39 We protect your rights with two steps: (1) copyright the software, and
40(2) offer you this license which gives you legal permission to copy,
41distribute and/or modify the software.
42
43 Also, for each author's protection and ours, we want to make certain
44that everyone understands that there is no warranty for this free
45software. If the software is modified by someone else and passed on, we
46want its recipients to know that what they have is not the original, so
47that any problems introduced by others will not reflect on the original
48authors' reputations.
49
50 Finally, any free program is threatened constantly by software
51patents. We wish to avoid the danger that redistributors of a free
52program will individually obtain patent licenses, in effect making the
53program proprietary. To prevent this, we have made it clear that any
54patent must be licensed for everyone's free use or not licensed at all.
55
56 The precise terms and conditions for copying, distribution and
57modification follow.
58
59 GNU GENERAL PUBLIC LICENSE
60 TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
61
62 0. This License applies to any program or other work which contains
63a notice placed by the copyright holder saying it may be distributed
64under the terms of this General Public License. The "Program", below,
65refers to any such program or work, and a "work based on the Program"
66means either the Program or any derivative work under copyright law:
67that is to say, a work containing the Program or a portion of it,
68either verbatim or with modifications and/or translated into another
69language. (Hereinafter, translation is included without limitation in
70the term "modification".) Each licensee is addressed as "you".
71
72Activities other than copying, distribution and modification are not
73covered by this License; they are outside its scope. The act of
74running the Program is not restricted, and the output from the Program
75is covered only if its contents constitute a work based on the
76Program (independent of having been made by running the Program).
77Whether that is true depends on what the Program does.
78
79 1. You may copy and distribute verbatim copies of the Program's
80source code as you receive it, in any medium, provided that you
81conspicuously and appropriately publish on each copy an appropriate
82copyright notice and disclaimer of warranty; keep intact all the
83notices that refer to this License and to the absence of any warranty;
84and give any other recipients of the Program a copy of this License
85along with the Program.
86
87You may charge a fee for the physical act of transferring a copy, and
88you may at your option offer warranty protection in exchange for a fee.
89
90 2. You may modify your copy or copies of the Program or any portion
91of it, thus forming a work based on the Program, and copy and
92distribute such modifications or work under the terms of Section 1
93above, provided that you also meet all of these conditions:
94
95 a) You must cause the modified files to carry prominent notices
96 stating that you changed the files and the date of any change.
97
98 b) You must cause any work that you distribute or publish, that in
99 whole or in part contains or is derived from the Program or any
100 part thereof, to be licensed as a whole at no charge to all third
101 parties under the terms of this License.
102
103 c) If the modified program normally reads commands interactively
104 when run, you must cause it, when started running for such
105 interactive use in the most ordinary way, to print or display an
106 announcement including an appropriate copyright notice and a
107 notice that there is no warranty (or else, saying that you provide
108 a warranty) and that users may redistribute the program under
109 these conditions, and telling the user how to view a copy of this
110 License. (Exception: if the Program itself is interactive but
111 does not normally print such an announcement, your work based on
112 the Program is not required to print an announcement.)
113
114These requirements apply to the modified work as a whole. If
115identifiable sections of that work are not derived from the Program,
116and can be reasonably considered independent and separate works in
117themselves, then this License, and its terms, do not apply to those
118sections when you distribute them as separate works. But when you
119distribute the same sections as part of a whole which is a work based
120on the Program, the distribution of the whole must be on the terms of
121this License, whose permissions for other licensees extend to the
122entire whole, and thus to each and every part regardless of who wrote it.
123
124Thus, it is not the intent of this section to claim rights or contest
125your rights to work written entirely by you; rather, the intent is to
126exercise the right to control the distribution of derivative or
127collective works based on the Program.
128
129In addition, mere aggregation of another work not based on the Program
130with the Program (or with a work based on the Program) on a volume of
131a storage or distribution medium does not bring the other work under
132the scope of this License.
133
134 3. You may copy and distribute the Program (or a work based on it,
135under Section 2) in object code or executable form under the terms of
136Sections 1 and 2 above provided that you also do one of the following:
137
138 a) Accompany it with the complete corresponding machine-readable
139 source code, which must be distributed under the terms of Sections
140 1 and 2 above on a medium customarily used for software interchange; or,
141
142 b) Accompany it with a written offer, valid for at least three
143 years, to give any third party, for a charge no more than your
144 cost of physically performing source distribution, a complete
145 machine-readable copy of the corresponding source code, to be
146 distributed under the terms of Sections 1 and 2 above on a medium
147 customarily used for software interchange; or,
148
149 c) Accompany it with the information you received as to the offer
150 to distribute corresponding source code. (This alternative is
151 allowed only for noncommercial distribution and only if you
152 received the program in object code or executable form with such
153 an offer, in accord with Subsection b above.)
154
155The source code for a work means the preferred form of the work for
156making modifications to it. For an executable work, complete source
157code means all the source code for all modules it contains, plus any
158associated interface definition files, plus the scripts used to
159control compilation and installation of the executable. However, as a
160special exception, the source code distributed need not include
161anything that is normally distributed (in either source or binary
162form) with the major components (compiler, kernel, and so on) of the
163operating system on which the executable runs, unless that component
164itself accompanies the executable.
165
166If distribution of executable or object code is made by offering
167access to copy from a designated place, then offering equivalent
168access to copy the source code from the same place counts as
169distribution of the source code, even though third parties are not
170compelled to copy the source along with the object code.
171
172 4. You may not copy, modify, sublicense, or distribute the Program
173except as expressly provided under this License. Any attempt
174otherwise to copy, modify, sublicense or distribute the Program is
175void, and will automatically terminate your rights under this License.
176However, parties who have received copies, or rights, from you under
177this License will not have their licenses terminated so long as such
178parties remain in full compliance.
179
180 5. You are not required to accept this License, since you have not
181signed it. However, nothing else grants you permission to modify or
182distribute the Program or its derivative works. These actions are
183prohibited by law if you do not accept this License. Therefore, by
184modifying or distributing the Program (or any work based on the
185Program), you indicate your acceptance of this License to do so, and
186all its terms and conditions for copying, distributing or modifying
187the Program or works based on it.
188
189 6. Each time you redistribute the Program (or any work based on the
190Program), the recipient automatically receives a license from the
191original licensor to copy, distribute or modify the Program subject to
192these terms and conditions. You may not impose any further
193restrictions on the recipients' exercise of the rights granted herein.
194You are not responsible for enforcing compliance by third parties to
195this License.
196
197 7. If, as a consequence of a court judgment or allegation of patent
198infringement or for any other reason (not limited to patent issues),
199conditions are imposed on you (whether by court order, agreement or
200otherwise) that contradict the conditions of this License, they do not
201excuse you from the conditions of this License. If you cannot
202distribute so as to satisfy simultaneously your obligations under this
203License and any other pertinent obligations, then as a consequence you
204may not distribute the Program at all. For example, if a patent
205license would not permit royalty-free redistribution of the Program by
206all those who receive copies directly or indirectly through you, then
207the only way you could satisfy both it and this License would be to
208refrain entirely from distribution of the Program.
209
210If any portion of this section is held invalid or unenforceable under
211any particular circumstance, the balance of the section is intended to
212apply and the section as a whole is intended to apply in other
213circumstances.
214
215It is not the purpose of this section to induce you to infringe any
216patents or other property right claims or to contest validity of any
217such claims; this section has the sole purpose of protecting the
218integrity of the free software distribution system, which is
219implemented by public license practices. Many people have made
220generous contributions to the wide range of software distributed
221through that system in reliance on consistent application of that
222system; it is up to the author/donor to decide if he or she is willing
223to distribute software through any other system and a licensee cannot
224impose that choice.
225
226This section is intended to make thoroughly clear what is believed to
227be a consequence of the rest of this License.
228
229 8. If the distribution and/or use of the Program is restricted in
230certain countries either by patents or by copyrighted interfaces, the
231original copyright holder who places the Program under this License
232may add an explicit geographical distribution limitation excluding
233those countries, so that distribution is permitted only in or among
234countries not thus excluded. In such case, this License incorporates
235the limitation as if written in the body of this License.
236
237 9. The Free Software Foundation may publish revised and/or new versions
238of the General Public License from time to time. Such new versions will
239be similar in spirit to the present version, but may differ in detail to
240address new problems or concerns.
241
242Each version is given a distinguishing version number. If the Program
243specifies a version number of this License which applies to it and "any
244later version", you have the option of following the terms and conditions
245either of that version or of any later version published by the Free
246Software Foundation. If the Program does not specify a version number of
247this License, you may choose any version ever published by the Free Software
248Foundation.
249
250 10. If you wish to incorporate parts of the Program into other free
251programs whose distribution conditions are different, write to the author
252to ask for permission. For software which is copyrighted by the Free
253Software Foundation, write to the Free Software Foundation; we sometimes
254make exceptions for this. Our decision will be guided by the two goals
255of preserving the free status of all derivatives of our free software and
256of promoting the sharing and reuse of software generally.
257
258 NO WARRANTY
259
260 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
261FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
262OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
263PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
264OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
265MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
266TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
267PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
268REPAIR OR CORRECTION.
269
270 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
271WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
272REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
273INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
274OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
275TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
276YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
277PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
278POSSIBILITY OF SUCH DAMAGES.
279
280 END OF TERMS AND CONDITIONS
281
282 How to Apply These Terms to Your New Programs
283
284 If you develop a new program, and you want it to be of the greatest
285possible use to the public, the best way to achieve this is to make it
286free software which everyone can redistribute and change under these terms.
287
288 To do so, attach the following notices to the program. It is safest
289to attach them to the start of each source file to most effectively
290convey the exclusion of warranty; and each file should have at least
291the "copyright" line and a pointer to where the full notice is found.
292
293 <one line to give the program's name and a brief idea of what it does.>
294 Copyright (C) <year> <name of author>
295
296 This program is free software; you can redistribute it and/or modify
297 it under the terms of the GNU General Public License as published by
298 the Free Software Foundation; either version 2 of the License, or
299 (at your option) any later version.
300
301 This program is distributed in the hope that it will be useful,
302 but WITHOUT ANY WARRANTY; without even the implied warranty of
303 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
304 GNU General Public License for more details.
305
306 You should have received a copy of the GNU General Public License
307 along with this program; if not, write to the Free Software
308 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
309
310
311Also add information on how to contact you by electronic and paper mail.
312
313If the program is interactive, make it output a short notice like this
314when it starts in an interactive mode:
315
316 Gnomovision version 69, Copyright (C) year name of author
317 Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
318 This is free software, and you are welcome to redistribute it
319 under certain conditions; type `show c' for details.
320
321The hypothetical commands `show w' and `show c' should show the appropriate
322parts of the General Public License. Of course, the commands you use may
323be called something other than `show w' and `show c'; they could even be
324mouse-clicks or menu items--whatever suits your program.
325
326You should also get your employer (if you work as a programmer) or your
327school, if any, to sign a "copyright disclaimer" for the program, if
328necessary. Here is a sample; alter the names:
329
330 Yoyodyne, Inc., hereby disclaims all copyright interest in the program
331 `Gnomovision' (which makes passes at compilers) written by James Hacker.
332
333 <signature of Ty Coon>, 1 April 1989
334 Ty Coon, President of Vice
335
336This General Public License does not permit incorporating your program into
337proprietary programs. If your program is a subroutine library, you may
338consider it more useful to permit linking proprietary applications with the
339library. If this is what you want to do, use the GNU Library General
340Public License instead of this License.
diff --git a/contrib/openvpn-tap32/INSTALL b/contrib/3rdparty/Windows/openvpn-tap32/INSTALL
index 8e02c1890..8e02c1890 100644
--- a/contrib/openvpn-tap32/INSTALL
+++ b/contrib/3rdparty/Windows/openvpn-tap32/INSTALL
diff --git a/contrib/openvpn-tap32/tap32-signed-i386-2.1.zip b/contrib/3rdparty/Windows/openvpn-tap32/tap32-signed-i386-2.1.zip
index e13473203..e13473203 100644
--- a/contrib/openvpn-tap32/tap32-signed-i386-2.1.zip
+++ b/contrib/3rdparty/Windows/openvpn-tap32/tap32-signed-i386-2.1.zip
Binary files differ
diff --git a/contrib/openvpn-tap32/tap32-source-2.1.zip b/contrib/3rdparty/Windows/openvpn-tap32/tap32-source-2.1.zip
index 9ffc0b4ef..9ffc0b4ef 100644
--- a/contrib/openvpn-tap32/tap32-source-2.1.zip
+++ b/contrib/3rdparty/Windows/openvpn-tap32/tap32-source-2.1.zip
Binary files differ
diff --git a/contrib/openvpn-tap32/tapw32/OemWin2k.inf b/contrib/3rdparty/Windows/openvpn-tap32/tapw32/OemWin2k.inf
index 167e30fff..167e30fff 100644
--- a/contrib/openvpn-tap32/tapw32/OemWin2k.inf
+++ b/contrib/3rdparty/Windows/openvpn-tap32/tapw32/OemWin2k.inf
diff --git a/contrib/openvpn-tap32/tapw32/tap0901.cat b/contrib/3rdparty/Windows/openvpn-tap32/tapw32/tap0901.cat
index a6772f9fd..a6772f9fd 100644
--- a/contrib/openvpn-tap32/tapw32/tap0901.cat
+++ b/contrib/3rdparty/Windows/openvpn-tap32/tapw32/tap0901.cat
Binary files differ
diff --git a/contrib/openvpn-tap32/tapw32/tap0901.sys b/contrib/3rdparty/Windows/openvpn-tap32/tapw32/tap0901.sys
index 3ecf2391b..3ecf2391b 100644
--- a/contrib/openvpn-tap32/tapw32/tap0901.sys
+++ b/contrib/3rdparty/Windows/openvpn-tap32/tapw32/tap0901.sys
Binary files differ
diff --git a/contrib/openvpn-tap32/tapw64/OemWin2k.inf b/contrib/3rdparty/Windows/openvpn-tap32/tapw64/OemWin2k.inf
index 9b1676afd..9b1676afd 100644
--- a/contrib/openvpn-tap32/tapw64/OemWin2k.inf
+++ b/contrib/3rdparty/Windows/openvpn-tap32/tapw64/OemWin2k.inf
diff --git a/contrib/openvpn-tap32/tapw64/tap0901.cat b/contrib/3rdparty/Windows/openvpn-tap32/tapw64/tap0901.cat
index 1cac5f5c4..1cac5f5c4 100644
--- a/contrib/openvpn-tap32/tapw64/tap0901.cat
+++ b/contrib/3rdparty/Windows/openvpn-tap32/tapw64/tap0901.cat
Binary files differ
diff --git a/contrib/openvpn-tap32/tapw64/tap0901.sys b/contrib/3rdparty/Windows/openvpn-tap32/tapw64/tap0901.sys
index 566e168ea..566e168ea 100644
--- a/contrib/openvpn-tap32/tapw64/tap0901.sys
+++ b/contrib/3rdparty/Windows/openvpn-tap32/tapw64/tap0901.sys
Binary files differ
diff --git a/contrib/Makefile.am b/contrib/Makefile.am
index 1db5b3091..8e07a5d8c 100644
--- a/contrib/Makefile.am
+++ b/contrib/Makefile.am
@@ -17,52 +17,62 @@ timeout_watchdog_SOURCES = \
17endif 17endif
18 18
19noinst_SCRIPTS = \ 19noinst_SCRIPTS = \
20 terminate.py \ 20 scripts/terminate.py \
21 pydiffer.py \ 21 scripts/pydiffer.py \
22 gnunet_pyexpect.py \ 22 scripts/removetrailingwhitespace.py \
23 gnunet_janitor.py \ 23 scripts/gnunet_pyexpect.py \
24 gnunet-chk.py 24 scripts/gnunet_janitor.py \
25 scripts/gnunet-chk.py
25 26
26dist_pkgdata_DATA = \ 27dist_pkgdata_DATA = \
27 gns-bcd.html \ 28 gns/gns-bcd.html \
28 gns-bcd.tex \ 29 gns/gns-bcd.tex \
29 gnunet-logo.pdf \ 30 gns/def.tex \
30 gnunet-logo-color.png \ 31 gns/gns-form-fields.xml \
32 gns/gns-form.xslt \
33 branding/logo/gnunet-logo.pdf \
34 branding/logo/gnunet-logo-color.png \
35 scripts/report.sh \
31 testing_hostkeys.ecc 36 testing_hostkeys.ecc
32 37
33if MINGW 38if MINGW
34tap32_DATA = \ 39tap32_DATA = \
35 openvpn-tap32/tapw32/tap0901.sys \ 40 3rdparty/Windows/openvpn-tap32/tapw32/tap0901.sys \
36 openvpn-tap32/tapw32/tap0901.cat \ 41 3rdparty/Windows/openvpn-tap32/tapw32/tap0901.cat \
37 openvpn-tap32/tapw32/OemWin2k.inf 42 3rdparty/Windows/openvpn-tap32/tapw32/OemWin2k.inf
38 43
39tap64_DATA = \ 44tap64_DATA = \
40 openvpn-tap32/tapw64/tap0901.sys \ 45 3rdparty/Windows/openvpn-tap32/tapw64/tap0901.sys \
41 openvpn-tap32/tapw64/tap0901.cat \ 46 3rdparty/Windows/openvpn-tap32/tapw64/tap0901.cat \
42 openvpn-tap32/tapw64/OemWin2k.inf 47 3rdparty/Windows/openvpn-tap32/tapw64/OemWin2k.inf
43endif 48endif
44 49
45EXTRA_DIST = \ 50EXTRA_DIST = \
46 no_forcestart.conf \ 51 conf/colorit/colorit.conf \
47 no_autostart_above_core.conf \ 52 conf/editors/eclipse/gnunet_codingstyle.xml \
48 coverage.sh \ 53 conf/gnunet/no_forcestart.conf \
49 nssswitch.conf \ 54 conf/gnunet/no_autostart_above_core.conf \
50 report.sh \ 55 conf/nss/nssswitch.conf \
51 terminate.py.in \ 56 conf/wireshark/wireshark.lua \
52 gnunet_pyexpect.py.in \ 57 scripts/coverage.sh \
53 gnunet_janitor.py.in \ 58 scripts/terminate.py.in \
54 gnunet-chk.py.in \ 59 scripts/gnunet_pyexpect.py.in \
55 pydiffer.py.in \ 60 scripts/gnunet_janitor.py.in \
56 gnunet-gns-import.sh \ 61 scripts/gnunet-chk.py.in \
57 openvpn-tap32/tapw32/tap0901.sys \ 62 scripts/removetrailingwhitespace.py.in \
58 openvpn-tap32/tapw32/tap0901.cat \ 63 scripts/pydiffer.py.in \
59 openvpn-tap32/tapw32/OemWin2k.inf \ 64 scripts/gnunet-gns-import.sh \
60 openvpn-tap32/tapw64/tap0901.sys \ 65 packages/nix/default.nix \
61 openvpn-tap32/tapw64/tap0901.cat \ 66 packages/nix/gnunet-dex.nix \
62 openvpn-tap32/tapw64/OemWin2k.inf \ 67 3rdparty/Windows/openvpn-tap32/tapw32/tap0901.sys \
63 openvpn-tap32/INSTALL \ 68 3rdparty/Windows/openvpn-tap32/tapw32/tap0901.cat \
64 openvpn-tap32/tap32-signed-i386-2.1.zip \ 69 3rdparty/Windows/openvpn-tap32/tapw32/OemWin2k.inf \
65 openvpn-tap32/tap32-source-2.1.zip 70 3rdparty/Windows/openvpn-tap32/tapw64/tap0901.sys \
71 3rdparty/Windows/openvpn-tap32/tapw64/tap0901.cat \
72 3rdparty/Windows/openvpn-tap32/tapw64/OemWin2k.inf \
73 3rdparty/Windows/openvpn-tap32/INSTALL \
74 3rdparty/Windows/openvpn-tap32/tap32-signed-i386-2.1.zip \
75 3rdparty/Windows/openvpn-tap32/tap32-source-2.1.zip
66 76
67CLEANFILES = \ 77CLEANFILES = \
68 $(noinst_SCRIPTS) 78 $(noinst_SCRIPTS)
@@ -80,21 +90,13 @@ do_subst = $(SED) -e 's,[@]PYTHON[@],$(PYTHON),g'
80# 90#
81# instead of this: 91# instead of this:
82 92
93SUFFIXES =
83SUFFIXES = .py.in .py 94SUFFIXES = .py.in .py
84 95
85.py.in.py: 96.py.in.py:
86 $(do_subst) < $< > $@ 97 $(do_subst) < $< > $@
87 chmod +x $@ 98 chmod +x $@
88 99
89# init_gnunet_redhat \
90# init_gnunet_ubuntu \
91# visualize_stats.sh \
92# gnmessage.sh \
93# junkinsert.sh \
94# junklookup.sh \
95# namespacehelper.sh
96
97
98check_PROGRAMS = \ 100check_PROGRAMS = \
99 test_gnunet_prefix 101 test_gnunet_prefix
100 102
diff --git a/contrib/gnunet-logo-big.png b/contrib/branding/logo/gnunet-logo-big.png
index 54c418f8f..54c418f8f 100644
--- a/contrib/gnunet-logo-big.png
+++ b/contrib/branding/logo/gnunet-logo-big.png
Binary files differ
diff --git a/contrib/gnunet-logo-color.png b/contrib/branding/logo/gnunet-logo-color.png
index 326822ebd..326822ebd 100644
--- a/contrib/gnunet-logo-color.png
+++ b/contrib/branding/logo/gnunet-logo-color.png
Binary files differ
diff --git a/contrib/gnunet-logo.pdf b/contrib/branding/logo/gnunet-logo.pdf
index fcc7b10bf..fcc7b10bf 100644
--- a/contrib/gnunet-logo.pdf
+++ b/contrib/branding/logo/gnunet-logo.pdf
Binary files differ
diff --git a/contrib/buildslave-0.8.6p1-gnunet-w32.patch b/contrib/buildslave-0.8.6p1-gnunet-w32.patch
deleted file mode 100644
index 265db4d71..000000000
--- a/contrib/buildslave-0.8.6p1-gnunet-w32.patch
+++ /dev/null
@@ -1,202 +0,0 @@
1diff -urN /src/buildbot-slave-0.8.6p1.orig/buildslave/runprocess.py /src/buildbot-slave-0.8.6p1/buildslave/runprocess.py
2--- buildbot-slave-0.8.6p1.orig/buildslave/runprocess.py 2012-03-26 04:09:10 +0400
3+++ buildbot-slave-0.8.6p1/buildslave/runprocess.py 2013-03-31 05:18:55 +0400
4@@ -24,6 +24,7 @@
5 import re
6 import subprocess
7 import traceback
8+import tempfile
9 import stat
10 from collections import deque
11
12@@ -36,6 +37,89 @@
13 if runtime.platformType == 'posix':
14 from twisted.internet.process import Process
15
16+if os.name == 'nt':
17+ import win32api
18+ import win32process
19+ import win32event
20+ import pywintypes
21+
22+def safe_terminate_process (proc, code):
23+ if os.name == 'nt':
24+ log.msg ("Obtaining current process handle")
25+ cp = win32api.GetCurrentProcess ()
26+ result = False
27+ log.msg ("Expanding target process handle permissions")
28+ dupproc = win32api.DuplicateHandle (cp, proc._handle, cp, 2 | 1024 | 8 | 32 | 16 | 0x100000, 0, 0)
29+ log.msg ("Expanded.")
30+ try:
31+ log.msg ("Checking exit code of target process")
32+ exitcode = win32process.GetExitCodeProcess (dupproc)
33+ log.msg ("Exit code is %d" % exitcode)
34+ if exitcode == 0x103:
35+ log.msg ("Opening kernel32.dll")
36+ kernel32 = win32api.GetModuleHandle ("kernel32")
37+ log.msg ("Getting ExitProcess() address")
38+ exitprocess = win32api.GetProcAddress (kernel32, "ExitProcess")
39+ try:
40+ log.msg ("Creating remote thread")
41+ th = 0
42+ tid = 0
43+ failed = False
44+ th, tid = win32process.CreateRemoteThread (dupproc, None, 0, exitprocess, code, 0)
45+ log.msg ("Created remote thread %d" % tid)
46+ except pywintypes.error as e:
47+ if e[0] == 5:
48+ log.msg ("Access denied. It still might die, so don't fail yet")
49+ pass
50+ else:
51+ log.msg("exception %s - %s" % (sys.exc_info()[0], sys.exc_info()[1]))
52+ failed = True
53+ except Exception as e:
54+ log.msg("exception %s - %s" % (sys.exc_info()[0], sys.exc_info()[1]))
55+ failed = True
56+ if not failed:
57+ log.msg ("Wait for 5 seconds or until it dies (usually takes around 1 microsecond)")
58+ waitresult = win32event.WaitForSingleObject (dupproc, 5)
59+ log.msg ("Result of waiting: %d" % waitresult)
60+ win32api.CloseHandle (th)
61+ if waitresult == 0:
62+ result = True
63+ else:
64+ result = True
65+ except:
66+ log.msg("exception %s - %s" % (sys.exc_info()[0], sys.exc_info()[1]))
67+ finally:
68+ win32api.CloseHandle (dupproc)
69+ return result
70+ else:
71+ return proc.kill ()
72+
73+class Dummy(object):
74+ def SetHandle (self, h):
75+ self._handle = h
76+
77+def safe_terminate_process_by_pid (proc, code):
78+ if os.name == 'nt':
79+ try:
80+ log.msg("Opening process %d" % proc)
81+ openproc = win32api.OpenProcess (2 | 1024 | 8 | 32 | 16 | 0x100000, 0, proc)
82+ log.msg("Opened process %d" % proc)
83+ try:
84+ d = Dummy ()
85+ d.SetHandle (openproc)
86+ log.msg("Terminating it safely")
87+ safe_terminate_process (d, code)
88+ log.msg("Finished terminating")
89+ finally:
90+ log.msg("Closing process handle")
91+ win32api.CloseHandle (openproc)
92+ except:
93+ log.msg("exception %s - %s" % (sys.exc_info()[0], sys.exc_info()[1]))
94+ pass
95+ else:
96+ return os.kill (proc, code)
97+
98+
99 def shell_quote(cmd_list):
100 # attempt to quote cmd_list such that a shell will properly re-interpret
101 # it. The pipes module is only available on UNIX, and Windows "shell"
102@@ -148,6 +232,7 @@
103 self.pending_stdin = ""
104 self.stdin_finished = False
105 self.killed = False
106+ self.scriptfile = ""
107
108 def setStdin(self, data):
109 assert not self.connected
110@@ -198,6 +283,11 @@
111 rc = 1
112 else:
113 rc = -1
114+ if self.scriptfile:
115+ try:
116+ os.remove (self.scriptfile)
117+ except:
118+ pass
119 self.command.finished(sig, rc)
120
121
122@@ -408,9 +498,14 @@
123
124 if type(self.command) in types.StringTypes:
125 if runtime.platformType == 'win32':
126- argv = os.environ['COMSPEC'].split() # allow %COMSPEC% to have args
127- if '/c' not in argv: argv += ['/c']
128- argv += [self.command]
129+ if os.environ['BUILDSLAVE_SHELL']:
130+ argv = os.environ['BUILDSLAVE_SHELL'].split() # allow %COMSPEC% to have args
131+ argv += [self.command]
132+ else:
133+ argv = os.environ['COMSPEC'].split() # allow %COMSPEC% to have args
134+ if '/c' not in argv:
135+ argv += ['/c']
136+ argv += [self.command]
137 else:
138 # for posix, use /bin/sh. for other non-posix, well, doesn't
139 # hurt to try
140@@ -424,9 +519,26 @@
141 # handle path searching, etc.
142 if runtime.platformType == 'win32' and not \
143 (self.command[0].lower().endswith(".exe") and os.path.isabs(self.command[0])):
144- argv = os.environ['COMSPEC'].split() # allow %COMSPEC% to have args
145- if '/c' not in argv: argv += ['/c']
146- argv += list(self.command)
147+ if os.environ['BUILDSLAVE_SHELL']:
148+ argv = os.environ['BUILDSLAVE_SHELL'].split()
149+ # Create a temporary script file that changes current directory
150+ # and runs the command we want
151+ # It will be deleted after command is finished running (see RunProcessPP)
152+ tf, tf_name = tempfile.mkstemp ()
153+ f = os.fdopen (tf, 'wb')
154+ fcontents = '#!/bin/sh\ncd {}\n{}'.format (
155+ re.sub(r'(?<!\\) ','\\ ', self.workdir.replace('\\','/')),
156+ ' '.join (self.command))
157+ f.write (fcontents)
158+ log.msg("Script: {}".format (fcontents))
159+ f.close ()
160+ self.pp.scriptfile = tf_name
161+ argv += [tf_name.replace('\\','/')]
162+ else:
163+ argv = os.environ['COMSPEC'].split() # allow %COMSPEC% to have args
164+ if '/c' not in argv:
165+ argv += ['/c']
166+ argv += list(self.command)
167 else:
168 argv = self.command
169 # Attempt to format this for use by a shell, although the process isn't perfect
170@@ -439,7 +551,7 @@
171 self.environ['PWD'] = os.path.abspath(self.workdir)
172
173 # self.stdin is handled in RunProcessPP.connectionMade
174-
175+ log.msg("Running {}".format (argv))
176 log.msg(" " + display)
177 self._addToBuffers('header', display+"\n")
178
179@@ -770,9 +882,7 @@
180 if self.interruptSignal == None:
181 log.msg("self.interruptSignal==None, only pretending to kill child")
182 else:
183- log.msg("using TASKKILL /F PID /T to kill pid %s" % self.process.pid)
184- subprocess.check_call("TASKKILL /F /PID %s /T" % self.process.pid)
185- log.msg("taskkill'd pid %s" % self.process.pid)
186+ safe_terminate_process_by_pid (self.process.pid, 1)
187 hit = 1
188
189 # try signalling the process itself (works on Windows too, sorta)
190@@ -795,10 +905,11 @@
191 if not hit:
192 log.msg("signalProcess/os.kill failed both times")
193
194- if runtime.platformType == "posix":
195+ if runtime.platformType == "posix" or runtime.platformType == "win32":
196 # we only do this under posix because the win32eventreactor
197 # blocks here until the process has terminated, while closing
198 # stderr. This is weird.
199+ # LRN: Turns out, things don't work without this on W32. At all.
200 self.pp.transport.loseConnection()
201
202 if self.deferred:
diff --git a/contrib/buildbot-update.sh b/contrib/ci/buildbot/buildbot-update.sh
index 6c9d28b25..6c9d28b25 100755
--- a/contrib/buildbot-update.sh
+++ b/contrib/ci/buildbot/buildbot-update.sh
diff --git a/contrib/ssh-config b/contrib/ci/buildbot/ssh-config
index 857354bf3..857354bf3 100644
--- a/contrib/ssh-config
+++ b/contrib/ci/buildbot/ssh-config
diff --git a/contrib/ssh-keys b/contrib/ci/buildbot/ssh-keys
index 8a786d9cd..8a786d9cd 100644
--- a/contrib/ssh-keys
+++ b/contrib/ci/buildbot/ssh-keys
diff --git a/contrib/Dockerfile b/contrib/ci/docker/Dockerfile
index d2f2d7c97..974e41a5e 100644
--- a/contrib/Dockerfile
+++ b/contrib/ci/docker/Dockerfile
@@ -5,9 +5,10 @@ RUN dnf -y update && dnf -y install which git automake texinfo gettext-devel aut
5 5
6WORKDIR /usr/src 6WORKDIR /usr/src
7 7
8# Install gnurl from source at version gnurl-7.54.0 8# Install gnurl
9RUN git clone https://git.taler.net/gnurl.git --branch gnurl-7.57.0 9RUN wget https://ftp.gnu.org/gnu/gnunet/gnurl-7.59.0.tar.gz
10WORKDIR /usr/src/gnurl 10RUN tar xvzpf gnurl-7.59.0.tar.gz
11WORKDIR /usr/src/gnurl-7.59.0
11RUN autoreconf -i 12RUN autoreconf -i
12RUN ./configure --disable-ntlm-wb 13RUN ./configure --disable-ntlm-wb
13RUN make install 14RUN make install
diff --git a/contrib/docker-entrypoint.sh b/contrib/ci/docker/docker-entrypoint.sh
index 807d86d6f..807d86d6f 100644
--- a/contrib/docker-entrypoint.sh
+++ b/contrib/ci/docker/docker-entrypoint.sh
diff --git a/contrib/colorit.conf b/contrib/conf/colorit/colorit.conf
index 77d57aa59..77d57aa59 100644
--- a/contrib/colorit.conf
+++ b/contrib/conf/colorit/colorit.conf
diff --git a/contrib/gnunet_codingstyle.xml b/contrib/conf/editors/eclipse/gnunet_codingstyle.xml
index a58c2ed0c..a58c2ed0c 100644
--- a/contrib/gnunet_codingstyle.xml
+++ b/contrib/conf/editors/eclipse/gnunet_codingstyle.xml
diff --git a/contrib/no_autostart_above_core.conf b/contrib/conf/gnunet/no_autostart_above_core.conf
index 7bcf6c8ae..7bcf6c8ae 100644
--- a/contrib/no_autostart_above_core.conf
+++ b/contrib/conf/gnunet/no_autostart_above_core.conf
diff --git a/contrib/no_forcestart.conf b/contrib/conf/gnunet/no_forcestart.conf
index a332d6da7..a332d6da7 100644
--- a/contrib/no_forcestart.conf
+++ b/contrib/conf/gnunet/no_forcestart.conf
diff --git a/contrib/nssswitch.conf b/contrib/conf/nss/nssswitch.conf
index 89af6471e..89af6471e 100644
--- a/contrib/nssswitch.conf
+++ b/contrib/conf/nss/nssswitch.conf
diff --git a/bin/wireshark.lua b/contrib/conf/wireshark/wireshark.lua
index ac77029f6..ac77029f6 100644
--- a/bin/wireshark.lua
+++ b/contrib/conf/wireshark/wireshark.lua
diff --git a/contrib/bootstrap.min.css b/contrib/gns/bootstrap.min.css
index c547283bb..c547283bb 100644
--- a/contrib/bootstrap.min.css
+++ b/contrib/gns/bootstrap.min.css
diff --git a/contrib/def.tex b/contrib/gns/def.tex
index 669302b08..669302b08 100644
--- a/contrib/def.tex
+++ b/contrib/gns/def.tex
diff --git a/contrib/gns-bcd.html b/contrib/gns/gns-bcd.html
index de2fdb6e6..de2fdb6e6 100644
--- a/contrib/gns-bcd.html
+++ b/contrib/gns/gns-bcd.html
diff --git a/contrib/gns-bcd.tex b/contrib/gns/gns-bcd.tex
index 73a302985..f3a033ebc 100644
--- a/contrib/gns-bcd.tex
+++ b/contrib/gns/gns-bcd.tex
@@ -18782,7 +18782,7 @@
18782 \node[rectangle,draw=white,minimum height=7pt,text width=41mm,inner sep=0pt] at (24.25mm,-29.0mm) {\ifthenelse{\equal{#1}{english}}{\textit{\jobtitleenglish}}{\textit{\jobtitlegerman}}}; 18782 \node[rectangle,draw=white,minimum height=7pt,text width=41mm,inner sep=0pt] at (24.25mm,-29.0mm) {\ifthenelse{\equal{#1}{english}}{\textit{\jobtitleenglish}}{\textit{\jobtitlegerman}}};
18783 } 18783 }
18784 { 18784 {
18785 \node at (78mm,-7mm) {\logo}; %\includegraphics[height=7mm]{gnunet-logo.pdf}}; 18785 \node at (78mm,-7mm) {\logo}; %\includegraphics[height=7mm]{../branding/logo/gnunet-logo.pdf}};
18786 \node[rectangle,draw=white,line width=1pt,inner sep=0pt] at (17mm,-17mm) {\begin{pspicture}(15mm,15mm) \psbarcode{gnunet://gns/\gns}{eclevel=Q}{qrcode}\end{pspicture}}; 18786 \node[rectangle,draw=white,line width=1pt,inner sep=0pt] at (17mm,-17mm) {\begin{pspicture}(15mm,15mm) \psbarcode{gnunet://gns/\gns}{eclevel=Q}{qrcode}\end{pspicture}};
18787 \node[rectangle,draw=white,minimum height=7pt,text width=41mm,inner sep=0pt] at (24.25mm,-35.0mm) {\ifthenelse{\equal{\prefix}{}}{}{\tiny \prefix}}; 18787 \node[rectangle,draw=white,minimum height=7pt,text width=41mm,inner sep=0pt] at (24.25mm,-35.0mm) {\ifthenelse{\equal{\prefix}{}}{}{\tiny \prefix}};
18788 \node[rectangle,draw=white,minimum height=7pt,text width=41mm,inner sep=0pt] at (24.25mm,-41.5mm) {\fontsize{8pt}{8pt}\selectfont \textbf{\name}\ifthenelse{\equal{\suffix}{}}{}{, \tiny \suffix}}; 18788 \node[rectangle,draw=white,minimum height=7pt,text width=41mm,inner sep=0pt] at (24.25mm,-41.5mm) {\fontsize{8pt}{8pt}\selectfont \textbf{\name}\ifthenelse{\equal{\suffix}{}}{}{, \tiny \suffix}};
diff --git a/contrib/gns-form-fields.xml b/contrib/gns/gns-form-fields.xml
index 308e66e0d..308e66e0d 100644
--- a/contrib/gns-form-fields.xml
+++ b/contrib/gns/gns-form-fields.xml
diff --git a/contrib/gns-form.xslt b/contrib/gns/gns-form.xslt
index bf2585616..bf2585616 100644
--- a/contrib/gns-form.xslt
+++ b/contrib/gns/gns-form.xslt
diff --git a/contrib/gnunet_janitor.py.in b/contrib/gnunet_janitor.py.in
deleted file mode 100644
index 74fc70886..000000000
--- a/contrib/gnunet_janitor.py.in
+++ /dev/null
@@ -1,78 +0,0 @@
1#!@PYTHON@
2# This file is part of GNUnet.
3# (C) 2011 Christian Grothoff (and other contributing authors)
4#
5# GNUnet is free software; you can redistribute it and/or modify
6# it under the terms of the GNU General Public License as published
7# by the Free Software Foundation; either version 2, or (at your
8# option) any later version.
9#
10# GNUnet is distributed in the hope that it will be useful, but
11# WITHOUT ANY WARRANTY; without even the implied warranty of
12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13# General Public License for more details.
14#
15# You should have received a copy of the GNU General Public License
16# along with GNUnet; see the file COPYING. If not, write to the
17# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18# Boston, MA 02110-1301, USA.
19#
20# Finds any gnunet processes still running in the system and kills them
21#
22# gnunet janitor can be used by invoking `make' like this:
23# TESTS_ENVIRONMENT='${top_srcdir}/contrib/gnunet_janitor.py &&' make check
24
25from __future__ import print_function
26import os
27import re
28import subprocess
29import sys
30import shutil
31import time
32import signal
33import terminate
34
35if os.name == 'nt':
36 from win32com.client import GetObject
37 WMI = GetObject('winmgmts:')
38
39def get_process_list ():
40 result = []
41 if os.name == 'nt':
42 processes = WMI.InstancesOf('Win32_Process')
43 for p in processes:
44 result.append ((p.Properties_('ProcessId').Value, re.sub (r'(.+)\.exe', r'\1', p.Properties_('Name').Value)))
45 else:
46 pids = [pid for pid in os.listdir('/proc') if pid.isdigit ()]
47 for pid in pids:
48 with open (os.path.join ('/proc', pid, 'cmdline'), 'rb') as p:
49 cmdline = p.read ().split ('\x00')
50 if len (cmdline) > 0:
51 result.append ((pid, cmdline[0]))
52 return result
53
54def main ():
55 procs = get_process_list ()
56 gnunet_procs = []
57 for p in procs:
58 if re.match (r'gnunet-.+', p[1]):
59 gnunet_procs.append (p)
60 for p in gnunet_procs:
61 if re.match (r'gnunet-service-arm', p[1]):
62 print ("killing arm process {0:5} {1}".format (p[0], p[1]))
63 try:
64 terminate.safe_terminate_process_by_pid (int (p[0]), 1)
65 except OSError as e:
66 print ("failed: {0}".format (e))
67 pass
68 for p in gnunet_procs:
69 if not re.match (r'gnunet-service-arm', p[1]):
70 print ("killing non-arm process {0:5} {1}".format (p[0], p[1]))
71 try:
72 terminate.safe_terminate_process_by_pid (int (p[0]), 1)
73 except OSError as e:
74 print ("failed: {0}".format (e))
75 pass
76
77if __name__ == '__main__':
78 sys.exit (main ())
diff --git a/contrib/gnunet_pyexpect.py.in b/contrib/gnunet_pyexpect.py.in
deleted file mode 100644
index cfeb06d8d..000000000
--- a/contrib/gnunet_pyexpect.py.in
+++ /dev/null
@@ -1,83 +0,0 @@
1#!@PYTHON@
2# This file is part of GNUnet.
3# (C) 2010 Christian Grothoff (and other contributing authors)
4#
5# GNUnet is free software; you can redistribute it and/or modify
6# it under the terms of the GNU General Public License as published
7# by the Free Software Foundation; either version 2, or (at your
8# option) any later version.
9#
10# GNUnet is distributed in the hope that it will be useful, but
11# WITHOUT ANY WARRANTY; without even the implied warranty of
12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13# General Public License for more details.
14#
15# You should have received a copy of the GNU General Public License
16# along with GNUnet; see the file COPYING. If not, write to the
17# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18# Boston, MA 02110-1301, USA.
19#
20# Testcase for gnunet-peerinfo
21from __future__ import print_function
22import os
23import re
24import subprocess
25import sys
26import shutil
27import time
28
29class pexpect (object):
30 def __init__ (self):
31 super (pexpect, self).__init__ ()
32
33 def spawn (self, stdin, arglist, *pargs, **kwargs):
34 env = kwargs.pop ('env', None)
35 if env is None:
36 env = os.environ.copy ()
37 # This messes up some testcases, disable log redirection
38 env.pop ('GNUNET_FORCE_LOGFILE', None)
39 self.proc = subprocess.Popen (arglist, *pargs, env=env, **kwargs)
40 if self.proc is None:
41 print ("Failed to spawn a process {0}".format (arglist))
42 sys.exit (1)
43 if stdin is not None:
44 self.stdo, self.stde = self.proc.communicate (stdin)
45 else:
46 self.stdo, self.stde = self.proc.communicate ()
47 return self.proc
48
49 def expect (self, s, r, flags=0):
50 stream = self.stdo if s == 'stdout' else self.stde
51 if isinstance (r, str):
52 if r == "EOF":
53 if len (stream) == 0:
54 return True
55 else:
56 print ("Failed to find `{1}' in {0}, which is `{2}' ({3})".format (s, r, stream, len (stream)))
57 sys.exit (2)
58 raise ValueError ("Argument `r' should be an instance of re.RegexObject or a special string, but is `{0}'".format (r))
59 m = r.search (stream.decode(), flags)
60 if not m:
61 print ("Failed to find `{1}' in {0}, which is is `{2}'".format (s, r.pattern, stream))
62 sys.exit (2)
63 stream = stream[m.end ():]
64 if s == 'stdout':
65 self.stdo = stream
66 else:
67 self.stde = stream
68 return m
69
70 def read (self, s, size=-1):
71 stream = self.stdo if s == 'stdout' else self.stde
72 result = ""
73 if size < 0:
74 result = stream
75 new_stream = ""
76 else:
77 result = stream[0:size]
78 new_stream = stream[size:]
79 if s == 'stdout':
80 self.stdo = new_stream
81 else:
82 self.stde = new_stream
83 return result
diff --git a/contrib/experiments/nse/infiniband.conf b/contrib/nse/experiments/infiniband.conf
index c7b7f2a59..c7b7f2a59 100644
--- a/contrib/experiments/nse/infiniband.conf
+++ b/contrib/nse/experiments/infiniband.conf
diff --git a/contrib/lrn-indent.diff b/contrib/patches/lrn-indent.diff
index 8ba3b77cc..8ba3b77cc 100644
--- a/contrib/lrn-indent.diff
+++ b/contrib/patches/lrn-indent.diff
diff --git a/contrib/texi2html5-indent.diff b/contrib/patches/texi2html5-indent.diff
index 2abbcb766..2abbcb766 100644
--- a/contrib/texi2html5-indent.diff
+++ b/contrib/patches/texi2html5-indent.diff
diff --git a/contrib/transport_ats_years.diff b/contrib/patches/transport_ats_years.diff
index f48c9555d..f48c9555d 100644
--- a/contrib/transport_ats_years.diff
+++ b/contrib/patches/transport_ats_years.diff
diff --git a/contrib/removetrailingwhitespace b/contrib/removetrailingwhitespace
deleted file mode 100755
index 9e620cbb2..000000000
--- a/contrib/removetrailingwhitespace
+++ /dev/null
@@ -1,14 +0,0 @@
1#!/usr/bin/python
2
3import sys
4import re
5
6for fileName in sys.argv[1:]:
7 f = open(fileName, 'r+')
8 fileString = f.read()
9
10 fileString = re.sub(r'[ ]+\n', r'\n', fileString)
11 fileString = re.sub(r'\r', r'', fileString)
12 f.seek(0)
13 f.write(fileString)
14 f.truncate(len(fileString))
diff --git a/contrib/repeat.sh b/contrib/repeat.sh
deleted file mode 100755
index 3efc95f07..000000000
--- a/contrib/repeat.sh
+++ /dev/null
@@ -1 +0,0 @@
1while true; do rm -rf /tmp/test-gnunetd-*; make check || break; done
diff --git a/contrib/scripts/.gitignore b/contrib/scripts/.gitignore
new file mode 100644
index 000000000..547c89185
--- /dev/null
+++ b/contrib/scripts/.gitignore
@@ -0,0 +1,2 @@
1gnunet-chk.py
2removetrailingwhitespace.py
diff --git a/contrib/coverage.sh b/contrib/scripts/coverage.sh
index dd6a6ab53..dd6a6ab53 100755
--- a/contrib/coverage.sh
+++ b/contrib/scripts/coverage.sh
diff --git a/contrib/debug b/contrib/scripts/debug
index 3de2c9a14..3de2c9a14 100755
--- a/contrib/debug
+++ b/contrib/scripts/debug
diff --git a/contrib/scripts/documentation/gnunet-doc.scm b/contrib/scripts/documentation/gnunet-doc.scm
new file mode 100644
index 000000000..d8c16fdb3
--- /dev/null
+++ b/contrib/scripts/documentation/gnunet-doc.scm
@@ -0,0 +1,184 @@
1;;; This file is part of GNUnet.
2;;; Copyright (C) 2016, 2017 GNUnet e.V.
3;;;
4;;; GNUnet is free software; you can redistribute it and/or modify
5;;; it under the terms of the GNU General Public License as published
6;;; by the Free Software Foundation; either version 3, or (at your
7;;; option) any later version.
8;;;
9;;; GNUnet is distributed in the hope that it will be useful, but
10;;; WITHOUT ANY WARRANTY; without even the implied warranty of
11;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12;;; General Public License for more details.
13;;;
14;;; You should have received a copy of the GNU General Public License
15;;; along with GNUnet; see the file COPYING. If not, write to the
16;;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17;;; Boston, MA 02110-1301, USA.
18;;;
19
20(use-modules
21 (ice-9 popen)
22 (ice-9 match)
23 (ice-9 rdelim)
24 (guix packages)
25 (guix build-system gnu)
26 (guix gexp)
27 ((guix build utils) #:select (with-directory-excursion))
28 (guix git-download)
29 (guix utils) ; current-source-directory
30 (gnu packages)
31 (gnu packages aidc)
32 (gnu packages autotools)
33 (gnu packages backup)
34 (gnu packages base)
35 (gnu packages compression)
36 (gnu packages curl)
37 (gnu packages databases)
38 (gnu packages file)
39 (gnu packages gettext)
40 (gnu packages glib)
41 (gnu packages gnome)
42 (gnu packages gnunet)
43 (gnu packages gnupg)
44 (gnu packages gnuzilla)
45 (gnu packages groff)
46 (gnu packages gstreamer)
47 (gnu packages gtk)
48 (gnu packages guile)
49 (gnu packages graphviz)
50 (gnu packages image)
51 (gnu packages image-viewers)
52 (gnu packages libidn)
53 (gnu packages libunistring)
54 (gnu packages linux)
55 (gnu packages maths)
56 (gnu packages multiprecision)
57 (gnu packages perl)
58 (gnu packages pkg-config)
59 (gnu packages pulseaudio)
60 (gnu packages python)
61 (gnu packages tex)
62 (gnu packages texinfo)
63 (gnu packages tex)
64 (gnu packages tls)
65 (gnu packages video)
66 (gnu packages web)
67 (gnu packages xiph)
68 ;;(gnunet packages texlive) ;GNUnet module including texlive-2012 WIP
69 ((guix licenses) #:prefix license:))
70
71;;(define %source-dir (string-append (current-source-directory)
72;; "/../../../"))
73(define %source-dir (dirname (current-filename)))
74
75(define gnunet-doc
76 (let* ((revision "2")
77 (select? (delay (or (git-predicate
78 (string-append (current-source-directory)
79 "/../../../"))
80 source-file?))))
81 (package
82 (name "gnunet-doc")
83 (version (string-append "0.10.1-" revision "." "dev"))
84 (source
85 (local-file ;;"../../.."
86 ;;%source-dir
87 ;;(string-append (getcwd) "/../../../")
88 (string-append (getcwd)) ;drrty hack and this assumes one static position FIXME!
89 #:recursive? #t))
90 ;;#:select? (git-predicate %source-dir)))
91 ;;#:select? (force select?)))
92 (build-system gnu-build-system)
93 (inputs
94 `(("glpk" ,glpk)
95 ("gnurl" ,gnurl)
96 ("gstreamer" ,gstreamer)
97 ("gst-plugins-base" ,gst-plugins-base)
98 ("gnutls/dane" ,gnutls/dane)
99 ("libextractor" ,libextractor)
100 ("libgcrypt" ,libgcrypt)
101 ("libidn" ,libidn)
102 ("libmicrohttpd" ,libmicrohttpd)
103 ("libltdl" ,libltdl)
104 ("libunistring" ,libunistring)
105 ("openssl" ,openssl)
106 ("opus" ,opus)
107 ("pulseaudio" ,pulseaudio)
108 ("sqlite" ,sqlite)
109 ("postgresql" ,postgresql)
110 ("mysql" ,mysql)
111 ("zlib" ,zlib)
112 ("perl" ,perl)
113 ("python-2" ,python-2) ; tests and gnunet-qr
114 ("jansson" ,jansson)
115 ("nss" ,nss)
116 ("glib" ,glib "bin")
117 ("gmp" ,gmp)
118 ("bluez" ,bluez) ; for optional bluetooth feature
119 ("glib" ,glib)
120 ;;("texlive-minimal" ,texlive-minimal) ; optional.
121 ("texlive" ,texlive) ;TODO: Stabilize Texlive-2012 package
122 ("libogg" ,libogg)))
123 (native-inputs
124 `(("pkg-config" ,pkg-config)
125 ("autoconf" ,autoconf)
126 ("automake" ,automake)
127 ("gnu-gettext" ,gnu-gettext)
128 ("graphviz" ,graphviz) ; dot
129 ("texinfo-5" ,texinfo-5) ; Debian stable
130 ("which" ,which)
131 ("libtool" ,libtool)))
132 (arguments
133 `(#:configure-flags
134 (list "--enable-documentation")
135 #:tests? #f ;Don't run tests
136 #:phases
137 (modify-phases %standard-phases
138 (add-after 'unpack 'autoconf
139 (lambda _
140 (substitute* "bootstrap"
141 (("contrib/pogen.sh") "sh contrib/pogen.sh"))
142 (for-each (lambda (f) (chmod f #o755))
143 (find-files "po" ""))
144 (zero? (system* "sh" "bootstrap"))))
145 (add-after 'build 'run-gendocs
146 (lambda _
147 (chdir "doc/documentation")
148 ;;(zero? (system* "make" "dev-build"))))
149 (zero? (system* "sh" "run-gendocs.sh"))))
150 ;; (zero? (system* "make" "pdf"))
151 ;; (zero? (system* "make" "html"))
152 ;; (zero? (system* "make" "info"))))
153 ;;(zero? (system* "make" "doc-all-give-me-the-noise"))))
154 (replace 'install
155 (lambda _
156 (zero? (system* "make" "doc-gendoc-install")))))))
157 ;;(lambda* (#:key outputs #:allow-other-keys)
158 ;; (let* ((out (assoc-ref outputs "out"))
159 ;; (doc (string-append out "/share/doc/gnunet")))
160 ;; (mkdir-p doc)
161 ;; (copy-recursively "images"
162 ;; (string-append doc
163 ;; "/images"))
164 ;; (mkdir-p (string-append doc "/gnunet"))
165 ;; (install-file "gnunet.pdf" doc)
166 ;; (install-file "gnunet.info" doc)
167 ;; (install-file "gnunet.log" doc) ;TODO: Move to 'dev' output?
168 ;; (copy-recursively "gnunet"
169 ;; (string-append doc
170 ;; "/gnunet"))
171 ;; (install-file "gnunet-c-tutorial.pdf" doc)
172 ;; (install-file "gnunet-c-tutorial.info" doc)
173 ;; (install-file "gnunet-c-tutorial.log" doc) ;TODO: Move to 'dev' output?
174 ;; (copy-recursively "gnunet-c-tutorial"
175 ;; (string-append doc
176 ;; "/gnunet-c-tutorial")))
177 ;; #t)))))
178 (synopsis "Documentation of GNUnet")
179 (description
180 "GNUnet documentation build")
181 (license (list license:fdl1.3+ license:gpl3+))
182 (home-page "https://gnunet.org/"))))
183
184gnunet-doc
diff --git a/contrib/find_typedefs.py b/contrib/scripts/find_typedefs.py
index 68f5c2782..b344cee2b 100644
--- a/contrib/find_typedefs.py
+++ b/contrib/scripts/find_typedefs.py
@@ -1,4 +1,7 @@
1# XXX (F841): local variable 'li' is assigned to but never used
2
1from __future__ import print_function 3from __future__ import print_function
4from __future__ import unicode_literals
2import os 5import os
3import re 6import re
4import sys 7import sys
diff --git a/contrib/gdb-iterate-dll.py b/contrib/scripts/gdb-iterate-dll.py
index 79d46aa96..388ef6e11 100644
--- a/contrib/gdb-iterate-dll.py
+++ b/contrib/scripts/gdb-iterate-dll.py
@@ -1,3 +1,6 @@
1from __future__ import print_function
2from __future__ import unicode_literals
3from builtins import str
1from gdb import * 4from gdb import *
2 5
3 6
diff --git a/contrib/generate-monkey-db.sh b/contrib/scripts/generate-monkey-db.sh
index 2afe55501..2afe55501 100755
--- a/contrib/generate-monkey-db.sh
+++ b/contrib/scripts/generate-monkey-db.sh
diff --git a/contrib/gnunet-chk.py.in b/contrib/scripts/gnunet-chk.py.in
index f20153a8a..c976b2143 100755
--- a/contrib/gnunet-chk.py.in
+++ b/contrib/scripts/gnunet-chk.py.in
@@ -192,11 +192,9 @@ class Chk:
192 def setSize(self, size): 192 def setSize(self, size):
193 self.fsize = size 193 self.fsize = size
194 194
195 # 2to3-3.5 suggests to change the code below to:
196 # if isinstance (self.fsize, int):
197 def uri(self): 195 def uri(self):
198 sizestr = repr(self.fsize) 196 sizestr = repr(self.fsize)
199 if isinstance(self.fsize, long): 197 if isinstance(self.fsize, int):
200 sizestr = sizestr[:-1] 198 sizestr = sizestr[:-1]
201 return GNUNET_FS_URI_PREFIX + GNUNET_FS_URI_CHK_INFIX + \ 199 return GNUNET_FS_URI_PREFIX + GNUNET_FS_URI_CHK_INFIX + \
202 encode_data_to_string(bytearray(self.key)) + "." + \ 200 encode_data_to_string(bytearray(self.key)) + "." + \
diff --git a/contrib/gnunet-logread b/contrib/scripts/gnunet-logread/gnunet-logread
index e4b6752b8..9b1c65401 100755
--- a/contrib/gnunet-logread
+++ b/contrib/scripts/gnunet-logread/gnunet-logread
@@ -1,4 +1,4 @@
1#!/usr/bin/env perl 1#!@PERL@
2# helper tool to make gnunet logs more readable 2# helper tool to make gnunet logs more readable
3# try 'gnunet-logread -h' for usage 3# try 'gnunet-logread -h' for usage
4 4
diff --git a/contrib/gnunet-logread-ipc b/contrib/scripts/gnunet-logread/gnunet-logread-ipc
index 77515d890..72f9f47df 100755
--- a/contrib/gnunet-logread-ipc
+++ b/contrib/scripts/gnunet-logread/gnunet-logread-ipc
@@ -4,6 +4,7 @@
4# 4#
5# ... obsoleted by gnunet-logread's new -f option that does the same thing 5# ... obsoleted by gnunet-logread's new -f option that does the same thing
6 6
7# FIXME: Replace /tmp with our use of $TMPDIR and similar.
7ipc=${1:-/tmp/gnunet-logread-ipc.sock} 8ipc=${1:-/tmp/gnunet-logread-ipc.sock}
8test -e "$ipc" || mkfifo "$ipc" 9test -e "$ipc" || mkfifo "$ipc"
9cat "$ipc" 10cat "$ipc"
diff --git a/contrib/gnunet-logread-ipc-sdedit b/contrib/scripts/gnunet-logread/gnunet-logread-ipc-sdedit
index 197e6f575..f8b7dc735 100755
--- a/contrib/gnunet-logread-ipc-sdedit
+++ b/contrib/scripts/gnunet-logread/gnunet-logread-ipc-sdedit
@@ -1,4 +1,4 @@
1#!/usr/bin/env perl 1#!@PERL@
2 2
3# 1. Start sdedit and enable 'RT diagram server' in 'Global preferences'. 3# 1. Start sdedit and enable 'RT diagram server' in 'Global preferences'.
4# 4#
diff --git a/contrib/gnunet-suidfix b/contrib/scripts/gnunet-suidfix
index 992378966..992378966 100755
--- a/contrib/gnunet-suidfix
+++ b/contrib/scripts/gnunet-suidfix
diff --git a/contrib/scripts/gnunet_janitor.py.in b/contrib/scripts/gnunet_janitor.py.in
new file mode 100644
index 000000000..91d2a4377
--- /dev/null
+++ b/contrib/scripts/gnunet_janitor.py.in
@@ -0,0 +1,81 @@
1#!@PYTHON@
2# This file is part of GNUnet.
3# (C) 2011, 2018 Christian Grothoff (and other contributing authors)
4#
5# GNUnet is free software; you can redistribute it and/or modify
6# it under the terms of the GNU General Public License as published
7# by the Free Software Foundation; either version 2, or (at your
8# option) any later version.
9#
10# GNUnet is distributed in the hope that it will be useful, but
11# WITHOUT ANY WARRANTY; without even the implied warranty of
12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13# General Public License for more details.
14#
15# You should have received a copy of the GNU General Public License
16# along with GNUnet; see the file COPYING. If not, write to the
17# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18# Boston, MA 02110-1301, USA.
19#
20# Finds any gnunet processes still running in the system and kills them
21#
22# gnunet janitor can be used by invoking `make' like this:
23# TESTS_ENVIRONMENT='${top_srcdir}/contrib/scripts/gnunet_janitor.py &&' make check
24
25from __future__ import print_function
26import os
27import re
28import subprocess
29import sys
30import shutil
31import time
32import signal
33import terminate
34
35if os.name == 'nt':
36 from win32com.client import GetObject
37 WMI = GetObject('winmgmts:')
38
39
40def get_process_list():
41 result = []
42 if os.name == 'nt':
43 processes = WMI.InstancesOf('Win32_Process')
44 for p in processes:
45 result.append((p.Properties_('ProcessId').Value, re.sub(r'(.+)\.exe', r'\1', p.Properties_('Name').Value)))
46 else:
47 pids = [pid for pid in os.listdir('/proc') if pid.isdigit()]
48 for pid in pids:
49 with open(os.path.join('/proc', pid, 'cmdline'), 'rb') as p:
50 cmdline = p.read().split('\x00')
51 if len(cmdline) > 0:
52 result.append((pid, cmdline[0]))
53 return result
54
55
56def main():
57 procs = get_process_list()
58 gnunet_procs = []
59 for p in procs:
60 if re.match(r'gnunet-.+', p[1]):
61 gnunet_procs.append(p)
62 for p in gnunet_procs:
63 if re.match(r'gnunet-service-arm', p[1]):
64 print("killing arm process {0:5} {1}".format(p[0], p[1]))
65 try:
66 terminate.safe_terminate_process_by_pid(int(p[0]), 1)
67 except OSError as e:
68 print("failed: {0}".format(e))
69 pass
70 for p in gnunet_procs:
71 if not re.match(r'gnunet-service-arm', p[1]):
72 print("killing non-arm process {0:5} {1}".format(p[0], p[1]))
73 try:
74 terminate.safe_terminate_process_by_pid(int(p[0]), 1)
75 except OSError as e:
76 print("failed: {0}".format(e))
77 pass
78
79
80if __name__ == '__main__':
81 sys.exit(main())
diff --git a/contrib/scripts/gnunet_pyexpect.py.in b/contrib/scripts/gnunet_pyexpect.py.in
new file mode 100644
index 000000000..23f01603f
--- /dev/null
+++ b/contrib/scripts/gnunet_pyexpect.py.in
@@ -0,0 +1,84 @@
1#!@PYTHON@
2# This file is part of GNUnet.
3# (C) 2010, 2018 Christian Grothoff (and other contributing authors)
4#
5# GNUnet is free software; you can redistribute it and/or modify
6# it under the terms of the GNU General Public License as published
7# by the Free Software Foundation; either version 2, or (at your
8# option) any later version.
9#
10# GNUnet is distributed in the hope that it will be useful, but
11# WITHOUT ANY WARRANTY; without even the implied warranty of
12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13# General Public License for more details.
14#
15# You should have received a copy of the GNU General Public License
16# along with GNUnet; see the file COPYING. If not, write to the
17# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18# Boston, MA 02110-1301, USA.
19#
20# Testcase for gnunet-peerinfo
21from __future__ import print_function
22import os
23import re
24import subprocess
25import sys
26import shutil
27import time
28
29
30class pexpect (object):
31 def __init__(self):
32 super(pexpect, self).__init__()
33
34 def spawn(self, stdin, arglist, *pargs, **kwargs):
35 env = kwargs.pop('env', None)
36 if env is None:
37 env = os.environ.copy()
38 # This messes up some testcases, disable log redirection
39 env.pop('GNUNET_FORCE_LOGFILE', None)
40 self.proc = subprocess.Popen(arglist, *pargs, env=env, **kwargs)
41 if self.proc is None:
42 print("Failed to spawn a process {0}".format(arglist))
43 sys.exit(1)
44 if stdin is not None:
45 self.stdo, self.stde = self.proc.communicate(stdin)
46 else:
47 self.stdo, self.stde = self.proc.communicate()
48 return self.proc
49
50 def expect(self, s, r, flags=0):
51 stream = self.stdo if s == 'stdout' else self.stde
52 if isinstance(r, str):
53 if r == "EOF":
54 if len(stream) == 0:
55 return True
56 else:
57 print("Failed to find `{1}' in {0}, which is `{2}' ({3})".format(s, r, stream, len(stream)))
58 sys.exit(2)
59 raise ValueError("Argument `r' should be an instance of re.RegexObject or a special string, but is `{0}'".format(r))
60 m = r.search(stream.decode(), flags)
61 if not m:
62 print("Failed to find `{1}' in {0}, which is is `{2}'".format(s, r.pattern, stream))
63 sys.exit(2)
64 stream = stream[m.end():]
65 if s == 'stdout':
66 self.stdo = stream
67 else:
68 self.stde = stream
69 return m
70
71 def read(self, s, size=-1):
72 stream = self.stdo if s == 'stdout' else self.stde
73 result = ""
74 if size < 0:
75 result = stream
76 new_stream = ""
77 else:
78 result = stream[0:size]
79 new_stream = stream[size:]
80 if s == 'stdout':
81 self.stdo = new_stream
82 else:
83 self.stde = new_stream
84 return result
diff --git a/contrib/scripts/lint-python.sh b/contrib/scripts/lint-python.sh
new file mode 100755
index 000000000..9f7e0462d
--- /dev/null
+++ b/contrib/scripts/lint-python.sh
@@ -0,0 +1,24 @@
1#!/bin/sh
2# check python style (and 2 to 3 migration)
3
4rm python-lint.log
5
6if [ -e "python" ]
7then
8 python --version >> python-lint.log
9fi
10
11if [ -e "python2" ]
12then
13 python2 --version >> python-lint.log
14fi
15
16if [ -e "python3" ]
17then
18 python3 --version >> python-lint.log
19fi
20
21flake8 >> python-lint.log
22
232to3 -v -d . >> python-lint.log
242to3 -v -p . >> python-lint.log
diff --git a/contrib/process_log.sh b/contrib/scripts/process_log.sh
index c25c515c2..c25c515c2 100755
--- a/contrib/process_log.sh
+++ b/contrib/scripts/process_log.sh
diff --git a/contrib/pydiffer.py.in b/contrib/scripts/pydiffer.py.in
index 10145371c..10145371c 100644
--- a/contrib/pydiffer.py.in
+++ b/contrib/scripts/pydiffer.py.in
diff --git a/contrib/pydmesg b/contrib/scripts/pydmesg
index d60e08fe3..d60e08fe3 100755
--- a/contrib/pydmesg
+++ b/contrib/scripts/pydmesg
diff --git a/contrib/regression.sh b/contrib/scripts/regression.sh
index 1f799797a..1f799797a 100755
--- a/contrib/regression.sh
+++ b/contrib/scripts/regression.sh
diff --git a/contrib/scripts/removetrailingwhitespace.py.in b/contrib/scripts/removetrailingwhitespace.py.in
new file mode 100755
index 000000000..5824fb591
--- /dev/null
+++ b/contrib/scripts/removetrailingwhitespace.py.in
@@ -0,0 +1,15 @@
1#!@PYTHON@
2
3import sys
4import re
5
6
7for fileName in sys.argv[1:]:
8 f = open(fileName, 'r+')
9 fileString = f.read()
10
11 fileString = re.sub(r'[ ]+\n', r'\n', fileString)
12 fileString = re.sub(r'\r', r'', fileString)
13 f.seek(0)
14 f.write(fileString)
15 f.truncate(len(fileString))
diff --git a/contrib/report.sh b/contrib/scripts/report.sh
index 7fbb2f46c..7fbb2f46c 100755
--- a/contrib/report.sh
+++ b/contrib/scripts/report.sh
diff --git a/contrib/revisionary.sh b/contrib/scripts/revisionary.sh
index 5778cf148..5778cf148 100755
--- a/contrib/revisionary.sh
+++ b/contrib/scripts/revisionary.sh
diff --git a/contrib/scripts/terminate.py.in b/contrib/scripts/terminate.py.in
new file mode 100644
index 000000000..c6acfdba8
--- /dev/null
+++ b/contrib/scripts/terminate.py.in
@@ -0,0 +1,68 @@
1#!@PYTHON@
2# This file is part of GNUnet.
3# (C) 2011, 2018 Christian Grothoff (and other contributing authors)
4#
5# GNUnet is free software; you can redistribute it and/or modify
6# it under the terms of the GNU General Public License as published
7# by the Free Software Foundation; either version 2, or (at your
8# option) any later version.
9#
10# GNUnet is distributed in the hope that it will be useful, but
11# WITHOUT ANY WARRANTY; without even the implied warranty of
12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13# General Public License for more details.
14#
15# You should have received a copy of the GNU General Public License
16# along with GNUnet; see the file COPYING. If not, write to the
17# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18# Boston, MA 02110-1301, USA.
19#
20# Utility module that implements safe process termination for W32.
21# For other platforms it's equivalent to Popen.kill ()
22# Requires pywin32 on W32.
23
24import sys
25import subprocess
26import os
27if os.name == 'nt':
28 import win32api
29 import win32process
30
31
32class dummyobj (object):
33 pass
34
35
36def safe_terminate_process_by_pid(pid, code):
37 if os.name == 'nt':
38 p = dummyobj()
39 p._handle = win32api.OpenProcess(2 | 1024 | 8 | 32 | 16, 0, pid)
40 result = safe_terminate_process(p, code)
41 win32api.CloseHandle(p._handle)
42 return result
43 else:
44 # XXX (F821): Undefined name 'SIGKILL'
45 return os.kill(int(pid), SIGKILL)
46
47
48def safe_terminate_process(proc, code):
49 if os.name == 'nt':
50 cp = win32api.GetCurrentProcess()
51 result = False
52 dupproc = win32api.DuplicateHandle(cp, proc._handle, cp, 2 | 1024 | 8 | 32 | 16, 0, 0)
53 try:
54 exitcode = win32process.GetExitCodeProcess(dupproc)
55 if exitcode == 0x103:
56 kernel32 = win32api.GetModuleHandle("kernel32")
57 exitprocess = win32api.GetProcAddress(kernel32, "ExitProcess")
58 th, tid = win32process.CreateRemoteThread(dupproc, None, 0, exitprocess, code, 0)
59 win32api.CloseHandle(th)
60 result = True
61 else:
62 result = True
63 # except failed to get exit code? failed to get module handle?
64 finally:
65 win32api.CloseHandle(dupproc)
66 return result
67 else:
68 return proc.kill()
diff --git a/contrib/testbed_cleanup.sh b/contrib/scripts/testbed_cleanup.sh
index 57413fba0..57413fba0 100755
--- a/contrib/testbed_cleanup.sh
+++ b/contrib/scripts/testbed_cleanup.sh
diff --git a/doc/hacks.el b/contrib/scripts/texinfo-hacks.el
index 9f271b3af..bfb5c98fa 100644
--- a/doc/hacks.el
+++ b/contrib/scripts/texinfo-hacks.el
@@ -1,6 +1,7 @@
1;;;; hacks.el --- a few functions to help me work on the manual 1;;;; hacks.el --- a few functions to help me work on the manual
2;;;; Jim Blandy <jimb@red-bean.com> --- October 1998 2;;;; Jim Blandy <jimb@red-bean.com> --- October 1998
3;;;; -- imported from https://git.savannah.gnu.org/cgit/guile.git/tree/doc/hacks.el 3;;;; -- imported from https://git.savannah.gnu.org/cgit/guile.git/tree/doc/hacks.el
4;;;; This code should be covered by the same license as GNU Guile (GPL3).
4 5
5(defun jh-exemplify-region (start end) 6(defun jh-exemplify-region (start end)
6 (interactive "r") 7 (interactive "r")
diff --git a/contrib/visualize_stats.sh b/contrib/scripts/visualize_stats.sh
index aaa5e657b..aaa5e657b 100755
--- a/contrib/visualize_stats.sh
+++ b/contrib/scripts/visualize_stats.sh
diff --git a/contrib/zonewalk-to-types.sh b/contrib/scripts/zonewalk-to-types.sh
index c453702e6..dfe15a8e3 100755
--- a/contrib/zonewalk-to-types.sh
+++ b/contrib/scripts/zonewalk-to-types.sh
@@ -10,10 +10,10 @@ NUM_CLIENTS=3
10# FILE ($1) contains results from DNS lookup; strip 10# FILE ($1) contains results from DNS lookup; strip
11# everything but the hostnames, remove duplicates 11# everything but the hostnames, remove duplicates
12# and then randomize the order. 12# and then randomize the order.
13cat $1 | awk '{print $1}' | sort | uniq | shuf > $1.tmp 13cat $1 | grep -v SOA | awk '{print $1}' | sort | uniq | shuf > $1.tmp
14TOTAL=`cat $1.tmp | wc -l` 14TOTAL=`cat $1.tmp | wc -l`
15GROUP_SIZE=`expr $TOTAL / \( $NUM_TYPES + 1 \)` 15GROUP_SIZE=`expr $TOTAL / \( $NUM_CLIENTS + 1 \)`
16 16echo "Creating $NUM_CLIENTS benchmark sets with 2x $GROUP_SIZE entries each."
17# First group (0) is to be shared among all clients 17# First group (0) is to be shared among all clients
18for i in `seq 1 $NUM_CLIENTS` 18for i in `seq 1 $NUM_CLIENTS`
19do 19do
@@ -21,7 +21,7 @@ do
21done 21done
22 22
23# Second group (1) is unique per client 23# Second group (1) is unique per client
24OFF=0 24OFF=$GROUP_SIZE
25for i in `seq 1 $NUM_CLIENTS` 25for i in `seq 1 $NUM_CLIENTS`
26do 26do
27 END=`expr $OFF + $GROUP_SIZE` 27 END=`expr $OFF + $GROUP_SIZE`
diff --git a/contrib/terminate.py.in b/contrib/terminate.py.in
deleted file mode 100644
index 4a6719f38..000000000
--- a/contrib/terminate.py.in
+++ /dev/null
@@ -1,64 +0,0 @@
1#!@PYTHON@
2# This file is part of GNUnet.
3# (C) 2011 Christian Grothoff (and other contributing authors)
4#
5# GNUnet is free software; you can redistribute it and/or modify
6# it under the terms of the GNU General Public License as published
7# by the Free Software Foundation; either version 2, or (at your
8# option) any later version.
9#
10# GNUnet is distributed in the hope that it will be useful, but
11# WITHOUT ANY WARRANTY; without even the implied warranty of
12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13# General Public License for more details.
14#
15# You should have received a copy of the GNU General Public License
16# along with GNUnet; see the file COPYING. If not, write to the
17# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18# Boston, MA 02110-1301, USA.
19#
20# Utility module that implements safe process termination for W32.
21# For other platforms it's equivalent to Popen.kill ()
22# Requires pywin32 on W32.
23
24import sys
25import os
26import subprocess
27if os.name == 'nt':
28 import win32api
29 import win32process
30
31class dummyobj (object):
32 pass
33
34def safe_terminate_process_by_pid (pid, code):
35 if os.name == 'nt':
36 p = dummyobj ()
37 p._handle = win32api.OpenProcess (2 | 1024 | 8 | 32 | 16, 0, pid)
38 result = safe_terminate_process (p, code)
39 win32api.CloseHandle (p._handle)
40 return result
41 else:
42 return os.kill (int (pid), SIGKILL)
43
44def safe_terminate_process (proc, code):
45 if os.name == 'nt':
46 cp = win32api.GetCurrentProcess ()
47 result = False
48 dupproc = win32api.DuplicateHandle (cp, proc._handle, cp, 2 | 1024 | 8 | 32 | 16, 0, 0)
49 try:
50 exitcode = win32process.GetExitCodeProcess (dupproc)
51 if exitcode == 0x103:
52 kernel32 = win32api.GetModuleHandle ("kernel32")
53 exitprocess = win32api.GetProcAddress (kernel32, "ExitProcess")
54 th, tid = win32process.CreateRemoteThread (dupproc, None, 0, exitprocess, code, 0)
55 win32api.CloseHandle (th)
56 result = True
57 else:
58 result = True
59 # except failed to get exit code? failed to get module handle?
60 finally:
61 win32api.CloseHandle (dupproc)
62 return result
63 else:
64 return proc.kill ()
diff --git a/contrib/testbed_perfhacks.patch b/contrib/testbed_perfhacks.patch
deleted file mode 100644
index 1ad524a30..000000000
--- a/contrib/testbed_perfhacks.patch
+++ /dev/null
@@ -1,90 +0,0 @@
1Index: src/include/gnunet_constants.h
2===================================================================
3--- src/include/gnunet_constants.h (revision 26030)
4+++ src/include/gnunet_constants.h (working copy)
5@@ -49,7 +49,7 @@
6 * After how long do we consider a connection to a peer dead
7 * if we don't receive messages from the peer?
8 */
9-#define GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MINUTES, 5)
10+#define GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_YEARS, 5)
11
12 /**
13 * How long do we delay reading more from a peer after a quota violation?
14@@ -61,7 +61,7 @@
15 * even if we assume that the service commonly does not
16 * respond instantly (DNS, Database, etc.).
17 */
18-#define GNUNET_CONSTANTS_SERVICE_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MINUTES, 10)
19+#define GNUNET_CONSTANTS_SERVICE_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_YEARS, 10)
20
21 /**
22 * How long do we delay messages to get larger packet sizes (CORKing)?
23Index: src/transport/gnunet-service-transport_neighbours.c
24===================================================================
25--- src/transport/gnunet-service-transport_neighbours.c (revision 26030)
26+++ src/transport/gnunet-service-transport_neighbours.c (working copy)
27@@ -65,7 +65,7 @@
28 * send 3 keepalives in each interval, so 3 messages would need to be
29 * lost in a row for a disconnect).
30 */
31-#define KEEPALIVE_FREQUENCY GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 100)
32+#define KEEPALIVE_FREQUENCY GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_YEARS, 100)
33
34 /**
35 * How long are we willing to wait for a response from ATS before timing out?
36Index: src/transport/gnunet-service-transport_validation.c
37===================================================================
38--- src/transport/gnunet-service-transport_validation.c (revision 26030)
39+++ src/transport/gnunet-service-transport_validation.c (working copy)
40@@ -43,7 +43,7 @@
41 * OTOH, we don't want to spend too much time generating PONG signatures,
42 * so they must have some lifetime to reduce our CPU usage.
43 */
44-#define PONG_SIGNATURE_LIFETIME GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_HOURS, 1)
45+#define PONG_SIGNATURE_LIFETIME GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_HOURS, 12)
46
47 /**
48 * After how long do we expire an address in a HELLO that we just
49@@ -58,24 +58,24 @@
50 * we cannot validate (because after this time we can destroy the
51 * validation record).
52 */
53-#define UNVALIDATED_PING_KEEPALIVE GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MINUTES, 5)
54+#define UNVALIDATED_PING_KEEPALIVE GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_HOURS, 4)
55
56 /**
57 * How often do we PING an address that we have successfully validated
58 * in the past but are not actively using? Should be (significantly)
59 * smaller than HELLO_ADDRESS_EXPIRATION.
60 */
61-#define VALIDATED_PING_FREQUENCY GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MINUTES, 15)
62+#define VALIDATED_PING_FREQUENCY GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_HOURS, 6)
63
64 /**
65 * How often do we PING an address that we are currently using?
66 */
67-#define CONNECTED_PING_FREQUENCY GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MINUTES, 2)
68+#define CONNECTED_PING_FREQUENCY GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_YEARS, 2)
69
70 /**
71 * How much delay is acceptable for sending the PING or PONG?
72 */
73-#define ACCEPTABLE_PING_DELAY GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 1)
74+#define ACCEPTABLE_PING_DELAY GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MINUTES, 1)
75
76 /**
77 * Size of the validation map hashmap.
78@@ -745,9 +745,9 @@
79 void
80 GST_validation_start (unsigned int max_fds)
81 {
82- validation_next = GNUNET_TIME_absolute_get();
83- validation_delay.rel_value = (GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT.rel_value) / max_fds;
84- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Delay between validations: %u ms\n ", validation_delay.rel_value);
85+ validation_next = GNUNET_TIME_absolute_get();
86+ validation_delay.rel_value = GNUNET_TIME_UNIT_MILLISECONDS.rel_value;
87+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Delay between validations: %u ms\n ", validation_delay.rel_value);
88 validation_map = GNUNET_CONTAINER_multihashmap_create (VALIDATION_MAP_SIZE,
89 GNUNET_NO);
90 pnc = GNUNET_PEERINFO_notify (GST_cfg, &process_peerinfo_hello, NULL);
diff --git a/contrib/testbed_setup_pre_ecc_tree.sh b/contrib/testbed_setup_pre_ecc_tree.sh
deleted file mode 100755
index 4c6920144..000000000
--- a/contrib/testbed_setup_pre_ecc_tree.sh
+++ /dev/null
@@ -1,9 +0,0 @@
1#!/bin/sh
2
3svn up -r26032
4svn up -r26167 src/nse/
5svn up -r26079 src/include/gnunet_helper_lib.h src/util/helper.c
6svn up -r26219 src/include/gnunet_protocols.h
7svn up src/include/gnunet_testbed_service.h src/testbed/ src/regex/ src/dht/
8svn up contrib
9svn up configure.ac
diff --git a/contrib/testing_hostkeys.ecc b/contrib/testing_hostkeys.ecc
index 23e5d3379..194d0da78 100644
--- a/contrib/testing_hostkeys.ecc
+++ b/contrib/testing_hostkeys.ecc
Binary files differ
diff --git a/contrib/transpot_delay.patch b/contrib/transpot_delay.patch
deleted file mode 100644
index 9ba806960..000000000
--- a/contrib/transpot_delay.patch
+++ /dev/null
@@ -1,77 +0,0 @@
1Index: src/transport/gnunet-service-transport_neighbours.c
2===================================================================
3--- src/transport/gnunet-service-transport_neighbours.c (revision 27335)
4+++ src/transport/gnunet-service-transport_neighbours.c (working copy)
5@@ -65,7 +65,7 @@
6 * send 3 keepalives in each interval, so 3 messages would need to be
7 * lost in a row for a disconnect).
8 */
9-#define KEEPALIVE_FREQUENCY GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 100)
10+#define KEEPALIVE_FREQUENCY GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_YEARS, 100)
11
12 /**
13 * How long are we willing to wait for a response from ATS before timing out?
14Index: src/transport/gnunet-service-transport_validation.c
15===================================================================
16--- src/transport/gnunet-service-transport_validation.c (revision 27335)
17+++ src/transport/gnunet-service-transport_validation.c (working copy)
18@@ -42,7 +42,7 @@
19 * OTOH, we don't want to spend too much time generating PONG signatures,
20 * so they must have some lifetime to reduce our CPU usage.
21 */
22-#define PONG_SIGNATURE_LIFETIME GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_HOURS, 1)
23+#define PONG_SIGNATURE_LIFETIME GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_HOURS, 12)
24
25 /**
26 * After how long do we expire an address in a HELLO that we just
27@@ -57,24 +57,24 @@
28 * we cannot validate (because after this time we can destroy the
29 * validation record).
30 */
31-#define UNVALIDATED_PING_KEEPALIVE GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MINUTES, 5)
32+#define UNVALIDATED_PING_KEEPALIVE GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_HOURS, 4)
33
34 /**
35 * How often do we PING an address that we have successfully validated
36 * in the past but are not actively using? Should be (significantly)
37 * smaller than HELLO_ADDRESS_EXPIRATION.
38 */
39-#define VALIDATED_PING_FREQUENCY GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MINUTES, 15)
40+#define VALIDATED_PING_FREQUENCY GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_HOURS, 6)
41
42 /**
43 * How often do we PING an address that we are currently using?
44 */
45-#define CONNECTED_PING_FREQUENCY GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MINUTES, 2)
46+#define CONNECTED_PING_FREQUENCY GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_YEARS, 2)
47
48 /**
49 * How much delay is acceptable for sending the PING or PONG?
50 */
51-#define ACCEPTABLE_PING_DELAY GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 1)
52+#define ACCEPTABLE_PING_DELAY GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MINUTES, 1)
53
54 /**
55 * Size of the validation map hashmap.
56Index: src/include/gnunet_constants.h
57===================================================================
58--- src/include/gnunet_constants.h (revision 27335)
59+++ src/include/gnunet_constants.h (working copy)
60@@ -49,7 +49,7 @@
61 * After how long do we consider a connection to a peer dead
62 * if we don't receive messages from the peer?
63 */
64-#define GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MINUTES, 5)
65+#define GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_YEARS, 5)
66
67 /**
68 * How long do we delay reading more from a peer after a quota violation?
69@@ -61,7 +61,7 @@
70 * even if we assume that the service commonly does not
71 * respond instantly (DNS, Database, etc.).
72 */
73-#define GNUNET_CONSTANTS_SERVICE_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MINUTES, 10)
74+#define GNUNET_CONSTANTS_SERVICE_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_YEARS, 10)
75
76 /**
77 * How long do we delay messages to get larger packet sizes (CORKing)?
diff --git a/contrib/log.php b/contrib/web/log.php
index b2ca9ed6c..b2ca9ed6c 100644
--- a/contrib/log.php
+++ b/contrib/web/log.php
diff --git a/doc/Makefile.am b/doc/Makefile.am
index 28db606c5..1070974d1 100644
--- a/doc/Makefile.am
+++ b/doc/Makefile.am
@@ -7,4 +7,4 @@ if !DOCUMENTATION
7endif 7endif
8 8
9EXTRA_DIST = \ 9EXTRA_DIST = \
10 outdated-and-old-installation-instructions.txt 10 outdated-and-old-installation-instructions.txt
diff --git a/doc/documentation/.gitignore b/doc/documentation/.gitignore
index 2e914d9c9..f490c3412 100644
--- a/doc/documentation/.gitignore
+++ b/doc/documentation/.gitignore
@@ -1,2 +1,9 @@
1stamp-1 1stamp-1
2version2.texi 2version2.texi
3manual
4*.fn
5*.fns
6*.ky
7*.pg
8*.tp
9*.vr
diff --git a/doc/documentation/README.txt b/doc/documentation/README.txt
deleted file mode 100644
index 9e76394c3..000000000
--- a/doc/documentation/README.txt
+++ /dev/null
@@ -1,63 +0,0 @@
1* Completion Levels:
2
3** chapters/philosophy: around 100% fixed after initial export.
4
5* What's left to do
6
7- Which Texlive modules are needed? Decrease the size.
8 - distro specific, or can we set requirements?
9- Update the content of gnunet documentation.
10- XXX: images are only generated for the html documentation
11 with gendoc.sh … FIXME!
12- XXX: png,dot, and svg images MUST be converted to eps by the
13 build system. Right now they aren't, as a result: No images.
14
15* How to use (hack) on this
16
17** with guix
18
19Adjust accordingly, ie read the Guix Documentation:
20setenv GUIX_PACKAGE_PATH "gnunet/contrib/packages/guix/packages"
21guix environment gnunet-doc
22and
23guix build -f contrib/packages/guix/gnunet-doc.scm
24
25** without guix
26
27You need to have Texinfo and Texlive in your path.
28sh bootstrap
29./configure --enable-documentation
30cd doc
31make (format you want)
32
33for example: make html, make info, make pdf
34
35* structure (relations)
36
37** gnunet.texi
38 -> chapters/developer.texi
39 -> chapters/installation.texi
40 -> chapters/philosophy.texi
41 -> chapters/user.texi
42 -> chapters/vocabulary.texi
43 -> images/*
44 -> gpl-3.0.texi
45 -> fdl-1.3.texi
46
47** gnunet-c-tutorial.texi
48 -> figs/Service.pdf
49 -> figs/System.pdf
50 -> tutorial-examples/*.c
51 -> gpl-3.0.texi
52 -> fdl-1.3.texi
53
54- gnunet-c-tutorial-v1.pdf: original LaTeX "gnunet-c-tutorial.pdf".
55- man folder: the man pages.
56- doxygen folder
57- outdated-and-old-installation-instructions.txt: self described within the file.
58
59
60Use `gendocs', add to the manual/ directory of the web site.
61
62 $ cd doc
63 $ gendocs.sh gnunet "GNUnet 0.10.X Reference Manual"
diff --git a/doc/documentation/TODO b/doc/documentation/TODO
new file mode 100644
index 000000000..fa1ce7a23
--- /dev/null
+++ b/doc/documentation/TODO
@@ -0,0 +1,106 @@
1-*- mode: org -*-
2
3TODO - or: the Documentation Masterplan.
4
5To some extent this duplicates the Mantis tickets on this topic.
6
7* Motivation
8My motivation is to read into good documentations and create a self-contained collection of books,
9which can be understood without expecting too much background knowledge in every topic.
10** User Handbook:
11The content of the User book should be mostly concerned with our current and future graphical (gtk
12as well as terminal user interface) applications. After reading Preface and maybe Philosophy, the
13person reading the User Handbook should understand with the least possible strugle the application
14they intend to use. Examples should be given and concepts explained.
15** Installation Handbook:
16As seen with requests on the mailinglist, we will have to pick up people where they are, similar
17to the User Handbook. People already used to compiling and installing should have the chance to
18skip to the end, everyone else should: have step-by-step instructions, which will either already
19include OS specific notes or will be followed by OS specific instructions. It is up for discussion
20if configuring GNUnet is 'User Handbook' or 'Installation Handbook', the current mixture in
21the Installation Handbook is not good.
22** Contributors Handbook:
23This chapter could either be reduced to a couple of sections following the theme of 'contributing
24to GNUnet' or the chapter could be extended. If we extend it, we should explain a range of topics
25that can be useful for contributors. It can be understood as a recommended reading in addition to
26the Developer Handbook then, and the Developer Handbook could simply become a better commented
27reference for the code-base.
28** Developer Handbook:
29As outlined in the last sentences, the Developer Handbook could be reduced to the necessary bits
30with enough comments to be understood without reading into the papers published over the years.
31
32
33* DONE 1. Drupal books export to LaTeX.
34* DONE 2. LaTeX conversion to Texinfo.
35* DONE 3. (initial) Fixup of syntax errors introduced in conversion chain.
36* TODO 4. Update content.
37* TODO 5. Create API Reference or similar
38* TODO 6. Create Concept Index
39* TODO 7. Create Procedure Index
40* TODO 8. Create Type Index
41* TODO 9. Create Functions Index
42* TODO 10. Properly address concerns and criticism people had/have on the old and current documentation.
43* TODO 11. Reorder structure
44* TODO more TODO.
45
46
47* Status Progress / Completion Levels
48
49** chapters/philosophy: around 100% fixed after initial export.
50
51* System Integration Tasks
52
53* Which Texlive modules are needed for every output we generate?
54* Generate the images from their dot sources.
55
56* How to use (hack) on this
57
58This section will find its way into the documentation sooner or later.
59Potentially outdated or inaccurate bits.
60
61** with guix
62
63Adjust accordingly, ie read the Guix Documentation:
64guix environment gnunet-doc
65and
66guix build -f contrib/packages/guix/gnunet-doc.scm
67
68** without guix
69
70You need to have Texinfo and Texlive in your path.
71sh bootstrap
72./configure --enable-documentation
73cd doc
74make (format you want)
75
76for example: make html, make info, make pdf
77
78* structure (relations) (old!)
79
80** gnunet.texi
81 -> chapters/developer.texi
82 -> chapters/installation.texi
83 -> chapters/philosophy.texi
84 -> chapters/user.texi
85 -> chapters/vocabulary.texi
86 -> images/*
87 -> gpl-3.0.texi
88 -> fdl-1.3.texi
89
90** gnunet-c-tutorial.texi
91 -> figs/Service.pdf
92 -> figs/System.pdf
93 -> tutorial-examples/*.c
94 -> gpl-3.0.texi
95 -> fdl-1.3.texi
96
97- gnunet-c-tutorial-v1.pdf: original LaTeX "gnunet-c-tutorial.pdf".
98- man folder: the man pages.
99- doxygen folder
100- outdated-and-old-installation-instructions.txt: self described within the file.
101
102
103Use `gendocs', add to the manual/ directory of the web site.
104
105 $ cd doc
106 $ gendocs.sh gnunet "GNUnet 0.10.X Reference Manual"
diff --git a/doc/documentation/chapters/installation.texi b/doc/documentation/chapters/installation.texi
index f2042033e..665f980be 100644
--- a/doc/documentation/chapters/installation.texi
+++ b/doc/documentation/chapters/installation.texi
@@ -19,6 +19,7 @@ it in the form of new chapters or insightful comments.
19* Build instructions for Debian 7.5:: 19* Build instructions for Debian 7.5::
20* Installing GNUnet from Git on Ubuntu 14.4:: 20* Installing GNUnet from Git on Ubuntu 14.4::
21* Build instructions for Debian 8:: 21* Build instructions for Debian 8::
22* Build instructions for macOS::
22@c * Build instructions for OpenBSD 6.2:: 23@c * Build instructions for OpenBSD 6.2::
23* Outdated build instructions for previous revisions:: 24* Outdated build instructions for previous revisions::
24@c * Portable GNUnet:: 25@c * Portable GNUnet::
@@ -1472,6 +1473,59 @@ with the default Sqlite database. Sqlite is usually fine for most
1472applications, but MySQL can offer better performance and Postgres better 1473applications, but MySQL can offer better performance and Postgres better
1473resillience. 1474resillience.
1474 1475
1476@node Build instructions for macOS
1477@section Build instructions for macOS
1478@c FIXME: I -> we
1479
1480These are the installation guidelines for macOS.
1481They were tested on macOS High Sierra.
1482
1483@menu
1484* Installing dependencies::
1485* Compile from Source::
1486@end menu
1487
1488@node Installing dependencies
1489@subsection Installing dependencies
1490
1491First, install XCode in the newest version.
1492See https://developer.apple.com/xcode/.
1493
1494Install Homebrew (https://brew.sh) and then install the dependencies listed above.
1495If a dependency does not exists in brew, you need to compile it from source.
1496
1497@example
1498# brew install <dependency>
1499@end example
1500
1501@node Compile from Source
1502@subsection Compile from Source
1503
1504Before you start building GNUnet, you need to setup your environment.
1505This means that you have to make sure the proper tools are used in the build process.
1506For example, after installing texinfo you need to make sure the new texinfo is actually used:
1507
1508@example
1509# echo 'export PATH="/usr/local/opt/texinfo/bin:$PATH"' >> ~/.bash_profile
1510@end example
1511
1512Note: brew tells you the appropriate command when executing
1513
1514@example
1515# brew info texinfo
1516@end example
1517
1518This may also be necessary for the gettext package.
1519
1520Before you start compiling, you need to make sure gcc is used and not the clang compile of your macOS system.
1521On my system, gcc was actually ``gcc-7'' and gcc pointed to the clang compiler.
1522
1523@example
1524# export CC=gcc-7
1525@end example
1526
1527After this the standard compile instructions apply.
1528
1475@c @node Build instructions for OpenBSD 6.2 1529@c @node Build instructions for OpenBSD 6.2
1476@c @section Build instructions for OpenBSD 6.2 1530@c @section Build instructions for OpenBSD 6.2
1477 1531
diff --git a/doc/documentation/gnunet-c-tutorial.texi b/doc/documentation/gnunet-c-tutorial.texi
index 7eafa9ea9..0e2adaee7 100644
--- a/doc/documentation/gnunet-c-tutorial.texi
+++ b/doc/documentation/gnunet-c-tutorial.texi
@@ -10,7 +10,7 @@
10@include version2.texi 10@include version2.texi
11 11
12@copying 12@copying
13Copyright @copyright{} 2001-2017 GNUnet e.V. 13Copyright @copyright{} 2001-2018 GNUnet e.V.
14 14
15Permission is granted to copy, distribute and/or modify this document 15Permission is granted to copy, distribute and/or modify this document
16under the terms of the GNU Free Documentation License, Version 1.3 or 16under the terms of the GNU Free Documentation License, Version 1.3 or
@@ -68,9 +68,10 @@ dependencies can be found on our website at
68Reference Documentation (GNUnet Handbook). 68Reference Documentation (GNUnet Handbook).
69 69
70Please read this tutorial carefully since every single step is 70Please read this tutorial carefully since every single step is
71important and do not hesitate to contact the GNUnet team if you have 71important, and do not hesitate to contact the GNUnet team if you have
72any questions or problems! Check here how to contact the GNUnet 72any questions or problems! Visit this link in your webbrowser to learn
73team: @uref{https://gnunet.org/contact_information} 73how to contact the GNUnet team:
74@uref{https://gnunet.org/contact_information}
74 75
75@menu 76@menu
76 77
@@ -151,7 +152,7 @@ $ gpg --verify-files gnunet-@value{VERSION}.tar.gz.sig
151 152
152@noindent 153@noindent
153If this command fails because you do not have the required public key, 154If this command fails because you do not have the required public key,
154then you need to run this command to import it: 155then you need to run the following command to import it:
155 156
156@example 157@example
157$ gpg --keyserver keys.gnupg.net --recv-keys 48426C7E 158$ gpg --keyserver keys.gnupg.net --recv-keys 48426C7E
@@ -167,19 +168,22 @@ revoked}. You will get an error message stating that
167The next release of GNUnet will have a valid signature 168The next release of GNUnet will have a valid signature
168again. We are sorry for the inconvenience this causes. 169again. We are sorry for the inconvenience this causes.
169Another possible source you could use is our 170Another possible source you could use is our
170"gnunet" git repository which has mandatory signed commits 171"gnunet" git repository which, since the change from SVN to git in 2016,
171by every developer. 172has mandatory signed commits by every developer.
172 173
173Now you can extract the tarball and rename the resulting 174After verifying the signature you can extract the tarball.
174directory to @file{gnunet} which we will be using in the 175The resulting directory will be renamed to @file{gnunet}, which we will
175remainder of this document. 176be using in the remainder of this document to refer to the
177root of the source directory.
176 178
177@example 179@example
178$ tar xvzf gnunet-@value{VERSION}.tar.gz 180$ tar xvzf gnunet-@value{VERSION}.tar.gz
179$ mv gnunet-@value{VERSION} gnunet 181$ mv gnunet-@value{VERSION} gnunet
180$ cd gnunet
181@end example 182@end example
182 183
184@c FIXME: This can be irritating for the reader - First we say git should
185@c be avoid unless it is really required, and then we write this
186@c paragraph:
183@noindent 187@noindent
184However, please note that stable versions can be very outdated. 188However, please note that stable versions can be very outdated.
185As a developer you are @b{strongly} encouraged to use the version 189As a developer you are @b{strongly} encouraged to use the version
@@ -192,32 +196,40 @@ To successfully compile GNUnet, you need the tools to build GNUnet and
192the required dependencies. Please take a look at the 196the required dependencies. Please take a look at the
193GNUnet Reference Documentation 197GNUnet Reference Documentation
194(@pxref{Dependencies, The GNUnet Reference Documentation,, gnunet, The GNUnet Reference Documentation}) 198(@pxref{Dependencies, The GNUnet Reference Documentation,, gnunet, The GNUnet Reference Documentation})
195for a list of required dependencies 199for a list of required dependencies and
196and
197(@pxref{Generic installation instructions, The GNUnet Reference Documentation,, gnunet, The GNUnet Reference Documentation}) 200(@pxref{Generic installation instructions, The GNUnet Reference Documentation,, gnunet, The GNUnet Reference Documentation})
198read its Installation chapter for specific instructions for 201read its Installation chapter for specific instructions for
199your operating system. 202your Operating System.
200Please check the notes at the end of the configure process about 203Please check the notes at the end of the configure process about
201required dependencies. 204required dependencies.
202 205
203For GNUnet bootstrapping support and the HTTP(S) plugin you should 206For GNUnet bootstrapping support and the HTTP(S) plugin you should
204install @uref{https://gnunet.org/gnurl, libgnurl}. 207install @uref{https://gnunet.org/gnurl, libgnurl}.
205For the filesharing service you should install at least one of the 208For the filesharing service you should install at least one of the
206datastore backends. MySQL, SQlite and PostgreSQL are supported. 209datastore backends (MySQL, SQlite and PostgreSQL are supported).
207 210
208@node Obtaining the latest version from Git 211@node Obtaining the latest version from Git
209@section Obtaining the latest version from Git 212@section Obtaining the latest version from Git
210 213
211The latest development version can obtained from our Git repository. 214The latest development version can be obtained from our Git repository.
212To obtain the code you need to have @code{Git} installed, which is 215To get the code you need to have @code{Git} installed. Usually your
213required for obtaining the repository via: 216Operating System package manager should provide a suitable distribution
217of git (otherwise check out Guix or Nix). If you are using an Operating
218System based on Debian's apt:
219
220@example
221$ sudo apt-get install git
222@end example
223
224This is required for obtaining the repository, which is achieved with
225the following command:
214 226
215@example 227@example
216$ git clone https://gnunet.org/git/gnunet 228$ git clone https://gnunet.org/git/gnunet
217@end example 229@end example
218 230
219@noindent 231@noindent
220After cloning the repository you have to execute the @file{bootstrap} 232After cloning the repository, you have to execute the @file{bootstrap}
221script in the new directory: 233script in the new directory:
222 234
223@example 235@example
@@ -275,6 +287,7 @@ you do not specifiy a prefix, GNUnet is installed in the directory
275to enable verbose logging by adding @code{--enable-logging=verbose}: 287to enable verbose logging by adding @code{--enable-logging=verbose}:
276 288
277@example 289@example
290$ export PREFIX=$HOME
278$ ./configure --prefix=$PREFIX --enable-logging 291$ ./configure --prefix=$PREFIX --enable-logging
279$ make 292$ make
280$ make install 293$ make install
@@ -303,11 +316,14 @@ binaries and run GNUnet's self check.
303 316
304@example 317@example
305$ which gnunet-arm 318$ which gnunet-arm
319$PREFIX/bin/gnunet-arm
306@end example 320@end example
307 321
308@noindent 322@noindent
309should return $PREFIX/bin/gnunet-arm. It should be located in your 323should return $PREFIX/bin/gnunet-arm (where $PREFIX is the location
324you have set earlier). It should be located in your
310GNUnet installation and the output should not be empty. 325GNUnet installation and the output should not be empty.
326
311If you see an output like: 327If you see an output like:
312 328
313@example 329@example
@@ -318,9 +334,11 @@ $ which gnunet-arm
318check your PATH variable to ensure GNUnet's @file{bin} directory is 334check your PATH variable to ensure GNUnet's @file{bin} directory is
319included. 335included.
320 336
321GNUnet provides tests for all of its subcomponents. Run 337GNUnet provides tests for all of its subcomponents. Assuming you have
338successfully built GNUnet, run
322 339
323@example 340@example
341$ cd gnunet
324$ make check 342$ make check
325@end example 343@end example
326 344
@@ -387,7 +405,7 @@ a mesh on top of a DHT).
387@c \end{figure} 405@c \end{figure}
388 406
389The main service implementation runs as a standalone process in the 407The main service implementation runs as a standalone process in the
390operating system and the client code runs as part of the client program, 408Operating System and the client code runs as part of the client program,
391so crashes of a client do not affect the service process or other clients. 409so crashes of a client do not affect the service process or other clients.
392The service and the clients communicate via a message protocol to be 410The service and the clients communicate via a message protocol to be
393defined and implemented by the programmer. 411defined and implemented by the programmer.
diff --git a/guix-env.scm b/guix-env.scm
index 213b2769e..11e5451e2 100644
--- a/guix-env.scm
+++ b/guix-env.scm
@@ -134,8 +134,6 @@
134 (modify-phases %standard-phases 134 (modify-phases %standard-phases
135 (add-after 'unpack 'patch-bin-sh 135 (add-after 'unpack 'patch-bin-sh
136 (lambda _ 136 (lambda _
137 (substitute* "bootstrap"
138 (("contrib/pogen.sh") "sh contrib/pogen.sh"))
139 (for-each (lambda (f) (chmod f #o755)) 137 (for-each (lambda (f) (chmod f #o755))
140 (find-files "po" "")) 138 (find-files "po" ""))
141 #t)) 139 #t))
diff --git a/pkgconfig/gnunetgns.pc.in b/pkgconfig/gnunetgns.pc.in
index fa0f8eac8..f7e7c6143 100644
--- a/pkgconfig/gnunetgns.pc.in
+++ b/pkgconfig/gnunetgns.pc.in
@@ -8,5 +8,5 @@ Description: Provides API to access the GNUnet Naming System
8URL: http://gnunet.org 8URL: http://gnunet.org
9Version: @VERSION@ 9Version: @VERSION@
10Requires: 10Requires:
11Libs: -L${libdir} -lgnunetgns 11Libs: -L${libdir} -lgnunetgns -lgnunetgnsrecord
12Cflags: -I${includedir} 12Cflags: -I${includedir}
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 50cf97613..120e3be78 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -119,7 +119,7 @@ src/dns/gnunet-dns-monitor.c
119src/dns/gnunet-dns-redirector.c 119src/dns/gnunet-dns-redirector.c
120src/dns/gnunet-helper-dns.c 120src/dns/gnunet-helper-dns.c
121src/dns/gnunet-service-dns.c 121src/dns/gnunet-service-dns.c
122src/dns/gnunet-zoneimport.c 122src/dns/gnunet-zonewalk.c
123src/dns/plugin_block_dns.c 123src/dns/plugin_block_dns.c
124src/dv/dv_api.c 124src/dv/dv_api.c
125src/dv/gnunet-dv.c 125src/dv/gnunet-dv.c
@@ -172,6 +172,7 @@ src/gns/gns_api.c
172src/gns/gns_tld_api.c 172src/gns/gns_tld_api.c
173src/gns/gnunet-bcd.c 173src/gns/gnunet-bcd.c
174src/gns/gnunet-dns2gns.c 174src/gns/gnunet-dns2gns.c
175src/gns/gnunet-gns-benchmark.c
175src/gns/gnunet-gns-helper-service-w32.c 176src/gns/gnunet-gns-helper-service-w32.c
176src/gns/gnunet-gns-import.c 177src/gns/gnunet-gns-import.c
177src/gns/gnunet-gns-proxy.c 178src/gns/gnunet-gns-proxy.c
@@ -350,6 +351,8 @@ src/social/gnunet-service-social.c
350src/social/gnunet-social.c 351src/social/gnunet-social.c
351src/social/social_api.c 352src/social/social_api.c
352src/sq/sq.c 353src/sq/sq.c
354src/sq/sq_exec.c
355src/sq/sq_prepare.c
353src/sq/sq_query_helper.c 356src/sq/sq_query_helper.c
354src/sq/sq_result_helper.c 357src/sq/sq_result_helper.c
355src/statistics/gnunet-service-statistics.c 358src/statistics/gnunet-service-statistics.c
@@ -454,6 +457,7 @@ src/util/container_multihashmap32.c
454src/util/container_multipeermap.c 457src/util/container_multipeermap.c
455src/util/container_multishortmap.c 458src/util/container_multishortmap.c
456src/util/crypto_abe.c 459src/util/crypto_abe.c
460src/util/crypto_bug.c
457src/util/crypto_crc.c 461src/util/crypto_crc.c
458src/util/crypto_ecc.c 462src/util/crypto_ecc.c
459src/util/crypto_ecc_dlog.c 463src/util/crypto_ecc_dlog.c
@@ -507,6 +511,7 @@ src/vpn/gnunet-helper-vpn.c
507src/vpn/gnunet-service-vpn.c 511src/vpn/gnunet-service-vpn.c
508src/vpn/gnunet-vpn.c 512src/vpn/gnunet-vpn.c
509src/vpn/vpn_api.c 513src/vpn/vpn_api.c
514src/zonemaster/gnunet-service-zonemaster-monitor.c
510src/zonemaster/gnunet-service-zonemaster.c 515src/zonemaster/gnunet-service-zonemaster.c
511src/fs/fs_api.h 516src/fs/fs_api.h
512src/include/gnunet_common.h 517src/include/gnunet_common.h
diff --git a/po/update.pl b/po/update.pl.in
index c7c34b612..7b7af52ef 100644
--- a/po/update.pl
+++ b/po/update.pl.in
@@ -1,4 +1,4 @@
1#!/usr/bin/perl -w 1#!@PERL@ -w
2 2
3# GNOME po update utility. 3# GNOME po update utility.
4# (C) 2000 The Free Software Foundation 4# (C) 2000 The Free Software Foundation
diff --git a/pre-commit b/pre-commit
index 5213f2cf4..777728a6b 100755
--- a/pre-commit
+++ b/pre-commit
@@ -12,8 +12,8 @@ find $PATHS -name "*.c" -exec indent {} \;
12find $PATHS -name "*.h" -exec indent {} \; 12find $PATHS -name "*.h" -exec indent {} \;
13find $PATHS -name "*.c" -exec indent {} \; 13find $PATHS -name "*.c" -exec indent {} \;
14find $PATHS -name "*.h" -exec indent {} \; 14find $PATHS -name "*.h" -exec indent {} \;
15find $PATHS -name "*.c" -exec contrib/removetrailingwhitespace {} \; 15find $PATHS -name "*.c" -exec contrib/removetrailingwhitespace.py {} \;
16find $PATHS -name "*.h" -exec contrib/removetrailingwhitespace {} \; 16find $PATHS -name "*.h" -exec contrib/removetrailingwhitespace.py {} \;
17if test -x "`which 'dos2unix'`" 17if test -x "`which 'dos2unix'`"
18then 18then
19 find $PATHS -name "*.c" -exec dos2unix {} \; 19 find $PATHS -name "*.c" -exec dos2unix {} \;
diff --git a/src/arm/test_arm_api_data.conf b/src/arm/test_arm_api_data.conf
index 57799ccc8..b032cc95a 100644
--- a/src/arm/test_arm_api_data.conf
+++ b/src/arm/test_arm_api_data.conf
@@ -1,5 +1,5 @@
1@INLINE@ ../../contrib/no_forcestart.conf 1@INLINE@ ../../contrib/conf/gnunet/no_forcestart.conf
2@INLINE@ ../../contrib/no_autostart_above_core.conf 2@INLINE@ ../../contrib/conf/gnunet/no_autostart_above_core.conf
3 3
4[PATHS] 4[PATHS]
5GNUNET_TEST_HOME = $GNUNET_TMP/test-gnunet-arm/ 5GNUNET_TEST_HOME = $GNUNET_TMP/test-gnunet-arm/
diff --git a/src/arm/test_gnunet_arm.py.in b/src/arm/test_gnunet_arm.py.in
index cdd69251b..10bb58a9c 100644
--- a/src/arm/test_gnunet_arm.py.in
+++ b/src/arm/test_gnunet_arm.py.in
@@ -7,100 +7,107 @@ import re
7import subprocess 7import subprocess
8import time 8import time
9 9
10# FIXME: There's too much repetition, move generally used parts into reusable modules.
10if os.name == "nt": 11if os.name == "nt":
11 tmp = os.getenv ("TEMP") 12 tmp = os.getenv("TEMP")
12else: 13else:
13 tmp = "/tmp" 14 tmp = "/tmp"
14 15
15if os.name == 'nt': 16if os.name == 'nt':
16 st = 'gnunet-statistics.exe' 17 st = 'gnunet-statistics.exe'
17 arm = './gnunet-arm.exe' 18 arm = './gnunet-arm.exe'
18else: 19else:
19 st = 'gnunet-statistics' 20 st = 'gnunet-statistics'
20 arm = './gnunet-arm' 21 arm = './gnunet-arm'
21 22
22run_arm = [arm, '-c', 'test_arm_api_data.conf', '--no-stdout', '--no-stderr'] 23run_arm = [arm, '-c', 'test_arm_api_data.conf', '--no-stdout', '--no-stderr']
23debug = os.getenv ('DEBUG') 24debug = os.getenv('DEBUG')
24if debug: 25if debug:
25 run_arm += [debug.split (' ')] 26 run_arm += [debug.split(' ')]
26 27
27def cleanup (): 28
28 shutil.rmtree (os.path.join (tmp, "test-gnunetd-arm"), True) 29def cleanup():
29 30 shutil.rmtree(os.path.join(tmp, "test-gnunetd-arm"), True)
30def sub_run (args, want_stdo = True, want_stde = False, nofail = False): 31
31 if want_stdo: 32
32 stdo = subprocess.PIPE 33def sub_run(args, want_stdo=True, want_stde=False, nofail=False):
33 else: 34 if want_stdo:
34 stdo = None 35 stdo = subprocess.PIPE
35 if want_stde: 36 else:
36 stde = subprocess.PIPE 37 stdo = None
37 else: 38 if want_stde:
38 stde = None 39 stde = subprocess.PIPE
39 p = subprocess.Popen (args, stdout = stdo, stderr = stde) 40 else:
40 stdo, stde = p.communicate () 41 stde = None
41 if not nofail: 42 p = subprocess.Popen(args, stdout=stdo, stderr=stde)
42 if p.returncode != 0: 43 stdo, stde = p.communicate()
43 sys.exit (p.returncode) 44 if not nofail:
44 return (p.returncode, stdo, stde) 45 if p.returncode != 0:
45 46 sys.exit(p.returncode)
46def fail (result): 47 return (p.returncode, stdo, stde)
47 print (result) 48
48 r_arm (['-e'], want_stdo = False) 49
49 sys.exit (1) 50def fail(result):
50 51 print(result)
51 52 r_arm(['-e'], want_stdo=False)
52def end_arm_failer (command, rc, stdo, stde, normal): 53 sys.exit(1)
53 if normal: 54
54 if rc != 0: 55
55 fail ("FAIL: error running {}\nCommand output was:\n{}\n{}".format (command, stdo, stde)) 56def end_arm_failer(command, rc, stdo, stde, normal):
56 else: 57 if normal:
57 if rc == 0: 58 if rc != 0:
58 fail ("FAIL: expected error while running {}\nCommand output was:\n{}\n{}".format (command, stdo, stde)) 59 fail("FAIL: error running {}\nCommand output was:\n{}\n{}".format(command, stdo, stde))
59 60 else:
60def print_only_failer (command, rc, stdo, stde, normal): 61 if rc == 0:
61 if normal: 62 fail("FAIL: expected error while running {}\nCommand output was:\n{}\n{}".format(command, stdo, stde))
62 if rc != 0: 63
63 print ("FAIL: error running {}\nCommand output was:\n{}\n{}".format (command, stdo, stde)) 64
64 sys.exit (1) 65def print_only_failer(command, rc, stdo, stde, normal):
65 else: 66 if normal:
66 if rc == 0: 67 if rc != 0:
67 print ("FAIL: expected error while running {}\nCommand output was:\n{}\n{}".format (command, stdo, stde)) 68 print("FAIL: error running {}\nCommand output was:\n{}\n{}".format(command, stdo, stde))
68 sys.exit (1) 69 sys.exit(1)
69 70 else:
70 71 if rc == 0:
71def r_something (to_run, extra_args, failer = None, normal = True, **kw): 72 print("FAIL: expected error while running {}\nCommand output was:\n{}\n{}".format(command, stdo, stde))
72 rc, stdo, stde = sub_run (to_run + extra_args, nofail = True, want_stde = True, **kw) 73 sys.exit(1)
73 if failer is not None: 74
74 failer (to_run + extra_args, rc, stdo, stde, normal) 75
75 return (rc, stdo, stde) 76def r_something(to_run, extra_args, failer=None, normal=True, **kw):
76 77 rc, stdo, stde = sub_run(to_run + extra_args, nofail=True, want_stde=True, **kw)
77def r_arm (extra_args, **kw): 78 if failer is not None:
78 return r_something (run_arm, extra_args, **kw) 79 failer(to_run + extra_args, rc, stdo, stde, normal)
79 80 return (rc, stdo, stde)
80cleanup () 81
81 82
82print ("TEST: Bad argument checking...", end='') 83def r_arm(extra_args, **kw):
83r_arm (['-x'], normal = False, failer = print_only_failer) 84 return r_something(run_arm, extra_args, **kw)
84print ("PASS") 85
85 86
86print ("TEST: Start ARM...", end='') 87cleanup()
87r_arm (['-s'], failer = print_only_failer) 88
88time.sleep (1) 89print("TEST: Bad argument checking...", end='')
89print ("PASS") 90r_arm(['-x'], normal=False, failer=print_only_failer)
90 91print("PASS")
91print ("TEST: Start another service...", end='') 92
92r_arm (['-i', 'resolver'], failer = end_arm_failer) 93print("TEST: Start ARM...", end='')
93time.sleep (1) 94r_arm(['-s'], failer=print_only_failer)
94print ("PASS") 95time.sleep(1)
95 96print("PASS")
96print ("TEST: Stop a service...", end='') 97
97r_arm (['-k', 'resolver'], failer = end_arm_failer) 98print("TEST: Start another service...", end='')
98time.sleep (1) 99r_arm(['-i', 'resolver'], failer=end_arm_failer)
99print ("PASS") 100time.sleep(1)
100 101print("PASS")
101print ("TEST: Stop ARM...", end='') 102
102r_arm (['-e'], failer = print_only_failer) 103print("TEST: Stop a service...", end='')
103time.sleep (1) 104r_arm(['-k', 'resolver'], failer=end_arm_failer)
104print ("PASS") 105time.sleep(1)
105 106print("PASS")
106cleanup () 107
108print("TEST: Stop ARM...", end='')
109r_arm(['-e'], failer=print_only_failer)
110time.sleep(1)
111print("PASS")
112
113cleanup()
diff --git a/src/ats-tests/template_perf_ats.conf b/src/ats-tests/template_perf_ats.conf
index 9d320c3dd..74f608bfb 100644
--- a/src/ats-tests/template_perf_ats.conf
+++ b/src/ats-tests/template_perf_ats.conf
@@ -1,4 +1,4 @@
1@INLINE@ ../../contrib/no_forcestart.conf 1@INLINE@ ../../contrib/conf/gnunet/no_forcestart.conf
2 2
3[testbed] 3[testbed]
4# How long should operations wait? 4# How long should operations wait?
diff --git a/src/ats/test_ats_api.conf b/src/ats/test_ats_api.conf
index e0cb495c8..d45e84d18 100644
--- a/src/ats/test_ats_api.conf
+++ b/src/ats/test_ats_api.conf
@@ -1,4 +1,4 @@
1@INLINE@ ../../contrib/no_forcestart.conf 1@INLINE@ ../../contrib/conf/gnunet/no_forcestart.conf
2 2
3[PATHS] 3[PATHS]
4GNUNET_TEST_HOME = $GNUNET_TMP/test-ats-api-scheduling/ 4GNUNET_TEST_HOME = $GNUNET_TMP/test-ats-api-scheduling/
diff --git a/src/ats/test_ats_api_delayed.conf b/src/ats/test_ats_api_delayed.conf
index f4d771448..3aac88cf9 100644
--- a/src/ats/test_ats_api_delayed.conf
+++ b/src/ats/test_ats_api_delayed.conf
@@ -1,4 +1,4 @@
1@INLINE@ ../../contrib/no_forcestart.conf 1@INLINE@ ../../contrib/conf/gnunet/no_forcestart.conf
2 2
3[PATHS] 3[PATHS]
4GNUNET_TEST_HOME = $GNUNET_TMP/test-ats-api-scheduling/ 4GNUNET_TEST_HOME = $GNUNET_TMP/test-ats-api-scheduling/
diff --git a/src/ats/test_ats_api_mlp.conf b/src/ats/test_ats_api_mlp.conf
index 6a8e24177..d5f05a3c4 100644
--- a/src/ats/test_ats_api_mlp.conf
+++ b/src/ats/test_ats_api_mlp.conf
@@ -1,4 +1,4 @@
1@INLINE@ ../../contrib/no_forcestart.conf 1@INLINE@ ../../contrib/conf/gnunet/no_forcestart.conf
2 2
3[PATHS] 3[PATHS]
4GNUNET_TEST_HOME = $GNUNET_TMP/test-ats-mlp/ 4GNUNET_TEST_HOME = $GNUNET_TMP/test-ats-mlp/
diff --git a/src/ats/test_ats_api_proportional.conf b/src/ats/test_ats_api_proportional.conf
index e121c14ea..21f8218ee 100644
--- a/src/ats/test_ats_api_proportional.conf
+++ b/src/ats/test_ats_api_proportional.conf
@@ -1,4 +1,4 @@
1@INLINE@ ../../contrib/no_forcestart.conf 1@INLINE@ ../../contrib/conf/gnunet/no_forcestart.conf
2 2
3[PATHS] 3[PATHS]
4GNUNET_TEST_HOME = $GNUNET_TMP/test-ats-proportional/ 4GNUNET_TEST_HOME = $GNUNET_TMP/test-ats-proportional/
diff --git a/src/ats/test_ats_api_ril.conf b/src/ats/test_ats_api_ril.conf
index d6f4f6101..5f5fb006b 100644
--- a/src/ats/test_ats_api_ril.conf
+++ b/src/ats/test_ats_api_ril.conf
@@ -1,4 +1,4 @@
1@INLINE@ ../../contrib/no_forcestart.conf 1@INLINE@ ../../contrib/conf/gnunet/no_forcestart.conf
2 2
3[PATHS] 3[PATHS]
4GNUNET_TEST_HOME = $GNUNET_TMP/test-ats-ril/ 4GNUNET_TEST_HOME = $GNUNET_TMP/test-ats-ril/
diff --git a/src/ats/test_ats_solver_default.conf b/src/ats/test_ats_solver_default.conf
index e419c8f35..2d8927abd 100644
--- a/src/ats/test_ats_solver_default.conf
+++ b/src/ats/test_ats_solver_default.conf
@@ -1,2 +1,2 @@
1@INLINE@ ../../contrib/no_forcestart.conf 1@INLINE@ ../../contrib/conf/gnunet/no_forcestart.conf
2 2
diff --git a/src/cadet/cadet_api.c b/src/cadet/cadet_api.c
index 3c142a95c..59f0bfe85 100644
--- a/src/cadet/cadet_api.c
+++ b/src/cadet/cadet_api.c
@@ -464,6 +464,10 @@ cadet_mq_send_now (void *cls)
464 } 464 }
465 ch->allow_send--; 465 ch->allow_send--;
466 ch->pending_env = NULL; 466 ch->pending_env = NULL;
467 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
468 "Sending message on channel %s to CADET, new window size is %u\n",
469 GNUNET_i2s (&ch->peer),
470 ch->allow_send);
467 GNUNET_MQ_send (ch->cadet->mq, 471 GNUNET_MQ_send (ch->cadet->mq,
468 env); 472 env);
469 GNUNET_MQ_impl_send_continue (ch->mq); 473 GNUNET_MQ_impl_send_continue (ch->mq);
@@ -781,6 +785,11 @@ handle_local_ack (void *cls,
781 return; 785 return;
782 } 786 }
783 ch->allow_send++; 787 ch->allow_send++;
788 LOG (GNUNET_ERROR_TYPE_DEBUG,
789 "Got an ACK on mq channel %X (peer %s); new window size is %u!\n",
790 ntohl (ch->ccn.channel_of_client),
791 GNUNET_i2s (&ch->peer),
792 ch->allow_send);
784 if (NULL == ch->pending_env) 793 if (NULL == ch->pending_env)
785 { 794 {
786 LOG (GNUNET_ERROR_TYPE_DEBUG, 795 LOG (GNUNET_ERROR_TYPE_DEBUG,
@@ -792,9 +801,6 @@ handle_local_ack (void *cls,
792 } 801 }
793 if (NULL != ch->mq_cont) 802 if (NULL != ch->mq_cont)
794 return; /* already working on it! */ 803 return; /* already working on it! */
795 LOG (GNUNET_ERROR_TYPE_DEBUG,
796 "Got an ACK on mq channel %X, sending pending message!\n",
797 ntohl (ch->ccn.channel_of_client));
798 ch->mq_cont 804 ch->mq_cont
799 = GNUNET_SCHEDULER_add_now (&cadet_mq_send_now, 805 = GNUNET_SCHEDULER_add_now (&cadet_mq_send_now,
800 ch); 806 ch);
@@ -992,6 +998,7 @@ check_get_tunnels (void *cls,
992{ 998{
993 size_t esize; 999 size_t esize;
994 1000
1001 (void) cls;
995 esize = ntohs (message->size); 1002 esize = ntohs (message->size);
996 if (sizeof (struct GNUNET_CADET_LocalInfoTunnel) == esize) 1003 if (sizeof (struct GNUNET_CADET_LocalInfoTunnel) == esize)
997 return GNUNET_OK; 1004 return GNUNET_OK;
@@ -1051,6 +1058,7 @@ check_get_tunnel (void *cls,
1051 size_t esize; 1058 size_t esize;
1052 size_t msize; 1059 size_t msize;
1053 1060
1061 (void) cls;
1054 /* Verify message sanity */ 1062 /* Verify message sanity */
1055 msize = ntohs (msg->header.size); 1063 msize = ntohs (msg->header.size);
1056 esize = sizeof (struct GNUNET_CADET_LocalInfoTunnel); 1064 esize = sizeof (struct GNUNET_CADET_LocalInfoTunnel);
@@ -1096,7 +1104,6 @@ handle_get_tunnel (void *cls,
1096 1104
1097 if (NULL == h->info_cb.tunnel_cb) 1105 if (NULL == h->info_cb.tunnel_cb)
1098 return; 1106 return;
1099
1100 ch_n = ntohl (msg->channels); 1107 ch_n = ntohl (msg->channels);
1101 c_n = ntohl (msg->connections); 1108 c_n = ntohl (msg->connections);
1102 1109
@@ -1191,13 +1198,8 @@ destroy_channel_cb (void *cls,
1191 /* struct GNUNET_CADET_Handle *handle = cls; */ 1198 /* struct GNUNET_CADET_Handle *handle = cls; */
1192 struct GNUNET_CADET_Channel *ch = value; 1199 struct GNUNET_CADET_Channel *ch = value;
1193 1200
1194 if (ntohl (ch->ccn.channel_of_client) >= GNUNET_CADET_LOCAL_CHANNEL_ID_CLI) 1201 (void) cls;
1195 { 1202 (void) cid;
1196 GNUNET_break (0);
1197 LOG (GNUNET_ERROR_TYPE_DEBUG,
1198 "channel %X not destroyed\n",
1199 ntohl (ch->ccn.channel_of_client));
1200 }
1201 GNUNET_log (GNUNET_ERROR_TYPE_INFO, 1203 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
1202 "Destroying channel due to GNUNET_CADET_disconnect()\n"); 1204 "Destroying channel due to GNUNET_CADET_disconnect()\n");
1203 destroy_channel (ch); 1205 destroy_channel (ch);
@@ -1222,6 +1224,7 @@ destroy_port_cb (void *cls,
1222 /* struct GNUNET_CADET_Handle *handle = cls; */ 1224 /* struct GNUNET_CADET_Handle *handle = cls; */
1223 struct GNUNET_CADET_Port *port = value; 1225 struct GNUNET_CADET_Port *port = value;
1224 1226
1227 (void) cls;
1225 /* This is a warning, the app should have cleanly closed all open ports */ 1228 /* This is a warning, the app should have cleanly closed all open ports */
1226 GNUNET_break (0); 1229 GNUNET_break (0);
1227 GNUNET_CADET_close_port (port); 1230 GNUNET_CADET_close_port (port);
diff --git a/src/cadet/cadet_protocol.h b/src/cadet/cadet_protocol.h
index de0cec5d0..d4a40f9e5 100644
--- a/src/cadet/cadet_protocol.h
+++ b/src/cadet/cadet_protocol.h
@@ -28,6 +28,14 @@
28#ifndef CADET_PROTOCOL_H_ 28#ifndef CADET_PROTOCOL_H_
29#define CADET_PROTOCOL_H_ 29#define CADET_PROTOCOL_H_
30 30
31/**
32 * At best, enable when debugging #5328!
33 */
34#define DEBUG_KX 0
35#if DEBUG_KX
36#warning NEVER run this in production! KX debugging is on!
37#endif
38
31#include "platform.h" 39#include "platform.h"
32#include "gnunet_util_lib.h" 40#include "gnunet_util_lib.h"
33#include "cadet.h" 41#include "cadet.h"
@@ -234,6 +242,22 @@ struct GNUNET_CADET_TunnelKeyExchangeMessage
234 */ 242 */
235 struct GNUNET_CRYPTO_EcdhePublicKey ephemeral_key; 243 struct GNUNET_CRYPTO_EcdhePublicKey ephemeral_key;
236 244
245#if DEBUG_KX
246 /**
247 * Sender's ephemeral public ECC key encoded in a
248 * format suitable for network transmission, as created
249 * using 'gcry_sexp_sprint'.
250 */
251 struct GNUNET_CRYPTO_EcdhePrivateKey ephemeral_key_XXX; // for debugging KX-crypto!
252
253 /**
254 * Sender's ephemeral public ECC key encoded in a
255 * format suitable for network transmission, as created
256 * using 'gcry_sexp_sprint'.
257 */
258 struct GNUNET_CRYPTO_EddsaPrivateKey private_key_XXX; // for debugging KX-crypto!
259#endif
260
237 /** 261 /**
238 * Sender's next ephemeral public ECC key encoded in a 262 * Sender's next ephemeral public ECC key encoded in a
239 * format suitable for network transmission, as created 263 * format suitable for network transmission, as created
@@ -256,6 +280,15 @@ struct GNUNET_CADET_TunnelKeyExchangeAuthMessage
256 */ 280 */
257 struct GNUNET_CADET_TunnelKeyExchangeMessage kx; 281 struct GNUNET_CADET_TunnelKeyExchangeMessage kx;
258 282
283#if DEBUG_KX
284 /**
285 * Received ephemeral public ECC key encoded in a
286 * format suitable for network transmission, as created
287 * using 'gcry_sexp_sprint'.
288 */
289 struct GNUNET_CRYPTO_EcdhePublicKey r_ephemeral_key_XXX; // for debugging KX-crypto!
290#endif
291
259 /** 292 /**
260 * KDF-proof that sender could compute the 3-DH, used in lieu of a 293 * KDF-proof that sender could compute the 3-DH, used in lieu of a
261 * signature or payload data. 294 * signature or payload data.
diff --git a/src/cadet/cadet_test_lib.c b/src/cadet/cadet_test_lib.c
index 20ef028b2..0efb81ab4 100644
--- a/src/cadet/cadet_test_lib.c
+++ b/src/cadet/cadet_test_lib.c
@@ -110,7 +110,7 @@ struct GNUNET_CADET_TEST_AdapterContext
110 * Port handlers for open ports. 110 * Port handlers for open ports.
111 */ 111 */
112 struct GNUNET_CADET_Port **ports; 112 struct GNUNET_CADET_Port **ports;
113 113
114 /** 114 /**
115 * General context. 115 * General context.
116 */ 116 */
@@ -135,14 +135,13 @@ cadet_connect_adapter (void *cls,
135 struct GNUNET_CADET_TEST_AdapterContext *actx = cls; 135 struct GNUNET_CADET_TEST_AdapterContext *actx = cls;
136 struct GNUNET_CADET_TEST_Context *ctx = actx->ctx; 136 struct GNUNET_CADET_TEST_Context *ctx = actx->ctx;
137 struct GNUNET_CADET_Handle *h; 137 struct GNUNET_CADET_Handle *h;
138 unsigned int i;
139 138
140 h = GNUNET_CADET_connect (cfg); 139 h = GNUNET_CADET_connect (cfg);
141 if (NULL == ctx->ports) 140 if (NULL == ctx->ports)
142 return h; 141 return h;
143 142 actx->ports = GNUNET_new_array (ctx->port_count,
144 actx->ports = GNUNET_new_array (ctx->port_count, struct GNUNET_CADET_Port *); 143 struct GNUNET_CADET_Port *);
145 for (i = 0; i < ctx->port_count; i++) 144 for (unsigned int i = 0; i < ctx->port_count; i++)
146 { 145 {
147 actx->ports[i] = GNUNET_CADET_open_port (h, 146 actx->ports[i] = GNUNET_CADET_open_port (h,
148 ctx->ports[i], 147 ctx->ports[i],
@@ -165,14 +164,14 @@ cadet_connect_adapter (void *cls,
165 */ 164 */
166static void 165static void
167cadet_disconnect_adapter (void *cls, 166cadet_disconnect_adapter (void *cls,
168 void *op_result) 167 void *op_result)
169{ 168{
170 struct GNUNET_CADET_Handle *cadet = op_result; 169 struct GNUNET_CADET_Handle *cadet = op_result;
171 struct GNUNET_CADET_TEST_AdapterContext *actx = cls; 170 struct GNUNET_CADET_TEST_AdapterContext *actx = cls;
172 171
173 if (NULL != actx->ports) 172 if (NULL != actx->ports)
174 { 173 {
175 for (int i = 0; i < actx->ctx->port_count; i++) 174 for (unsigned int i = 0; i < actx->ctx->port_count; i++)
176 { 175 {
177 GNUNET_CADET_close_port (actx->ports[i]); 176 GNUNET_CADET_close_port (actx->ports[i]);
178 actx->ports[i] = NULL; 177 actx->ports[i] = NULL;
@@ -201,22 +200,24 @@ cadet_connect_cb (void *cls,
201 const char *emsg) 200 const char *emsg)
202{ 201{
203 struct GNUNET_CADET_TEST_Context *ctx = cls; 202 struct GNUNET_CADET_TEST_Context *ctx = cls;
204 unsigned int i;
205 203
206 if (NULL != emsg) 204 if (NULL != emsg)
207 { 205 {
208 fprintf (stderr, "Failed to connect to CADET service: %s\n", 206 fprintf (stderr,
207 "Failed to connect to CADET service: %s\n",
209 emsg); 208 emsg);
210 GNUNET_SCHEDULER_shutdown (); 209 GNUNET_SCHEDULER_shutdown ();
211 return; 210 return;
212 } 211 }
213 for (i = 0; i < ctx->num_peers; i++) 212 for (unsigned int i = 0; i < ctx->num_peers; i++)
214 if (op == ctx->ops[i]) 213 if (op == ctx->ops[i])
215 { 214 {
216 ctx->cadets[i] = ca_result; 215 ctx->cadets[i] = ca_result;
217 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "...cadet %u connected\n", i); 216 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
217 "...cadet %u connected\n",
218 i);
218 } 219 }
219 for (i = 0; i < ctx->num_peers; i++) 220 for (unsigned int i = 0; i < ctx->num_peers; i++)
220 if (NULL == ctx->cadets[i]) 221 if (NULL == ctx->cadets[i])
221 return; /* still some CADET connections missing */ 222 return; /* still some CADET connections missing */
222 /* all CADET connections ready! */ 223 /* all CADET connections ready! */
@@ -231,9 +232,7 @@ cadet_connect_cb (void *cls,
231void 232void
232GNUNET_CADET_TEST_cleanup (struct GNUNET_CADET_TEST_Context *ctx) 233GNUNET_CADET_TEST_cleanup (struct GNUNET_CADET_TEST_Context *ctx)
233{ 234{
234 unsigned int i; 235 for (unsigned int i = 0; i < ctx->num_peers; i++)
235
236 for (i = 0; i < ctx->num_peers; i++)
237 { 236 {
238 GNUNET_assert (NULL != ctx->ops[i]); 237 GNUNET_assert (NULL != ctx->ops[i]);
239 GNUNET_TESTBED_operation_done (ctx->ops[i]); 238 GNUNET_TESTBED_operation_done (ctx->ops[i]);
@@ -269,33 +268,37 @@ cadet_test_run (void *cls,
269 unsigned int links_failed) 268 unsigned int links_failed)
270{ 269{
271 struct GNUNET_CADET_TEST_Context *ctx = cls; 270 struct GNUNET_CADET_TEST_Context *ctx = cls;
272 unsigned int i;
273 271
274 if (0 != links_failed) 272 if (0 != links_failed)
275 { 273 {
276 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Some links failed (%u), ending\n", 274 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
275 "Some links failed (%u), ending\n",
277 links_failed); 276 links_failed);
278 exit (2); 277 exit (2);
279 } 278 }
280
281 if (num_peers != ctx->num_peers) 279 if (num_peers != ctx->num_peers)
282 { 280 {
283 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Peers started %u/%u, ending\n", 281 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
284 num_peers, ctx->num_peers); 282 "Peers started %u/%u, ending\n",
283 num_peers,
284 ctx->num_peers);
285 exit (1); 285 exit (1);
286 } 286 }
287
288 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 287 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
289 "Testbed up, %u peers and %u links\n", 288 "Testbed up, %u peers and %u links\n",
290 num_peers, links_succeeded); 289 num_peers,
290 links_succeeded);
291 ctx->peers = peers; 291 ctx->peers = peers;
292 for (i = 0; i < num_peers; i++) 292 for (unsigned int i = 0; i < num_peers; i++)
293 { 293 {
294 struct GNUNET_CADET_TEST_AdapterContext *newctx; 294 struct GNUNET_CADET_TEST_AdapterContext *newctx;
295
295 newctx = GNUNET_new (struct GNUNET_CADET_TEST_AdapterContext); 296 newctx = GNUNET_new (struct GNUNET_CADET_TEST_AdapterContext);
296 newctx->peer = i; 297 newctx->peer = i;
297 newctx->ctx = ctx; 298 newctx->ctx = ctx;
298 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Connecting to cadet %u\n", i); 299 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
300 "Connecting to cadet %u\n",
301 i);
299 ctx->ops[i] = GNUNET_TESTBED_service_connect (ctx, 302 ctx->ops[i] = GNUNET_TESTBED_service_connect (ctx,
300 peers[i], 303 peers[i],
301 "cadet", 304 "cadet",
@@ -304,7 +307,9 @@ cadet_test_run (void *cls,
304 &cadet_connect_adapter, 307 &cadet_connect_adapter,
305 &cadet_disconnect_adapter, 308 &cadet_disconnect_adapter,
306 newctx); 309 newctx);
307 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "op handle %p\n", ctx->ops[i]); 310 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
311 "op handle %p\n",
312 ctx->ops[i]);
308 } 313 }
309} 314}
310 315
@@ -340,8 +345,10 @@ GNUNET_CADET_TEST_ruN (const char *testname,
340 345
341 ctx = GNUNET_new (struct GNUNET_CADET_TEST_Context); 346 ctx = GNUNET_new (struct GNUNET_CADET_TEST_Context);
342 ctx->num_peers = num_peers; 347 ctx->num_peers = num_peers;
343 ctx->ops = GNUNET_new_array (num_peers, struct GNUNET_TESTBED_Operation *); 348 ctx->ops = GNUNET_new_array (num_peers,
344 ctx->cadets = GNUNET_new_array (num_peers, struct GNUNET_CADET_Handle *); 349 struct GNUNET_TESTBED_Operation *);
350 ctx->cadets = GNUNET_new_array (num_peers,
351 struct GNUNET_CADET_Handle *);
345 ctx->app_main = tmain; 352 ctx->app_main = tmain;
346 ctx->app_main_cls = tmain_cls; 353 ctx->app_main_cls = tmain_cls;
347 ctx->connects = connects; 354 ctx->connects = connects;
@@ -352,12 +359,12 @@ GNUNET_CADET_TEST_ruN (const char *testname,
352 ctx->port_count = 0; 359 ctx->port_count = 0;
353 while (NULL != ctx->ports[ctx->port_count]) 360 while (NULL != ctx->ports[ctx->port_count])
354 ctx->port_count++; 361 ctx->port_count++;
355
356 GNUNET_TESTBED_test_run (testname, 362 GNUNET_TESTBED_test_run (testname,
357 cfgfile, 363 cfgfile,
358 num_peers, 364 num_peers,
359 0LL, NULL, NULL, 365 0LL, NULL, NULL,
360 &cadet_test_run, ctx); 366 &cadet_test_run,
367 ctx);
361} 368}
362 369
363/* end of cadet_test_lib.c */ 370/* end of cadet_test_lib.c */
diff --git a/src/cadet/gnunet-service-cadet.c b/src/cadet/gnunet-service-cadet.c
index 20e4c363e..23a4bc247 100644
--- a/src/cadet/gnunet-service-cadet.c
+++ b/src/cadet/gnunet-service-cadet.c
@@ -763,6 +763,7 @@ handle_local_data (void *cls,
763 buf, 763 buf,
764 payload_size)) 764 payload_size))
765 { 765 {
766 GNUNET_break (0);
766 GNUNET_SERVICE_client_drop (c->client); 767 GNUNET_SERVICE_client_drop (c->client);
767 return; 768 return;
768 } 769 }
diff --git a/src/cadet/gnunet-service-cadet_channel.c b/src/cadet/gnunet-service-cadet_channel.c
index 1a2b32be0..2d8d36c6c 100644
--- a/src/cadet/gnunet-service-cadet_channel.c
+++ b/src/cadet/gnunet-service-cadet_channel.c
@@ -411,7 +411,7 @@ GCCH_2s (const struct CadetChannel *ch)
411 411
412 412
413/** 413/**
414 * Hash the @a port and @a initiator and @a listener to 414 * Hash the @a port and @a initiator and @a listener to
415 * calculate the "challenge" @a h_port we send to the other 415 * calculate the "challenge" @a h_port we send to the other
416 * peer on #GNUNET_MESSAGE_TYPE_CADET_CHANNEL_OPEN. 416 * peer on #GNUNET_MESSAGE_TYPE_CADET_CHANNEL_OPEN.
417 * 417 *
@@ -1186,7 +1186,7 @@ GCCH_handle_channel_open_ack (struct CadetChannel *ch,
1186 port, 1186 port,
1187 sizeof (struct GNUNET_HashCode))) 1187 sizeof (struct GNUNET_HashCode)))
1188 { 1188 {
1189 /* Other peer failed to provide the right port, 1189 /* Other peer failed to provide the right port,
1190 refuse connection. */ 1190 refuse connection. */
1191 GNUNET_break_op (0); 1191 GNUNET_break_op (0);
1192 return; 1192 return;
@@ -1279,8 +1279,7 @@ GCCH_handle_channel_plaintext_data (struct CadetChannel *ch,
1279 uint32_t delta; 1279 uint32_t delta;
1280 1280
1281 GNUNET_assert (GNUNET_NO == ch->is_loopback); 1281 GNUNET_assert (GNUNET_NO == ch->is_loopback);
1282 if ( (GNUNET_YES == ch->destroy) && 1282 if ( (NULL == ch->owner) &&
1283 (NULL == ch->owner) &&
1284 (NULL == ch->dest) ) 1283 (NULL == ch->dest) )
1285 { 1284 {
1286 /* This client is gone, but we still have messages to send to 1285 /* This client is gone, but we still have messages to send to
@@ -1290,8 +1289,9 @@ GCCH_handle_channel_plaintext_data (struct CadetChannel *ch,
1290 "Dropping incoming payload on %s as this end is already closed\n", 1289 "Dropping incoming payload on %s as this end is already closed\n",
1291 GCCH_2s (ch)); 1290 GCCH_2s (ch));
1292 /* send back DESTROY notification to stop further retransmissions! */ 1291 /* send back DESTROY notification to stop further retransmissions! */
1293 GCT_send_channel_destroy (ch->t, 1292 if (GNUNET_YES == ch->destroy)
1294 ch->ctn); 1293 GCT_send_channel_destroy (ch->t,
1294 ch->ctn);
1295 return; 1295 return;
1296 } 1296 }
1297 payload_size = ntohs (msg->header.size) - sizeof (*msg); 1297 payload_size = ntohs (msg->header.size) - sizeof (*msg);
@@ -1822,7 +1822,7 @@ GCCH_handle_local_data (struct CadetChannel *ch,
1822{ 1822{
1823 struct CadetReliableMessage *crm; 1823 struct CadetReliableMessage *crm;
1824 1824
1825 if (ch->pending_messages > ch->max_pending_messages) 1825 if (ch->pending_messages >= ch->max_pending_messages)
1826 { 1826 {
1827 GNUNET_break (0); 1827 GNUNET_break (0);
1828 return GNUNET_SYSERR; 1828 return GNUNET_SYSERR;
diff --git a/src/cadet/gnunet-service-cadet_connection.c b/src/cadet/gnunet-service-cadet_connection.c
index 82ab5cc2c..9ff62b29f 100644
--- a/src/cadet/gnunet-service-cadet_connection.c
+++ b/src/cadet/gnunet-service-cadet_connection.c
@@ -39,6 +39,13 @@
39 39
40 40
41/** 41/**
42 * How long do we wait initially before retransmitting the KX?
43 * TODO: replace by 2 RTT if/once we have connection-level RTT data!
44 */
45#define INITIAL_CONNECTION_CREATE_RETRY_DELAY GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_MILLISECONDS, 200)
46
47
48/**
42 * All the states a connection can be in. 49 * All the states a connection can be in.
43 */ 50 */
44enum CadetConnectionState 51enum CadetConnectionState
@@ -134,6 +141,16 @@ struct CadetConnection
134 struct GNUNET_TIME_Relative retry_delay; 141 struct GNUNET_TIME_Relative retry_delay;
135 142
136 /** 143 /**
144 * Earliest time for re-trying CREATE
145 */
146 struct GNUNET_TIME_Absolute create_at;
147
148 /**
149 * Earliest time for re-trying CREATE_ACK
150 */
151 struct GNUNET_TIME_Absolute create_ack_at;
152
153 /**
137 * Performance metrics for this connection. 154 * Performance metrics for this connection.
138 */ 155 */
139 struct CadetConnectionMetrics metrics; 156 struct CadetConnectionMetrics metrics;
@@ -482,8 +499,9 @@ GCC_latency_observed (const struct GNUNET_CADET_ConnectionTunnelIdentifier *cid,
482 499
483 500
484/** 501/**
485 * A #GNUNET_MESSAGE_TYPE_CADET_CONNECTION_CREATE_ACK was received for this connection, implying 502 * A #GNUNET_MESSAGE_TYPE_CADET_CONNECTION_CREATE_ACK was received for
486 * that the end-to-end connection is up. Process it. 503 * this connection, implying that the end-to-end connection is up.
504 * Process it.
487 * 505 *
488 * @param cc the connection that got the ACK. 506 * @param cc the connection that got the ACK.
489 */ 507 */
@@ -525,6 +543,11 @@ void
525GCC_handle_kx (struct CadetConnection *cc, 543GCC_handle_kx (struct CadetConnection *cc,
526 const struct GNUNET_CADET_TunnelKeyExchangeMessage *msg) 544 const struct GNUNET_CADET_TunnelKeyExchangeMessage *msg)
527{ 545{
546 LOG (GNUNET_ERROR_TYPE_DEBUG,
547 "Received KX message with ephermal %s on CC %s in state %d\n",
548 GNUNET_e2s (&msg->ephemeral_key),
549 GNUNET_sh2s (&cc->cid.connection_of_tunnel),
550 cc->state);
528 if (CADET_CONNECTION_SENT == cc->state) 551 if (CADET_CONNECTION_SENT == cc->state)
529 { 552 {
530 /* We didn't get the CADET_CONNECTION_CREATE_ACK, but instead got payload. That's fine, 553 /* We didn't get the CADET_CONNECTION_CREATE_ACK, but instead got payload. That's fine,
@@ -549,6 +572,11 @@ void
549GCC_handle_kx_auth (struct CadetConnection *cc, 572GCC_handle_kx_auth (struct CadetConnection *cc,
550 const struct GNUNET_CADET_TunnelKeyExchangeAuthMessage *msg) 573 const struct GNUNET_CADET_TunnelKeyExchangeAuthMessage *msg)
551{ 574{
575 LOG (GNUNET_ERROR_TYPE_DEBUG,
576 "Received KX AUTH message with ephermal %s on CC %s in state %d\n",
577 GNUNET_e2s (&msg->kx.ephemeral_key),
578 GNUNET_sh2s (&cc->cid.connection_of_tunnel),
579 cc->state);
552 if (CADET_CONNECTION_SENT == cc->state) 580 if (CADET_CONNECTION_SENT == cc->state)
553 { 581 {
554 /* We didn't get the CADET_CONNECTION_CREATE_ACK, but instead got payload. That's fine, 582 /* We didn't get the CADET_CONNECTION_CREATE_ACK, but instead got payload. That's fine,
@@ -601,25 +629,26 @@ send_create (void *cls)
601 struct GNUNET_CADET_ConnectionCreateMessage *create_msg; 629 struct GNUNET_CADET_ConnectionCreateMessage *create_msg;
602 struct GNUNET_PeerIdentity *pids; 630 struct GNUNET_PeerIdentity *pids;
603 struct GNUNET_MQ_Envelope *env; 631 struct GNUNET_MQ_Envelope *env;
604 unsigned int path_length;
605 632
606 cc->task = NULL; 633 cc->task = NULL;
607 GNUNET_assert (GNUNET_YES == cc->mqm_ready); 634 GNUNET_assert (GNUNET_YES == cc->mqm_ready);
608 path_length = GCPP_get_length (cc->path);
609 env = GNUNET_MQ_msg_extra (create_msg, 635 env = GNUNET_MQ_msg_extra (create_msg,
610 (1 + path_length) * sizeof (struct GNUNET_PeerIdentity), 636 (2 + cc->off) * sizeof (struct GNUNET_PeerIdentity),
611 GNUNET_MESSAGE_TYPE_CADET_CONNECTION_CREATE); 637 GNUNET_MESSAGE_TYPE_CADET_CONNECTION_CREATE);
612 create_msg->options = htonl ((uint32_t) cc->options); 638 create_msg->options = htonl ((uint32_t) cc->options);
613 create_msg->cid = cc->cid; 639 create_msg->cid = cc->cid;
614 pids = (struct GNUNET_PeerIdentity *) &create_msg[1]; 640 pids = (struct GNUNET_PeerIdentity *) &create_msg[1];
615 pids[0] = my_full_id; 641 pids[0] = my_full_id;
616 for (unsigned int i=0;i<path_length;i++) 642 for (unsigned int i=0;i<=cc->off;i++)
617 pids[i + 1] = *GCP_get_id (GCPP_get_peer_at_offset (cc->path, 643 pids[i + 1] = *GCP_get_id (GCPP_get_peer_at_offset (cc->path,
618 i)); 644 i));
619 LOG (GNUNET_ERROR_TYPE_DEBUG, 645 LOG (GNUNET_ERROR_TYPE_DEBUG,
620 "Sending CADET_CONNECTION_CREATE message for %s\n", 646 "Sending CADET_CONNECTION_CREATE message for %s with %u hops\n",
621 GCC_2s (cc)); 647 GCC_2s (cc),
648 cc->off + 2);
622 cc->env = env; 649 cc->env = env;
650 cc->retry_delay = GNUNET_TIME_STD_BACKOFF (cc->retry_delay);
651 cc->create_at = GNUNET_TIME_relative_to_absolute (cc->retry_delay);
623 update_state (cc, 652 update_state (cc,
624 CADET_CONNECTION_SENT, 653 CADET_CONNECTION_SENT,
625 GNUNET_NO); 654 GNUNET_NO);
@@ -641,7 +670,6 @@ send_create_ack (void *cls)
641 struct GNUNET_MQ_Envelope *env; 670 struct GNUNET_MQ_Envelope *env;
642 671
643 cc->task = NULL; 672 cc->task = NULL;
644 GNUNET_assert (CADET_CONNECTION_CREATE_RECEIVED == cc->state);
645 LOG (GNUNET_ERROR_TYPE_DEBUG, 673 LOG (GNUNET_ERROR_TYPE_DEBUG,
646 "Sending CONNECTION_CREATE_ACK message for %s\n", 674 "Sending CONNECTION_CREATE_ACK message for %s\n",
647 GCC_2s (cc)); 675 GCC_2s (cc));
@@ -650,9 +678,16 @@ send_create_ack (void *cls)
650 GNUNET_MESSAGE_TYPE_CADET_CONNECTION_CREATE_ACK); 678 GNUNET_MESSAGE_TYPE_CADET_CONNECTION_CREATE_ACK);
651 ack_msg->cid = cc->cid; 679 ack_msg->cid = cc->cid;
652 cc->env = env; 680 cc->env = env;
653 update_state (cc, 681 cc->retry_delay = GNUNET_TIME_STD_BACKOFF (cc->retry_delay);
654 CADET_CONNECTION_READY, 682 cc->create_ack_at = GNUNET_TIME_relative_to_absolute (cc->retry_delay);
655 GNUNET_NO); 683 if (CADET_CONNECTION_CREATE_RECEIVED == cc->state)
684 update_state (cc,
685 CADET_CONNECTION_READY,
686 GNUNET_NO);
687 if (CADET_CONNECTION_READY == cc->state)
688 cc->task = GNUNET_SCHEDULER_add_delayed (keepalive_period,
689 &send_keepalive,
690 cc);
656 GCP_send (cc->mq_man, 691 GCP_send (cc->mq_man,
657 env); 692 env);
658} 693}
@@ -681,8 +716,9 @@ GCC_handle_duplicate_create (struct CadetConnection *cc)
681 cc->mqm_ready); 716 cc->mqm_ready);
682 if (NULL != cc->task) 717 if (NULL != cc->task)
683 GNUNET_SCHEDULER_cancel (cc->task); 718 GNUNET_SCHEDULER_cancel (cc->task);
684 cc->task = GNUNET_SCHEDULER_add_now (&send_create_ack, 719 cc->task = GNUNET_SCHEDULER_add_at (cc->create_ack_at,
685 cc); 720 &send_create_ack,
721 cc);
686 } 722 }
687 else 723 else
688 { 724 {
@@ -721,7 +757,7 @@ manage_first_hop_mq (void *cls,
721 update_state (cc, 757 update_state (cc,
722 CADET_CONNECTION_NEW, 758 CADET_CONNECTION_NEW,
723 GNUNET_NO); 759 GNUNET_NO);
724 cc->retry_delay = GNUNET_TIME_UNIT_ZERO; 760 cc->retry_delay = INITIAL_CONNECTION_CREATE_RETRY_DELAY;
725 if (NULL != cc->task) 761 if (NULL != cc->task)
726 { 762 {
727 GNUNET_SCHEDULER_cancel (cc->task); 763 GNUNET_SCHEDULER_cancel (cc->task);
@@ -741,8 +777,9 @@ manage_first_hop_mq (void *cls,
741 { 777 {
742 case CADET_CONNECTION_NEW: 778 case CADET_CONNECTION_NEW:
743 /* Transmit immediately */ 779 /* Transmit immediately */
744 cc->task = GNUNET_SCHEDULER_add_now (&send_create, 780 cc->task = GNUNET_SCHEDULER_add_at (cc->create_at,
745 cc); 781 &send_create,
782 cc);
746 break; 783 break;
747 case CADET_CONNECTION_SENDING_CREATE: 784 case CADET_CONNECTION_SENDING_CREATE:
748 /* Should not be possible to be called in this state. */ 785 /* Should not be possible to be called in this state. */
@@ -750,16 +787,16 @@ manage_first_hop_mq (void *cls,
750 break; 787 break;
751 case CADET_CONNECTION_SENT: 788 case CADET_CONNECTION_SENT:
752 /* Retry a bit later... */ 789 /* Retry a bit later... */
753 cc->retry_delay = GNUNET_TIME_STD_BACKOFF (cc->retry_delay); 790 cc->task = GNUNET_SCHEDULER_add_at (cc->create_at,
754 cc->task = GNUNET_SCHEDULER_add_delayed (cc->retry_delay, 791 &send_create,
755 &send_create, 792 cc);
756 cc);
757 break; 793 break;
758 case CADET_CONNECTION_CREATE_RECEIVED: 794 case CADET_CONNECTION_CREATE_RECEIVED:
759 /* We got the 'CREATE' (incoming connection), should send the CREATE_ACK */ 795 /* We got the 'CREATE' (incoming connection), should send the CREATE_ACK */
760 cc->metrics.age = GNUNET_TIME_absolute_get (); 796 cc->metrics.age = GNUNET_TIME_absolute_get ();
761 cc->task = GNUNET_SCHEDULER_add_now (&send_create_ack, 797 cc->task = GNUNET_SCHEDULER_add_at (cc->create_ack_at,
762 cc); 798 &send_create_ack,
799 cc);
763 break; 800 break;
764 case CADET_CONNECTION_READY: 801 case CADET_CONNECTION_READY:
765 if ( (NULL == cc->keepalive_qe) && 802 if ( (NULL == cc->keepalive_qe) &&
@@ -814,6 +851,8 @@ connection_create (struct CadetPeer *destination,
814 cc->state = init_state; 851 cc->state = init_state;
815 cc->ct = ct; 852 cc->ct = ct;
816 cc->cid = *cid; 853 cc->cid = *cid;
854 cc->retry_delay = GNUNET_TIME_relative_multiply (INITIAL_CONNECTION_CREATE_RETRY_DELAY,
855 off);
817 GNUNET_assert (GNUNET_OK == 856 GNUNET_assert (GNUNET_OK ==
818 GNUNET_CONTAINER_multishortmap_put (connections, 857 GNUNET_CONTAINER_multishortmap_put (connections,
819 &GCC_get_id (cc)->connection_of_tunnel, 858 &GCC_get_id (cc)->connection_of_tunnel,
@@ -824,9 +863,10 @@ connection_create (struct CadetPeer *destination,
824 cc->path = path; 863 cc->path = path;
825 cc->off = off; 864 cc->off = off;
826 LOG (GNUNET_ERROR_TYPE_DEBUG, 865 LOG (GNUNET_ERROR_TYPE_DEBUG,
827 "Creating %s using path %s\n", 866 "Creating %s using path %s (offset: %u)\n",
828 GCC_2s (cc), 867 GCC_2s (cc),
829 GCPP_2s (path)); 868 GCPP_2s (path),
869 off);
830 GCPP_add_connection (path, 870 GCPP_add_connection (path,
831 off, 871 off,
832 cc); 872 cc);
@@ -834,7 +874,6 @@ connection_create (struct CadetPeer *destination,
834 GCP_add_connection (GCPP_get_peer_at_offset (path, 874 GCP_add_connection (GCPP_get_peer_at_offset (path,
835 i), 875 i),
836 cc); 876 cc);
837
838 first_hop = GCPP_get_peer_at_offset (path, 877 first_hop = GCPP_get_peer_at_offset (path,
839 0); 878 0);
840 cc->mq_man = GCP_request_mq (first_hop, 879 cc->mq_man = GCP_request_mq (first_hop,
@@ -1001,11 +1040,14 @@ GCC_transmit (struct CadetConnection *cc,
1001 * Obtain the path used by this connection. 1040 * Obtain the path used by this connection.
1002 * 1041 *
1003 * @param cc connection 1042 * @param cc connection
1043 * @param off[out] set to the length of the path we use
1004 * @return path to @a cc 1044 * @return path to @a cc
1005 */ 1045 */
1006struct CadetPeerPath * 1046struct CadetPeerPath *
1007GCC_get_path (struct CadetConnection *cc) 1047GCC_get_path (struct CadetConnection *cc,
1048 unsigned int *off)
1008{ 1049{
1050 *off = cc->off;
1009 return cc->path; 1051 return cc->path;
1010} 1052}
1011 1053
diff --git a/src/cadet/gnunet-service-cadet_connection.h b/src/cadet/gnunet-service-cadet_connection.h
index fdb184366..1c0475d40 100644
--- a/src/cadet/gnunet-service-cadet_connection.h
+++ b/src/cadet/gnunet-service-cadet_connection.h
@@ -300,10 +300,12 @@ GCC_get_ct (struct CadetConnection *cc);
300 * Obtain the path used by this connection. 300 * Obtain the path used by this connection.
301 * 301 *
302 * @param cc connection 302 * @param cc connection
303 * @param off[out] set to offset in this path where the connection @a cc ends
303 * @return path to @a cc 304 * @return path to @a cc
304 */ 305 */
305struct CadetPeerPath * 306struct CadetPeerPath *
306GCC_get_path (struct CadetConnection *cc); 307GCC_get_path (struct CadetConnection *cc,
308 unsigned int *off);
307 309
308 310
309/** 311/**
diff --git a/src/cadet/gnunet-service-cadet_core.c b/src/cadet/gnunet-service-cadet_core.c
index 84aff1857..65738504e 100644
--- a/src/cadet/gnunet-service-cadet_core.c
+++ b/src/cadet/gnunet-service-cadet_core.c
@@ -406,6 +406,28 @@ route_message (struct CadetPeer *prev,
406 (NULL != dir->env_head) ) 406 (NULL != dir->env_head) )
407 discard_buffer (dir, 407 discard_buffer (dir,
408 dir->env_head); 408 dir->env_head);
409 /* Check for duplicates */
410 for (const struct GNUNET_MQ_Envelope *env = dir->env_head;
411 NULL != env;
412 env = GNUNET_MQ_env_next (env))
413 {
414 const struct GNUNET_MessageHeader *hdr = GNUNET_MQ_env_get_msg (env);
415
416 if ( (hdr->size == msg->size) &&
417 (0 == memcmp (hdr,
418 msg,
419 ntohs (msg->size))) )
420 {
421 LOG (GNUNET_ERROR_TYPE_DEBUG,
422 "Received duplicate of message already in buffer, dropping\n");
423 GNUNET_STATISTICS_update (stats,
424 "# messages dropped due to duplicate in buffer",
425 1,
426 GNUNET_NO);
427 return;
428 }
429 }
430
409 rung = dir->rung; 431 rung = dir->rung;
410 if (cur_buffers == max_buffers) 432 if (cur_buffers == max_buffers)
411 { 433 {
@@ -434,7 +456,7 @@ route_message (struct CadetPeer *prev,
434 GNUNET_CONTAINER_DLL_remove (rung->rd_head, 456 GNUNET_CONTAINER_DLL_remove (rung->rd_head,
435 rung->rd_tail, 457 rung->rd_tail,
436 dir); 458 dir);
437 /* make 'nxt' point to the next higher rung, creat if necessary */ 459 /* make 'nxt' point to the next higher rung, create if necessary */
438 nxt = rung->next; 460 nxt = rung->next;
439 if ( (NULL == nxt) || 461 if ( (NULL == nxt) ||
440 (rung->rung_off + 1 != nxt->rung_off) ) 462 (rung->rung_off + 1 != nxt->rung_off) )
@@ -631,7 +653,7 @@ timeout_cb (void *cls)
631 NULL); 653 NULL);
632 return; 654 return;
633 } 655 }
634 GNUNET_log (GNUNET_ERROR_TYPE_WARNING, 656 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
635 "Sending BROKEN due to timeout (%s was last use, %s linger)\n", 657 "Sending BROKEN due to timeout (%s was last use, %s linger)\n",
636 GNUNET_STRINGS_absolute_time_to_string (r->last_use), 658 GNUNET_STRINGS_absolute_time_to_string (r->last_use),
637 GNUNET_STRINGS_relative_time_to_string (linger, 659 GNUNET_STRINGS_relative_time_to_string (linger,
@@ -693,7 +715,7 @@ dir_ready_cb (void *cls,
693 return; 715 return;
694 } 716 }
695 odir = (dir == &route->next) ? &route->prev : &route->next; 717 odir = (dir == &route->next) ? &route->prev : &route->next;
696 GNUNET_log (GNUNET_ERROR_TYPE_WARNING, 718 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
697 "Sending BROKEN due to MQ going down\n"); 719 "Sending BROKEN due to MQ going down\n");
698 send_broken (&route->next, 720 send_broken (&route->next,
699 &route->cid, 721 &route->cid,
@@ -781,31 +803,45 @@ handle_connection_create (void *cls,
781 if (0 == path_length) 803 if (0 == path_length)
782 { 804 {
783 LOG (GNUNET_ERROR_TYPE_DEBUG, 805 LOG (GNUNET_ERROR_TYPE_DEBUG,
784 "Dropping CADET_CONNECTION_CREATE with empty path\n"); 806 "Dropping CADET_CONNECTION_CREATE with empty path\n");
785 GNUNET_break_op (0); 807 GNUNET_break_op (0);
786 return; 808 return;
787 } 809 }
810 LOG (GNUNET_ERROR_TYPE_DEBUG,
811 "Handling CADET_CONNECTION_CREATE from %s for CID %s with %u hops\n",
812 GCP_2s (sender),
813 GNUNET_sh2s (&msg->cid.connection_of_tunnel),
814 path_length);
788 /* Check for loops */ 815 /* Check for loops */
789 struct GNUNET_CONTAINER_MultiPeerMap *map; 816 {
790 map = GNUNET_CONTAINER_multipeermap_create (path_length * 2, 817 struct GNUNET_CONTAINER_MultiPeerMap *map;
791 GNUNET_YES); 818
792 GNUNET_assert (NULL != map); 819 map = GNUNET_CONTAINER_multipeermap_create (path_length * 2,
793 for (off = 0; off < path_length; off++) { 820 GNUNET_YES);
794 if (GNUNET_SYSERR == 821 GNUNET_assert (NULL != map);
795 GNUNET_CONTAINER_multipeermap_put (map, 822 for (unsigned int i=0;i<path_length;i++)
796 &pids[off], 823 {
797 NULL,
798 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY)) {
799 /* bogus request */
800 GNUNET_CONTAINER_multipeermap_destroy (map);
801 LOG (GNUNET_ERROR_TYPE_DEBUG, 824 LOG (GNUNET_ERROR_TYPE_DEBUG,
802 "Dropping CADET_CONNECTION_CREATE with cyclic path\n"); 825 "CADET_CONNECTION_CREATE has peer %s at offset %u\n",
803 GNUNET_break_op (0); 826 GNUNET_i2s (&pids[i]),
804 return; 827 i);
828 if (GNUNET_SYSERR ==
829 GNUNET_CONTAINER_multipeermap_put (map,
830 &pids[i],
831 NULL,
832 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY))
833 {
834 /* bogus request */
835 GNUNET_CONTAINER_multipeermap_destroy (map);
836 LOG (GNUNET_ERROR_TYPE_DEBUG,
837 "Dropping CADET_CONNECTION_CREATE with cyclic path\n");
838 GNUNET_break_op (0);
839 return;
840 }
805 } 841 }
842 GNUNET_CONTAINER_multipeermap_destroy (map);
806 } 843 }
807 GNUNET_CONTAINER_multipeermap_destroy (map); 844 /* Initiator is at offset 0, find us */
808 /* Initiator is at offset 0. */
809 for (off=1;off<path_length;off++) 845 for (off=1;off<path_length;off++)
810 if (0 == memcmp (&my_full_id, 846 if (0 == memcmp (&my_full_id,
811 &pids[off], 847 &pids[off],
@@ -814,7 +850,7 @@ handle_connection_create (void *cls,
814 if (off == path_length) 850 if (off == path_length)
815 { 851 {
816 LOG (GNUNET_ERROR_TYPE_DEBUG, 852 LOG (GNUNET_ERROR_TYPE_DEBUG,
817 "Dropping CADET_CONNECTION_CREATE without us in the path\n"); 853 "Dropping CADET_CONNECTION_CREATE without us in the path\n");
818 GNUNET_break_op (0); 854 GNUNET_break_op (0);
819 return; 855 return;
820 } 856 }
@@ -823,14 +859,15 @@ handle_connection_create (void *cls,
823 GNUNET_NO)) 859 GNUNET_NO))
824 { 860 {
825 LOG (GNUNET_ERROR_TYPE_DEBUG, 861 LOG (GNUNET_ERROR_TYPE_DEBUG,
826 "Dropping CADET_CONNECTION_CREATE without sender in the path\n"); 862 "Dropping CADET_CONNECTION_CREATE without sender at previous hop in the path\n");
827 GNUNET_break_op (0); 863 GNUNET_break_op (0);
828 return; 864 return;
829 } 865 }
830 if (NULL != 866 if (NULL !=
831 get_route (&msg->cid)) 867 (route = get_route (&msg->cid)))
832 { 868 {
833 /* Duplicate CREATE, pass it on, previous one might have been lost! */ 869 /* Duplicate CREATE, pass it on, previous one might have been lost! */
870
834 LOG (GNUNET_ERROR_TYPE_DEBUG, 871 LOG (GNUNET_ERROR_TYPE_DEBUG,
835 "Passing on duplicate CADET_CONNECTION_CREATE message on connection %s\n", 872 "Passing on duplicate CADET_CONNECTION_CREATE message on connection %s\n",
836 GNUNET_sh2s (&msg->cid.connection_of_tunnel)); 873 GNUNET_sh2s (&msg->cid.connection_of_tunnel));
@@ -859,7 +896,7 @@ handle_connection_create (void *cls,
859 origin = GCP_get (&pids[0], 896 origin = GCP_get (&pids[0],
860 GNUNET_YES); 897 GNUNET_YES);
861 LOG (GNUNET_ERROR_TYPE_DEBUG, 898 LOG (GNUNET_ERROR_TYPE_DEBUG,
862 "Received CADET_CONNECTION_CREATE message from %s for connection %s, building inverse path\n", 899 "I am destination for CADET_CONNECTION_CREATE message from %s for connection %s, building inverse path\n",
863 GCP_2s (origin), 900 GCP_2s (origin),
864 GNUNET_sh2s (&msg->cid.connection_of_tunnel)); 901 GNUNET_sh2s (&msg->cid.connection_of_tunnel));
865 path = GCPP_get_path_from_route (path_length - 1, 902 path = GCPP_get_path_from_route (path_length - 1,
@@ -949,6 +986,10 @@ handle_connection_create (void *cls,
949 3), 986 3),
950 &timeout_cb, 987 &timeout_cb,
951 NULL); 988 NULL);
989 /* also pass CREATE message along to next hop */
990 route_message (sender,
991 &msg->cid,
992 &msg->header);
952} 993}
953 994
954 995
@@ -970,7 +1011,9 @@ handle_connection_create_ack (void *cls,
970 if (NULL != cc) 1011 if (NULL != cc)
971 { 1012 {
972 /* verify ACK came from the right direction */ 1013 /* verify ACK came from the right direction */
973 struct CadetPeerPath *path = GCC_get_path (cc); 1014 unsigned int len;
1015 struct CadetPeerPath *path = GCC_get_path (cc,
1016 &len);
974 1017
975 if (peer != 1018 if (peer !=
976 GCPP_get_peer_at_offset (path, 1019 GCPP_get_peer_at_offset (path,
@@ -1014,7 +1057,9 @@ handle_connection_broken (void *cls,
1014 if (NULL != cc) 1057 if (NULL != cc)
1015 { 1058 {
1016 /* verify message came from the right direction */ 1059 /* verify message came from the right direction */
1017 struct CadetPeerPath *path = GCC_get_path (cc); 1060 unsigned int len;
1061 struct CadetPeerPath *path = GCC_get_path (cc,
1062 &len);
1018 1063
1019 if (peer != 1064 if (peer !=
1020 GCPP_get_peer_at_offset (path, 1065 GCPP_get_peer_at_offset (path,
@@ -1063,7 +1108,9 @@ handle_connection_destroy (void *cls,
1063 if (NULL != cc) 1108 if (NULL != cc)
1064 { 1109 {
1065 /* verify message came from the right direction */ 1110 /* verify message came from the right direction */
1066 struct CadetPeerPath *path = GCC_get_path (cc); 1111 unsigned int len;
1112 struct CadetPeerPath *path = GCC_get_path (cc,
1113 &len);
1067 1114
1068 if (peer != 1115 if (peer !=
1069 GCPP_get_peer_at_offset (path, 1116 GCPP_get_peer_at_offset (path,
@@ -1108,11 +1155,19 @@ handle_tunnel_kx (void *cls,
1108 struct CadetConnection *cc; 1155 struct CadetConnection *cc;
1109 1156
1110 /* First, check if message belongs to a connection that ends here. */ 1157 /* First, check if message belongs to a connection that ends here. */
1158 LOG (GNUNET_ERROR_TYPE_DEBUG,
1159 "Routing KX with ephemeral %s on CID %s\n",
1160 GNUNET_e2s (&msg->ephemeral_key),
1161 GNUNET_sh2s (&msg->cid.connection_of_tunnel));
1162
1163
1111 cc = GCC_lookup (&msg->cid); 1164 cc = GCC_lookup (&msg->cid);
1112 if (NULL != cc) 1165 if (NULL != cc)
1113 { 1166 {
1114 /* verify message came from the right direction */ 1167 /* verify message came from the right direction */
1115 struct CadetPeerPath *path = GCC_get_path (cc); 1168 unsigned int len;
1169 struct CadetPeerPath *path = GCC_get_path (cc,
1170 &len);
1116 1171
1117 if (peer != 1172 if (peer !=
1118 GCPP_get_peer_at_offset (path, 1173 GCPP_get_peer_at_offset (path,
@@ -1152,7 +1207,9 @@ handle_tunnel_kx_auth (void *cls,
1152 if (NULL != cc) 1207 if (NULL != cc)
1153 { 1208 {
1154 /* verify message came from the right direction */ 1209 /* verify message came from the right direction */
1155 struct CadetPeerPath *path = GCC_get_path (cc); 1210 unsigned int len;
1211 struct CadetPeerPath *path = GCC_get_path (cc,
1212 &len);
1156 1213
1157 if (peer != 1214 if (peer !=
1158 GCPP_get_peer_at_offset (path, 1215 GCPP_get_peer_at_offset (path,
@@ -1208,7 +1265,9 @@ handle_tunnel_encrypted (void *cls,
1208 if (NULL != cc) 1265 if (NULL != cc)
1209 { 1266 {
1210 /* verify message came from the right direction */ 1267 /* verify message came from the right direction */
1211 struct CadetPeerPath *path = GCC_get_path (cc); 1268 unsigned int len;
1269 struct CadetPeerPath *path = GCC_get_path (cc,
1270 &len);
1212 1271
1213 if (peer != 1272 if (peer !=
1214 GCPP_get_peer_at_offset (path, 1273 GCPP_get_peer_at_offset (path,
diff --git a/src/cadet/gnunet-service-cadet_paths.c b/src/cadet/gnunet-service-cadet_paths.c
index b443cf9e8..5218d0848 100644
--- a/src/cadet/gnunet-service-cadet_paths.c
+++ b/src/cadet/gnunet-service-cadet_paths.c
@@ -146,7 +146,7 @@ GCPP_add_connection (struct CadetPeerPath *path,
146 struct CadetPeerPathEntry *entry; 146 struct CadetPeerPathEntry *entry;
147 147
148 LOG (GNUNET_ERROR_TYPE_DEBUG, 148 LOG (GNUNET_ERROR_TYPE_DEBUG,
149 "Adding connection %s to path %s at offset %u\n", 149 "Adding %s to path %s at offset %u\n",
150 GCC_2s (cc), 150 GCC_2s (cc),
151 GCPP_2s (path), 151 GCPP_2s (path),
152 off); 152 off);
diff --git a/src/cadet/gnunet-service-cadet_peer.c b/src/cadet/gnunet-service-cadet_peer.c
index 05555e693..35e2c6148 100644
--- a/src/cadet/gnunet-service-cadet_peer.c
+++ b/src/cadet/gnunet-service-cadet_peer.c
@@ -242,12 +242,15 @@ struct CadetPeer
242const char * 242const char *
243GCP_2s (const struct CadetPeer *cp) 243GCP_2s (const struct CadetPeer *cp)
244{ 244{
245 static char buf[32]; 245 static char buf[5];
246 246 char *ret;
247 GNUNET_snprintf (buf, 247
248 sizeof (buf), 248 ret = GNUNET_CRYPTO_eddsa_public_key_to_string (&cp->pid.public_key);
249 "P(%s)", 249 strncpy (buf,
250 GNUNET_i2s (&cp->pid)); 250 ret,
251 sizeof (buf) - 1);
252 GNUNET_free (ret);
253 buf[4] = '\0';
251 return buf; 254 return buf;
252} 255}
253 256
@@ -649,6 +652,27 @@ mqm_execute (struct GCP_MessageQueueManager *mqm)
649 } 652 }
650 else 653 else
651 { 654 {
655 {
656 const struct GNUNET_MessageHeader *mh;
657
658 mh = GNUNET_MQ_env_get_msg (mqm->env);
659 switch (ntohs (mh->type))
660 {
661 case GNUNET_MESSAGE_TYPE_CADET_TUNNEL_KX:
662 {
663 const struct GNUNET_CADET_TunnelKeyExchangeMessage *msg
664 = (const struct GNUNET_CADET_TunnelKeyExchangeMessage *) mh;
665 LOG (GNUNET_ERROR_TYPE_DEBUG,
666 "P2P forwarding KX with ephemeral %s to %s on CID %s\n",
667 GNUNET_e2s (&msg->ephemeral_key),
668 GCP_2s (cp),
669 GNUNET_sh2s (&msg->cid.connection_of_tunnel));
670 }
671 break;
672 default:
673 break;
674 }
675 }
652 LOG (GNUNET_ERROR_TYPE_DEBUG, 676 LOG (GNUNET_ERROR_TYPE_DEBUG,
653 "Sending to peer %s from MQM %p\n", 677 "Sending to peer %s from MQM %p\n",
654 GCP_2s (cp), 678 GCP_2s (cp),
@@ -1044,7 +1068,7 @@ GCP_add_connection (struct CadetPeer *cp,
1044 struct CadetConnection *cc) 1068 struct CadetConnection *cc)
1045{ 1069{
1046 LOG (GNUNET_ERROR_TYPE_DEBUG, 1070 LOG (GNUNET_ERROR_TYPE_DEBUG,
1047 "Adding connection %s to peer %s\n", 1071 "Adding %s to peer %s\n",
1048 GCC_2s (cc), 1072 GCC_2s (cc),
1049 GCP_2s (cp)); 1073 GCP_2s (cp));
1050 GNUNET_assert (GNUNET_OK == 1074 GNUNET_assert (GNUNET_OK ==
diff --git a/src/cadet/gnunet-service-cadet_tunnels.c b/src/cadet/gnunet-service-cadet_tunnels.c
index 75d454522..dbd84a818 100644
--- a/src/cadet/gnunet-service-cadet_tunnels.c
+++ b/src/cadet/gnunet-service-cadet_tunnels.c
@@ -1369,6 +1369,15 @@ send_kx (struct CadetTunnel *t,
1369 msg->cid = *GCC_get_id (cc); 1369 msg->cid = *GCC_get_id (cc);
1370 GNUNET_CRYPTO_ecdhe_key_get_public (&ax->kx_0, 1370 GNUNET_CRYPTO_ecdhe_key_get_public (&ax->kx_0,
1371 &msg->ephemeral_key); 1371 &msg->ephemeral_key);
1372#if DEBUG_KX
1373 msg->ephemeral_key_XXX = ax->kx_0;
1374 msg->private_key_XXX = *my_private_key;
1375#endif
1376 LOG (GNUNET_ERROR_TYPE_DEBUG,
1377 "Sending KX message to %s with ephemeral %s on CID %s\n",
1378 GCT_2s (t),
1379 GNUNET_e2s (&msg->ephemeral_key),
1380 GNUNET_sh2s (&msg->cid.connection_of_tunnel));
1372 GNUNET_CRYPTO_ecdhe_key_get_public (&ax->DHRs, 1381 GNUNET_CRYPTO_ecdhe_key_get_public (&ax->DHRs,
1373 &msg->ratchet_key); 1382 &msg->ratchet_key);
1374 mark_connection_unready (ct); 1383 mark_connection_unready (ct);
@@ -1435,6 +1444,17 @@ send_kx_auth (struct CadetTunnel *t,
1435 &msg->kx.ephemeral_key); 1444 &msg->kx.ephemeral_key);
1436 GNUNET_CRYPTO_ecdhe_key_get_public (&ax->DHRs, 1445 GNUNET_CRYPTO_ecdhe_key_get_public (&ax->DHRs,
1437 &msg->kx.ratchet_key); 1446 &msg->kx.ratchet_key);
1447#if DEBUG_KX
1448 msg->kx.ephemeral_key_XXX = ax->kx_0;
1449 msg->kx.private_key_XXX = *my_private_key;
1450 msg->r_ephemeral_key_XXX = ax->last_ephemeral;
1451#endif
1452 LOG (GNUNET_ERROR_TYPE_DEBUG,
1453 "Sending KX_AUTH message to %s with ephemeral %s on CID %s\n",
1454 GCT_2s (t),
1455 GNUNET_e2s (&msg->kx.ephemeral_key),
1456 GNUNET_sh2s (&msg->kx.cid.connection_of_tunnel));
1457
1438 /* Compute authenticator (this is the main difference to #send_kx()) */ 1458 /* Compute authenticator (this is the main difference to #send_kx()) */
1439 GNUNET_CRYPTO_hash (&ax->RK, 1459 GNUNET_CRYPTO_hash (&ax->RK,
1440 sizeof (ax->RK), 1460 sizeof (ax->RK),
@@ -1705,12 +1725,19 @@ GCT_handle_kx (struct CadetTConnection *ct,
1705 "# KX received", 1725 "# KX received",
1706 1, 1726 1,
1707 GNUNET_NO); 1727 GNUNET_NO);
1708 if (GNUNET_YES == alice_or_bob (GCP_get_id (t->destination))) 1728 if (GNUNET_YES ==
1729 alice_or_bob (GCP_get_id (t->destination)))
1709 { 1730 {
1710 /* Bob is not allowed to send KX! */ 1731 /* Bob is not allowed to send KX! */
1711 GNUNET_break_op (0); 1732 GNUNET_break_op (0);
1712 return; 1733 return;
1713 } 1734 }
1735 LOG (GNUNET_ERROR_TYPE_DEBUG,
1736 "Received KX message from %s with ephemeral %s from %s on connection %s\n",
1737 GCT_2s (t),
1738 GNUNET_e2s (&msg->ephemeral_key),
1739 GNUNET_i2s (GCP_get_id (t->destination)),
1740 GCC_2s (ct->cc));
1714#if 1 1741#if 1
1715 if ( (0 == 1742 if ( (0 ==
1716 memcmp (&t->ax.DHRr, 1743 memcmp (&t->ax.DHRr,
@@ -1823,6 +1850,75 @@ GCT_handle_kx (struct CadetTConnection *ct,
1823} 1850}
1824 1851
1825 1852
1853#if DEBUG_KX
1854static void
1855check_ee (const struct GNUNET_CRYPTO_EcdhePrivateKey *e1,
1856 const struct GNUNET_CRYPTO_EcdhePrivateKey *e2)
1857{
1858 struct GNUNET_CRYPTO_EcdhePublicKey p1;
1859 struct GNUNET_CRYPTO_EcdhePublicKey p2;
1860 struct GNUNET_HashCode hc1;
1861 struct GNUNET_HashCode hc2;
1862
1863 GNUNET_CRYPTO_ecdhe_key_get_public (e1,
1864 &p1);
1865 GNUNET_CRYPTO_ecdhe_key_get_public (e2,
1866 &p2);
1867 GNUNET_assert (GNUNET_OK ==
1868 GNUNET_CRYPTO_ecc_ecdh (e1,
1869 &p2,
1870 &hc1));
1871 GNUNET_assert (GNUNET_OK ==
1872 GNUNET_CRYPTO_ecc_ecdh (e2,
1873 &p1,
1874 &hc2));
1875 GNUNET_break (0 == memcmp (&hc1,
1876 &hc2,
1877 sizeof (hc1)));
1878}
1879
1880
1881static void
1882check_ed (const struct GNUNET_CRYPTO_EcdhePrivateKey *e1,
1883 const struct GNUNET_CRYPTO_EddsaPrivateKey *e2)
1884{
1885 struct GNUNET_CRYPTO_EcdhePublicKey p1;
1886 struct GNUNET_CRYPTO_EddsaPublicKey p2;
1887 struct GNUNET_HashCode hc1;
1888 struct GNUNET_HashCode hc2;
1889
1890 GNUNET_CRYPTO_ecdhe_key_get_public (e1,
1891 &p1);
1892 GNUNET_CRYPTO_eddsa_key_get_public (e2,
1893 &p2);
1894 GNUNET_assert (GNUNET_OK ==
1895 GNUNET_CRYPTO_ecdh_eddsa (e1,
1896 &p2,
1897 &hc1));
1898 GNUNET_assert (GNUNET_OK ==
1899 GNUNET_CRYPTO_eddsa_ecdh (e2,
1900 &p1,
1901 &hc2));
1902 GNUNET_break (0 == memcmp (&hc1,
1903 &hc2,
1904 sizeof (hc1)));
1905}
1906
1907
1908static void
1909test_crypto_bug (const struct GNUNET_CRYPTO_EcdhePrivateKey *e1,
1910 const struct GNUNET_CRYPTO_EcdhePrivateKey *e2,
1911 const struct GNUNET_CRYPTO_EddsaPrivateKey *d1,
1912 const struct GNUNET_CRYPTO_EddsaPrivateKey *d2)
1913{
1914 check_ee (e1, e2);
1915 check_ed (e1, d2);
1916 check_ed (e2, d1);
1917}
1918
1919#endif
1920
1921
1826/** 1922/**
1827 * Handle KX_AUTH message. 1923 * Handle KX_AUTH message.
1828 * 1924 *
@@ -1852,8 +1948,9 @@ GCT_handle_kx_auth (struct CadetTConnection *ct,
1852 return; 1948 return;
1853 } 1949 }
1854 LOG (GNUNET_ERROR_TYPE_DEBUG, 1950 LOG (GNUNET_ERROR_TYPE_DEBUG,
1855 "Handling KX_AUTH message for %s\n", 1951 "Handling KX_AUTH message from %s with ephemeral %s\n",
1856 GCT_2s (t)); 1952 GCT_2s (t),
1953 GNUNET_e2s (&msg->kx.ephemeral_key));
1857 /* We do everything in ax_tmp until we've checked the authentication 1954 /* We do everything in ax_tmp until we've checked the authentication
1858 so we don't clobber anything we care about by accident. */ 1955 so we don't clobber anything we care about by accident. */
1859 ax_tmp = t->ax; 1956 ax_tmp = t->ax;
@@ -1889,6 +1986,32 @@ GCT_handle_kx_auth (struct CadetTConnection *ct,
1889 GNUNET_NO); 1986 GNUNET_NO);
1890 LOG (GNUNET_ERROR_TYPE_WARNING, 1987 LOG (GNUNET_ERROR_TYPE_WARNING,
1891 "KX AUTH missmatch!\n"); 1988 "KX AUTH missmatch!\n");
1989#if DEBUG_KX
1990 {
1991 struct GNUNET_CRYPTO_EcdhePublicKey ephemeral_key;
1992
1993 GNUNET_CRYPTO_ecdhe_key_get_public (&ax_tmp.kx_0,
1994 &ephemeral_key);
1995 if (0 != memcmp (&ephemeral_key,
1996 &msg->r_ephemeral_key_XXX,
1997 sizeof (ephemeral_key)))
1998 {
1999 LOG (GNUNET_ERROR_TYPE_WARNING,
2000 "My ephemeral is %s!\n",
2001 GNUNET_e2s (&ephemeral_key));
2002 LOG (GNUNET_ERROR_TYPE_WARNING,
2003 "Response is for ephemeral %s!\n",
2004 GNUNET_e2s (&msg->r_ephemeral_key_XXX));
2005 }
2006 else
2007 {
2008 test_crypto_bug (&ax_tmp.kx_0,
2009 &msg->kx.ephemeral_key_XXX,
2010 my_private_key,
2011 &msg->kx.private_key_XXX);
2012 }
2013 }
2014#endif
1892 if (NULL == t->kx_task) 2015 if (NULL == t->kx_task)
1893 t->kx_task 2016 t->kx_task
1894 = GNUNET_SCHEDULER_add_at (t->next_kx_attempt, 2017 = GNUNET_SCHEDULER_add_at (t->next_kx_attempt,
@@ -2301,6 +2424,8 @@ connection_ready_cb (void *cls,
2301 /* Do not begin KX if WE have no channels waiting! */ 2424 /* Do not begin KX if WE have no channels waiting! */
2302 if (0 == GCT_count_channels (t)) 2425 if (0 == GCT_count_channels (t))
2303 return; 2426 return;
2427 if (0 != GNUNET_TIME_absolute_get_remaining (t->next_kx_attempt).rel_value_us)
2428 return; /* wait for timeout before retrying */
2304 /* We are uninitialized, just transmit immediately, 2429 /* We are uninitialized, just transmit immediately,
2305 without undue delay. */ 2430 without undue delay. */
2306 if (NULL != t->kx_task) 2431 if (NULL != t->kx_task)
@@ -2326,6 +2451,8 @@ connection_ready_cb (void *cls,
2326 case CADET_TUNNEL_KEY_OK: 2451 case CADET_TUNNEL_KEY_OK:
2327 if (GNUNET_YES == t->kx_auth_requested) 2452 if (GNUNET_YES == t->kx_auth_requested)
2328 { 2453 {
2454 if (0 != GNUNET_TIME_absolute_get_remaining (t->next_kx_attempt).rel_value_us)
2455 return; /* wait for timeout */
2329 if (NULL != t->kx_task) 2456 if (NULL != t->kx_task)
2330 { 2457 {
2331 GNUNET_SCHEDULER_cancel (t->kx_task); 2458 GNUNET_SCHEDULER_cancel (t->kx_task);
@@ -2433,15 +2560,21 @@ evaluate_connection (void *cls,
2433{ 2560{
2434 struct EvaluationSummary *es = cls; 2561 struct EvaluationSummary *es = cls;
2435 struct CadetConnection *cc = ct->cc; 2562 struct CadetConnection *cc = ct->cc;
2436 struct CadetPeerPath *ps = GCC_get_path (cc); 2563 unsigned int ct_length;
2564 struct CadetPeerPath *ps;
2437 const struct CadetConnectionMetrics *metrics; 2565 const struct CadetConnectionMetrics *metrics;
2438 GNUNET_CONTAINER_HeapCostType ct_desirability; 2566 GNUNET_CONTAINER_HeapCostType ct_desirability;
2439 struct GNUNET_TIME_Relative uptime; 2567 struct GNUNET_TIME_Relative uptime;
2440 struct GNUNET_TIME_Relative last_use; 2568 struct GNUNET_TIME_Relative last_use;
2441 uint32_t ct_length;
2442 double score; 2569 double score;
2443 double success_rate; 2570 double success_rate;
2444 2571
2572 ps = GCC_get_path (cc,
2573 &ct_length);
2574 LOG (GNUNET_ERROR_TYPE_DEBUG,
2575 "Evaluating path %s of existing %s\n",
2576 GCPP_2s (ps),
2577 GCC_2s (cc));
2445 if (ps == es->path) 2578 if (ps == es->path)
2446 { 2579 {
2447 LOG (GNUNET_ERROR_TYPE_DEBUG, 2580 LOG (GNUNET_ERROR_TYPE_DEBUG,
@@ -2450,8 +2583,39 @@ evaluate_connection (void *cls,
2450 es->duplicate = GNUNET_YES; 2583 es->duplicate = GNUNET_YES;
2451 return; 2584 return;
2452 } 2585 }
2586 if (NULL != es->path)
2587 {
2588 int duplicate = GNUNET_YES;
2589
2590 for (unsigned int i=0;i<ct_length;i++)
2591 {
2592 GNUNET_assert (GCPP_get_length (es->path) > i);
2593 if (GCPP_get_peer_at_offset (es->path,
2594 i) !=
2595 GCPP_get_peer_at_offset (ps,
2596 i))
2597 {
2598 duplicate = GNUNET_NO;
2599 break;
2600 }
2601 }
2602 if (GNUNET_YES == duplicate)
2603 {
2604 LOG (GNUNET_ERROR_TYPE_DEBUG,
2605 "Ignoring overlapping path %s.\n",
2606 GCPP_2s (es->path));
2607 es->duplicate = GNUNET_YES;
2608 return;
2609 }
2610 else
2611 {
2612 LOG (GNUNET_ERROR_TYPE_DEBUG,
2613 "Known path %s differs from proposed path\n",
2614 GCPP_2s (ps));
2615 }
2616 }
2617
2453 ct_desirability = GCPP_get_desirability (ps); 2618 ct_desirability = GCPP_get_desirability (ps);
2454 ct_length = GCPP_get_length (ps);
2455 metrics = GCC_get_metrics (cc); 2619 metrics = GCC_get_metrics (cc);
2456 uptime = GNUNET_TIME_absolute_get_duration (metrics->age); 2620 uptime = GNUNET_TIME_absolute_get_duration (metrics->age);
2457 last_use = GNUNET_TIME_absolute_get_duration (metrics->last_use); 2621 last_use = GNUNET_TIME_absolute_get_duration (metrics->last_use);
@@ -2500,6 +2664,8 @@ consider_path_cb (void *cls,
2500 struct CadetTConnection *ct; 2664 struct CadetTConnection *ct;
2501 2665
2502 GNUNET_assert (off < GCPP_get_length (path)); 2666 GNUNET_assert (off < GCPP_get_length (path));
2667 GNUNET_assert (GCPP_get_peer_at_offset (path,
2668 off) == t->destination);
2503 es.min_length = UINT_MAX; 2669 es.min_length = UINT_MAX;
2504 es.max_length = 0; 2670 es.max_length = 0;
2505 es.max_desire = 0; 2671 es.max_desire = 0;
@@ -2509,6 +2675,13 @@ consider_path_cb (void *cls,
2509 es.worst = NULL; 2675 es.worst = NULL;
2510 2676
2511 /* Compute evaluation summary over existing connections. */ 2677 /* Compute evaluation summary over existing connections. */
2678 LOG (GNUNET_ERROR_TYPE_DEBUG,
2679 "Evaluating proposed path %s for target %s\n",
2680 GCPP_2s (path),
2681 GCT_2s (t));
2682 /* FIXME: suspect this does not ACTUALLY iterate
2683 over all existing paths, otherwise dup detection
2684 should work!!! */
2512 GCT_iterate_connections (t, 2685 GCT_iterate_connections (t,
2513 &evaluate_connection, 2686 &evaluate_connection,
2514 &es); 2687 &es);
@@ -2653,9 +2826,10 @@ GCT_consider_path (struct CadetTunnel *t,
2653 unsigned int off) 2826 unsigned int off)
2654{ 2827{
2655 LOG (GNUNET_ERROR_TYPE_DEBUG, 2828 LOG (GNUNET_ERROR_TYPE_DEBUG,
2656 "Considering %s for %s\n", 2829 "Considering %s for %s (offset %u)\n",
2657 GCPP_2s (p), 2830 GCPP_2s (p),
2658 GCT_2s (t)); 2831 GCT_2s (t),
2832 off);
2659 (void) consider_path_cb (t, 2833 (void) consider_path_cb (t,
2660 p, 2834 p,
2661 off); 2835 off);
diff --git a/src/cadet/test_cadet.c b/src/cadet/test_cadet.c
index b9f177652..608136e56 100644
--- a/src/cadet/test_cadet.c
+++ b/src/cadet/test_cadet.c
@@ -402,8 +402,11 @@ stats_cont (void *cls,
402 * @return #GNUNET_OK to continue, #GNUNET_SYSERR to abort iteration 402 * @return #GNUNET_OK to continue, #GNUNET_SYSERR to abort iteration
403 */ 403 */
404static int 404static int
405stats_iterator (void *cls, const struct GNUNET_TESTBED_Peer *peer, 405stats_iterator (void *cls,
406 const char *subsystem, const char *name, uint64_t value, 406 const struct GNUNET_TESTBED_Peer *peer,
407 const char *subsystem,
408 const char *name,
409 uint64_t value,
407 int is_persistent) 410 int is_persistent)
408{ 411{
409 static const char *s_sent = "# keepalives sent"; 412 static const char *s_sent = "# keepalives sent";
@@ -614,10 +617,9 @@ reschedule_timeout_task (long line)
614 * #GNUNET_SYSERR to close it (signal serious error). 617 * #GNUNET_SYSERR to close it (signal serious error).
615 */ 618 */
616static int 619static int
617check_data (void *cls, const struct GNUNET_MessageHeader *message) 620check_data (void *cls,
621 const struct GNUNET_MessageHeader *message)
618{ 622{
619 if (sizeof (struct GNUNET_MessageHeader) >= ntohs (message->size))
620 return GNUNET_SYSERR;
621 return GNUNET_OK; /* all is well-formed */ 623 return GNUNET_OK; /* all is well-formed */
622} 624}
623 625
@@ -646,24 +648,33 @@ handle_data (void *cls,
646 648
647 if (channel == outgoing_ch) 649 if (channel == outgoing_ch)
648 { 650 {
649 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Root client got a message.\n"); 651 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
652 "Root client got a message.\n");
650 } 653 }
651 else if (channel == incoming_ch) 654 else if (channel == incoming_ch)
652 { 655 {
653 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Leaf client got a message.\n"); 656 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
657 "Leaf client got a message.\n");
654 } 658 }
655 else 659 else
656 { 660 {
657 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Unknown channel %p.\n", channel); 661 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
662 "Unknown channel %p.\n",
663 channel);
658 GNUNET_assert (0); 664 GNUNET_assert (0);
659 } 665 }
660 666
661 GNUNET_log (GNUNET_ERROR_TYPE_INFO, " ok: (%d/%d)\n", ok, ok_goal); 667 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
668 " ok: (%d/%d)\n",
669 ok,
670 ok_goal);
662 data = (uint32_t *) &message[1]; 671 data = (uint32_t *) &message[1];
663 payload = ntohl (*data); 672 payload = ntohl (*data);
664 if (payload == *counter) 673 if (payload == *counter)
665 { 674 {
666 GNUNET_log (GNUNET_ERROR_TYPE_INFO, " payload as expected: %u\n", payload); 675 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
676 " payload as expected: %u\n",
677 payload);
667 } 678 }
668 else 679 else
669 { 680 {
@@ -679,7 +690,8 @@ handle_data (void *cls,
679 if (SPEED == test) 690 if (SPEED == test)
680 { 691 {
681 GNUNET_assert (incoming_ch == channel); 692 GNUNET_assert (incoming_ch == channel);
682 send_next_msg_task = GNUNET_SCHEDULER_add_now (&send_next_msg, NULL); 693 send_next_msg_task = GNUNET_SCHEDULER_add_now (&send_next_msg,
694 NULL);
683 return; 695 return;
684 } 696 }
685 } 697 }
@@ -740,7 +752,8 @@ handle_data (void *cls,
740 * received on the @a channel. 752 * received on the @a channel.
741 */ 753 */
742static void * 754static void *
743connect_handler (void *cls, struct GNUNET_CADET_Channel *channel, 755connect_handler (void *cls,
756 struct GNUNET_CADET_Channel *channel,
744 const struct GNUNET_PeerIdentity *source) 757 const struct GNUNET_PeerIdentity *source)
745{ 758{
746 struct CadetTestChannelWrapper *ch; 759 struct CadetTestChannelWrapper *ch;
@@ -748,15 +761,20 @@ connect_handler (void *cls, struct GNUNET_CADET_Channel *channel,
748 761
749 GNUNET_log (GNUNET_ERROR_TYPE_INFO, 762 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
750 "Incoming channel from %s to %ld: %p\n", 763 "Incoming channel from %s to %ld: %p\n",
751 GNUNET_i2s (source), peer, channel); 764 GNUNET_i2s (source),
765 peer,
766 channel);
752 ok++; 767 ok++;
753 GNUNET_log (GNUNET_ERROR_TYPE_INFO, " ok: %d\n", ok); 768 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
769 " ok: %d\n",
770 ok);
754 if (peer == peers_requested - 1) 771 if (peer == peers_requested - 1)
755 { 772 {
756 if (NULL != incoming_ch) 773 if (NULL != incoming_ch)
757 { 774 {
758 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 775 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
759 "Duplicate incoming channel for client %lu\n", (long) cls); 776 "Duplicate incoming channel for client %lu\n",
777 (long) cls);
760 GNUNET_assert (0); 778 GNUNET_assert (0);
761 } 779 }
762 incoming_ch = channel; 780 incoming_ch = channel;
@@ -764,7 +782,8 @@ connect_handler (void *cls, struct GNUNET_CADET_Channel *channel,
764 else 782 else
765 { 783 {
766 GNUNET_log (GNUNET_ERROR_TYPE_WARNING, 784 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
767 "Incoming channel for unexpected peer #%lu\n", (long) cls); 785 "Incoming channel for unexpected peer #%lu\n",
786 (long) cls);
768 GNUNET_assert (0); 787 GNUNET_assert (0);
769 } 788 }
770 if (NULL != disconnect_task) 789 if (NULL != disconnect_task)
@@ -1003,7 +1022,6 @@ main (int argc, char *argv[])
1003 "short_time", 1022 "short_time",
1004 gettext_noop ("set short timeout"), 1023 gettext_noop ("set short timeout"),
1005 &short_time), 1024 &short_time),
1006
1007 GNUNET_GETOPT_option_uint ('m', 1025 GNUNET_GETOPT_option_uint ('m',
1008 "messages", 1026 "messages",
1009 "NUM_MESSAGES", 1027 "NUM_MESSAGES",
diff --git a/src/cadet/test_cadet_flow.c b/src/cadet/test_cadet_flow.c
new file mode 100644
index 000000000..554ee1d85
--- /dev/null
+++ b/src/cadet/test_cadet_flow.c
@@ -0,0 +1,888 @@
1/*
2 This file is part of GNUnet.
3 Copyright (C) 2011, 2017 GNUnet e.V.
4
5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 3, or (at your
8 option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with GNUnet; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 Boston, MA 02110-1301, USA.
19*/
20/**
21 * @file cadet/test_cadet_flow.c
22 * @author Bart Polot
23 * @author Christian Grothoff
24 * @brief Test for flow control of CADET service
25 */
26#include <stdio.h>
27#include "platform.h"
28#include "cadet_test_lib.h"
29#include "gnunet_cadet_service.h"
30#include "gnunet_statistics_service.h"
31#include <gauger.h>
32
33
34/**
35 * Ugly workaround to unify data handlers on incoming and outgoing channels.
36 */
37struct CadetTestChannelWrapper
38{
39 /**
40 * Channel pointer.
41 */
42 struct GNUNET_CADET_Channel *ch;
43};
44
45/**
46 * How many messages to send by default.
47 */
48#define TOTAL_PACKETS_DEFAULT 500
49
50/**
51 * How long until we give up on connecting the peers?
52 */
53#define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 120)
54
55/**
56 * Time to wait by default for stuff that should be rather fast.
57 */
58#define SHORT_TIME GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 20)
59
60/**
61 * How fast do we send messages?
62 */
63#define SEND_INTERVAL GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MILLISECONDS, 10)
64
65
66/**
67 * How many packets to send.
68 */
69static unsigned int total_packets = TOTAL_PACKETS_DEFAULT;
70
71/**
72 * Time to wait for fast operations.
73 */
74static struct GNUNET_TIME_Relative short_time;
75
76/**
77 * Size of each test packet's payload
78 */
79static size_t size_payload = sizeof (uint32_t);
80
81/**
82 * Operation to get peer ids.
83 */
84static struct GNUNET_TESTBED_Operation *t_op[2];
85
86/**
87 * Peer ids.
88 */
89static struct GNUNET_PeerIdentity *p_id[2];
90
91/**
92 * Port ID
93 */
94static struct GNUNET_HashCode port;
95
96/**
97 * Peer ids counter.
98 */
99static unsigned int p_ids;
100
101/**
102 * Is the setup initialized?
103 */
104static int initialized;
105
106/**
107 * Number of payload packes sent.
108 */
109static int data_sent;
110
111/**
112 * Number of payload packets received.
113 */
114static int data_received;
115
116/**
117 * Number of payload packed acknowledgements sent.
118 */
119static int ack_sent;
120
121/**
122 * Number of payload packed explicitly (app level) acknowledged.
123 */
124static int ack_received;
125
126/**
127 * Total number of peers asked to run.
128 */
129static unsigned int peers_requested = 2;
130
131/**
132 * Number of currently running peers (should be same as @c peers_requested).
133 */
134static unsigned int peers_running;
135
136/**
137 * Test context (to shut down).
138 */
139struct GNUNET_CADET_TEST_Context *test_ctx;
140
141/**
142 * Task called to disconnect peers.
143 */
144static struct GNUNET_SCHEDULER_Task *disconnect_task;
145
146/**
147 * Task To perform tests
148 */
149static struct GNUNET_SCHEDULER_Task *test_task;
150
151/**
152 * Task runnining #send_next_msg().
153 */
154static struct GNUNET_SCHEDULER_Task *send_next_msg_task;
155
156/**
157 * Cadet handle for the root peer
158 */
159static struct GNUNET_CADET_Handle *h1;
160
161/**
162 * Cadet handle for the first leaf peer
163 */
164static struct GNUNET_CADET_Handle *h2;
165
166/**
167 * Channel handle for the root peer
168 */
169static struct GNUNET_CADET_Channel *outgoing_ch;
170
171/**
172 * Channel handle for the dest peer
173 */
174static struct GNUNET_CADET_Channel *incoming_ch;
175
176/**
177 * Time we started the data transmission (after channel has been established
178 * and initilized).
179 */
180static struct GNUNET_TIME_Absolute start_time;
181
182/**
183 * Peers handle.
184 */
185static struct GNUNET_TESTBED_Peer **testbed_peers;
186
187/**
188 * Statistics operation handle.
189 */
190static struct GNUNET_TESTBED_Operation *stats_op;
191
192/**
193 * Keepalives sent.
194 */
195static unsigned int ka_sent;
196
197/**
198 * Keepalives received.
199 */
200static unsigned int ka_received;
201
202/**
203 * How many messages were dropped by CADET because of full buffers?
204 */
205static unsigned int msg_dropped;
206
207
208/**
209 * Show the results of the test (banwidth acheived) and log them to GAUGER
210 */
211static void
212show_end_data (void)
213{
214 static struct GNUNET_TIME_Absolute end_time;
215 static struct GNUNET_TIME_Relative total_time;
216
217 end_time = GNUNET_TIME_absolute_get ();
218 total_time = GNUNET_TIME_absolute_get_difference (start_time, end_time);
219 FPRINTF (stderr,
220 "\nResults of test \"%s\"\n",
221 test_name);
222 FPRINTF (stderr,
223 "Test time %s\n",
224 GNUNET_STRINGS_relative_time_to_string (total_time, GNUNET_YES));
225 FPRINTF (stderr,
226 "Test bandwidth: %f kb/s\n",
227 4 * total_packets * 1.0 / (total_time.rel_value_us / 1000)); // 4bytes * ms
228 FPRINTF (stderr,
229 "Test throughput: %f packets/s\n\n",
230 total_packets * 1000.0 / (total_time.rel_value_us / 1000)); // packets * ms
231 GAUGER ("CADET",
232 test_name,
233 total_packets * 1000.0 / (total_time.rel_value_us / 1000),
234 "packets/s");
235}
236
237
238/**
239 * Shut down peergroup, clean up.
240 *
241 * @param cls Closure (unused).
242 * @param tc Task Context.
243 */
244static void
245shutdown_task (void *cls)
246{
247 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
248 "Ending test.\n");
249 if (NULL != send_next_msg_task)
250 {
251 GNUNET_SCHEDULER_cancel (send_next_msg_task);
252 send_next_msg_task = NULL;
253 }
254 if (NULL != test_task)
255 {
256 GNUNET_SCHEDULER_cancel (test_task);
257 test_task = NULL;
258 }
259 for (unsigned int i = 0; i < 2; i++)
260 GNUNET_TESTBED_operation_done (t_op[i]);
261 if (NULL != outgoing_ch)
262 {
263 GNUNET_CADET_channel_destroy (outgoing_ch);
264 outgoing_ch = NULL;
265 }
266 if (NULL != incoming_ch)
267 {
268 GNUNET_CADET_channel_destroy (incoming_ch);
269 incoming_ch = NULL;
270 }
271 GNUNET_CADET_TEST_cleanup (test_ctx);
272}
273
274
275/**
276 * Stats callback. Finish the stats testbed operation and when all stats have
277 * been iterated, shutdown the test.
278 *
279 * @param cls Closure (line number from which termination was requested).
280 * @param op the operation that has been finished
281 * @param emsg error message in case the operation has failed; will be NULL if
282 * operation has executed successfully.
283 */
284static void
285stats_cont (void *cls,
286 struct GNUNET_TESTBED_Operation *op,
287 const char *emsg)
288{
289 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
290 "KA sent: %u, KA received: %u\n",
291 ka_sent,
292 ka_received);
293 if ((KEEPALIVE == test) && ((ka_sent < 2) || (ka_sent > ka_received + 1)))
294 {
295 GNUNET_break (0);
296 ok--;
297 }
298 GNUNET_TESTBED_operation_done (stats_op);
299
300 if (NULL != disconnect_task)
301 GNUNET_SCHEDULER_cancel (disconnect_task);
302 disconnect_task = GNUNET_SCHEDULER_add_now (&disconnect_cadet_peers,
303 cls);
304}
305
306
307/**
308 * Process statistic values.
309 *
310 * @param cls closure (line number, unused)
311 * @param peer the peer the statistic belong to
312 * @param subsystem name of subsystem that created the statistic
313 * @param name the name of the datum
314 * @param value the current value
315 * @param is_persistent #GNUNET_YES if the value is persistent, #GNUNET_NO if not
316 * @return #GNUNET_OK to continue, #GNUNET_SYSERR to abort iteration
317 */
318static int
319stats_iterator (void *cls,
320 const struct GNUNET_TESTBED_Peer *peer,
321 const char *subsystem,
322 const char *name,
323 uint64_t value,
324 int is_persistent)
325{
326 static const char *s_sent = "# keepalives sent";
327 static const char *s_recv = "# keepalives received";
328 static const char *rdrops = "# messages dropped due to full buffer";
329 static const char *cdrops = "# messages dropped due to slow client";
330 uint32_t i;
331
332 i = GNUNET_TESTBED_get_index (peer);
333 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "STATS PEER %u - %s [%s]: %llu\n", i,
334 subsystem, name, (unsigned long long) value);
335 if (0 == strncmp (s_sent, name, strlen (s_sent)) && 0 == i)
336 ka_sent = value;
337 if (0 == strncmp (s_recv, name, strlen (s_recv)) && peers_requested - 1 == i)
338 ka_received = value;
339 if (0 == strncmp (rdrops, name, strlen (rdrops)))
340 msg_dropped += value;
341 if (0 == strncmp (cdrops, name, strlen (cdrops)))
342 msg_dropped += value;
343
344 return GNUNET_OK;
345}
346
347
348/**
349 * Task to gather all statistics.
350 *
351 * @param cls Closure (line from which the task was scheduled).
352 */
353static void
354gather_stats_and_exit (void *cls)
355{
356 long l = (long) cls;
357
358 disconnect_task = NULL;
359 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
360 "gathering statistics from line %ld\n",
361 l);
362 if (NULL != outgoing_ch)
363 {
364 GNUNET_CADET_channel_destroy (outgoing_ch);
365 outgoing_ch = NULL;
366 }
367 stats_op = GNUNET_TESTBED_get_statistics (peers_running,
368 testbed_peers,
369 "cadet",
370 NULL,
371 &stats_iterator,
372 stats_cont,
373 cls);
374}
375
376
377/**
378 * Abort test: schedule disconnect and shutdown immediately
379 *
380 * @param line Line in the code the abort is requested from (__LINE__).
381 */
382static void
383abort_test (long line)
384{
385 if (NULL != disconnect_task)
386 {
387 GNUNET_SCHEDULER_cancel (disconnect_task);
388 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
389 "Aborting test from %ld\n",
390 line);
391 disconnect_task =
392 GNUNET_SCHEDULER_add_now (&disconnect_cadet_peers,
393 (void *) line);
394 }
395}
396
397
398/**
399 * Send a message on the channel with the appropriate size and payload.
400 *
401 * Update the appropriate *_sent counter.
402 *
403 * @param channel Channel to send the message on.
404 */
405static void
406send_test_message (struct GNUNET_CADET_Channel *channel)
407{
408 struct GNUNET_MQ_Envelope *env;
409 struct GNUNET_MessageHeader *msg;
410 uint32_t *data;
411 int payload;
412 int size;
413
414 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
415 "Sending test message on channel %p\n",
416 channel);
417 size = size_payload;
418 if (GNUNET_NO == initialized)
419 {
420 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending INITIALIZER\n");
421 size += 1000;
422 payload = data_sent;
423 if (SPEED_ACK == test) // FIXME unify SPEED_ACK with an initializer
424 data_sent++;
425 }
426 else if (SPEED == test || SPEED_ACK == test)
427 {
428 if (get_target_channel() == channel)
429 {
430 payload = ack_sent;
431 size += ack_sent;
432 ack_sent++;
433 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
434 "Sending ACK %u [%d bytes]\n",
435 payload, size);
436 }
437 else
438 {
439 payload = data_sent;
440 size += data_sent;
441 data_sent++;
442 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
443 "Sending DATA %u [%d bytes]\n",
444 data_sent, size);
445 }
446 }
447 else if (FORWARD == test)
448 {
449 payload = ack_sent;
450 }
451 else if (P2P_SIGNAL == test)
452 {
453 payload = data_sent;
454 }
455 else
456 {
457 GNUNET_assert (0);
458 }
459 env = GNUNET_MQ_msg_extra (msg, size, GNUNET_MESSAGE_TYPE_DUMMY);
460
461 data = (uint32_t *) &msg[1];
462 *data = htonl (payload);
463 GNUNET_MQ_send (GNUNET_CADET_get_mq (channel), env);
464}
465
466
467/**
468 * Task to request a new data transmission in a SPEED test, without waiting
469 * for previous messages to be sent/arrrive.
470 *
471 * @param cls Closure (unused).
472 */
473static void
474send_next_msg (void *cls)
475{
476 struct GNUNET_CADET_Channel *channel;
477
478 send_next_msg_task = NULL;
479 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
480 "Sending next message: %d\n",
481 data_sent);
482
483 channel = GNUNET_YES == test_backwards ? incoming_ch : outgoing_ch;
484 GNUNET_assert (NULL != channel);
485 GNUNET_assert (SPEED == test);
486 send_test_message (channel);
487 if (data_sent < total_packets)
488 {
489 /* SPEED test: Send all messages as soon as possible */
490 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
491 "Scheduling message %d\n",
492 data_sent + 1);
493 send_next_msg_task =
494 GNUNET_SCHEDULER_add_delayed (SEND_INTERVAL,
495 &send_next_msg,
496 NULL);
497 }
498}
499
500
501/**
502 * Check if payload is sane (size contains payload).
503 *
504 * @param cls should match #ch
505 * @param message The actual message.
506 * @return #GNUNET_OK to keep the channel open,
507 * #GNUNET_SYSERR to close it (signal serious error).
508 */
509static int
510check_data (void *cls,
511 const struct GNUNET_MessageHeader *message)
512{
513 return GNUNET_OK; /* all is well-formed */
514}
515
516
517/**
518 * Function is called whenever a message is received.
519 *
520 * @param cls closure (set from GNUNET_CADET_connect(), peer number)
521 * @param message the actual message
522 */
523static void
524handle_data (void *cls,
525 const struct GNUNET_MessageHeader *message)
526{
527 struct CadetTestChannelWrapper *ch = cls;
528 struct GNUNET_CADET_Channel *channel = ch->ch;
529 uint32_t *data;
530 uint32_t payload;
531 int *counter;
532
533 GNUNET_CADET_receive_done (channel);
534 counter = get_target_channel () == channel ? &data_received : &ack_received;
535 if (channel == outgoing_ch)
536 {
537 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
538 "Root client got a message.\n");
539 }
540 else if (channel == incoming_ch)
541 {
542 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
543 "Leaf client got a message.\n");
544 }
545 else
546 {
547 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
548 "Unknown channel %p.\n",
549 channel);
550 GNUNET_assert (0);
551 }
552
553 data = (uint32_t *) &message[1];
554 payload = ntohl (*data);
555 if (payload == *counter)
556 {
557 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
558 "Payload as expected: %u\n",
559 payload);
560 }
561 else
562 {
563 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
564 "Received payload %u, expected: %u\n",
565 payload, *counter);
566 }
567 (*counter)++;
568 if (get_target_channel () == channel) /* Got "data" */
569 {
570 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
571 " received data %u\n",
572 data_received);
573 if (data_received < total_packets)
574 return;
575 }
576 else /* Got "ack" */
577 {
578 if (SPEED_ACK == test || SPEED == test)
579 {
580 GNUNET_log (GNUNET_ERROR_TYPE_INFO, " received ack %u\n", ack_received);
581 /* Send more data */
582 send_test_message (channel);
583 if (ack_received < total_packets && SPEED != test)
584 return;
585 if (ok == 2 && SPEED == test)
586 return;
587 show_end_data ();
588 }
589 if (test == P2P_SIGNAL)
590 {
591 GNUNET_CADET_channel_destroy (incoming_ch);
592 incoming_ch = NULL;
593 }
594 else
595 {
596 GNUNET_CADET_channel_destroy (outgoing_ch);
597 outgoing_ch = NULL;
598 }
599 }
600}
601
602
603/**
604 * Method called whenever a peer connects to a port in MQ-based CADET.
605 *
606 * @param cls Closure from #GNUNET_CADET_open_port (peer # as long).
607 * @param channel New handle to the channel.
608 * @param source Peer that started this channel.
609 * @return Closure for the incoming @a channel. It's given to:
610 * - The #GNUNET_CADET_DisconnectEventHandler (given to
611 * #GNUNET_CADET_open_port) when the channel dies.
612 * - Each the #GNUNET_MQ_MessageCallback handlers for each message
613 * received on the @a channel.
614 */
615static void *
616connect_handler (void *cls,
617 struct GNUNET_CADET_Channel *channel,
618 const struct GNUNET_PeerIdentity *source)
619{
620 struct CadetTestChannelWrapper *ch;
621 long peer = (long) cls;
622
623 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
624 "Incoming channel from %s to %ld: %p\n",
625 GNUNET_i2s (source),
626 peer,
627 channel);
628 if (peer == peers_requested - 1)
629 {
630 if (NULL != incoming_ch)
631 {
632 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
633 "Duplicate incoming channel for client %lu\n",
634 (long) cls);
635 GNUNET_assert (0);
636 }
637 incoming_ch = channel;
638 }
639 else
640 {
641 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
642 "Incoming channel for unexpected peer #%lu\n",
643 (long) cls);
644 GNUNET_assert (0);
645 }
646 ch = GNUNET_new (struct CadetTestChannelWrapper);
647 ch->ch = channel;
648
649 return ch;
650}
651
652
653/**
654 * Function called whenever an MQ-channel is destroyed, even if the destruction
655 * was requested by #GNUNET_CADET_channel_destroy.
656 * It must NOT call #GNUNET_CADET_channel_destroy on the channel.
657 *
658 * It should clean up any associated state, including cancelling any pending
659 * transmission on this channel.
660 *
661 * @param cls Channel closure (channel wrapper).
662 * @param channel Connection to the other end (henceforth invalid).
663 */
664static void
665disconnect_handler (void *cls,
666 const struct GNUNET_CADET_Channel *channel)
667{
668 struct CadetTestChannelWrapper *ch_w = cls;
669
670 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
671 "Channel disconnected at %d\n",
672 ok);
673 GNUNET_assert (ch_w->ch == channel);
674 if (channel == incoming_ch)
675 incoming_ch = NULL;
676 else if (outgoing_ch == channel)
677 outgoing_ch = NULL;
678 else
679 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
680 "Disconnect on unknown channel %p\n",
681 channel);
682 if (NULL != disconnect_task)
683 GNUNET_SCHEDULER_cancel (disconnect_task);
684 disconnect_task = GNUNET_SCHEDULER_add_now (&gather_stats_and_exit,
685 (void *) __LINE__);
686 GNUNET_free (ch_w);
687}
688
689
690/**
691 * Start the testcase, we know the peers and have handles to CADET.
692 *
693 * Testcase continues when the root receives confirmation of connected peers,
694 * on callback function ch.
695 *
696 * @param cls Closure (unused).
697 */
698static void
699start_test (void *cls)
700{
701 struct GNUNET_MQ_MessageHandler handlers[] = {
702 GNUNET_MQ_hd_var_size (data,
703 GNUNET_MESSAGE_TYPE_DUMMY,
704 struct GNUNET_MessageHeader,
705 NULL),
706 GNUNET_MQ_handler_end ()
707 };
708 struct CadetTestChannelWrapper *ch;
709 enum GNUNET_CADET_ChannelOption flags;
710
711 test_task = NULL;
712 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
713 "In start_test\n");
714 start_time = GNUNET_TIME_absolute_get ();
715 ch = GNUNET_new (struct CadetTestChannelWrapper);
716 outgoing_ch = GNUNET_CADET_channel_create (h1,
717 ch,
718 p_id[1],
719 &port,
720 flags,
721 NULL,
722 &disconnect_handler,
723 handlers);
724 ch->ch = outgoing_ch;
725 GNUNET_assert (NULL == disconnect_task);
726 disconnect_task
727 = GNUNET_SCHEDULER_add_delayed (short_time,
728 &gather_stats_and_exit,
729 (void *) __LINE__);
730 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
731 "Sending data initializer on channel %p...\n",
732 outgoing_ch);
733 send_test_message (outgoing_ch);
734}
735
736
737/**
738 * Callback to be called when the requested peer information is available
739 *
740 * @param cls the closure from GNUNET_TESTBED_peer_get_information()
741 * @param op the operation this callback corresponds to
742 * @param pinfo the result; will be NULL if the operation has failed
743 * @param emsg error message if the operation has failed;
744 * NULL if the operation is successfull
745 */
746static void
747pi_cb (void *cls,
748 struct GNUNET_TESTBED_Operation *op,
749 const struct GNUNET_TESTBED_PeerInformation *pinfo,
750 const char *emsg)
751{
752 long i = (long) cls;
753
754 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
755 "ID callback for %ld\n",
756 i);
757 if ( (NULL == pinfo) ||
758 (NULL != emsg) )
759 {
760 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
761 "pi_cb: %s\n",
762 emsg);
763 abort_test (__LINE__);
764 return;
765 }
766 p_id[i] = pinfo->result.id;
767 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
768 "id: %s\n",
769 GNUNET_i2s (p_id[i]));
770 p_ids++;
771 if (p_ids < 2)
772 return;
773 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
774 "Got all IDs, starting test\n");
775 test_task = GNUNET_SCHEDULER_add_now (&start_test,
776 NULL);
777}
778
779
780/**
781 * test main: start test when all peers are connected
782 *
783 * @param cls Closure.
784 * @param ctx Argument to give to GNUNET_CADET_TEST_cleanup on test end.
785 * @param num_peers Number of peers that are running.
786 * @param peers Array of peers.
787 * @param cadets Handle to each of the CADETs of the peers.
788 */
789static void
790tmain (void *cls,
791 struct GNUNET_CADET_TEST_Context *ctx,
792 unsigned int num_peers,
793 struct GNUNET_TESTBED_Peer **peers,
794 struct GNUNET_CADET_Handle **cadets)
795{
796 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
797 "test main\n");
798 test_ctx = ctx;
799 peers_running = num_peers;
800 GNUNET_assert (peers_running == peers_requested);
801 testbed_peers = peers;
802 h1 = cadets[0];
803 h2 = cadets[num_peers - 1];
804 GNUNET_SCHEDULER_add_shutdown (&shutdown_task,
805 NULL);
806 p_ids = 0;
807 t_op[0] = GNUNET_TESTBED_peer_get_information (peers[0],
808 GNUNET_TESTBED_PIT_IDENTITY,
809 &pi_cb,
810 (void *) 0L);
811 t_op[1] = GNUNET_TESTBED_peer_get_information (peers[num_peers - 1],
812 GNUNET_TESTBED_PIT_IDENTITY,
813 &pi_cb,
814 (void *) 1L);
815 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
816 "requested peer ids\n");
817}
818
819
820/**
821 * Main: start test
822 */
823int
824main (int argc,
825 char *argv[])
826{
827 static const struct GNUNET_HashCode *ports[2];
828 struct GNUNET_MQ_MessageHandler handlers[] = {
829 GNUNET_MQ_hd_var_size (data,
830 GNUNET_MESSAGE_TYPE_DUMMY,
831 struct GNUNET_MessageHeader,
832 NULL),
833 GNUNET_MQ_handler_end ()
834 };
835 const char *config_file = "test_cadet.conf";
836 char port_id[] = "test port";
837 struct GNUNET_GETOPT_CommandLineOption options[] = {
838 GNUNET_GETOPT_option_relative_time ('t',
839 "time",
840 "short_time",
841 gettext_noop ("set short timeout"),
842 &short_time),
843 GNUNET_GETOPT_option_uint ('m',
844 "messages",
845 "NUM_MESSAGES",
846 gettext_noop ("set number of messages to send"),
847 &total_packets),
848 GNUNET_GETOPT_option_uint ('p',
849 "peers",
850 "NUM_PEERS",
851 gettext_noop ("number of peers to launch"),
852 &peers_requested),
853 GNUNET_GETOPT_OPTION_END
854 };
855
856 GNUNET_log_setup ("test-cadet-flow",
857 "DEBUG",
858 NULL);
859 total_packets = TOTAL_PACKETS;
860 short_time = SHORT_TIME;
861 if (-1 == GNUNET_GETOPT_run (argv[0],
862 options,
863 argc,
864 argv))
865 {
866 FPRINTF (stderr,
867 "test failed: problem with CLI parameters\n");
868 return 1;
869 }
870 GNUNET_CRYPTO_hash (port_id,
871 sizeof (port_id),
872 &port);
873 ports[0] = &port;
874 ports[1] = NULL;
875 GNUNET_CADET_TEST_ruN ("test_cadet_flow",
876 config_file,
877 peers_requested,
878 &tmain,
879 NULL, /* tmain cls */
880 &connect_handler,
881 NULL,
882 &disconnect_handler,
883 handlers,
884 ports);
885 return 0;
886}
887
888/* end of test_cadet_flow.c */
diff --git a/src/cadet/test_cadet_local_mq.c b/src/cadet/test_cadet_local_mq.c
index 3089c7fbb..2ea754743 100644
--- a/src/cadet/test_cadet_local_mq.c
+++ b/src/cadet/test_cadet_local_mq.c
@@ -19,7 +19,7 @@
19*/ 19*/
20 20
21/** 21/**
22 * @file cadet/test_cadet_local.c 22 * @file cadet/test_cadet_local_mq.c
23 * @brief test cadet local: test of cadet channels with just one peer 23 * @brief test cadet local: test of cadet channels with just one peer
24 * @author Bartlomiej Polot 24 * @author Bartlomiej Polot
25 */ 25 */
@@ -123,7 +123,9 @@ do_shutdown (void *cls)
123static void 123static void
124do_abort (void *cls) 124do_abort (void *cls)
125{ 125{
126 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "ABORT from line %ld\n", (long) cls); 126 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
127 "ABORT from line %ld\n",
128 (long) cls);
127 result = GNUNET_SYSERR; 129 result = GNUNET_SYSERR;
128 abort_task = NULL; 130 abort_task = NULL;
129 GNUNET_SCHEDULER_shutdown (); 131 GNUNET_SCHEDULER_shutdown ();
@@ -148,7 +150,8 @@ connected (void *cls,
148{ 150{
149 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 151 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
150 "connected %s, cls: %p\n", 152 "connected %s, cls: %p\n",
151 GNUNET_i2s(source), cls); 153 GNUNET_i2s(source),
154 cls);
152 return channel; 155 return channel;
153} 156}
154 157
@@ -206,7 +209,8 @@ handle_data_received (void *cls,
206static void 209static void
207message_sent (void *cls) 210message_sent (void *cls)
208{ 211{
209 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "message sent\n"); 212 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
213 "message sent\n");
210} 214}
211 215
212 216
diff --git a/src/consensus/.gitignore b/src/consensus/.gitignore
index d49147d17..8050d760e 100644
--- a/src/consensus/.gitignore
+++ b/src/consensus/.gitignore
@@ -3,3 +3,4 @@ gnunet-consensus-profiler
3gnunet-service-consensus 3gnunet-service-consensus
4test_consensus_api 4test_consensus_api
5resource.log.master 5resource.log.master
6consensus-simulation.py
diff --git a/src/consensus/Makefile.am b/src/consensus/Makefile.am
index c0205ee5d..991e36a95 100644
--- a/src/consensus/Makefile.am
+++ b/src/consensus/Makefile.am
@@ -27,6 +27,17 @@ libexec_PROGRAMS += \
27 gnunet-service-evil-consensus 27 gnunet-service-evil-consensus
28endif 28endif
29 29
30do_subst = $(SED) -e 's,[@]PYTHON[@],$(PYTHON),g'
31
32SUFFIXES = .py.in .py
33
34.py.in.py:
35 $(do_subst) < $< > $@
36 chmod +x $@
37
38check-python-style:
39 flake8 consensus-simulation.py.in
40
30lib_LTLIBRARIES = \ 41lib_LTLIBRARIES = \
31 libgnunetconsensus.la 42 libgnunetconsensus.la
32 43
@@ -103,5 +114,12 @@ test_consensus_api_LDADD = \
103 $(top_builddir)/src/testing/libgnunettesting.la \ 114 $(top_builddir)/src/testing/libgnunettesting.la \
104 libgnunetconsensus.la 115 libgnunetconsensus.la
105 116
117noinst_SCRIPTS = \
118 consensus-simulation.py
119
120CLEANFILES = \
121 $(noinst_SCRIPTS)
122
106EXTRA_DIST = \ 123EXTRA_DIST = \
107 test_consensus.conf 124 test_consensus.conf \
125 consensus-simulation.py.in
diff --git a/src/consensus/consensus-simulation.py b/src/consensus/consensus-simulation.py
deleted file mode 100644
index 542fe0dac..000000000
--- a/src/consensus/consensus-simulation.py
+++ /dev/null
@@ -1,108 +0,0 @@
1#!/usr/bin/python
2# This file is part of GNUnet
3# (C) 2013 Christian Grothoff (and other contributing authors)
4#
5# GNUnet is free software; you can redistribute it and/or modify
6# it under the terms of the GNU General Public License as published
7# by the Free Software Foundation; either version 2, or (at your
8# option) any later version.
9#
10# GNUnet is distributed in the hope that it will be useful, but
11# WITHOUT ANY WARRANTY; without even the implied warranty of
12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13# General Public License for more details.
14#
15# You should have received a copy of the GNU General Public License
16# along with GNUnet; see the file COPYING. If not, write to the
17# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18# Boston, MA 02110-1301, USA.
19
20from __future__ import absolute_import
21from __future__ import print_function
22import argparse
23import random
24from math import ceil,log,floor
25
26
27def bsc(n):
28 """ count the bits set in n"""
29 l = n.bit_length()
30 c = 0
31 x = 1
32 for _ in range(0, l):
33 if n & x:
34 c = c + 1
35 x = x << 1
36 return c
37
38
39def simulate(k, n, verbose):
40 assert k < n
41 largest_arc = int(2**ceil(log(n, 2))) / 2
42 num_ghosts = (2 * largest_arc) - n
43 if verbose:
44 print "we have", num_ghosts, "ghost peers"
45 # n.b. all peers with idx<k are evil
46 peers = range(n)
47 info = [1 << x for x in xrange(n)]
48 def done_p():
49 for x in xrange(k, n):
50 if bsc(info[x]) < n-k:
51 return False
52 return True
53 rounds = 0
54 while not done_p():
55 if verbose:
56 print "-- round --"
57 arc = 1
58 while arc <= largest_arc:
59 if verbose:
60 print "-- subround --"
61 new_info = [x for x in info]
62 for peer_physical in xrange(n):
63 peer_logical = peers[peer_physical]
64 peer_type = None
65 partner_logical = (peer_logical + arc) % n
66 partner_physical = peers.index(partner_logical)
67 if peer_physical < k or partner_physical < k:
68 if verbose:
69 print "bad peer in connection", peer_physical, "--", partner_physical
70 continue
71 if peer_logical & arc == 0:
72 # we are outgoing
73 if verbose:
74 print peer_physical, "connects to", partner_physical
75 peer_type = "outgoing"
76 if peer_logical < num_ghosts:
77 # we have a ghost, check if the peer who connects
78 # to our ghost is actually outgoing
79 ghost_partner_logical = (peer_logical - arc) % n
80 if ghost_partner_logical & arc == 0:
81 peer_type = peer_type + ", ghost incoming"
82 new_info[peer_physical] = new_info[peer_physical] | info[peer_physical] | info[partner_physical]
83 new_info[partner_physical] = new_info[partner_physical] | info[peer_physical] | info[partner_physical]
84 else:
85 peer_type = "incoming"
86 if verbose > 1:
87 print "type of", str(peer_physical) + ":", peer_type
88 info = new_info
89 arc = arc << 1;
90 rounds = rounds + 1
91 random.shuffle(peers)
92 return rounds
93
94
95if __name__ == "__main__":
96 parser = argparse.ArgumentParser()
97 parser.add_argument("k", metavar="k", type=int, help="#(bad peers)")
98 parser.add_argument("n", metavar="n", type=int, help="#(all peers)")
99 parser.add_argument("r", metavar="r", type=int, help="#(rounds)")
100 parser.add_argument('--verbose', '-v', action='count')
101
102 args = parser.parse_args()
103 sum = 0.0;
104 for n in xrange (0, args.r):
105 sum += simulate(args.k, args.n, args.verbose)
106 printsum / args.r;
107
108
diff --git a/src/consensus/consensus-simulation.py.in b/src/consensus/consensus-simulation.py.in
new file mode 100644
index 000000000..6629ffaa8
--- /dev/null
+++ b/src/consensus/consensus-simulation.py.in
@@ -0,0 +1,110 @@
1#!@PYTHON@
2# This file is part of GNUnet
3# (C) 2013, 2018 Christian Grothoff (and other contributing authors)
4#
5# GNUnet is free software; you can redistribute it and/or modify
6# it under the terms of the GNU General Public License as published
7# by the Free Software Foundation; either version 2, or (at your
8# option) any later version.
9#
10# GNUnet is distributed in the hope that it will be useful, but
11# WITHOUT ANY WARRANTY; without even the implied warranty of
12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13# General Public License for more details.
14#
15# You should have received a copy of the GNU General Public License
16# along with GNUnet; see the file COPYING. If not, write to the
17# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18# Boston, MA 02110-1301, USA.
19
20from __future__ import absolute_import
21from __future__ import print_function
22import argparse
23import random
24from math import ceil, log, floor
25from past.builtins import xrange
26
27
28def bsc(n):
29 """ count the bits set in n"""
30 l = n.bit_length()
31 c = 0
32 x = 1
33 for _ in range(0, l):
34 if n & x:
35 c = c + 1
36 x = x << 1
37 return c
38
39
40def simulate(k, n, verbose):
41 assert k < n
42 largest_arc = int(2**ceil(log(n, 2))) / 2
43 num_ghosts = (2 * largest_arc) - n
44 if verbose:
45 print("we have", num_ghosts, "ghost peers")
46 # n.b. all peers with idx<k are evil
47 peers = range(n)
48 # py2-3 compatible, backwards.
49 # refer to http://python-future.org/compatible_idioms.html#xrange
50 info = [1 << x for x in xrange(n)]
51
52 def done_p():
53 for x in xrange(k, n):
54 if bsc(info[x]) < n-k:
55 return False
56 return True
57 rounds = 0
58 while not done_p():
59 if verbose:
60 print("-- round --")
61 arc = 1
62 while arc <= largest_arc:
63 if verbose:
64 print("-- subround --")
65 new_info = [x for x in info]
66 for peer_physical in xrange(n):
67 peer_logical = peers[peer_physical]
68 peer_type = None
69 partner_logical = (peer_logical + arc) % n
70 partner_physical = peers.index(partner_logical)
71 if peer_physical < k or partner_physical < k:
72 if verbose:
73 print("bad peer in connection", peer_physical, "--", partner_physical)
74 continue
75 if peer_logical & arc == 0:
76 # we are outgoing
77 if verbose:
78 print(peer_physical, "connects to", partner_physical)
79 peer_type = "outgoing"
80 if peer_logical < num_ghosts:
81 # we have a ghost, check if the peer who connects
82 # to our ghost is actually outgoing
83 ghost_partner_logical = (peer_logical - arc) % n
84 if ghost_partner_logical & arc == 0:
85 peer_type = peer_type + ", ghost incoming"
86 new_info[peer_physical] = new_info[peer_physical] | info[peer_physical] | info[partner_physical]
87 new_info[partner_physical] = new_info[partner_physical] | info[peer_physical] | info[partner_physical]
88 else:
89 peer_type = "incoming"
90 if verbose > 1:
91 print("type of", str(peer_physical) + ":", peer_type)
92 info = new_info
93 arc = arc << 1
94 rounds = rounds + 1
95 random.shuffle(peers)
96 return rounds
97
98
99if __name__ == "__main__":
100 parser = argparse.ArgumentParser()
101 parser.add_argument("k", metavar="k", type=int, help="#(bad peers)")
102 parser.add_argument("n", metavar="n", type=int, help="#(all peers)")
103 parser.add_argument("r", metavar="r", type=int, help="#(rounds)")
104 parser.add_argument('--verbose', '-v', action='count')
105
106 args = parser.parse_args()
107 sum = 0.0
108 for n in xrange(0, args.r):
109 sum += simulate(args.k, args.n, args.verbose)
110 print(sum / args.r)
diff --git a/src/conversation/test_conversation.conf b/src/conversation/test_conversation.conf
index 87c4b8f07..e77b41003 100644
--- a/src/conversation/test_conversation.conf
+++ b/src/conversation/test_conversation.conf
@@ -1,4 +1,4 @@
1@INLINE@ ../../contrib/no_forcestart.conf 1@INLINE@ ../../contrib/conf/gnunet/no_forcestart.conf
2 2
3[conversation] 3[conversation]
4LINE=1 4LINE=1
diff --git a/src/core/test_core_defaults.conf b/src/core/test_core_defaults.conf
index 669dd2a9c..7c7dad99e 100644
--- a/src/core/test_core_defaults.conf
+++ b/src/core/test_core_defaults.conf
@@ -1,5 +1,5 @@
1@INLINE@ ../../contrib/no_forcestart.conf 1@INLINE@ ../../contrib/conf/gnunet/no_forcestart.conf
2@INLINE@ ../../contrib/no_autostart_above_core.conf 2@INLINE@ ../../contrib/conf/gnunet/no_autostart_above_core.conf
3 3
4[PATHS] 4[PATHS]
5GNUNET_TEST_HOME = $GNUNET_TMP/test-gnunet-core/ 5GNUNET_TEST_HOME = $GNUNET_TMP/test-gnunet-core/
diff --git a/src/credential/test_credential_defaults.conf b/src/credential/test_credential_defaults.conf
index 328846a10..39f82ad16 100644
--- a/src/credential/test_credential_defaults.conf
+++ b/src/credential/test_credential_defaults.conf
@@ -1,4 +1,4 @@
1@INLINE@ ../../contrib/no_forcestart.conf 1@INLINE@ ../../contrib/conf/gnunet/no_forcestart.conf
2 2
3[PATHS] 3[PATHS]
4GNUNET_TEST_HOME = $GNUNET_TMP/test-gnunet-credential-testing/ 4GNUNET_TEST_HOME = $GNUNET_TMP/test-gnunet-credential-testing/
diff --git a/src/datastore/test_defaults.conf b/src/datastore/test_defaults.conf
index 67d782f3a..08e630eb0 100644
--- a/src/datastore/test_defaults.conf
+++ b/src/datastore/test_defaults.conf
@@ -1,5 +1,5 @@
1@inline@ ../../contrib/no_autostart_above_core.conf 1@inline@ ../../contrib/conf/gnunet/no_autostart_above_core.conf
2@inline@ ../../contrib/no_forcestart.conf 2@inline@ ../../contrib/conf/gnunet/no_forcestart.conf
3 3
4[datastore] 4[datastore]
5PORT = 22654 5PORT = 22654
diff --git a/src/dht/gnunet_dht_profiler.c b/src/dht/gnunet_dht_profiler.c
index 403deb38a..5341e7d61 100644
--- a/src/dht/gnunet_dht_profiler.c
+++ b/src/dht/gnunet_dht_profiler.c
@@ -45,7 +45,7 @@ static unsigned int put_probability = 100;
45/** 45/**
46 * Configuration 46 * Configuration
47 */ 47 */
48static struct GNUNET_CONFIGURATION_Handle *cfg; 48static const struct GNUNET_CONFIGURATION_Handle *cfg;
49 49
50/** 50/**
51 * Name of the file with the hosts to run the test over 51 * Name of the file with the hosts to run the test over
@@ -917,7 +917,7 @@ run (void *cls,
917 num_peers); 917 num_peers);
918 return; 918 return;
919 } 919 }
920 cfg = GNUNET_CONFIGURATION_dup (config); 920 cfg = config;
921 event_mask = 0; 921 event_mask = 0;
922 GNUNET_TESTBED_run (hosts_file, 922 GNUNET_TESTBED_run (hosts_file,
923 cfg, 923 cfg,
diff --git a/src/dht/plugin_block_dht.c b/src/dht/plugin_block_dht.c
index 24f8b21b2..9f2861b50 100644
--- a/src/dht/plugin_block_dht.c
+++ b/src/dht/plugin_block_dht.c
@@ -66,7 +66,8 @@ block_plugin_dht_create_group (void *cls,
66 guard = va_arg (va, const char *); 66 guard = va_arg (va, const char *);
67 if (0 == strcmp (guard, 67 if (0 == strcmp (guard,
68 "seen-set-size")) 68 "seen-set-size"))
69 bf_size = GNUNET_BLOCK_GROUP_compute_bloomfilter_size (va_arg (va, unsigned int), 69 bf_size = GNUNET_BLOCK_GROUP_compute_bloomfilter_size (va_arg (va,
70 unsigned int),
70 BLOOMFILTER_K); 71 BLOOMFILTER_K);
71 else if (0 == strcmp (guard, 72 else if (0 == strcmp (guard,
72 "filter-size")) 73 "filter-size"))
@@ -183,14 +184,17 @@ block_plugin_dht_get_key (void *cls,
183 return GNUNET_SYSERR; 184 return GNUNET_SYSERR;
184 if (block_size < sizeof (struct GNUNET_MessageHeader)) 185 if (block_size < sizeof (struct GNUNET_MessageHeader))
185 { 186 {
186 GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, "block-dht", 187 GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR,
187 _("Block not of type %u\n"), GNUNET_BLOCK_TYPE_DHT_HELLO); 188 "block-dht",
189 _("Block not of type %u\n"),
190 GNUNET_BLOCK_TYPE_DHT_HELLO);
188 return GNUNET_NO; 191 return GNUNET_NO;
189 } 192 }
190 msg = block; 193 msg = block;
191 if (block_size != ntohs (msg->size)) 194 if (block_size != ntohs (msg->size))
192 { 195 {
193 GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, "block-dht", 196 GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR,
197 "block-dht",
194 _("Size mismatch for block\n"), 198 _("Size mismatch for block\n"),
195 GNUNET_BLOCK_TYPE_DHT_HELLO); 199 GNUNET_BLOCK_TYPE_DHT_HELLO);
196 return GNUNET_NO; 200 return GNUNET_NO;
@@ -200,7 +204,8 @@ block_plugin_dht_get_key (void *cls,
200 pid = (struct GNUNET_PeerIdentity *) key; 204 pid = (struct GNUNET_PeerIdentity *) key;
201 if (GNUNET_OK != GNUNET_HELLO_get_id (hello, pid)) 205 if (GNUNET_OK != GNUNET_HELLO_get_id (hello, pid))
202 { 206 {
203 GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, "block-dht", 207 GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR,
208 "block-dht",
204 _("Block of type %u is malformed\n"), 209 _("Block of type %u is malformed\n"),
205 GNUNET_BLOCK_TYPE_DHT_HELLO); 210 GNUNET_BLOCK_TYPE_DHT_HELLO);
206 return GNUNET_NO; 211 return GNUNET_NO;
diff --git a/src/dht/test_dht_2dtorus.conf b/src/dht/test_dht_2dtorus.conf
index de138e537..a541e8443 100644
--- a/src/dht/test_dht_2dtorus.conf
+++ b/src/dht/test_dht_2dtorus.conf
@@ -1,5 +1,5 @@
1@INLINE@ ../../contrib/no_forcestart.conf 1@INLINE@ ../../contrib/conf/gnunet/no_forcestart.conf
2@INLINE@ ../../contrib/no_autostart_above_core.conf 2@INLINE@ ../../contrib/conf/gnunet/no_autostart_above_core.conf
3[PATHS] 3[PATHS]
4GNUNET_TEST_HOME = $GNUNET_TMP/test_dht_2dtorus/ 4GNUNET_TEST_HOME = $GNUNET_TMP/test_dht_2dtorus/
5 5
diff --git a/src/dht/test_dht_api_data.conf b/src/dht/test_dht_api_data.conf
index 6f5bf8525..a2c1829c6 100644
--- a/src/dht/test_dht_api_data.conf
+++ b/src/dht/test_dht_api_data.conf
@@ -1,5 +1,5 @@
1@INLINE@ ../../contrib/no_forcestart.conf 1@INLINE@ ../../contrib/conf/gnunet/no_forcestart.conf
2@INLINE@ ../../contrib/no_autostart_above_core.conf 2@INLINE@ ../../contrib/conf/gnunet/no_autostart_above_core.conf
3 3
4[PATHS] 4[PATHS]
5GNUNET_TEST_HOME = $GNUNET_TMP/test-dht-api/ 5GNUNET_TEST_HOME = $GNUNET_TMP/test-dht-api/
diff --git a/src/dht/test_dht_api_peer1.conf b/src/dht/test_dht_api_peer1.conf
index b563f5096..b4164077f 100644
--- a/src/dht/test_dht_api_peer1.conf
+++ b/src/dht/test_dht_api_peer1.conf
@@ -1,5 +1,5 @@
1@INLINE@ ../../contrib/no_forcestart.conf 1@INLINE@ ../../contrib/conf/gnunet/no_forcestart.conf
2@INLINE@ ../../contrib/no_autostart_above_core.conf 2@INLINE@ ../../contrib/conf/gnunet/no_autostart_above_core.conf
3 3
4[dhtcache] 4[dhtcache]
5QUOTA = 1 MB 5QUOTA = 1 MB
diff --git a/src/dht/test_dht_line.conf b/src/dht/test_dht_line.conf
index 81ce94390..5368b0baf 100644
--- a/src/dht/test_dht_line.conf
+++ b/src/dht/test_dht_line.conf
@@ -1,5 +1,5 @@
1@INLINE@ ../../contrib/no_forcestart.conf 1@INLINE@ ../../contrib/conf/gnunet/no_forcestart.conf
2@INLINE@ ../../contrib/no_autostart_above_core.conf 2@INLINE@ ../../contrib/conf/gnunet/no_autostart_above_core.conf
3[PATHS] 3[PATHS]
4GNUNET_TEST_HOME = $GNUNET_TMP/test_dht_line/ 4GNUNET_TEST_HOME = $GNUNET_TMP/test_dht_line/
5 5
diff --git a/src/dht/test_dht_monitor.conf b/src/dht/test_dht_monitor.conf
index e33563746..c0d457e89 100644
--- a/src/dht/test_dht_monitor.conf
+++ b/src/dht/test_dht_monitor.conf
@@ -1,5 +1,5 @@
1@INLINE@ ../../contrib/no_forcestart.conf 1@INLINE@ ../../contrib/conf/gnunet/no_forcestart.conf
2@INLINE@ ../../contrib/no_autostart_above_core.conf 2@INLINE@ ../../contrib/conf/gnunet/no_autostart_above_core.conf
3 3
4 4
5[dhtcache] 5[dhtcache]
diff --git a/src/dht/test_dht_multipeer.conf b/src/dht/test_dht_multipeer.conf
index 5251883aa..4296d783e 100644
--- a/src/dht/test_dht_multipeer.conf
+++ b/src/dht/test_dht_multipeer.conf
@@ -1,5 +1,5 @@
1@INLINE@ ../../contrib/no_forcestart.conf 1@INLINE@ ../../contrib/conf/gnunet/no_forcestart.conf
2@INLINE@ ../../contrib/no_autostart_above_core.conf 2@INLINE@ ../../contrib/conf/gnunet/no_autostart_above_core.conf
3 3
4[dht] 4[dht]
5AUTOSTART = YES 5AUTOSTART = YES
diff --git a/src/dht/test_dht_tools.py.in b/src/dht/test_dht_tools.py.in
index 2d4ab9adc..05582cbd0 100644
--- a/src/dht/test_dht_tools.py.in
+++ b/src/dht/test_dht_tools.py.in
@@ -21,105 +21,113 @@ import subprocess
21import time 21import time
22import tempfile 22import tempfile
23 23
24os.environ["PATH"] = "@bindir@" + ":" + os.environ["PATH"]; 24os.environ["PATH"] = "@bindir@" + ":" + os.environ["PATH"]
25 25
26if os.name == "nt": 26if os.name == "nt":
27 tmp = os.getenv ("TEMP") 27 tmp = os.getenv("TEMP")
28else: 28else:
29 tmp = "/tmp" 29 tmp = "/tmp"
30 30
31if os.name == 'nt': 31if os.name == 'nt':
32 get = './gnunet-dht-get.exe' 32 get = './gnunet-dht-get.exe'
33 put = './gnunet-dht-put.exe' 33 put = './gnunet-dht-put.exe'
34 arm = 'gnunet-arm.exe' 34 arm = 'gnunet-arm.exe'
35else: 35else:
36 get = './gnunet-dht-get' 36 get = './gnunet-dht-get'
37 put = './gnunet-dht-put' 37 put = './gnunet-dht-put'
38 arm = 'gnunet-arm' 38 arm = 'gnunet-arm'
39 39
40cfgfile = 'test_dht_api_peer1.conf' 40cfgfile = 'test_dht_api_peer1.conf'
41
42run_get = [get, '-c', cfgfile] 41run_get = [get, '-c', cfgfile]
43run_put = [put, '-c', cfgfile] 42run_put = [put, '-c', cfgfile]
44run_arm = [arm, '-c', cfgfile] 43run_arm = [arm, '-c', cfgfile]
45debug = os.getenv ('DEBUG') 44debug = os.getenv('DEBUG')
46if debug: 45if debug:
47 run_arm += [debug.split (' ')] 46 run_arm += [debug.split(' ')]
48 47
49def cleanup (exitcode): 48
50 sys.exit (exitcode) 49def cleanup(exitcode):
51 50 sys.exit(exitcode)
52def sub_run (args, want_stdo = True, want_stde = False, nofail = False): 51
53 if want_stdo: 52
54 stdo = subprocess.PIPE 53def sub_run(args, want_stdo=True, want_stde=False, nofail=False):
55 else: 54 if want_stdo:
56 stdo = None 55 stdo = subprocess.PIPE
57 if want_stde: 56 else:
58 stde = subprocess.PIPE 57 stdo = None
59 else: 58 if want_stde:
60 stde = None 59 stde = subprocess.PIPE
61 p = subprocess.Popen (args, stdout = stdo, stderr = stde) 60 else:
62 stdo, stde = p.communicate () 61 stde = None
63 if not nofail: 62 p = subprocess.Popen(args, stdout=stdo, stderr=stde)
64 if p.returncode != 0: 63 stdo, stde = p.communicate()
65 sys.exit (p.returncode) 64 if not nofail:
66 return (p.returncode, stdo, stde) 65 if p.returncode != 0:
67 66 sys.exit(p.returncode)
68def fail (result): 67 return (p.returncode, stdo, stde)
69 print (result) 68
70 r_arm (['-e'], want_stdo = False) 69
71 cleanup (1) 70def fail(result):
72 71 print(result)
73def r_something (to_run, extra_args, failer = None, normal = True, **kw): 72 r_arm(['-e'], want_stdo=False)
74 rc, stdo, stde = sub_run (to_run + extra_args, nofail = True, **kw) 73 cleanup(1)
75 if failer is not None: 74
76 failer (to_run + extra_args, rc, stdo, stde, normal) 75
77 return (rc, stdo, stde) 76def r_something(to_run, extra_args, failer=None, normal=True, **kw):
78 77 rc, stdo, stde = sub_run(to_run + extra_args, nofail=True, **kw)
79def r_arm (extra_args, **kw): 78 if failer is not None:
80 return r_something (run_arm, extra_args, **kw) 79 failer(to_run + extra_args, rc, stdo, stde, normal)
81 80 return (rc, stdo, stde)
82def r_get (extra_args, **kw): 81
83 return r_something (run_get, extra_args, **kw) 82
84 83def r_arm(extra_args, **kw):
85def r_put (extra_args, **kw): 84 return r_something(run_arm, extra_args, **kw)
86 return r_something (run_put, extra_args, **kw) 85
87 86
88def end_arm_failer (command, rc, stdo, stde, normal): 87def r_get(extra_args, **kw):
89 if normal: 88 return r_something(run_get, extra_args, **kw)
90 if rc != 0: 89
91 fail ("FAIL: error running {}\nCommand output was:\n{}\n{}".format (command, stdo, stde)) 90
92 else: 91def r_put(extra_args, **kw):
93 if rc == 0: 92 return r_something(run_put, extra_args, **kw)
94 fail ("FAIL: expected error while running {}\nCommand output was:\n{}\n{}".format (command, stdo, stde)) 93
95 94
96def print_only_failer (command, rc, stdo, stde, normal): 95def end_arm_failer(command, rc, stdo, stde, normal):
97 if normal: 96 if normal:
98 if rc != 0: 97 if rc != 0:
99 print ("FAIL: error running {}\nCommand output was:\n{}\n{}".format (command, stdo, stde)) 98 fail("FAIL: error running {}\nCommand output was:\n{}\n{}".format(command, stdo, stde))
100 cleanup (1) 99 else:
101 else: 100 if rc == 0:
102 if rc == 0: 101 fail("FAIL: expected error while running {}\nCommand output was:\n{}\n{}".format(command, stdo, stde))
103 print ("FAIL: expected error while running {}\nCommand output was:\n{}\n{}".format (command, stdo, stde)) 102
104 cleanup (1) 103
105 104def print_only_failer(command, rc, stdo, stde, normal):
106 105 if normal:
107print ("TEST: Starting ARM...", end='') 106 if rc != 0:
108r_arm (['-s'], failer = end_arm_failer, want_stdo = False, want_stde = False) 107 print("FAIL: error running {}\nCommand output was:\n{}\n{}".format(command, stdo, stde))
109print ("PASS") 108 cleanup(1)
110time.sleep (1) 109 else:
111 110 if rc == 0:
112print ("TEST: Testing put...", end='') 111 print("FAIL: expected error while running {}\nCommand output was:\n{}\n{}".format(command, stdo, stde))
113r_put (['-k', 'testkey', '-d', 'testdata', '-t', '8'], failer = end_arm_failer) 112 cleanup(1)
114print ("PASS") 113
115time.sleep (1) 114
116 115print("TEST: Starting ARM...", end='')
117print ("TEST: Testing get...", end='') 116r_arm(['-s'], failer=end_arm_failer, want_stdo=False, want_stde=False)
118rc, stdo, stde = r_get (['-k', 'testkey', '-T', '50 ms', '-t', '8'], want_stdo = True, failer = end_arm_failer) 117print("PASS")
119stdo = stdo.replace ('\r', '').splitlines () 118time.sleep(1)
119
120print("TEST: Testing put...", end='')
121r_put(['-k', 'testkey', '-d', 'testdata', '-t', '8'], failer=end_arm_failer)
122print("PASS")
123time.sleep(1)
124
125print("TEST: Testing get...", end='')
126rc, stdo, stde = r_get(['-k', 'testkey', '-T', '50 ms', '-t', '8'], want_stdo=True, failer=end_arm_failer)
127stdo = stdo.replace('\r', '').splitlines()
120expect = "Result 0, type 8:\ntestdata".splitlines() 128expect = "Result 0, type 8:\ntestdata".splitlines()
121if len (stdo) != 2 or len (expect) != 2 or stdo[0] != expect[0] or stdo[1] != expect[1]: 129if len(stdo) != 2 or len(expect) != 2 or stdo[0] != expect[0] or stdo[1] != expect[1]:
122 fail ("output `{}' differs from expected `{}'".format (stdo, expect)) 130 fail("output `{}' differs from expected `{}'".format(stdo, expect))
123print ("PASS") 131print("PASS")
124 132
125r_arm (['-e', '-d'], failer = print_only_failer) 133r_arm(['-e', '-d'], failer=print_only_failer)
diff --git a/src/fs/test_fs_defaults.conf b/src/fs/test_fs_defaults.conf
index 79344cd66..42661b25d 100644
--- a/src/fs/test_fs_defaults.conf
+++ b/src/fs/test_fs_defaults.conf
@@ -1,4 +1,4 @@
1@INLINE@ ../../contrib/no_forcestart.conf 1@INLINE@ ../../contrib/conf/gnunet/no_forcestart.conf
2 2
3[PATHS] 3[PATHS]
4GNUNET_TEST_HOME = $GNUNET_TMP/gnunet-test-fs-lib/ 4GNUNET_TEST_HOME = $GNUNET_TMP/gnunet-test-fs-lib/
diff --git a/src/fs/test_gnunet_fs_idx.py.in b/src/fs/test_gnunet_fs_idx.py.in
index bd8aa5f7a..a669998fb 100755
--- a/src/fs/test_gnunet_fs_idx.py.in
+++ b/src/fs/test_gnunet_fs_idx.py.in
@@ -25,50 +25,50 @@ import re
25import shutil 25import shutil
26 26
27srcdir = "../.." 27srcdir = "../.."
28gnunet_pyexpect_dir = os.path.join (srcdir, "contrib") 28gnunet_pyexpect_dir = os.path.join(srcdir, "contrib/scripts")
29if gnunet_pyexpect_dir not in sys.path: 29if gnunet_pyexpect_dir not in sys.path:
30 sys.path.append (gnunet_pyexpect_dir) 30 sys.path.append(gnunet_pyexpect_dir)
31 31
32from gnunet_pyexpect import pexpect 32from gnunet_pyexpect import pexpect
33 33
34if os.name == 'posix': 34if os.name == 'posix':
35 download = './gnunet-download' 35 download = './gnunet-download'
36 gnunetarm = 'gnunet-arm' 36 gnunetarm = 'gnunet-arm'
37 publish = './gnunet-publish' 37 publish = './gnunet-publish'
38 unindex = './gnunet-unindex' 38 unindex = './gnunet-unindex'
39elif os.name == 'nt': 39elif os.name == 'nt':
40 download = './gnunet-download.exe' 40 download = './gnunet-download.exe'
41 gnunetarm = 'gnunet-arm.exe' 41 gnunetarm = 'gnunet-arm.exe'
42 publish = './gnunet-publish.exe' 42 publish = './gnunet-publish.exe'
43 unindex = './gnunet-unindex.exe' 43 unindex = './gnunet-unindex.exe'
44 44
45if os.name == "nt": 45if os.name == "nt":
46 shutil.rmtree (os.path.join (os.getenv ("TEMP"), "gnunet-test-fs-py-idx"), True) 46 shutil.rmtree(os.path.join(os.getenv("TEMP"), "gnunet-test-fs-py-idx"), True)
47else: 47else:
48 shutil.rmtree ("/tmp/gnunet-test-fs-py-idx", True) 48 shutil.rmtree("/tmp/gnunet-test-fs-py-idx", True)
49 49
50arm = subprocess.Popen ([gnunetarm, '-sq', '-c', 'test_gnunet_fs_idx_data.conf']) 50arm = subprocess.Popen([gnunetarm, '-sq', '-c', 'test_gnunet_fs_idx_data.conf'])
51arm.communicate () 51arm.communicate()
52 52
53try: 53try:
54 pub = pexpect () 54 pub = pexpect()
55 55
56 pub.spawn (None, [publish, '-c', 'test_gnunet_fs_idx_data.conf', '-m', "description:Test archive", '-k', 'tst', 'test_gnunet_fs_rec_data.tgz'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 56 pub.spawn(None, [publish, '-c', 'test_gnunet_fs_idx_data.conf', '-m', "description:Test archive", '-k', 'tst', 'test_gnunet_fs_rec_data.tgz'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
57 pub.expect ("stdout", re.compile (r"URI is `gnunet://fs/chk/2ZMHKPV74CB6GB1GFKQRR95BXJQA2SER25FN48GAW7WSBPA0GDEM5Y74V1ZJHM0NA6919TVW376BHTFDRE3RYS0KRY92M1QJVKPHFCR\.49BT3V5C10KA1695JF71FCT8ZZG4JMJSH04BD9CT22R6KEM915A7CEST17RD0QYTHXV5M4HHEGJMEZSFRDB7JAYC0EMJAN2V781E9DG\.17822'\.\r?\n")) 57 pub.expect("stdout", re.compile(r"URI is `gnunet://fs/chk/2ZMHKPV74CB6GB1GFKQRR95BXJQA2SER25FN48GAW7WSBPA0GDEM5Y74V1ZJHM0NA6919TVW376BHTFDRE3RYS0KRY92M1QJVKPHFCR\.49BT3V5C10KA1695JF71FCT8ZZG4JMJSH04BD9CT22R6KEM915A7CEST17RD0QYTHXV5M4HHEGJMEZSFRDB7JAYC0EMJAN2V781E9DG\.17822'\.\r?\n"))
58 58
59 down = pexpect () 59 down = pexpect()
60 down.spawn (None, [download, '-c', 'test_gnunet_fs_idx_data.conf', '-o', 'test_gnunet_fs_rec_data.tar.gz', 'gnunet://fs/chk/2ZMHKPV74CB6GB1GFKQRR95BXJQA2SER25FN48GAW7WSBPA0GDEM5Y74V1ZJHM0NA6919TVW376BHTFDRE3RYS0KRY92M1QJVKPHFCR.49BT3V5C10KA1695JF71FCT8ZZG4JMJSH04BD9CT22R6KEM915A7CEST17RD0QYTHXV5M4HHEGJMEZSFRDB7JAYC0EMJAN2V781E9DG.17822'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 60 down.spawn(None, [download, '-c', 'test_gnunet_fs_idx_data.conf', '-o', 'test_gnunet_fs_rec_data.tar.gz', 'gnunet://fs/chk/2ZMHKPV74CB6GB1GFKQRR95BXJQA2SER25FN48GAW7WSBPA0GDEM5Y74V1ZJHM0NA6919TVW376BHTFDRE3RYS0KRY92M1QJVKPHFCR.49BT3V5C10KA1695JF71FCT8ZZG4JMJSH04BD9CT22R6KEM915A7CEST17RD0QYTHXV5M4HHEGJMEZSFRDB7JAYC0EMJAN2V781E9DG.17822'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
61 down.expect ("stdout", re.compile (r"Downloading `test_gnunet_fs_rec_data.tar.gz' done (.*).\r?\n")) 61 down.expect("stdout", re.compile(r"Downloading `test_gnunet_fs_rec_data.tar.gz' done (.*).\r?\n"))
62 os.remove ("test_gnunet_fs_rec_data.tar.gz") 62 os.remove("test_gnunet_fs_rec_data.tar.gz")
63 63
64 un = pexpect () 64 un = pexpect()
65 un.spawn (None, [unindex, '-c', 'test_gnunet_fs_idx_data.conf', 'test_gnunet_fs_rec_data.tgz'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 65 un.spawn(None, [unindex, '-c', 'test_gnunet_fs_idx_data.conf', 'test_gnunet_fs_rec_data.tgz'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
66 un.expect ("stdout", re.compile (r'Unindexing done\.\r?\n')) 66 un.expect("stdout", re.compile(r'Unindexing done\.\r?\n'))
67 67
68finally: 68finally:
69 arm = subprocess.Popen ([gnunetarm, '-eq', '-c', 'test_gnunet_fs_idx_data.conf']) 69 arm = subprocess.Popen([gnunetarm, '-eq', '-c', 'test_gnunet_fs_idx_data.conf'])
70 arm.communicate () 70 arm.communicate()
71 if os.name == "nt": 71 if os.name == "nt":
72 shutil.rmtree (os.path.join (os.getenv ("TEMP"), "gnunet-test-fs-py-idx"), True) 72 shutil.rmtree(os.path.join(os.getenv("TEMP"), "gnunet-test-fs-py-idx"), True)
73 else: 73 else:
74 shutil.rmtree ("/tmp/gnunet-test-fs-py-idx", True) 74 shutil.rmtree("/tmp/gnunet-test-fs-py-idx", True)
diff --git a/src/fs/test_gnunet_fs_psd.py.in b/src/fs/test_gnunet_fs_psd.py.in
index 601797c82..4b27b4532 100755
--- a/src/fs/test_gnunet_fs_psd.py.in
+++ b/src/fs/test_gnunet_fs_psd.py.in
@@ -29,59 +29,60 @@ except NameError:
29 # python3.4: 29 # python3.4:
30 from importlib import reload 30 from importlib import reload
31 31
32
32# Force encoding to utf-8, as this test otherwise fails 33# Force encoding to utf-8, as this test otherwise fails
33# on some systems (see #5094). 34# on some systems (see #5094).
34reload(sys) 35reload(sys)
35sys.setdefaultencoding('utf8') 36sys.setdefaultencoding('utf8')
36 37
37srcdir = "../.." 38srcdir = "../.."
38gnunet_pyexpect_dir = os.path.join (srcdir, "contrib") 39gnunet_pyexpect_dir = os.path.join(srcdir, "contrib/scripts")
39if gnunet_pyexpect_dir not in sys.path: 40if gnunet_pyexpect_dir not in sys.path:
40 sys.path.append (gnunet_pyexpect_dir) 41 sys.path.append(gnunet_pyexpect_dir)
41 42
42from gnunet_pyexpect import pexpect 43from gnunet_pyexpect import pexpect
43 44
44if os.name == 'posix': 45if os.name == 'posix':
45 download = './gnunet-download' 46 download = './gnunet-download'
46 gnunetarm = 'gnunet-arm' 47 gnunetarm = 'gnunet-arm'
47 publish = './gnunet-publish' 48 publish = './gnunet-publish'
48 unindex = './gnunet-unindex' 49 unindex = './gnunet-unindex'
49 search = './gnunet-search' 50 search = './gnunet-search'
50elif os.name == 'nt': 51elif os.name == 'nt':
51 download = './gnunet-download.exe' 52 download = './gnunet-download.exe'
52 gnunetarm = 'gnunet-arm.exe' 53 gnunetarm = 'gnunet-arm.exe'
53 publish = './gnunet-publish.exe' 54 publish = './gnunet-publish.exe'
54 unindex = './gnunet-unindex.exe' 55 unindex = './gnunet-unindex.exe'
55 search = './gnunet-search.exe' 56 search = './gnunet-search.exe'
56 57
57if os.name == "nt": 58if os.name == "nt":
58 shutil.rmtree (os.path.join (os.getenv ("TEMP"), "gnunet-test-fs-py-psd"), True) 59 shutil.rmtree(os.path.join(os.getenv("TEMP"), "gnunet-test-fs-py-psd"), True)
59else: 60else:
60 shutil.rmtree ("/tmp/gnunet-test-fs-py-psd", True) 61 shutil.rmtree("/tmp/gnunet-test-fs-py-psd", True)
61 62
62arm = subprocess.Popen ([gnunetarm, '-sq', '-c', 'test_gnunet_fs_psd_data.conf']) 63arm = subprocess.Popen([gnunetarm, '-sq', '-c', 'test_gnunet_fs_psd_data.conf'])
63arm.communicate () 64arm.communicate()
64 65
65# first, basic publish-search-download run 66# first, basic publish-search-download run
66try: 67try:
67 pub = pexpect () 68 pub = pexpect()
68 pub.spawn (None, [publish, '-c', 'test_gnunet_fs_psd_data.conf', '-n', '-m', "description:Test archive", '-k', 'tst', 'test_gnunet_fs_rec_data.tgz'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 69 pub.spawn(None, [publish, '-c', 'test_gnunet_fs_psd_data.conf', '-n', '-m', "description:Test archive", '-k', 'tst', 'test_gnunet_fs_rec_data.tgz'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
69 pub.expect ("stdout", re.compile (r"Publishing `.+test_gnunet_fs_rec_data.tgz' done\.\r?\n")) 70 pub.expect("stdout", re.compile(r"Publishing `.+test_gnunet_fs_rec_data.tgz' done\.\r?\n"))
70 pub.expect ("stdout", re.compile (r"URI is `gnunet://fs/chk/2ZMHKPV74CB6GB1GFKQRR95BXJQA2SER25FN48GAW7WSBPA0GDEM5Y74V1ZJHM0NA6919TVW376BHTFDRE3RYS0KRY92M1QJVKPHFCR\.49BT3V5C10KA1695JF71FCT8ZZG4JMJSH04BD9CT22R6KEM915A7CEST17RD0QYTHXV5M4HHEGJMEZSFRDB7JAYC0EMJAN2V781E9DG\.17822'\.\r?\n")) 71 pub.expect("stdout", re.compile(r"URI is `gnunet://fs/chk/2ZMHKPV74CB6GB1GFKQRR95BXJQA2SER25FN48GAW7WSBPA0GDEM5Y74V1ZJHM0NA6919TVW376BHTFDRE3RYS0KRY92M1QJVKPHFCR\.49BT3V5C10KA1695JF71FCT8ZZG4JMJSH04BD9CT22R6KEM915A7CEST17RD0QYTHXV5M4HHEGJMEZSFRDB7JAYC0EMJAN2V781E9DG\.17822'\.\r?\n"))
71 72
72 s = pexpect () 73 s = pexpect()
73 s.spawn (None, [search, '-V', '-t', '1000 ms', '-N', '1', '-c', 'test_gnunet_fs_psd_data.conf', 'tst'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 74 s.spawn(None, [search, '-V', '-t', '1000 ms', '-N', '1', '-c', 'test_gnunet_fs_psd_data.conf', 'tst'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
74 s.expect ("stdout", re.compile (r'gnunet-download -o "test_gnunet_fs_rec_data.tgz" gnunet://fs/chk/2ZMHKPV74CB6GB1GFKQRR95BXJQA2SER25FN48GAW7WSBPA0GDEM5Y74V1ZJHM0NA6919TVW376BHTFDRE3RYS0KRY92M1QJVKPHFCR\.49BT3V5C10KA1695JF71FCT8ZZG4JMJSH04BD9CT22R6KEM915A7CEST17RD0QYTHXV5M4HHEGJMEZSFRDB7JAYC0EMJAN2V781E9DG\.17822\r?\n')) 75 s.expect("stdout", re.compile(r'gnunet-download -o "test_gnunet_fs_rec_data.tgz" gnunet://fs/chk/2ZMHKPV74CB6GB1GFKQRR95BXJQA2SER25FN48GAW7WSBPA0GDEM5Y74V1ZJHM0NA6919TVW376BHTFDRE3RYS0KRY92M1QJVKPHFCR\.49BT3V5C10KA1695JF71FCT8ZZG4JMJSH04BD9CT22R6KEM915A7CEST17RD0QYTHXV5M4HHEGJMEZSFRDB7JAYC0EMJAN2V781E9DG\.17822\r?\n'))
75 76
76 down = pexpect () 77 down = pexpect()
77 down.spawn (None, [download, '-c', 'test_gnunet_fs_psd_data.conf', '-o', 'test_gnunet_fs_rec_data.tar.gz', 'gnunet://fs/chk/2ZMHKPV74CB6GB1GFKQRR95BXJQA2SER25FN48GAW7WSBPA0GDEM5Y74V1ZJHM0NA6919TVW376BHTFDRE3RYS0KRY92M1QJVKPHFCR.49BT3V5C10KA1695JF71FCT8ZZG4JMJSH04BD9CT22R6KEM915A7CEST17RD0QYTHXV5M4HHEGJMEZSFRDB7JAYC0EMJAN2V781E9DG.17822'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 78 down.spawn(None, [download, '-c', 'test_gnunet_fs_psd_data.conf', '-o', 'test_gnunet_fs_rec_data.tar.gz', 'gnunet://fs/chk/2ZMHKPV74CB6GB1GFKQRR95BXJQA2SER25FN48GAW7WSBPA0GDEM5Y74V1ZJHM0NA6919TVW376BHTFDRE3RYS0KRY92M1QJVKPHFCR.49BT3V5C10KA1695JF71FCT8ZZG4JMJSH04BD9CT22R6KEM915A7CEST17RD0QYTHXV5M4HHEGJMEZSFRDB7JAYC0EMJAN2V781E9DG.17822'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
78 down.expect ("stdout", re.compile (r"Downloading `test_gnunet_fs_rec_data.tar.gz' done (.*).\r?\n")) 79 down.expect("stdout", re.compile(r"Downloading `test_gnunet_fs_rec_data.tar.gz' done (.*).\r?\n"))
79 os.remove ("test_gnunet_fs_rec_data.tar.gz") 80 os.remove("test_gnunet_fs_rec_data.tar.gz")
80 81
81finally: 82finally:
82 arm = subprocess.Popen ([gnunetarm, '-eq', '-c', 'test_gnunet_fs_psd_data.conf']) 83 arm = subprocess.Popen([gnunetarm, '-eq', '-c', 'test_gnunet_fs_psd_data.conf'])
83 arm.communicate () 84 arm.communicate()
84 if os.name == "nt": 85 if os.name == "nt":
85 shutil.rmtree (os.path.join (os.getenv ("TEMP"), "gnunet-test-fs-py-psd"), True) 86 shutil.rmtree(os.path.join(os.getenv("TEMP"), "gnunet-test-fs-py-psd"), True)
86 else: 87 else:
87 shutil.rmtree ("/tmp/gnunet-test-fs-py-psd", True) 88 shutil.rmtree("/tmp/gnunet-test-fs-py-psd", True)
diff --git a/src/fs/test_gnunet_fs_rec.py.in b/src/fs/test_gnunet_fs_rec.py.in
index 3828a65c9..aa9b7b461 100755
--- a/src/fs/test_gnunet_fs_rec.py.in
+++ b/src/fs/test_gnunet_fs_rec.py.in
@@ -27,88 +27,90 @@ import tarfile
27import filecmp 27import filecmp
28 28
29srcdir = "../.." 29srcdir = "../.."
30gnunet_pyexpect_dir = os.path.join (srcdir, "contrib") 30gnunet_pyexpect_dir = os.path.join(srcdir, "contrib/scripts")
31if gnunet_pyexpect_dir not in sys.path: 31if gnunet_pyexpect_dir not in sys.path:
32 sys.path.append (gnunet_pyexpect_dir) 32 sys.path.append(gnunet_pyexpect_dir)
33 33
34from gnunet_pyexpect import pexpect 34from gnunet_pyexpect import pexpect
35from pydiffer import dcdiff 35from pydiffer import dcdiff
36 36
37if os.name == 'posix': 37if os.name == 'posix':
38 download = './gnunet-download' 38 download = './gnunet-download'
39 gnunetarm = 'gnunet-arm' 39 gnunetarm = 'gnunet-arm'
40 publish = './gnunet-publish' 40 publish = './gnunet-publish'
41 unindex = './gnunet-unindex' 41 unindex = './gnunet-unindex'
42 search = './gnunet-search' 42 search = './gnunet-search'
43 directory = './gnunet-directory' 43 directory = './gnunet-directory'
44elif os.name == 'nt': 44elif os.name == 'nt':
45 download = './gnunet-download.exe' 45 download = './gnunet-download.exe'
46 gnunetarm = 'gnunet-arm.exe' 46 gnunetarm = 'gnunet-arm.exe'
47 publish = './gnunet-publish.exe' 47 publish = './gnunet-publish.exe'
48 unindex = './gnunet-unindex.exe' 48 unindex = './gnunet-unindex.exe'
49 search = './gnunet-search.exe' 49 search = './gnunet-search.exe'
50 directory = './gnunet-directory.exe' 50 directory = './gnunet-directory.exe'
51 51
52if os.name == "nt": 52if os.name == "nt":
53 shutil.rmtree (os.path.join (os.getenv ("TEMP"), "gnunet-test-fs-py-rec"), True) 53 shutil.rmtree(os.path.join(os.getenv("TEMP"), "gnunet-test-fs-py-rec"), True)
54else: 54else:
55 shutil.rmtree ("/tmp/gnunet-test-fs-py-rec", True) 55 shutil.rmtree("/tmp/gnunet-test-fs-py-rec", True)
56 56
57arm = subprocess.Popen ([gnunetarm, '-sq', '-c', 'test_gnunet_fs_rec_data.conf']) 57arm = subprocess.Popen([gnunetarm, '-sq', '-c', 'test_gnunet_fs_rec_data.conf'])
58arm.communicate () 58arm.communicate()
59 59
60# pray that `tar' is in PATH 60# pray that `tar' is in PATH.
61tar = tarfile.open ('test_gnunet_fs_rec_data.tgz') 61# FIXME: Actually we should check for that and output
62tar.extractall () 62# a message if it isn't found.
63tar = tarfile.open('test_gnunet_fs_rec_data.tgz')
64tar.extractall()
63# first, basic publish-search-download run 65# first, basic publish-search-download run
64try: 66try:
65 pub = pexpect () 67 pub = pexpect()
66 pub.spawn (None, [publish, '-c', 'test_gnunet_fs_rec_data.conf', '-d', '-k', 'testdir', 'dir/'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 68 pub.spawn(None, [publish, '-c', 'test_gnunet_fs_rec_data.conf', '-d', '-k', 'testdir', 'dir/'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
67 # Can't say much for publishing, except that the last one is the toplevel directory 69 # Can't say much for publishing, except that the last one is the toplevel directory
68 pub.expect ("stdout", re.compile (r"Publishing `.+' done\.\r?\n")) 70 pub.expect("stdout", re.compile(r"Publishing `.+' done\.\r?\n"))
69 pub.expect ("stdout", re.compile (r"URI is `gnunet://fs/chk/[A-Z0-9]{103}\.[A-Z0-9]{103}\.\d+'\.\r?\n")) 71 pub.expect("stdout", re.compile(r"URI is `gnunet://fs/chk/[A-Z0-9]{103}\.[A-Z0-9]{103}\.\d+'\.\r?\n"))
70 pub.expect ("stdout", re.compile (r"Publishing `.+' done\.\r?\n")) 72 pub.expect("stdout", re.compile(r"Publishing `.+' done\.\r?\n"))
71 pub.expect ("stdout", re.compile (r"URI is `gnunet://fs/chk/[A-Z0-9]{103}\.[A-Z0-9]{103}\.\d+'\.\r?\n")) 73 pub.expect("stdout", re.compile(r"URI is `gnunet://fs/chk/[A-Z0-9]{103}\.[A-Z0-9]{103}\.\d+'\.\r?\n"))
72 pub.expect ("stdout", re.compile (r"Publishing `.+' done\.\r?\n")) 74 pub.expect("stdout", re.compile(r"Publishing `.+' done\.\r?\n"))
73 pub.expect ("stdout", re.compile (r"URI is `gnunet://fs/chk/[A-Z0-9]{103}\.[A-Z0-9]{103}\.\d+'\.\r?\n")) 75 pub.expect("stdout", re.compile(r"URI is `gnunet://fs/chk/[A-Z0-9]{103}\.[A-Z0-9]{103}\.\d+'\.\r?\n"))
74 pub.expect ("stdout", re.compile (r"Publishing `.+' done\.\r?\n")) 76 pub.expect("stdout", re.compile(r"Publishing `.+' done\.\r?\n"))
75 pub.expect ("stdout", re.compile (r"URI is `gnunet://fs/chk/[A-Z0-9]{103}\.[A-Z0-9]{103}\.\d+'\.\r?\n")) 77 pub.expect("stdout", re.compile(r"URI is `gnunet://fs/chk/[A-Z0-9]{103}\.[A-Z0-9]{103}\.\d+'\.\r?\n"))
76 pub.expect ("stdout", re.compile (r"Publishing `.+' done\.\r?\n")) 78 pub.expect("stdout", re.compile(r"Publishing `.+' done\.\r?\n"))
77 pub.expect ("stdout", re.compile (r"URI is `gnunet://fs/chk/[A-Z0-9]{103}\.[A-Z0-9]{103}\.\d+'\.\r?\n")) 79 pub.expect("stdout", re.compile(r"URI is `gnunet://fs/chk/[A-Z0-9]{103}\.[A-Z0-9]{103}\.\d+'\.\r?\n"))
78 pub.expect ("stdout", re.compile (r"Publishing `.+' done\.\r?\n")) 80 pub.expect("stdout", re.compile(r"Publishing `.+' done\.\r?\n"))
79 pub.expect ("stdout", re.compile (r"URI is `gnunet://fs/chk/[A-Z0-9]{103}\.[A-Z0-9]{103}\.\d+'\.\r?\n")) 81 pub.expect("stdout", re.compile(r"URI is `gnunet://fs/chk/[A-Z0-9]{103}\.[A-Z0-9]{103}\.\d+'\.\r?\n"))
80 pub.expect ("stdout", re.compile (r"Publishing `.+[\\/]dir[\\/]' done\.\r?\n")) 82 pub.expect("stdout", re.compile(r"Publishing `.+[\\/]dir[\\/]' done\.\r?\n"))
81 m = pub.expect ("stdout", re.compile (r".+\r?\n")) 83 m = pub.expect("stdout", re.compile(r".+\r?\n"))
82 if not m: 84 if not m:
83 sys.exit (3) 85 sys.exit(3)
84 output = m.string 86 output = m.string
85 url = output[output.find ("`")+1:output.find("'")] 87 url = output[output.find("`")+1:output.find("'")]
86 88
87 down = pexpect () 89 down = pexpect()
88 down.spawn (None, [download, '-c', 'test_gnunet_fs_rec_data.conf', '-R', '-o', 'rdir.gnd', url], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 90 down.spawn(None, [download, '-c', 'test_gnunet_fs_rec_data.conf', '-R', '-o', 'rdir.gnd', url], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
89 down.expect ("stdout", re.compile (r"Downloading `rdir.gnd' done (.*).\r?\n")) 91 down.expect("stdout", re.compile(r"Downloading `rdir.gnd' done (.*).\r?\n"))
90 92
91 d = pexpect () 93 d = pexpect()
92 d.spawn (None, [directory, '-c', 'test_gnunet_fs_rec_data.conf', 'rdir/a.gnd'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 94 d.spawn(None, [directory, '-c', 'test_gnunet_fs_rec_data.conf', 'rdir/a.gnd'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
93 d.expect ("stdout", re.compile (r"Directory `a/' meta data:\r?\n")) 95 d.expect("stdout", re.compile(r"Directory `a/' meta data:\r?\n"))
94 d.expect ("stdout", re.compile (r"Directory `a/' contents:\r?\n")) 96 d.expect("stdout", re.compile(r"Directory `a/' contents:\r?\n"))
95 d.expect ("stdout", re.compile (r"COPYING (.*)\r?\n")) 97 d.expect("stdout", re.compile(r"COPYING (.*)\r?\n"))
96 d.expect ("stdout", re.compile (r"INSTALL (.*)\r?\n")) 98 d.expect("stdout", re.compile(r"INSTALL (.*)\r?\n"))
99
100 os.remove("rdir/b.gnd")
101 os.remove("rdir/a.gnd")
102 diff = dcdiff('dir', 'rdir')
103 if len(diff) != 0:
104 raise Exception("Unexpected difference between source directory and downloaded result:\n{}".format(diff))
97 105
98 os.remove ("rdir/b.gnd")
99 os.remove ("rdir/a.gnd")
100 diff = dcdiff ('dir', 'rdir')
101 if len (diff) != 0:
102 raise Exception ("Unexpected difference between source directory and downloaded result:\n{}".format (diff))
103
104 106
105finally: 107finally:
106 arm = subprocess.Popen ([gnunetarm, '-eq', '-c', 'test_gnunet_fs_rec_data.conf']) 108 arm = subprocess.Popen([gnunetarm, '-eq', '-c', 'test_gnunet_fs_rec_data.conf'])
107 arm.communicate () 109 arm.communicate()
108 if os.name == "nt": 110 if os.name == "nt":
109 shutil.rmtree (os.path.join (os.getenv ("TEMP"), "gnunet-test-fs-py-rec"), True) 111 shutil.rmtree(os.path.join(os.getenv("TEMP"), "gnunet-test-fs-py-rec"), True)
110 else: 112 else:
111 shutil.rmtree ("/tmp/gnunet-test-fs-py-rec", True) 113 shutil.rmtree("/tmp/gnunet-test-fs-py-rec", True)
112 shutil.rmtree ("dir", True) 114 shutil.rmtree("dir", True)
113 shutil.rmtree ("rdir", True) 115 shutil.rmtree("rdir", True)
114 shutil.rmtree ("rdir.gnd", True) 116 shutil.rmtree("rdir.gnd", True)
diff --git a/src/gns/Makefile.am b/src/gns/Makefile.am
index ac11c834e..46642113f 100644
--- a/src/gns/Makefile.am
+++ b/src/gns/Makefile.am
@@ -264,6 +264,7 @@ check_SCRIPTS = \
264 test_gns_txt_lookup.sh\ 264 test_gns_txt_lookup.sh\
265 test_gns_mx_lookup.sh \ 265 test_gns_mx_lookup.sh \
266 test_gns_gns2dns_lookup.sh \ 266 test_gns_gns2dns_lookup.sh \
267 test_gns_gns2dns_cname_lookup.sh \
267 test_gns_dht_lookup.sh\ 268 test_gns_dht_lookup.sh\
268 test_gns_delegated_lookup.sh \ 269 test_gns_delegated_lookup.sh \
269 test_gns_at_lookup.sh\ 270 test_gns_at_lookup.sh\
diff --git a/src/gns/gnunet-gns-benchmark.c b/src/gns/gnunet-gns-benchmark.c
index d5afae9f6..0ab6cefd5 100644
--- a/src/gns/gnunet-gns-benchmark.c
+++ b/src/gns/gnunet-gns-benchmark.c
@@ -84,7 +84,7 @@ struct Request
84 * this struct (optimizing memory consumption by reducing 84 * this struct (optimizing memory consumption by reducing
85 * total number of allocations). 85 * total number of allocations).
86 */ 86 */
87 char *hostname; 87 const char *hostname;
88 88
89 /** 89 /**
90 * While we are fetching the record, the value is set to the 90 * While we are fetching the record, the value is set to the
@@ -176,6 +176,11 @@ static struct GNUNET_TIME_Relative request_delay;
176 */ 176 */
177static struct GNUNET_TIME_Relative timeout; 177static struct GNUNET_TIME_Relative timeout;
178 178
179/**
180 * Number of requests we have concurrently active.
181 */
182static unsigned int active_cnt;
183
179 184
180/** 185/**
181 * Free @a req and data structures reachable from it. 186 * Free @a req and data structures reachable from it.
@@ -210,6 +215,10 @@ process_result (void *cls,
210 (void) gns_tld; 215 (void) gns_tld;
211 (void) rd_count; 216 (void) rd_count;
212 (void) rd; 217 (void) rd;
218 active_cnt--;
219 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
220 "Got response for request `%s'\n",
221 req->hostname);
213 req->lr = NULL; 222 req->lr = NULL;
214 req->latency = GNUNET_TIME_absolute_get_duration (req->op_start_time); 223 req->latency = GNUNET_TIME_absolute_get_duration (req->op_start_time);
215 GNUNET_CONTAINER_DLL_remove (act_head, 224 GNUNET_CONTAINER_DLL_remove (act_head,
@@ -247,7 +256,11 @@ process_queue (void *cls)
247 GNUNET_CONTAINER_DLL_remove (act_head, 256 GNUNET_CONTAINER_DLL_remove (act_head,
248 act_tail, 257 act_tail,
249 req); 258 req);
259 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
260 "Failing request `%s' due to timeout\n",
261 req->hostname);
250 failures[req->cat]++; 262 failures[req->cat]++;
263 active_cnt--;
251 free_request (req); 264 free_request (req);
252 } 265 }
253 if (NULL == (req = todo_head)) 266 if (NULL == (req = todo_head))
@@ -273,7 +286,12 @@ process_queue (void *cls)
273 act_tail, 286 act_tail,
274 req); 287 req);
275 lookups[req->cat]++; 288 lookups[req->cat]++;
289 active_cnt++;
276 req->op_start_time = GNUNET_TIME_absolute_get (); 290 req->op_start_time = GNUNET_TIME_absolute_get ();
291 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
292 "Starting request `%s' (%u in parallel)\n",
293 req->hostname,
294 active_cnt);
277 req->lr = GNUNET_GNS_lookup_with_tld (gns, 295 req->lr = GNUNET_GNS_lookup_with_tld (gns,
278 req->hostname, 296 req->hostname,
279 GNUNET_GNSRECORD_TYPE_ANY, 297 GNUNET_GNSRECORD_TYPE_ANY,
@@ -439,7 +457,7 @@ queue (const char *hostname,
439 req = GNUNET_malloc (sizeof (struct Request) + hlen); 457 req = GNUNET_malloc (sizeof (struct Request) + hlen);
440 req->cat = cat; 458 req->cat = cat;
441 req->hostname = (char *) &req[1]; 459 req->hostname = (char *) &req[1];
442 GNUNET_memcpy (req->hostname, 460 GNUNET_memcpy (&req[1],
443 hostname, 461 hostname,
444 hlen); 462 hlen);
445 GNUNET_CONTAINER_DLL_insert (todo_head, 463 GNUNET_CONTAINER_DLL_insert (todo_head,
diff --git a/src/gns/gnunet-service-gns.c b/src/gns/gnunet-service-gns.c
index cffae824d..aaa4aeb0e 100644
--- a/src/gns/gnunet-service-gns.c
+++ b/src/gns/gnunet-service-gns.c
@@ -334,30 +334,43 @@ client_connect_cb (void *cls,
334 * @param rd the record data 334 * @param rd the record data
335 */ 335 */
336static void 336static void
337send_lookup_response (void* cls, 337send_lookup_response (void *cls,
338 uint32_t rd_count, 338 uint32_t rd_count,
339 const struct GNUNET_GNSRECORD_Data *rd) 339 const struct GNUNET_GNSRECORD_Data *rd)
340{ 340{
341 struct ClientLookupHandle *clh = cls; 341 struct ClientLookupHandle *clh = cls;
342 struct GnsClient *gc = clh->gc; 342 struct GnsClient *gc = clh->gc;
343 struct GNUNET_MQ_Envelope *env; 343 struct GNUNET_MQ_Envelope *env;
344 struct LookupResultMessage *rmsg; 344 struct LookupResultMessage *rmsg;
345 size_t len; 345 ssize_t len;
346 346
347 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 347 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
348 "Sending LOOKUP_RESULT message with %u results\n", 348 "Sending LOOKUP_RESULT message with %u results\n",
349 (unsigned int) rd_count); 349 (unsigned int) rd_count);
350 len = GNUNET_GNSRECORD_records_get_size (rd_count, 350 len = GNUNET_GNSRECORD_records_get_size (rd_count,
351 rd); 351 rd);
352 if (len < 0)
353 {
354 GNUNET_break (0);
355 GNUNET_SERVICE_client_drop (gc->client);
356 return;
357 }
358 if (len > UINT16_MAX - sizeof (*rmsg))
359 {
360 GNUNET_break (0);
361 GNUNET_SERVICE_client_drop (gc->client);
362 return;
363 }
352 env = GNUNET_MQ_msg_extra (rmsg, 364 env = GNUNET_MQ_msg_extra (rmsg,
353 len, 365 len,
354 GNUNET_MESSAGE_TYPE_GNS_LOOKUP_RESULT); 366 GNUNET_MESSAGE_TYPE_GNS_LOOKUP_RESULT);
355 rmsg->id = clh->request_id; 367 rmsg->id = clh->request_id;
356 rmsg->rd_count = htonl (rd_count); 368 rmsg->rd_count = htonl (rd_count);
357 GNUNET_GNSRECORD_records_serialize (rd_count, 369 GNUNET_assert (len ==
358 rd, 370 GNUNET_GNSRECORD_records_serialize (rd_count,
359 len, 371 rd,
360 (char*) &rmsg[1]); 372 len,
373 (char*) &rmsg[1]));
361 GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq (gc->client), 374 GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq (gc->client),
362 env); 375 env);
363 GNUNET_CONTAINER_DLL_remove (gc->clh_head, 376 GNUNET_CONTAINER_DLL_remove (gc->clh_head,
diff --git a/src/gns/gnunet-service-gns_resolver.c b/src/gns/gnunet-service-gns_resolver.c
index 542085910..8b20f2ae3 100644
--- a/src/gns/gnunet-service-gns_resolver.c
+++ b/src/gns/gnunet-service-gns_resolver.c
@@ -151,16 +151,6 @@ struct AuthorityChain
151 char *label; 151 char *label;
152 152
153 /** 153 /**
154 * label/name suggested for shortening to the authority
155 */
156 char *suggested_shortening_label;
157
158 /**
159 * Do we already try to shorten this authority?
160 */
161 int shortening_started;
162
163 /**
164 * #GNUNET_YES if the authority was a GNS authority, 154 * #GNUNET_YES if the authority was a GNS authority,
165 * #GNUNET_NO if the authority was a DNS authority. 155 * #GNUNET_NO if the authority was a DNS authority.
166 */ 156 */
@@ -290,7 +280,7 @@ struct VpnContext
290 /** 280 /**
291 * Number of bytes in @e rd_data. 281 * Number of bytes in @e rd_data.
292 */ 282 */
293 size_t rd_data_size; 283 ssize_t rd_data_size;
294}; 284};
295 285
296 286
@@ -946,35 +936,45 @@ dns_result_parser (void *cls,
946 if ( (p->num_answers > 0) && 936 if ( (p->num_answers > 0) &&
947 (GNUNET_DNSPARSER_TYPE_CNAME == p->answers[0].type) && 937 (GNUNET_DNSPARSER_TYPE_CNAME == p->answers[0].type) &&
948 (GNUNET_DNSPARSER_TYPE_CNAME != rh->record_type) ) 938 (GNUNET_DNSPARSER_TYPE_CNAME != rh->record_type) )
949 { 939 {
950 int af; 940 int af;
951 941
952 GNUNET_free (rh->name); 942 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
953 rh->name = GNUNET_strdup (p->answers[0].data.hostname); 943 "Got CNAME `%s' from DNS for `%s'\n",
954 rh->name_resolution_pos = strlen (rh->name); 944 p->answers[0].data.hostname,
955 switch (rh->record_type) 945 rh->name);
956 { 946 if (NULL != rh->std_resolve)
957 case GNUNET_DNSPARSER_TYPE_A: 947 {
958 af = AF_INET; 948 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
959 break; 949 "Multiple CNAME results from DNS resolving `%s'! Not really allowed...\n",
960 case GNUNET_DNSPARSER_TYPE_AAAA:
961 af = AF_INET6;
962 break;
963 default:
964 af = AF_UNSPEC;
965 break;
966 }
967 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
968 "Doing standard DNS lookup for `%s'\n",
969 rh->name); 950 rh->name);
970 rh->std_resolve = GNUNET_RESOLVER_ip_get (rh->name, 951 GNUNET_RESOLVER_request_cancel (rh->std_resolve);
971 af, 952 }
972 DNS_LOOKUP_TIMEOUT, 953 GNUNET_free (rh->name);
973 &handle_dns_result, 954 rh->name = GNUNET_strdup (p->answers[0].data.hostname);
974 rh); 955 rh->name_resolution_pos = strlen (rh->name);
975 GNUNET_DNSPARSER_free_packet (p); 956 switch (rh->record_type)
976 return; 957 {
958 case GNUNET_DNSPARSER_TYPE_A:
959 af = AF_INET;
960 break;
961 case GNUNET_DNSPARSER_TYPE_AAAA:
962 af = AF_INET6;
963 break;
964 default:
965 af = AF_UNSPEC;
966 break;
977 } 967 }
968 rh->std_resolve = GNUNET_RESOLVER_ip_get (rh->name,
969 af,
970 DNS_LOOKUP_TIMEOUT,
971 &handle_dns_result,
972 rh);
973 GNUNET_DNSPARSER_free_packet (p);
974 GNUNET_DNSSTUB_resolve_cancel (rh->dns_request);
975 rh->dns_request = NULL;
976 return;
977 }
978 978
979 /* convert from (parsed) DNS to (binary) GNS format! */ 979 /* convert from (parsed) DNS to (binary) GNS format! */
980 rd_count = p->num_answers + p->num_authority_records + p->num_additional_records; 980 rd_count = p->num_answers + p->num_authority_records + p->num_additional_records;
@@ -1112,6 +1112,8 @@ dns_result_parser (void *cls,
1112 rh->proc (rh->proc_cls, 1112 rh->proc (rh->proc_cls,
1113 rd_count - skip, 1113 rd_count - skip,
1114 rd); 1114 rd);
1115 GNUNET_DNSSTUB_resolve_cancel (rh->dns_request);
1116 rh->dns_request = NULL;
1115 } 1117 }
1116 GNUNET_DNSPARSER_free_packet (p); 1118 GNUNET_DNSPARSER_free_packet (p);
1117 if (NULL != rh->task_id) 1119 if (NULL != rh->task_id)
@@ -1235,8 +1237,6 @@ handle_gns_cname_result (struct GNS_ResolverHandle *rh,
1235 ac->gns_authority = GNUNET_YES; 1237 ac->gns_authority = GNUNET_YES;
1236 ac->authority_info.gns_authority = rh->ac_tail->authority_info.gns_authority; 1238 ac->authority_info.gns_authority = rh->ac_tail->authority_info.gns_authority;
1237 ac->label = resolver_lookup_get_next_label (rh); 1239 ac->label = resolver_lookup_get_next_label (rh);
1238 ac->suggested_shortening_label = NULL;
1239 ac->shortening_started = GNUNET_NO;
1240 /* add AC to tail */ 1240 /* add AC to tail */
1241 GNUNET_CONTAINER_DLL_insert_tail (rh->ac_head, 1241 GNUNET_CONTAINER_DLL_insert_tail (rh->ac_head,
1242 rh->ac_tail, 1242 rh->ac_tail,
@@ -1245,6 +1245,17 @@ handle_gns_cname_result (struct GNS_ResolverHandle *rh,
1245 rh); 1245 rh);
1246 return; 1246 return;
1247 } 1247 }
1248 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
1249 "Got CNAME `%s' from GNS for `%s'\n",
1250 cname,
1251 rh->name);
1252 if (NULL != rh->std_resolve)
1253 {
1254 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
1255 "Multiple CNAME results from GNS resolving `%s'! Not really allowed...\n",
1256 rh->name);
1257 GNUNET_RESOLVER_request_cancel (rh->std_resolve);
1258 }
1248 /* name is absolute, go to DNS */ 1259 /* name is absolute, go to DNS */
1249 GNUNET_free (rh->name); 1260 GNUNET_free (rh->name);
1250 rh->name = GNUNET_strdup (cname); 1261 rh->name = GNUNET_strdup (cname);
@@ -1312,7 +1323,7 @@ vpn_allocation_cb (void *cls,
1312 vpn_ctx->vpn_request = NULL; 1323 vpn_ctx->vpn_request = NULL;
1313 rh->vpn_ctx = NULL; 1324 rh->vpn_ctx = NULL;
1314 GNUNET_assert (GNUNET_OK == 1325 GNUNET_assert (GNUNET_OK ==
1315 GNUNET_GNSRECORD_records_deserialize (vpn_ctx->rd_data_size, 1326 GNUNET_GNSRECORD_records_deserialize ((size_t) vpn_ctx->rd_data_size,
1316 vpn_ctx->rd_data, 1327 vpn_ctx->rd_data,
1317 vpn_ctx->rd_count, 1328 vpn_ctx->rd_count,
1318 rd)); 1329 rd));
@@ -1601,8 +1612,6 @@ recursive_pkey_resolution (struct GNS_ResolverHandle *rh,
1601 ac = GNUNET_new (struct AuthorityChain); 1612 ac = GNUNET_new (struct AuthorityChain);
1602 ac->rh = rh; 1613 ac->rh = rh;
1603 ac->gns_authority = GNUNET_YES; 1614 ac->gns_authority = GNUNET_YES;
1604 ac->suggested_shortening_label = NULL;
1605 ac->shortening_started = GNUNET_NO;
1606 GNUNET_memcpy (&ac->authority_info.gns_authority, 1615 GNUNET_memcpy (&ac->authority_info.gns_authority,
1607 rd->data, 1616 rd->data,
1608 sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey)); 1617 sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey));
@@ -1649,6 +1658,8 @@ recursive_gns2dns_resolution (struct GNS_ResolverHandle *rh,
1649 size_t off; 1658 size_t off;
1650 struct Gns2DnsPending *gp; 1659 struct Gns2DnsPending *gp;
1651 struct GNUNET_CRYPTO_EcdsaPublicKey zone; 1660 struct GNUNET_CRYPTO_EcdsaPublicKey zone;
1661 struct sockaddr_in v4;
1662 struct sockaddr_in6 v6;
1652 1663
1653 if (GNUNET_GNSRECORD_TYPE_GNS2DNS != rd[i].record_type) 1664 if (GNUNET_GNSRECORD_TYPE_GNS2DNS != rd[i].record_type)
1654 continue; 1665 continue;
@@ -1690,10 +1701,16 @@ recursive_gns2dns_resolution (struct GNS_ResolverHandle *rh,
1690 } 1701 }
1691 1702
1692 /* check if 'ip' is already an IPv4/IPv6 address */ 1703 /* check if 'ip' is already an IPv4/IPv6 address */
1693 if (GNUNET_OK == 1704 if ( (1 == inet_pton (AF_INET,
1694 GNUNET_DNSSTUB_add_dns_ip (ac->authority_info.dns_authority.dns_handle, 1705 ip,
1695 ip)) 1706 &v4)) ||
1707 (1 == inet_pton (AF_INET6,
1708 ip,
1709 &v6)) )
1696 { 1710 {
1711 GNUNET_break (GNUNET_OK ==
1712 GNUNET_DNSSTUB_add_dns_ip (ac->authority_info.dns_authority.dns_handle,
1713 ip));
1697 ac->authority_info.dns_authority.found = GNUNET_YES; 1714 ac->authority_info.dns_authority.found = GNUNET_YES;
1698 GNUNET_free (ip); 1715 GNUNET_free (ip);
1699 continue; 1716 continue;
@@ -1798,7 +1815,6 @@ handle_gns_resolution_result (void *cls,
1798 const struct GNUNET_GNSRECORD_Data *rd) 1815 const struct GNUNET_GNSRECORD_Data *rd)
1799{ 1816{
1800 struct GNS_ResolverHandle *rh = cls; 1817 struct GNS_ResolverHandle *rh = cls;
1801 struct AuthorityChain *shorten_ac;
1802 char *cname; 1818 char *cname;
1803 struct VpnContext *vpn_ctx; 1819 struct VpnContext *vpn_ctx;
1804 const struct GNUNET_TUN_GnsVpnRecord *vpn; 1820 const struct GNUNET_TUN_GnsVpnRecord *vpn;
@@ -1889,13 +1905,20 @@ handle_gns_resolution_result (void *cls,
1889 vpn_ctx->rh = rh; 1905 vpn_ctx->rh = rh;
1890 vpn_ctx->rd_data_size = GNUNET_GNSRECORD_records_get_size (rd_count, 1906 vpn_ctx->rd_data_size = GNUNET_GNSRECORD_records_get_size (rd_count,
1891 rd); 1907 rd);
1892 vpn_ctx->rd_data = GNUNET_malloc (vpn_ctx->rd_data_size); 1908 if (vpn_ctx->rd_data_size < 0)
1909 {
1910 GNUNET_break_op (0);
1911 GNUNET_free (vpn_ctx);
1912 fail_resolution (rh);
1913 return;
1914 }
1915 vpn_ctx->rd_data = GNUNET_malloc ((size_t) vpn_ctx->rd_data_size);
1893 vpn_ctx->rd_count = rd_count; 1916 vpn_ctx->rd_count = rd_count;
1894 GNUNET_assert (vpn_ctx->rd_data_size == 1917 GNUNET_assert (vpn_ctx->rd_data_size ==
1895 (size_t) GNUNET_GNSRECORD_records_serialize (rd_count, 1918 GNUNET_GNSRECORD_records_serialize (rd_count,
1896 rd, 1919 rd,
1897 vpn_ctx->rd_data_size, 1920 (size_t) vpn_ctx->rd_data_size,
1898 vpn_ctx->rd_data)); 1921 vpn_ctx->rd_data));
1899 vpn_ctx->vpn_request = GNUNET_VPN_redirect_to_peer (vpn_handle, 1922 vpn_ctx->vpn_request = GNUNET_VPN_redirect_to_peer (vpn_handle,
1900 af, 1923 af,
1901 ntohs (vpn->proto), 1924 ntohs (vpn->proto),
@@ -1928,7 +1951,6 @@ handle_gns_resolution_result (void *cls,
1928 using 'scratch' array for memory allocations */ 1951 using 'scratch' array for memory allocations */
1929 scratch_off = 0; 1952 scratch_off = 0;
1930 rd_off = 0; 1953 rd_off = 0;
1931 shorten_ac = rh->ac_tail;
1932 for (unsigned int i=0;i<rd_count;i++) 1954 for (unsigned int i=0;i<rd_count;i++)
1933 { 1955 {
1934 GNUNET_assert (rd_off <= i); 1956 GNUNET_assert (rd_off <= i);
@@ -2106,8 +2128,6 @@ handle_gns_resolution_result (void *cls,
2106 GNUNET_break_op (0); 2128 GNUNET_break_op (0);
2107 break; 2129 break;
2108 } 2130 }
2109 if (NULL == shorten_ac->suggested_shortening_label)
2110 shorten_ac->suggested_shortening_label = GNUNET_strdup (nick);
2111 break; 2131 break;
2112 } 2132 }
2113 case GNUNET_GNSRECORD_TYPE_PKEY: 2133 case GNUNET_GNSRECORD_TYPE_PKEY:
@@ -2133,8 +2153,6 @@ handle_gns_resolution_result (void *cls,
2133 ac->gns_authority = GNUNET_YES; 2153 ac->gns_authority = GNUNET_YES;
2134 ac->authority_info.gns_authority = pub; 2154 ac->authority_info.gns_authority = pub;
2135 ac->label = GNUNET_strdup (GNUNET_GNS_EMPTY_LABEL_AT); 2155 ac->label = GNUNET_strdup (GNUNET_GNS_EMPTY_LABEL_AT);
2136 ac->suggested_shortening_label = NULL;
2137 ac->shortening_started = GNUNET_NO;
2138 GNUNET_CONTAINER_DLL_insert_tail (rh->ac_head, 2156 GNUNET_CONTAINER_DLL_insert_tail (rh->ac_head,
2139 rh->ac_tail, 2157 rh->ac_tail,
2140 ac); 2158 ac);
@@ -2386,7 +2404,8 @@ start_dht_request (struct GNS_ResolverHandle *rh,
2386 if (GNUNET_CONTAINER_heap_get_size (dht_lookup_heap) > max_allowed_background_queries) 2404 if (GNUNET_CONTAINER_heap_get_size (dht_lookup_heap) > max_allowed_background_queries)
2387 { 2405 {
2388 /* fail longest-standing DHT request */ 2406 /* fail longest-standing DHT request */
2389 rx = GNUNET_CONTAINER_heap_peek (dht_lookup_heap); 2407 rx = GNUNET_CONTAINER_heap_remove_root (dht_lookup_heap);
2408 rx->dht_heap_node = NULL;
2390 GNUNET_assert (NULL != rx); 2409 GNUNET_assert (NULL != rx);
2391 fail_resolution (rx); 2410 fail_resolution (rx);
2392 } 2411 }
@@ -2656,7 +2675,6 @@ start_resolver_lookup (void *cls)
2656 ac = GNUNET_new (struct AuthorityChain); 2675 ac = GNUNET_new (struct AuthorityChain);
2657 ac->rh = rh; 2676 ac->rh = rh;
2658 ac->label = resolver_lookup_get_next_label (rh); 2677 ac->label = resolver_lookup_get_next_label (rh);
2659 ac->suggested_shortening_label = NULL;
2660 if (NULL == ac->label) 2678 if (NULL == ac->label)
2661 /* name was just the "TLD", so we default to label 2679 /* name was just the "TLD", so we default to label
2662 #GNUNET_GNS_EMPTY_LABEL_AT */ 2680 #GNUNET_GNS_EMPTY_LABEL_AT */
@@ -2770,7 +2788,6 @@ GNS_resolver_lookup_cancel (struct GNS_ResolverHandle *rh)
2770 GNUNET_DNSSTUB_stop (ac->authority_info.dns_authority.dns_handle); 2788 GNUNET_DNSSTUB_stop (ac->authority_info.dns_authority.dns_handle);
2771 } 2789 }
2772 GNUNET_free (ac->label); 2790 GNUNET_free (ac->label);
2773 GNUNET_free_non_null (ac->suggested_shortening_label);
2774 GNUNET_free (ac); 2791 GNUNET_free (ac);
2775 } 2792 }
2776 if (NULL != rh->task_id) 2793 if (NULL != rh->task_id)
diff --git a/src/gns/test_gns_defaults.conf b/src/gns/test_gns_defaults.conf
index 261dab6ed..01825fafe 100644
--- a/src/gns/test_gns_defaults.conf
+++ b/src/gns/test_gns_defaults.conf
@@ -1,4 +1,4 @@
1@INLINE@ ../../contrib/no_forcestart.conf 1@INLINE@ ../../contrib/conf/gnunet/no_forcestart.conf
2 2
3[PATHS] 3[PATHS]
4GNUNET_TEST_HOME = $GNUNET_TMP/test-gnunet-gns-testing/ 4GNUNET_TEST_HOME = $GNUNET_TMP/test-gnunet-gns-testing/
diff --git a/src/gns/test_gns_gns2dns_cname_lookup.sh b/src/gns/test_gns_gns2dns_cname_lookup.sh
new file mode 100755
index 000000000..32e730d4c
--- /dev/null
+++ b/src/gns/test_gns_gns2dns_cname_lookup.sh
@@ -0,0 +1,89 @@
1#!/bin/bash
2trap "gnunet-arm -e -c test_gns_lookup.conf" SIGINT
3
4LOCATION=$(which gnunet-config)
5if [ -z $LOCATION ]
6then
7 LOCATION="gnunet-config"
8fi
9$LOCATION --version 1> /dev/null
10if test $? != 0
11then
12 echo "GNUnet command line tools cannot be found, check environmental variables PATH and GNUNET_PREFIX"
13 exit 77
14fi
15
16rm -rf `gnunet-config -c test_gns_lookup.conf -f -s paths -o GNUNET_TEST_HOME`
17# IP address of 'www.gnunet.org'
18TEST_IP="131.159.74.67"
19# IPv6 address of 'gnunet.org'
20TEST_IP6="2001:4ca0:2001:42:225:90ff:fe6b:d60"
21
22# main label used during resolution
23TEST_RECORD_NAME="homepage"
24
25XNS=ns.joker.com
26
27if ! nslookup gnunet.org a.$XNS &> /dev/null
28then
29 echo "Cannot reach DNS, skipping test"
30 exit 77
31fi
32
33# helper record for pointing to the DNS resolver
34TEST_RESOLVER_LABEL="resolver"
35# GNS2DNS record value: delegate to DNS domain 'gnunet.org'
36# using the TEST_RESOLVER_LABEL DNS server for resolution
37TEST_RECORD_GNS2DNS1="gnunet.org@a.$XNS"
38TEST_RECORD_GNS2DNS2="gnunet.org@b.$XNS"
39TEST_RECORD_GNS2DNS3="gnunet.org@c.$XNS"
40
41MY_EGO="myego"
42# various names we will use for resolution
43TEST_DOMAIN="www.${TEST_RECORD_NAME}.$MY_EGO"
44
45gnunet-arm -s -c test_gns_lookup.conf
46gnunet-identity -C $MY_EGO -c test_gns_lookup.conf
47
48# set IP address for DNS resolver for resolving in gnunet.org domain
49# map '$TEST_RECORD_NAME.$MY_EGO' to 'gnunet.org' in DNS
50gnunet-namestore -p -z $MY_EGO -a -n $TEST_RECORD_NAME -t GNS2DNS -V $TEST_RECORD_GNS2DNS1 -e never -c test_gns_lookup.conf
51gnunet-namestore -p -z $MY_EGO -a -n $TEST_RECORD_NAME -t GNS2DNS -V $TEST_RECORD_GNS2DNS2 -e never -c test_gns_lookup.conf
52gnunet-namestore -p -z $MY_EGO -a -n $TEST_RECORD_NAME -t GNS2DNS -V $TEST_RECORD_GNS2DNS3 -e never -c test_gns_lookup.conf
53
54which timeout &> /dev/null && DO_TIMEOUT="timeout 15"
55
56echo "EGOs:"
57gnunet-identity -d
58
59# lookup 'www.gnunet.org', IPv4
60RES_IP=`$DO_TIMEOUT gnunet-gns --raw -u $TEST_DOMAIN -t A -c test_gns_lookup.conf`
61# lookup 'www.gnunet.org', IPv6
62RES_IP6=`$DO_TIMEOUT gnunet-gns --raw -u $TEST_DOMAIN -t AAAA -c test_gns_lookup.conf`
63
64# clean up
65gnunet-namestore -z $MY_EGO -d -n $TEST_RECORD_NAME -t GNS2DNS -V $TEST_RECORD_GNS2DNS1 -e never -c test_gns_lookup.conf
66gnunet-namestore -z $MY_EGO -d -n $TEST_RECORD_NAME -t GNS2DNS -V $TEST_RECORD_GNS2DNS2 -e never -c test_gns_lookup.conf
67gnunet-namestore -z $MY_EGO -d -n $TEST_RECORD_NAME -t GNS2DNS -V $TEST_RECORD_GNS2DNS3 -e never -c test_gns_lookup.conf
68gnunet-identity -D $MY_EGO -c test_gns_lookup.conf
69gnunet-arm -e -c test_gns_lookup.conf
70rm -rf `gnunet-config -c test_gns_lookup.conf -f -s paths -o GNUNET_TEST_HOME`
71
72ret=0
73if [ "$RES_IP" == "$TEST_IP" ]
74then
75 echo "PASS: Resolved $TEST_DOMAIN to $RES_IP."
76else
77 echo "Failed to resolve to proper IP for $TEST_DOMAIN, got $RES_IP, wanted $TEST_IP."
78 ret=1
79fi
80
81if [ "$RES_IP6" == "$TEST_IP6" ]
82then
83 echo "PASS: Resolved $TEST_DOMAIN to $RES_IP6."
84else
85 echo "Failed to resolve to proper IP for $TEST_DOMAIN, got $RES_IP6, wanted $TEST_IP6."
86 ret=1
87fi
88
89exit $ret
diff --git a/src/gnsrecord/gnsrecord_crypto.c b/src/gnsrecord/gnsrecord_crypto.c
index 6d59a545a..6d3887392 100644
--- a/src/gnsrecord/gnsrecord_crypto.c
+++ b/src/gnsrecord/gnsrecord_crypto.c
@@ -87,9 +87,8 @@ block_create (const struct GNUNET_CRYPTO_EcdsaPrivateKey *key,
87 const struct GNUNET_GNSRECORD_Data *rd, 87 const struct GNUNET_GNSRECORD_Data *rd,
88 unsigned int rd_count) 88 unsigned int rd_count)
89{ 89{
90 size_t payload_len = GNUNET_GNSRECORD_records_get_size (rd_count, 90 ssize_t payload_len = GNUNET_GNSRECORD_records_get_size (rd_count,
91 rd); 91 rd);
92 char payload[sizeof (uint32_t) + payload_len];
93 struct GNUNET_GNSRECORD_Block *block; 92 struct GNUNET_GNSRECORD_Block *block;
94 struct GNUNET_CRYPTO_EcdsaPrivateKey *dkey; 93 struct GNUNET_CRYPTO_EcdsaPrivateKey *dkey;
95 struct GNUNET_CRYPTO_SymmetricInitializationVector iv; 94 struct GNUNET_CRYPTO_SymmetricInitializationVector iv;
@@ -98,8 +97,16 @@ block_create (const struct GNUNET_CRYPTO_EcdsaPrivateKey *key,
98 uint32_t rd_count_nbo; 97 uint32_t rd_count_nbo;
99 struct GNUNET_TIME_Absolute now; 98 struct GNUNET_TIME_Absolute now;
100 99
100 if (payload_len < 0)
101 {
102 GNUNET_break (0);
103 return NULL;
104 }
101 if (payload_len > GNUNET_GNSRECORD_MAX_BLOCK_SIZE) 105 if (payload_len > GNUNET_GNSRECORD_MAX_BLOCK_SIZE)
106 {
107 GNUNET_break (0);
102 return NULL; 108 return NULL;
109 }
103 /* convert relative to absolute times */ 110 /* convert relative to absolute times */
104 now = GNUNET_TIME_absolute_get (); 111 now = GNUNET_TIME_absolute_get ();
105 for (unsigned int i=0;i<rd_count;i++) 112 for (unsigned int i=0;i<rd_count;i++)
@@ -117,39 +124,43 @@ block_create (const struct GNUNET_CRYPTO_EcdsaPrivateKey *key,
117 } 124 }
118 /* serialize */ 125 /* serialize */
119 rd_count_nbo = htonl (rd_count); 126 rd_count_nbo = htonl (rd_count);
120 GNUNET_memcpy (payload, 127 {
121 &rd_count_nbo, 128 char payload[sizeof (uint32_t) + payload_len];
122 sizeof (uint32_t)); 129
123 GNUNET_assert (payload_len == 130 GNUNET_memcpy (payload,
124 GNUNET_GNSRECORD_records_serialize (rd_count, 131 &rd_count_nbo,
125 rdc, 132 sizeof (uint32_t));
126 payload_len, 133 GNUNET_assert (payload_len ==
127 &payload[sizeof (uint32_t)])); 134 GNUNET_GNSRECORD_records_serialize (rd_count,
128 block = GNUNET_malloc (sizeof (struct GNUNET_GNSRECORD_Block) + 135 rdc,
129 sizeof (uint32_t) + 136 payload_len,
130 payload_len); 137 &payload[sizeof (uint32_t)]));
131 block->purpose.size = htonl (sizeof (uint32_t) + 138 block = GNUNET_malloc (sizeof (struct GNUNET_GNSRECORD_Block) +
132 payload_len + 139 sizeof (uint32_t) +
133 sizeof (struct GNUNET_CRYPTO_EccSignaturePurpose) + 140 payload_len);
134 sizeof (struct GNUNET_TIME_AbsoluteNBO)); 141 block->purpose.size = htonl (sizeof (uint32_t) +
135 block->purpose.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_GNS_RECORD_SIGN); 142 payload_len +
136 block->expiration_time = GNUNET_TIME_absolute_hton (expire); 143 sizeof (struct GNUNET_CRYPTO_EccSignaturePurpose) +
137 /* encrypt and sign */ 144 sizeof (struct GNUNET_TIME_AbsoluteNBO));
138 dkey = GNUNET_CRYPTO_ecdsa_private_key_derive (key, 145 block->purpose.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_GNS_RECORD_SIGN);
139 label, 146 block->expiration_time = GNUNET_TIME_absolute_hton (expire);
140 "gns"); 147 /* encrypt and sign */
141 GNUNET_CRYPTO_ecdsa_key_get_public (dkey, 148 dkey = GNUNET_CRYPTO_ecdsa_private_key_derive (key,
142 &block->derived_key); 149 label,
143 derive_block_aes_key (&iv, 150 "gns");
144 &skey, 151 GNUNET_CRYPTO_ecdsa_key_get_public (dkey,
145 label, 152 &block->derived_key);
146 pkey); 153 derive_block_aes_key (&iv,
147 GNUNET_break (payload_len + sizeof (uint32_t) == 154 &skey,
148 GNUNET_CRYPTO_symmetric_encrypt (payload, 155 label,
149 payload_len + sizeof (uint32_t), 156 pkey);
150 &skey, 157 GNUNET_break (payload_len + sizeof (uint32_t) ==
151 &iv, 158 GNUNET_CRYPTO_symmetric_encrypt (payload,
152 &block[1])); 159 payload_len + sizeof (uint32_t),
160 &skey,
161 &iv,
162 &block[1]));
163 }
153 if (GNUNET_OK != 164 if (GNUNET_OK !=
154 GNUNET_CRYPTO_ecdsa_sign (dkey, 165 GNUNET_CRYPTO_ecdsa_sign (dkey,
155 &block->purpose, 166 &block->purpose,
diff --git a/src/gnsrecord/gnsrecord_serialization.c b/src/gnsrecord/gnsrecord_serialization.c
index 1db27464f..77118ab94 100644
--- a/src/gnsrecord/gnsrecord_serialization.c
+++ b/src/gnsrecord/gnsrecord_serialization.c
@@ -37,6 +37,12 @@
37 37
38#define LOG(kind,...) GNUNET_log_from (kind, "gnsrecord",__VA_ARGS__) 38#define LOG(kind,...) GNUNET_log_from (kind, "gnsrecord",__VA_ARGS__)
39 39
40/**
41 * Set to 1 to check that all records are well-formed (can be converted
42 * to string) during serialization/deserialization.
43 */
44#define DEBUG_GNSRECORDS 0
45
40GNUNET_NETWORK_STRUCT_BEGIN 46GNUNET_NETWORK_STRUCT_BEGIN
41 47
42 48
@@ -78,9 +84,9 @@ GNUNET_NETWORK_STRUCT_END
78 * 84 *
79 * @param rd_count number of records in the rd array 85 * @param rd_count number of records in the rd array
80 * @param rd array of #GNUNET_GNSRECORD_Data with @a rd_count elements 86 * @param rd array of #GNUNET_GNSRECORD_Data with @a rd_count elements
81 * @return the required size to serialize 87 * @return the required size to serialize, -1 on error
82 */ 88 */
83size_t 89ssize_t
84GNUNET_GNSRECORD_records_get_size (unsigned int rd_count, 90GNUNET_GNSRECORD_records_get_size (unsigned int rd_count,
85 const struct GNUNET_GNSRECORD_Data *rd) 91 const struct GNUNET_GNSRECORD_Data *rd)
86{ 92{
@@ -89,10 +95,34 @@ GNUNET_GNSRECORD_records_get_size (unsigned int rd_count,
89 ret = sizeof (struct NetworkRecord) * rd_count; 95 ret = sizeof (struct NetworkRecord) * rd_count;
90 for (unsigned int i=0;i<rd_count;i++) 96 for (unsigned int i=0;i<rd_count;i++)
91 { 97 {
92 GNUNET_assert ((ret + rd[i].data_size) >= ret); 98 if ((ret + rd[i].data_size) < ret)
99 {
100 GNUNET_break (0);
101 return -1;
102 }
93 ret += rd[i].data_size; 103 ret += rd[i].data_size;
104#if DEBUG_GNSRECORDS
105 {
106 char *str;
107
108 str = GNUNET_GNSRECORD_value_to_string (rd[i].record_type,
109 rd[i].data,
110 rd[i].data_size);
111 if (NULL == str)
112 {
113 GNUNET_break_op (0);
114 return -1;
115 }
116 GNUNET_free (str);
117 }
118#endif
119 }
120 if (ret > SSIZE_MAX)
121 {
122 GNUNET_break (0);
123 return -1;
94 } 124 }
95 return ret; 125 return (ssize_t) ret;
96} 126}
97 127
98 128
@@ -126,7 +156,8 @@ GNUNET_GNSRECORD_records_serialize (unsigned int rd_count,
126 rec.data_size = htonl ((uint32_t) rd[i].data_size); 156 rec.data_size = htonl ((uint32_t) rd[i].data_size);
127 rec.record_type = htonl (rd[i].record_type); 157 rec.record_type = htonl (rd[i].record_type);
128 rec.flags = htonl (rd[i].flags); 158 rec.flags = htonl (rd[i].flags);
129 if (off + sizeof (rec) > dest_size) 159 if ( (off + sizeof (rec) > dest_size) ||
160 (off + sizeof (rec) < off) )
130 { 161 {
131 GNUNET_break (0); 162 GNUNET_break (0);
132 return -1; 163 return -1;
@@ -135,7 +166,8 @@ GNUNET_GNSRECORD_records_serialize (unsigned int rd_count,
135 &rec, 166 &rec,
136 sizeof (rec)); 167 sizeof (rec));
137 off += sizeof (rec); 168 off += sizeof (rec);
138 if (off + rd[i].data_size > dest_size) 169 if ( (off + rd[i].data_size > dest_size) ||
170 (off + rd[i].data_size < off) )
139 { 171 {
140 GNUNET_break (0); 172 GNUNET_break (0);
141 return -1; 173 return -1;
@@ -144,7 +176,7 @@ GNUNET_GNSRECORD_records_serialize (unsigned int rd_count,
144 rd[i].data, 176 rd[i].data,
145 rd[i].data_size); 177 rd[i].data_size);
146 off += rd[i].data_size; 178 off += rd[i].data_size;
147#if GNUNET_EXTRA_LOGGING 179#if DEBUG_GNSRECORDS
148 { 180 {
149 char *str; 181 char *str;
150 182
@@ -154,7 +186,7 @@ GNUNET_GNSRECORD_records_serialize (unsigned int rd_count,
154 if (NULL == str) 186 if (NULL == str)
155 { 187 {
156 GNUNET_break_op (0); 188 GNUNET_break_op (0);
157 return GNUNET_SYSERR; 189 return -1;
158 } 190 }
159 GNUNET_free (str); 191 GNUNET_free (str);
160 } 192 }
@@ -185,7 +217,8 @@ GNUNET_GNSRECORD_records_deserialize (size_t len,
185 off = 0; 217 off = 0;
186 for (unsigned int i=0;i<rd_count;i++) 218 for (unsigned int i=0;i<rd_count;i++)
187 { 219 {
188 if (off + sizeof (rec) > len) 220 if ( (off + sizeof (rec) > len) ||
221 (off + sizeof (rec) < off) )
189 { 222 {
190 GNUNET_break_op (0); 223 GNUNET_break_op (0);
191 return GNUNET_SYSERR; 224 return GNUNET_SYSERR;
@@ -198,7 +231,8 @@ GNUNET_GNSRECORD_records_deserialize (size_t len,
198 dest[i].record_type = ntohl (rec.record_type); 231 dest[i].record_type = ntohl (rec.record_type);
199 dest[i].flags = ntohl (rec.flags); 232 dest[i].flags = ntohl (rec.flags);
200 off += sizeof (rec); 233 off += sizeof (rec);
201 if (off + dest[i].data_size > len) 234 if ( (off + dest[i].data_size > len) ||
235 (off + dest[i].data_size < off) )
202 { 236 {
203 GNUNET_break_op (0); 237 GNUNET_break_op (0);
204 return GNUNET_SYSERR; 238 return GNUNET_SYSERR;
diff --git a/src/hostlist/test_hostlist_defaults.conf b/src/hostlist/test_hostlist_defaults.conf
index 64e9acd51..dcd2790b0 100644
--- a/src/hostlist/test_hostlist_defaults.conf
+++ b/src/hostlist/test_hostlist_defaults.conf
@@ -1,5 +1,5 @@
1@INLINE@ ../../contrib/no_forcestart.conf 1@INLINE@ ../../contrib/conf/gnunet/no_forcestart.conf
2@INLINE@ ../../contrib/no_autostart_above_core.conf 2@INLINE@ ../../contrib/conf/gnunet/no_autostart_above_core.conf
3 3
4[PATHS] 4[PATHS]
5GNUNET_TEST_HOME = $GNUNET_TMP/test-gnunet-hostlist/ 5GNUNET_TEST_HOME = $GNUNET_TMP/test-gnunet-hostlist/
diff --git a/src/identity-provider/test_idp_defaults.conf b/src/identity-provider/test_idp_defaults.conf
index d7de3ce12..a9a197dea 100644
--- a/src/identity-provider/test_idp_defaults.conf
+++ b/src/identity-provider/test_idp_defaults.conf
@@ -1,4 +1,4 @@
1@INLINE@ ../../contrib/no_forcestart.conf 1@INLINE@ ../../contrib/conf/gnunet/no_forcestart.conf
2 2
3[PATHS] 3[PATHS]
4GNUNET_TEST_HOME = $GNUNET_TMP/test-gnunet-idp-testing/ 4GNUNET_TEST_HOME = $GNUNET_TMP/test-gnunet-idp-testing/
diff --git a/src/include/gnunet_gnsrecord_lib.h b/src/include/gnunet_gnsrecord_lib.h
index 38346ada3..56dadef3a 100644
--- a/src/include/gnunet_gnsrecord_lib.h
+++ b/src/include/gnunet_gnsrecord_lib.h
@@ -411,9 +411,9 @@ GNUNET_GNSRECORD_number_to_typename (uint32_t type);
411 * 411 *
412 * @param rd_count number of records in the @a rd array 412 * @param rd_count number of records in the @a rd array
413 * @param rd array of #GNUNET_GNSRECORD_Data with @a rd_count elements 413 * @param rd array of #GNUNET_GNSRECORD_Data with @a rd_count elements
414 * @return the required size to serialize 414 * @return the required size to serialize, -1 on error
415 */ 415 */
416size_t 416ssize_t
417GNUNET_GNSRECORD_records_get_size (unsigned int rd_count, 417GNUNET_GNSRECORD_records_get_size (unsigned int rd_count,
418 const struct GNUNET_GNSRECORD_Data *rd); 418 const struct GNUNET_GNSRECORD_Data *rd);
419 419
diff --git a/src/include/gnunet_mq_lib.h b/src/include/gnunet_mq_lib.h
index ecee1b223..fe699c48f 100644
--- a/src/include/gnunet_mq_lib.h
+++ b/src/include/gnunet_mq_lib.h
@@ -135,6 +135,26 @@ struct GNUNET_MQ_Envelope;
135 135
136 136
137/** 137/**
138 * Obtain message contained in envelope.
139 *
140 * @param env the envelope
141 * @return message contained in the envelope
142 */
143const struct GNUNET_MessageHeader *
144GNUNET_MQ_env_get_msg (const struct GNUNET_MQ_Envelope *env);
145
146
147/**
148 * Return next envelope in queue.
149 *
150 * @param env a queued envelope
151 * @return next one, or NULL
152 */
153const struct GNUNET_MQ_Envelope *
154GNUNET_MQ_env_next (const struct GNUNET_MQ_Envelope *env);
155
156
157/**
138 * Implementation of the #GNUNET_MQ_msg_nested_mh macro. 158 * Implementation of the #GNUNET_MQ_msg_nested_mh macro.
139 * 159 *
140 * @param mhp pointer to the message header pointer that will be changed to allocate at 160 * @param mhp pointer to the message header pointer that will be changed to allocate at
diff --git a/src/integration-tests/confs/test_defaults.conf b/src/integration-tests/confs/test_defaults.conf
index 1be582650..39020515f 100644
--- a/src/integration-tests/confs/test_defaults.conf
+++ b/src/integration-tests/confs/test_defaults.conf
@@ -1,5 +1,5 @@
1@INLINE@ ../../../contrib/no_forcestart.conf 1@INLINE@ ../../../contrib/conf/gnunet/no_forcestart.conf
2@INLINE@ ../../../contrib/no_autostart_above_core.conf 2@INLINE@ ../../../contrib/conf/gnunet/no_autostart_above_core.conf
3 3
4[fs] 4[fs]
5FORCESTART = YES 5FORCESTART = YES
diff --git a/src/integration-tests/gnunet_testing.py.in b/src/integration-tests/gnunet_testing.py.in
index cc3e18b06..d18f2b9f8 100644
--- a/src/integration-tests/gnunet_testing.py.in
+++ b/src/integration-tests/gnunet_testing.py.in
@@ -1,6 +1,6 @@
1#!@PYTHON@ 1#!@PYTHON@
2# This file is part of GNUnet. 2# This file is part of GNUnet.
3# (C) 2010, 2017 Christian Grothoff (and other contributing authors) 3# (C) 2010, 2017, 2018 Christian Grothoff (and other contributing authors)
4# 4#
5# GNUnet is free software; you can redistribute it and/or modify 5# GNUnet is free software; you can redistribute it and/or modify
6# it under the terms of the GNU General Public License as published 6# it under the terms of the GNU General Public License as published
@@ -25,86 +25,99 @@ import shutil
25import time 25import time
26from gnunet_pyexpect import pexpect 26from gnunet_pyexpect import pexpect
27 27
28
28class Check: 29class Check:
29 def __init__(self, test): 30 def __init__(self, test):
30 self.fulfilled = False 31 self.fulfilled = False
31 self.conditions = list() 32 self.conditions = list()
32 self.test = test 33 self.test = test
33 def add (self, condition): 34
35 def add(self, condition):
34 self.conditions.append(condition) 36 self.conditions.append(condition)
35 def run (self): 37
38 def run(self):
36 fulfilled = True 39 fulfilled = True
37 pos = 0 40 pos = 0
38 neg = 0 41 neg = 0
39 for c in self.conditions: 42 for c in self.conditions:
40 if (False == c.check ()): 43 if (False == c.check()):
41 fulfilled = False 44 fulfilled = False
42 neg += 1 45 neg += 1
43 else: 46 else:
44 pos += 1 47 pos += 1
45 return fulfilled 48 return fulfilled
46 def run_blocking (self, timeout, pos_cont, neg_cont): 49
47 execs = 0; 50 def run_blocking(self, timeout, pos_cont, neg_cont):
51 execs = 0
48 res = False 52 res = False
49 while ((False == res) and (execs < timeout)): 53 while ((False == res) and (execs < timeout)):
50 res = self.run() 54 res = self.run()
51 time.sleep(1) 55 time.sleep(1)
52 execs += 1 56 execs += 1
53 if ((False == res) and (execs >= timeout)): 57 if ((False == res) and (execs >= timeout)):
54 print(('Check had timeout after ' +str(timeout)+ ' seconds')) 58 print(('Check had timeout after ' + str(timeout) + ' seconds'))
55 neg_cont (self) 59 neg_cont(self)
56 elif ((False == res) and (execs < timeout)): 60 elif ((False == res) and (execs < timeout)):
57 if (None != neg_cont): 61 if (None != neg_cont):
58 neg_cont (self) 62 neg_cont(self)
59 else: 63 else:
60 if (None != pos_cont): 64 if (None != pos_cont):
61 pos_cont (self) 65 pos_cont(self)
62 return res 66 return res
63 def run_once (self, pos_cont, neg_cont): 67
64 execs = 0; 68 def run_once(self, pos_cont, neg_cont):
69 execs = 0
65 res = False 70 res = False
66 res = self.run() 71 res = self.run()
67 if ((res == False) and (neg_cont != None)): 72 if ((res == False) and (neg_cont != None)):
68 neg_cont (self) 73 neg_cont(self)
69 if ((res == True) and (pos_cont != None)): 74 if ((res == True) and (pos_cont != None)):
70 pos_cont (self) 75 pos_cont(self)
71 return res 76 return res
72 def evaluate (self, failed_only): 77
78 def evaluate(self, failed_only):
73 pos = 0 79 pos = 0
74 neg = 0 80 neg = 0
75 for c in self.conditions: 81 for c in self.conditions:
76 if (False == c.evaluate (failed_only)): 82 if (False == c.evaluate(failed_only)):
77 neg += 1 83 neg += 1
78 else: 84 else:
79 pos += 1 85 pos += 1
80 print((str(pos) +' out of '+ str (pos+neg) + ' conditions fulfilled')) 86 print((str(pos) + ' out of ' + str(pos+neg) + ' conditions fulfilled'))
81 return self.fulfilled 87 return self.fulfilled
82 def reset (self): 88
83 self.fulfilled = False 89 def reset(self):
84 for c in self.conditions: 90 self.fulfilled = False
85 c.fulfilled = False 91 for c in self.conditions:
86 92 c.fulfilled = False
93
94
87class Condition: 95class Condition:
88 def __init__(self): 96 def __init__(self):
89 self.fulfilled = False 97 self.fulfilled = False
90 self.type = 'generic' 98 self.type = 'generic'
99
91 def __init__(self, type): 100 def __init__(self, type):
92 self.fulfilled = False 101 self.fulfilled = False
93 self.type = type 102 self.type = type
103
94 def check(self): 104 def check(self):
95 return False; 105 return False
96 def evaluate (self, failed_only): 106
107 def evaluate(self, failed_only):
97 if ((self.fulfilled == False) and (failed_only == True)): 108 if ((self.fulfilled == False) and (failed_only == True)):
98 print(str(self.type) + 'condition for was ' + str(self.fulfilled)) 109 print(str(self.type) + 'condition for was ' + str(self.fulfilled))
99 elif (failed_only == False): 110 elif (failed_only == False):
100 print(str(self.type) + 'condition for was ' + str(self.fulfilled)) 111 print(str(self.type) + 'condition for was ' + str(self.fulfilled))
101 return self.fulfilled 112 return self.fulfilled
113
102 114
103class FileExistCondition (Condition): 115class FileExistCondition(Condition):
104 def __init__(self, file): 116 def __init__(self, file):
105 self.fulfilled = False 117 self.fulfilled = False
106 self.type = 'file' 118 self.type = 'file'
107 self.file = file 119 self.file = file
120
108 def check(self): 121 def check(self):
109 if (self.fulfilled == False): 122 if (self.fulfilled == False):
110 res = os.path.isfile(self.file) 123 res = os.path.isfile(self.file)
@@ -115,25 +128,28 @@ class FileExistCondition (Condition):
115 return False 128 return False
116 else: 129 else:
117 return True 130 return True
118 def evaluate (self, failed_only): 131
132 def evaluate(self, failed_only):
119 if ((self.fulfilled == False) and (failed_only == True)): 133 if ((self.fulfilled == False) and (failed_only == True)):
120 print(str(self.type) + 'condition for file '+self.file+' was ' + str(self.fulfilled)) 134 print(str(self.type) + 'condition for file '+self.file+' was ' + str(self.fulfilled))
121 elif (failed_only == False): 135 elif (failed_only == False):
122 print(str(self.type) + 'condition for file '+self.file+' was ' + str(self.fulfilled)) 136 print(str(self.type) + 'condition for file '+self.file+' was ' + str(self.fulfilled))
123 return self.fulfilled 137 return self.fulfilled
124 138
139
125class StatisticsCondition (Condition): 140class StatisticsCondition (Condition):
126 def __init__(self, peer, subsystem, name, value): 141 def __init__(self, peer, subsystem, name, value):
127 self.fulfilled = False 142 self.fulfilled = False
128 self.type = 'statistics' 143 self.type = 'statistics'
129 self.peer = peer; 144 self.peer = peer
130 self.subsystem = subsystem; 145 self.subsystem = subsystem
131 self.name = name; 146 self.name = name
132 self.value = value; 147 self.value = value
133 self.result = -1; 148 self.result = -1
149
134 def check(self): 150 def check(self):
135 if (self.fulfilled == False): 151 if (self.fulfilled == False):
136 self.result = self.peer.get_statistics_value (self.subsystem, self.name) 152 self.result = self.peer.get_statistics_value(self.subsystem, self.name)
137 if (str(self.result) == str(self.value)): 153 if (str(self.result) == str(self.value)):
138 self.fulfilled = True 154 self.fulfilled = True
139 return True 155 return True
@@ -141,38 +157,41 @@ class StatisticsCondition (Condition):
141 return False 157 return False
142 else: 158 else:
143 return True 159 return True
144 def evaluate (self, failed_only): 160
161 def evaluate(self, failed_only):
145 if (self.result == -1): 162 if (self.result == -1):
146 res = 'NaN' 163 res = 'NaN'
147 else: 164 else:
148 res = str(self.result) 165 res = str(self.result)
149 if (self.fulfilled == False): 166 if (self.fulfilled == False):
150 fail = " FAIL!" 167 fail = " FAIL!"
151 op = " != " 168 op = " != "
152 else: 169 else:
153 fail = "" 170 fail = ""
154 op = " == " 171 op = " == "
155 if (((self.fulfilled == False) and (failed_only == True)) or (failed_only == False)): 172 if (((self.fulfilled == False) and (failed_only == True)) or (failed_only == False)):
156 print(self.peer.id[:4] + " " +self.peer.cfg + " " + str(self.type) + ' condition in subsystem "' + self.subsystem.ljust(12) +'" : "' + self.name.ljust(30) +'" : (expected/real value) ' + str(self.value) + op + res + fail) 173 print(self.peer.id[:4] + " " + self.peer.cfg + " " + str(self.type) + ' condition in subsystem "' + self.subsystem.ljust(12) + '" : "' + self.name.ljust(30) + '" : (expected/real value) ' + str(self.value) + op + res + fail)
157 return self.fulfilled 174 return self.fulfilled
158 175
159# Specify two statistic values and check if they are equal 176
177# Specify two statistic values and check if they are equal
160class EqualStatisticsCondition (Condition): 178class EqualStatisticsCondition (Condition):
161 def __init__(self, peer, subsystem, name, peer2, subsystem2, name2): 179 def __init__(self, peer, subsystem, name, peer2, subsystem2, name2):
162 self.fulfilled = False 180 self.fulfilled = False
163 self.type = 'equalstatistics' 181 self.type = 'equalstatistics'
164 self.peer = peer; 182 self.peer = peer
165 self.subsystem = subsystem; 183 self.subsystem = subsystem
166 self.name = name; 184 self.name = name
167 self.result = -1; 185 self.result = -1
168 self.peer2 = peer2; 186 self.peer2 = peer2
169 self.subsystem2 = subsystem2; 187 self.subsystem2 = subsystem2
170 self.name2 = name2; 188 self.name2 = name2
171 self.result2 = -1; 189 self.result2 = -1
190
172 def check(self): 191 def check(self):
173 if (self.fulfilled == False): 192 if (self.fulfilled == False):
174 self.result = self.peer.get_statistics_value (self.subsystem, self.name); 193 self.result = self.peer.get_statistics_value(self.subsystem, self.name)
175 self.result2 = self.peer2.get_statistics_value (self.subsystem2, self.name2); 194 self.result2 = self.peer2.get_statistics_value(self.subsystem2, self.name2)
176 if (str(self.result) == str(self.result2)): 195 if (str(self.result) == str(self.result2)):
177 self.fulfilled = True 196 self.fulfilled = True
178 return True 197 return True
@@ -180,7 +199,8 @@ class EqualStatisticsCondition (Condition):
180 return False 199 return False
181 else: 200 else:
182 return True 201 return True
183 def evaluate (self, failed_only): 202
203 def evaluate(self, failed_only):
184 if (self.result == -1): 204 if (self.result == -1):
185 res = 'NaN' 205 res = 'NaN'
186 else: 206 else:
@@ -188,27 +208,28 @@ class EqualStatisticsCondition (Condition):
188 if (self.result2 == -1): 208 if (self.result2 == -1):
189 res2 = 'NaN' 209 res2 = 'NaN'
190 else: 210 else:
191 res2 = str(self.result2) 211 res2 = str(self.result2)
192 if (self.fulfilled == False): 212 if (self.fulfilled == False):
193 fail = " FAIL!" 213 fail = " FAIL!"
194 op = " != " 214 op = " != "
195 else: 215 else:
196 fail = "" 216 fail = ""
197 op = " == " 217 op = " == "
198 if (((self.fulfilled == False) and (failed_only == True)) or (failed_only == False)): 218 if (((self.fulfilled == False) and (failed_only == True)) or (failed_only == False)):
199 print(self.peer.id[:4] + ' "' + self.subsystem.ljust(12) + '" "' + self.name.ljust(30) + '" == ' + str(self.result) +" " + self.peer2.id[:4] + ' "' + self.subsystem2.ljust(12) + '" '+ self.name2.ljust(30) + '" ' + str(self.result2)) 219 print(self.peer.id[:4] + ' "' + self.subsystem.ljust(12) + '" "' + self.name.ljust(30) + '" == ' + str(self.result) + " " + self.peer2.id[:4] + ' "' + self.subsystem2.ljust(12) + '" ' + self.name2.ljust(30) + '" ' + str(self.result2))
200 return self.fulfilled 220 return self.fulfilled
201 221
222
202class Test: 223class Test:
203 def __init__(self, testname, verbose): 224 def __init__(self, testname, verbose):
204 self.peers = list() 225 self.peers = list()
205 self.verbose = verbose; 226 self.verbose = verbose
206 self.name = testname; 227 self.name = testname
207 srcdir = "../.." 228 srcdir = "../.."
208 gnunet_pyexpect_dir = os.path.join (srcdir, "contrib") 229 gnunet_pyexpect_dir = os.path.join(srcdir, "contrib/scripts")
209 if gnunet_pyexpect_dir not in sys.path: 230 if gnunet_pyexpect_dir not in sys.path:
210 sys.path.append (gnunet_pyexpect_dir) 231 sys.path.append(gnunet_pyexpect_dir)
211 self.gnunetarm = '' 232 self.gnunetarm = ''
212 self.gnunetstatistics = '' 233 self.gnunetstatistics = ''
213 if os.name == 'posix': 234 if os.name == 'posix':
214 self.gnunetarm = 'gnunet-arm' 235 self.gnunetarm = 'gnunet-arm'
@@ -217,17 +238,20 @@ class Test:
217 elif os.name == 'nt': 238 elif os.name == 'nt':
218 self.gnunetarm = 'gnunet-arm.exe' 239 self.gnunetarm = 'gnunet-arm.exe'
219 self.gnunetstatistics = 'gnunet-statistics.exe' 240 self.gnunetstatistics = 'gnunet-statistics.exe'
220 self.gnunetpeerinfo = 'gnunet-peerinfo.exe' 241 self.gnunetpeerinfo = 'gnunet-peerinfo.exe'
221 if os.name == "nt": 242 if os.name == "nt":
222 shutil.rmtree (os.path.join (os.getenv ("TEMP"), testname), True) 243 shutil.rmtree(os.path.join(os.getenv("TEMP"), testname), True)
223 else: 244 else:
224 shutil.rmtree ("/tmp/" + testname, True) 245 shutil.rmtree("/tmp/" + testname, True)
225 def add_peer (self, peer): 246
247 def add_peer(self, peer):
226 self.peers.append(peer) 248 self.peers.append(peer)
227 def p (self, msg): 249
250 def p(self, msg):
228 if (self.verbose == True): 251 if (self.verbose == True):
229 print(msg) 252 print(msg)
230 253
254
231class Peer: 255class Peer:
232 def __init__(self, test, cfg_file): 256 def __init__(self, test, cfg_file):
233 if (False == os.path.isfile(cfg_file)): 257 if (False == os.path.isfile(cfg_file)):
@@ -235,53 +259,57 @@ class Peer:
235 self.id = "<NaN>" 259 self.id = "<NaN>"
236 self.test = test 260 self.test = test
237 self.started = False 261 self.started = False
238 self.cfg = cfg_file 262 self.cfg = cfg_file
263
239 def __del__(self): 264 def __del__(self):
240 if (self.started == True): 265 if (self.started == True):
241 print('ERROR! Peer using cfg ' + self.cfg + ' was not stopped') 266 print('ERROR! Peer using cfg ' + self.cfg + ' was not stopped')
242 ret = self.stop () 267 ret = self.stop()
243 if (False == ret): 268 if (False == ret):
244 print('ERROR! Peer using cfg ' + self.cfg + ' could not be stopped') 269 print('ERROR! Peer using cfg ' + self.cfg + ' could not be stopped')
245 self.started = False 270 self.started = False
246 return ret 271 return ret
247 else: 272 else:
248 return False 273 return False
249 def start (self): 274
250 self.test.p ("Starting peer using cfg " + self.cfg) 275 def start(self):
276 self.test.p("Starting peer using cfg " + self.cfg)
251 try: 277 try:
252 server = subprocess.Popen ([self.test.gnunetarm, '-sq', '-c', self.cfg]) 278 server = subprocess.Popen([self.test.gnunetarm, '-sq', '-c', self.cfg])
253 server.communicate () 279 server.communicate()
254 except OSError: 280 except OSError:
255 print("Can not start peer") 281 print("Can not start peer")
256 self.started = False 282 self.started = False
257 return False 283 return False
258 self.started = True; 284 self.started = True
259 test = '' 285 test = ''
260 try: 286 try:
261 server = pexpect () 287 server = pexpect()
262 server.spawn (None, [self.test.gnunetpeerinfo, '-c', self.cfg ,'-s'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 288 server.spawn(None, [self.test.gnunetpeerinfo, '-c', self.cfg, '-s'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
263 test = server.read("stdout", 1024) 289 test = server.read("stdout", 1024)
264 except OSError: 290 except OSError:
265 print("Can not get peer identity") 291 print("Can not get peer identity")
266 test = (test.split('`')[1]) 292 test = (test.split('`')[1])
267 self.id = test.split('\'')[0] 293 self.id = test.split('\'')[0]
268 return True 294 return True
269 def stop (self): 295
296 def stop(self):
270 if (self.started == False): 297 if (self.started == False):
271 return False 298 return False
272 self.test.p ("Stopping peer using cfg " + self.cfg) 299 self.test.p("Stopping peer using cfg " + self.cfg)
273 try: 300 try:
274 server = subprocess.Popen ([self.test.gnunetarm, '-eq', '-c', self.cfg]) 301 server = subprocess.Popen([self.test.gnunetarm, '-eq', '-c', self.cfg])
275 server.communicate () 302 server.communicate()
276 except OSError: 303 except OSError:
277 print("Can not stop peer") 304 print("Can not stop peer")
278 return False 305 return False
279 self.started = False 306 self.started = False
280 return True; 307 return True
281 def get_statistics_value (self, subsystem, name): 308
282 server = pexpect () 309 def get_statistics_value(self, subsystem, name):
283 server.spawn (None, [self.test.gnunetstatistics, '-c', self.cfg ,'-q','-n', name, '-s', subsystem ], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 310 server = pexpect()
284 #server.expect ("stdout", re.compile (r"")) 311 server.spawn(None, [self.test.gnunetstatistics, '-c', self.cfg, '-q', '-n', name, '-s', subsystem], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
312 # server.expect ("stdout", re.compile (r""))
285 test = server.read("stdout", 10240) 313 test = server.read("stdout", 10240)
286 tests = test.partition('\n') 314 tests = test.partition('\n')
287 # On W32 GNUnet outputs with \r\n, rather than \n 315 # On W32 GNUnet outputs with \r\n, rather than \n
@@ -292,4 +320,3 @@ class Peer:
292 return tests 320 return tests
293 else: 321 else:
294 return -1 322 return -1
295
diff --git a/src/integration-tests/test_integration_bootstrap_and_connect.py.in b/src/integration-tests/test_integration_bootstrap_and_connect.py.in
index 01e36f81c..2a7768c6a 100755
--- a/src/integration-tests/test_integration_bootstrap_and_connect.py.in
+++ b/src/integration-tests/test_integration_bootstrap_and_connect.py.in
@@ -17,7 +17,7 @@
17# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 17# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18# Boston, MA 02110-1301, USA. 18# Boston, MA 02110-1301, USA.
19# 19#
20# 20#
21import signal 21import signal
22import sys 22import sys
23import os 23import os
@@ -29,177 +29,183 @@ from gnunet_testing import Peer
29from gnunet_testing import Test 29from gnunet_testing import Test
30from gnunet_testing import Check 30from gnunet_testing import Check
31from gnunet_testing import Condition 31from gnunet_testing import Condition
32from gnunet_testing import * 32from gnunet_testing import *
33 33
34 34
35# 35#
36# This test tests if a fresh peer bootstraps from a hostlist server and then 36# This test tests if a fresh peer bootstraps from a hostlist server and then
37# successfully connects to the server 37# successfully connects to the server
38# 38#
39# Conditions for successful exit: 39# Conditions for successful exit:
40# Both peers have 1 connected peer in transport, core, topology, fs 40# Both peers have 1 connected peer in transport, core, topology, fs
41 41
42# 42#
43# This test tests if a fresh peer bootstraps from a hostlist server and then 43# This test tests if a fresh peer bootstraps from a hostlist server and then
44# successfully connects to the server 44# successfully connects to the server
45# 45#
46# Conditions for successful exit: 46# Conditions for successful exit:
47# Both peers have 1 connected peer in transport, core, topology, fs 47# Both peers have 1 connected peer in transport, core, topology, fs
48 48
49#definitions 49# definitions
50 50
51testname = "test_integration_bootstrap_and_connect" 51testname = "test_integration_bootstrap_and_connect"
52verbose = False 52verbose = False
53check_timeout = 180 53check_timeout = 180
54 54
55if os.name == "nt": 55if os.name == "nt":
56 tmp = os.getenv ("TEMP") 56 tmp = os.getenv("TEMP")
57 signals = [signal.SIGTERM, signal.SIGINT] 57 signals = [signal.SIGTERM, signal.SIGINT]
58else: 58else:
59 tmp = "/tmp" 59 tmp = "/tmp"
60 signals = [signal.SIGTERM, signal.SIGINT, signal.SIGHUP, signal.SIGQUIT] 60 signals = [signal.SIGTERM, signal.SIGINT, signal.SIGHUP, signal.SIGQUIT]
61 61
62def cleanup_onerror (function, path, excinfo): 62
63 import stat 63def cleanup_onerror(function, path, excinfo):
64 if not os.path.exists (path): 64 import stat
65 pass 65 if not os.path.exists(path):
66 elif not os.access(path, os.W_OK): 66 pass
67 # Is the error an access error ? 67 elif not os.access(path, os.W_OK):
68 os.chmod (path, stat.S_IWUSR) 68 # Is the error an access error ?
69 function (path) 69 os.chmod(path, stat.S_IWUSR)
70 else: 70 function(path)
71 raise 71 else:
72 72 raise
73def cleanup (): 73
74
75def cleanup():
74 retries = 10 76 retries = 10
75 path = os.path.join (tmp, "c_bootstrap_server") 77 path = os.path.join(tmp, "c_bootstrap_server")
76 test.p ("Removing " + path) 78 test.p("Removing " + path)
77 while ((os.path.exists(path)) and (retries > 0)): 79 while ((os.path.exists(path)) and (retries > 0)):
78 shutil.rmtree ((path), False, cleanup_onerror) 80 shutil.rmtree((path), False, cleanup_onerror)
79 time.sleep (1) 81 time.sleep(1)
80 retries -= 1 82 retries -= 1
81 if (os.path.exists(path)): 83 if (os.path.exists(path)):
82 test.p ("Failed to remove " + path) 84 test.p("Failed to remove " + path)
83 85
84
85 retries = 10 86 retries = 10
86 path = os.path.join (tmp, "c_no_nat_client") 87 path = os.path.join(tmp, "c_no_nat_client")
87 test.p ("Removing " + path) 88 test.p("Removing " + path)
88 while ((os.path.exists(path)) and (retries > 0)): 89 while ((os.path.exists(path)) and (retries > 0)):
89 shutil.rmtree ((path), False, cleanup_onerror) 90 shutil.rmtree((path), False, cleanup_onerror)
90 time.sleep (1) 91 time.sleep(1)
91 retries -= 1 92 retries -= 1
92 if (os.path.exists(path)): 93 if (os.path.exists(path)):
93 test.p ("Failed to remove " + path) 94 test.p("Failed to remove " + path)
94 95
95def success_cont (check): 96
97def success_cont(check):
96 global success 98 global success
97 success = True; 99 success = True
98 print('Peers connected successfully') 100 print('Peers connected successfully')
99 101
100def fail_cont (check): 102
101 global success 103def fail_cont(check):
102 success = False; 104 global success
105 success = False
103 print('Peers did not connect') 106 print('Peers did not connect')
104 check.evaluate(True) 107 check.evaluate(True)
105 108
106def check (): 109
107 check = Check (test) 110def check():
108 check.add (StatisticsCondition (client, 'transport', '# peers connected',1)) 111 check = Check(test)
109 check.add (StatisticsCondition (client, 'core', '# peers connected',1)) 112 check.add(StatisticsCondition(client, 'transport', '# peers connected', 1))
110 check.add (StatisticsCondition (client, 'topology', '# peers connected',1)) 113 check.add(StatisticsCondition(client, 'core', '# peers connected', 1))
111 check.add (StatisticsCondition (client, 'dht', '# peers connected',1)) 114 check.add(StatisticsCondition(client, 'topology', '# peers connected', 1))
112 check.add (StatisticsCondition (client, 'fs', '# peers connected',1)) 115 check.add(StatisticsCondition(client, 'dht', '# peers connected', 1))
113 116 check.add(StatisticsCondition(client, 'fs', '# peers connected', 1))
114 check.add (StatisticsCondition (server, 'transport', '# peers connected',1)) 117
115 check.add (StatisticsCondition (server, 'core', '# peers connected',1)) 118 check.add(StatisticsCondition(server, 'transport', '# peers connected', 1))
116 check.add (StatisticsCondition (server, 'topology', '# peers connected',1)) 119 check.add(StatisticsCondition(server, 'core', '# peers connected', 1))
117 check.add (StatisticsCondition (server, 'dht', '# peers connected',1)) 120 check.add(StatisticsCondition(server, 'topology', '# peers connected', 1))
118 check.add (StatisticsCondition (server, 'fs', '# peers connected',1)) 121 check.add(StatisticsCondition(server, 'dht', '# peers connected', 1))
119 122 check.add(StatisticsCondition(server, 'fs', '# peers connected', 1))
120 check.run_blocking (check_timeout, success_cont, fail_cont) 123
121 124 check.run_blocking(check_timeout, success_cont, fail_cont)
122# 125
126#
123# Test execution 127# Test execution
124# 128#
125 129
126def SigHandler(signum = None, frame = None): 130
127 global success 131def SigHandler(signum=None, frame=None):
128 global server 132 global success
129 global client 133 global server
130 134 global client
131 print('Test was aborted!') 135
132 if (None != server): 136 print('Test was aborted!')
133 server.stop () 137 if (None != server):
134 if (None != client): 138 server.stop()
135 client.stop () 139 if (None != client):
136 cleanup () 140 client.stop()
137 sys.exit(success) 141 cleanup()
138 142 sys.exit(success)
139def run (): 143
140 global success 144
141 global test 145def run():
142 global server 146 global success
143 global client 147 global test
144 148 global server
145 server = None 149 global client
146 client = None 150
147 success = False 151 server = None
148 152 client = None
149 for sig in signals: 153 success = False
150 signal.signal(sig, SigHandler) 154
151 155 for sig in signals:
152 test = Test ('test_integration_bootstrap_and_connect.py', verbose) 156 signal.signal(sig, SigHandler)
153 cleanup () 157
154 158 test = Test('test_integration_bootstrap_and_connect.py', verbose)
155 server = Peer(test, './confs/c_bootstrap_server.conf'); 159 cleanup()
156 client = Peer(test, './confs/c_no_nat_client.conf'); 160
157 161 server = Peer(test, './confs/c_bootstrap_server.conf')
158 if (True != server.start()): 162 client = Peer(test, './confs/c_no_nat_client.conf')
159 print('Failed to start server') 163
160 if (None != server): 164 if (True != server.start()):
161 server.stop () 165 print('Failed to start server')
162 if (None != server): 166 if (None != server):
163 client.stop () 167 server.stop()
164 cleanup () 168 if (None != server):
165 sys.exit(success) 169 client.stop()
166 170 cleanup()
167 # Give the server time to start 171 sys.exit(success)
168 time.sleep(5) 172
169 173 # Give the server time to start
170 if (True != client.start()): 174 time.sleep(5)
171 print('Failed to start client') 175
172 if (None != server): 176 if (True != client.start()):
173 server.stop () 177 print('Failed to start client')
174 if (None != server): 178 if (None != server):
175 client.stop () 179 server.stop()
176 cleanup () 180 if (None != server):
177 sys.exit(success) 181 client.stop()
178 182 cleanup()
179 if ((client.started == True) and (server.started == True)): 183 sys.exit(success)
180 test.p ('Peers started, running check') 184
181 time.sleep(5) 185 if ((client.started == True) and (server.started == True)):
182 check () 186 test.p('Peers started, running check')
183 server.stop () 187 time.sleep(5)
184 client.stop () 188 check()
185 189 server.stop()
186 cleanup () 190 client.stop()
187 191
188 if (success == False): 192 cleanup()
189 print ('Test failed') 193
190 return False 194 if (success == False):
191 else: 195 print('Test failed')
192 return True 196 return False
197 else:
198 return True
199
193 200
194try: 201try:
195 run () 202 run()
196except (KeyboardInterrupt, SystemExit): 203except (KeyboardInterrupt, SystemExit):
197 print('Test interrupted') 204 print('Test interrupted')
198 server.stop () 205 server.stop()
199 client.stop () 206 client.stop()
200 cleanup () 207 cleanup()
201if (success == False): 208if (success == False):
202 sys.exit(1) 209 sys.exit(1)
203else: 210else:
204 sys.exit(0) 211 sys.exit(0)
205
diff --git a/src/integration-tests/test_integration_clique.py.in b/src/integration-tests/test_integration_clique.py.in
index f8b60f33d..b4c53da58 100755
--- a/src/integration-tests/test_integration_clique.py.in
+++ b/src/integration-tests/test_integration_clique.py.in
@@ -17,13 +17,13 @@
17# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 17# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18# Boston, MA 02110-1301, USA. 18# Boston, MA 02110-1301, USA.
19# 19#
20#
21# 20#
22# This test starts 3 peers (nated, server, no nat)and expects bootstrap 21#
22# This test starts 3 peers (nated, server, no nat)and expects bootstrap
23# and a connected clique 23# and a connected clique
24# 24#
25# Conditions for successful exit: 25# Conditions for successful exit:
26# Both peers have 2 connected peers in transport, core, topology, fs and dht 26# Both peers have 2 connected peers in transport, core, topology, fs and dht
27 27
28import sys 28import sys
29import signal 29import signal
@@ -36,192 +36,195 @@ from gnunet_testing import Peer
36from gnunet_testing import Test 36from gnunet_testing import Test
37from gnunet_testing import Check 37from gnunet_testing import Check
38from gnunet_testing import Condition 38from gnunet_testing import Condition
39from gnunet_testing import * 39from gnunet_testing import *
40 40
41if os.name == "nt": 41if os.name == "nt":
42 tmp = os.getenv ("TEMP") 42 tmp = os.getenv("TEMP")
43else: 43else:
44 tmp = "/tmp" 44 tmp = "/tmp"
45 45
46#definitions 46# definitions
47 47
48testname = "test_integration_clique" 48testname = "test_integration_clique"
49verbose = True 49verbose = True
50check_timeout = 180 50check_timeout = 180
51 51
52def cleanup_onerror (function, path, excinfo): 52
53 import stat 53def cleanup_onerror(function, path, excinfo):
54 if not os.path.exists (path): 54 import stat
55 pass 55 if not os.path.exists(path):
56 elif not os.access(path, os.W_OK): 56 pass
57 # Is the error an access error ? 57 elif not os.access(path, os.W_OK):
58 os.chmod (path, stat.S_IWUSR) 58 # Is the error an access error ?
59 function (path) 59 os.chmod(path, stat.S_IWUSR)
60 else: 60 function(path)
61 raise 61 else:
62 62 raise
63def cleanup (): 63
64
65def cleanup():
64 retries = 10 66 retries = 10
65 path = os.path.join (tmp, "c_bootstrap_server") 67 path = os.path.join(tmp, "c_bootstrap_server")
66 test.p ("Removing " + path) 68 test.p("Removing " + path)
67 while ((os.path.exists(path)) and (retries > 0)): 69 while ((os.path.exists(path)) and (retries > 0)):
68 shutil.rmtree ((path), False, cleanup_onerror) 70 shutil.rmtree((path), False, cleanup_onerror)
69 time.sleep (1) 71 time.sleep(1)
70 retries -= 1 72 retries -= 1
71 if (os.path.exists(path)): 73 if (os.path.exists(path)):
72 test.p ("Failed to remove " + path) 74 test.p("Failed to remove " + path)
73 retries = 10 75 retries = 10
74 path = os.path.join (tmp, "c_no_nat_client") 76 path = os.path.join(tmp, "c_no_nat_client")
75 test.p ("Removing " + path) 77 test.p("Removing " + path)
76 while ((os.path.exists(path)) and (retries > 0)): 78 while ((os.path.exists(path)) and (retries > 0)):
77 shutil.rmtree ((path), False, cleanup_onerror) 79 shutil.rmtree((path), False, cleanup_onerror)
78 time.sleep (1) 80 time.sleep(1)
79 retries -= 1 81 retries -= 1
80 if (os.path.exists(path)): 82 if (os.path.exists(path)):
81 test.p ("Failed to remove " + path) 83 test.p("Failed to remove " + path)
82 retries = 10 84 retries = 10
83 path = os.path.join (tmp, "c_nat_client") 85 path = os.path.join(tmp, "c_nat_client")
84 test.p ("Removing " + path) 86 test.p("Removing " + path)
85 while ((os.path.exists(path)) and (retries > 0)): 87 while ((os.path.exists(path)) and (retries > 0)):
86 shutil.rmtree ((path), False, cleanup_onerror) 88 shutil.rmtree((path), False, cleanup_onerror)
87 time.sleep (1) 89 time.sleep(1)
88 retries -= 1 90 retries -= 1
89 if (os.path.exists(path)): 91 if (os.path.exists(path)):
90 test.p ("Failed to remove " + path) 92 test.p("Failed to remove " + path)
91 93
92 94
93def success_cont (check): 95def success_cont(check):
94 global success 96 global success
95 success = True; 97 success = True
96 print('Connected clique successfully') 98 print('Connected clique successfully')
97 99
98def fail_cont (check): 100
99 global success 101def fail_cont(check):
100 success= False; 102 global success
103 success = False
101 check.evaluate(True) 104 check.evaluate(True)
102 print('Failed to connect clique') 105 print('Failed to connect clique')
103 106
104def check_connect (): 107
105 check = Check (test) 108def check_connect():
106 check.add (StatisticsCondition (client, 'transport', '# peers connected',2)) 109 check = Check(test)
107 check.add (StatisticsCondition (client, 'core', '# peers connected',2)) 110 check.add(StatisticsCondition(client, 'transport', '# peers connected', 2))
108 check.add (StatisticsCondition (client, 'topology', '# peers connected',2)) 111 check.add(StatisticsCondition(client, 'core', '# peers connected', 2))
109 check.add (StatisticsCondition (client, 'dht', '# peers connected',2)) 112 check.add(StatisticsCondition(client, 'topology', '# peers connected', 2))
110 check.add (StatisticsCondition (client, 'fs', '# peers connected',2)) 113 check.add(StatisticsCondition(client, 'dht', '# peers connected', 2))
111 114 check.add(StatisticsCondition(client, 'fs', '# peers connected', 2))
112 check.add (StatisticsCondition (client_nat, 'transport', '# peers connected',2)) 115
113 check.add (StatisticsCondition (client_nat, 'core', '# peers connected',2)) 116 check.add(StatisticsCondition(client_nat, 'transport', '# peers connected', 2))
114 check.add (StatisticsCondition (client_nat, 'topology', '# peers connected',2)) 117 check.add(StatisticsCondition(client_nat, 'core', '# peers connected', 2))
115 check.add (StatisticsCondition (client_nat, 'dht', '# peers connected',2)) 118 check.add(StatisticsCondition(client_nat, 'topology', '# peers connected', 2))
116 check.add (StatisticsCondition (client_nat, 'fs', '# peers connected',2)) 119 check.add(StatisticsCondition(client_nat, 'dht', '# peers connected', 2))
117 120 check.add(StatisticsCondition(client_nat, 'fs', '# peers connected', 2))
118 check.add (StatisticsCondition (server, 'transport', '# peers connected',2)) 121
119 check.add (StatisticsCondition (server, 'core', '# peers connected',2)) 122 check.add(StatisticsCondition(server, 'transport', '# peers connected', 2))
120 check.add (StatisticsCondition (server, 'topology', '# peers connected',2)) 123 check.add(StatisticsCondition(server, 'core', '# peers connected', 2))
121 check.add (StatisticsCondition (server, 'dht', '# peers connected',2)) 124 check.add(StatisticsCondition(server, 'topology', '# peers connected', 2))
122 check.add (StatisticsCondition (server, 'fs', '# peers connected',2)) 125 check.add(StatisticsCondition(server, 'dht', '# peers connected', 2))
123 126 check.add(StatisticsCondition(server, 'fs', '# peers connected', 2))
124 check.run_blocking (check_timeout, success_cont, fail_cont) 127
125 128 check.run_blocking(check_timeout, success_cont, fail_cont)
126# 129
130#
127# Test execution 131# Test execution
128# 132#
129 133
130def SigHandler(signum = None, frame = None): 134
131 global success 135def SigHandler(signum=None, frame=None):
132 global server 136 global success
133 global client 137 global server
134 global client_nat 138 global client
135 139 global client_nat
136 print('Test was aborted!') 140
137 if (None != server): 141 print('Test was aborted!')
138 server.stop () 142 if (None != server):
139 if (None != client): 143 server.stop()
140 client.stop () 144 if (None != client):
141 if (None != client_nat): 145 client.stop()
142 client_nat.stop () 146 if (None != client_nat):
143 cleanup () 147 client_nat.stop()
144 sys.exit(success) 148 cleanup()
145 149 sys.exit(success)
146def run (): 150
147 global success 151
148 global test 152def run():
149 global server 153 global success
150 global client 154 global test
151 global client_nat 155 global server
152 156 global client
153 success = False 157 global client_nat
154 server = None 158
155 client = None 159 success = False
156 client_nat = None 160 server = None
157 test = Test ('test_integration_clique', verbose) 161 client = None
158 cleanup () 162 client_nat = None
159 163 test = Test('test_integration_clique', verbose)
160 server = Peer(test, './confs/c_bootstrap_server.conf'); 164 cleanup()
161 if (True != server.start()): 165
162 print('Failed to start server') 166 server = Peer(test, './confs/c_bootstrap_server.conf')
163 if (None != server): 167 if (True != server.start()):
164 server.stop () 168 print('Failed to start server')
165 cleanup () 169 if (None != server):
166 sys.exit(success) 170 server.stop()
167 171 cleanup()
168 # Server has to settle down 172 sys.exit(success)
169 time.sleep(5) 173
170 174 # Server has to settle down
171 client = Peer(test, './confs/c_no_nat_client.conf'); 175 time.sleep(5)
172 if (True != client.start()): 176
173 print('Failed to start client') 177 client = Peer(test, './confs/c_no_nat_client.conf')
174 if (None != server): 178 if (True != client.start()):
175 server.stop () 179 print('Failed to start client')
176 if (None != client): 180 if (None != server):
177 client.stop () 181 server.stop()
178 cleanup () 182 if (None != client):
179 sys.exit(success) 183 client.stop()
180 184 cleanup()
181 # Server has to settle down 185 sys.exit(success)
182 time.sleep(5) 186
183 187 # Server has to settle down
184 188 time.sleep(5)
185 client_nat = Peer(test, './confs/c_nat_client.conf'); 189
186 if (True != client_nat.start()): 190 client_nat = Peer(test, './confs/c_nat_client.conf')
187 print('Failed to start client_nat') 191 if (True != client_nat.start()):
188 if (None != server): 192 print('Failed to start client_nat')
189 server.stop () 193 if (None != server):
190 if (None != client): 194 server.stop()
191 client.stop () 195 if (None != client):
192 if (None != client_nat): 196 client.stop()
193 client_nat.stop () 197 if (None != client_nat):
194 cleanup () 198 client_nat.stop()
195 sys.exit(success) 199 cleanup()
196 200 sys.exit(success)
197 if ((client.started == True) and (client_nat.started == True) and (server.started == True)): 201
198 test.p ('Peers started, running check') 202 if ((client.started == True) and (client_nat.started == True) and (server.started == True)):
199 check_connect () 203 test.p('Peers started, running check')
200 204 check_connect()
201 server.stop () 205
202 client.stop () 206 server.stop()
203 client_nat.stop () 207 client.stop()
204 208 client_nat.stop()
205 cleanup () 209
206 210 cleanup()
207 if (success == False): 211
208 print ('Test failed') 212 if (success == False):
209 return False 213 print('Test failed')
210 else: 214 return False
211 return True 215 else:
212 216 return True
213 217
218
214try: 219try:
215 run () 220 run()
216except (KeyboardInterrupt, SystemExit): 221except (KeyboardInterrupt, SystemExit):
217 print('Test interrupted') 222 print('Test interrupted')
218 server.stop () 223 server.stop()
219 client.stop () 224 client.stop()
220 client_nat.stop () 225 client_nat.stop()
221 cleanup () 226 cleanup()
222if (success == False): 227if (success == False):
223 sys.exit(1) 228 sys.exit(1)
224else: 229else:
225 sys.exit(0) 230 sys.exit(0)
226
227
diff --git a/src/integration-tests/test_integration_disconnect_nat.py.in b/src/integration-tests/test_integration_disconnect_nat.py.in
index 611255a09..12c268bd6 100755
--- a/src/integration-tests/test_integration_disconnect_nat.py.in
+++ b/src/integration-tests/test_integration_disconnect_nat.py.in
@@ -17,7 +17,7 @@
17# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 17# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18# Boston, MA 02110-1301, USA. 18# Boston, MA 02110-1301, USA.
19# 19#
20# 20#
21import sys 21import sys
22import signal 22import signal
23import os 23import os
@@ -29,8 +29,8 @@ from gnunet_testing import Peer
29from gnunet_testing import Test 29from gnunet_testing import Test
30from gnunet_testing import Check 30from gnunet_testing import Check
31from gnunet_testing import Condition 31from gnunet_testing import Condition
32from gnunet_testing import * 32from gnunet_testing import *
33 33
34 34
35# 35#
36# This test tests if a fresh peer bootstraps from a hostlist server and then 36# This test tests if a fresh peer bootstraps from a hostlist server and then
@@ -40,173 +40,175 @@ from gnunet_testing import *
40# Conditions for successful exit: 40# Conditions for successful exit:
41# Client peer has 0 connected peer in transport, core, topology, dht, fs 41# Client peer has 0 connected peer in transport, core, topology, dht, fs
42 42
43#definitions 43# definitions
44 44
45testname = "test_integration_disconnect" 45testname = "test_integration_disconnect"
46verbose = True 46verbose = True
47check_timeout = 180 47check_timeout = 180
48 48
49if os.name == "nt": 49if os.name == "nt":
50 tmp = os.getenv ("TEMP") 50 tmp = os.getenv("TEMP")
51 signals = [signal.SIGTERM, signal.SIGINT] 51 signals = [signal.SIGTERM, signal.SIGINT]
52else: 52else:
53 tmp = "/tmp" 53 tmp = "/tmp"
54 signals = [signal.SIGTERM, signal.SIGINT, signal.SIGHUP, signal.SIGQUIT] 54 signals = [signal.SIGTERM, signal.SIGINT, signal.SIGHUP, signal.SIGQUIT]
55 55
56def cleanup_onerror (function, path, excinfo): 56
57 import stat 57def cleanup_onerror(function, path, excinfo):
58 if not os.path.exists (path): 58 import stat
59 pass 59 if not os.path.exists(path):
60 elif not os.access(path, os.W_OK): 60 pass
61 # Is the error an access error ? 61 elif not os.access(path, os.W_OK):
62 os.chmod (path, stat.S_IWUSR) 62 # Is the error an access error ?
63 function (path) 63 os.chmod(path, stat.S_IWUSR)
64 else: 64 function(path)
65 raise 65 else:
66 66 raise
67def cleanup (): 67
68 shutil.rmtree (os.path.join (tmp, "c_bootstrap_server"), False, cleanup_onerror) 68
69 shutil.rmtree (os.path.join (tmp, "c_nat_client"), False, cleanup_onerror) 69def cleanup():
70 70 shutil.rmtree(os.path.join(tmp, "c_bootstrap_server"), False, cleanup_onerror)
71 71 shutil.rmtree(os.path.join(tmp, "c_nat_client"), False, cleanup_onerror)
72def success_disconnect_cont (check): 72
73 print('Peers disconnected successfully') 73
74 global success 74def success_disconnect_cont(check):
75 success = True; 75 print('Peers disconnected successfully')
76 76 global success
77 77 success = True
78def fail_disconnect_cont (check): 78
79 global success 79
80 success = False; 80def fail_disconnect_cont(check):
81 print('Peers failed to disconnect') 81 global success
82 check.evaluate(True) 82 success = False;
83 83 print('Peers failed to disconnect')
84def check_disconnect (): 84 check.evaluate(True)
85 global server 85
86 global nat_client 86
87 test.p ('Shutting down nat client') 87def check_disconnect():
88 nat_client.stop () 88 global server
89 check = Check (test) 89 global nat_client
90 check.add (StatisticsCondition (server, 'transport', '# peers connected',0)) 90 test.p('Shutting down nat client')
91 check.add (StatisticsCondition (server, 'core', '# peers connected',0)) 91 nat_client.stop()
92 check.add (StatisticsCondition (server, 'topology', '# peers connected',0)) 92 check = Check(test)
93 check.add (StatisticsCondition (server, 'dht', '# peers connected',0)) 93 check.add(StatisticsCondition(server, 'transport', '# peers connected', 0))
94 check.add (StatisticsCondition (server, 'fs', '# peers connected',0)) 94 check.add(StatisticsCondition(server, 'core', '# peers connected', 0))
95 check.run_blocking (check_timeout, success_disconnect_cont, fail_disconnect_cont) 95 check.add(StatisticsCondition(server, 'topology', '# peers connected', 0))
96 96 check.add(StatisticsCondition(server, 'dht', '# peers connected', 0))
97 97 check.add(StatisticsCondition(server, 'fs', '# peers connected', 0))
98def success_connect_cont (check): 98 check.run_blocking(check_timeout, success_disconnect_cont, fail_disconnect_cont)
99 print('Peers connected successfully') 99
100 check_disconnect () 100
101 101def success_connect_cont(check):
102 102 print('Peers connected successfully')
103def fail_connect_cont (check): 103 check_disconnect()
104 global success 104
105 success= False 105
106 print('Peers failed to connected!') 106def fail_connect_cont(check):
107 check.evaluate(True) 107 global success
108 108 success = False
109 109 print('Peers failed to connected!')
110def check_connect (): 110 check.evaluate(True)
111 global server 111
112 global nat_client 112
113 check = Check (test) 113def check_connect():
114 check.add (StatisticsCondition (nat_client, 'transport', '# peers connected',1)) 114 global server
115 check.add (StatisticsCondition (nat_client, 'core', '# peers connected',1)) 115 global nat_client
116 check.add (StatisticsCondition (nat_client, 'topology', '# peers connected',1)) 116 check = Check(test)
117 check.add (StatisticsCondition (nat_client, 'dht', '# peers connected',1)) 117 check.add(StatisticsCondition(nat_client, 'transport', '# peers connected', 1))
118 check.add (StatisticsCondition (nat_client, 'fs', '# peers connected',1)) 118 check.add(StatisticsCondition(nat_client, 'core', '# peers connected', 1))
119 119 check.add(StatisticsCondition(nat_client, 'topology', '# peers connected', 1))
120 check.add (StatisticsCondition (server, 'transport', '# peers connected',1)) 120 check.add(StatisticsCondition(nat_client, 'dht', '# peers connected', 1))
121 check.add (StatisticsCondition (server, 'core', '# peers connected',1)) 121 check.add(StatisticsCondition(nat_client, 'fs', '# peers connected', 1))
122 check.add (StatisticsCondition (server, 'topology', '# peers connected',1)) 122
123 check.add (StatisticsCondition (server, 'dht', '# peers connected',1)) 123 check.add(StatisticsCondition(server, 'transport', '# peers connected', 1))
124 check.add (StatisticsCondition (server, 'fs', '# peers connected',1)) 124 check.add(StatisticsCondition(server, 'core', '# peers connected', 1))
125 125 check.add(StatisticsCondition(server, 'topology', '# peers connected', 1))
126 check.run_blocking (check_timeout, success_connect_cont, fail_connect_cont) 126 check.add(StatisticsCondition(server, 'dht', '# peers connected', 1))
127 127 check.add(StatisticsCondition(server, 'fs', '# peers connected', 1))
128# 128
129 check.run_blocking(check_timeout, success_connect_cont, fail_connect_cont)
130
131
132#
129# Test execution 133# Test execution
130# 134#
131 135
132def SigHandler(signum = None, frame = None): 136def SigHandler(signum=None, frame=None):
133 global success 137 global success
134 global server 138 global server
135 global nat_client 139 global nat_client
136 140
137 print('Test was aborted!') 141 print('Test was aborted!')
138 if (None != server): 142 if (None != server):
139 server.stop () 143 server.stop()
140 if (None != nat_client): 144 if (None != nat_client):
141 nat_client.stop () 145 nat_client.stop()
142 cleanup () 146 cleanup()
143 sys.exit(success) 147 sys.exit(success)
144 148
145def run (): 149
146 global success 150def run():
147 global test 151 global success
148 global server 152 global test
149 global nat_client 153 global server
150 154 global nat_client
151 server = None 155
152 nat_client = None 156 server = None
153 success = False 157 nat_client = None
154 158 success = False
155 for sig in signals: 159
156 signal.signal(sig, SigHandler) 160 for sig in signals:
157 161 signal.signal(sig, SigHandler)
158 test = Test ('test_integration_bootstrap_and_connect.py', verbose) 162
159 cleanup () 163 test = Test('test_integration_bootstrap_and_connect.py', verbose)
160 164 cleanup()
161 server = Peer(test, './confs/c_bootstrap_server.conf'); 165
162 nat_client = Peer(test, './confs/c_nat_client.conf'); 166 server = Peer(test, './confs/c_bootstrap_server.conf')
163 167 nat_client = Peer(test, './confs/c_nat_client.conf')
164 if (True != server.start()): 168
165 print('Failed to start server') 169 if (True != server.start()):
166 if (None != server): 170 print('Failed to start server')
167 server.stop () 171 if (None != server):
168 cleanup () 172 server.stop()
169 sys.exit(success) 173 cleanup()
170 174 sys.exit(success)
171 # Give the server time to start 175
172 time.sleep(5) 176 # Give the server time to start
173 177 time.sleep(5)
174 if (True != nat_client.start()): 178
175 print('Failed to start nat_client') 179 if (True != nat_client.start()):
176 if (None != server): 180 print('Failed to start nat_client')
177 server.stop () 181 if (None != server):
178 if (None != nat_client): 182 server.stop()
179 nat_client.stop () 183 if (None != nat_client):
180 cleanup () 184 nat_client.stop()
181 sys.exit(success) 185 cleanup()
182 186 sys.exit(success)
183 if ((nat_client.started == True) and (server.started == True)): 187
184 test.p ('Peers started, running check') 188 if ((nat_client.started == True) and (server.started == True)):
185 time.sleep(5) 189 test.p('Peers started, running check')
186 check_connect () 190 time.sleep(5)
187 server.stop () 191 check_connect()
188 nat_client.stop () 192 server.stop()
189 193 nat_client.stop()
190 cleanup () 194
191 195 cleanup()
192 if (success == False): 196
193 print ('Test failed') 197 if (success == False):
194 return False 198 print('Test failed')
195 else: 199 return False
196 return True 200 else:
201 return True
202
197 203
198try: 204try:
199 run () 205 run()
200except (KeyboardInterrupt, SystemExit): 206except(KeyboardInterrupt, SystemExit):
201 print('Test interrupted') 207 print('Test interrupted')
202 server.stop () 208 server.stop()
203 nat_client.stop () 209 nat_client.stop()
204 cleanup () 210 cleanup()
205if (success == False): 211if (success == False):
206 sys.exit(1) 212 sys.exit(1)
207else: 213else:
208 sys.exit(0) 214 sys.exit(0)
209
210
211
212
diff --git a/src/integration-tests/test_integration_reconnect_nat.py.in b/src/integration-tests/test_integration_reconnect_nat.py.in
index 78c75c335..81cff7833 100755
--- a/src/integration-tests/test_integration_reconnect_nat.py.in
+++ b/src/integration-tests/test_integration_reconnect_nat.py.in
@@ -17,7 +17,7 @@
17# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 17# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18# Boston, MA 02110-1301, USA. 18# Boston, MA 02110-1301, USA.
19# 19#
20# 20#
21import sys 21import sys
22import os 22import os
23import subprocess 23import subprocess
@@ -29,18 +29,18 @@ from gnunet_testing import Peer
29from gnunet_testing import Test 29from gnunet_testing import Test
30from gnunet_testing import Check 30from gnunet_testing import Check
31from gnunet_testing import Condition 31from gnunet_testing import Condition
32from gnunet_testing import * 32from gnunet_testing import *
33 33
34 34
35# 35#
36# This test tests if a fresh peer bootstraps from a hostlist server and then 36# This test tests if a fresh peer bootstraps from a hostlist server and then
37# successfully connects to the server. When both peers are connected 37# successfully connects to the server. When both peers are connected
38# in transport, core, topology, fs, botth peers are shutdown and restarted 38# in transport, core, topology, fs, botth peers are shutdown and restarted
39# 39#
40# Conditions for successful exit: 40# Conditions for successful exit:
41# Both peers have 1 connected peer in transport, core, topology, fs after restart 41# Both peers have 1 connected peer in transport, core, topology, fs after restart
42 42
43#definitions 43# definitions
44 44
45 45
46testname = "test_integration_restart" 46testname = "test_integration_restart"
@@ -48,191 +48,190 @@ verbose = True
48check_timeout = 180 48check_timeout = 180
49 49
50if os.name == "nt": 50if os.name == "nt":
51 tmp = os.getenv ("TEMP") 51 tmp = os.getenv("TEMP")
52 signals = [signal.SIGTERM, signal.SIGINT] 52 signals = [signal.SIGTERM, signal.SIGINT]
53else: 53else:
54 tmp = "/tmp" 54 tmp = "/tmp"
55 signals = [signal.SIGTERM, signal.SIGINT, signal.SIGHUP, signal.SIGQUIT] 55 signals = [signal.SIGTERM, signal.SIGINT, signal.SIGHUP, signal.SIGQUIT]
56 56
57def cleanup_onerror (function, path, excinfo): 57
58 import stat 58def cleanup_onerror(function, path, excinfo):
59 if not os.path.exists (path): 59 import stat
60 pass 60 if not os.path.exists(path):
61 elif not os.access(path, os.W_OK): 61 pass
62 # Is the error an access error ? 62 elif not os.access(path, os.W_OK):
63 os.chmod (path, stat.S_IWUSR) 63 # Is the error an access error ?
64 function (path) 64 os.chmod(path, stat.S_IWUSR)
65 else: 65 function(path)
66 raise 66 else:
67 67 raise
68def cleanup (): 68
69
70def cleanup():
69 retries = 10 71 retries = 10
70 path = os.path.join (tmp, "c_bootstrap_server") 72 path = os.path.join(tmp, "c_bootstrap_server")
71 test.p ("Removing " + path) 73 test.p("Removing " + path)
72 while ((os.path.exists(path)) and (retries > 0)): 74 while ((os.path.exists(path)) and (retries > 0)):
73 shutil.rmtree ((path), False, cleanup_onerror) 75 shutil.rmtree((path), False, cleanup_onerror)
74 time.sleep (1) 76 time.sleep(1)
75 retries -= 1 77 retries -= 1
76 if (os.path.exists(path)): 78 if (os.path.exists(path)):
77 test.p ("Failed to remove " + path) 79 test.p("Failed to remove " + path)
78 80
79
80 retries = 10 81 retries = 10
81 path = os.path.join (tmp, "c_nat_client") 82 path = os.path.join(tmp, "c_nat_client")
82 test.p ("Removing " + path) 83 test.p("Removing " + path)
83 while ((os.path.exists(path)) and (retries > 0)): 84 while((os.path.exists(path)) and(retries > 0)):
84 shutil.rmtree ((path), False, cleanup_onerror) 85 shutil.rmtree((path), False, cleanup_onerror)
85 time.sleep (1) 86 time.sleep(1)
86 retries -= 1 87 retries -= 1
87 if (os.path.exists(path)): 88 if (os.path.exists(path)):
88 test.p ("Failed to remove " + path) 89 test.p("Failed to remove " + path)
89 90
90def success_restart_cont (check): 91
91 global success 92def success_restart_cont(check):
92 print('Peers connected successfully after restart') 93 global success
93 server.stop () 94 print('Peers connected successfully after restart')
94 client.stop () 95 server.stop()
95 success = True; 96 client.stop()
96 97 success = True
97 98
98def fail_restart_cont (check): 99
99 global success 100def fail_restart_cont(check):
100 success = False; 101 global success
101 print('Peers failed to connect after restart') 102 success = False
102 check.evaluate(True) 103 print('Peers failed to connect after restart')
103 104 check.evaluate(True)
104 105
105def success_connect_cont (check): 106
106 print('Peers connected successfully') 107def success_connect_cont(check):
107 server.stop () 108 print('Peers connected successfully')
108 client.stop () 109 server.stop()
109 110 client.stop()
110 time.sleep(5) 111
111 112 time.sleep(5)
112 test.p ('Restarting client & server') 113
113 server.start () 114 test.p('Restarting client & server')
114 client.start () 115 server.start()
115 116 client.start()
116 check = Check (test) 117
117 check.add (StatisticsCondition (client, 'transport', '# peers connected',1)) 118 check = Check(test)
118 check.add (StatisticsCondition (client, 'core', '# peers connected',1)) 119 check.add(StatisticsCondition(client, 'transport', '# peers connected', 1))
119 check.add (StatisticsCondition (client, 'topology', '# peers connected',1)) 120 check.add(StatisticsCondition(client, 'core', '# peers connected', 1))
120 check.add (StatisticsCondition (client, 'fs', '# peers connected',1)) 121 check.add(StatisticsCondition(client, 'topology', '# peers connected', 1))
121 122 check.add(StatisticsCondition(client, 'fs', '# peers connected', 1))
122 check.add (StatisticsCondition (server, 'transport', '# peers connected',1)) 123
123 check.add (StatisticsCondition (server, 'core', '# peers connected',1)) 124 check.add(StatisticsCondition(server, 'transport', '# peers connected', 1))
124 check.add (StatisticsCondition (server, 'topology', '# peers connected',1)) 125 check.add(StatisticsCondition(server, 'core', '# peers connected', 1))
125 check.add (StatisticsCondition (server, 'fs', '# peers connected',1)) 126 check.add(StatisticsCondition(server, 'topology', '# peers connected', 1))
126 127 check.add(StatisticsCondition(server, 'fs', '# peers connected', 1))
127 check.run_blocking (check_timeout, success_restart_cont, fail_restart_cont) 128
128 129 check.run_blocking(check_timeout, success_restart_cont, fail_restart_cont)
129 130
130def fail_connect_cont (check): 131
131 global success 132def fail_connect_cont(check):
132 success= False; 133 global success
133 print('Peers failed to connect') 134 success = False
134 check.evaluate(True) 135 print('Peers failed to connect')
135 136 check.evaluate(True)
136 137
137def check_connect (): 138
138 check = Check (test) 139def check_connect():
139 check.add (StatisticsCondition (client, 'transport', '# peers connected',1)) 140 check = Check(test)
140 check.add (StatisticsCondition (client, 'core', '# peers connected',1)) 141 check.add(StatisticsCondition(client, 'transport', '# peers connected', 1))
141 check.add (StatisticsCondition (client, 'topology', '# peers connected',1)) 142 check.add(StatisticsCondition(client, 'core', '# peers connected', 1))
142 check.add (StatisticsCondition (client, 'fs', '# peers connected',1)) 143 check.add(StatisticsCondition(client, 'topology', '# peers connected', 1))
143 144 check.add(StatisticsCondition(client, 'fs', '# peers connected', 1))
144 check.add (StatisticsCondition (server, 'transport', '# peers connected',1)) 145
145 check.add (StatisticsCondition (server, 'core', '# peers connected',1)) 146 check.add(StatisticsCondition(server, 'transport', '# peers connected', 1))
146 check.add (StatisticsCondition (server, 'topology', '# peers connected',1)) 147 check.add(StatisticsCondition(server, 'core', '# peers connected', 1))
147 check.add (StatisticsCondition (server, 'fs', '# peers connected',1)) 148 check.add(StatisticsCondition(server, 'topology', '# peers connected', 1))
148 149 check.add(StatisticsCondition(server, 'fs', '# peers connected', 1))
149 check.run_blocking (check_timeout, success_connect_cont, fail_connect_cont) 150
150 151 check.run_blocking(check_timeout, success_connect_cont, fail_connect_cont)
151# 152
153#
152# Test execution 154# Test execution
153# 155#
154 156
155 157
156def SigHandler(signum = None, frame = None): 158def SigHandler(signum=None, frame=None):
157 global success 159 global success
158 global server 160 global server
159 global client 161 global client
160 162
161 print('Test was aborted!') 163 print('Test was aborted!')
162 if (None != server): 164 if (None != server):
163 server.stop () 165 server.stop()
164 if (None != client): 166 if (None != client):
165 client.stop () 167 client.stop()
166 cleanup () 168 cleanup()
167 sys.exit(success) 169 sys.exit(success)
168 170
169def run (): 171
170 global success 172def run():
171 global test 173 global success
172 global server 174 global test
173 global client 175 global server
174 176 global client
175 success = False 177
176 server = None 178 success = False
177 client = None 179 server = None
178 180 client = None
179 for sig in signals: 181
180 signal.signal(sig, SigHandler) 182 for sig in signals:
181 183 signal.signal(sig, SigHandler)
182 184
183 test = Test ('test_integration_disconnect', verbose) 185 test = Test('test_integration_disconnect', verbose)
184 cleanup () 186 cleanup()
185 server = Peer(test, './confs/c_bootstrap_server.conf'); 187 server = Peer(test, './confs/c_bootstrap_server.conf')
186 server.start(); 188 server.start()
187 189
188 client = Peer(test, './confs/c_nat_client.conf'); 190 client = Peer(test, './confs/c_nat_client.conf')
189 client.start(); 191 client.start()
190 192
191 193 if (True != server.start()):
192 if (True != server.start()): 194 print('Failed to start server')
193 print('Failed to start server') 195 if (None != server):
194 if (None != server): 196 server.stop()
195 server.stop () 197 if (None != server):
196 if (None != server): 198 client.stop()
197 client.stop () 199 cleanup()
198 cleanup () 200 sys.exit(success)
199 sys.exit(success) 201
200 202 # Give the server time to start
201 # Give the server time to start 203 time.sleep(5)
202 time.sleep(5) 204
203 205 if (True != client.start()):
204 if (True != client.start()): 206 print('Failed to start client')
205 print('Failed to start client') 207 if (None != server):
206 if (None != server): 208 server.stop()
207 server.stop () 209 if (None != server):
208 if (None != server): 210 client.stop()
209 client.stop () 211 cleanup()
210 cleanup () 212 sys.exit(success)
211 sys.exit(success) 213
212 214 check_connect()
213 check_connect () 215
214 216 server.stop()
215 server.stop () 217 client.stop()
216 client.stop () 218 cleanup()
217 cleanup () 219
218 220 if (success == False):
219 if (success == False): 221 print('Test failed')
220 print ('Test failed') 222 return True
221 return True 223 else:
222 else: 224 return False
223 return False 225
224 226
225
226try: 227try:
227 run () 228 run()
228except (KeyboardInterrupt, SystemExit): 229except(KeyboardInterrupt, SystemExit):
229 print('Test interrupted') 230 print('Test interrupted')
230 server.stop () 231 server.stop()
231 client.stop () 232 client.stop()
232 cleanup () 233 cleanup()
233if (success == False): 234if (success == False):
234 sys.exit(1) 235 sys.exit(1)
235else: 236else:
236 sys.exit(0) 237 sys.exit(0)
237
238
diff --git a/src/namestore/gnunet-namestore.c b/src/namestore/gnunet-namestore.c
index 753ee79d1..83a7ee349 100644
--- a/src/namestore/gnunet-namestore.c
+++ b/src/namestore/gnunet-namestore.c
@@ -641,14 +641,6 @@ get_existing_record (void *cls,
641 ret = 1; 641 ret = 1;
642 test_finished (); 642 test_finished ();
643 return; 643 return;
644 case GNUNET_GNSRECORD_TYPE_GNS2DNS:
645 fprintf (stderr,
646 _("A %s record exists already under `%s', no other records can be added.\n"),
647 "GNS2DNS",
648 rec_name);
649 ret = 1;
650 test_finished ();
651 return;
652 } 644 }
653 } 645 }
654 switch (type) 646 switch (type)
@@ -678,16 +670,16 @@ get_existing_record (void *cls,
678 } 670 }
679 break; 671 break;
680 case GNUNET_GNSRECORD_TYPE_GNS2DNS: 672 case GNUNET_GNSRECORD_TYPE_GNS2DNS:
681 if (0 != rd_count) 673 for (unsigned int i=0;i<rd_count;i++)
682 { 674 if (GNUNET_GNSRECORD_TYPE_GNS2DNS != rd[i].record_type)
683 fprintf (stderr, 675 {
684 _("Records already exist under `%s', cannot add `%s' record.\n"), 676 fprintf (stderr,
685 rec_name, 677 _("Non-GNS2DNS records already exist under `%s', cannot add GNS2DNS record.\n"),
686 "GNS2DNS"); 678 rec_name);
687 ret = 1; 679 ret = 1;
688 test_finished (); 680 test_finished ();
689 return; 681 return;
690 } 682 }
691 break; 683 break;
692 } 684 }
693 memset (rdn, 685 memset (rdn,
diff --git a/src/namestore/gnunet-service-namestore.c b/src/namestore/gnunet-service-namestore.c
index 8e88558de..2044010df 100644
--- a/src/namestore/gnunet-service-namestore.c
+++ b/src/namestore/gnunet-service-namestore.c
@@ -278,12 +278,6 @@ struct StoreActivity
278 const struct RecordStoreMessage *rsm; 278 const struct RecordStoreMessage *rsm;
279 279
280 /** 280 /**
281 * Array of record data to store (without NICK unless this is about
282 * #GNUNET_GNS_EMPTY_LABEL_AT). Length is in @e rd_count.
283 */
284 struct GNUNET_GNSRECORD_Data *rd;
285
286 /**
287 * Next zone monitor that still needs to be notified about this PUT. 281 * Next zone monitor that still needs to be notified about this PUT.
288 */ 282 */
289 struct ZoneMonitor *zm_pos; 283 struct ZoneMonitor *zm_pos;
@@ -293,11 +287,6 @@ struct StoreActivity
293 */ 287 */
294 char *conv_name; 288 char *conv_name;
295 289
296 /**
297 * How many records do we try to store?
298 */
299 unsigned int rd_count;
300
301}; 290};
302 291
303 292
@@ -436,9 +425,6 @@ free_store_activity (struct StoreActivity *sa)
436 GNUNET_CONTAINER_DLL_remove (sa_head, 425 GNUNET_CONTAINER_DLL_remove (sa_head,
437 sa_tail, 426 sa_tail,
438 sa); 427 sa);
439 GNUNET_array_grow (sa->rd,
440 sa->rd_count,
441 0);
442 GNUNET_free (sa->conv_name); 428 GNUNET_free (sa->conv_name);
443 GNUNET_free (sa); 429 GNUNET_free (sa);
444} 430}
@@ -551,6 +537,7 @@ merge_with_nick_records (const struct GNUNET_GNSRECORD_Data *nick_rd,
551 size_t req; 537 size_t req;
552 char *data; 538 char *data;
553 size_t data_offset; 539 size_t data_offset;
540 struct GNUNET_GNSRECORD_Data *target;
554 541
555 (*rdc_res) = 1 + rd2_length; 542 (*rdc_res) = 1 + rd2_length;
556 if (0 == 1 + rd2_length) 543 if (0 == 1 + rd2_length)
@@ -560,38 +547,52 @@ merge_with_nick_records (const struct GNUNET_GNSRECORD_Data *nick_rd,
560 return; 547 return;
561 } 548 }
562 req = sizeof (struct GNUNET_GNSRECORD_Data) + nick_rd->data_size; 549 req = sizeof (struct GNUNET_GNSRECORD_Data) + nick_rd->data_size;
563 for (unsigned int c=0; c< rd2_length; c++) 550 for (unsigned int i=0; i<rd2_length; i++)
564 req += sizeof (struct GNUNET_GNSRECORD_Data) + rd2[c].data_size; 551 {
565 (*rd_res) = GNUNET_malloc (req); 552 const struct GNUNET_GNSRECORD_Data *orig = &rd2[i];
566 data = (char *) &(*rd_res)[1 + rd2_length]; 553
554 if (req + sizeof (struct GNUNET_GNSRECORD_Data) + orig->data_size < req)
555 {
556 GNUNET_break (0);
557 (*rd_res) = NULL;
558 return;
559 }
560 req += sizeof (struct GNUNET_GNSRECORD_Data) + orig->data_size;
561 }
562 target = GNUNET_malloc (req);
563 (*rd_res) = target;
564 data = (char *) &target[1 + rd2_length];
567 data_offset = 0; 565 data_offset = 0;
568 latest_expiration = 0; 566 latest_expiration = 0;
569 for (unsigned int c=0; c< rd2_length; c++) 567 for (unsigned int i=0;i<rd2_length;i++)
570 { 568 {
571 if (0 != (rd2[c].flags & GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION)) 569 const struct GNUNET_GNSRECORD_Data *orig = &rd2[i];
570
571 if (0 != (orig->flags & GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION))
572 { 572 {
573 if ((GNUNET_TIME_absolute_get().abs_value_us + rd2[c].expiration_time) > 573 if ((GNUNET_TIME_absolute_get().abs_value_us + orig->expiration_time) >
574 latest_expiration) 574 latest_expiration)
575 latest_expiration = rd2[c].expiration_time; 575 latest_expiration = orig->expiration_time;
576 } 576 }
577 else if (rd2[c].expiration_time > latest_expiration) 577 else if (orig->expiration_time > latest_expiration)
578 latest_expiration = rd2[c].expiration_time; 578 latest_expiration = orig->expiration_time;
579 (*rd_res)[c] = rd2[c]; 579 target[i] = *orig;
580 (*rd_res)[c].data = (void *) &data[data_offset]; 580 target[i].data = (void *) &data[data_offset];
581 GNUNET_memcpy (&data[data_offset], 581 GNUNET_memcpy (&data[data_offset],
582 rd2[c].data, 582 orig->data,
583 rd2[c].data_size); 583 orig->data_size);
584 data_offset += (*rd_res)[c].data_size; 584 data_offset += orig->data_size;
585 } 585 }
586 /* append nick */ 586 /* append nick */
587 (*rd_res)[rd2_length] = *nick_rd; 587 target[rd2_length] = *nick_rd;
588 (*rd_res)[rd2_length].expiration_time = latest_expiration; 588 target[rd2_length].expiration_time = latest_expiration;
589 (*rd_res)[rd2_length].data = (void *) &data[data_offset]; 589 target[rd2_length].data = (void *) &data[data_offset];
590 GNUNET_memcpy ((void *) (*rd_res)[rd2_length].data, 590 GNUNET_memcpy (&data[data_offset],
591 nick_rd->data, 591 nick_rd->data,
592 nick_rd->data_size); 592 nick_rd->data_size);
593 data_offset += (*rd_res)[rd2_length].data_size; 593 data_offset += nick_rd->data_size;
594 GNUNET_assert (req == (sizeof (struct GNUNET_GNSRECORD_Data)) * (*rdc_res) + data_offset); 594 GNUNET_assert (req ==
595 (sizeof (struct GNUNET_GNSRECORD_Data)) * (*rdc_res) + data_offset);
595} 596}
596 597
597 598
@@ -620,11 +621,16 @@ send_lookup_response (struct NamestoreClient *nc,
620 struct GNUNET_GNSRECORD_Data *res; 621 struct GNUNET_GNSRECORD_Data *res;
621 unsigned int res_count; 622 unsigned int res_count;
622 size_t name_len; 623 size_t name_len;
623 size_t rd_ser_len; 624 ssize_t rd_ser_len;
624 char *name_tmp; 625 char *name_tmp;
625 char *rd_ser; 626 char *rd_ser;
626 627
627 nick = get_nick_record (zone_key); 628 nick = get_nick_record (zone_key);
629
630 GNUNET_assert (-1 !=
631 GNUNET_GNSRECORD_records_get_size (rd_count,
632 rd));
633
628 if ( (NULL != nick) && 634 if ( (NULL != nick) &&
629 (0 != strcmp (name, 635 (0 != strcmp (name,
630 GNUNET_GNS_EMPTY_LABEL_AT))) 636 GNUNET_GNS_EMPTY_LABEL_AT)))
@@ -643,26 +649,44 @@ send_lookup_response (struct NamestoreClient *nc,
643 res = (struct GNUNET_GNSRECORD_Data *) rd; 649 res = (struct GNUNET_GNSRECORD_Data *) rd;
644 } 650 }
645 651
652 GNUNET_assert (-1 !=
653 GNUNET_GNSRECORD_records_get_size (res_count,
654 res));
655
656
646 name_len = strlen (name) + 1; 657 name_len = strlen (name) + 1;
647 rd_ser_len = GNUNET_GNSRECORD_records_get_size (res_count, 658 rd_ser_len = GNUNET_GNSRECORD_records_get_size (res_count,
648 res); 659 res);
660 if (rd_ser_len < 0)
661 {
662 GNUNET_break (0);
663 GNUNET_SERVICE_client_drop (nc->client);
664 return;
665 }
666 if (rd_ser_len >= UINT16_MAX - name_len - sizeof (*zir_msg))
667 {
668 GNUNET_break (0);
669 GNUNET_SERVICE_client_drop (nc->client);
670 return;
671 }
649 env = GNUNET_MQ_msg_extra (zir_msg, 672 env = GNUNET_MQ_msg_extra (zir_msg,
650 name_len + rd_ser_len, 673 name_len + rd_ser_len,
651 GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_RESULT); 674 GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_RESULT);
652 zir_msg->gns_header.r_id = htonl (request_id); 675 zir_msg->gns_header.r_id = htonl (request_id);
653 zir_msg->name_len = htons (name_len); 676 zir_msg->name_len = htons (name_len);
654 zir_msg->rd_count = htons (res_count); 677 zir_msg->rd_count = htons (res_count);
655 zir_msg->rd_len = htons (rd_ser_len); 678 zir_msg->rd_len = htons ((uint16_t) rd_ser_len);
656 zir_msg->private_key = *zone_key; 679 zir_msg->private_key = *zone_key;
657 name_tmp = (char *) &zir_msg[1]; 680 name_tmp = (char *) &zir_msg[1];
658 GNUNET_memcpy (name_tmp, 681 GNUNET_memcpy (name_tmp,
659 name, 682 name,
660 name_len); 683 name_len);
661 rd_ser = &name_tmp[name_len]; 684 rd_ser = &name_tmp[name_len];
662 GNUNET_GNSRECORD_records_serialize (res_count, 685 GNUNET_assert (rd_ser_len ==
663 res, 686 GNUNET_GNSRECORD_records_serialize (res_count,
664 rd_ser_len, 687 res,
665 rd_ser); 688 rd_ser_len,
689 rd_ser));
666 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 690 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
667 "Sending RECORD_RESULT message with %u records\n", 691 "Sending RECORD_RESULT message with %u records\n",
668 res_count); 692 res_count);
@@ -865,72 +889,70 @@ static void
865continue_store_activity (struct StoreActivity *sa) 889continue_store_activity (struct StoreActivity *sa)
866{ 890{
867 const struct RecordStoreMessage *rp_msg = sa->rsm; 891 const struct RecordStoreMessage *rp_msg = sa->rsm;
892 unsigned int rd_count;
893 size_t name_len;
894 size_t rd_ser_len;
895 uint32_t rid;
896 const char *name_tmp;
897 const char *rd_ser;
868 898
869 for (struct ZoneMonitor *zm = sa->zm_pos; 899 rid = ntohl (rp_msg->gns_header.r_id);
870 NULL != zm; 900 name_len = ntohs (rp_msg->name_len);
871 zm = sa->zm_pos) 901 rd_count = ntohs (rp_msg->rd_count);
872 { 902 rd_ser_len = ntohs (rp_msg->rd_len);
873 if ( (0 != memcmp (&rp_msg->private_key, 903 name_tmp = (const char *) &rp_msg[1];
874 &zm->zone, 904 rd_ser = &name_tmp[name_len];
875 sizeof (struct GNUNET_CRYPTO_EcdsaPrivateKey))) &&
876 (0 != memcmp (&zm->zone,
877 &zero,
878 sizeof (struct GNUNET_CRYPTO_EcdsaPrivateKey))) )
879 sa->zm_pos = zm->next; /* not interesting to this monitor */
880 if (zm->limit == zm->iteration_cnt)
881 {
882 zm->sa_waiting = GNUNET_YES;
883 zm->sa_waiting_start = GNUNET_TIME_absolute_get ();
884 if (NULL != zm->sa_wait_warning)
885 GNUNET_SCHEDULER_cancel (zm->sa_wait_warning);
886 zm->sa_wait_warning = GNUNET_SCHEDULER_add_delayed (MONITOR_STALL_WARN_DELAY,
887 &warn_monitor_slow,
888 zm);
889 return; /* blocked on zone monitor */
890 }
891 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
892 "Notifying monitor about changes under label `%s'\n",
893 sa->conv_name);
894 zm->limit--;
895 send_lookup_response (zm->nc,
896 0,
897 &rp_msg->private_key,
898 sa->conv_name,
899 sa->rd_count,
900 sa->rd);
901 sa->zm_pos = zm->next;
902 }
903 /* great, done with the monitors, unpack (again) for refresh_block operation */
904 { 905 {
905 size_t name_len; 906 struct GNUNET_GNSRECORD_Data rd[GNUNET_NZL(rd_count)];
906 size_t rd_ser_len; 907
907 uint32_t rid; 908 /* We did this before, must succeed again */
908 const char *name_tmp; 909 GNUNET_assert (GNUNET_OK ==
909 const char *rd_ser; 910 GNUNET_GNSRECORD_records_deserialize (rd_ser_len,
910 unsigned int rd_count; 911 rd_ser,
911 912 rd_count,
912 rid = ntohl (rp_msg->gns_header.r_id); 913 rd));
913 name_len = ntohs (rp_msg->name_len); 914
914 rd_count = ntohs (rp_msg->rd_count); 915 for (struct ZoneMonitor *zm = sa->zm_pos;
915 rd_ser_len = ntohs (rp_msg->rd_len); 916 NULL != zm;
916 name_tmp = (const char *) &rp_msg[1]; 917 zm = sa->zm_pos)
917 rd_ser = &name_tmp[name_len];
918 { 918 {
919 struct GNUNET_GNSRECORD_Data rd[rd_count]; 919 if ( (0 != memcmp (&rp_msg->private_key,
920 920 &zm->zone,
921 /* We did this before, must succeed again */ 921 sizeof (struct GNUNET_CRYPTO_EcdsaPrivateKey))) &&
922 GNUNET_assert (GNUNET_OK == 922 (0 != memcmp (&zm->zone,
923 GNUNET_GNSRECORD_records_deserialize (rd_ser_len, 923 &zero,
924 rd_ser, 924 sizeof (struct GNUNET_CRYPTO_EcdsaPrivateKey))) )
925 rd_count, 925 sa->zm_pos = zm->next; /* not interesting to this monitor */
926 rd)); 926 if (zm->limit == zm->iteration_cnt)
927 refresh_block (sa->nc, 927 {
928 rid, 928 zm->sa_waiting = GNUNET_YES;
929 &rp_msg->private_key, 929 zm->sa_waiting_start = GNUNET_TIME_absolute_get ();
930 sa->conv_name, 930 if (NULL != zm->sa_wait_warning)
931 rd_count, 931 GNUNET_SCHEDULER_cancel (zm->sa_wait_warning);
932 rd); 932 zm->sa_wait_warning = GNUNET_SCHEDULER_add_delayed (MONITOR_STALL_WARN_DELAY,
933 &warn_monitor_slow,
934 zm);
935 return; /* blocked on zone monitor */
936 }
937 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
938 "Notifying monitor about changes under label `%s'\n",
939 sa->conv_name);
940 zm->limit--;
941 send_lookup_response (zm->nc,
942 0,
943 &rp_msg->private_key,
944 sa->conv_name,
945 rd_count,
946 rd);
947 sa->zm_pos = zm->next;
933 } 948 }
949 /* great, done with the monitors, unpack (again) for refresh_block operation */
950 refresh_block (sa->nc,
951 rid,
952 &rp_msg->private_key,
953 sa->conv_name,
954 rd_count,
955 rd);
934 } 956 }
935 GNUNET_SERVICE_client_continue (sa->nc->client); 957 GNUNET_SERVICE_client_continue (sa->nc->client);
936 free_store_activity (sa); 958 free_store_activity (sa);
@@ -1073,12 +1095,13 @@ struct RecordLookupContext
1073 /** 1095 /**
1074 * FIXME. 1096 * FIXME.
1075 */ 1097 */
1076 size_t rd_ser_len; 1098 ssize_t rd_ser_len;
1077}; 1099};
1078 1100
1079 1101
1080/** 1102/**
1081 * FIXME. 1103 * FIXME.
1104 *
1082 * @param seq sequence number of the record 1105 * @param seq sequence number of the record
1083 */ 1106 */
1084static void 1107static void
@@ -1090,60 +1113,93 @@ lookup_it (void *cls,
1090 const struct GNUNET_GNSRECORD_Data *rd) 1113 const struct GNUNET_GNSRECORD_Data *rd)
1091{ 1114{
1092 struct RecordLookupContext *rlc = cls; 1115 struct RecordLookupContext *rlc = cls;
1093 struct GNUNET_GNSRECORD_Data *rd_res;
1094 unsigned int rdc_res;
1095 1116
1096 (void) private_key; 1117 (void) private_key;
1097 (void) seq; 1118 (void) seq;
1098 if (0 == strcmp (label, 1119 if (0 != strcmp (label,
1099 rlc->label)) 1120 rlc->label))
1121 return;
1122 rlc->found = GNUNET_YES;
1123 if (0 == rd_count)
1100 { 1124 {
1101 rlc->found = GNUNET_YES; 1125 rlc->rd_ser_len = 0;
1102 if (0 != rd_count) 1126 rlc->res_rd_count = 0;
1127 rlc->res_rd = NULL;
1128 return;
1129 }
1130 if ( (NULL != rlc->nick) &&
1131 (0 != strcmp (label,
1132 GNUNET_GNS_EMPTY_LABEL_AT)) )
1133 {
1134 /* Merge */
1135 struct GNUNET_GNSRECORD_Data *rd_res;
1136 unsigned int rdc_res;
1137
1138 rd_res = NULL;
1139 rdc_res = 0;
1140 rlc->nick->flags = (rlc->nick->flags | GNUNET_GNSRECORD_RF_PRIVATE) ^ GNUNET_GNSRECORD_RF_PRIVATE;
1141 merge_with_nick_records (rlc->nick,
1142 rd_count,
1143 rd,
1144 &rdc_res,
1145 &rd_res);
1146 rlc->rd_ser_len = GNUNET_GNSRECORD_records_get_size (rdc_res,
1147 rd_res);
1148 if (rlc->rd_ser_len < 0)
1103 { 1149 {
1104 if ( (NULL != rlc->nick) && 1150 GNUNET_break (0);
1105 (0 != strcmp (label, 1151 GNUNET_free (rd_res);
1106 GNUNET_GNS_EMPTY_LABEL_AT)) ) 1152 rlc->found = GNUNET_NO;
1107 { 1153 rlc->rd_ser_len = 0;
1108 /* Merge */ 1154 return;
1109 rd_res = NULL; 1155 }
1110 rdc_res = 0; 1156 rlc->res_rd_count = rdc_res;
1111 rlc->nick->flags = (rlc->nick->flags | GNUNET_GNSRECORD_RF_PRIVATE) ^ GNUNET_GNSRECORD_RF_PRIVATE; 1157 rlc->res_rd = GNUNET_malloc (rlc->rd_ser_len);
1112 merge_with_nick_records (rlc->nick, 1158 if (rlc->rd_ser_len !=
1113 rd_count,
1114 rd,
1115 &rdc_res,
1116 &rd_res);
1117 rlc->rd_ser_len = GNUNET_GNSRECORD_records_get_size (rdc_res,
1118 rd_res);
1119 rlc->res_rd_count = rdc_res;
1120 rlc->res_rd = GNUNET_malloc (rlc->rd_ser_len);
1121 GNUNET_GNSRECORD_records_serialize (rdc_res, 1159 GNUNET_GNSRECORD_records_serialize (rdc_res,
1122 rd_res, 1160 rd_res,
1123 rlc->rd_ser_len, 1161 rlc->rd_ser_len,
1124 rlc->res_rd); 1162 rlc->res_rd))
1125 1163 {
1126 GNUNET_free (rd_res); 1164 GNUNET_break (0);
1127 GNUNET_free (rlc->nick); 1165 GNUNET_free (rlc->res_rd);
1128 rlc->nick = NULL; 1166 rlc->res_rd = NULL;
1129 } 1167 rlc->res_rd_count = 0;
1130 else 1168 rlc->rd_ser_len = 0;
1131 { 1169 GNUNET_free (rd_res);
1132 rlc->rd_ser_len = GNUNET_GNSRECORD_records_get_size (rd_count, 1170 rlc->found = GNUNET_NO;
1133 rd); 1171 return;
1134 rlc->res_rd_count = rd_count; 1172 }
1135 rlc->res_rd = GNUNET_malloc (rlc->rd_ser_len); 1173 GNUNET_free (rd_res);
1174 GNUNET_free (rlc->nick);
1175 rlc->nick = NULL;
1176 }
1177 else
1178 {
1179 rlc->rd_ser_len = GNUNET_GNSRECORD_records_get_size (rd_count,
1180 rd);
1181 if (rlc->rd_ser_len < 0)
1182 {
1183 GNUNET_break (0);
1184 rlc->found = GNUNET_NO;
1185 rlc->rd_ser_len = 0;
1186 return;
1187 }
1188 rlc->res_rd_count = rd_count;
1189 rlc->res_rd = GNUNET_malloc (rlc->rd_ser_len);
1190 if (rlc->rd_ser_len !=
1136 GNUNET_GNSRECORD_records_serialize (rd_count, 1191 GNUNET_GNSRECORD_records_serialize (rd_count,
1137 rd, 1192 rd,
1138 rlc->rd_ser_len, 1193 rlc->rd_ser_len,
1139 rlc->res_rd); 1194 rlc->res_rd))
1140 }
1141 }
1142 else
1143 { 1195 {
1144 rlc->rd_ser_len = 0; 1196 GNUNET_break (0);
1145 rlc->res_rd_count = 0; 1197 GNUNET_free (rlc->res_rd);
1146 rlc->res_rd = NULL; 1198 rlc->res_rd = NULL;
1199 rlc->res_rd_count = 0;
1200 rlc->rd_ser_len = 0;
1201 rlc->found = GNUNET_NO;
1202 return;
1147 } 1203 }
1148 } 1204 }
1149} 1205}
@@ -1331,8 +1387,6 @@ handle_record_store (void *cls,
1331 rd_ser = &name_tmp[name_len]; 1387 rd_ser = &name_tmp[name_len];
1332 { 1388 {
1333 struct GNUNET_GNSRECORD_Data rd[GNUNET_NZL(rd_count)]; 1389 struct GNUNET_GNSRECORD_Data rd[GNUNET_NZL(rd_count)];
1334 struct GNUNET_GNSRECORD_Data rd_clean[GNUNET_NZL(rd_count)];
1335 unsigned int rd_clean_off;
1336 1390
1337 if (GNUNET_OK != 1391 if (GNUNET_OK !=
1338 GNUNET_GNSRECORD_records_deserialize (rd_ser_len, 1392 GNUNET_GNSRECORD_records_deserialize (rd_ser_len,
@@ -1381,6 +1435,9 @@ handle_record_store (void *cls,
1381 { 1435 {
1382 /* remove "NICK" records, unless this is for the 1436 /* remove "NICK" records, unless this is for the
1383 #GNUNET_GNS_EMPTY_LABEL_AT label */ 1437 #GNUNET_GNS_EMPTY_LABEL_AT label */
1438 struct GNUNET_GNSRECORD_Data rd_clean[GNUNET_NZL(rd_count)];
1439 unsigned int rd_clean_off;
1440
1384 rd_clean_off = 0; 1441 rd_clean_off = 0;
1385 for (unsigned int i=0;i<rd_count;i++) 1442 for (unsigned int i=0;i<rd_count;i++)
1386 { 1443 {
@@ -1420,12 +1477,6 @@ handle_record_store (void *cls,
1420 ntohs (rp_msg->gns_header.header.size)); 1477 ntohs (rp_msg->gns_header.header.size));
1421 sa->zm_pos = monitor_head; 1478 sa->zm_pos = monitor_head;
1422 sa->conv_name = conv_name; 1479 sa->conv_name = conv_name;
1423 GNUNET_array_grow (sa->rd,
1424 sa->rd_count,
1425 rd_clean_off);
1426 GNUNET_memcpy (sa->rd,
1427 rd_clean,
1428 sizeof (struct GNUNET_GNSRECORD_Data) * rd_clean_off);
1429 continue_store_activity (sa); 1480 continue_store_activity (sa);
1430 } 1481 }
1431} 1482}
@@ -1479,7 +1530,7 @@ handle_zone_to_name_it (void *cls,
1479 struct ZoneToNameResponseMessage *ztnr_msg; 1530 struct ZoneToNameResponseMessage *ztnr_msg;
1480 int16_t res; 1531 int16_t res;
1481 size_t name_len; 1532 size_t name_len;
1482 size_t rd_ser_len; 1533 ssize_t rd_ser_len;
1483 size_t msg_size; 1534 size_t msg_size;
1484 char *name_tmp; 1535 char *name_tmp;
1485 char *rd_tmp; 1536 char *rd_tmp;
@@ -1490,7 +1541,14 @@ handle_zone_to_name_it (void *cls,
1490 name); 1541 name);
1491 res = GNUNET_YES; 1542 res = GNUNET_YES;
1492 name_len = (NULL == name) ? 0 : strlen (name) + 1; 1543 name_len = (NULL == name) ? 0 : strlen (name) + 1;
1493 rd_ser_len = GNUNET_GNSRECORD_records_get_size (rd_count, rd); 1544 rd_ser_len = GNUNET_GNSRECORD_records_get_size (rd_count,
1545 rd);
1546 if (rd_ser_len < 0)
1547 {
1548 GNUNET_break (0);
1549 ztn_ctx->success = GNUNET_SYSERR;
1550 return;
1551 }
1494 msg_size = sizeof (struct ZoneToNameResponseMessage) + name_len + rd_ser_len; 1552 msg_size = sizeof (struct ZoneToNameResponseMessage) + name_len + rd_ser_len;
1495 if (msg_size >= GNUNET_MAX_MESSAGE_SIZE) 1553 if (msg_size >= GNUNET_MAX_MESSAGE_SIZE)
1496 { 1554 {
@@ -1513,10 +1571,11 @@ handle_zone_to_name_it (void *cls,
1513 name, 1571 name,
1514 name_len); 1572 name_len);
1515 rd_tmp = &name_tmp[name_len]; 1573 rd_tmp = &name_tmp[name_len];
1516 GNUNET_GNSRECORD_records_serialize (rd_count, 1574 GNUNET_assert (rd_ser_len ==
1517 rd, 1575 GNUNET_GNSRECORD_records_serialize (rd_count,
1518 rd_ser_len, 1576 rd,
1519 rd_tmp); 1577 rd_ser_len,
1578 rd_tmp));
1520 ztn_ctx->success = GNUNET_OK; 1579 ztn_ctx->success = GNUNET_OK;
1521 GNUNET_MQ_send (ztn_ctx->nc->mq, 1580 GNUNET_MQ_send (ztn_ctx->nc->mq,
1522 env); 1581 env);
diff --git a/src/namestore/gnunet-zoneimport.c b/src/namestore/gnunet-zoneimport.c
index b394178a6..44c9fe89e 100644
--- a/src/namestore/gnunet-zoneimport.c
+++ b/src/namestore/gnunet-zoneimport.c
@@ -1494,6 +1494,16 @@ do_shutdown (void *cls)
1494 1494
1495 1495
1496/** 1496/**
1497 * Iterate over all of the zones we care about and see which records
1498 * we may need to re-fetch when.
1499 *
1500 * @param cls NULL
1501 */
1502static void
1503iterate_zones (void *cls);
1504
1505
1506/**
1497 * Function called if #GNUNET_NAMESTORE_records_lookup() failed. 1507 * Function called if #GNUNET_NAMESTORE_records_lookup() failed.
1498 * Just logs an error. 1508 * Just logs an error.
1499 * 1509 *
@@ -1507,6 +1517,9 @@ ns_lookup_error_cb (void *cls)
1507 GNUNET_log (GNUNET_ERROR_TYPE_INFO, 1517 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
1508 "Failed to load data from namestore for zone `%s'\n", 1518 "Failed to load data from namestore for zone `%s'\n",
1509 zone->domain); 1519 zone->domain);
1520 zone_it = NULL;
1521 ns_iterator_trigger_next = 0;
1522 iterate_zones (NULL);
1510} 1523}
1511 1524
1512 1525
@@ -1842,7 +1855,7 @@ process_stdin (void *cls)
1842 delta = GNUNET_TIME_absolute_get_duration (last); 1855 delta = GNUNET_TIME_absolute_get_duration (last);
1843 last = GNUNET_TIME_absolute_get (); 1856 last = GNUNET_TIME_absolute_get ();
1844 fprintf (stderr, 1857 fprintf (stderr,
1845 "Read 10000 domain names in %s\n", 1858 "Read 100000 domain names in %s\n",
1846 GNUNET_STRINGS_relative_time_to_string (delta, 1859 GNUNET_STRINGS_relative_time_to_string (delta,
1847 GNUNET_YES)); 1860 GNUNET_YES));
1848 GNUNET_STATISTICS_set (stats, 1861 GNUNET_STATISTICS_set (stats,
diff --git a/src/namestore/namestore_api.c b/src/namestore/namestore_api.c
index 57bf8f81b..f2aaa43c8 100644
--- a/src/namestore/namestore_api.c
+++ b/src/namestore/namestore_api.c
@@ -1033,7 +1033,7 @@ GNUNET_NAMESTORE_records_store (struct GNUNET_NAMESTORE_Handle *h,
1033 struct GNUNET_MQ_Envelope *env; 1033 struct GNUNET_MQ_Envelope *env;
1034 char *name_tmp; 1034 char *name_tmp;
1035 char *rd_ser; 1035 char *rd_ser;
1036 size_t rd_ser_len; 1036 ssize_t rd_ser_len;
1037 size_t name_len; 1037 size_t name_len;
1038 uint32_t rid; 1038 uint32_t rid;
1039 struct RecordStoreMessage *msg; 1039 struct RecordStoreMessage *msg;
@@ -1045,6 +1045,18 @@ GNUNET_NAMESTORE_records_store (struct GNUNET_NAMESTORE_Handle *h,
1045 GNUNET_break (0); 1045 GNUNET_break (0);
1046 return NULL; 1046 return NULL;
1047 } 1047 }
1048 rd_ser_len = GNUNET_GNSRECORD_records_get_size (rd_count,
1049 rd);
1050 if (rd_ser_len < 0)
1051 {
1052 GNUNET_break (0);
1053 return NULL;
1054 }
1055 if (rd_ser_len > UINT16_MAX)
1056 {
1057 GNUNET_break (0);
1058 return NULL;
1059 }
1048 rid = get_op_id (h); 1060 rid = get_op_id (h);
1049 qe = GNUNET_new (struct GNUNET_NAMESTORE_QueueEntry); 1061 qe = GNUNET_new (struct GNUNET_NAMESTORE_QueueEntry);
1050 qe->h = h; 1062 qe->h = h;
@@ -1056,8 +1068,6 @@ GNUNET_NAMESTORE_records_store (struct GNUNET_NAMESTORE_Handle *h,
1056 qe); 1068 qe);
1057 1069
1058 /* setup msg */ 1070 /* setup msg */
1059 rd_ser_len = GNUNET_GNSRECORD_records_get_size (rd_count,
1060 rd);
1061 env = GNUNET_MQ_msg_extra (msg, 1071 env = GNUNET_MQ_msg_extra (msg,
1062 name_len + rd_ser_len, 1072 name_len + rd_ser_len,
1063 GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_STORE); 1073 GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_STORE);
@@ -1077,8 +1087,10 @@ GNUNET_NAMESTORE_records_store (struct GNUNET_NAMESTORE_Handle *h,
1077 rd, 1087 rd,
1078 rd_ser_len, 1088 rd_ser_len,
1079 rd_ser); 1089 rd_ser);
1080 if (0 > sret) 1090 if ( (0 > sret) ||
1091 (sret != rd_ser_len) )
1081 { 1092 {
1093 GNUNET_break (0);
1082 GNUNET_free (env); 1094 GNUNET_free (env);
1083 return NULL; 1095 return NULL;
1084 } 1096 }
diff --git a/src/namestore/namestore_api_monitor.c b/src/namestore/namestore_api_monitor.c
index 9ba90833b..16780ad0c 100644
--- a/src/namestore/namestore_api_monitor.c
+++ b/src/namestore/namestore_api_monitor.c
@@ -144,6 +144,11 @@ check_result (void *cls,
144 rd_len = ntohs (lrm->rd_len); 144 rd_len = ntohs (lrm->rd_len);
145 rd_count = ntohs (lrm->rd_count); 145 rd_count = ntohs (lrm->rd_count);
146 name_len = ntohs (lrm->name_len); 146 name_len = ntohs (lrm->name_len);
147 if (name_len > MAX_NAME_LEN)
148 {
149 GNUNET_break (0);
150 return GNUNET_SYSERR;
151 }
147 exp_lrm_len = sizeof (struct RecordResultMessage) + name_len + rd_len; 152 exp_lrm_len = sizeof (struct RecordResultMessage) + name_len + rd_len;
148 if (lrm_len != exp_lrm_len) 153 if (lrm_len != exp_lrm_len)
149 { 154 {
@@ -156,7 +161,7 @@ check_result (void *cls,
156 return GNUNET_SYSERR; 161 return GNUNET_SYSERR;
157 } 162 }
158 name_tmp = (const char *) &lrm[1]; 163 name_tmp = (const char *) &lrm[1];
159 if ((name_tmp[name_len -1] != '\0') || (name_len > MAX_NAME_LEN)) 164 if (name_tmp[name_len -1] != '\0')
160 { 165 {
161 GNUNET_break (0); 166 GNUNET_break (0);
162 return GNUNET_SYSERR; 167 return GNUNET_SYSERR;
diff --git a/src/namestore/plugin_namestore_flat.c b/src/namestore/plugin_namestore_flat.c
index 35d8424b4..95edb9d87 100644
--- a/src/namestore/plugin_namestore_flat.c
+++ b/src/namestore/plugin_namestore_flat.c
@@ -301,7 +301,7 @@ store_and_free_entries (void *cls,
301 char *line; 301 char *line;
302 char *zone_private_key; 302 char *zone_private_key;
303 char *record_data_b64; 303 char *record_data_b64;
304 size_t data_size; 304 ssize_t data_size;
305 305
306 (void) key; 306 (void) key;
307 GNUNET_STRINGS_base64_encode ((char*)entry->private_key, 307 GNUNET_STRINGS_base64_encode ((char*)entry->private_key,
@@ -309,6 +309,18 @@ store_and_free_entries (void *cls,
309 &zone_private_key); 309 &zone_private_key);
310 data_size = GNUNET_GNSRECORD_records_get_size (entry->record_count, 310 data_size = GNUNET_GNSRECORD_records_get_size (entry->record_count,
311 entry->record_data); 311 entry->record_data);
312 if (data_size < 0)
313 {
314 GNUNET_break (0);
315 GNUNET_free (zone_private_key);
316 return GNUNET_SYSERR;
317 }
318 if (data_size >= UINT16_MAX)
319 {
320 GNUNET_break (0);
321 GNUNET_free (zone_private_key);
322 return GNUNET_SYSERR;
323 }
312 { 324 {
313 char data[data_size]; 325 char data[data_size];
314 ssize_t ret; 326 ssize_t ret;
@@ -318,7 +330,7 @@ store_and_free_entries (void *cls,
318 data_size, 330 data_size,
319 data); 331 data);
320 if ( (ret < 0) || 332 if ( (ret < 0) ||
321 (data_size != (size_t) ret) ) 333 (data_size != ret) )
322 { 334 {
323 GNUNET_break (0); 335 GNUNET_break (0);
324 GNUNET_free (zone_private_key); 336 GNUNET_free (zone_private_key);
diff --git a/src/namestore/plugin_namestore_postgres.c b/src/namestore/plugin_namestore_postgres.c
index d7907b1a6..09fdd760f 100644
--- a/src/namestore/plugin_namestore_postgres.c
+++ b/src/namestore/plugin_namestore_postgres.c
@@ -220,7 +220,7 @@ namestore_postgres_store_records (void *cls,
220 struct GNUNET_CRYPTO_EcdsaPublicKey pkey; 220 struct GNUNET_CRYPTO_EcdsaPublicKey pkey;
221 uint64_t rvalue; 221 uint64_t rvalue;
222 uint32_t rd_count32 = (uint32_t) rd_count; 222 uint32_t rd_count32 = (uint32_t) rd_count;
223 size_t data_size; 223 ssize_t data_size;
224 224
225 memset (&pkey, 225 memset (&pkey,
226 0, 226 0,
@@ -238,7 +238,12 @@ namestore_postgres_store_records (void *cls,
238 UINT64_MAX); 238 UINT64_MAX);
239 data_size = GNUNET_GNSRECORD_records_get_size (rd_count, 239 data_size = GNUNET_GNSRECORD_records_get_size (rd_count,
240 rd); 240 rd);
241 if (data_size > 64 * 65536) 241 if (data_size < 0)
242 {
243 GNUNET_break (0);
244 return GNUNET_SYSERR;
245 }
246 if (data_size >= UINT16_MAX)
242 { 247 {
243 GNUNET_break (0); 248 GNUNET_break (0);
244 return GNUNET_SYSERR; 249 return GNUNET_SYSERR;
@@ -287,7 +292,7 @@ namestore_postgres_store_records (void *cls,
287 data_size, 292 data_size,
288 data); 293 data);
289 if ( (ret < 0) || 294 if ( (ret < 0) ||
290 (data_size != (size_t) ret) ) 295 (data_size != ret) )
291 { 296 {
292 GNUNET_break (0); 297 GNUNET_break (0);
293 return GNUNET_SYSERR; 298 return GNUNET_SYSERR;
diff --git a/src/namestore/plugin_namestore_sqlite.c b/src/namestore/plugin_namestore_sqlite.c
index 34e548613..81391ce8a 100644
--- a/src/namestore/plugin_namestore_sqlite.c
+++ b/src/namestore/plugin_namestore_sqlite.c
@@ -313,7 +313,7 @@ namestore_sqlite_store_records (void *cls,
313 int n; 313 int n;
314 struct GNUNET_CRYPTO_EcdsaPublicKey pkey; 314 struct GNUNET_CRYPTO_EcdsaPublicKey pkey;
315 uint64_t rvalue; 315 uint64_t rvalue;
316 size_t data_size; 316 ssize_t data_size;
317 317
318 memset (&pkey, 318 memset (&pkey,
319 0, 319 0,
@@ -332,6 +332,11 @@ namestore_sqlite_store_records (void *cls,
332 UINT64_MAX); 332 UINT64_MAX);
333 data_size = GNUNET_GNSRECORD_records_get_size (rd_count, 333 data_size = GNUNET_GNSRECORD_records_get_size (rd_count,
334 rd); 334 rd);
335 if (data_size < 0)
336 {
337 GNUNET_break (0);
338 return GNUNET_SYSERR;
339 }
335 if (data_size > 64 * 65536) 340 if (data_size > 64 * 65536)
336 { 341 {
337 GNUNET_break (0); 342 GNUNET_break (0);
@@ -352,7 +357,7 @@ namestore_sqlite_store_records (void *cls,
352 data_size, 357 data_size,
353 data); 358 data);
354 if ( (ret < 0) || 359 if ( (ret < 0) ||
355 (data_size != (size_t) ret) ) 360 (data_size != ret) )
356 { 361 {
357 GNUNET_break (0); 362 GNUNET_break (0);
358 return GNUNET_SYSERR; 363 return GNUNET_SYSERR;
diff --git a/src/namestore/test_namestore_api.conf b/src/namestore/test_namestore_api.conf
index 07409ea2b..5e96eab7c 100644
--- a/src/namestore/test_namestore_api.conf
+++ b/src/namestore/test_namestore_api.conf
@@ -1,5 +1,5 @@
1@INLINE@ ../../contrib/no_forcestart.conf 1@INLINE@ ../../contrib/conf/gnunet/no_forcestart.conf
2@INLINE@ ../../contrib/no_autostart_above_core.conf 2@INLINE@ ../../contrib/conf/gnunet/no_autostart_above_core.conf
3 3
4[PATHS] 4[PATHS]
5GNUNET_TEST_HOME = $GNUNET_TMP/test-gnunet-namestore/ 5GNUNET_TEST_HOME = $GNUNET_TMP/test-gnunet-namestore/
diff --git a/src/peerinfo-tool/test_gnunet_peerinfo.py.in b/src/peerinfo-tool/test_gnunet_peerinfo.py.in
index 3207c2c2f..fb5941121 100755
--- a/src/peerinfo-tool/test_gnunet_peerinfo.py.in
+++ b/src/peerinfo-tool/test_gnunet_peerinfo.py.in
@@ -1,6 +1,6 @@
1#!@PYTHON@ 1#!@PYTHON@
2# This file is part of GNUnet. 2# This file is part of GNUnet.
3# (C) 2010 Christian Grothoff (and other contributing authors) 3# (C) 2010, 2018 Christian Grothoff (and other contributing authors)
4# 4#
5# GNUnet is free software; you can redistribute it and/or modify 5# GNUnet is free software; you can redistribute it and/or modify
6# it under the terms of the GNU General Public License as published 6# it under the terms of the GNU General Public License as published
@@ -26,70 +26,70 @@ import shutil
26import time 26import time
27 27
28srcdir = "../.." 28srcdir = "../.."
29gnunet_pyexpect_dir = os.path.join (srcdir, "contrib") 29gnunet_pyexpect_dir = os.path.join(srcdir, "contrib/scripts")
30if gnunet_pyexpect_dir not in sys.path: 30if gnunet_pyexpect_dir not in sys.path:
31 sys.path.append (gnunet_pyexpect_dir) 31 sys.path.append(gnunet_pyexpect_dir)
32 32
33from gnunet_pyexpect import pexpect 33from gnunet_pyexpect import pexpect
34 34
35if os.name == 'posix': 35if os.name == 'posix':
36 peerinfo = './gnunet-peerinfo' 36 peerinfo = './gnunet-peerinfo'
37 gnunetarm = 'gnunet-arm' 37 gnunetarm = 'gnunet-arm'
38 gnunettesting = 'gnunet-testing' 38 gnunettesting = 'gnunet-testing'
39elif os.name == 'nt': 39elif os.name == 'nt':
40 peerinfo = './gnunet-peerinfo.exe' 40 peerinfo = './gnunet-peerinfo.exe'
41 gnunetarm = 'gnunet-arm.exe' 41 gnunetarm = 'gnunet-arm.exe'
42 gnunettesting = 'gnunet-testing.exe' 42 gnunettesting = 'gnunet-testing.exe'
43 43
44pinfo = pexpect () 44pinfo = pexpect()
45 45
46 46
47if os.name == "nt": 47if os.name == "nt":
48 shutil.rmtree (os.path.join (os.getenv ("TEMP"), "gnunet-test-peerinfo"), True) 48 shutil.rmtree(os.path.join(os.getenv("TEMP"), "gnunet-test-peerinfo"), True)
49else: 49else:
50 shutil.rmtree ("/tmp/gnunet-test-peerinfo", True) 50 shutil.rmtree("/tmp/gnunet-test-peerinfo", True)
51 51
52# create hostkey via testing lib 52# create hostkey via testing lib # FIXME: The /tmp/ location needs to be adjusted to the TMP variable!
53hkk = subprocess.Popen ([gnunettesting, '-n', '1', '-c', 'test_gnunet_peerinfo_data.conf', '-k', '/tmp/gnunet-test-peerinfo/.hostkey']) 53hkk = subprocess.Popen([gnunettesting, '-n', '1', '-c', 'test_gnunet_peerinfo_data.conf', '-k', '/tmp/gnunet-test-peerinfo/.hostkey'])
54hkk.communicate () 54hkk.communicate()
55 55
56arm = subprocess.Popen ([gnunetarm, '-sq', '-c', 'test_gnunet_peerinfo_data.conf']) 56arm = subprocess.Popen([gnunetarm, '-sq', '-c', 'test_gnunet_peerinfo_data.conf'])
57arm.communicate () 57arm.communicate()
58 58
59try: 59try:
60 pinfo.spawn (None, [peerinfo, '-c', 'test_gnunet_peerinfo_data.conf', '-s'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 60 pinfo.spawn(None, [peerinfo, '-c', 'test_gnunet_peerinfo_data.conf', '-s'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
61 pinfo.expect ("stdout", re.compile (r'I am peer `.*\'.\r?\n')) 61 pinfo.expect("stdout", re.compile(r'I am peer `.*\'.\r?\n'))
62 62
63 pinfo.spawn (None, [peerinfo, '-c', 'test_gnunet_peerinfo_data.conf', '-qs'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 63 pinfo.spawn(None, [peerinfo, '-c', 'test_gnunet_peerinfo_data.conf', '-qs'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
64 pinfo.expect ("stdout", re.compile (r'....................................................\r?\n')) 64 pinfo.expect("stdout", re.compile(r'....................................................\r?\n'))
65 65
66 pinfo.spawn (None, [peerinfo, '-c', 'test_gnunet_peerinfo_data.conf', 'invalid'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 66 pinfo.spawn(None, [peerinfo, '-c', 'test_gnunet_peerinfo_data.conf', 'invalid'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
67 pinfo.expect ("stdout", re.compile (r'Invalid command line argument `invalid\'\r?\n')) 67 pinfo.expect("stdout", re.compile(r'Invalid command line argument `invalid\'\r?\n'))
68 68
69 arm = subprocess.Popen ([gnunetarm, '-q', '-i', 'transport', '-c', 'test_gnunet_peerinfo_data.conf']) 69 arm = subprocess.Popen([gnunetarm, '-q', '-i', 'transport', '-c', 'test_gnunet_peerinfo_data.conf'])
70 arm.communicate () 70 arm.communicate()
71 time.sleep (1) 71 time.sleep(1)
72 72
73 pinfo.spawn (None, [peerinfo, '-i', '-c', 'test_gnunet_peerinfo_data.conf'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 73 pinfo.spawn(None, [peerinfo, '-i', '-c', 'test_gnunet_peerinfo_data.conf'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
74 pinfo.expect ("stdout", re.compile ("Peer `.*'\r?\n")) 74 pinfo.expect("stdout", re.compile("Peer `.*'\r?\n"))
75 m = pinfo.expect ("stdout", re.compile ("\s.*:24357\r?\n")) 75 m = pinfo.expect("stdout", re.compile("\s.*:24357\r?\n"))
76 while len (m.group (0)) > 0: 76 while len(m.group(0)) > 0:
77 m = pinfo.expect ("stdout", re.compile ("(\s.*:24357\r?\n|\r?\n|)")) 77 m = pinfo.expect("stdout", re.compile("(\s.*:24357\r?\n|\r?\n|)"))
78 78
79 pinfo.spawn (None, [peerinfo, '-i', '-c', 'test_gnunet_peerinfo_data.conf', '-n'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 79 pinfo.spawn(None, [peerinfo, '-i', '-c', 'test_gnunet_peerinfo_data.conf', '-n'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
80 pinfo.expect ("stdout", re.compile ("Peer `.*'\r?\n")) 80 pinfo.expect("stdout", re.compile("Peer `.*'\r?\n"))
81 m = pinfo.expect ("stdout", re.compile ("\s.*:24357\r?\n")) 81 m = pinfo.expect("stdout", re.compile("\s.*:24357\r?\n"))
82 while len (m.group (0)) > 0: 82 while len(m.group(0)) > 0:
83 m = pinfo.expect ("stdout", re.compile ("(\s.*:24357\r?\n|\r?\n|)")) 83 m = pinfo.expect("stdout", re.compile("(\s.*:24357\r?\n|\r?\n|)"))
84 84
85 pinfo.spawn (None, [peerinfo, '-c', 'test_gnunet_peerinfo_data.conf', '-qs'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 85 pinfo.spawn(None, [peerinfo, '-c', 'test_gnunet_peerinfo_data.conf', '-qs'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
86 pid = pinfo.read ("stdout") 86 pid = pinfo.read("stdout")
87 pid.strip () 87 pid.strip()
88 88
89finally: 89finally:
90 arm = subprocess.Popen ([gnunetarm, '-eq', '-c', 'test_gnunet_peerinfo_data.conf']) 90 arm = subprocess.Popen([gnunetarm, '-eq', '-c', 'test_gnunet_peerinfo_data.conf'])
91 arm.communicate () 91 arm.communicate()
92 if os.name == "nt": 92 if os.name == "nt":
93 shutil.rmtree (os.path.join (os.getenv ("TEMP"), "gnunet-test-peerinfo"), True) 93 shutil.rmtree(os.path.join(os.getenv("TEMP"), "gnunet-test-peerinfo"), True)
94 else: 94 else:
95 shutil.rmtree ("/tmp/gnunet-test-peerinfo", True) 95 shutil.rmtree("/tmp/gnunet-test-peerinfo", True)
diff --git a/src/peerinfo-tool/test_gnunet_peerinfo_data.conf b/src/peerinfo-tool/test_gnunet_peerinfo_data.conf
index 32b096809..d18d3cf96 100644
--- a/src/peerinfo-tool/test_gnunet_peerinfo_data.conf
+++ b/src/peerinfo-tool/test_gnunet_peerinfo_data.conf
@@ -1,4 +1,4 @@
1@INLINE@ ../../contrib/no_forcestart.conf 1@INLINE@ ../../contrib/conf/gnunet/no_forcestart.conf
2 2
3[PATHS] 3[PATHS]
4GNUNET_TEST_HOME = $GNUNET_TMP/gnunet-test-peerinfo/ 4GNUNET_TEST_HOME = $GNUNET_TMP/gnunet-test-peerinfo/
diff --git a/src/psyc/test_psyc.conf b/src/psyc/test_psyc.conf
index 836255163..4e2563a8a 100644
--- a/src/psyc/test_psyc.conf
+++ b/src/psyc/test_psyc.conf
@@ -1,4 +1,4 @@
1@INLINE@ ../../contrib/no_forcestart.conf 1@INLINE@ ../../contrib/conf/gnunet/no_forcestart.conf
2 2
3[testbed] 3[testbed]
4HOSTNAME = localhost 4HOSTNAME = localhost
diff --git a/src/regex/test_regex_api_data.conf b/src/regex/test_regex_api_data.conf
index 8c87eeb96..60dcdc0b6 100644
--- a/src/regex/test_regex_api_data.conf
+++ b/src/regex/test_regex_api_data.conf
@@ -1,5 +1,5 @@
1@INLINE@ ../../contrib/no_forcestart.conf 1@INLINE@ ../../contrib/conf/gnunet/no_forcestart.conf
2@INLINE@ ../../contrib/no_autostart_above_core.conf 2@INLINE@ ../../contrib/conf/gnunet/no_autostart_above_core.conf
3 3
4[PATHS] 4[PATHS]
5GNUNET_TEST_HOME = $GNUNET_TMP/test-regex-api/ 5GNUNET_TEST_HOME = $GNUNET_TMP/test-regex-api/
diff --git a/src/revocation/test_local_revocation.py.in b/src/revocation/test_local_revocation.py.in
index 28257715f..067091b58 100644
--- a/src/revocation/test_local_revocation.py.in
+++ b/src/revocation/test_local_revocation.py.in
@@ -1,6 +1,6 @@
1#!@PYTHON@ 1#!@PYTHON@
2# This file is part of GNUnet. 2# This file is part of GNUnet.
3# (C) 2010 Christian Grothoff (and other contributing authors) 3# (C) 2010, 2018 Christian Grothoff (and other contributing authors)
4# 4#
5# GNUnet is free software; you can redistribute it and/or modify 5# GNUnet is free software; you can redistribute it and/or modify
6# it under the terms of the GNU General Public License as published 6# it under the terms of the GNU General Public License as published
@@ -26,90 +26,89 @@ import re
26import shutil 26import shutil
27 27
28if os.name == 'posix': 28if os.name == 'posix':
29 config = 'gnunet-config' 29 config = 'gnunet-config'
30 gnunetarm = 'gnunet-arm' 30 gnunetarm = 'gnunet-arm'
31 ident = 'gnunet-identity' 31 ident = 'gnunet-identity'
32 revoc = './gnunet-revocation' 32 revoc = './gnunet-revocation'
33elif os.name == 'nt': 33elif os.name == 'nt':
34 config = 'gnunet-config.exe' 34 config = 'gnunet-config.exe'
35 gnunetarm = 'gnunet-arm.exe' 35 gnunetarm = 'gnunet-arm.exe'
36 ident = 'gnunet-identity.exe' 36 ident = 'gnunet-identity.exe'
37 revoc = './gnunet-revocation.exe' 37 revoc = './gnunet-revocation.exe'
38 38
39TEST_CONFIGURATION = "test_revocation.conf" 39TEST_CONFIGURATION = "test_revocation.conf"
40TEST_REVOCATION_EGO = "revoc_test" 40TEST_REVOCATION_EGO = "revoc_test"
41 41
42 42get_clean = subprocess.Popen([config, '-c', TEST_CONFIGURATION, '-s', 'PATHS', '-o', 'GNUNET_HOME', '-f'], stdout=subprocess.PIPE)
43get_clean = subprocess.Popen ([config, '-c', TEST_CONFIGURATION, '-s', 'PATHS', '-o', 'GNUNET_HOME', '-f'], stdout=subprocess.PIPE) 43cleandir, x = get_clean.communicate()
44cleandir, x = get_clean.communicate ()
45cleandir = cleandir.decode("utf-8") 44cleandir = cleandir.decode("utf-8")
46cleandir = cleandir.rstrip ('\n').rstrip ('\r') 45cleandir = cleandir.rstrip('\n').rstrip('\r')
47 46
48if os.path.isdir (cleandir): 47if os.path.isdir(cleandir):
49 shutil.rmtree (cleandir, True) 48 shutil.rmtree(cleandir, True)
50 49
51res = 0 50res = 0
52arm = subprocess.Popen ([gnunetarm, '-s', '-c', TEST_CONFIGURATION]) 51arm = subprocess.Popen([gnunetarm, '-s', '-c', TEST_CONFIGURATION])
53arm.communicate () 52arm.communicate()
54 53
55try: 54try:
56 print ("Creating an ego " + TEST_REVOCATION_EGO) 55 print("Creating an ego " + TEST_REVOCATION_EGO)
57 sys.stdout.flush () 56 sys.stdout.flush()
58 sys.stderr.flush () 57 sys.stderr.flush()
59 idc = subprocess.Popen ([ident, '-C', TEST_REVOCATION_EGO, '-c', TEST_CONFIGURATION]) 58 idc = subprocess.Popen([ident, '-C', TEST_REVOCATION_EGO, '-c', TEST_CONFIGURATION])
60 idc.communicate () 59 idc.communicate()
61 if idc.returncode != 0: 60 if idc.returncode != 0:
62 raise Exception ("gnunet-identity failed to create an ego `" + TEST_REVOCATION_EGO + "'") 61 raise Exception("gnunet-identity failed to create an ego `" + TEST_REVOCATION_EGO + "'")
63 62
64 sys.stdout.flush () 63 sys.stdout.flush()
65 sys.stderr.flush () 64 sys.stderr.flush()
66 idd = subprocess.Popen ([ident, '-d'], stdout=subprocess.PIPE) 65 idd = subprocess.Popen([ident, '-d'], stdout=subprocess.PIPE)
67 rev_key, x = idd.communicate () 66 rev_key, x = idd.communicate()
68 rev_key = rev_key.decode("utf-8") 67 rev_key = rev_key.decode("utf-8")
69 if len (rev_key.split ()) < 3: 68 if len(rev_key.split()) < 3:
70 raise Exception ("can't get revocation key out of `" + rev_key + "'") 69 raise Exception("can't get revocation key out of `" + rev_key + "'")
71 rev_key = rev_key.split ()[2] 70 rev_key = rev_key.split()[2]
72 71
73 print ("Testing key " + rev_key) 72 print("Testing key " + rev_key)
74 sys.stdout.flush () 73 sys.stdout.flush()
75 sys.stderr.flush () 74 sys.stderr.flush()
76 tst = subprocess.Popen ([revoc, '-t', rev_key, '-c', TEST_CONFIGURATION], stdout=subprocess.PIPE) 75 tst = subprocess.Popen([revoc, '-t', rev_key, '-c', TEST_CONFIGURATION], stdout=subprocess.PIPE)
77 output_not_revoked, x = tst.communicate () 76 output_not_revoked, x = tst.communicate()
78 output_not_revoked = output_not_revoked.decode("utf-8") 77 output_not_revoked = output_not_revoked.decode("utf-8")
79 if tst.returncode != 0: 78 if tst.returncode != 0:
80 raise Exception ("gnunet-revocation failed to test a key - " + str (tst.returncode) + ": " + output_not_revoked) 79 raise Exception("gnunet-revocation failed to test a key - " + str(tst.returncode) + ": " + output_not_revoked)
81 if 'valid' not in output_not_revoked: 80 if 'valid' not in output_not_revoked:
82 res = 1 81 res = 1
83 print ("Key was not valid") 82 print("Key was not valid")
84 else: 83 else:
85 print ("Key was valid") 84 print("Key was valid")
86 85
87 print ("Revoking key " + rev_key) 86 print("Revoking key " + rev_key)
88 sys.stdout.flush () 87 sys.stdout.flush()
89 sys.stderr.flush () 88 sys.stderr.flush()
90 rev = subprocess.Popen ([revoc, '-R', TEST_REVOCATION_EGO, '-p', '-c', TEST_CONFIGURATION]) 89 rev = subprocess.Popen([revoc, '-R', TEST_REVOCATION_EGO, '-p', '-c', TEST_CONFIGURATION])
91 rev.communicate () 90 rev.communicate()
92 if rev.returncode != 0: 91 if rev.returncode != 0:
93 raise Exception ("gnunet-revocation failed to revoke a key") 92 raise Exception("gnunet-revocation failed to revoke a key")
94 93
95 print ("Testing revoked key " + rev_key) 94 print("Testing revoked key " + rev_key)
96 sys.stdout.flush () 95 sys.stdout.flush()
97 sys.stderr.flush () 96 sys.stderr.flush()
98 tst = subprocess.Popen ([revoc, '-t', rev_key, '-c', TEST_CONFIGURATION], stdout=subprocess.PIPE) 97 tst = subprocess.Popen([revoc, '-t', rev_key, '-c', TEST_CONFIGURATION], stdout=subprocess.PIPE)
99 output_revoked, x = tst.communicate () 98 output_revoked, x = tst.communicate()
100 output_revoked = output_revoked.decode("utf-8") 99 output_revoked = output_revoked.decode("utf-8")
101 if tst.returncode != 0: 100 if tst.returncode != 0:
102 raise Exception ("gnunet-revocation failed to test a revoked key") 101 raise Exception("gnunet-revocation failed to test a revoked key")
103 if 'revoked' not in output_revoked: 102 if 'revoked' not in output_revoked:
104 res = 1 103 res = 1
105 print ("Key was not revoked") 104 print("Key was not revoked")
106 else: 105 else:
107 print ("Key was revoked") 106 print("Key was revoked")
108 107
109finally: 108finally:
110 arm = subprocess.Popen ([gnunetarm, '-e', '-c', TEST_CONFIGURATION]) 109 arm = subprocess.Popen([gnunetarm, '-e', '-c', TEST_CONFIGURATION])
111 arm.communicate () 110 arm.communicate()
112 if os.path.isdir (cleandir): 111 if os.path.isdir(cleandir):
113 shutil.rmtree (cleandir, True) 112 shutil.rmtree(cleandir, True)
114 113
115sys.exit (res) 114sys.exit(res)
diff --git a/src/revocation/test_revocation.conf b/src/revocation/test_revocation.conf
index 1beeba931..14ecf6064 100644
--- a/src/revocation/test_revocation.conf
+++ b/src/revocation/test_revocation.conf
@@ -1,4 +1,4 @@
1@INLINE@ ../../contrib/no_forcestart.conf 1@INLINE@ ../../contrib/conf/gnunet/no_forcestart.conf
2 2
3[paths] 3[paths]
4GNUNET_HOME=$GNUNET_TMP/test-revocation-service 4GNUNET_HOME=$GNUNET_TMP/test-revocation-service
diff --git a/src/rps/test_rps.conf b/src/rps/test_rps.conf
index f171335d6..cf6b3150c 100644
--- a/src/rps/test_rps.conf
+++ b/src/rps/test_rps.conf
@@ -29,7 +29,7 @@ HOSTNAME = localhost
29# MAX_PARALLEL_TOPOLOGY_CONFIG_OPERATIONS = 100 29# MAX_PARALLEL_TOPOLOGY_CONFIG_OPERATIONS = 100
30OVERLAY_TOPOLOGY = CLIQUE 30OVERLAY_TOPOLOGY = CLIQUE
31#OVERLAY_TOPOLOGY = SMALL_WORLD 31#OVERLAY_TOPOLOGY = SMALL_WORLD
32#SCALE_FREE_TOPOLOGY_CAP = 32#SCALE_FREE_TOPOLOGY_CAP =
33 33
34# OVERLAY_RANDOM_LINKS = 25 34# OVERLAY_RANDOM_LINKS = 25
35 35
@@ -74,6 +74,7 @@ DISABLE_TRY_CONNECT = YES
74[cadet] 74[cadet]
75DISABLE_TRY_CONNECT = YES 75DISABLE_TRY_CONNECT = YES
76#OPTIONS=-l /tmp/rps_profiler_logs/cadet-[]-%Y-%m-%d.log 76#OPTIONS=-l /tmp/rps_profiler_logs/cadet-[]-%Y-%m-%d.log
77#PREFIX = valgrind
77 78
78#[arm] 79#[arm]
79#GLOBAL_POSTFIX=-l /tmp/rps_profiler_logs/other-[]-%Y-%m-%d.log 80#GLOBAL_POSTFIX=-l /tmp/rps_profiler_logs/other-[]-%Y-%m-%d.log
@@ -120,4 +121,3 @@ AUTOSTART = NO
120[fs] 121[fs]
121FORCESTART = NO 122FORCESTART = NO
122AUTOSTART = NO 123AUTOSTART = NO
123
diff --git a/src/scalarproduct/test_scalarproduct.conf b/src/scalarproduct/test_scalarproduct.conf
index fca141108..c7e2b55f5 100644
--- a/src/scalarproduct/test_scalarproduct.conf
+++ b/src/scalarproduct/test_scalarproduct.conf
@@ -1,4 +1,4 @@
1@INLINE@ ../../contrib/no_forcestart.conf 1@INLINE@ ../../contrib/conf/gnunet/no_forcestart.conf
2 2
3[PATHS] 3[PATHS]
4GNUNET_TEST_HOME = $GNUNET_TMP/test-scalarproduct/ 4GNUNET_TEST_HOME = $GNUNET_TMP/test-scalarproduct/
diff --git a/src/set/test_set.conf b/src/set/test_set.conf
index 58bd07773..02afd2ec5 100644
--- a/src/set/test_set.conf
+++ b/src/set/test_set.conf
@@ -1,4 +1,4 @@
1@INLINE@ ../../contrib/no_forcestart.conf 1@INLINE@ ../../contrib/conf/gnunet/no_forcestart.conf
2 2
3[PATHS] 3[PATHS]
4GNUNET_TEST_HOME = $GNUNET_TMP/test-gnunet-set/ 4GNUNET_TEST_HOME = $GNUNET_TMP/test-gnunet-set/
diff --git a/src/social/test_social.conf b/src/social/test_social.conf
index 701789313..df9815fd2 100644
--- a/src/social/test_social.conf
+++ b/src/social/test_social.conf
@@ -1,4 +1,4 @@
1@INLINE@ ../../contrib/no_forcestart.conf 1@INLINE@ ../../contrib/conf/gnunet/no_forcestart.conf
2 2
3[PATHS] 3[PATHS]
4GNUNET_TEST_HOME = $GNUNET_TMP/gnunet-test-social/ 4GNUNET_TEST_HOME = $GNUNET_TMP/gnunet-test-social/
diff --git a/src/statistics/test_gnunet_statistics.py.in b/src/statistics/test_gnunet_statistics.py.in
index 96714cf9a..64e66f238 100644
--- a/src/statistics/test_gnunet_statistics.py.in
+++ b/src/statistics/test_gnunet_statistics.py.in
@@ -8,7 +8,7 @@ import subprocess
8import time 8import time
9 9
10if os.name == "nt": 10if os.name == "nt":
11 tmp = os.getenv ("TEMP") 11 tmp = os.getenv("TEMP")
12elif None != os.environ.get("TMPDIR"): 12elif None != os.environ.get("TMPDIR"):
13 tmp = os.getenv("TMPDIR") 13 tmp = os.getenv("TMPDIR")
14elif None != os.environ.get("TMP"): 14elif None != os.environ.get("TMP"):
@@ -17,136 +17,142 @@ else:
17 tmp = "/tmp" 17 tmp = "/tmp"
18 18
19if os.name == 'nt': 19if os.name == 'nt':
20 st = './gnunet-statistics.exe' 20 st = './gnunet-statistics.exe'
21 arm = 'gnunet-arm.exe' 21 arm = 'gnunet-arm.exe'
22else: 22else:
23 st = './gnunet-statistics' 23 st = './gnunet-statistics'
24 arm = 'gnunet-arm' 24 arm = 'gnunet-arm'
25 25
26run_st = [st, '-c', 'test_statistics_api_data.conf'] 26run_st = [st, '-c', 'test_statistics_api_data.conf']
27run_arm = [arm, '-c', 'test_statistics_api_data.conf'] 27run_arm = [arm, '-c', 'test_statistics_api_data.conf']
28debug = os.getenv ('DEBUG') 28debug = os.getenv('DEBUG')
29if debug: 29if debug:
30 run_arm += [debug.split (' ')] 30 run_arm += [debug.split(' ')]
31 31
32def cleanup (): 32
33 shutil.rmtree (os.path.join (tmp, "gnunet/test-gnunet-statistics"), True) 33def cleanup():
34 34 shutil.rmtree(os.path.join(tmp, "gnunet/test-gnunet-statistics"), True)
35def sub_run (args, want_stdo = True, want_stde = False, nofail = False): 35
36 if want_stdo: 36
37 stdo = subprocess.PIPE 37def sub_run(args, want_stdo=True, want_stde=False, nofail=False):
38 else: 38 if want_stdo:
39 stdo = None 39 stdo = subprocess.PIPE
40 if want_stde: 40 else:
41 stde = subprocess.PIPE 41 stdo = None
42 else: 42 if want_stde:
43 stde = None 43 stde = subprocess.PIPE
44 p = subprocess.Popen (args, stdout = stdo, stderr = stde) 44 else:
45 stdo, stde = p.communicate () 45 stde = None
46 if not nofail: 46 p = subprocess.Popen(args, stdout=stdo, stderr=stde)
47 if p.returncode != 0: 47 stdo, stde = p.communicate()
48 sys.exit (p.returncode) 48 if not nofail:
49 return (p.returncode, stdo, stde) 49 if p.returncode != 0:
50 50 sys.exit(p.returncode)
51def fail (result): 51 return (p.returncode, stdo, stde)
52 print (result) 52
53 r_arm (['-e'], want_stdo = False) 53
54 sys.exit (1) 54def fail(result):
55 55 print(result)
56def r_arm (extra_args, **kw): 56 r_arm(['-e'], want_stdo=False)
57 rc, stdo, stde = sub_run (run_arm + extra_args, **kw) 57 sys.exit(1)
58 if rc != 0: 58
59 fail ("FAIL: error running {}".format (run_arm)) 59
60 return (rc, stdo, stde) 60def r_arm(extra_args, **kw):
61 61 rc, stdo, stde = sub_run(run_arm + extra_args, **kw)
62def r_st (extra_args, normal = True, **kw):
63 rc, stdo, stde = sub_run (run_st + extra_args, **kw)
64 if normal:
65 if rc != 0: 62 if rc != 0:
66 fail ("FAIL: error running {}".format (run_st)) 63 fail("FAIL: error running {}".format(run_arm))
67 else: 64 return (rc, stdo, stde)
68 if rc == 0: 65
69 fail ("FAIL: expected error while running {}".format (run_st)) 66
70 return (rc, stdo, stde) 67def r_st(extra_args, normal=True, **kw):
71 68 rc, stdo, stde = sub_run(run_st + extra_args, **kw)
72def restart (): 69 if normal:
73 print ("Restarting service...") 70 if rc != 0:
74 t = r_arm (['-k', 'statistics']) 71 fail("FAIL: error running {}".format(run_st))
75 time.sleep (1) 72 else:
76 t = r_arm (['-i', 'statistics']) 73 if rc == 0:
77 time.sleep (1) 74 fail("FAIL: expected error while running {}".format(run_st))
78 75 return (rc, stdo, stde)
79 76
80cleanup () 77
81 78def restart():
82print ("Preparing: Starting service...") 79 print("Restarting service...")
83t = r_arm (['-s'], want_stdo = False) 80 t = r_arm(['-k', 'statistics'])
84time.sleep (1) 81 time.sleep(1)
85t = r_arm (['-i', 'statistics'], want_stdo = False) 82 t = r_arm(['-i', 'statistics'])
86time.sleep (1) 83 time.sleep(1)
87 84
88print ("TEST: Bad argument checking...", end='') 85
89r_st (['-x'], normal = False, nofail = True, want_stdo = False, want_stde = True) 86cleanup()
90print ("PASS") 87
91 88print("Preparing: Starting service...")
92print ("TEST: Set value...", end='') 89t = r_arm(['-s'], want_stdo=False)
93r_st (['-n', 'test', '-s', 'subsystem', b'42'], nofail = True, want_stdo = False) 90time.sleep(1)
94print ("PASS") 91t = r_arm(['-i', 'statistics'], want_stdo=False)
95 92time.sleep(1)
96print ("TEST: Set another value...", end='') 93
97r_st (['-n', 'other', '-s', 'osystem', b'43'], nofail = True, want_stdo = False) 94print("TEST: Bad argument checking...", end='')
98print ("PASS") 95r_st(['-x'], normal=False, nofail=True, want_stdo=False, want_stde=True)
99 96print("PASS")
100print ("TEST: Viewing all stats...", end='') 97
101rc, stdo, stde = r_st ([], nofail = True, want_stdo = True) 98print("TEST: Set value...", end='')
102if len (stdo.splitlines ()) != 2: 99r_st(['-n', 'test', '-s', 'subsystem', b'42'], nofail=True, want_stdo=False)
103 fail ("FAIL: unexpected output:\n{}".format (stdo)) 100print("PASS")
104print ("PASS") 101
105 102print("TEST: Set another value...", end='')
106print ("TEST: Viewing stats by name...", end='') 103r_st(['-n', 'other', '-s', 'osystem', b'43'], nofail=True, want_stdo=False)
107rc, stdo, stde = r_st (['-n', 'other'], nofail = True, want_stdo = True) 104print("PASS")
108if len ([x for x in stdo.splitlines () if re.search (b'43', x)]) != 1: 105
109 fail ("FAIL: unexpected output:\n{}".format (stdo)) 106print("TEST: Viewing all stats...", end='')
110print ("PASS") 107rc, stdo, stde = r_st([], nofail=True, want_stdo=True)
111 108if len(stdo.splitlines()) != 2:
112print ("TEST: Viewing stats by subsystem...", end='') 109 fail("FAIL: unexpected output:\n{}".format(stdo))
113rc, stdo, stde = r_st (['-s', 'subsystem'], nofail = True, want_stdo = True) 110print("PASS")
114if len ([x for x in stdo.splitlines () if re.search (b'42', x)]) != 1: 111
115 fail ("FAIL: unexpected output:\n{}".format (stdo)) 112print("TEST: Viewing stats by name...", end='')
116print ("PASS") 113rc, stdo, stde = r_st(['-n', 'other'], nofail=True, want_stdo=True)
117 114if len([x for x in stdo.splitlines() if re.search(b'43', x)]) != 1:
118print ("TEST: Set persistent value...", end='') 115 fail("FAIL: unexpected output:\n{}".format(stdo))
119rc, stdo, stde = r_st (['-n', 'lasting', '-s', 'subsystem', '40', '-p'], nofail = True, want_stdo = False) 116print("PASS")
120rc, stdo, stde = r_st ([], nofail = True, want_stdo = True) 117
121if len ([x for x in stdo.splitlines () if re.search (b'40', x)]) != 1: 118print("TEST: Viewing stats by subsystem...", end='')
122 fail ("FAIL: unexpected output:\n{}".format (stdo)) 119rc, stdo, stde = r_st(['-s', 'subsystem'], nofail=True, want_stdo=True)
123print ("PASS") 120if len([x for x in stdo.splitlines() if re.search(b'42', x)]) != 1:
124 121 fail("FAIL: unexpected output:\n{}".format(stdo))
125restart () 122print("PASS")
126 123
127print ("TEST: Checking persistence...", end='') 124print("TEST: Set persistent value...", end='')
128rc, stdo, stde = r_st ([], nofail = True, want_stdo = True) 125rc, stdo, stde = r_st(['-n', 'lasting', '-s', 'subsystem', '40', '-p'], nofail=True, want_stdo=False)
129if len ([x for x in stdo.splitlines () if re.search (b'40', x)]) != 1: 126rc, stdo, stde = r_st([], nofail=True, want_stdo=True)
130 fail ("FAIL: unexpected output:\n{}".format (stdo)) 127if len([x for x in stdo.splitlines() if re.search(b'40', x)]) != 1:
131print ("PASS") 128 fail("FAIL: unexpected output:\n{}".format(stdo))
132 129print("PASS")
133print ("TEST: Removing persistence...", end='') 130
134rc, stdo, stde = r_st (['-n', 'lasting', '-s', 'subsystem', '40'], nofail = True, want_stdo = False) 131restart()
135rc, stdo, stde = r_st ([], nofail = True, want_stdo = True) 132
136if len ([x for x in stdo.splitlines () if re.search (b'!', x)]) != 0: 133print("TEST: Checking persistence...", end='')
137 fail ("FAIL: unexpected output:\n{}".format (stdo)) 134rc, stdo, stde = r_st([], nofail=True, want_stdo=True)
138print ("PASS") 135if len([x for x in stdo.splitlines() if re.search(b'40', x)]) != 1:
139 136 fail("FAIL: unexpected output:\n{}".format(stdo))
140restart () 137print("PASS")
141 138
142print ("TEST: Checking removed persistence...", end='') 139print("TEST: Removing persistence...", end='')
143rc, stdo, stde = r_st ([], nofail = True, want_stdo = True) 140rc, stdo, stde = r_st(['-n', 'lasting', '-s', 'subsystem', '40'], nofail=True, want_stdo=False)
144if len ([x for x in stdo.splitlines () if re.search (b'40', x)]) != 0: 141rc, stdo, stde = r_st([], nofail=True, want_stdo=True)
145 fail ("FAIL: unexpected output:\n{}".format (stdo)) 142if len([x for x in stdo.splitlines() if re.search(b'!', x)]) != 0:
146print ("PASS") 143 fail("FAIL: unexpected output:\n{}".format(stdo))
147 144print("PASS")
148print ("Stopping service...") 145
149t = r_arm (['-e'], want_stdo = False) 146restart()
150time.sleep (1) 147
151 148print("TEST: Checking removed persistence...", end='')
152cleanup () 149rc, stdo, stde = r_st([], nofail=True, want_stdo=True)
150if len([x for x in stdo.splitlines() if re.search(b'40', x)]) != 0:
151 fail("FAIL: unexpected output:\n{}".format(stdo))
152print("PASS")
153
154print("Stopping service...")
155t = r_arm(['-e'], want_stdo=False)
156time.sleep(1)
157
158cleanup()
diff --git a/src/statistics/test_statistics_api_data.conf b/src/statistics/test_statistics_api_data.conf
index 9ef8d0673..d437c2aa8 100644
--- a/src/statistics/test_statistics_api_data.conf
+++ b/src/statistics/test_statistics_api_data.conf
@@ -1,5 +1,5 @@
1@INLINE@ ../../contrib/no_forcestart.conf 1@INLINE@ ../../contrib/conf/gnunet/no_forcestart.conf
2@INLINE@ ../../contrib/no_autostart_above_core.conf 2@INLINE@ ../../contrib/conf/gnunet/no_autostart_above_core.conf
3 3
4[PATHS] 4[PATHS]
5GNUNET_TEST_HOME = $GNUNET_TMP/test-gnunet-statistics/ 5GNUNET_TEST_HOME = $GNUNET_TMP/test-gnunet-statistics/
diff --git a/src/testbed/buildvars.py.in b/src/testbed/buildvars.py.in
index 3ed65ad82..2a881b8f0 100644
--- a/src/testbed/buildvars.py.in
+++ b/src/testbed/buildvars.py.in
@@ -1,5 +1,5 @@
1# This file is part of GNUnet. 1# This file is part of GNUnet.
2# (C) 2008--2013 Christian Grothoff (and other contributing authors) 2# (C) 2008--2013, 2018 Christian Grothoff (and other contributing authors)
3# 3#
4# GNUnet is free software; you can redistribute it and/or modify 4# GNUnet is free software; you can redistribute it and/or modify
5# it under the terms of the GNU General Public License as published 5# it under the terms of the GNU General Public License as published
@@ -18,7 +18,7 @@
18 18
19 19
20# file: testbed/buildvars.py 20# file: testbed/buildvars.py
21# brief: file for importing variables from build syste into python 21# brief: file for importing variables from build system into python
22# author: Sree Harsha Totakura 22# author: Sree Harsha Totakura
23 23
24import os 24import os
@@ -26,9 +26,10 @@ import os
26exec_prefix = '@exec_prefix@' 26exec_prefix = '@exec_prefix@'
27libexecdir = '@libexecdir@' 27libexecdir = '@libexecdir@'
28 28
29if libexecdir.startswith (exec_prefix): 29if libexecdir.startswith(exec_prefix):
30 libexecdir = libexecdir[len (exec_prefix):] 30 libexecdir = libexecdir[len(exec_prefix):]
31 31
32gnunet_prefix = os.environ.get ('GNUNET_PREFIX', None) 32gnunet_prefix = os.environ.get('GNUNET_PREFIX', None)
33if gnunet_prefix and libexecdir.startswith ('/'): 33
34 libexecdir = os.path.join (gnunet_prefix, libexecdir[1:]) 34if gnunet_prefix and libexecdir.startswith('/'):
35 libexecdir = os.path.join(gnunet_prefix, libexecdir[1:])
diff --git a/src/testbed/test_testbed_api_template.conf b/src/testbed/test_testbed_api_template.conf
index 89f16ed67..049829842 100644
--- a/src/testbed/test_testbed_api_template.conf
+++ b/src/testbed/test_testbed_api_template.conf
@@ -1,5 +1,5 @@
1@INLINE@ ../../contrib/no_forcestart.conf 1@INLINE@ ../../contrib/conf/gnunet/no_forcestart.conf
2@INLINE@ ../../contrib/no_autostart_above_core.conf 2@INLINE@ ../../contrib/conf/gnunet/no_autostart_above_core.conf
3 3
4[testbed] 4[testbed]
5AUTOSTART = NO 5AUTOSTART = NO
diff --git a/src/transport/test_transport_api_limited_sockets_tcp_peer1.conf b/src/transport/test_transport_api_limited_sockets_tcp_peer1.conf
index 9804f171e..e0ad5f847 100644
--- a/src/transport/test_transport_api_limited_sockets_tcp_peer1.conf
+++ b/src/transport/test_transport_api_limited_sockets_tcp_peer1.conf
@@ -1,5 +1,5 @@
1@INLINE@ template_cfg_peer1.conf 1@INLINE@ template_cfg_peer1.conf
2@INLINE@ ../../contrib/no_autostart_above_core.conf 2@INLINE@ ../../contrib/conf/gnunet/no_autostart_above_core.conf
3[PATHS] 3[PATHS]
4GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-tcp-p1/ 4GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-tcp-p1/
5 5
diff --git a/src/transport/test_transport_api_limited_sockets_tcp_peer2.conf b/src/transport/test_transport_api_limited_sockets_tcp_peer2.conf
index 16dddf744..bb466abba 100644
--- a/src/transport/test_transport_api_limited_sockets_tcp_peer2.conf
+++ b/src/transport/test_transport_api_limited_sockets_tcp_peer2.conf
@@ -1,5 +1,5 @@
1@INLINE@ template_cfg_peer2.conf 1@INLINE@ template_cfg_peer2.conf
2@INLINE@ ../../contrib/no_autostart_above_core.conf 2@INLINE@ ../../contrib/conf/gnunet/no_autostart_above_core.conf
3 3
4[PATHS] 4[PATHS]
5GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-tcp-p2/ 5GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-tcp-p2/
diff --git a/src/transport/test_transport_defaults.conf b/src/transport/test_transport_defaults.conf
index ddb523986..3f38eeab7 100644
--- a/src/transport/test_transport_defaults.conf
+++ b/src/transport/test_transport_defaults.conf
@@ -1,4 +1,4 @@
1@INLINE@ ../../contrib/no_forcestart.conf 1@INLINE@ ../../contrib/conf/gnunet/no_forcestart.conf
2 2
3[PATHS] 3[PATHS]
4GNUNET_TEST_HOME = $GNUNET_TMP/test-transport-api/ 4GNUNET_TEST_HOME = $GNUNET_TMP/test-transport-api/
diff --git a/src/util/common_logging.c b/src/util/common_logging.c
index df501fbcd..ce9bd6e46 100644
--- a/src/util/common_logging.c
+++ b/src/util/common_logging.c
@@ -1344,14 +1344,15 @@ GNUNET_h2s_full (const struct GNUNET_HashCode * hc)
1344const char * 1344const char *
1345GNUNET_i2s (const struct GNUNET_PeerIdentity *pid) 1345GNUNET_i2s (const struct GNUNET_PeerIdentity *pid)
1346{ 1346{
1347 static char buf[256]; 1347 static char buf[5];
1348 char *ret; 1348 char *ret;
1349 1349
1350 if (NULL == pid) 1350 if (NULL == pid)
1351 return "NULL"; 1351 return "NULL";
1352 ret = GNUNET_CRYPTO_eddsa_public_key_to_string (&pid->public_key); 1352 ret = GNUNET_CRYPTO_eddsa_public_key_to_string (&pid->public_key);
1353 strcpy (buf, 1353 strncpy (buf,
1354 ret); 1354 ret,
1355 sizeof (buf) - 1);
1355 GNUNET_free (ret); 1356 GNUNET_free (ret);
1356 buf[4] = '\0'; 1357 buf[4] = '\0';
1357 return buf; 1358 return buf;
@@ -1372,14 +1373,15 @@ GNUNET_i2s (const struct GNUNET_PeerIdentity *pid)
1372const char * 1373const char *
1373GNUNET_i2s2 (const struct GNUNET_PeerIdentity *pid) 1374GNUNET_i2s2 (const struct GNUNET_PeerIdentity *pid)
1374{ 1375{
1375 static char buf[256]; 1376 static char buf[5];
1376 char *ret; 1377 char *ret;
1377 1378
1378 if (NULL == pid) 1379 if (NULL == pid)
1379 return "NULL"; 1380 return "NULL";
1380 ret = GNUNET_CRYPTO_eddsa_public_key_to_string (&pid->public_key); 1381 ret = GNUNET_CRYPTO_eddsa_public_key_to_string (&pid->public_key);
1381 strcpy (buf, 1382 strncpy (buf,
1382 ret); 1383 ret,
1384 sizeof (buf) - 1);
1383 GNUNET_free (ret); 1385 GNUNET_free (ret);
1384 buf[4] = '\0'; 1386 buf[4] = '\0';
1385 return buf; 1387 return buf;
diff --git a/src/util/crypto_bug.c b/src/util/crypto_bug.c
index c25e79c63..1c3e9225e 100644
--- a/src/util/crypto_bug.c
+++ b/src/util/crypto_bug.c
@@ -28,7 +28,7 @@
28 * Enable work-around. Will cause code to call #check_eddsa_key() to 28 * Enable work-around. Will cause code to call #check_eddsa_key() to
29 * see if we have a bad key, and if so, create a new one. 29 * see if we have a bad key, and if so, create a new one.
30 */ 30 */
31#define CRYPTO_BUG 1 31#define CRYPTO_BUG 0
32 32
33 33
34#if CRYPTO_BUG 34#if CRYPTO_BUG
diff --git a/src/util/crypto_ecc.c b/src/util/crypto_ecc.c
index 1abf0fddc..8d9091b23 100644
--- a/src/util/crypto_ecc.c
+++ b/src/util/crypto_ecc.c
@@ -1281,6 +1281,16 @@ eddsa_d_to_a (gcry_mpi_t d)
1281 gcry_mpi_print (GCRYMPI_FMT_USG, 1281 gcry_mpi_print (GCRYMPI_FMT_USG,
1282 rawmpi, rawmpilen, &rawmpilen, 1282 rawmpi, rawmpilen, &rawmpilen,
1283 d)); 1283 d));
1284 if (rawmpilen < 32)
1285 {
1286 memmove (rawmpi + 32 - rawmpilen,
1287 rawmpi,
1288 rawmpilen);
1289 memset (rawmpi,
1290 0,
1291 32 - rawmpilen);
1292 rawmpilen = 32;
1293 }
1284 hvec[0].data = digest; 1294 hvec[0].data = digest;
1285 hvec[0].off = 0; 1295 hvec[0].off = 0;
1286 hvec[0].len = b > rawmpilen ? (b - rawmpilen) : 0; 1296 hvec[0].len = b > rawmpilen ? (b - rawmpilen) : 0;
diff --git a/src/util/gnunet-qr.py.in b/src/util/gnunet-qr.py.in
index 549ce5af1..a5918fdf8 100755
--- a/src/util/gnunet-qr.py.in
+++ b/src/util/gnunet-qr.py.in
@@ -4,105 +4,106 @@ import getopt
4import subprocess 4import subprocess
5from sys import argv 5from sys import argv
6try: 6try:
7 import zbar 7 import zbar
8except ImportError as e: 8except ImportError as e:
9 print('Cannot run gnunet-qr, please install zbar-python') 9 print('Cannot run gnunet-qr, please install zbar-python')
10 sys.exit (1) 10 sys.exit(1)
11 11
12def help (): 12
13 print('gnunet-qr\n\ 13def help():
14 print('gnunet-qr\n\
14Scan a QR code using a video device and import\n\ 15Scan a QR code using a video device and import\n\
15Arguments mandatory for long options are also mandatory for short options.\n\ 16Arguments mandatory for long options are also mandatory for short options.\n\
16 -c, --config=FILENAME use configuration file FILENAME\n\ 17 -c, --config=FILENAME use configuration file FILENAME\n\
17 -d, --device=DEVICE use device DEVICE\n\ 18 -d, --device=DEVICE use device DEVICE\n\
18 -s, --silent do not show preview windows\n\ 19 -s, --silent do not show preview windows\n\
19 -h, --help print this help\n\ 20 -h, --help print this help\n\
20 -v, --verbose be verbose\n\ 21 -v, --verbose be verbose\n\
21Report bugs to gnunet-developers@gnu.org.\n\ 22Report bugs to gnunet-developers@gnu.org.\n\
22GNUnet home page: http://www.gnu.org/software/gnunet/\n\ 23GNUnet home page: http://www.gnu.org/software/gnunet/\n\
23General help using GNU software: http://www.gnu.org/gethelp/') 24General help using GNU software: http://www.gnu.org/gethelp/')
24 25
25 26
26if __name__ == '__main__': 27if __name__ == '__main__':
27 configuration = '' 28 configuration = ''
28 device = '/dev/video0' 29 device = '/dev/video0'
29 url = '' 30 url = ''
30 verbose = False 31 verbose = False
31 silent = False 32 silent = False
32 # Parse arguments 33 # Parse arguments
33 try: 34 try:
34 opts, args = getopt.gnu_getopt(sys.argv[1:], "c:hd:sv", ["config","help", "device","silent","verbose"]) 35 opts, args = getopt.gnu_getopt(sys.argv[1:], "c:hd:sv", ["config", "help", "device", "silent", "verbose"])
35 except getopt.GetoptError as e: 36 except getopt.GetoptError as e:
36 help () 37 help()
37 print(str (e)) 38 print(str(e))
38 exit (1) 39 exit(1)
39 for o,a in opts: 40 for o, a in opts:
40 if o in ("-h", "--help"): 41 if o in ("-h", "--help"):
41 help () 42 help()
42 sys.exit (0) 43 sys.exit(0)
43 elif o in ("-c", "--config"): 44 elif o in ("-c", "--config"):
44 configuration = a 45 configuration = a
45 elif o in ("-d", "--device"): 46 elif o in ("-d", "--device"):
46 device = a 47 device = a
47 elif o in ("-s", "--silent"): 48 elif o in ("-s", "--silent"):
48 silent = True 49 silent = True
49 elif o in ("-v", "--verbose"): 50 elif o in ("-v", "--verbose"):
50 verbose = True 51 verbose = True
51 if (True == verbose): 52 if (True == verbose):
52 print('Initializing') 53 print('Initializing')
53 # create a Processor 54 # create a Processor
54 proc = zbar.Processor() 55 proc = zbar.Processor()
56
57 # configure the Processor
58 proc.parse_config('enable')
59
60 # initialize the Processor
61 try:
62 if (True == verbose):
63 print('Opening video device ' + device)
64 proc.init(device)
65 except Exception as e:
66 print('Failed to open device ' + device)
67 exit(1)
68
69 # enable the preview window
70 # if (True == silent):
71 # proc.visible = True
72 # else:
73 # proc.visible = False
74
75 proc.visible = True
76 # read at least one barcode (or until window closed)
77 try:
78 if (True == verbose):
79 print('Capturing')
80 proc.process_one()
81 except Exception as e:
82 # Window was closed without finding code
83 exit(1)
55 84
56 # configure the Processor 85 # hide the preview window
57 proc.parse_config('enable') 86 proc.visible = False
58 87
59 # initialize the Processor 88 # extract results
60 try: 89 for symbol in proc.results:
61 if (True == verbose): 90 # do something useful with results
62 print('Opening video device ' + device) 91 if (True == verbose):
63 proc.init(device) 92 print('Found ', symbol.type, ' symbol ', '"%s"' % symbol.data)
64 except Exception as e: 93 args = list()
65 print('Failed to open device ' + device) 94 args.append("gnunet-uri")
66 exit (1) 95 if (configuration != ''):
67 96 args.append(str("-c " + str(configuration)))
68 # enable the preview window 97 args.append(str(symbol.data))
69 #if (True == silent): 98 cmd = ''
70 # proc.visible = True 99 for a in args:
71 #else: 100 cmd += " " + str(a)
72 # proc.visible = False 101 if (verbose):
73 102 print('Running `' + cmd +'`')
74 proc.visible = True 103 res=subprocess.call(args)
75 # read at least one barcode (or until window closed) 104 if (0 != res):
76 try: 105 print('Failed to add URI ' + str(symbol.data))
77 if (True == verbose): 106 else:
78 print('Capturing') 107 print('Added URI ' + str(symbol.data))
79 proc.process_one() 108 exit(res)
80 except Exception as e: 109 exit(1)
81 # Window was closed without finding code
82 exit (1)
83
84 # hide the preview window
85 proc.visible = False
86
87 # extract results
88 for symbol in proc.results:
89 # do something useful with results
90 if (True == verbose):
91 print('Found ', symbol.type, ' symbol ', '"%s"' % symbol.data)
92 args = list()
93 args.append("gnunet-uri")
94 if (configuration != ''):
95 args.append (str("-c " + str(configuration)))
96 args.append (str(symbol.data))
97 cmd = ''
98 for a in args:
99 cmd += " " + str(a)
100 if (verbose):
101 print('Running `' + cmd +'`')
102 res=subprocess.call(args)
103 if (0 != res):
104 print('Failed to add URI ' + str(symbol.data))
105 else:
106 print('Added URI ' + str(symbol.data))
107 exit (res)
108 exit (1)
diff --git a/src/util/mq.c b/src/util/mq.c
index dbcce704d..81a42e0c6 100644
--- a/src/util/mq.c
+++ b/src/util/mq.c
@@ -1071,6 +1071,32 @@ GNUNET_MQ_set_options (struct GNUNET_MQ_Handle *mq,
1071 1071
1072 1072
1073/** 1073/**
1074 * Obtain message contained in envelope.
1075 *
1076 * @param env the envelope
1077 * @return message contained in the envelope
1078 */
1079const struct GNUNET_MessageHeader *
1080GNUNET_MQ_env_get_msg (const struct GNUNET_MQ_Envelope *env)
1081{
1082 return env->mh;
1083}
1084
1085
1086/**
1087 * Return next envelope in queue.
1088 *
1089 * @param env a queued envelope
1090 * @return next one, or NULL
1091 */
1092const struct GNUNET_MQ_Envelope *
1093GNUNET_MQ_env_next (const struct GNUNET_MQ_Envelope *env)
1094{
1095 return env->next;
1096}
1097
1098
1099/**
1074 * Register function to be called whenever @a mq is being 1100 * Register function to be called whenever @a mq is being
1075 * destroyed. 1101 * destroyed.
1076 * 1102 *
diff --git a/src/util/resolver_api.c b/src/util/resolver_api.c
index 68f02587a..21f902578 100644
--- a/src/util/resolver_api.c
+++ b/src/util/resolver_api.c
@@ -515,8 +515,8 @@ handle_response (void *cls,
515 if ( (NULL != rh->addr_callback) && 515 if ( (NULL != rh->addr_callback) &&
516 (GNUNET_SYSERR != rh->was_transmitted) ) 516 (GNUNET_SYSERR != rh->was_transmitted) )
517 rh->addr_callback (rh->cls, 517 rh->addr_callback (rh->cls,
518 NULL, 518 NULL,
519 0); 519 0);
520 } 520 }
521 rh->was_transmitted = GNUNET_NO; 521 rh->was_transmitted = GNUNET_NO;
522 GNUNET_RESOLVER_request_cancel (rh); 522 GNUNET_RESOLVER_request_cancel (rh);
diff --git a/tox.ini b/tox.ini
index 090ac8f8e..c91f2de94 100644
--- a/tox.ini
+++ b/tox.ini
@@ -1,3 +1,4 @@
1[flake8] 1[flake8]
2max-line-length = 160 2max-line-length = 160
3exclude = .git \ No newline at end of file 3exclude = .git
4filename = *.py* \ No newline at end of file